@gem-sdk/pages 1.36.6 → 2.0.0-dev.832

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 (110) hide show
  1. package/dist/cjs/components/ErrorBoundary.js +1 -40
  2. package/dist/cjs/components/ErrorFallback.js +1 -26
  3. package/dist/cjs/components/FacebookPixel.js +3 -36
  4. package/dist/cjs/components/Footer.js +1 -125
  5. package/dist/cjs/components/FooterForPostPurchase.js +1 -0
  6. package/dist/cjs/components/GoogleAnalytic.js +5 -67
  7. package/dist/cjs/components/Header.js +1 -96
  8. package/dist/cjs/components/TikTokPixel.js +3 -19
  9. package/dist/cjs/components/builder/PopupManager.js +1 -62
  10. package/dist/cjs/components/builder/Toolbar.js +1 -883
  11. package/dist/cjs/components/builder/Toolbox.js +1 -384
  12. package/dist/cjs/components/builder/toolbar/Onboarding.js +1 -110
  13. package/dist/cjs/components/image-to-layout/AddSectionImageToLayout.js +1 -263
  14. package/dist/cjs/components/image-to-layout/DropElement.js +1 -164
  15. package/dist/cjs/components/image-to-layout/ImageToLayout.js +1 -41
  16. package/dist/cjs/index.js +1 -75
  17. package/dist/cjs/layouts/main.js +1 -30
  18. package/dist/cjs/libs/api/get-builder-props.js +1 -41
  19. package/dist/cjs/libs/api/get-collection-props.js +1 -68
  20. package/dist/cjs/libs/api/get-home-page-props-v2.js +1 -145
  21. package/dist/cjs/libs/api/get-home-page-props.js +1 -151
  22. package/dist/cjs/libs/api/get-post-purchase-props-preview.js +1 -0
  23. package/dist/cjs/libs/api/get-preview-props.js +1 -18
  24. package/dist/cjs/libs/api/get-product-props.js +1 -73
  25. package/dist/cjs/libs/api/get-static-page-props-preview.js +1 -150
  26. package/dist/cjs/libs/api/get-static-page-props-v2.js +1 -148
  27. package/dist/cjs/libs/api/get-static-page-props.js +1 -148
  28. package/dist/cjs/libs/custom-fonts.js +8 -0
  29. package/dist/cjs/libs/fetcher.js +1 -67
  30. package/dist/cjs/libs/get-layout.js +1 -13
  31. package/dist/cjs/libs/get-storefront-api.js +1 -12
  32. package/dist/cjs/libs/getStaticPaths.js +1 -10
  33. package/dist/cjs/libs/google-fonts.js +1 -81
  34. package/dist/cjs/libs/helpers/common.js +1 -27
  35. package/dist/cjs/libs/helpers/gen-css.js +1 -111
  36. package/dist/cjs/libs/helpers/gen-fonts.js +1 -68
  37. package/dist/cjs/libs/helpers/generate-manifres.js +1 -5
  38. package/dist/cjs/libs/helpers/get-fallback.js +1 -35
  39. package/dist/cjs/libs/helpers/normalize.js +1 -90
  40. package/dist/cjs/libs/helpers/parse-json.js +1 -16
  41. package/dist/cjs/libs/helpers/user-agent.js +1 -7
  42. package/dist/cjs/libs/hooks/use-tracking-view.js +1 -45
  43. package/dist/cjs/libs/hooks/usePagePreview.js +1 -0
  44. package/dist/cjs/libs/parse-html.js +1 -42
  45. package/dist/cjs/libs/shopify-cdn-with-google-fonts.js +1 -1845
  46. package/dist/cjs/pages/404.js +1 -43
  47. package/dist/cjs/pages/500.js +1 -74
  48. package/dist/cjs/pages/CollectionGlobalProvider.js +1 -59
  49. package/dist/cjs/pages/builder.js +1 -103
  50. package/dist/cjs/pages/collection-detail.js +1 -64
  51. package/dist/cjs/pages/preview.js +1 -26
  52. package/dist/cjs/pages/product-detail.js +1 -69
  53. package/dist/cjs/pages/static-v2.js +1 -84
  54. package/dist/cjs/pages/static.js +1 -75
  55. package/dist/esm/components/ErrorBoundary.js +1 -38
  56. package/dist/esm/components/ErrorFallback.js +1 -24
  57. package/dist/esm/components/FacebookPixel.js +3 -34
  58. package/dist/esm/components/Footer.js +1 -121
  59. package/dist/esm/components/FooterForPostPurchase.js +1 -0
  60. package/dist/esm/components/GoogleAnalytic.js +5 -65
  61. package/dist/esm/components/Header.js +1 -92
  62. package/dist/esm/components/TikTokPixel.js +3 -17
  63. package/dist/esm/components/builder/PopupManager.js +1 -58
  64. package/dist/esm/components/builder/Toolbar.js +1 -879
  65. package/dist/esm/components/builder/Toolbox.js +1 -380
  66. package/dist/esm/components/builder/toolbar/Onboarding.js +1 -106
  67. package/dist/esm/components/image-to-layout/AddSectionImageToLayout.js +1 -259
  68. package/dist/esm/components/image-to-layout/DropElement.js +1 -162
  69. package/dist/esm/components/image-to-layout/ImageToLayout.js +1 -37
  70. package/dist/esm/index.js +1 -33
  71. package/dist/esm/layouts/main.js +1 -26
  72. package/dist/esm/libs/api/get-builder-props.js +1 -39
  73. package/dist/esm/libs/api/get-collection-props.js +1 -66
  74. package/dist/esm/libs/api/get-home-page-props-v2.js +1 -143
  75. package/dist/esm/libs/api/get-home-page-props.js +1 -149
  76. package/dist/esm/libs/api/get-post-purchase-props-preview.js +1 -0
  77. package/dist/esm/libs/api/get-preview-props.js +1 -16
  78. package/dist/esm/libs/api/get-product-props.js +1 -71
  79. package/dist/esm/libs/api/get-static-page-props-preview.js +1 -148
  80. package/dist/esm/libs/api/get-static-page-props-v2.js +1 -146
  81. package/dist/esm/libs/api/get-static-page-props.js +1 -146
  82. package/dist/esm/libs/custom-fonts.js +8 -0
  83. package/dist/esm/libs/fetcher.js +1 -64
  84. package/dist/esm/libs/get-layout.js +1 -11
  85. package/dist/esm/libs/get-storefront-api.js +1 -10
  86. package/dist/esm/libs/getStaticPaths.js +1 -8
  87. package/dist/esm/libs/google-fonts.js +1 -75
  88. package/dist/esm/libs/helpers/common.js +1 -24
  89. package/dist/esm/libs/helpers/gen-css.js +1 -109
  90. package/dist/esm/libs/helpers/gen-fonts.js +1 -65
  91. package/dist/esm/libs/helpers/generate-manifres.js +1 -3
  92. package/dist/esm/libs/helpers/get-fallback.js +1 -33
  93. package/dist/esm/libs/helpers/normalize.js +1 -85
  94. package/dist/esm/libs/helpers/parse-json.js +1 -13
  95. package/dist/esm/libs/helpers/user-agent.js +1 -5
  96. package/dist/esm/libs/hooks/use-tracking-view.js +1 -43
  97. package/dist/esm/libs/hooks/usePagePreview.js +1 -0
  98. package/dist/esm/libs/parse-html.js +1 -40
  99. package/dist/esm/libs/shopify-cdn-with-google-fonts.js +1 -1843
  100. package/dist/esm/pages/404.js +1 -41
  101. package/dist/esm/pages/500.js +1 -72
  102. package/dist/esm/pages/CollectionGlobalProvider.js +1 -55
  103. package/dist/esm/pages/builder.js +1 -101
  104. package/dist/esm/pages/collection-detail.js +1 -60
  105. package/dist/esm/pages/preview.js +1 -24
  106. package/dist/esm/pages/product-detail.js +1 -65
  107. package/dist/esm/pages/static-v2.js +1 -82
  108. package/dist/esm/pages/static.js +1 -71
  109. package/dist/types/index.d.ts +29 -6
  110. package/package.json +5 -5
