@gem-sdk/pages 2.0.0-staging.709 → 2.0.0-staging.764

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 (145) hide show
  1. package/dist/cjs/components/ErrorBoundary.js +1 -40
  2. package/dist/cjs/components/ErrorFallback.js +1 -26
  3. package/dist/cjs/components/FacebookPixel.js +3 -33
  4. package/dist/cjs/components/FooterForPostPurchase.js +1 -34
  5. package/dist/cjs/components/GoogleAnalytic.js +5 -65
  6. package/dist/cjs/components/TikTokPixel.js +3 -19
  7. package/dist/cjs/components/builder/Body.js +1 -36
  8. package/dist/cjs/components/builder/Footer.js +1 -154
  9. package/dist/cjs/components/builder/Header.js +1 -186
  10. package/dist/cjs/components/builder/PopupManager.js +1 -63
  11. package/dist/cjs/components/builder/SwitchView.js +1 -184
  12. package/dist/cjs/components/builder/Toolbar.js +1 -706
  13. package/dist/cjs/components/builder/Toolbox.js +1 -508
  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/composable/getListFontWeightTypos.js +1 -14
  26. package/dist/cjs/components/image-to-layout/AddSectionImageToLayout.js +1 -151
  27. package/dist/cjs/components/image-to-layout/DropElement.js +1 -191
  28. package/dist/cjs/components/image-to-layout/ImageToLayout.js +1 -41
  29. package/dist/cjs/constants/index.js +1 -15
  30. package/dist/cjs/index.js +1 -80
  31. package/dist/cjs/layouts/main.js +1 -30
  32. package/dist/cjs/libs/api/get-builder-props.js +1 -46
  33. package/dist/cjs/libs/api/get-collection-props.js +1 -68
  34. package/dist/cjs/libs/api/get-home-page-props-v2.js +1 -157
  35. package/dist/cjs/libs/api/get-home-page-props.js +1 -163
  36. package/dist/cjs/libs/api/get-post-purchase-props-preview.js +1 -301
  37. package/dist/cjs/libs/api/get-preview-props.js +1 -18
  38. package/dist/cjs/libs/api/get-product-props.js +1 -73
  39. package/dist/cjs/libs/api/get-static-page-props-preview.js +1 -160
  40. package/dist/cjs/libs/api/get-static-page-props-v2.js +1 -173
  41. package/dist/cjs/libs/api/get-static-page-props.js +1 -161
  42. package/dist/cjs/libs/custom-fonts.js +6 -60
  43. package/dist/cjs/libs/fetcher.js +1 -100
  44. package/dist/cjs/libs/get-layout.js +1 -13
  45. package/dist/cjs/libs/get-storefront-api.js +1 -12
  46. package/dist/cjs/libs/getStaticPaths.js +1 -10
  47. package/dist/cjs/libs/google-fonts.js +1 -138
  48. package/dist/cjs/libs/helpers/check-option-font.js +1 -65
  49. package/dist/cjs/libs/helpers/common.js +1 -27
  50. package/dist/cjs/libs/helpers/gen-css.js +1 -135
  51. package/dist/cjs/libs/helpers/gen-fonts.js +1 -96
  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 -7
  55. package/dist/cjs/libs/helpers/normalize.js +1 -112
  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 +1 -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 +1 -43
  64. package/dist/cjs/pages/500.js +1 -74
  65. package/dist/cjs/pages/CollectionGlobalProvider.js +1 -59
  66. package/dist/cjs/pages/builder.js +1 -119
  67. package/dist/cjs/pages/collection-detail.js +1 -64
  68. package/dist/cjs/pages/preview.js +1 -26
  69. package/dist/cjs/pages/product-detail.js +1 -69
  70. package/dist/cjs/pages/static-v2.js +3 -142
  71. package/dist/cjs/pages/static.js +1 -75
  72. package/dist/cjs/store/libs-store.js +1 -14
  73. package/dist/esm/components/ErrorBoundary.js +1 -38
  74. package/dist/esm/components/ErrorFallback.js +1 -24
  75. package/dist/esm/components/FacebookPixel.js +3 -31
  76. package/dist/esm/components/FooterForPostPurchase.js +1 -30
  77. package/dist/esm/components/GoogleAnalytic.js +5 -63
  78. package/dist/esm/components/TikTokPixel.js +3 -17
  79. package/dist/esm/components/builder/Body.js +1 -32
  80. package/dist/esm/components/builder/Footer.js +1 -150
  81. package/dist/esm/components/builder/Header.js +1 -182
  82. package/dist/esm/components/builder/PopupManager.js +1 -59
  83. package/dist/esm/components/builder/SwitchView.js +1 -180
  84. package/dist/esm/components/builder/Toolbar.js +1 -702
  85. package/dist/esm/components/builder/Toolbox.js +1 -504
  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/composable/getListFontWeightTypos.js +1 -12
  98. package/dist/esm/components/image-to-layout/AddSectionImageToLayout.js +1 -147
  99. package/dist/esm/components/image-to-layout/DropElement.js +1 -189
  100. package/dist/esm/components/image-to-layout/ImageToLayout.js +1 -37
  101. package/dist/esm/constants/index.js +1 -15
  102. package/dist/esm/index.js +1 -35
  103. package/dist/esm/layouts/main.js +1 -26
  104. package/dist/esm/libs/api/get-builder-props.js +1 -44
  105. package/dist/esm/libs/api/get-collection-props.js +1 -66
  106. package/dist/esm/libs/api/get-home-page-props-v2.js +1 -155
  107. package/dist/esm/libs/api/get-home-page-props.js +1 -161
  108. package/dist/esm/libs/api/get-post-purchase-props-preview.js +1 -293
  109. package/dist/esm/libs/api/get-preview-props.js +1 -16
  110. package/dist/esm/libs/api/get-product-props.js +1 -71
  111. package/dist/esm/libs/api/get-static-page-props-preview.js +1 -158
  112. package/dist/esm/libs/api/get-static-page-props-v2.js +1 -171
  113. package/dist/esm/libs/api/get-static-page-props.js +1 -159
  114. package/dist/esm/libs/custom-fonts.js +6 -55
  115. package/dist/esm/libs/fetcher.js +1 -96
  116. package/dist/esm/libs/get-layout.js +1 -11
  117. package/dist/esm/libs/get-storefront-api.js +1 -10
  118. package/dist/esm/libs/getStaticPaths.js +1 -8
  119. package/dist/esm/libs/google-fonts.js +1 -132
  120. package/dist/esm/libs/helpers/check-option-font.js +1 -63
  121. package/dist/esm/libs/helpers/common.js +1 -24
  122. package/dist/esm/libs/helpers/gen-css.js +1 -133
  123. package/dist/esm/libs/helpers/gen-fonts.js +1 -93
  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 -5
  127. package/dist/esm/libs/helpers/normalize.js +1 -104
  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 +1 -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 +1 -41
  136. package/dist/esm/pages/500.js +1 -72
  137. package/dist/esm/pages/CollectionGlobalProvider.js +1 -55
  138. package/dist/esm/pages/builder.js +1 -117
  139. package/dist/esm/pages/collection-detail.js +1 -60
  140. package/dist/esm/pages/preview.js +1 -24
  141. package/dist/esm/pages/product-detail.js +1 -65
  142. package/dist/esm/pages/static-v2.js +3 -140
  143. package/dist/esm/pages/static.js +1 -71
  144. package/dist/esm/store/libs-store.js +1 -12
  145. package/package.json +5 -5
