@gem-sdk/pages 1.5.7 → 1.5.23

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 (79) hide show
  1. package/dist/cjs/components/ErrorBoundary.js +32 -24
  2. package/dist/cjs/components/ErrorFallback.js +19 -2
  3. package/dist/cjs/components/FacebookPixel.js +25 -20
  4. package/dist/cjs/components/Footer.js +462 -0
  5. package/dist/cjs/components/GoogleAnalytic.js +49 -23
  6. package/dist/cjs/components/Header.js +211 -0
  7. package/dist/cjs/components/TikTokPixel.js +9 -6
  8. package/dist/cjs/components/builder/Toolbox.js +215 -188
  9. package/dist/cjs/layouts/main.js +19 -5
  10. package/dist/cjs/libs/api/get-builder-props.js +26 -24
  11. package/dist/cjs/libs/api/get-collection-props.js +59 -55
  12. package/dist/cjs/libs/api/get-home-page-props-v2.js +121 -114
  13. package/dist/cjs/libs/api/get-home-page-props.js +133 -123
  14. package/dist/cjs/libs/api/get-preview-props.js +10 -10
  15. package/dist/cjs/libs/api/get-product-props.js +64 -62
  16. package/dist/cjs/libs/api/get-static-page-props-preview.js +128 -121
  17. package/dist/cjs/libs/api/get-static-page-props-v2.js +126 -119
  18. package/dist/cjs/libs/api/get-static-page-props.js +130 -120
  19. package/dist/cjs/libs/fetcher.js +59 -63
  20. package/dist/cjs/libs/get-layout.js +5 -2
  21. package/dist/cjs/libs/get-storefront-api.js +7 -7
  22. package/dist/cjs/libs/getStaticPaths.js +5 -5
  23. package/dist/cjs/libs/google-fonts.js +54 -61
  24. package/dist/cjs/libs/helpers/gen-css.js +103 -94
  25. package/dist/cjs/libs/helpers/generate-manifres.js +1 -1
  26. package/dist/cjs/libs/helpers/get-fallback.js +24 -22
  27. package/dist/cjs/libs/helpers/normalize.js +82 -80
  28. package/dist/cjs/libs/helpers/parse-json.js +10 -12
  29. package/dist/cjs/libs/helpers/user-agent.js +2 -2
  30. package/dist/cjs/libs/hooks/use-tracking-view.js +36 -31
  31. package/dist/cjs/libs/parse-html.js +33 -26
  32. package/dist/cjs/pages/404.js +34 -2
  33. package/dist/cjs/pages/500.js +63 -8
  34. package/dist/cjs/pages/builder.js +69 -14
  35. package/dist/cjs/pages/collection-detail.js +48 -7
  36. package/dist/cjs/pages/preview.js +18 -12
  37. package/dist/cjs/pages/product-detail.js +53 -7
  38. package/dist/cjs/pages/static-v2.js +62 -7
  39. package/dist/cjs/pages/static.js +60 -6
  40. package/dist/esm/components/ErrorBoundary.js +32 -24
  41. package/dist/esm/components/ErrorFallback.js +19 -2
  42. package/dist/esm/components/FacebookPixel.js +25 -20
  43. package/dist/esm/components/Footer.js +458 -0
  44. package/dist/esm/components/GoogleAnalytic.js +49 -23
  45. package/dist/esm/components/Header.js +207 -0
  46. package/dist/esm/components/TikTokPixel.js +9 -6
  47. package/dist/esm/components/builder/Toolbox.js +217 -190
  48. package/dist/esm/layouts/main.js +19 -5
  49. package/dist/esm/libs/api/get-builder-props.js +26 -24
  50. package/dist/esm/libs/api/get-collection-props.js +59 -55
  51. package/dist/esm/libs/api/get-home-page-props-v2.js +121 -114
  52. package/dist/esm/libs/api/get-home-page-props.js +133 -123
  53. package/dist/esm/libs/api/get-preview-props.js +10 -10
  54. package/dist/esm/libs/api/get-product-props.js +64 -62
  55. package/dist/esm/libs/api/get-static-page-props-preview.js +128 -121
  56. package/dist/esm/libs/api/get-static-page-props-v2.js +126 -119
  57. package/dist/esm/libs/api/get-static-page-props.js +130 -120
  58. package/dist/esm/libs/fetcher.js +59 -63
  59. package/dist/esm/libs/get-layout.js +5 -2
  60. package/dist/esm/libs/get-storefront-api.js +7 -7
  61. package/dist/esm/libs/getStaticPaths.js +5 -5
  62. package/dist/esm/libs/google-fonts.js +54 -61
  63. package/dist/esm/libs/helpers/gen-css.js +103 -94
  64. package/dist/esm/libs/helpers/generate-manifres.js +1 -1
  65. package/dist/esm/libs/helpers/get-fallback.js +24 -22
  66. package/dist/esm/libs/helpers/normalize.js +82 -80
  67. package/dist/esm/libs/helpers/parse-json.js +10 -12
  68. package/dist/esm/libs/helpers/user-agent.js +2 -2
  69. package/dist/esm/libs/hooks/use-tracking-view.js +36 -31
  70. package/dist/esm/libs/parse-html.js +33 -26
  71. package/dist/esm/pages/404.js +34 -2
  72. package/dist/esm/pages/500.js +63 -8
  73. package/dist/esm/pages/builder.js +69 -14
  74. package/dist/esm/pages/collection-detail.js +48 -7
  75. package/dist/esm/pages/preview.js +18 -12
  76. package/dist/esm/pages/product-detail.js +53 -7
  77. package/dist/esm/pages/static-v2.js +62 -7
  78. package/dist/esm/pages/static.js +60 -6
  79. package/package.json +3 -3
