@gem-sdk/pages 1.0.0

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 (73) hide show
  1. package/README.md +7 -0
  2. package/dist/cjs/components/ErrorBoundary.js +32 -0
  3. package/dist/cjs/components/ErrorFallback.js +9 -0
  4. package/dist/cjs/components/FacebookPixel.js +41 -0
  5. package/dist/cjs/components/GoogleAnalytic.js +43 -0
  6. package/dist/cjs/components/TikTokPixel.js +20 -0
  7. package/dist/cjs/components/builder/Toolbox.js +200 -0
  8. package/dist/cjs/index.js +62 -0
  9. package/dist/cjs/layouts/main.js +15 -0
  10. package/dist/cjs/libs/api/get-builder-props.js +33 -0
  11. package/dist/cjs/libs/api/get-collection-props.js +64 -0
  12. package/dist/cjs/libs/api/get-home-page-props-v2.js +127 -0
  13. package/dist/cjs/libs/api/get-home-page-props.js +135 -0
  14. package/dist/cjs/libs/api/get-preview-props.js +18 -0
  15. package/dist/cjs/libs/api/get-product-props.js +71 -0
  16. package/dist/cjs/libs/api/get-static-page-props-preview.js +133 -0
  17. package/dist/cjs/libs/api/get-static-page-props-v2.js +130 -0
  18. package/dist/cjs/libs/api/get-static-page-props.js +132 -0
  19. package/dist/cjs/libs/fetcher.js +71 -0
  20. package/dist/cjs/libs/get-layout.js +10 -0
  21. package/dist/cjs/libs/get-storefront-api.js +12 -0
  22. package/dist/cjs/libs/getStaticPaths.js +10 -0
  23. package/dist/cjs/libs/google-fonts.js +68 -0
  24. package/dist/cjs/libs/helpers/gen-css.js +102 -0
  25. package/dist/cjs/libs/helpers/generate-manifres.js +5 -0
  26. package/dist/cjs/libs/helpers/get-fallback.js +29 -0
  27. package/dist/cjs/libs/helpers/normalize.js +87 -0
  28. package/dist/cjs/libs/helpers/parse-json.js +18 -0
  29. package/dist/cjs/pages/404.js +11 -0
  30. package/dist/cjs/pages/500.js +19 -0
  31. package/dist/cjs/pages/builder.js +26 -0
  32. package/dist/cjs/pages/collection-detail.js +21 -0
  33. package/dist/cjs/pages/preview.js +20 -0
  34. package/dist/cjs/pages/product-detail.js +21 -0
  35. package/dist/cjs/pages/static-v2.js +17 -0
  36. package/dist/cjs/pages/static.js +19 -0
  37. package/dist/esm/components/ErrorBoundary.js +30 -0
  38. package/dist/esm/components/ErrorFallback.js +7 -0
  39. package/dist/esm/components/FacebookPixel.js +39 -0
  40. package/dist/esm/components/GoogleAnalytic.js +41 -0
  41. package/dist/esm/components/TikTokPixel.js +18 -0
  42. package/dist/esm/components/builder/Toolbox.js +196 -0
  43. package/dist/esm/index.js +28 -0
  44. package/dist/esm/layouts/main.js +11 -0
  45. package/dist/esm/libs/api/get-builder-props.js +31 -0
  46. package/dist/esm/libs/api/get-collection-props.js +62 -0
  47. package/dist/esm/libs/api/get-home-page-props-v2.js +125 -0
  48. package/dist/esm/libs/api/get-home-page-props.js +133 -0
  49. package/dist/esm/libs/api/get-preview-props.js +16 -0
  50. package/dist/esm/libs/api/get-product-props.js +69 -0
  51. package/dist/esm/libs/api/get-static-page-props-preview.js +131 -0
  52. package/dist/esm/libs/api/get-static-page-props-v2.js +128 -0
  53. package/dist/esm/libs/api/get-static-page-props.js +130 -0
  54. package/dist/esm/libs/fetcher.js +68 -0
  55. package/dist/esm/libs/get-layout.js +8 -0
  56. package/dist/esm/libs/get-storefront-api.js +10 -0
  57. package/dist/esm/libs/getStaticPaths.js +8 -0
  58. package/dist/esm/libs/google-fonts.js +64 -0
  59. package/dist/esm/libs/helpers/gen-css.js +100 -0
  60. package/dist/esm/libs/helpers/generate-manifres.js +3 -0
  61. package/dist/esm/libs/helpers/get-fallback.js +27 -0
  62. package/dist/esm/libs/helpers/normalize.js +83 -0
  63. package/dist/esm/libs/helpers/parse-json.js +15 -0
  64. package/dist/esm/pages/404.js +9 -0
  65. package/dist/esm/pages/500.js +17 -0
  66. package/dist/esm/pages/builder.js +24 -0
  67. package/dist/esm/pages/collection-detail.js +17 -0
  68. package/dist/esm/pages/preview.js +18 -0
  69. package/dist/esm/pages/product-detail.js +17 -0
  70. package/dist/esm/pages/static-v2.js +15 -0
  71. package/dist/esm/pages/static.js +15 -0
  72. package/dist/types/index.d.ts +173 -0
  73. package/package.json +45 -0
