@gem-sdk/pages 3.0.0-pre-production.0 → 3.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 (150) hide show
  1. package/dist/cjs/components/ErrorBoundary.js +2 -40
  2. package/dist/cjs/components/ErrorFallback.js +2 -26
  3. package/dist/cjs/components/FacebookPixel.js +4 -36
  4. package/dist/cjs/components/FooterForPostPurchase.js +2 -34
  5. package/dist/cjs/components/GoogleAnalytic.js +6 -67
  6. package/dist/cjs/components/TikTokPixel.js +4 -19
  7. package/dist/cjs/components/builder/Body.js +2 -36
  8. package/dist/cjs/components/builder/Footer.js +2 -154
  9. package/dist/cjs/components/builder/Header.js +2 -189
  10. package/dist/cjs/components/builder/PopupManager.js +2 -63
  11. package/dist/cjs/components/builder/SwitchView.js +2 -184
  12. package/dist/cjs/components/builder/Toolbar.js +2 -706
  13. package/dist/cjs/components/builder/Toolbox.js +2 -494
  14. package/dist/cjs/components/builder/const.js +1 -56
  15. package/dist/cjs/components/builder/toolbar/const.js +1 -7
  16. package/dist/cjs/components/builder/toolbar/utils/findDOMClosest.js +1 -41
  17. package/dist/cjs/components/builder/toolbar/utils/findOverflowParent.js +1 -20
  18. package/dist/cjs/components/builder/toolbar/utils/getChildrenByAttrSelector.js +1 -18
  19. package/dist/cjs/components/builder/toolbar/utils/getDOMElementParents.js +1 -32
  20. package/dist/cjs/components/builder/toolbar/utils/isOverParent.js +1 -16
  21. package/dist/cjs/components/builder/toolbar/utils/isOverToolbarPosition.js +1 -12
  22. package/dist/cjs/components/builder/toolbar/utils/isSection.js +1 -8
  23. package/dist/cjs/components/builder/toolbar/utils/notVisible.js +1 -8
  24. package/dist/cjs/components/builder/toolbar/utils/waitForElementToExist.js +1 -27
  25. package/dist/cjs/components/image-to-layout/AddSectionImageToLayout.js +2 -150
  26. package/dist/cjs/components/image-to-layout/DropElement.js +2 -190
  27. package/dist/cjs/components/image-to-layout/ImageToLayout.js +2 -41
  28. package/dist/cjs/constants/index.js +1 -0
  29. package/dist/cjs/index.js +1 -82
  30. package/dist/cjs/layouts/main.js +2 -30
  31. package/dist/cjs/libs/api/get-builder-props.js +1 -46
  32. package/dist/cjs/libs/api/get-collection-props.js +1 -68
  33. package/dist/cjs/libs/api/get-home-page-props-v2.js +1 -145
  34. package/dist/cjs/libs/api/get-home-page-props.js +1 -151
  35. package/dist/cjs/libs/api/get-post-purchase-props-preview.js +1 -300
  36. package/dist/cjs/libs/api/get-preview-props.js +1 -18
  37. package/dist/cjs/libs/api/get-product-props.js +1 -73
  38. package/dist/cjs/libs/api/get-static-page-props-preview.js +1 -159
  39. package/dist/cjs/libs/api/get-static-page-props-v2.js +1 -168
  40. package/dist/cjs/libs/api/get-static-page-props.js +1 -148
  41. package/dist/cjs/libs/custom-fonts.js +6 -60
  42. package/dist/cjs/libs/fetcher.js +1 -100
  43. package/dist/cjs/libs/get-layout.js +1 -13
  44. package/dist/cjs/libs/get-storefront-api.js +1 -12
  45. package/dist/cjs/libs/getStaticPaths.js +1 -10
  46. package/dist/cjs/libs/google-fonts.js +1 -118
  47. package/dist/cjs/libs/helpers/check-option-font.js +1 -65
  48. package/dist/cjs/libs/helpers/common.js +1 -27
  49. package/dist/cjs/libs/helpers/extract-operation.js +1 -0
  50. package/dist/cjs/libs/helpers/gen-css.js +1 -135
  51. package/dist/cjs/libs/helpers/gen-fonts.js +1 -90
  52. package/dist/cjs/libs/helpers/generate-manifres.js +1 -5
  53. package/dist/cjs/libs/helpers/get-fallback.js +1 -34
  54. package/dist/cjs/libs/helpers/get-metafield.js +1 -0
  55. package/dist/cjs/libs/helpers/normalize.js +1 -103
  56. package/dist/cjs/libs/helpers/parse-json.js +1 -16
  57. package/dist/cjs/libs/helpers/sentry.js +1 -17
  58. package/dist/cjs/libs/helpers/user-agent.js +1 -7
  59. package/dist/cjs/libs/hooks/use-tracking-view.js +2 -42
  60. package/dist/cjs/libs/hooks/usePagePreview.js +1 -92
  61. package/dist/cjs/libs/parse-html.js +1 -34
  62. package/dist/cjs/libs/shopify-cdn-with-google-fonts.js +1 -1845
  63. package/dist/cjs/pages/404.js +2 -43
  64. package/dist/cjs/pages/500.js +2 -74
  65. package/dist/cjs/pages/CollectionGlobalProvider.js +2 -59
  66. package/dist/cjs/pages/builder.js +2 -115
  67. package/dist/cjs/pages/collection-detail.js +2 -64
  68. package/dist/cjs/pages/preview.js +2 -26
  69. package/dist/cjs/pages/product-detail.js +2 -69
  70. package/dist/cjs/pages/static-v2.js +5 -133
  71. package/dist/cjs/pages/static.js +2 -75
  72. package/dist/cjs/store/libs-store.js +1 -14
  73. package/dist/esm/components/ErrorBoundary.js +2 -38
  74. package/dist/esm/components/ErrorFallback.js +2 -24
  75. package/dist/esm/components/FacebookPixel.js +4 -34
  76. package/dist/esm/components/FooterForPostPurchase.js +2 -30
  77. package/dist/esm/components/GoogleAnalytic.js +6 -65
  78. package/dist/esm/components/TikTokPixel.js +4 -17
  79. package/dist/esm/components/builder/Body.js +2 -32
  80. package/dist/esm/components/builder/Footer.js +2 -150
  81. package/dist/esm/components/builder/Header.js +2 -185
  82. package/dist/esm/components/builder/PopupManager.js +2 -59
  83. package/dist/esm/components/builder/SwitchView.js +2 -180
  84. package/dist/esm/components/builder/Toolbar.js +2 -702
  85. package/dist/esm/components/builder/Toolbox.js +2 -490
  86. package/dist/esm/components/builder/const.js +1 -54
  87. package/dist/esm/components/builder/toolbar/const.js +1 -4
  88. package/dist/esm/components/builder/toolbar/utils/findDOMClosest.js +1 -39
  89. package/dist/esm/components/builder/toolbar/utils/findOverflowParent.js +1 -18
  90. package/dist/esm/components/builder/toolbar/utils/getChildrenByAttrSelector.js +1 -16
  91. package/dist/esm/components/builder/toolbar/utils/getDOMElementParents.js +1 -30
  92. package/dist/esm/components/builder/toolbar/utils/isOverParent.js +1 -14
  93. package/dist/esm/components/builder/toolbar/utils/isOverToolbarPosition.js +1 -10
  94. package/dist/esm/components/builder/toolbar/utils/isSection.js +1 -6
  95. package/dist/esm/components/builder/toolbar/utils/notVisible.js +1 -6
  96. package/dist/esm/components/builder/toolbar/utils/waitForElementToExist.js +1 -25
  97. package/dist/esm/components/image-to-layout/AddSectionImageToLayout.js +2 -146
  98. package/dist/esm/components/image-to-layout/DropElement.js +2 -188
  99. package/dist/esm/components/image-to-layout/ImageToLayout.js +2 -37
  100. package/dist/esm/constants/index.js +1 -0
  101. package/dist/esm/index.js +1 -36
  102. package/dist/esm/layouts/main.js +2 -26
  103. package/dist/esm/libs/api/get-builder-props.js +1 -44
  104. package/dist/esm/libs/api/get-collection-props.js +1 -66
  105. package/dist/esm/libs/api/get-home-page-props-v2.js +1 -143
  106. package/dist/esm/libs/api/get-home-page-props.js +1 -149
  107. package/dist/esm/libs/api/get-post-purchase-props-preview.js +1 -292
  108. package/dist/esm/libs/api/get-preview-props.js +1 -16
  109. package/dist/esm/libs/api/get-product-props.js +1 -71
  110. package/dist/esm/libs/api/get-static-page-props-preview.js +1 -157
  111. package/dist/esm/libs/api/get-static-page-props-v2.js +1 -166
  112. package/dist/esm/libs/api/get-static-page-props.js +1 -146
  113. package/dist/esm/libs/custom-fonts.js +6 -55
  114. package/dist/esm/libs/fetcher.js +1 -96
  115. package/dist/esm/libs/get-layout.js +1 -11
  116. package/dist/esm/libs/get-storefront-api.js +1 -10
  117. package/dist/esm/libs/getStaticPaths.js +1 -8
  118. package/dist/esm/libs/google-fonts.js +1 -112
  119. package/dist/esm/libs/helpers/check-option-font.js +1 -63
  120. package/dist/esm/libs/helpers/common.js +1 -24
  121. package/dist/esm/libs/helpers/extract-operation.js +1 -0
  122. package/dist/esm/libs/helpers/gen-css.js +1 -133
  123. package/dist/esm/libs/helpers/gen-fonts.js +1 -87
  124. package/dist/esm/libs/helpers/generate-manifres.js +1 -3
  125. package/dist/esm/libs/helpers/get-fallback.js +1 -32
  126. package/dist/esm/libs/helpers/get-metafield.js +1 -0
  127. package/dist/esm/libs/helpers/normalize.js +1 -96
  128. package/dist/esm/libs/helpers/parse-json.js +1 -13
  129. package/dist/esm/libs/helpers/sentry.js +1 -15
  130. package/dist/esm/libs/helpers/user-agent.js +1 -5
  131. package/dist/esm/libs/hooks/use-tracking-view.js +2 -40
  132. package/dist/esm/libs/hooks/usePagePreview.js +1 -90
  133. package/dist/esm/libs/parse-html.js +1 -32
  134. package/dist/esm/libs/shopify-cdn-with-google-fonts.js +1 -1843
  135. package/dist/esm/pages/404.js +2 -41
  136. package/dist/esm/pages/500.js +2 -72
  137. package/dist/esm/pages/CollectionGlobalProvider.js +2 -55
  138. package/dist/esm/pages/builder.js +2 -113
  139. package/dist/esm/pages/collection-detail.js +2 -60
  140. package/dist/esm/pages/preview.js +2 -24
  141. package/dist/esm/pages/product-detail.js +2 -65
  142. package/dist/esm/pages/static-v2.js +5 -131
  143. package/dist/esm/pages/static.js +2 -71
  144. package/dist/esm/store/libs-store.js +1 -12
  145. package/dist/types/index.d.ts +61 -63
  146. package/package.json +7 -7
  147. package/dist/cjs/components/builder/InteractionSelectOnPageHeader.js +0 -192
  148. package/dist/cjs/libs/helpers/gen-favicon.js +0 -22
  149. package/dist/esm/components/builder/InteractionSelectOnPageHeader.js +0 -188
  150. package/dist/esm/libs/helpers/gen-favicon.js +0 -20