@@ -8,124 +8,131 @@ import { parseBuilderTemplateV2 } from '../helpers/normalize.js';
8
8
  import { parseJson, serializableJson } from '../helpers/parse-json.js';
9
9
  import { captureException } from '@sentry/nextjs';
10
10
 
11
- const getStaticPagePropsV2 = (fetcher, shopifyFetcher) => async (slug) => {
12
- try {
13
- const pageType = 'STATIC';
14
- const variables = {
15
- slug,
16
- slugType: pageType,
17
- };
18
- const [theme, storeProperty, shopifyMeta] = await Promise.allSettled([
19
- fetcher([
20
- PublishedThemePagesDocument,
21
- variables,
22
- ]),
23
- fetcher([StorePropertyDocument]),
24
- shopifyFetcher([ShopMetaDocument]),
25
- ]);
26
- if (theme.status === 'rejected') {
27
- throw new Error(theme.reason?.[0]);
28
- }
29
- const dataBuilder = theme.value.publishedThemePages?.[0];
30
- if (!dataBuilder) {
31
- throw new Error(`No data builder found for slug: /${slug}`);
32
- }
33
- const pageTemplate = parseBuilderTemplateV2(dataBuilder);
34
- const [fontStyle, fallback] = await Promise.all([
35
- getFontFromGlobalStyle(dataBuilder?.pageStyle?.data),
36
- getFallbackV2(fetcher, pageTemplate),
37
- ]);
38
- const mobileOnly = dataBuilder.isMobile ?? false;
39
- const description = dataBuilder?.themePageDataSEO?.find((item) => item?.key === 'global-meta-description')?.value;
40
- const thumbnail = parseJson(dataBuilder?.themePageDataSEO?.find((item) => item?.key === 'global-meta-thumbnail')?.value);
41
- const shopMeta = shopifyMeta.status === 'fulfilled' ? shopifyMeta.value : undefined;
42
- const shopData = storeProperty.status === 'fulfilled' ? storeProperty.value : undefined;
43
- const favicon = shopData?.storeProperty?.favicon ?? '/favicon/favicon-32x32.png';
44
- const seo = {
45
- defaultTitle: shopMeta?.shop.name,
46
- title: dataBuilder?.name,
47
- description: description ?? shopMeta?.shop.description,
48
- openGraph: {
49
- site_name: shopMeta?.shop.name,
50
- locale: shopMeta?.localization.country.isoCode,
51
- title: dataBuilder?.name ?? shopMeta?.shop.name,
52
- description: description ?? shopMeta?.shop.description,
53
- images: thumbnail ? [thumbnail] : [],
54
- },
55
- canonical: `https://${shopData?.storeProperty?.primaryDomain}/${slug}`,
56
- additionalMetaTags: [
57
- {
58
- name: 'theme-color',
59
- content: '#000000',
60
- },
61
- ],
62
- additionalLinkTags: [
63
- {
64
- rel: 'icon',
65
- sizes: '32x32',
66
- href: `${favicon}-/crop/1:1/center/-/smart_resize/32x32/`,
67
- },
68
- {
69
- rel: 'icon',
70
- sizes: '16x16',
71
- href: `${favicon}-/crop/1:1/center/-/smart_resize/16x16/`,
72
- },
73
- {
74
- rel: 'apple-touch-icon',
75
- sizes: '180x180',
76
- href: `${favicon}-/crop/1:1/center/-/smart_resize/180x180/`,
77
- },
78
- {
79
- rel: 'manifest',
80
- href: generateManifest({
81
- theme_color: '#000000',
82
- background_color: '#ffffff',
83
- display: 'standalone',
84
- scope: '/',
85
- start_url: '/',
86
- name: shopMeta?.shop.name,
87
- short_name: shopMeta?.shop.name,
88
- description: shopMeta?.shop.description,
89
- icons: [
90
- {
91
- src: `${favicon}-/crop/1:1/center/-/smart_resize/192x192/`,
92
- sizes: '192x192',
93
- type: 'image/png',
94
- purpose: 'any maskable',
95
- },
96
- {
97
- src: `${favicon}-/crop/1:1/center/-/smart_resize/512x512/`,
98
- sizes: '512x512',
99
- type: 'image/png',
100
- },
101
- ],
102
- }),
103
- },
104
- ],
105
- };
106
- return serializableJson({
107
- themeStyle: genCSS(dataBuilder?.pageStyle?.data, mobileOnly),
108
- fontStyle,
109
- builderData: pageTemplate,
110
- pageType,
111
- currency: shopMeta?.localization.country.currency.isoCode ?? null,
112
- locale: shopMeta?.localization.country.isoCode ?? null,
113
- swr: { fallback },
114
- swatches: parseJson(shopData?.storeProperty?.swatchesConfig),
115
- seo,
116
- mobileOnly,
117
- gaTrackingId: dataBuilder.themePageAnalytic?.gaTrackingID ?? null,
118
- facebookPixelId: dataBuilder.themePageAnalytic?.fbPixelID ?? null,
119
- tiktokPixelId: dataBuilder.themePageAnalytic?.tiktokPixelID ?? null,
120
- customCodeHeader: dataBuilder.themePageCustomCode?.header ?? null,
121
- customCodeBody: dataBuilder.themePageCustomCode?.body ?? null,
122
- pageHandle: dataBuilder.handle ?? null,
123
- });
124
- }
125
- catch (err) {
126
- captureException(err);
127
- throw err;
128
- }
129
- };
11
+ const getStaticPagePropsV2 = (fetcher, shopifyFetcher)=>async (slug)=>{
12
+ try {
13
+ const pageType = 'STATIC';
14
+ const variables = {
15
+ slug,
16
+ slugType: pageType
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
+ throw new Error(theme.reason?.[0]);
32
+ }
33
+ const dataBuilder = theme.value.publishedThemePages?.[0];
34
+ if (!dataBuilder) {
35
+ throw new Error(`No data builder found for slug: /${slug}`);
36
+ }
37
+ const pageTemplate = parseBuilderTemplateV2(dataBuilder);
38
+ const [fontStyle, fallback] = await Promise.all([
39
+ getFontFromGlobalStyle(dataBuilder?.pageStyle?.data),
40
+ getFallbackV2(fetcher, pageTemplate)
41
+ ]);
42
+ const mobileOnly = dataBuilder.isMobile ?? false;
43
+ const description = dataBuilder?.themePageDataSEO?.find((item)=>item?.key === 'global-meta-description')?.value;
44
+ const thumbnail = parseJson(dataBuilder?.themePageDataSEO?.find((item)=>item?.key === 'global-meta-thumbnail')?.value);
45
+ const shopMeta = shopifyMeta.status === 'fulfilled' ? shopifyMeta.value : undefined;
46
+ const shopData = storeProperty.status === 'fulfilled' ? storeProperty.value : undefined;
47
+ const favicon = shopData?.storeProperty?.favicon ?? '/favicon/favicon-32x32.png';
48
+ const seo = {
49
+ defaultTitle: shopMeta?.shop.name,
50
+ title: dataBuilder?.name,
51
+ description: description ?? shopMeta?.shop.description,
52
+ openGraph: {
53
+ site_name: shopMeta?.shop.name,
54
+ locale: shopMeta?.localization.country.isoCode,
55
+ title: dataBuilder?.name ?? shopMeta?.shop.name,
56
+ description: description ?? shopMeta?.shop.description,
57
+ images: thumbnail ? [
58
+ thumbnail
59
+ ] : []
60
+ },
61
+ canonical: `https://${shopData?.storeProperty?.primaryDomain}/${slug}`,
62
+ additionalMetaTags: [
63
+ {
64
+ name: 'theme-color',
65
+ content: '#000000'
66
+ }
67
+ ],
68
+ additionalLinkTags: [
69
+ {
70
+ rel: 'icon',
71
+ sizes: '32x32',
72
+ href: `${favicon}-/crop/1:1/center/-/smart_resize/32x32/`
73
+ },
74
+ {
75
+ rel: 'icon',
76
+ sizes: '16x16',
77
+ href: `${favicon}-/crop/1:1/center/-/smart_resize/16x16/`
78
+ },
79
+ {
80
+ rel: 'apple-touch-icon',
81
+ sizes: '180x180',
82
+ href: `${favicon}-/crop/1:1/center/-/smart_resize/180x180/`
83
+ },
84
+ {
85
+ rel: 'manifest',
86
+ href: generateManifest({
87
+ theme_color: '#000000',
88
+ background_color: '#ffffff',
89
+ display: 'standalone',
90
+ scope: '/',
91
+ start_url: '/',
92
+ name: shopMeta?.shop.name,
93
+ short_name: shopMeta?.shop.name,
94
+ description: shopMeta?.shop.description,
95
+ icons: [
96
+ {
97
+ src: `${favicon}-/crop/1:1/center/-/smart_resize/192x192/`,
98
+ sizes: '192x192',
99
+ type: 'image/png',
100
+ purpose: 'any maskable'
101
+ },
102
+ {
103
+ src: `${favicon}-/crop/1:1/center/-/smart_resize/512x512/`,
104
+ sizes: '512x512',
105
+ type: 'image/png'
106
+ }
107
+ ]
108
+ })
109
+ }
110
+ ]
111
+ };
112
+ return serializableJson({
113
+ themeStyle: genCSS(dataBuilder?.pageStyle?.data, mobileOnly),
114
+ fontStyle,
115
+ builderData: pageTemplate,
116
+ pageType,
117
+ currency: shopMeta?.localization.country.currency.isoCode ?? null,
118
+ locale: shopMeta?.localization.country.isoCode ?? null,
119
+ swr: {
120
+ fallback
121
+ },
122
+ swatches: parseJson(shopData?.storeProperty?.swatchesConfig),
123
+ seo,
124
+ mobileOnly,
125
+ gaTrackingId: dataBuilder.themePageAnalytic?.gaTrackingID ?? null,
126
+ facebookPixelId: dataBuilder.themePageAnalytic?.fbPixelID ?? null,
127
+ tiktokPixelId: dataBuilder.themePageAnalytic?.tiktokPixelID ?? null,
128
+ customCodeHeader: dataBuilder.themePageCustomCode?.header ?? null,
129
+ customCodeBody: dataBuilder.themePageCustomCode?.body ?? null,
130
+ pageHandle: dataBuilder.handle ?? null
131
+ });
132
+ } catch (err) {
133
+ captureException(err);
134
+ throw err;
135
+ }
136
+ };
130
137
 