@@ -1,293 +1 @@
1
- import { ThemePageDocument, StorePropertyDocument, SaleFunnelDiscountsDocument, SaleFunnelOfferDocument, LibraryTemplateDocument, LibrarySaleFunnelDocument, ShopLibraryPageDocument } from '@gem-sdk/core';
2
- import { captureException } from '@sentry/nextjs';
3
- import { getFontStyleFromPageTemplate, getFontFromGlobalStyle } from '../google-fonts.js';
4
- import { getFallbackV2 } from '../helpers/get-fallback.js';
5
- import { parseBuilderLibraryTemplate, parseShopLibraryPageTemplate, parseBuilderTemplateV2 } from '../helpers/normalize.js';
6
- import { usePagePreview } from '../hooks/usePagePreview.js';
7
- import { serializableJson } from '../helpers/parse-json.js';
8
- import { genCSS } from '../helpers/gen-css.js';
9
-
10
- const fetchSalePageDataByID = async (data, fetcher)=>{
11
- const variables = {
12
- themePageId: data.themePageId,
13
- first: 1,
14
- where: {
15
- default: true
16
- }
17
- };
18
- const [theme, storeProperty] = await Promise.allSettled([
19
- fetcher([
20
- ThemePageDocument,
21
- variables
22
- ]),
23
- fetcher([
24
- StorePropertyDocument
25
- ])
26
- ]);
27
- if (theme.status === 'rejected') {
28
- throw new Error(theme.reason?.[0]);
29
- }
30
- return {
31
- dataBuilder: theme.value.themePage,
32
- pageStyle: theme.value.themePage?.theme?.themeStyles?.edges?.[0]?.node?.data,
33
- storeProperty,
34
- dynamicDiscountOffer: undefined,
35
- productOffers: []
36
- };
37
- };
38
- const fetchPostPurchasePageDataByID = async (data, fetcher)=>{
39
- const variables = {
40
- themePageId: data.themePageId,
41
- first: 1,
42
- where: {
43
- default: true
44
- }
45
- };
46
- const [theme, storeProperty, saleFunnelDiscounts, saleFunnelOffer] = await Promise.allSettled([
47
- fetcher([
48
- ThemePageDocument,
49
- variables
50
- ]),
51
- fetcher([
52
- StorePropertyDocument
53
- ]),
54
- fetcher([
55
- SaleFunnelDiscountsDocument,
56
- {
57
- where: {
58
- saleFunnelOfferID: data.currentOfferID
59
- }
60
- }
61
- ]),
62
- fetcher([
63
- SaleFunnelOfferDocument,
64
- {
65
- saleFunnelOfferId: data.currentOfferID
66
- }
67
- ])
68
- ]);
69
- if (theme.status === 'rejected') {
70
- throw new Error(theme.reason?.[0]);
71
- }
72
- if (saleFunnelDiscounts.status === 'rejected') {
73
- throw new Error(saleFunnelDiscounts.reason?.[0]);
74
- }
75
- if (saleFunnelOffer.status === 'rejected') {
76
- throw new Error(saleFunnelOffer.reason?.[0]);
77
- }
78
- return {
79
- dataBuilder: theme.value.themePage,
80
- pageStyle: theme.value.themePage?.theme?.themeStyles?.edges?.[0]?.node?.data,
81
- storeProperty,
82
- dynamicDiscountOffer: saleFunnelOffer.value.saleFunnelOffer?.dynamicDiscounts?.[0],
83
- productOffers: saleFunnelDiscounts.value.saleFunnelDiscounts?.edges?.filter((item)=>item?.node?.objectType === 'PRODUCT' && item?.node?.type === 'ORDER_VALUE') || []
84
- };
85
- };
86
- const fetchThemePageDataByTemplateID = async (data, fetcher)=>{
87
- const variables = {
88
- libraryTemplateId: data.libraryTemplateId
89
- };
90
- let productOffers = [];
91
- const [theme, storeProperty] = await Promise.allSettled([
92
- fetcher([
93
- LibraryTemplateDocument,
94
- variables
95
- ]),
96
- fetcher([
97
- StorePropertyDocument
98
- ])
99
- ]);
100
- if (data.currentOfferID) {
101
- const [librarySaleFunnel] = await Promise.allSettled([
102
- fetcher([
103
- LibrarySaleFunnelDocument,
104
- {
105
- librarySaleFunnelId: data.librarySaleFunnelID
106
- }
107
- ])
108
- ]);
109
- if (librarySaleFunnel.status === 'rejected') {
110
- throw new Error(librarySaleFunnel.reason?.[0]);
111
- }
112
- const offer = librarySaleFunnel.value.librarySaleFunnel?.offers?.find((offer)=>offer?.id === data.currentOfferID);
113
- if (offer) {
114
- productOffers = offer.discounts?.filter((item)=>item?.objectType === 'PRODUCT' && item.type === 'ORDER_VALUE').map((item)=>({
115
- node: {
116
- ...item
117
- }
118
- })) || [];
119
- }
120
- }
121
- if (theme.status === 'rejected') {
122
- throw new Error(theme.reason?.[0]);
123
- }
124
- return {
125
- dataBuilder: theme.value.libraryTemplate,
126
- pageStyle: undefined,
127
- storeProperty,
128
- dynamicDiscountOffer: undefined,
129
- productOffers: productOffers
130
- };
131
- };
132
- const fetchShopLibraryPageDataByID = async (data, fetcher)=>{
133
- const variables = {
134
- shopLibraryPageId: data.shopLibraryPageId
135
- };
136
- const [theme, storeProperty, saleFunnelDiscounts, saleFunnelOffer] = await Promise.allSettled([
137
- fetcher([
138
- ShopLibraryPageDocument,
139
- variables
140
- ]),
141
- fetcher([
142
- StorePropertyDocument
143
- ]),
144
- fetcher([
145
- SaleFunnelDiscountsDocument,
146
- {
147
- where: {
148
- saleFunnelOfferID: data.currentOfferID
149
- }
150
- }
151
- ]),
152
- fetcher([
153
- SaleFunnelOfferDocument,
154
- {
155
- saleFunnelOfferId: data.currentOfferID
156
- }
157
- ])
158
- ]);
159
- if (theme.status === 'rejected') {
160
- throw new Error(theme.reason?.[0]);
161
- }
162
- if (saleFunnelDiscounts.status === 'rejected') {
163
- throw new Error(saleFunnelDiscounts.reason?.[0]);
164
- }
165
- if (saleFunnelOffer.status === 'rejected') {
166
- throw new Error(saleFunnelOffer.reason?.[0]);
167
- }
168
- return {
169
- dataBuilder: theme.value.shopLibraryPage,
170
- pageStyle: undefined,
171
- storeProperty,
172
- dynamicDiscountOffer: saleFunnelOffer.value.saleFunnelOffer?.dynamicDiscounts?.[0],
173
- productOffers: saleFunnelDiscounts.value.saleFunnelDiscounts?.edges?.filter((item)=>item?.node?.objectType === 'PRODUCT' && item?.node?.type === 'ORDER_VALUE') || []
174
- };
175
- };
176
- const fetchLibraryTemplateDataByID = async (data, fetcher)=>{
177
- const variables = {
178
- libraryTemplateId: data.libraryTemplateId
179
- };
180
- const [theme, storeProperty, saleFunnelDiscounts, saleFunnelOffer] = await Promise.allSettled([
181
- fetcher([
182
- LibraryTemplateDocument,
183
- variables
184
- ]),
185
- fetcher([
186
- StorePropertyDocument
187
- ]),
188
- fetcher([
189
- SaleFunnelDiscountsDocument,
190
- {
191
- where: {
192
- saleFunnelOfferID: data.currentOfferID
193
- }
194
- }
195
- ]),
196
- fetcher([
197
- SaleFunnelOfferDocument,
198
- {
199
- saleFunnelOfferId: data.currentOfferID
200
- }
201
- ])
202
- ]);
203
- if (theme.status === 'rejected') {
204
- throw new Error(theme.reason?.[0]);
205
- }
206
- if (saleFunnelDiscounts.status === 'rejected') {
207
- throw new Error(saleFunnelDiscounts.reason?.[0]);
208
- }
209
- if (saleFunnelOffer.status === 'rejected') {
210
- throw new Error(saleFunnelOffer.reason?.[0]);
211
- }
212
- return {
213
- dataBuilder: theme.value.libraryTemplate,
214
- pageStyle: undefined,
215
- storeProperty,
216
- dynamicDiscountOffer: saleFunnelOffer.value.saleFunnelOffer?.dynamicDiscounts?.[0],
217
- productOffers: saleFunnelDiscounts.value.saleFunnelDiscounts?.edges?.filter((item)=>item?.node?.objectType === 'PRODUCT' && item?.node?.type === 'ORDER_VALUE') || []
218
- };
219
- };
220
- const getRelevantPageData = async (data)=>{
221
- const { id, currentOfferID, fetcher, isLibraryTemplate, librarySaleFunnelID, isShopLibraryPage } = data;
222
- if (librarySaleFunnelID) {
223
- return await fetchThemePageDataByTemplateID({
224
- libraryTemplateId: id,
225
- currentOfferID,
226
- librarySaleFunnelID
227
- }, fetcher);
228
- }
229
- if (isShopLibraryPage && currentOfferID) {
230
- return await fetchShopLibraryPageDataByID({
231
- shopLibraryPageId: id,
232
- currentOfferID
233
- }, fetcher);
234
- }
235
- if (isLibraryTemplate && currentOfferID) {
236
- return await fetchLibraryTemplateDataByID({
237
- libraryTemplateId: id,
238
- currentOfferID
239
- }, fetcher);
240
- }
241
- if (currentOfferID) {
242
- return await fetchPostPurchasePageDataByID({
243
- themePageId: id,
244
- currentOfferID
245
- }, fetcher);
246
- }
247
- return await fetchSalePageDataByID({
248
- themePageId: id
249
- }, fetcher);
250
- };
251
- const getPostPurchasePropsPreview = (fetcher, librarySaleFunnelID, storeFrontFetcher)=>async (data)=>{
252
- try {
253
- const { id, currentOfferID, isLibraryTemplate, isShopLibraryPage } = data;
254
- const { dataBuilder, storeProperty, productOffers, pageStyle, dynamicDiscountOffer } = await getRelevantPageData({
255
- id,
256
- currentOfferID,
257
- fetcher,
258
- isLibraryTemplate,
259
- isShopLibraryPage,
260
- librarySaleFunnelID
261
- });
262
- if (!dataBuilder) {
263
- throw new Error(`No data builder found for slug: /preview/${id}`);
264
- }
265
- const pageTemplate = librarySaleFunnelID || isLibraryTemplate && currentOfferID ? parseBuilderLibraryTemplate(dataBuilder) : isShopLibraryPage ? parseShopLibraryPageTemplate(dataBuilder) : parseBuilderTemplateV2(dataBuilder);
266
- const gemPagesStoreFrontFetcher = storeFrontFetcher || fetcher;
267
- const [elementFontStyle, fontStyle, fallback] = await Promise.all([
268
- getFontStyleFromPageTemplate(pageTemplate),
269
- getFontFromGlobalStyle(pageStyle),
270
- getFallbackV2(gemPagesStoreFrontFetcher, pageTemplate, false)
271
- ]);
272
- const { seo, pageConfig } = usePagePreview(dataBuilder, storeProperty);
273
- return serializableJson({
274
- themeStyle: genCSS(pageStyle),
275
- seo,
276
- ...pageConfig,
277
- elementFontStyle,
278
- fontStyle,
279
- builderData: pageTemplate,
280
- swr: {
281
- fallback
282
- },
283
- productOffers,
284
- dynamicDiscountOffer
285
- });
286
- } catch (err) {
287
- console.log('error', err);
288
- captureException(err);
289
- throw err;
290
- }
291
- };
292
-
293
- export { fetchLibraryTemplateDataByID, fetchPostPurchasePageDataByID, fetchSalePageDataByID, fetchShopLibraryPageDataByID, fetchThemePageDataByTemplateID, getPostPurchasePropsPreview, getRelevantPageData };
1
+ import{ThemePageDocument as e,StorePropertyDocument as r,SaleFunnelDiscountsDocument as a,SaleFunnelOfferDocument as t,LibraryTemplateDocument as l,LibrarySaleFunnelDocument as s,ShopLibraryPageDocument as o}from"@gem-sdk/core";import{captureException as i}from"@sentry/nextjs";import{getFontStyleFromPageTemplate as f,getFontFromGlobalStyle as n}from"../google-fonts.js";import{getFallbackV2 as d}from"../helpers/get-fallback.js";import{parseBuilderLibraryTemplate as u,parseShopLibraryPageTemplate as c,parseBuilderTemplateV2 as h}from"../helpers/normalize.js";import{usePagePreview as y}from"../hooks/usePagePreview.js";import{serializableJson as m}from"../helpers/parse-json.js";import{genCSS as D}from"../helpers/gen-css.js";let fetchSalePageDataByID=async(a,t)=>{let l={themePageId:a.themePageId,first:1,where:{default:!0}},[s,o]=await Promise.allSettled([t([e,l]),t([r])]);if("rejected"===s.status)throw Error(s.reason?.[0]);return{dataBuilder:s.value.themePage,pageStyle:s.value.themePage?.theme?.themeStyles?.edges?.[0]?.node?.data,storeProperty:o,dynamicDiscountOffer:void 0,productOffers:[]}},fetchPostPurchasePageDataByID=async(l,s)=>{let o={themePageId:l.themePageId,first:1,where:{default:!0}},[i,f,n,d]=await Promise.allSettled([s([e,o]),s([r]),s([a,{where:{saleFunnelOfferID:l.currentOfferID}}]),s([t,{saleFunnelOfferId:l.currentOfferID}])]);if("rejected"===i.status)throw Error(i.reason?.[0]);if("rejected"===n.status)throw Error(n.reason?.[0]);if("rejected"===d.status)throw Error(d.reason?.[0]);return{dataBuilder:i.value.themePage,pageStyle:i.value.themePage?.theme?.themeStyles?.edges?.[0]?.node?.data,storeProperty:f,dynamicDiscountOffer:d.value.saleFunnelOffer?.dynamicDiscounts?.[0],productOffers:n.value.saleFunnelDiscounts?.edges?.filter(e=>e?.node?.objectType==="PRODUCT"&&e?.node?.type==="ORDER_VALUE")||[]}},fetchThemePageDataByTemplateID=async(e,a)=>{let t={libraryTemplateId:e.libraryTemplateId},o=[],[i,f]=await Promise.allSettled([a([l,t]),a([r])]);if(e.currentOfferID){let[r]=await Promise.allSettled([a([s,{librarySaleFunnelId:e.librarySaleFunnelID}])]);if("rejected"===r.status)throw Error(r.reason?.[0]);let t=r.value.librarySaleFunnel?.offers?.find(r=>r?.id===e.currentOfferID);t&&(o=t.discounts?.filter(e=>e?.objectType==="PRODUCT"&&"ORDER_VALUE"===e.type).map(e=>({node:{...e}}))||[])}if("rejected"===i.status)throw Error(i.reason?.[0]);return{dataBuilder:i.value.libraryTemplate,pageStyle:void 0,storeProperty:f,dynamicDiscountOffer:void 0,productOffers:o}},fetchShopLibraryPageDataByID=async(e,l)=>{let s={shopLibraryPageId:e.shopLibraryPageId},[i,f,n,d]=await Promise.allSettled([l([o,s]),l([r]),l([a,{where:{saleFunnelOfferID:e.currentOfferID}}]),l([t,{saleFunnelOfferId:e.currentOfferID}])]);if("rejected"===i.status)throw Error(i.reason?.[0]);if("rejected"===n.status)throw Error(n.reason?.[0]);if("rejected"===d.status)throw Error(d.reason?.[0]);return{dataBuilder:i.value.shopLibraryPage,pageStyle:void 0,storeProperty:f,dynamicDiscountOffer:d.value.saleFunnelOffer?.dynamicDiscounts?.[0],productOffers:n.value.saleFunnelDiscounts?.edges?.filter(e=>e?.node?.objectType==="PRODUCT"&&e?.node?.type==="ORDER_VALUE")||[]}},fetchLibraryTemplateDataByID=async(e,s)=>{let o={libraryTemplateId:e.libraryTemplateId},[i,f,n,d]=await Promise.allSettled([s([l,o]),s([r]),s([a,{where:{saleFunnelOfferID:e.currentOfferID}}]),s([t,{saleFunnelOfferId:e.currentOfferID}])]);if("rejected"===i.status)throw Error(i.reason?.[0]);if("rejected"===n.status)throw Error(n.reason?.[0]);if("rejected"===d.status)throw Error(d.reason?.[0]);return{dataBuilder:i.value.libraryTemplate,pageStyle:void 0,storeProperty:f,dynamicDiscountOffer:d.value.saleFunnelOffer?.dynamicDiscounts?.[0],productOffers:n.value.saleFunnelDiscounts?.edges?.filter(e=>e?.node?.objectType==="PRODUCT"&&e?.node?.type==="ORDER_VALUE")||[]}},getRelevantPageData=async e=>{let{id:r,currentOfferID:a,fetcher:t,isLibraryTemplate:l,librarySaleFunnelID:s,isShopLibraryPage:o}=e;return s?await fetchThemePageDataByTemplateID({libraryTemplateId:r,currentOfferID:a,librarySaleFunnelID:s},t):o&&a?await fetchShopLibraryPageDataByID({shopLibraryPageId:r,currentOfferID:a},t):l&&a?await fetchLibraryTemplateDataByID({libraryTemplateId:r,currentOfferID:a},t):a?await fetchPostPurchasePageDataByID({themePageId:r,currentOfferID:a},t):await fetchSalePageDataByID({themePageId:r},t)},getPostPurchasePropsPreview=(e,r,a)=>async t=>{try{let{id:l,currentOfferID:s,isLibraryTemplate:o,isShopLibraryPage:i}=t,{dataBuilder:p,storeProperty:P,productOffers:g,pageStyle:I,dynamicDiscountOffer:w}=await getRelevantPageData({id:l,currentOfferID:s,fetcher:e,isLibraryTemplate:o,isShopLibraryPage:i,librarySaleFunnelID:r});if(!p)throw Error(`No data builder found for slug: /preview/${l}`);let O=r||o&&s?u(p):i?c(p):h(p),b=a||e,[v,T,j]=await Promise.all([f(O),n(I),d(b,O,!1)]),{seo:S,pageConfig:E}=y(p,P);return m({themeStyle:D(I),seo:S,...E,elementFontStyle:v,fontStyle:T,builderData:O,swr:{fallback:j},productOffers:g,dynamicDiscountOffer:w})}catch(e){throw console.log("error",e),i(e),e}};export{fetchLibraryTemplateDataByID,fetchPostPurchasePageDataByID,fetchSalePageDataByID,fetchShopLibraryPageDataByID,fetchThemePageDataByTemplateID,getPostPurchasePropsPreview,getRelevantPageData};
@@ -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,158 +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, extractPageBackground } 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', theme.reason, {
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;
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 ? `${languageIsoCode}-${countryIsoCode}` : null;
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
- pageBackground: extractPageBackground(dataBuilder),
150
- interaction: dataBuilder?.interaction
151
- });
152
- } catch (err) {
153
- captureException(err);
154
- throw err;
155
- }
156
- };
157
-
158
- 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};