@@ -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,157 +1 @@
1
- import { PreviewThemePageDocument, StorePropertyDocument } from '@gem-sdk/core';
2
- import { ShopMetaDocument } from '@gem-sdk/adapter-shopify';
3
- import { captureException } from '@sentry/nextjs';
4
- import { getFontStyleFromPageTemplate, getFontFromGlobalStyle } from '../google-fonts.js';
5
- import { genCSS } from '../helpers/gen-css.js';
6
- import { generateManifest } from '../helpers/generate-manifres.js';
7
- import { getFallbackV2 } from '../helpers/get-fallback.js';
8
- import { parseBuilderTemplateV2 } from '../helpers/normalize.js';
9
- import { parseJson, serializableJson } from '../helpers/parse-json.js';
10
- import { getCustomFonts } from '../custom-fonts.js';
11
- import { sentryCaptureException } from '../helpers/sentry.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
- PreviewThemePageDocument,
23
- variables
24
- ]),
25
- fetcher([
26
- StorePropertyDocument
27
- ]),
28
- shopifyFetcher([
29
- ShopMetaDocument
30
- ])
31
- ]);
32
- if (theme.status === 'rejected') {
33
- sentryCaptureException('PreviewThemePageDocument', JSON.stringify(theme), {
34
- variables,
35
- theme
36
- });
37
- throw new Error(theme.reason?.[0]);
38
- }
39
- const dataBuilder = theme.value.previewThemePage;
40
- if (!dataBuilder) {
41
- throw new Error(`No data builder found for slug: /preview/${slug}`);
42
- }
43
- const themePageCustomFonts = dataBuilder.customFonts;
44
- const pageTemplate = parseBuilderTemplateV2(dataBuilder);
45
- const [elementFontStyle, fontStyle, fallback, customFonts] = await Promise.all([
46
- getFontStyleFromPageTemplate(pageTemplate),
47
- getFontFromGlobalStyle(dataBuilder?.themeStyle?.data),
48
- getFallbackV2(fetcher, pageTemplate),
49
- getCustomFonts(themePageCustomFonts)
50
- ]);
51
- const mobileOnly = dataBuilder.isMobile ?? false;
52
- const description = dataBuilder?.dataSEO?.find((item)=>item?.key === 'global-meta-description')?.value;
53
- const thumbnail = parseJson(dataBuilder?.dataSEO?.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 ? [
67
- thumbnail
68
- ] : []
69
- },
70
- nofollow: true,
71
- noindex: true,
72
- canonical: `/preview/${slug}`,
73
- additionalMetaTags: [
74
- {
75
- name: 'theme-color',
76
- content: '#000000'
77
- }
78
- ],
79
- additionalLinkTags: [
80
- {
81
- rel: 'icon',
82
- sizes: '32x32',
83
- href: `${favicon}-/crop/1:1/center/-/smart_resize/32x32/`
84
- },
85
- {
86
- rel: 'icon',
87
- sizes: '16x16',
88
- href: `${favicon}-/crop/1:1/center/-/smart_resize/16x16/`
89
- },
90
- {
91
- rel: 'apple-touch-icon',
92
- sizes: '180x180',
93
- href: `${favicon}-/crop/1:1/center/-/smart_resize/180x180/`
94
- },
95
- {
96
- rel: 'manifest',
97
- href: generateManifest({
98
- theme_color: '#000000',
99
- background_color: '#ffffff',
100
- display: 'standalone',
101
- scope: '/',
102
- start_url: '/',
103
- name: shopMeta?.shop.name,
104
- short_name: shopMeta?.shop.name,
105
- description: shopMeta?.shop.description,
106
- icons: [
107
- {
108
- src: `${favicon}-/crop/1:1/center/-/smart_resize/192x192/`,
109
- sizes: '192x192',
110
- type: 'image/png',
111
- purpose: 'any maskable'
112
- },
113
- {
114
- src: `${favicon}-/crop/1:1/center/-/smart_resize/512x512/`,
115
- sizes: '512x512',
116
- type: 'image/png'
117
- }
118
- ]
119
- })
120
- }
121
- ]
122
- };
123
- const languageIsoCode = shopMeta?.localization.language.isoCode ?? null;
124
- const countryIsoCode = shopMeta?.localization.country.isoCode ?? null;
125
- const locale = !languageIsoCode || !countryIsoCode ? null : `${languageIsoCode}-${countryIsoCode}`;
126
- return serializableJson({
127
- themeStyle: genCSS(dataBuilder?.themeStyle?.data, mobileOnly),
128
- fontStyle,
129
- elementFontStyle,
130
- builderData: pageTemplate,
131
- pageType,
132
- moneyFormat: shopMeta?.shop.moneyFormat ?? null,
133
- currency: shopMeta?.localization.country.currency.isoCode ?? null,
134
- languageIsoCode,
135
- countryIsoCode,
136
- locale,
137
- swr: {
138
- fallback
139
- },
140
- swatches: parseJson(shopData?.storeProperty?.swatchesConfig),
141
- seo,
142
- mobileOnly,
143
- gaTrackingId: dataBuilder.analytic?.gaTrackingID ?? null,
144
- facebookPixelId: dataBuilder.analytic?.fbPixelID ?? null,
145
- tiktokPixelId: dataBuilder.analytic?.tiktokPixelID ?? null,
146
- customCodeHeader: dataBuilder.customCode?.header ?? null,
147
- customCodeBody: dataBuilder.customCode?.body ?? null,
148
- customFonts,
149
- interaction: dataBuilder?.interaction
150
- });
151
- } catch (err) {
152
- captureException(err);
153
- throw err;
154
- }
155
- };
156
-
157
- export { getStaticPagePropsPreview };
1
+ import{PreviewThemePageDocument as e,StorePropertyDocument as o}from"@gem-sdk/core";import{ShopMetaDocument as t}from"@gem-sdk/adapter-shopify";import{captureException as r}from"@sentry/nextjs";import{getFontStyleFromPageTemplate as a,getFontFromGlobalStyle as i}from"../google-fonts.js";import{genCSS as s}from"../helpers/gen-css.js";import{generateManifest as n}from"../helpers/generate-manifres.js";import{getFallbackV2 as l}from"../helpers/get-fallback.js";import{parseBuilderTemplateV2 as c,extractPageBackground as m}from"../helpers/normalize.js";import{parseJson as p,serializableJson as d}from"../helpers/parse-json.js";import{getCustomFonts as f}from"../custom-fonts.js";import{sentryCaptureException as u}from"../helpers/sentry.js";let getStaticPagePropsPreview=(h,g)=>async y=>{try{let r="STATIC",x={handleURL:y,pageType:r},[P,k,v]=await Promise.allSettled([h([e,x]),h([o]),g([t])]);if("rejected"===P.status)throw u("PreviewThemePageDocument",P.reason,{variables:x,theme:P}),Error(P.reason?.[0]);let w=P.value.previewThemePage;if(!w)throw Error(`No data builder found for slug: /preview/${y}`);let z=w.customFonts,b=c(w),[j,C,_,S]=await Promise.all([a(b),i(w?.themeStyle?.data),l(h,b),f(z)]),T=!!w.isMobile,$=w?.dataSEO?.find(e=>e?.key==="global-meta-description")?.value,I=p(w?.dataSEO?.find(e=>e?.key==="global-meta-thumbnail")?.value),D="fulfilled"===v.status?v.value:void 0,E="fulfilled"===k.status?k.value:void 0,F=E?.storeProperty?.favicon??"/favicon/favicon-32x32.png",B={defaultTitle:D?.shop.name,title:w?.name,description:$??D?.shop.description,openGraph:{site_name:D?.shop.name,locale:D?.localization.country.isoCode,title:w?.name??D?.shop.name,description:$??D?.shop.description,images:I?[I]:[]},nofollow:!0,noindex:!0,canonical:`/preview/${y}`,additionalMetaTags:[{name:"theme-color",content:"#000000"}],additionalLinkTags:[{rel:"icon",sizes:"32x32",href:`${F}-/crop/1:1/center/-/smart_resize/32x32/`},{rel:"icon",sizes:"16x16",href:`${F}-/crop/1:1/center/-/smart_resize/16x16/`},{rel:"apple-touch-icon",sizes:"180x180",href:`${F}-/crop/1:1/center/-/smart_resize/180x180/`},{rel:"manifest",href:n({theme_color:"#000000",background_color:"#ffffff",display:"standalone",scope:"/",start_url:"/",name:D?.shop.name,short_name:D?.shop.name,description:D?.shop.description,icons:[{src:`${F}-/crop/1:1/center/-/smart_resize/192x192/`,sizes:"192x192",type:"image/png",purpose:"any maskable"},{src:`${F}-/crop/1:1/center/-/smart_resize/512x512/`,sizes:"512x512",type:"image/png"}]})}]},L=D?.localization.language.isoCode??null,M=D?.localization.country.isoCode??null,O=L&&M?`${L}-${M}`:null;return d({themeStyle:s(w?.themeStyle?.data,T),fontStyle:C,elementFontStyle:j,builderData:b,pageType:r,moneyFormat:D?.shop?.moneyFormat??null,currency:D?.localization?.country?.currency?.isoCode??null,languageIsoCode:L,countryIsoCode:M,locale:O,swr:{fallback:_},swatches:p(E?.storeProperty?.swatchesConfig),seo:B,mobileOnly:T,gaTrackingId:w.analytic?.gaTrackingID??null,facebookPixelId:w.analytic?.fbPixelID??null,tiktokPixelId:w.analytic?.tiktokPixelID??null,customCodeHeader:w.customCode?.header??null,customCodeBody:w.customCode?.body??null,customFonts:S,pageBackground:m(w),interaction:w?.interaction})}catch(e){throw r(e),e}};export{getStaticPagePropsPreview};
@@ -1,166 +1 @@
1
- import { PublishedThemePagesDocument, StorePropertyDocument, PublishedShopMetasDocument } from '@gem-sdk/core';
2
- import { ShopMetaDocument } from '@gem-sdk/adapter-shopify';
3
- import { getFontStyleFromPageTemplate, getFontFromGlobalStyle } from '../google-fonts.js';
4
- import { genCSS } from '../helpers/gen-css.js';
5
- import { generateManifest } from '../helpers/generate-manifres.js';
6
- import { getFallbackV2 } from '../helpers/get-fallback.js';
7
- import { parseBuilderTemplateV2 } from '../helpers/normalize.js';
8
- import { parseJson, serializableJson } from '../helpers/parse-json.js';
9
- import { captureException } from '@sentry/nextjs';
10
- import { getCustomFonts } from '../custom-fonts.js';
11
- import { genResizeFaviconUrl } from '../helpers/gen-favicon.js';
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, publishedShopMetas] = await Promise.allSettled([
21
- fetcher([
22
- PublishedThemePagesDocument,
23
- variables
24
- ]),
25
- fetcher([
26
- StorePropertyDocument
27
- ]),
28
- shopifyFetcher([
29
- ShopMetaDocument
30
- ]),
31
- fetcher([
32
- PublishedShopMetasDocument,
33
- {
34
- keys: [
35
- 'source_font'
36
- ]
37
- }
38
- ])
39
- ]);
40
- if (theme.status === 'rejected') {
41
- throw new Error(theme.reason?.[0]);
42
- }
43
- const publishedShopMetaValue = publishedShopMetas.status === 'fulfilled' ? publishedShopMetas.value : undefined;
44
- const sourceFont = publishedShopMetaValue?.publishedShopMetas?.find((item)=>item?.key === 'source_font');
45
- const dataBuilder = theme.value.publishedThemePages?.[0];
46
- const themePageCustomFonts = theme.value?.publishedThemePages?.[0]?.themePageCustomFonts;
47
- if (!dataBuilder) {
48
- throw new Error(`No data builder found for slug: /${slug}`);
49
- }
50
- const pageTemplate = parseBuilderTemplateV2(dataBuilder);
51
- const [elementFontStyle, fontStyle, fallback, customFonts] = await Promise.all([
52
- getFontStyleFromPageTemplate(pageTemplate, sourceFont?.value),
53
- getFontFromGlobalStyle(dataBuilder?.pageStyle?.data, sourceFont?.value),
54
- getFallbackV2(fetcher, pageTemplate),
55
- getCustomFonts(themePageCustomFonts)
56
- ]);
57
- const mobileOnly = dataBuilder.isMobile ?? false;
58
- const description = dataBuilder?.themePageDataSEO?.find((item)=>item?.key === 'global-meta-description')?.value;
59
- const thumbnail = parseJson(dataBuilder?.themePageDataSEO?.find((item)=>item?.key === 'global-meta-thumbnail')?.value);
60
- const noindex = dataBuilder?.metafields?.find((item)=>item?.key === 'noindex')?.value;
61
- const nofollow = dataBuilder?.metafields?.find((item)=>item?.key === 'nofollow')?.value;
62
- const shopMeta = shopifyMeta.status === 'fulfilled' ? shopifyMeta.value : undefined;
63
- const shopData = storeProperty.status === 'fulfilled' ? storeProperty.value : undefined;
64
- const favicon = shopData?.storeProperty?.favicon ?? '';
65
- const seo = {
66
- defaultTitle: shopMeta?.shop.name,
67
- title: dataBuilder?.name,
68
- description: description ?? shopMeta?.shop.description,
69
- openGraph: {
70
- site_name: shopMeta?.shop.name,
71
- locale: shopMeta?.localization.country.isoCode,
72
- title: dataBuilder?.name ?? shopMeta?.shop.name,
73
- description: description ?? shopMeta?.shop.description,
74
- images: thumbnail ? [
75
- thumbnail
76
- ] : []
77
- },
78
- noindex: noindex === 'true',
79
- nofollow: nofollow === 'true',
80
- canonical: `https://${shopData?.storeProperty?.primaryDomain}/${slug}`,
81
- additionalMetaTags: [
82
- {
83
- name: 'theme-color',
84
- content: '#000000'
85
- }
86
- ],
87
- additionalLinkTags: [
88
- {
89
- rel: 'icon',
90
- sizes: '32x32',
91
- href: genResizeFaviconUrl(favicon, 32)
92
- },
93
- {
94
- rel: 'icon',
95
- sizes: '16x16',
96
- href: genResizeFaviconUrl(favicon, 16)
97
- },
98
- {
99
- rel: 'apple-touch-icon',
100
- sizes: '180x180',
101
- href: genResizeFaviconUrl(favicon, 180)
102
- },
103
- {
104
- rel: 'manifest',
105
- href: generateManifest({
106
- theme_color: '#000000',
107
- background_color: '#ffffff',
108
- display: 'standalone',
109
- scope: '/',
110
- start_url: '/',
111
- name: shopMeta?.shop.name,
112
- short_name: shopMeta?.shop.name,
113
- description: shopMeta?.shop.description,
114
- icons: [
115
- {
116
- src: genResizeFaviconUrl(favicon, 192),
117
- sizes: '192x192',
118
- type: 'image/png',
119
- purpose: 'any maskable'
120
- },
121
- {
122
- src: genResizeFaviconUrl(favicon, 512),
123
- sizes: '512x512',
124
- type: 'image/png'
125
- }
126
- ]
127
- })
128
- }
129
- ]
130
- };
131
- const languageIsoCode = shopMeta?.localization.language.isoCode ?? null;
132
- const countryIsoCode = shopMeta?.localization.country.isoCode ?? null;
133
- const locale = !languageIsoCode || !countryIsoCode ? null : `${languageIsoCode}-${countryIsoCode}`;
134
- return serializableJson({
135
- themeStyle: genCSS(dataBuilder?.pageStyle?.data, mobileOnly),
136
- fontStyle,
137
- elementFontStyle,
138
- builderData: pageTemplate,
139
- pageType,
140
- moneyFormat: shopMeta?.shop.moneyFormat ?? null,
141
- currency: shopMeta?.localization.country.currency.isoCode ?? null,
142
- languageIsoCode,
143
- countryIsoCode,
144
- locale,
145
- swr: {
146
- fallback
147
- },
148
- swatches: parseJson(shopData?.storeProperty?.swatchesConfig),
149
- seo,
150
- mobileOnly,
151
- gaTrackingId: dataBuilder.themePageAnalytic?.gaTrackingID ?? null,
152
- facebookPixelId: dataBuilder.themePageAnalytic?.fbPixelID ?? null,
153
- tiktokPixelId: dataBuilder.themePageAnalytic?.tiktokPixelID ?? null,
154
- customCodeHeader: dataBuilder.themePageCustomCode?.header ?? null,
155
- customCodeBody: dataBuilder.themePageCustomCode?.body ?? null,
156
- pageHandle: dataBuilder.handle ?? null,
157
- customFonts,
158
- interaction: dataBuilder?.interaction
159
- });
160
- } catch (err) {
161
- captureException(err);
162
- throw err;
163
- }
164
- };
165
-
166
- export { getStaticPagePropsV2 };
1
+ import{PublishedThemePagesDocument as e,StorePropertyDocument as o,PublishedShopMetasDocument as t}from"@gem-sdk/core";import{ShopMetaDocument as s}from"@gem-sdk/adapter-shopify";import{getFontStyleFromPageTemplate as a,getFontFromGlobalStyle as r}from"../google-fonts.js";import{genCSS as i}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 p,extractPageBackground as m}from"../helpers/normalize.js";import{parseJson as d,serializableJson as c}from"../helpers/parse-json.js";import{captureException as f}from"@sentry/nextjs";import{getCustomFonts as u}from"../custom-fonts.js";import{getPublishedThemePageMetafieldByKey as h}from"../helpers/get-metafield.js";import{PublishedThemePageMetafields as _}from"../../constants/index.js";let getStaticPagePropsV2=(g,T)=>async y=>{try{let f="STATIC",L={slug:y,slugType:f},[A,E,I,O]=await Promise.allSettled([g([e,L]),g([o]),T([s]),g([t,{keys:["source_font",_.GLOBAL_META_DESCRIPTION,_.GLOBAL_META_THUMBNAIL]}])]);if("rejected"===A.status)throw Error(A.reason?.[0]);let M="fulfilled"===O.status?O.value:void 0,S=M?.publishedShopMetas?.find(e=>e?.key==="source_font"),C=A.value.publishedThemePages?.[0],P=A.value?.publishedThemePages?.[0]?.themePageCustomFonts;if(!C)throw Error(`No data builder found for slug: /${y}`);let k=p(C),[v,x,N,b]=await Promise.all([a(k,S?.value),r(C?.pageStyle?.data,S?.value),n(g,k),u(P)]),z=C.isMobile??!1,B=h(_.GLOBAL_META_DESCRIPTION,C?.metafields)||M?.publishedShopMetas?.find(e=>e?.key===_.GLOBAL_META_DESCRIPTION)?.value,D=h(_.GLOBAL_META_TITLE,C?.metafields)||M?.publishedShopMetas?.find(e=>e?.key===_.GLOBAL_META_TITLE)?.value,j=d(h(_.GLOBAL_META_THUMBNAIL,C?.metafields)||M?.publishedShopMetas?.find(e=>e?.key===_.GLOBAL_META_THUMBNAIL)?.value),G=h(_.NOINDEX_KEY,C?.metafields)||M?.publishedShopMetas?.find(e=>e?.key===_.NOINDEX_KEY)?.value,$=h(_.NOFOLLOW_KEY,C?.metafields)||M?.publishedShopMetas?.find(e=>e?.key===_.NOFOLLOW_KEY)?.value,w="fulfilled"===I.status?I.value:void 0,Y="fulfilled"===E.status?E.value:void 0,K=Y?.storeProperty?.favicon??"/favicon/favicon-32x32.png",F={defaultTitle:w?.shop.name,title:D||C?.name,description:B??w?.shop.description,openGraph:{site_name:w?.shop.name,locale:w?.localization.country.isoCode,title:(D||C?.name)??w?.shop.name,description:B??w?.shop.description,images:j?[j]:[]},noindex:"true"===G,nofollow:"true"===$,canonical:`https://${Y?.storeProperty?.primaryDomain}/${y}`,additionalMetaTags:[{name:"theme-color",content:"#000000"}],additionalLinkTags:[{rel:"icon",sizes:"32x32",href:`${K}-/crop/1:1/center/-/smart_resize/32x32/`},{rel:"icon",sizes:"16x16",href:`${K}-/crop/1:1/center/-/smart_resize/16x16/`},{rel:"apple-touch-icon",sizes:"180x180",href:`${K}-/crop/1:1/center/-/smart_resize/180x180/`},{rel:"manifest",href:l({theme_color:"#000000",background_color:"#ffffff",display:"standalone",scope:"/",start_url:"/",name:w?.shop.name,short_name:w?.shop.name,description:w?.shop.description,icons:[{src:`${K}-/crop/1:1/center/-/smart_resize/192x192/`,sizes:"192x192",type:"image/png",purpose:"any maskable"},{src:`${K}-/crop/1:1/center/-/smart_resize/512x512/`,sizes:"512x512",type:"image/png"}]})}]},H=w?.localization.language.isoCode??null,R=w?.localization.country.isoCode??null,U=H&&R?`${H}-${R}`:null;return c({themeStyle:i(C?.pageStyle?.data,z),fontStyle:x,elementFontStyle:v,builderData:k,pageType:f,moneyFormat:w?.shop.moneyFormat??null,currency:w?.localization.country.currency.isoCode??null,languageIsoCode:H,countryIsoCode:R,locale:U,swr:{fallback:N},swatches:d(Y?.storeProperty?.swatchesConfig),seo:F,mobileOnly:z,gaTrackingId:h(_.ANALYTICS_GA_TRACKING_ID,C?.metafields)??null,facebookPixelId:h(_.ANALYTICS_FB_PIXEL_ID,C?.metafields)??null,tiktokPixelId:h(_.ANALYTICS_TIKTOK_PIXEL_ID,C?.metafields)??null,customCodeHeader:h(_.CUSTOM_CODE_HEADER,C?.metafields)??null,customCodeBody:h(_.CUSTOM_CODE_BODY,C?.metafields)??null,pageHandle:C.handle??null,customFonts:b,interaction:C?.interaction,pageBackground:m(C)})}catch(e){throw f(e),e}};export{getStaticPagePropsV2};
@@ -1,146 +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 getStaticPageProps = (fetcher, shopifyFetcher)=>async (slug)=>{
10
- const pageType = 'STATIC';
11
- const variables = {
12
- slug,
13
- slugType: pageType
14
- };
15
- const [theme, storeProperty, shopifyMeta] = await Promise.allSettled([
16
- fetcher([
17
- PublishedThemePagesDocument,
18
- variables
19
- ]),
20
- fetcher([
21
- StorePropertyDocument
22
- ]),
23
- shopifyFetcher([
24
- ShopMetaDocument
25
- ])
26
- ]);
27
- if (theme.status === 'rejected') {
28
- return {
29
- pageType
30
- };
31
- }
32
- const dataBuilder = theme.value.publishedThemePages?.[0];
33
- const pageTemplate = parseBuilderTemplate(dataBuilder);
34
- const fontStyle = await getFontFromGlobalStyle(dataBuilder?.pageStyle?.data);
35
- const queries = prefetchQueries(pageTemplate);
36
- const datas = await Promise.allSettled(queries.map(({ query, variables, func })=>{
37
- if (func) {
38
- return func(fetcher, variables);
39
- }
40
- if (query) return fetcher([
41
- query,
42
- variables
43
- ]);
44
- return {};
45
- }));
46
- const fallback = queries.reduce((acc, { key }, index)=>{
47
- const res = datas[index];
48
- if (res?.status === 'fulfilled') {
49
- return {
50
- ...acc,
51
- [key]: res.value
52
- };
53
- }
54
- return acc;
55
- }, {});
56
- const description = dataBuilder?.themePageDataSEO?.find((item)=>item?.key === 'global-meta-description')?.value;
57
- const thumbnail = parseJson(dataBuilder?.themePageDataSEO?.find((item)=>item?.key === 'global-meta-thumbnail')?.value);
58
- const shopMeta = shopifyMeta.status === 'fulfilled' ? shopifyMeta.value : undefined;
59
- const shopData = storeProperty.status === 'fulfilled' ? storeProperty.value : undefined;
60
- const favicon = shopData?.storeProperty?.favicon ?? '/favicon/favicon-32x32.png';
61
- const seo = {
62
- defaultTitle: shopMeta?.shop.name ?? '',
63
- title: dataBuilder?.name ?? '',
64
- description: description ?? shopMeta?.shop.description ?? '',
65
- openGraph: {
66
- site_name: shopMeta?.shop.name ?? '',
67
- locale: shopMeta?.localization.country.isoCode ?? '',
68
- title: dataBuilder?.name ?? shopMeta?.shop.name ?? '',
69
- description: description ?? shopMeta?.shop.description ?? '',
70
- images: thumbnail ? [
71
- thumbnail
72
- ] : []
73
- },
74
- additionalMetaTags: [
75
- {
76
- name: 'theme-color',
77
- content: '#000000'
78
- }
79
- ],
80
- canonical: `/${slug}`,
81
- additionalLinkTags: [
82
- {
83
- rel: 'icon',
84
- sizes: '32x32',
85
- href: `${favicon}-/crop/1:1/center/-/smart_resize/32x32/`
86
- },
87
- {
88
- rel: 'icon',
89
- sizes: '16x16',
90
- href: `${favicon}-/crop/1:1/center/-/smart_resize/16x16/`
91
- },
92
- {
93
- rel: 'apple-touch-icon',
94
- sizes: '180x180',
95
- href: `${favicon}-/crop/1:1/center/-/smart_resize/180x180/`
96
- },
97
- {
98
- rel: 'manifest',
99
- href: generateManifest({
100
- theme_color: '#000000',
101
- background_color: '#ffffff',
102
- display: 'standalone',
103
- scope: '/',
104
- start_url: '/',
105
- name: shopMeta?.shop.name,
106
- short_name: shopMeta?.shop.name,
107
- description: shopMeta?.shop.description,
108
- icons: [
109
- {
110
- src: `${favicon}-/crop/1:1/center/-/smart_resize/192x192/`,
111
- sizes: '192x192',
112
- type: 'image/png',
113
- purpose: 'any maskable'
114
- },
115
- {
116
- src: `${favicon}-/crop/1:1/center/-/smart_resize/512x512/`,
117
- sizes: '512x512',
118
- type: 'image/png'
119
- }
120
- ]
121
- })
122
- }
123
- ]
124
- };
125
- const languageIsoCode = shopMeta?.localization.language.isoCode ?? null;
126
- const countryIsoCode = shopMeta?.localization.country.isoCode ?? null;
127
- const locale = !languageIsoCode || !countryIsoCode ? null : `${languageIsoCode}-${countryIsoCode}`;
128
- return serializableJson({
129
- themeStyle: genCSS(dataBuilder?.pageStyle?.data),
130
- fontStyle,
131
- builderData: pageTemplate,
132
- pageType,
133
- moneyFormat: shopMeta?.shop.moneyFormat ?? null,
134
- currency: shopMeta?.localization.country.currency.isoCode ?? null,
135
- languageIsoCode,
136
- countryIsoCode,
137
- locale,
138
- swr: {
139
- fallback
140
- },
141
- swatches: parseJson(shopData?.storeProperty?.swatchesConfig),
142
- seo
143
- });
144
- };
145
-
146
- export { getStaticPageProps };
1
+ import{PublishedThemePagesDocument as e,StorePropertyDocument as t,PublishedShopMetasDocument as o,prefetchQueries as s}from"@gem-sdk/core";import{ShopMetaDocument as a}from"@gem-sdk/adapter-shopify";import{getFontFromGlobalStyle as r}from"../google-fonts.js";import{genCSS as i}from"../helpers/gen-css.js";import{generateManifest as l}from"../helpers/generate-manifres.js";import{parseBuilderTemplate as n}from"../helpers/normalize.js";import{parseJson as p,serializableJson as c}from"../helpers/parse-json.js";import{PublishedThemePageMetafields as m}from"../../constants/index.js";import{getPublishedThemePageMetafieldByKey as d}from"../helpers/get-metafield.js";let getStaticPageProps=(f,u)=>async h=>{let g="STATIC",_={slug:h,slugType:g},[y,T,A,L]=await Promise.allSettled([f([e,_]),f([t]),u([a]),f([o,{keys:["source_font",m.GLOBAL_META_DESCRIPTION,m.GLOBAL_META_THUMBNAIL]}])]);if("rejected"===y.status)return{pageType:g};let z="fulfilled"===L.status?L.value:void 0,v=y.value.publishedThemePages?.[0],x=n(v),S=await r(v?.pageStyle?.data),M=s(x),P=await Promise.allSettled(M.map(({query:e,variables:t,func:o})=>o?o(f,t):e?f([e,t]):{})),I=M.reduce((e,{key:t},o)=>{let s=P[o];return s?.status==="fulfilled"?{...e,[t]:s.value}:e},{}),j=d(m.GLOBAL_META_DESCRIPTION,v?.metafields)||z?.publishedShopMetas?.find(e=>e?.key===m.GLOBAL_META_DESCRIPTION)?.value,B=p(d(m.GLOBAL_META_THUMBNAIL,v?.metafields)||z?.publishedShopMetas?.find(e=>e?.key===m.GLOBAL_META_THUMBNAIL)?.value),C="fulfilled"===A.status?A.value:void 0,E="fulfilled"===T.status?T.value:void 0,O=E?.storeProperty?.favicon??"/favicon/favicon-32x32.png",k={defaultTitle:C?.shop.name??"",title:v?.name??"",description:j??C?.shop.description??"",openGraph:{site_name:C?.shop.name??"",locale:C?.localization.country.isoCode??"",title:v?.name??C?.shop.name??"",description:j??C?.shop.description??"",images:B?[B]:[]},additionalMetaTags:[{name:"theme-color",content:"#000000"}],canonical:`/${h}`,additionalLinkTags:[{rel:"icon",sizes:"32x32",href:`${O}-/crop/1:1/center/-/smart_resize/32x32/`},{rel:"icon",sizes:"16x16",href:`${O}-/crop/1:1/center/-/smart_resize/16x16/`},{rel:"apple-touch-icon",sizes:"180x180",href:`${O}-/crop/1:1/center/-/smart_resize/180x180/`},{rel:"manifest",href:l({theme_color:"#000000",background_color:"#ffffff",display:"standalone",scope:"/",start_url:"/",name:C?.shop.name,short_name:C?.shop.name,description:C?.shop.description,icons:[{src:`${O}-/crop/1:1/center/-/smart_resize/192x192/`,sizes:"192x192",type:"image/png",purpose:"any maskable"},{src:`${O}-/crop/1:1/center/-/smart_resize/512x512/`,sizes:"512x512",type:"image/png"}]})}]},$=C?.localization.language.isoCode??null,G=C?.localization.country.isoCode??null,b=$&&G?`${$}-${G}`:null;return c({themeStyle:i(v?.pageStyle?.data),fontStyle:S,builderData:x,pageType:g,moneyFormat:C?.shop.moneyFormat??null,currency:C?.localization.country.currency.isoCode??null,languageIsoCode:$,countryIsoCode:G,locale:b,swr:{fallback:I},swatches:p(E?.storeProperty?.swatchesConfig),seo:k})};export{getStaticPageProps};
@@ -1,57 +1,8 @@
1
- const composeFontMimeType = (fonts)=>{
2
- const result = {};
3
- fonts?.forEach((font)=>{
4
- if (!font) return;
5
- const fontKey = `${font.fontFamily}_${font.fontStyle}_${font.fontWeight}`;
6
- const fontData = {
7
- font: {
8
- fontFamily: font.fontFamily,
9
- fontStyle: font.fontStyle,
10
- fontWeight: font.fontWeight
11
- },
12
- urls: [
13
- {
14
- url: font.backupFilePath || font.filePath,
15
- mimeType: font.mimeType
16
- }
17
- ]
18
- };
19
- if (!result[fontKey]) {
20
- result[fontKey] = fontData;
21
- } else {
22
- result[fontKey]?.urls.push(fontData?.urls?.[0]);
23
- }
24
- });
25
- return result;
26
- };
27
- // Currently support only ttf, otf, woff, woff2
28
- const formatName = (mimeType)=>{
29
- const fontMimeTypes = {
30
- 'font/ttf': 'truetype',
31
- 'application/x-font-opentype': 'opentype',
32
- 'application/font-woff': 'woff',
33
- 'application/font-woff2': 'woff2'
34
- };
35
- return fontMimeTypes[mimeType];
36
- };
37
- const composeFontFaces = (fontsMimeType)=>{
38
- const fontFaces = [];
39
- for (const [, value] of Object.entries(fontsMimeType)){
40
- fontFaces.push(`
1
+ let composeFontMimeType=t=>{let o={};return t?.forEach(t=>{if(!t)return;let e=`${t.fontFamily}_${t.fontStyle}_${t.fontWeight}`,n={font:{fontFamily:t.fontFamily,fontStyle:t.fontStyle,fontWeight:t.fontWeight},urls:[{url:t.backupFilePath||t.filePath,mimeType:t.mimeType}]};o[e]?o[e]?.urls.push(n?.urls?.[0]):o[e]=n}),o},formatName=t=>({"font/ttf":"truetype","application/x-font-opentype":"opentype","application/font-woff":"woff","application/font-woff2":"woff2"})[t],composeFontFaces=t=>{let o=[];for(let[,e]of Object.entries(t))o.push(`
41
2
  @font-face {
42
- font-family: '${value.font.fontFamily}';
43
- src: ${value.urls.map((item)=>`url('${item.url}') format('${formatName(item.mimeType)}')`).join('\n')};
44
- font-style: ${value?.font?.fontStyle ?? 'normal'};
45
- font-weight: ${value?.font?.fontWeight ?? 'normal'};
3
+ font-family: '${e.font.fontFamily}';
4
+ src: ${e.urls.map(t=>`url('${t.url}') format('${formatName(t.mimeType)}')`).join("\n")};
5
+ font-style: ${e?.font?.fontStyle??"normal"};
6
+ font-weight: ${e?.font?.fontWeight??"normal"};
46
7
  }
47
- `);
48
- }
49
- return fontFaces.map((fontFace)=>fontFace).join('\n');
50
- };
51
- const getCustomFonts = (fonts)=>{
52
- if (!fonts) return null;
53
- const fontsMimeType = composeFontMimeType(fonts);
54
- return composeFontFaces(fontsMimeType);
55
- };
56
-
57
- export { composeFontFaces, composeFontMimeType, formatName, getCustomFonts };
8
+ `);return o.map(t=>t).join("\n")},getCustomFonts=t=>{if(!t)return null;let o=composeFontMimeType(t);return composeFontFaces(o)};export{composeFontFaces,composeFontMimeType,formatName,getCustomFonts};