131
138
  export { getStaticPagePropsV2 };
@@ -6,125 +6,135 @@ import { generateManifest } from '../helpers/generate-manifres.js';
6
6
  import { parseBuilderTemplate } from '../helpers/normalize.js';
7
7
  import { parseJson, serializableJson } from '../helpers/parse-json.js';
8
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([StorePropertyDocument]),
21
- shopifyFetcher([ShopMetaDocument]),
22
- ]);
23
- if (theme.status === 'rejected') {
24
- return {
25
- pageType,
26
- };
27
- }
28
- const dataBuilder = theme.value.publishedThemePages?.[0];
29
- const pageTemplate = parseBuilderTemplate(dataBuilder);
30
- const fontStyle = await getFontFromGlobalStyle(dataBuilder?.pageStyle?.data);
31
- const queries = prefetchQueries(pageTemplate);
32
- const datas = await Promise.allSettled(queries.map(({ query, variables, func }) => {
33
- if (func) {
34
- return func(fetcher, variables);
35
- }
36
- if (query)
37
- return fetcher([query, variables]);
38
- return {};
39
- }));
40
- const fallback = queries.reduce((acc, { key }, index) => {
41
- const res = datas[index];
42
- if (res?.status === 'fulfilled') {
43
- return {
44
- ...acc,
45
- [key]: res.value,
46
- };
47
- }
48
- return acc;
49
- }, {});
50
- const description = dataBuilder?.themePageDataSEO?.find((item) => item?.key === 'global-meta-description')?.value;
51
- const thumbnail = parseJson(dataBuilder?.themePageDataSEO?.find((item) => item?.key === 'global-meta-thumbnail')?.value);
52
- const shopMeta = shopifyMeta.status === 'fulfilled' ? shopifyMeta.value : undefined;
53
- const shopData = storeProperty.status === 'fulfilled' ? storeProperty.value : undefined;
54
- const favicon = shopData?.storeProperty?.favicon ?? '/favicon/favicon-32x32.png';
55
- const seo = {
56
- defaultTitle: shopMeta?.shop.name ?? '',
57
- title: dataBuilder?.name ?? '',
58
- description: description ?? shopMeta?.shop.description ?? '',
59
- openGraph: {
60
- site_name: shopMeta?.shop.name ?? '',
61
- locale: shopMeta?.localization.country.isoCode ?? '',
62
- title: dataBuilder?.name ?? shopMeta?.shop.name ?? '',
63
- description: description ?? shopMeta?.shop.description ?? '',
64
- images: thumbnail ? [thumbnail] : [],
65
- },
66
- additionalMetaTags: [
67
- {
68
- name: 'theme-color',
69
- content: '#000000',
70
- },
71
- ],
72
- canonical: `/${slug}`,
73
- additionalLinkTags: [
74
- {
75
- rel: 'icon',
76
- sizes: '32x32',
77
- href: `${favicon}-/crop/1:1/center/-/smart_resize/32x32/`,
78
- },
79
- {
80
- rel: 'icon',
81
- sizes: '16x16',
82
- href: `${favicon}-/crop/1:1/center/-/smart_resize/16x16/`,
83
- },
84
- {
85
- rel: 'apple-touch-icon',
86
- sizes: '180x180',
87
- href: `${favicon}-/crop/1:1/center/-/smart_resize/180x180/`,
88
- },
89
- {
90
- rel: 'manifest',
91
- href: generateManifest({
92
- theme_color: '#000000',
93
- background_color: '#ffffff',
94
- display: 'standalone',
95
- scope: '/',
96
- start_url: '/',
97
- name: shopMeta?.shop.name,
98
- short_name: shopMeta?.shop.name,
99
- description: shopMeta?.shop.description,
100
- icons: [
101
- {
102
- src: `${favicon}-/crop/1:1/center/-/smart_resize/192x192/`,
103
- sizes: '192x192',
104
- type: 'image/png',
105
- purpose: 'any maskable',
106
- },
107
- {
108
- src: `${favicon}-/crop/1:1/center/-/smart_resize/512x512/`,
109
- sizes: '512x512',
110
- type: 'image/png',
111
- },
112
- ],
113
- }),
114
- },
115
- ],
116
- };
117
- return serializableJson({
118
- themeStyle: genCSS(dataBuilder?.pageStyle?.data),
119
- fontStyle,
120
- builderData: pageTemplate,
121
- pageType,
122
- currency: shopMeta?.localization.country.currency.isoCode ?? null,
123
- locale: shopMeta?.localization.country.isoCode ?? null,
124
- swr: { fallback },
125
- swatches: parseJson(shopData?.storeProperty?.swatchesConfig),
126
- seo,
127
- });
128
- };
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
+ return serializableJson({
126
+ themeStyle: genCSS(dataBuilder?.pageStyle?.data),
127
+ fontStyle,
128
+ builderData: pageTemplate,
129
+ pageType,
130
+ currency: shopMeta?.localization.country.currency.isoCode ?? null,
131
+ locale: shopMeta?.localization.country.isoCode ?? null,
132
+ swr: {
133
+ fallback
134
+ },
135
+ swatches: parseJson(shopData?.storeProperty?.swatchesConfig),
136
+ seo
137
+ });
138
+ };
129
139
 