@@ -1,66 +1 @@
1
- import { CollectionDocument, 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 getCollectionProps = (fetcher)=>async (handle)=>{
7
- const pageType = 'COLLECTION';
8
- const variables = {
9
- slug: handle,
10
- slugType: pageType
11
- };
12
- const [collectionData, theme] = await Promise.all([
13
- fetcher([
14
- CollectionDocument,
15
- {
16
- handle
17
- }
18
- ]),
19
- fetcher([
20
- PublishedThemePagesDocument,
21
- variables
22
- ])
23
- ]);
24
- const dataBuilder = theme.publishedThemePages?.[0];
25
- const collectionTemplate = parseBuilderTemplate(dataBuilder);
26
- if (!collectionData || !collectionData?.collection || !dataBuilder) {
27
- throw new Error('Collection not found');
28
- }
29
- const { collection } = collectionData;
30
- const queries = prefetchQueries(collectionTemplate);
31
- const datas = await Promise.allSettled(queries.map(({ query, variables, func })=>{
32
- if (func) {
33
- return func(fetcher, variables);
34
- }
35
- if (query) return fetcher([
36
- query,
37
- variables
38
- ]);
39
- return {};
40
- }));
41
- const fallback = queries.reduce((acc, { key }, index)=>{
42
- const res = datas[index];
43
- if (res?.status === 'fulfilled') {
44
- return {
45
- ...acc,
46
- [key]: res.value
47
- };
48
- }
49
- return acc;
50
- }, {});
51
- return serializableJson({
52
- builderData: collectionTemplate,
53
- collection,
54
- pageType,
55
- themeStyle: genCSS(dataBuilder.pageStyle?.data),
56
- swr: {
57
- fallback
58
- },
59
- seo: {
60
- title: collection.title,
61
- description: collection.description
62
- }
63
- });
64
- };
65
-
66
- export { getCollectionProps };
1
+ import{CollectionDocument as e,PublishedThemePagesDocument as t,prefetchQueries as l}from"@gem-sdk/core";import{genCSS as r}from"../helpers/gen-css.js";import{parseBuilderTemplate as o}from"../helpers/normalize.js";import{serializableJson as s}from"../helpers/parse-json.js";let getCollectionProps=i=>async a=>{let p="COLLECTION",m={slug:a,slugType:p},[n,c]=await Promise.all([i([e,{handle:a}]),i([t,m])]),u=c.publishedThemePages?.[0],d=o(u);if(!n||!n?.collection||!u)throw Error("Collection not found");let{collection:f}=n,g=l(d),h=await Promise.allSettled(g.map(({query:e,variables:t,func:l})=>l?l(i,t):e?i([e,t]):{})),C=g.reduce((e,{key:t},l)=>{let r=h[l];return r?.status==="fulfilled"?{...e,[t]:r.value}:e},{});return s({builderData:d,collection:f,pageType:p,themeStyle:r(u.pageStyle?.data),swr:{fallback:C},seo:{title:f.title,description:f.description}})};export{getCollectionProps};
@@ -1,143 +1 @@
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
+ 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,149 +1 @@
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
+ 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};
@@ -0,0 +1 @@
1
+ import{ThemePageDocument as e,StorePropertyDocument as t,SaleFunnelDiscountsDocument as r,LibraryTemplateDocument as a}from"@gem-sdk/core";import{ShopMetaDocument as o}from"@gem-sdk/adapter-shopify";import{captureException as s}from"@sentry/nextjs";import{getFontStyleFromPageTemplate as l}from"../google-fonts.js";import{getFallbackV2 as f}from"../helpers/get-fallback.js";import{parseBuilderTemplateV2 as i}from"../helpers/normalize.js";import{usePagePreview as m}from"../hooks/usePagePreview.js";import{serializableJson as h}from"../helpers/parse-json.js";let fetchSalePageDataByID=async(r,a,s)=>{let l={themePageId:r.themePageId},[f,i,m]=await Promise.allSettled([a([e,l]),a([t]),s([o])]);if("rejected"===f.status)throw Error(f.reason?.[0]);return{dataBuilder:f.value.themePage,storeProperty:i,shopifyMeta:m,productOffers:[]}},fetchPostPurchasePageDataByID=async(a,s,l)=>{let f={themePageId:a.themePageId},[i,m,h,d]=await Promise.allSettled([s([e,f]),s([t]),l([o]),s([r,{where:{saleFunnelOfferID:a.currentOfferID}}])]);if("rejected"===i.status)throw Error(i.reason?.[0]);if("rejected"===d.status)throw Error(d.reason?.[0]);return{dataBuilder:i.value.themePage,storeProperty:m,shopifyMeta:h,productOffers:d.value.saleFunnelDiscounts?.edges?.filter(e=>e?.node?.objectType==="PRODUCT"&&e?.node?.type==="ORDER_VALUE")||[]}},fetchThemePageDataByTemplateID=async(e,s,l)=>{let f={libraryTemplateId:e.libraryTemplateId},[i,m,h,d]=await Promise.allSettled([s([a,f]),s([t]),l([o]),s([r,{where:{saleFunnelOfferID:e.currentOfferID}}])]);if("rejected"===i.status)throw Error(i.reason?.[0]);if("rejected"===d.status)throw Error(d.reason?.[0]);return{dataBuilder:i.value.libraryTemplate,storeProperty:m,shopifyMeta:h,productOffers:d.value.saleFunnelDiscounts?.edges?.filter(e=>e?.node?.objectType==="PRODUCT"&&e?.node?.type==="ORDER_VALUE")||[]}},getPostPurchasePropsPreview=(e,t,r)=>async(a,o)=>{try{let{dataBuilder:s,storeProperty:d,shopifyMeta:P,productOffers:u}=r?await fetchThemePageDataByTemplateID({libraryTemplateId:a,currentOfferID:o},e,t):o?await fetchPostPurchasePageDataByID({themePageId:a,currentOfferID:o},e,t):await fetchSalePageDataByID({themePageId:a},e,t);if(!s)throw Error(`No data builder found for slug: /preview/${a}`);let c=i(s),[n,p]=await Promise.all([l(c),f(e,c)]),{seo:D,pageConfig:g}=m(s,d,P);return h({seo:D,...g,elementFontStyle:n,builderData:c,swr:{fallback:p},productOffers:u})}catch(e){throw s(e),e}};export{fetchPostPurchasePageDataByID,fetchSalePageDataByID,fetchThemePageDataByTemplateID,getPostPurchasePropsPreview};
@@ -1,16 +1 @@
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
+ 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,71 +1 @@
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 };
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,148 +1 @@
1
- import { PreviewPageDocument, 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 } from '../helpers/normalize.js';
9
- import { parseJson, serializableJson } from '../helpers/parse-json.js';
10
-
11
- const getStaticPagePropsPreview = (fetcher, shopifyFetcher)=>async (slug)=>{
12
- try {
13
- const pageType = 'STATIC';
14
- const variables = {
15
- handleURL: slug,
16
- pageType
17
- };
18
- const [theme, storeProperty, shopifyMeta] = await Promise.allSettled([
19
- fetcher([
20
- PreviewPageDocument,
21
- variables,
22
- 'previewPage'
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.previewPage;
35
- if (!dataBuilder) {
36
- throw new Error(`No data builder found for slug: /preview/${slug}`);
37
- }
38
- const pageTemplate = parseBuilderTemplateV2(dataBuilder);
39
- const [elementFontStyle, fontStyle, fallback] = await Promise.all([
40
- getFontStyleFromPageTemplate(pageTemplate),
41
- getFontFromGlobalStyle(dataBuilder?.pageStyle?.data),
42
- getFallbackV2(fetcher, pageTemplate)
43
- ]);
44
- const mobileOnly = dataBuilder.isMobile ?? false;
45
- const description = dataBuilder?.themePageDataSEO?.find((item)=>item?.key === 'global-meta-description')?.value;
46
- const thumbnail = parseJson(dataBuilder?.themePageDataSEO?.find((item)=>item?.key === 'global-meta-thumbnail')?.value);
47
- const shopMeta = shopifyMeta.status === 'fulfilled' ? shopifyMeta.value : undefined;
48
- const shopData = storeProperty.status === 'fulfilled' ? storeProperty.value : undefined;
49
- const favicon = shopData?.storeProperty?.favicon ?? '/favicon/favicon-32x32.png';
50
- const seo = {
51
- defaultTitle: shopMeta?.shop.name,
52
- title: dataBuilder?.name,
53
- description: description ?? shopMeta?.shop.description,
54
- openGraph: {
55
- site_name: shopMeta?.shop.name,
56
- locale: shopMeta?.localization.country.isoCode,
57
- title: dataBuilder?.name ?? shopMeta?.shop.name,
58
- description: description ?? shopMeta?.shop.description,
59
- images: thumbnail ? [
60
- thumbnail
61
- ] : []
62
- },
63
- nofollow: true,
64
- noindex: true,
65
- canonical: `/preview/${slug}`,
66
- additionalMetaTags: [
67
- {
68
- name: 'theme-color',
69
- content: '#000000'
70
- }
71
- ],
72
- additionalLinkTags: [
73
- {
74
- rel: 'icon',
75
- sizes: '32x32',
76
- href: `${favicon}-/crop/1:1/center/-/smart_resize/32x32/`
77
- },
78
- {
79
- rel: 'icon',
80
- sizes: '16x16',
81
- href: `${favicon}-/crop/1:1/center/-/smart_resize/16x16/`
82
- },
83
- {
84
- rel: 'apple-touch-icon',
85
- sizes: '180x180',
86
- href: `${favicon}-/crop/1:1/center/-/smart_resize/180x180/`
87
- },
88
- {
89
- rel: 'manifest',
90
- href: generateManifest({
91
- theme_color: '#000000',
92
- background_color: '#ffffff',
93
- display: 'standalone',
94
- scope: '/',
95
- start_url: '/',
96
- name: shopMeta?.shop.name,
97
- short_name: shopMeta?.shop.name,
98
- description: shopMeta?.shop.description,
99
- icons: [
100
- {
101
- src: `${favicon}-/crop/1:1/center/-/smart_resize/192x192/`,
102
- sizes: '192x192',
103
- type: 'image/png',
104
- purpose: 'any maskable'
105
- },
106
- {
107
- src: `${favicon}-/crop/1:1/center/-/smart_resize/512x512/`,
108
- sizes: '512x512',
109
- type: 'image/png'
110
- }
111
- ]
112
- })
113
- }
114
- ]
115
- };
116
- const languageIsoCode = shopMeta?.localization.language.isoCode ?? null;
117
- const countryIsoCode = shopMeta?.localization.country.isoCode ?? null;
118
- const locale = !languageIsoCode || !countryIsoCode ? null : `${languageIsoCode}-${countryIsoCode}`;
119
- return serializableJson({
120
- themeStyle: genCSS(dataBuilder?.pageStyle?.data, mobileOnly),
121
- fontStyle,
122
- elementFontStyle,
123
- builderData: pageTemplate,
124
- pageType,
125
- moneyFormat: shopMeta?.shop.moneyFormat ?? null,
126
- currency: shopMeta?.localization.country.currency.isoCode ?? null,
127
- languageIsoCode,
128
- countryIsoCode,
129
- locale,
130
- swr: {
131
- fallback
132
- },
133
- swatches: parseJson(shopData?.storeProperty?.swatchesConfig),
134
- seo,
135
- mobileOnly,
136
- gaTrackingId: dataBuilder.themePageAnalytic?.gaTrackingID ?? null,
137
- facebookPixelId: dataBuilder.themePageAnalytic?.fbPixelID ?? null,
138
- tiktokPixelId: dataBuilder.themePageAnalytic?.tiktokPixelID ?? null,
139
- customCodeHeader: dataBuilder.themePageCustomCode?.header ?? null,
140
- customCodeBody: dataBuilder.themePageCustomCode?.body ?? null
141
- });
142
- } catch (err) {
143
- captureException(err);
144
- throw err;
145
- }
146
- };
147
-
148
- export { getStaticPagePropsPreview };
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};