@@ -0,0 +1,135 @@
1
+ 'use strict';
2
+
3
+ var core = require('@gem-sdk/core');
4
+ var adapterShopify = require('@gem-sdk/adapter-shopify');
5
+ var googleFonts = require('../google-fonts.js');
6
+ var genCss = require('../helpers/gen-css.js');
7
+ var generateManifres = require('../helpers/generate-manifres.js');
8
+ var normalize = require('../helpers/normalize.js');
9
+ var parseJson = require('../helpers/parse-json.js');
10
+
11
+ const getHomePageProps = (fetcher, shopifyFetcher) => async () => {
12
+ const pageType = 'STATIC';
13
+ const variables = {
14
+ slugType: pageType,
15
+ };
16
+ // const theme = await fetcher<PublishedThemePagesQueryResponse, PublishedThemePagesQueryVariables>([
17
+ // PublishedThemePagesDocument,
18
+ // variables,
19
+ // ]);
20
+ const [theme, storeProperty, shopifyMeta] = await Promise.allSettled([
21
+ fetcher([
22
+ core.PublishedThemePagesDocument,
23
+ variables,
24
+ ]),
25
+ fetcher([core.StorePropertyDocument]),
26
+ shopifyFetcher([adapterShopify.ShopMetaDocument]),
27
+ ]);
28
+ if (theme.status === 'rejected') {
29
+ return {
30
+ pageType,
31
+ };
32
+ }
33
+ const dataBuilder = theme.value.publishedThemePages?.[0];
34
+ const homeTemplate = normalize.parseBuilderTemplate(dataBuilder);
35
+ const fontStyle = await googleFonts.getFontFromGlobalStyle(dataBuilder?.pageStyle?.data);
36
+ const queries = core.prefetchQueries(homeTemplate);
37
+ const datas = await Promise.allSettled(queries.map(({ query, variables, func }) => {
38
+ if (func) {
39
+ return func(fetcher, variables);
40
+ }
41
+ if (query)
42
+ return fetcher([query, variables]);
43
+ return {};
44
+ }));
45
+ const fallback = queries.reduce((acc, { key }, index) => {
46
+ const res = datas[index];
47
+ if (res?.status === 'fulfilled') {
48
+ return {
49
+ ...acc,
50
+ [key]: res.value,
51
+ };
52
+ }
53
+ return acc;
54
+ }, {});
55
+ const description = dataBuilder?.themePageDataSEO?.find((item) => item?.key === 'global-meta-description')?.value;
56
+ const thumbnail = parseJson.parseJson(dataBuilder?.themePageDataSEO?.find((item) => item?.key === 'global-meta-thumbnail')?.value);
57
+ const shopMeta = shopifyMeta.status === 'fulfilled' ? shopifyMeta.value : undefined;
58
+ const shopData = storeProperty.status === 'fulfilled' ? storeProperty.value : undefined;
59
+ const favicon = shopData?.storeProperty?.favicon ?? '/favicon/favicon-32x32.png';
60
+ const seo = {
61
+ defaultTitle: shopMeta?.shop.name,
62
+ title: dataBuilder?.name ?? 'Home',
63
+ description: description ?? shopMeta?.shop.description,
64
+ openGraph: {
65
+ site_name: shopMeta?.shop.name,
66
+ locale: shopMeta?.localization.country.isoCode,
67
+ title: dataBuilder?.name ?? shopMeta?.shop.name,
68
+ description: description ?? shopMeta?.shop.description,
69
+ images: thumbnail ? [thumbnail] : [],
70
+ },
71
+ additionalMetaTags: [
72
+ {
73
+ name: 'theme-color',
74
+ content: '#000000',
75
+ },
76
+ ],
77
+ canonical: '/',
78
+ additionalLinkTags: [
79
+ {
80
+ rel: 'icon',
81
+ sizes: '32x32',
82
+ href: `${favicon}-/crop/1:1/center/-/smart_resize/32x32/`,
83
+ },
84
+ {
85
+ rel: 'icon',
86
+ sizes: '16x16',
87
+ href: `${favicon}-/crop/1:1/center/-/smart_resize/16x16/`,
88
+ },
89
+ {
90
+ rel: 'apple-touch-icon',
91
+ sizes: '180x180',
92
+ href: `${favicon}-/crop/1:1/center/-/smart_resize/180x180/`,
93
+ },
94
+ {
95
+ rel: 'manifest',
96
+ href: generateManifres.generateManifest({
97
+ theme_color: '#000000',
98
+ background_color: '#ffffff',
99
+ display: 'standalone',
100
+ scope: '/',
101
+ start_url: '/',
102
+ name: shopMeta?.shop.name,
103
+ short_name: shopMeta?.shop.name,
104
+ description: shopMeta?.shop.description,
105
+ icons: [
106
+ {
107
+ src: `${favicon}-/crop/1:1/center/-/smart_resize/192x192/`,
108
+ sizes: '192x192',
109
+ type: 'image/png',
110
+ purpose: 'any maskable',
111
+ },
112
+ {
113
+ src: `${favicon}-/crop/1:1/center/-/smart_resize/512x512/`,
114
+ sizes: '512x512',
115
+ type: 'image/png',
116
+ },
117
+ ],
118
+ }),
119
+ },
120
+ ],
121
+ };
122
+ return parseJson.serializableJson({
123
+ themeStyle: genCss.genCSS(dataBuilder?.pageStyle?.data),
124
+ fontStyle,
125
+ builderData: homeTemplate,
126
+ pageType,
127
+ swr: { fallback },
128
+ currency: shopMeta?.localization.country.currency.isoCode ?? null,
129
+ locale: shopMeta?.localization.country.isoCode ?? null,
130
+ swatches: parseJson.parseJson(shopData?.storeProperty?.swatchesConfig),
131
+ seo,
132
+ });
133
+ };
134
+
135
+ exports.getHomePageProps = getHomePageProps;
@@ -0,0 +1,18 @@
1
+ 'use strict';
2
+
3
+ var getCollectionProps = require('./get-collection-props.js');
4
+ var getProductProps = require('./get-product-props.js');
5
+ var getStaticPageProps = require('./get-static-page-props.js');
6
+
7
+ const getPreviewProps = (fetcher, shopifyFetcher) => async (pageType, slug) => {
8
+ switch (pageType) {
9
+ case 'COLLECTION':
10
+ return getCollectionProps.getCollectionProps(fetcher)(slug);
11
+ case 'PRODUCT':
12
+ return getProductProps.getProductProps(fetcher)(slug);
13
+ default:
14
+ return getStaticPageProps.getStaticPageProps(fetcher, shopifyFetcher)(slug);
15
+ }
16
+ };
17
+
18
+ exports.getPreviewProps = getPreviewProps;
@@ -0,0 +1,71 @@
1
+ 'use strict';
2
+
3
+ var core = require('@gem-sdk/core');
4
+ var genCss = require('../helpers/gen-css.js');
5
+ var normalize = require('../helpers/normalize.js');
6
+ var parseJson = require('../helpers/parse-json.js');
7
+
8
+ const getProductProps = (fetcher) => async (handle) => {
9
+ const pageType = 'PRODUCT';
10
+ const variables = {
11
+ slug: handle,
12
+ slugType: pageType,
13
+ };
14
+ const [product, theme] = await Promise.all([
15
+ core.getProductBySlug(fetcher, handle),
16
+ fetcher([
17
+ core.PublishedThemePagesDocument,
18
+ variables,
19
+ ]),
20
+ ]);
21
+ const dataBuilder = theme.publishedThemePages?.[0];
22
+ if (!product || !dataBuilder) {
23
+ throw new Error('Product not found');
24
+ }
25
+ const productTemplate = normalize.parseBuilderTemplate(dataBuilder);
26
+ const queries = core.prefetchQueries(productTemplate);
27
+ const datas = await Promise.allSettled(queries.map(({ query, variables, func }) => {
28
+ if (func) {
29
+ return func(fetcher, variables);
30
+ }
31
+ if (query)
32
+ return fetcher([query, variables]);
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 parseJson.serializableJson({
46
+ builderData: productTemplate,
47
+ themeStyle: genCss.genCSS(dataBuilder.pageStyle?.data),
48
+ pageType,
49
+ swr: { fallback },
50
+ seo: {
51
+ title: product.title,
52
+ description: product.description,
53
+ openGraph: {
54
+ images: product.featuredImage?.src
55
+ ? [
56
+ {
57
+ url: product.featuredImage.src,
58
+ alt: product.featuredImage?.alt,
59
+ height: product.featuredImage?.height,
60
+ width: product.featuredImage?.width,
61
+ type: product.featuredImage?.contentType,
62
+ },
63
+ ]
64
+ : [],
65
+ },
66
+ },
67
+ product,
68
+ });
69
+ };
70
+
71
+ exports.getProductProps = getProductProps;
@@ -0,0 +1,133 @@
1
+ 'use strict';
2
+
3
+ var core = require('@gem-sdk/core');
4
+ var adapterShopify = require('@gem-sdk/adapter-shopify');
5
+ var nextjs = require('@sentry/nextjs');
6
+ var googleFonts = require('../google-fonts.js');
7
+ var genCss = require('../helpers/gen-css.js');
8
+ var generateManifres = require('../helpers/generate-manifres.js');
9
+ var getFallback = require('../helpers/get-fallback.js');
10
+ var normalize = require('../helpers/normalize.js');
11
+ var parseJson = require('../helpers/parse-json.js');
12
+
13
+ const getStaticPagePropsPreview = (fetcher, shopifyFetcher) => async (slug) => {
14
+ try {
15
+ const pageType = 'STATIC';
16
+ const variables = {
17
+ handleURL: slug,
18
+ pageType,
19
+ };
20
+ const [theme, storeProperty, shopifyMeta] = await Promise.allSettled([
21
+ fetcher([
22
+ core.PreviewPageDocument,
23
+ variables,
24
+ 'previewPage',
25
+ ]),
26
+ fetcher([core.StorePropertyDocument]),
27
+ shopifyFetcher([adapterShopify.ShopMetaDocument]),
28
+ ]);
29
+ if (theme.status === 'rejected') {
30
+ throw new Error(theme.reason?.[0]);
31
+ }
32
+ const dataBuilder = theme.value.previewPage;
33
+ if (!dataBuilder) {
34
+ throw new Error(`No data builder found for slug: /preview/${slug}`);
35
+ }
36
+ const pageTemplate = normalize.parseBuilderTemplateV2(dataBuilder);
37
+ const [fontStyle, fallback] = await Promise.all([
38
+ googleFonts.getFontFromGlobalStyle(dataBuilder?.pageStyle?.data),
39
+ getFallback.getFallbackV2(fetcher, pageTemplate),
40
+ ]);
41
+ const mobileOnly = dataBuilder.isMobile ?? false;
42
+ const description = dataBuilder?.themePageDataSEO?.find((item) => item?.key === 'global-meta-description')?.value;
43
+ const thumbnail = parseJson.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,
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 ? [thumbnail] : [],
57
+ },
58
+ nofollow: true,
59
+ noindex: true,
60
+ canonical: `/preview/${slug}`,
61
+ additionalMetaTags: [
62
+ {
63
+ name: 'theme-color',
64
+ content: '#000000',
65
+ },
66
+ ],
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: generateManifres.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
+ return parseJson.serializableJson({
112
+ themeStyle: genCss.genCSS(dataBuilder?.pageStyle?.data, mobileOnly),
113
+ fontStyle,
114
+ builderData: pageTemplate,
115
+ pageType,
116
+ currency: shopMeta?.localization.country.currency.isoCode ?? null,
117
+ locale: shopMeta?.localization.country.isoCode ?? null,
118
+ swr: { fallback },
119
+ swatches: parseJson.parseJson(shopData?.storeProperty?.swatchesConfig),
120
+ seo,
121
+ mobileOnly,
122
+ gaTrackingId: dataBuilder.themePageAnalytic?.gaTrackingID ?? null,
123
+ facebookPixelId: dataBuilder.themePageAnalytic?.fbPixelID ?? null,
124
+ tiktokPixelId: dataBuilder.themePageAnalytic?.tiktokPixelID ?? null,
125
+ });
126
+ }
127
+ catch (err) {
128
+ nextjs.captureException(err);
129
+ throw err;
130
+ }
131
+ };
132
+
133
+ exports.getStaticPagePropsPreview = getStaticPagePropsPreview;
@@ -0,0 +1,130 @@
1
+ 'use strict';
2
+
3
+ var core = require('@gem-sdk/core');
4
+ var adapterShopify = require('@gem-sdk/adapter-shopify');
5
+ var googleFonts = require('../google-fonts.js');
6
+ var genCss = require('../helpers/gen-css.js');
7
+ var generateManifres = require('../helpers/generate-manifres.js');
8
+ var getFallback = require('../helpers/get-fallback.js');
9
+ var normalize = require('../helpers/normalize.js');
10
+ var parseJson = require('../helpers/parse-json.js');
11
+ var nextjs = require('@sentry/nextjs');
12
+
13
+ const getStaticPagePropsV2 = (fetcher, shopifyFetcher) => async (slug) => {
14
+ try {
15
+ const pageType = 'STATIC';
16
+ const variables = {
17
+ slug,
18
+ slugType: pageType,
19
+ };
20
+ const [theme, storeProperty, shopifyMeta] = await Promise.allSettled([
21
+ fetcher([
22
+ core.PublishedThemePagesDocument,
23
+ variables,
24
+ ]),
25
+ fetcher([core.StorePropertyDocument]),
26
+ shopifyFetcher([adapterShopify.ShopMetaDocument]),
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 slug: /${slug}`);
34
+ }
35
+ const pageTemplate = normalize.parseBuilderTemplateV2(dataBuilder);
36
+ const [fontStyle, fallback] = await Promise.all([
37
+ googleFonts.getFontFromGlobalStyle(dataBuilder?.pageStyle?.data),
38
+ getFallback.getFallbackV2(fetcher, pageTemplate),
39
+ ]);
40
+ const mobileOnly = dataBuilder.isMobile ?? false;
41
+ const description = dataBuilder?.themePageDataSEO?.find((item) => item?.key === 'global-meta-description')?.value;
42
+ const thumbnail = parseJson.parseJson(dataBuilder?.themePageDataSEO?.find((item) => item?.key === 'global-meta-thumbnail')?.value);
43
+ const shopMeta = shopifyMeta.status === 'fulfilled' ? shopifyMeta.value : undefined;
44
+ const shopData = storeProperty.status === 'fulfilled' ? storeProperty.value : undefined;
45
+ const favicon = shopData?.storeProperty?.favicon ?? '/favicon/favicon-32x32.png';
46
+ const seo = {
47
+ defaultTitle: shopMeta?.shop.name,
48
+ title: dataBuilder?.name,
49
+ description: description ?? shopMeta?.shop.description,
50
+ openGraph: {
51
+ site_name: shopMeta?.shop.name,
52
+ locale: shopMeta?.localization.country.isoCode,
53
+ title: dataBuilder?.name ?? shopMeta?.shop.name,
54
+ description: description ?? shopMeta?.shop.description,
55
+ images: thumbnail ? [thumbnail] : [],
56
+ },
57
+ canonical: `/${slug}`,
58
+ additionalMetaTags: [
59
+ {
60
+ name: 'theme-color',
61
+ content: '#000000',
62
+ },
63
+ ],
64
+ additionalLinkTags: [
65
+ {
66
+ rel: 'icon',
67
+ sizes: '32x32',
68
+ href: `${favicon}-/crop/1:1/center/-/smart_resize/32x32/`,
69
+ },
70
+ {
71
+ rel: 'icon',
72
+ sizes: '16x16',
73
+ href: `${favicon}-/crop/1:1/center/-/smart_resize/16x16/`,
74
+ },
75
+ {
76
+ rel: 'apple-touch-icon',
77
+ sizes: '180x180',
78
+ href: `${favicon}-/crop/1:1/center/-/smart_resize/180x180/`,
79
+ },
80
+ {
81
+ rel: 'manifest',
82
+ href: generateManifres.generateManifest({
83
+ theme_color: '#000000',
84
+ background_color: '#ffffff',
85
+ display: 'standalone',
86
+ scope: '/',
87
+ start_url: '/',
88
+ name: shopMeta?.shop.name,
89
+ short_name: shopMeta?.shop.name,
90
+ description: shopMeta?.shop.description,
91
+ icons: [
92
+ {
93
+ src: `${favicon}-/crop/1:1/center/-/smart_resize/192x192/`,
94
+ sizes: '192x192',
95
+ type: 'image/png',
96
+ purpose: 'any maskable',
97
+ },
98
+ {
99
+ src: `${favicon}-/crop/1:1/center/-/smart_resize/512x512/`,
100
+ sizes: '512x512',
101
+ type: 'image/png',
102
+ },
103
+ ],
104
+ }),
105
+ },
106
+ ],
107
+ };
108
+ return parseJson.serializableJson({
109
+ themeStyle: genCss.genCSS(dataBuilder?.pageStyle?.data, mobileOnly),
110
+ fontStyle,
111
+ builderData: pageTemplate,
112
+ pageType,
113
+ currency: shopMeta?.localization.country.currency.isoCode ?? null,
114
+ locale: shopMeta?.localization.country.isoCode ?? null,
115
+ swr: { fallback },
116
+ swatches: parseJson.parseJson(shopData?.storeProperty?.swatchesConfig),
117
+ seo,
118
+ mobileOnly,
119
+ gaTrackingId: dataBuilder.themePageAnalytic?.gaTrackingID ?? null,
120
+ facebookPixelId: dataBuilder.themePageAnalytic?.fbPixelID ?? null,
121
+ tiktokPixelId: dataBuilder.themePageAnalytic?.tiktokPixelID ?? null,
122
+ });
123
+ }
124
+ catch (err) {
125
+ nextjs.captureException(err);
126
+ throw err;
127
+ }
128
+ };
129
+
130
+ exports.getStaticPagePropsV2 = getStaticPagePropsV2;
@@ -0,0 +1,132 @@
1
+ 'use strict';
2
+
3
+ var core = require('@gem-sdk/core');
4
+ var adapterShopify = require('@gem-sdk/adapter-shopify');
5
+ var googleFonts = require('../google-fonts.js');
6
+ var genCss = require('../helpers/gen-css.js');
7
+ var generateManifres = require('../helpers/generate-manifres.js');
8
+ var normalize = require('../helpers/normalize.js');
9
+ var parseJson = require('../helpers/parse-json.js');
10
+
11
+ const getStaticPageProps = (fetcher, shopifyFetcher) => async (slug) => {
12
+ const pageType = 'STATIC';
13
+ const variables = {
14
+ slug,
15
+ slugType: pageType,
16
+ };
17
+ const [theme, storeProperty, shopifyMeta] = await Promise.allSettled([
18
+ fetcher([
19
+ core.PublishedThemePagesDocument,
20
+ variables,
21
+ ]),
22
+ fetcher([core.StorePropertyDocument]),
23
+ shopifyFetcher([adapterShopify.ShopMetaDocument]),
24
+ ]);
25
+ if (theme.status === 'rejected') {
26
+ return {
27
+ pageType,
28
+ };
29
+ }
30
+ const dataBuilder = theme.value.publishedThemePages?.[0];
31
+ const pageTemplate = normalize.parseBuilderTemplate(dataBuilder);
32
+ const fontStyle = await googleFonts.getFontFromGlobalStyle(dataBuilder?.pageStyle?.data);
33
+ const queries = core.prefetchQueries(pageTemplate);
34
+ const datas = await Promise.allSettled(queries.map(({ query, variables, func }) => {
35
+ if (func) {
36
+ return func(fetcher, variables);
37
+ }
38
+ if (query)
39
+ return fetcher([query, variables]);
40
+ return {};
41
+ }));
42
+ const fallback = queries.reduce((acc, { key }, index) => {
43
+ const res = datas[index];
44
+ if (res?.status === 'fulfilled') {
45
+ return {
46
+ ...acc,
47
+ [key]: res.value,
48
+ };
49
+ }
50
+ return acc;
51
+ }, {});
52
+ const description = dataBuilder?.themePageDataSEO?.find((item) => item?.key === 'global-meta-description')?.value;
53
+ const thumbnail = parseJson.parseJson(dataBuilder?.themePageDataSEO?.find((item) => item?.key === 'global-meta-thumbnail')?.value);
54
+ const shopMeta = shopifyMeta.status === 'fulfilled' ? shopifyMeta.value : undefined;
55
+ const shopData = storeProperty.status === 'fulfilled' ? storeProperty.value : undefined;
56
+ const favicon = shopData?.storeProperty?.favicon ?? '/favicon/favicon-32x32.png';
57
+ const seo = {
58
+ defaultTitle: shopMeta?.shop.name ?? '',
59
+ title: dataBuilder?.name ?? '',
60
+ description: description ?? shopMeta?.shop.description ?? '',
61
+ openGraph: {
62
+ site_name: shopMeta?.shop.name ?? '',
63
+ locale: shopMeta?.localization.country.isoCode ?? '',
64
+ title: dataBuilder?.name ?? shopMeta?.shop.name ?? '',
65
+ description: description ?? shopMeta?.shop.description ?? '',
66
+ images: thumbnail ? [thumbnail] : [],
67
+ },
68
+ additionalMetaTags: [
69
+ {
70
+ name: 'theme-color',
71
+ content: '#000000',
72
+ },
73
+ ],
74
+ canonical: `/${slug}`,
75
+ additionalLinkTags: [
76
+ {
77
+ rel: 'icon',
78
+ sizes: '32x32',
79
+ href: `${favicon}-/crop/1:1/center/-/smart_resize/32x32/`,
80
+ },
81
+ {
82
+ rel: 'icon',
83
+ sizes: '16x16',
84
+ href: `${favicon}-/crop/1:1/center/-/smart_resize/16x16/`,
85
+ },
86
+ {
87
+ rel: 'apple-touch-icon',
88
+ sizes: '180x180',
89
+ href: `${favicon}-/crop/1:1/center/-/smart_resize/180x180/`,
90
+ },
91
+ {
92
+ rel: 'manifest',
93
+ href: generateManifres.generateManifest({
94
+ theme_color: '#000000',
95
+ background_color: '#ffffff',
96
+ display: 'standalone',
97
+ scope: '/',
98
+ start_url: '/',
99
+ name: shopMeta?.shop.name,
100
+ short_name: shopMeta?.shop.name,
101
+ description: shopMeta?.shop.description,
102
+ icons: [
103
+ {
104
+ src: `${favicon}-/crop/1:1/center/-/smart_resize/192x192/`,
105
+ sizes: '192x192',
106
+ type: 'image/png',
107
+ purpose: 'any maskable',
108
+ },
109
+ {
110
+ src: `${favicon}-/crop/1:1/center/-/smart_resize/512x512/`,
111
+ sizes: '512x512',
112
+ type: 'image/png',
113
+ },
114
+ ],
115
+ }),
116
+ },
117
+ ],
118
+ };
119
+ return parseJson.serializableJson({
120
+ themeStyle: genCss.genCSS(dataBuilder?.pageStyle?.data),
121
+ fontStyle,
122
+ builderData: pageTemplate,
123
+ pageType,
124
+ currency: shopMeta?.localization.country.currency.isoCode ?? null,
125
+ locale: shopMeta?.localization.country.isoCode ?? null,
126
+ swr: { fallback },
127
+ swatches: parseJson.parseJson(shopData?.storeProperty?.swatchesConfig),
128
+ seo,
129
+ });
130
+ };
131
+
132
+ exports.getStaticPageProps = getStaticPageProps;