@gem-sdk/pages 2.0.0-dev.884 → 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,153 @@
1
- import{PreviewPageDocument as e,StorePropertyDocument as o}from"@gem-sdk/core";import{ShopMetaDocument as t}from"@gem-sdk/adapter-shopify";import{captureException as a}from"@sentry/nextjs";import{getFontStyleFromPageTemplate as r,getFontFromGlobalStyle as i}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 n}from"../helpers/get-fallback.js";import{parseBuilderTemplateV2 as c}from"../helpers/normalize.js";import{parseJson as m,serializableJson as p}from"../helpers/parse-json.js";let getStaticPagePropsPreview=(d,f)=>async g=>{try{let a="STATIC",h={handleURL:g,pageType:a},[u,y,P]=await Promise.allSettled([d([e,h,"previewPage"]),d([o]),f([t])]);if("rejected"===u.status)throw Error(u.reason?.[0]);let x=u.value.previewPage;if(!x)throw Error(`No data builder found for slug: /preview/${g}`);let v=c(x),[k,w,z]=await Promise.all([r(v),i(x?.pageStyle?.data),n(d,v)]),b=x.isMobile??!1,C=x?.themePageDataSEO?.find(e=>e?.key==="global-meta-description")?.value,_=m(x?.themePageDataSEO?.find(e=>e?.key==="global-meta-thumbnail")?.value),j="fulfilled"===P.status?P.value:void 0,S="fulfilled"===y.status?y.value:void 0,$=S?.storeProperty?.favicon??"/favicon/favicon-32x32.png",I={defaultTitle:j?.shop.name,title:x?.name,description:C??j?.shop.description,openGraph:{site_name:j?.shop.name,locale:j?.localization.country.isoCode,title:x?.name??j?.shop.name,description:C??j?.shop.description,images:_?[_]:[]},nofollow:!0,noindex:!0,canonical:`/preview/${g}`,additionalMetaTags:[{name:"theme-color",content:"#000000"}],additionalLinkTags:[{rel:"icon",sizes:"32x32",href:`${$}-/crop/1:1/center/-/smart_resize/32x32/`},{rel:"icon",sizes:"16x16",href:`${$}-/crop/1:1/center/-/smart_resize/16x16/`},{rel:"apple-touch-icon",sizes:"180x180",href:`${$}-/crop/1:1/center/-/smart_resize/180x180/`},{rel:"manifest",href:l({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:`${$}-/crop/1:1/center/-/smart_resize/192x192/`,sizes:"192x192",type:"image/png",purpose:"any maskable"},{src:`${$}-/crop/1:1/center/-/smart_resize/512x512/`,sizes:"512x512",type:"image/png"}]})}]},T=j?.localization.language.isoCode??null,D=j?.localization.country.isoCode??null,A=T&&D?`${T}-${D}`:null;return p({themeStyle:s(x?.pageStyle?.data,b),fontStyle:w,elementFontStyle:k,builderData:v,pageType:a,moneyFormat:j?.shop.moneyFormat??null,currency:j?.localization.country.currency.isoCode??null,languageIsoCode:T,countryIsoCode:D,locale:A,swr:{fallback:z},swatches:m(S?.storeProperty?.swatchesConfig),seo:I,mobileOnly:b,gaTrackingId:x.themePageAnalytic?.gaTrackingID??null,facebookPixelId:x.themePageAnalytic?.fbPixelID??null,tiktokPixelId:x.themePageAnalytic?.tiktokPixelID??null,customCodeHeader:x.themePageCustomCode?.header??null,customCodeBody:x.themePageCustomCode?.body??null})}catch(e){throw a(e),e}};export{getStaticPagePropsPreview};
1
+ import { PreviewThemePageDocument, StorePropertyDocument } from '@gem-sdk/core';
2
+ import { ShopMetaDocument } from '@gem-sdk/adapter-shopify';
3
+ import { captureException } from '@sentry/nextjs';
4
+ import { getFontStyleFromPageTemplate, getFontFromGlobalStyle } from '../google-fonts.js';
5
+ import { genCSS } from '../helpers/gen-css.js';
6
+ import { generateManifest } from '../helpers/generate-manifres.js';
7
+ import { getFallbackV2 } from '../helpers/get-fallback.js';
8
+ import { parseBuilderTemplateV2, extractPageBackground } from '../helpers/normalize.js';
9
+ import { parseJson, serializableJson } from '../helpers/parse-json.js';
10
+ import { getCustomFonts } from '../custom-fonts.js';
11
+
12
+ const getStaticPagePropsPreview = (fetcher, shopifyFetcher)=>async (slug)=>{
13
+ try {
14
+ const pageType = 'STATIC';
15
+ const variables = {
16
+ handleURL: slug,
17
+ pageType
18
+ };
19
+ const [theme, storeProperty, shopifyMeta] = await Promise.allSettled([
20
+ fetcher([
21
+ PreviewThemePageDocument,
22
+ variables
23
+ ]),
24
+ fetcher([
25
+ StorePropertyDocument
26
+ ]),
27
+ shopifyFetcher([
28
+ ShopMetaDocument
29
+ ])
30
+ ]);
31
+ if (theme.status === 'rejected') {
32
+ throw new Error(theme.reason?.[0]);
33
+ }
34
+ const dataBuilder = theme.value.previewThemePage;
35
+ if (!dataBuilder) {
36
+ throw new Error(`No data builder found for slug: /preview/${slug}`);
37
+ }
38
+ const themePageCustomFonts = dataBuilder.customFonts;
39
+ const pageTemplate = parseBuilderTemplateV2(dataBuilder);
40
+ const [elementFontStyle, fontStyle, fallback, customFonts] = await Promise.all([
41
+ getFontStyleFromPageTemplate(pageTemplate),
42
+ getFontFromGlobalStyle(dataBuilder?.themeStyle?.data),
43
+ getFallbackV2(fetcher, pageTemplate),
44
+ getCustomFonts(themePageCustomFonts)
45
+ ]);
46
+ const mobileOnly = !!dataBuilder.isMobile;
47
+ const description = dataBuilder?.dataSEO?.find((item)=>item?.key === 'global-meta-description')?.value;
48
+ const thumbnail = parseJson(dataBuilder?.dataSEO?.find((item)=>item?.key === 'global-meta-thumbnail')?.value);
49
+ const shopMeta = shopifyMeta.status === 'fulfilled' ? shopifyMeta.value : undefined;
50
+ const shopData = storeProperty.status === 'fulfilled' ? storeProperty.value : undefined;
51
+ const favicon = shopData?.storeProperty?.favicon ?? '/favicon/favicon-32x32.png';
52
+ const seo = {
53
+ defaultTitle: shopMeta?.shop.name,
54
+ title: dataBuilder?.name,
55
+ description: description ?? shopMeta?.shop.description,
56
+ openGraph: {
57
+ site_name: shopMeta?.shop.name,
58
+ locale: shopMeta?.localization.country.isoCode,
59
+ title: dataBuilder?.name ?? shopMeta?.shop.name,
60
+ description: description ?? shopMeta?.shop.description,
61
+ images: thumbnail ? [
62
+ thumbnail
63
+ ] : []
64
+ },
65
+ nofollow: true,
66
+ noindex: true,
67
+ canonical: `/preview/${slug}`,
68
+ additionalMetaTags: [
69
+ {
70
+ name: 'theme-color',
71
+ content: '#000000'
72
+ }
73
+ ],
74
+ additionalLinkTags: [
75
+ {
76
+ rel: 'icon',
77
+ sizes: '32x32',
78
+ href: `${favicon}-/crop/1:1/center/-/smart_resize/32x32/`
79
+ },
80
+ {
81
+ rel: 'icon',
82
+ sizes: '16x16',
83
+ href: `${favicon}-/crop/1:1/center/-/smart_resize/16x16/`
84
+ },
85
+ {
86
+ rel: 'apple-touch-icon',
87
+ sizes: '180x180',
88
+ href: `${favicon}-/crop/1:1/center/-/smart_resize/180x180/`
89
+ },
90
+ {
91
+ rel: 'manifest',
92
+ href: generateManifest({
93
+ theme_color: '#000000',
94
+ background_color: '#ffffff',
95
+ display: 'standalone',
96
+ scope: '/',
97
+ start_url: '/',
98
+ name: shopMeta?.shop.name,
99
+ short_name: shopMeta?.shop.name,
100
+ description: shopMeta?.shop.description,
101
+ icons: [
102
+ {
103
+ src: `${favicon}-/crop/1:1/center/-/smart_resize/192x192/`,
104
+ sizes: '192x192',
105
+ type: 'image/png',
106
+ purpose: 'any maskable'
107
+ },
108
+ {
109
+ src: `${favicon}-/crop/1:1/center/-/smart_resize/512x512/`,
110
+ sizes: '512x512',
111
+ type: 'image/png'
112
+ }
113
+ ]
114
+ })
115
+ }
116
+ ]
117
+ };
118
+ const languageIsoCode = shopMeta?.localization.language.isoCode ?? null;
119
+ const countryIsoCode = shopMeta?.localization.country.isoCode ?? null;
120
+ const locale = languageIsoCode && countryIsoCode ? `${languageIsoCode}-${countryIsoCode}` : null;
121
+ return serializableJson({
122
+ themeStyle: genCSS(dataBuilder?.themeStyle?.data, mobileOnly),
123
+ fontStyle,
124
+ elementFontStyle,
125
+ builderData: pageTemplate,
126
+ pageType,
127
+ moneyFormat: shopMeta?.shop?.moneyFormat ?? null,
128
+ currency: shopMeta?.localization?.country?.currency?.isoCode ?? null,
129
+ languageIsoCode,
130
+ countryIsoCode,
131
+ locale,
132
+ swr: {
133
+ fallback
134
+ },
135
+ swatches: parseJson(shopData?.storeProperty?.swatchesConfig),
136
+ seo,
137
+ mobileOnly,
138
+ gaTrackingId: dataBuilder.analytic?.gaTrackingID ?? null,
139
+ facebookPixelId: dataBuilder.analytic?.fbPixelID ?? null,
140
+ tiktokPixelId: dataBuilder.analytic?.tiktokPixelID ?? null,
141
+ customCodeHeader: dataBuilder.customCode?.header ?? null,
142
+ customCodeBody: dataBuilder.customCode?.body ?? null,
143
+ customFonts,
144
+ pageBackground: extractPageBackground(dataBuilder),
145
+ interaction: dataBuilder?.interaction
146
+ });
147
+ } catch (err) {
148
+ captureException(err);
149
+ throw err;
150
+ }
151
+ };
152
+
153
+ export { getStaticPagePropsPreview };
@@ -1 +1,162 @@
1
- import{PublishedThemePagesDocument as e,StorePropertyDocument as o}from"@gem-sdk/core";import{ShopMetaDocument as t}from"@gem-sdk/adapter-shopify";import{getFontStyleFromPageTemplate as a,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{getFallbackV2 as l}from"../helpers/get-fallback.js";import{parseBuilderTemplateV2 as n}from"../helpers/normalize.js";import{parseJson as m,serializableJson as c}from"../helpers/parse-json.js";import{captureException as p}from"@sentry/nextjs";import{getCustomFonts as d}from"../custom-fonts.js";let getStaticPagePropsV2=(u,h)=>async g=>{try{let p="STATIC",f={slug:g,slugType:p},[y,P,x]=await Promise.allSettled([u([e,f]),u([o]),h([t])]);if("rejected"===y.status)throw Error(y.reason?.[0]);let k=y.value.publishedThemePages?.[0],z=y.value?.publishedThemePages?.[0]?.themePageCustomFonts;if(!k)throw Error(`No data builder found for slug: /${g}`);let b=n(k),[C,v,j,T]=await Promise.all([a(b),r(k?.pageStyle?.data),l(u,b),d(z)]),$=k.isMobile??!1,_=k?.themePageDataSEO?.find(e=>e?.key==="global-meta-description")?.value,S=m(k?.themePageDataSEO?.find(e=>e?.key==="global-meta-thumbnail")?.value),w="fulfilled"===x.status?x.value:void 0,D="fulfilled"===P.status?P.value:void 0,I=D?.storeProperty?.favicon??"/favicon/favicon-32x32.png",A={defaultTitle:w?.shop.name,title:k?.name,description:_??w?.shop.description,openGraph:{site_name:w?.shop.name,locale:w?.localization.country.isoCode,title:k?.name??w?.shop.name,description:_??w?.shop.description,images:S?[S]:[]},canonical:`https://${D?.storeProperty?.primaryDomain}/${g}`,additionalMetaTags:[{name:"theme-color",content:"#000000"}],additionalLinkTags:[{rel:"icon",sizes:"32x32",href:`${I}-/crop/1:1/center/-/smart_resize/32x32/`},{rel:"icon",sizes:"16x16",href:`${I}-/crop/1:1/center/-/smart_resize/16x16/`},{rel:"apple-touch-icon",sizes:"180x180",href:`${I}-/crop/1:1/center/-/smart_resize/180x180/`},{rel:"manifest",href:i({theme_color:"#000000",background_color:"#ffffff",display:"standalone",scope:"/",start_url:"/",name:w?.shop.name,short_name:w?.shop.name,description:w?.shop.description,icons:[{src:`${I}-/crop/1:1/center/-/smart_resize/192x192/`,sizes:"192x192",type:"image/png",purpose:"any maskable"},{src:`${I}-/crop/1:1/center/-/smart_resize/512x512/`,sizes:"512x512",type:"image/png"}]})}]},E=w?.localization.language.isoCode??null,F=w?.localization.country.isoCode??null,H=E&&F?`${E}-${F}`:null;return c({themeStyle:s(k?.pageStyle?.data,$),fontStyle:v,elementFontStyle:C,builderData:b,pageType:p,moneyFormat:w?.shop.moneyFormat??null,currency:w?.localization.country.currency.isoCode??null,languageIsoCode:E,countryIsoCode:F,locale:H,swr:{fallback:j},swatches:m(D?.storeProperty?.swatchesConfig),seo:A,mobileOnly:$,gaTrackingId:k.themePageAnalytic?.gaTrackingID??null,facebookPixelId:k.themePageAnalytic?.fbPixelID??null,tiktokPixelId:k.themePageAnalytic?.tiktokPixelID??null,customCodeHeader:k.themePageCustomCode?.header??null,customCodeBody:k.themePageCustomCode?.body??null,pageHandle:k.handle??null,customFonts:T})}catch(e){throw p(e),e}};export{getStaticPagePropsV2};
1
+ import { PublishedThemePagesDocument, StorePropertyDocument, PublishedShopMetasDocument } 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, extractPageBackground } from '../helpers/normalize.js';
8
+ import { parseJson, serializableJson } from '../helpers/parse-json.js';
9
+ import { captureException } from '@sentry/nextjs';
10
+ import { getCustomFonts } from '../custom-fonts.js';
11
+
12
+ const getStaticPagePropsV2 = (fetcher, shopifyFetcher)=>async (slug)=>{
13
+ try {
14
+ const pageType = 'STATIC';
15
+ const variables = {
16
+ slug,
17
+ slugType: pageType
18
+ };
19
+ const [theme, storeProperty, shopifyMeta, publishedShopMetas] = await Promise.allSettled([
20
+ fetcher([
21
+ PublishedThemePagesDocument,
22
+ variables
23
+ ]),
24
+ fetcher([
25
+ StorePropertyDocument
26
+ ]),
27
+ shopifyFetcher([
28
+ ShopMetaDocument
29
+ ]),
30
+ fetcher([
31
+ PublishedShopMetasDocument,
32
+ {
33
+ keys: [
34
+ 'source_font'
35
+ ]
36
+ }
37
+ ])
38
+ ]);
39
+ if (theme.status === 'rejected') {
40
+ throw new Error(theme.reason?.[0]);
41
+ }
42
+ const publishedShopMetaValue = publishedShopMetas.status === 'fulfilled' ? publishedShopMetas.value : undefined;
43
+ const sourceFont = publishedShopMetaValue?.publishedShopMetas?.find((item)=>item?.key === 'source_font');
44
+ const dataBuilder = theme.value.publishedThemePages?.[0];
45
+ const themePageCustomFonts = theme.value?.publishedThemePages?.[0]?.themePageCustomFonts;
46
+ if (!dataBuilder) {
47
+ throw new Error(`No data builder found for slug: /${slug}`);
48
+ }
49
+ const pageTemplate = parseBuilderTemplateV2(dataBuilder);
50
+ const [elementFontStyle, fontStyle, fallback, customFonts] = await Promise.all([
51
+ getFontStyleFromPageTemplate(pageTemplate, sourceFont?.value),
52
+ getFontFromGlobalStyle(dataBuilder?.pageStyle?.data, sourceFont?.value),
53
+ getFallbackV2(fetcher, pageTemplate),
54
+ getCustomFonts(themePageCustomFonts)
55
+ ]);
56
+ const mobileOnly = dataBuilder.isMobile ?? false;
57
+ const description = dataBuilder?.themePageDataSEO?.find((item)=>item?.key === 'global-meta-description')?.value;
58
+ const thumbnail = parseJson(dataBuilder?.themePageDataSEO?.find((item)=>item?.key === 'global-meta-thumbnail')?.value);
59
+ const shopMeta = shopifyMeta.status === 'fulfilled' ? shopifyMeta.value : undefined;
60
+ const shopData = storeProperty.status === 'fulfilled' ? storeProperty.value : undefined;
61
+ const favicon = shopData?.storeProperty?.favicon ?? '/favicon/favicon-32x32.png';
62
+ const seo = {
63
+ defaultTitle: shopMeta?.shop.name,
64
+ title: dataBuilder?.name,
65
+ description: description ?? shopMeta?.shop.description,
66
+ openGraph: {
67
+ site_name: shopMeta?.shop.name,
68
+ locale: shopMeta?.localization.country.isoCode,
69
+ title: dataBuilder?.name ?? shopMeta?.shop.name,
70
+ description: description ?? shopMeta?.shop.description,
71
+ images: thumbnail ? [
72
+ thumbnail
73
+ ] : []
74
+ },
75
+ canonical: `https://${shopData?.storeProperty?.primaryDomain}/${slug}`,
76
+ additionalMetaTags: [
77
+ {
78
+ name: 'theme-color',
79
+ content: '#000000'
80
+ }
81
+ ],
82
+ additionalLinkTags: [
83
+ {
84
+ rel: 'icon',
85
+ sizes: '32x32',
86
+ href: `${favicon}-/crop/1:1/center/-/smart_resize/32x32/`
87
+ },
88
+ {
89
+ rel: 'icon',
90
+ sizes: '16x16',
91
+ href: `${favicon}-/crop/1:1/center/-/smart_resize/16x16/`
92
+ },
93
+ {
94
+ rel: 'apple-touch-icon',
95
+ sizes: '180x180',
96
+ href: `${favicon}-/crop/1:1/center/-/smart_resize/180x180/`
97
+ },
98
+ {
99
+ rel: 'manifest',
100
+ href: generateManifest({
101
+ theme_color: '#000000',
102
+ background_color: '#ffffff',
103
+ display: 'standalone',
104
+ scope: '/',
105
+ start_url: '/',
106
+ name: shopMeta?.shop.name,
107
+ short_name: shopMeta?.shop.name,
108
+ description: shopMeta?.shop.description,
109
+ icons: [
110
+ {
111
+ src: `${favicon}-/crop/1:1/center/-/smart_resize/192x192/`,
112
+ sizes: '192x192',
113
+ type: 'image/png',
114
+ purpose: 'any maskable'
115
+ },
116
+ {
117
+ src: `${favicon}-/crop/1:1/center/-/smart_resize/512x512/`,
118
+ sizes: '512x512',
119
+ type: 'image/png'
120
+ }
121
+ ]
122
+ })
123
+ }
124
+ ]
125
+ };
126
+ const languageIsoCode = shopMeta?.localization.language.isoCode ?? null;
127
+ const countryIsoCode = shopMeta?.localization.country.isoCode ?? null;
128
+ const locale = !languageIsoCode || !countryIsoCode ? null : `${languageIsoCode}-${countryIsoCode}`;
129
+ return serializableJson({
130
+ themeStyle: genCSS(dataBuilder?.pageStyle?.data, mobileOnly),
131
+ fontStyle,
132
+ elementFontStyle,
133
+ builderData: pageTemplate,
134
+ pageType,
135
+ moneyFormat: shopMeta?.shop.moneyFormat ?? null,
136
+ currency: shopMeta?.localization.country.currency.isoCode ?? null,
137
+ languageIsoCode,
138
+ countryIsoCode,
139
+ locale,
140
+ swr: {
141
+ fallback
142
+ },
143
+ swatches: parseJson(shopData?.storeProperty?.swatchesConfig),
144
+ seo,
145
+ mobileOnly,
146
+ gaTrackingId: dataBuilder.themePageAnalytic?.gaTrackingID ?? null,
147
+ facebookPixelId: dataBuilder.themePageAnalytic?.fbPixelID ?? null,
148
+ tiktokPixelId: dataBuilder.themePageAnalytic?.tiktokPixelID ?? null,
149
+ customCodeHeader: dataBuilder.themePageCustomCode?.header ?? null,
150
+ customCodeBody: dataBuilder.themePageCustomCode?.body ?? null,
151
+ pageHandle: dataBuilder.handle ?? null,
152
+ customFonts,
153
+ interaction: dataBuilder?.interaction,
154
+ pageBackground: extractPageBackground(dataBuilder)
155
+ });
156
+ } catch (err) {
157
+ captureException(err);
158
+ throw err;
159
+ }
160
+ };
161
+
162
+ export { getStaticPagePropsV2 };
@@ -1 +1,146 @@
1
- import{PublishedThemePagesDocument as e,StorePropertyDocument as a,prefetchQueries as t}from"@gem-sdk/core";import{ShopMetaDocument as o}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 p}from"../helpers/parse-json.js";let getStaticPageProps=(c,m)=>async d=>{let u="STATIC",f={slug:d,slugType:u},[h,g,y]=await Promise.allSettled([c([e,f]),c([a]),m([o])]);if("rejected"===h.status)return{pageType:u};let z=h.value.publishedThemePages?.[0],x=l(z),v=await r(z?.pageStyle?.data),P=t(x),S=await Promise.allSettled(P.map(({query:e,variables:a,func:t})=>t?t(c,a):e?c([e,a]):{})),_=P.reduce((e,{key:a},t)=>{let o=S[t];return o?.status==="fulfilled"?{...e,[a]:o.value}:e},{}),$=z?.themePageDataSEO?.find(e=>e?.key==="global-meta-description")?.value,b=n(z?.themePageDataSEO?.find(e=>e?.key==="global-meta-thumbnail")?.value),j="fulfilled"===y.status?y.value:void 0,k="fulfilled"===g.status?g.value:void 0,T=k?.storeProperty?.favicon??"/favicon/favicon-32x32.png",w={defaultTitle:j?.shop.name??"",title:z?.name??"",description:$??j?.shop.description??"",openGraph:{site_name:j?.shop.name??"",locale:j?.localization.country.isoCode??"",title:z?.name??j?.shop.name??"",description:$??j?.shop.description??"",images:b?[b]:[]},additionalMetaTags:[{name:"theme-color",content:"#000000"}],canonical:`/${d}`,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"}]})}]},C=j?.localization.language.isoCode??null,D=j?.localization.country.isoCode??null,E=C&&D?`${C}-${D}`:null;return p({themeStyle:s(z?.pageStyle?.data),fontStyle:v,builderData:x,pageType:u,moneyFormat:j?.shop.moneyFormat??null,currency:j?.localization.country.currency.isoCode??null,languageIsoCode:C,countryIsoCode:D,locale:E,swr:{fallback:_},swatches:n(k?.storeProperty?.swatchesConfig),seo:w})};export{getStaticPageProps};
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 getStaticPageProps = (fetcher, shopifyFetcher)=>async (slug)=>{
10
+ const pageType = 'STATIC';
11
+ const variables = {
12
+ slug,
13
+ slugType: pageType
14
+ };
15
+ const [theme, storeProperty, shopifyMeta] = await Promise.allSettled([
16
+ fetcher([
17
+ PublishedThemePagesDocument,
18
+ variables
19
+ ]),
20
+ fetcher([
21
+ StorePropertyDocument
22
+ ]),
23
+ shopifyFetcher([
24
+ ShopMetaDocument
25
+ ])
26
+ ]);
27
+ if (theme.status === 'rejected') {
28
+ return {
29
+ pageType
30
+ };
31
+ }
32
+ const dataBuilder = theme.value.publishedThemePages?.[0];
33
+ const pageTemplate = parseBuilderTemplate(dataBuilder);
34
+ const fontStyle = await getFontFromGlobalStyle(dataBuilder?.pageStyle?.data);
35
+ const queries = prefetchQueries(pageTemplate);
36
+ const datas = await Promise.allSettled(queries.map(({ query, variables, func })=>{
37
+ if (func) {
38
+ return func(fetcher, variables);
39
+ }
40
+ if (query) return fetcher([
41
+ query,
42
+ variables
43
+ ]);
44
+ return {};
45
+ }));
46
+ const fallback = queries.reduce((acc, { key }, index)=>{
47
+ const res = datas[index];
48
+ if (res?.status === 'fulfilled') {
49
+ return {
50
+ ...acc,
51
+ [key]: res.value
52
+ };
53
+ }
54
+ return acc;
55
+ }, {});
56
+ const description = dataBuilder?.themePageDataSEO?.find((item)=>item?.key === 'global-meta-description')?.value;
57
+ const thumbnail = parseJson(dataBuilder?.themePageDataSEO?.find((item)=>item?.key === 'global-meta-thumbnail')?.value);
58
+ const shopMeta = shopifyMeta.status === 'fulfilled' ? shopifyMeta.value : undefined;
59
+ const shopData = storeProperty.status === 'fulfilled' ? storeProperty.value : undefined;
60
+ const favicon = shopData?.storeProperty?.favicon ?? '/favicon/favicon-32x32.png';
61
+ const seo = {
62
+ defaultTitle: shopMeta?.shop.name ?? '',
63
+ title: dataBuilder?.name ?? '',
64
+ description: description ?? shopMeta?.shop.description ?? '',
65
+ openGraph: {
66
+ site_name: shopMeta?.shop.name ?? '',
67
+ locale: shopMeta?.localization.country.isoCode ?? '',
68
+ title: dataBuilder?.name ?? shopMeta?.shop.name ?? '',
69
+ description: description ?? shopMeta?.shop.description ?? '',
70
+ images: thumbnail ? [
71
+ thumbnail
72
+ ] : []
73
+ },
74
+ additionalMetaTags: [
75
+ {
76
+ name: 'theme-color',
77
+ content: '#000000'
78
+ }
79
+ ],
80
+ canonical: `/${slug}`,
81
+ additionalLinkTags: [
82
+ {
83
+ rel: 'icon',
84
+ sizes: '32x32',
85
+ href: `${favicon}-/crop/1:1/center/-/smart_resize/32x32/`
86
+ },
87
+ {
88
+ rel: 'icon',
89
+ sizes: '16x16',
90
+ href: `${favicon}-/crop/1:1/center/-/smart_resize/16x16/`
91
+ },
92
+ {
93
+ rel: 'apple-touch-icon',
94
+ sizes: '180x180',
95
+ href: `${favicon}-/crop/1:1/center/-/smart_resize/180x180/`
96
+ },
97
+ {
98
+ rel: 'manifest',
99
+ href: generateManifest({
100
+ theme_color: '#000000',
101
+ background_color: '#ffffff',
102
+ display: 'standalone',
103
+ scope: '/',
104
+ start_url: '/',
105
+ name: shopMeta?.shop.name,
106
+ short_name: shopMeta?.shop.name,
107
+ description: shopMeta?.shop.description,
108
+ icons: [
109
+ {
110
+ src: `${favicon}-/crop/1:1/center/-/smart_resize/192x192/`,
111
+ sizes: '192x192',
112
+ type: 'image/png',
113
+ purpose: 'any maskable'
114
+ },
115
+ {
116
+ src: `${favicon}-/crop/1:1/center/-/smart_resize/512x512/`,
117
+ sizes: '512x512',
118
+ type: 'image/png'
119
+ }
120
+ ]
121
+ })
122
+ }
123
+ ]
124
+ };
125
+ const languageIsoCode = shopMeta?.localization.language.isoCode ?? null;
126
+ const countryIsoCode = shopMeta?.localization.country.isoCode ?? null;
127
+ const locale = !languageIsoCode || !countryIsoCode ? null : `${languageIsoCode}-${countryIsoCode}`;
128
+ return serializableJson({
129
+ themeStyle: genCSS(dataBuilder?.pageStyle?.data),
130
+ fontStyle,
131
+ builderData: pageTemplate,
132
+ pageType,
133
+ moneyFormat: shopMeta?.shop.moneyFormat ?? null,
134
+ currency: shopMeta?.localization.country.currency.isoCode ?? null,
135
+ languageIsoCode,
136
+ countryIsoCode,
137
+ locale,
138
+ swr: {
139
+ fallback
140
+ },
141
+ swatches: parseJson(shopData?.storeProperty?.swatchesConfig),
142
+ seo
143
+ });
144
+ };
145
+
146
+ export { getStaticPageProps };
@@ -1,8 +1,57 @@
1
- let composeFontMimeType=t=>{let o={};return t?.forEach(t=>{if(!t)return;let e=`${t.fontFamily}_${t.fontStyle}_${t.fontWeight}`,n={font:{fontFamily:t.fontFamily,fontStyle:t.fontStyle,fontWeight:t.fontWeight},urls:[{url:t.backupFilePath||t.filePath,mimeType:t.mimeType}]};o[e]?o[e]?.urls.push(n?.urls?.[0]):o[e]=n}),o},formatName=t=>({"font/ttf":"truetype","application/x-font-opentype":"opentype","application/font-woff":"woff","application/font-woff2":"woff2"})[t],composeFontFaces=t=>{let o=[];for(let[,e]of Object.entries(t))o.push(`
1
+ const composeFontMimeType = (fonts)=>{
2
+ const result = {};
3
+ fonts?.forEach((font)=>{
4
+ if (!font) return;
5
+ const fontKey = `${font.fontFamily}_${font.fontStyle}_${font.fontWeight}`;
6
+ const fontData = {
7
+ font: {
8
+ fontFamily: font.fontFamily,
9
+ fontStyle: font.fontStyle,
10
+ fontWeight: font.fontWeight
11
+ },
12
+ urls: [
13
+ {
14
+ url: font.backupFilePath || font.filePath,
15
+ mimeType: font.mimeType
16
+ }
17
+ ]
18
+ };
19
+ if (!result[fontKey]) {
20
+ result[fontKey] = fontData;
21
+ } else {
22
+ result[fontKey]?.urls.push(fontData?.urls?.[0]);
23
+ }
24
+ });
25
+ return result;
26
+ };
27
+ // Currently support only ttf, otf, woff, woff2
28
+ const formatName = (mimeType)=>{
29
+ const fontMimeTypes = {
30
+ 'font/ttf': 'truetype',
31
+ 'application/x-font-opentype': 'opentype',
32
+ 'application/font-woff': 'woff',
33
+ 'application/font-woff2': 'woff2'
34
+ };
35
+ return fontMimeTypes[mimeType];
36
+ };
37
+ const composeFontFaces = (fontsMimeType)=>{
38
+ const fontFaces = [];
39
+ for (const [, value] of Object.entries(fontsMimeType)){
40
+ fontFaces.push(`
2
41
  @font-face {
3
- font-family: '${e.font.fontFamily}';
4
- src: ${e.urls.map(t=>`url('${t.url}') format('${formatName(t.mimeType)}')`).join("\n")};
5
- font-style: ${e?.font?.fontStyle??"normal"};
6
- font-weight: ${e?.font?.fontWeight??"normal"};
42
+ font-family: '${value.font.fontFamily}';
43
+ src: ${value.urls.map((item)=>`url('${item.url}') format('${formatName(item.mimeType)}')`).join('\n')};
44
+ font-style: ${value?.font?.fontStyle ?? 'normal'};
45
+ font-weight: ${value?.font?.fontWeight ?? 'normal'};
7
46
  }
8
- `);return o.map(t=>t).join("\n")},getCustomFonts=t=>{if(!t)return null;let o=composeFontMimeType(t);return composeFontFaces(o)};export{composeFontFaces,composeFontMimeType,formatName,getCustomFonts};
47
+ `);
48
+ }
49
+ return fontFaces.map((fontFace)=>fontFace).join('\n');
50
+ };
51
+ const getCustomFonts = (fonts)=>{
52
+ if (!fonts) return null;
53
+ const fontsMimeType = composeFontMimeType(fonts);
54
+ return composeFontFaces(fontsMimeType);
55
+ };
56
+
57
+ export { composeFontFaces, composeFontMimeType, formatName, getCustomFonts };
@@ -1 +1,96 @@
1
- import{getStorefrontApi as e}from"./get-storefront-api.js";let createFetcher=e=>{let r=e||process.env.NEXT_PUBLIC_SHOP_TOKEN;return async e=>{let[t,o,n]=e;if(!r)throw Error("shopToken is not defined");if(!process.env.NEXT_PUBLIC_API_URL)throw Error("NEXT_PUBLIC_API_URL is not defined");let s={"Content-Type":"application/json","X-GemX-Shop-Token":r};return fetch(process.env.NEXT_PUBLIC_API_URL,{method:"POST",headers:s,body:JSON.stringify({query:t,variables:o,operationName:n})}).then(e=>e.json()).then(e=>e.errors?Promise.reject(e.errors):e.data)}},createAppAPIFetcher=(e,r)=>{let t=process.env.NEXT_APP_API_URL;return async o=>{let[n,s,i]=o;if(!e)throw Error("shopToken is not defined");if(!t)throw Error("NEXT_APP_API_URL is not defined");let c={"Content-Type":"application/json",Authorization:`Token ${e}`,"X-GemX-Shop-ID":r||""};return fetch(t,{method:"POST",headers:c,body:JSON.stringify({query:n,variables:s,operationName:i})}).then(e=>e.json()).then(e=>e.errors?Promise.reject(e.errors):e.data)}},createShopifyFetcher=(r,t)=>{let o=r??process.env.NEXT_PUBLIC_STOREFRONT_TOKEN,n=t??process.env.NEXT_PUBLIC_STOREFRONT_HANDLE;return async r=>{if(!o)throw Error("NEXT_PUBLIC_STOREFRONT_TOKEN is not defined");if(!n)throw Error("NEXT_PUBLIC_STOREFRONT_HANDLE is not defined");let t={"Content-Type":"application/json","X-Shopify-Storefront-Access-Token":o},[s,i]=r;return fetch(e(n),{method:"POST",headers:t,body:JSON.stringify({query:s,variables:i})}).then(e=>e.json()).then(e=>e.errors?Promise.reject(e.errors):e.data)}};export{createAppAPIFetcher,createFetcher,createShopifyFetcher};
1
+ import { getStorefrontApi } from './get-storefront-api.js';
2
+
3
+ const createFetcher = (token)=>{
4
+ const shopToken = token || process.env.NEXT_PUBLIC_SHOP_TOKEN;
5
+ return async (args)=>{
6
+ const [query, variables, operationName] = args;
7
+ if (!shopToken) {
8
+ throw new Error('shopToken is not defined');
9
+ }
10
+ if (!process.env.NEXT_PUBLIC_API_URL) {
11
+ throw new Error('NEXT_PUBLIC_API_URL is not defined');
12
+ }
13
+ const headers = {
14
+ 'Content-Type': 'application/json',
15
+ 'X-GemX-Shop-Token': shopToken
16
+ };
17
+ return fetch(process.env.NEXT_PUBLIC_API_URL, {
18
+ method: 'POST',
19
+ headers,
20
+ body: JSON.stringify({
21
+ query,
22
+ variables,
23
+ operationName
24
+ })
25
+ }).then((res)=>res.json()).then((res)=>{
26
+ if (res.errors) {
27
+ return Promise.reject(res.errors);
28
+ }
29
+ return res.data;
30
+ });
31
+ };
32
+ };
33
+ const createAppAPIFetcher = (token, shopID)=>{
34
+ const shopToken = token;
35
+ const endPoint = process.env.NEXT_APP_API_URL;
36
+ return async (args)=>{
37
+ const [query, variables, operationName] = args;
38
+ if (!shopToken) {
39
+ throw new Error('shopToken is not defined');
40
+ }
41
+ if (!endPoint) {
42
+ throw new Error('NEXT_APP_API_URL is not defined');
43
+ }
44
+ const headers = {
45
+ 'Content-Type': 'application/json',
46
+ Authorization: `Token ${shopToken}`,
47
+ 'X-GemX-Shop-ID': shopID || ''
48
+ };
49
+ return fetch(endPoint, {
50
+ method: 'POST',
51
+ headers,
52
+ body: JSON.stringify({
53
+ query,
54
+ variables,
55
+ operationName
56
+ })
57
+ }).then((res)=>res.json()).then((res)=>{
58
+ if (res.errors) {
59
+ return Promise.reject(res.errors);
60
+ }
61
+ return res.data;
62
+ });
63
+ };
64
+ };
65
+ const createShopifyFetcher = (storefrontToken, handle)=>{
66
+ const token = storefrontToken ?? process.env.NEXT_PUBLIC_STOREFRONT_TOKEN;
67
+ const storefrontHandle = handle ?? process.env.NEXT_PUBLIC_STOREFRONT_HANDLE;
68
+ return async (args)=>{
69
+ if (!token) {
70
+ throw new Error('NEXT_PUBLIC_STOREFRONT_TOKEN is not defined');
71
+ }
72
+ if (!storefrontHandle) {
73
+ throw new Error('NEXT_PUBLIC_STOREFRONT_HANDLE is not defined');
74
+ }
75
+ const headers = {
76
+ 'Content-Type': 'application/json',
77
+ 'X-Shopify-Storefront-Access-Token': token
78
+ };
79
+ const [query, variables] = args;
80
+ return fetch(getStorefrontApi(storefrontHandle), {
81
+ method: 'POST',
82
+ headers,
83
+ body: JSON.stringify({
84
+ query,
85
+ variables
86
+ })
87
+ }).then((res)=>res.json()).then((res)=>{
88
+ if (res.errors) {
89
+ return Promise.reject(res.errors);
90
+ }
91
+ return res.data;
92
+ });
93
+ };
94
+ };
95
+
96
+ export { createAppAPIFetcher, createFetcher, createShopifyFetcher };
@@ -1 +1,11 @@
1
- import{jsx as t}from"react/jsx-runtime";import o from"../layouts/main.js";let getLayout=(r,e)=>t(o,{...e,children:r});export{getLayout};
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import MainLayout from '../layouts/main.js';
3
+
4
+ const getLayout = (page, pageProps)=>{
5
+ return /*#__PURE__*/ jsx(MainLayout, {
6
+ ...pageProps,
7
+ children: page
8
+ });
9
+ };
10
+
11
+ export { getLayout };