130
140
  export { getStaticPageProps };
@@ -1,68 +1,64 @@
1
1
  import { getStorefrontApi } from './get-storefront-api.js';
2
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
- })
26
- .then((res) => res.json())
27
- .then((res) => {
28
- if (res.errors) {
29
- return Promise.reject(res.errors);
30
- }
31
- return res.data;
32
- });
33
- };
34
- };
35
- const createShopifyFetcher = (storefrontToken, handle) => {
36
- const token = storefrontToken ?? process.env.NEXT_PUBLIC_STOREFRONT_TOKEN;
37
- const storefrontHandle = handle ?? process.env.NEXT_PUBLIC_STOREFRONT_HANDLE;
38
- return async (args) => {
39
- if (!token) {
40
- throw new Error('NEXT_PUBLIC_STOREFRONT_TOKEN is not defined');
41
- }
42
- if (!storefrontHandle) {
43
- throw new Error('NEXT_PUBLIC_STOREFRONT_HANDLE is not defined');
44
- }
45
- const headers = {
46
- 'Content-Type': 'application/json',
47
- 'X-Shopify-Storefront-Access-Token': token,
48
- };
49
- const [query, variables] = args;
50
- return fetch(getStorefrontApi(storefrontHandle), {
51
- method: 'POST',
52
- headers,
53
- body: JSON.stringify({
54
- query,
55
- variables,
56
- }),
57
- })
58
- .then((res) => res.json())
59
- .then((res) => {
60
- if (res.errors) {
61
- return Promise.reject(res.errors);
62
- }
63
- return res.data;
64
- });
65
- };
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 createShopifyFetcher = (storefrontToken, handle)=>{
34
+ const token = storefrontToken ?? process.env.NEXT_PUBLIC_STOREFRONT_TOKEN;
35
+ const storefrontHandle = handle ?? process.env.NEXT_PUBLIC_STOREFRONT_HANDLE;
36
+ return async (args)=>{
37
+ if (!token) {
38
+ throw new Error('NEXT_PUBLIC_STOREFRONT_TOKEN is not defined');
39
+ }
40
+ if (!storefrontHandle) {
41
+ throw new Error('NEXT_PUBLIC_STOREFRONT_HANDLE is not defined');
42
+ }
43
+ const headers = {
44
+ 'Content-Type': 'application/json',
45
+ 'X-Shopify-Storefront-Access-Token': token
46
+ };
47
+ const [query, variables] = args;
48
+ return fetch(getStorefrontApi(storefrontHandle), {
49
+ method: 'POST',
50
+ headers,
51
+ body: JSON.stringify({
52
+ query,
53
+ variables
54
+ })
55
+ }).then((res)=>res.json()).then((res)=>{
56
+ if (res.errors) {
57
+ return Promise.reject(res.errors);
58
+ }
59
+ return res.data;
60
+ });
61
+ };
66
62
  };
67
63
 
68
64
  export { createFetcher, createShopifyFetcher };