@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
@@ -5,67 +5,69 @@ var genCss = require('../helpers/gen-css.js');
5
5
  var normalize = require('../helpers/normalize.js');
6
6
  var parseJson = require('../helpers/parse-json.js');
7
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
- };
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) return fetcher([
32
+ query,
33
+ variables
34
+ ]);
35
+ return {};
36
+ }));
37
+ const fallback = queries.reduce((acc, { key }, index)=>{
38
+ const res = datas[index];
39
+ if (res?.status === 'fulfilled') {
40
+ return {
41
+ ...acc,
42
+ [key]: res.value
43
+ };
44
+ }
45
+ return acc;
46
+ }, {});
47
+ return parseJson.serializableJson({
48
+ builderData: productTemplate,
49
+ themeStyle: genCss.genCSS(dataBuilder.pageStyle?.data),
50
+ pageType,
51
+ swr: {
52
+ fallback
53
+ },
54
+ seo: {
55
+ title: product.title,
56
+ description: product.description,
57
+ openGraph: {
58
+ images: product.featuredImage?.src ? [
59
+ {
60
+ url: product.featuredImage.src,
61
+ alt: product.featuredImage?.alt,
62
+ height: product.featuredImage?.height,
63
+ width: product.featuredImage?.width,
64
+ type: product.featuredImage?.contentType
65
+ }
66
+ ] : []
67
+ }
68
+ },
69
+ product
70
+ });
71
+ };
70
72
 
71
73
  exports.getProductProps = getProductProps;
@@ -10,126 +10,133 @@ var getFallback = require('../helpers/get-fallback.js');
10
10
  var normalize = require('../helpers/normalize.js');
11
11
  var parseJson = require('../helpers/parse-json.js');
12
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
- customCodeHeader: dataBuilder.themePageCustomCode?.header ?? null,
126
- customCodeBody: dataBuilder.themePageCustomCode?.body ?? null,
127
- });
128
- }
129
- catch (err) {
130
- nextjs.captureException(err);
131
- throw err;
132
- }
133
- };
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([
27
+ core.StorePropertyDocument
28
+ ]),
29
+ shopifyFetcher([
30
+ adapterShopify.ShopMetaDocument
31
+ ])
32
+ ]);
33
+ if (theme.status === 'rejected') {
34
+ throw new Error(theme.reason?.[0]);
35
+ }
36
+ const dataBuilder = theme.value.previewPage;
37
+ if (!dataBuilder) {
38
+ throw new Error(`No data builder found for slug: /preview/${slug}`);
39
+ }
40
+ const pageTemplate = normalize.parseBuilderTemplateV2(dataBuilder);
41
+ const [fontStyle, fallback] = await Promise.all([
42
+ googleFonts.getFontFromGlobalStyle(dataBuilder?.pageStyle?.data),
43
+ getFallback.getFallbackV2(fetcher, pageTemplate)
44
+ ]);
45
+ const mobileOnly = dataBuilder.isMobile ?? false;
46
+ const description = dataBuilder?.themePageDataSEO?.find((item)=>item?.key === 'global-meta-description')?.value;
47
+ const thumbnail = parseJson.parseJson(dataBuilder?.themePageDataSEO?.find((item)=>item?.key === 'global-meta-thumbnail')?.value);
48
+ const shopMeta = shopifyMeta.status === 'fulfilled' ? shopifyMeta.value : undefined;
49
+ const shopData = storeProperty.status === 'fulfilled' ? storeProperty.value : undefined;
50
+ const favicon = shopData?.storeProperty?.favicon ?? '/favicon/favicon-32x32.png';
51
+ const seo = {
52
+ defaultTitle: shopMeta?.shop.name,
53
+ title: dataBuilder?.name,
54
+ description: description ?? shopMeta?.shop.description,
55
+ openGraph: {
56
+ site_name: shopMeta?.shop.name,
57
+ locale: shopMeta?.localization.country.isoCode,
58
+ title: dataBuilder?.name ?? shopMeta?.shop.name,
59
+ description: description ?? shopMeta?.shop.description,
60
+ images: thumbnail ? [
61
+ thumbnail
62
+ ] : []
63
+ },
64
+ nofollow: true,
65
+ noindex: true,
66
+ canonical: `/preview/${slug}`,
67
+ additionalMetaTags: [
68
+ {
69
+ name: 'theme-color',
70
+ content: '#000000'
71
+ }
72
+ ],
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: generateManifres.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 parseJson.serializableJson({
118
+ themeStyle: genCss.genCSS(dataBuilder?.pageStyle?.data, mobileOnly),
119
+ fontStyle,
120
+ builderData: pageTemplate,
121
+ pageType,
122
+ currency: shopMeta?.localization.country.currency.isoCode ?? null,
123
+ locale: shopMeta?.localization.country.isoCode ?? null,
124
+ swr: {
125
+ fallback
126
+ },
127
+ swatches: parseJson.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
+ });
136
+ } catch (err) {
137
+ nextjs.captureException(err);
138
+ throw err;
139
+ }
140
+ };
134
141
 
135
142
  exports.getStaticPagePropsPreview = getStaticPagePropsPreview;