cloudcommerce 2.13.1 → 2.14.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 (168) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/ecomplus-stores/barradoce/conf/firebase.json +1 -0
  3. package/ecomplus-stores/barradoce/functions/many/package.json +3 -3
  4. package/ecomplus-stores/barradoce/functions/ssr/content/extra-pages/promocoes.md +1 -1
  5. package/ecomplus-stores/barradoce/functions/ssr/package.json +6 -6
  6. package/ecomplus-stores/barradoce/functions/ssr/src/components/AccountMenu.vue +18 -15
  7. package/ecomplus-stores/barradoce/functions/ssr/src/components/AccountPage.vue +5 -5
  8. package/ecomplus-stores/barradoce/functions/ssr/src/components/LoginForm.vue +16 -10
  9. package/ecomplus-stores/barradoce/functions/ssr/src/components/ShopFooter.vue +1 -1
  10. package/ecomplus-stores/barradoce/functions/ssr/src/pages/sitemap-[index].xml.astro +75 -0
  11. package/ecomplus-stores/barradoce/functions/with-apps/package.json +3 -3
  12. package/ecomplus-stores/barradoce/package.json +2 -2
  13. package/package.json +2 -2
  14. package/packages/api/package.json +1 -1
  15. package/packages/apps/affiliate-program/package.json +1 -1
  16. package/packages/apps/correios/package.json +1 -1
  17. package/packages/apps/custom-payment/package.json +1 -1
  18. package/packages/apps/custom-shipping/package.json +1 -1
  19. package/packages/apps/datafrete/package.json +1 -1
  20. package/packages/apps/discounts/package.json +1 -1
  21. package/packages/apps/emails/package.json +1 -1
  22. package/packages/apps/fb-conversions/package.json +1 -1
  23. package/packages/apps/flash-courier/package.json +1 -1
  24. package/packages/apps/frenet/package.json +1 -1
  25. package/packages/apps/galaxpay/package.json +1 -1
  26. package/packages/apps/google-analytics/package.json +1 -1
  27. package/packages/apps/jadlog/package.json +1 -1
  28. package/packages/apps/loyalty-points/package.json +1 -1
  29. package/packages/apps/mandae/package.json +1 -1
  30. package/packages/apps/melhor-envio/package.json +1 -1
  31. package/packages/apps/mercadopago/package.json +1 -1
  32. package/packages/apps/pagaleve/package.json +1 -1
  33. package/packages/apps/pagarme/package.json +1 -1
  34. package/packages/apps/pagarme-v5/package.json +1 -1
  35. package/packages/apps/paghiper/package.json +1 -1
  36. package/packages/apps/pix/package.json +1 -1
  37. package/packages/apps/tiny-erp/package.json +1 -1
  38. package/packages/apps/webhooks/package.json +1 -1
  39. package/packages/cli/ci/bunny-config-base.sh +4 -6
  40. package/packages/cli/config/firebase.json +1 -1
  41. package/packages/cli/package.json +1 -1
  42. package/packages/config/package.json +1 -1
  43. package/packages/emails/package.json +1 -1
  44. package/packages/eslint/package.json +1 -1
  45. package/packages/events/package.json +1 -1
  46. package/packages/feeds/lib/firebase/render-catalog.js +272 -0
  47. package/packages/feeds/lib/firebase/render-catalog.js.map +1 -0
  48. package/packages/feeds/lib/firebase/render-sitemap.js +42 -0
  49. package/packages/feeds/lib/firebase/render-sitemap.js.map +1 -0
  50. package/packages/feeds/lib/firebase/serve-feeds.js +22 -270
  51. package/packages/feeds/lib/firebase/serve-feeds.js.map +1 -1
  52. package/packages/feeds/package.json +1 -1
  53. package/packages/feeds/src/firebase/render-catalog.ts +286 -0
  54. package/packages/feeds/src/firebase/render-sitemap.ts +46 -0
  55. package/packages/feeds/src/firebase/serve-feeds.ts +22 -283
  56. package/packages/firebase/package.json +1 -1
  57. package/packages/i18n/package.json +1 -1
  58. package/packages/modules/package.json +1 -1
  59. package/packages/passport/package.json +1 -1
  60. package/packages/ssr/package.json +1 -1
  61. package/packages/storefront/dist/client/_astro/{AccountPage.Cf0WE6GF.js → AccountPage.CKu0oakN.js} +1 -1
  62. package/packages/storefront/dist/client/_astro/{CartSidebar.DAvJKL2c.js → CartSidebar.Bxz7ZD9N.js} +1 -1
  63. package/packages/storefront/dist/client/_astro/{ProductDetails.BpZtnS8j.js → ProductDetails.PkZr50hA.js} +1 -1
  64. package/packages/storefront/dist/client/_astro/{ProductShelf.C0TU_sRb.js → ProductShelf.BKz6WXbp.js} +1 -1
  65. package/packages/storefront/dist/client/_astro/{SearchModal.DWNSfxML.js → SearchModal.BIrixnFb.js} +1 -1
  66. package/packages/storefront/dist/client/_astro/SearchShowcase.YMZqG8rj.js +1 -0
  67. package/packages/storefront/dist/client/_astro/ShopHeader.BOLegIRO.js +7 -0
  68. package/packages/storefront/dist/client/_astro/{_slug_.HhgCFKHv.css → _slug_.oAbCb631.css} +1 -1
  69. package/packages/storefront/dist/client/_astro/customer-session.B9MvrBAQ.js +7 -0
  70. package/packages/storefront/dist/client/_astro/ecom-icon.png +0 -0
  71. package/packages/storefront/dist/client/_astro/ecom-icon_12falx.png +0 -0
  72. package/packages/storefront/dist/client/_astro/ecom-icon_15pqnO.png +0 -0
  73. package/packages/storefront/dist/client/_astro/ecom-icon_t3guw.png +0 -0
  74. package/packages/storefront/dist/client/_astro/{firebase-app.CmI1zl7o.js → firebase-app.DPioxxma.js} +1 -1
  75. package/packages/storefront/dist/client/_astro/headphone.webp +0 -0
  76. package/packages/storefront/dist/client/_astro/headphone_T2Jjc.avif +0 -0
  77. package/packages/storefront/dist/client/_astro/headphone_Z1CG18r.webp +0 -0
  78. package/packages/storefront/dist/client/_astro/{hoisted.BeKMioW4.js → hoisted.8Sq2YuJM.js} +1 -1
  79. package/packages/storefront/dist/client/_astro/{hoisted.Bf1gCkSN.js → hoisted.BzVcl7We.js} +1 -1
  80. package/packages/storefront/dist/client/_astro/{hoisted.-C0vLMXT.js → hoisted.CPcG9RpX.js} +1 -1
  81. package/packages/storefront/dist/client/_astro/{index-a8cf6c8f.k99a-gIB.js → index-219c3cac.78peI8kt.js} +3 -3
  82. package/packages/storefront/dist/client/_astro/logo.png +0 -0
  83. package/packages/storefront/dist/client/_astro/logo_1UBsBq.webp +0 -0
  84. package/packages/storefront/dist/client/_astro/logo_Z1K5PE9.png +0 -0
  85. package/packages/storefront/dist/client/_astro/logo_Z1KIIl1.avif +0 -0
  86. package/packages/storefront/dist/client/_astro/passion.webp +0 -0
  87. package/packages/storefront/dist/client/_astro/passion_LHbe9.webp +0 -0
  88. package/packages/storefront/dist/client/_astro/passion_Z23MeUb.avif +0 -0
  89. package/packages/storefront/dist/client/_astro/rect8589.png +0 -0
  90. package/packages/storefront/dist/client/_astro/rect8589_1TtOHY.png +0 -0
  91. package/packages/storefront/dist/client/_astro/rect8589_1f5opX.webp +0 -0
  92. package/packages/storefront/dist/client/_astro/rect8589_IUskt.webp +0 -0
  93. package/packages/storefront/dist/client/_astro/rect8589_Uxfdf.png +0 -0
  94. package/packages/storefront/dist/client/_astro/rect8589_Z15uApA.png +0 -0
  95. package/packages/storefront/dist/client/_astro/rect8589_Z1Ap1Im.avif +0 -0
  96. package/packages/storefront/dist/client/_astro/rect8589_Z1JT1HB.webp +0 -0
  97. package/packages/storefront/dist/client/_astro/rect8589_ZY9mtN.avif +0 -0
  98. package/packages/storefront/dist/client/_astro/rect8589_tMFW0.avif +0 -0
  99. package/packages/storefront/dist/client/_astro/rect859.png +0 -0
  100. package/packages/storefront/dist/client/_astro/rect859_1TgQXS.avif +0 -0
  101. package/packages/storefront/dist/client/_astro/rect859_2Nm1z.avif +0 -0
  102. package/packages/storefront/dist/client/_astro/rect859_DIqwR.png +0 -0
  103. package/packages/storefront/dist/client/_astro/rect859_Z1IKDb2.png +0 -0
  104. package/packages/storefront/dist/client/_astro/rect859_Z29FI4V.webp +0 -0
  105. package/packages/storefront/dist/client/_astro/rect859_Z2kFHGk.avif +0 -0
  106. package/packages/storefront/dist/client/_astro/rect859_ZkpPFI.webp +0 -0
  107. package/packages/storefront/dist/client/_astro/rect859_jXzBi.png +0 -0
  108. package/packages/storefront/dist/client/_astro/rect859_x1l16.webp +0 -0
  109. package/packages/storefront/dist/client/_astro/rect89.webp +0 -0
  110. package/packages/storefront/dist/client/_astro/rect89_1TSfW7.avif +0 -0
  111. package/packages/storefront/dist/client/_astro/rect89_Z1re32x.webp +0 -0
  112. package/packages/storefront/dist/client/_astro/{shopping-cart.Cqc6p5UR.js → shopping-cart.D8fbm2Dv.js} +1 -1
  113. package/packages/storefront/dist/client/_astro/{use-analytics.bP3a5cR0.js → use-analytics.D_peWG3X.js} +1 -1
  114. package/packages/storefront/dist/client/_astro/{use-product-card.Cj9Q-Y1A.js → use-product-card.BCGHZKB5.js} +1 -1
  115. package/packages/storefront/dist/client/_astro/{use-text-value.DT0v9Yj_.js → use-text-value.BFLvKnYE.js} +1 -1
  116. package/packages/storefront/dist/client/assets/cvv.png +0 -0
  117. package/packages/storefront/dist/client/assets/payments.png +0 -0
  118. package/packages/storefront/dist/client/robots.txt +2 -0
  119. package/packages/storefront/dist/client/~fallback.html +112 -0
  120. package/packages/storefront/dist/client/~index.html +137 -0
  121. package/packages/storefront/dist/server/_astro-internal_middleware.mjs +2 -2
  122. package/packages/storefront/dist/server/chunks/404_BUZm2bP1.mjs +5 -0
  123. package/packages/storefront/dist/server/chunks/{CartSidebar_tmly-0ip.mjs → CartSidebar_kQSDOTj2.mjs} +2 -2
  124. package/packages/storefront/dist/server/chunks/{SearchModal_CGNQss2j.mjs → SearchModal_O1xTrm-9.mjs} +2 -2
  125. package/packages/storefront/dist/server/chunks/{_.._Bt6Uzpk2.mjs → _.._6Bd7O3FD.mjs} +1 -1
  126. package/packages/storefront/dist/server/chunks/{_astro-internal_middleware_CqUpziyW.mjs → _astro-internal_middleware_BnKXd-Ev.mjs} +1 -1
  127. package/packages/storefront/dist/server/chunks/{_page__Dz-iZHMh.mjs → _page__CXnal5Rn.mjs} +1 -1
  128. package/packages/storefront/dist/server/chunks/{account_tfs9KFTy.mjs → account_C6XTKIP9.mjs} +1 -1
  129. package/packages/storefront/dist/server/chunks/astro/{assets-service_DSoC_W52.mjs → assets-service_146xb0vN.mjs} +11 -67
  130. package/packages/storefront/dist/server/chunks/{astro_Cu3MZ9xv.mjs → astro_DIU6qHCh.mjs} +34 -79
  131. package/packages/storefront/dist/server/chunks/{index_CGzMgZTN.mjs → index_EbDDnIXs.mjs} +1 -1
  132. package/packages/storefront/dist/server/chunks/{index_BKS_40rA.mjs → index_STpvD2cy.mjs} +1 -1
  133. package/packages/storefront/dist/server/chunks/{node_lZaNT3E1.mjs → node_DHQVZgH_.mjs} +1 -1
  134. package/packages/storefront/dist/server/chunks/pages/{404_CMwuVMu1.mjs → 404_n3mvoSWv.mjs} +94 -1140
  135. package/packages/storefront/dist/server/chunks/pages/{__Dz53F-0T.mjs → __C9Nd4c7_.mjs} +11 -42
  136. package/packages/storefront/dist/server/chunks/pages/{_page__C1x19nYF.mjs → _page__BnXBvVvn.mjs} +4 -20
  137. package/packages/storefront/dist/server/chunks/pages/account_Dk-8R3rY.mjs +22 -0
  138. package/packages/storefront/dist/server/chunks/pages/{index_CqvjdvSg.mjs → index_us3QX6kE.mjs} +5 -22
  139. package/packages/storefront/dist/server/chunks/pages/node_BGdGQ52C.mjs +1864 -0
  140. package/packages/storefront/dist/server/chunks/pages/sitemap-_index__rcX10oKd.mjs +32 -0
  141. package/packages/storefront/dist/server/chunks/pages/~fallback_BNfV6ECv.mjs +22 -0
  142. package/packages/storefront/dist/server/chunks/sitemap-_index__e6mToVZH.mjs +5 -0
  143. package/packages/storefront/dist/server/chunks/{~fallback_CrFe__-f.mjs → ~fallback_Cg1Pbe1d.mjs} +1 -1
  144. package/packages/storefront/dist/server/entry.mjs +18 -17
  145. package/packages/storefront/dist/server/images.dist.csv +37 -0
  146. package/packages/storefront/dist/server/images.src.csv +13 -0
  147. package/packages/storefront/dist/server/manifest_xBcEm6Np.mjs +206 -0
  148. package/packages/storefront/dist/server/middleware.mjs +2 -2
  149. package/packages/storefront/dist/server/renderers.mjs +1 -1
  150. package/packages/storefront/dist/server/static-builds.csv +80 -0
  151. package/packages/storefront/package.json +1 -1
  152. package/packages/storefront/scripts/build-prod.sh +17 -0
  153. package/packages/storefront/src/lib/components/AccountLink.vue +16 -11
  154. package/packages/storefront/src/lib/components/globals/Skeleton.vue +6 -4
  155. package/packages/storefront/src/lib/composables/use-login-form.ts +6 -1
  156. package/packages/storefront/src/lib/scripts/vbeta-app.ts +11 -2
  157. package/packages/storefront/src/lib/state/customer-session.ts +8 -1
  158. package/packages/test-base/package.json +1 -1
  159. package/packages/types/package.json +1 -1
  160. package/packages/storefront/dist/client/_astro/SearchShowcase.CUkbXIRk.js +0 -1
  161. package/packages/storefront/dist/client/_astro/ShopHeader.D7qqQxFD.js +0 -7
  162. package/packages/storefront/dist/client/_astro/customer-session.Cctko5_9.js +0 -7
  163. package/packages/storefront/dist/client/assets/.gitkeep +0 -2
  164. package/packages/storefront/dist/server/chunks/404_BcY_5eJJ.mjs +0 -5
  165. package/packages/storefront/dist/server/chunks/pages/account_B5Z6wDBy.mjs +0 -32
  166. package/packages/storefront/dist/server/chunks/pages/node_mvX6Tssv.mjs +0 -879
  167. package/packages/storefront/dist/server/chunks/pages/~fallback_D2ugBVgc.mjs +0 -32
  168. package/packages/storefront/dist/server/manifest_D4v8KX-D.mjs +0 -206
@@ -1,6 +1,7 @@
1
1
  import { error } from 'firebase-functions/logger';
2
2
  import api from '@cloudcommerce/api';
3
- import config from '@cloudcommerce/firebase/lib/config';
3
+ import renderCatalog from './render-catalog.js';
4
+ import renderSitemap from './render-sitemap.js';
4
5
 
5
6
  const fetchProducts = async (page = 1) => {
6
7
  const limit = 300;
@@ -67,10 +68,6 @@ const serveFeeds = async (req, res) => {
67
68
  res.sendStatus(405);
68
69
  return;
69
70
  }
70
- if (url !== '/_feeds/catalog' && url !== '/catalog') {
71
- res.sendStatus(404);
72
- return;
73
- }
74
71
  try {
75
72
  await fetching;
76
73
  } catch (err) {
@@ -78,272 +75,27 @@ const serveFeeds = async (req, res) => {
78
75
  res.sendStatus(500);
79
76
  return;
80
77
  }
81
- const { storeId, settingsContent: { domain, name } } = config.get();
82
- const title = `Products feed - ${name}`;
83
- const isSkipVariations = !!req.query.skip_variations;
84
- const discount = Number(req.query.discount) || 0;
85
- let querystring = String(req.query.qs) || '?_=feed';
86
- if (querystring.charAt(0) !== '?') {
87
- querystring = `?${querystring}`;
78
+ res.set('Content-Type', 'application/xml; charset=UTF-8');
79
+ res.set('Cache-Control', 'public, max-age=600, s-maxage=120');
80
+ res.set('Content-Security-Policy', "default-src 'self'");
81
+ res.set('X-Content-Type-Options', 'nosniff');
82
+ res.set('X-XSS-Protection', '1; mode=block');
83
+ res.set('X-Frame-Options', 'DENY');
84
+ switch (url) {
85
+ case '/_feeds/catalog.xml':
86
+ case '/catalog.xml':
87
+ await renderCatalog(req, res, products);
88
+ break;
89
+ case '/sitemap-catalog.xml':
90
+ await renderSitemap(req, res, products);
91
+ break;
92
+ case '/sitemap':
93
+ case '/sitemap.xml':
94
+ res.redirect(302, '/sitemap-catalog.xml');
95
+ break;
96
+ default:
97
+ res.sendStatus(404);
88
98
  }
89
- let propsSet = {};
90
- if (typeof req.query.set_properties === 'string') {
91
- try {
92
- propsSet = JSON.parse(req.query.set_properties);
93
- if (typeof propsSet !== 'object' || !propsSet) {
94
- throw new Error('Invalid');
95
- }
96
- } catch {
97
- res.sendStatus(400);
98
- return;
99
- }
100
- }
101
- const isFacebook = (req.get('User-Agent') || '').includes('facebook');
102
- let xml = `
103
- <?xml version="1.0"?>
104
- <feed xmlns="http://www.w3.org/2005/Atom" xmlns:g="http://base.google.com/ns/1.0">
105
- <title><![CDATA[${title}]]></title>
106
- <link href="https://${domain}/" rel="alternate" type="text/html"/>
107
- <updated>${new Date().toISOString()}</updated>
108
- <id><![CDATA[#${storeId},${Math.random()}]]></id>
109
- <author>
110
- <name>e-com.plus Cloud Commerce</name>
111
- </author>`;
112
- const convertProduct = (p, groupId) => {
113
- if (p.name) {
114
- const entry = {
115
- id: p.sku || p._id,
116
- title: p.name,
117
- item_group_id: groupId,
118
- google_product_category: p.google_product_category_id,
119
- };
120
- if (p.short_description) {
121
- entry.description = p.short_description;
122
- } else if (p.body_html) {
123
- entry.description = p.body_html
124
- .replace(/<style\b[^>]*>.*?<\/style>/isg, '')
125
- .replace(/<[^>]+>/g, '')
126
- .replace(/&nbsp;/g, '');
127
- } else {
128
- entry.description = p.name;
129
- }
130
- if (p.slug) {
131
- entry.link = `https://${domain}/${p.slug}${querystring}`;
132
- if (groupId) entry.link += `&amp;var=${p._id}`;
133
- if (discount > 0) entry.link += `&amp;discount=${discount}`;
134
- }
135
- if ((p.quantity === undefined || p.quantity)
136
- && (!p.min_quantity || p.quantity >= p.min_quantity)) {
137
- entry.availability = 'in stock';
138
- } else {
139
- entry.availability = 'out of stock';
140
- }
141
- if (p.production_time?.days) {
142
- entry.min_handling_time = p.production_time.days;
143
- if (p.production_time.max_time) {
144
- entry.max_handling_time = p.production_time.max_time;
145
- }
146
- }
147
- if (p.pictures?.length) {
148
- const additionalImages = [];
149
- for (let i = 0; i < p.pictures.length && i < 10; i++) {
150
- const picture = p.pictures[i];
151
- let img = picture.zoom?.url || picture.big?.url || picture.normal?.url;
152
- if (img) {
153
- img = img.replace(/(\w+\.)?(ecoms\d)\.com/i, '$2-nyc3.nyc3.cdn.digitaloceanspaces.com');
154
- if (!entry.image_link) {
155
- entry.image_link = img;
156
- } else {
157
- additionalImages.push(img);
158
- }
159
- }
160
- }
161
- if (additionalImages.length) {
162
- entry.additional_image_link = additionalImages;
163
- }
164
- }
165
- if (p.price) {
166
- if (p.base_price && p.base_price > p.price) {
167
- entry.price = `${p.base_price} ${p.currency_id}`;
168
- entry.sale_price = (p.price * (1 - discount)).toFixed(2) + ` ${p.currency_id}`;
169
- } else {
170
- entry.price = (p.price * (1 - discount)).toFixed(2) + ` ${p.currency_id}`;
171
- }
172
- }
173
- if (p.category_tree) {
174
- entry.product_type = p.category_tree;
175
- } else if (p.categories?.length) {
176
- entry.product_type = p.categories[0].name;
177
- }
178
- let isIdentifierExists = false;
179
- if (p.brands?.length) {
180
- isIdentifierExists = true;
181
- entry.brand = p.brands[0].name;
182
- }
183
- ['gtin', 'mpn'].forEach((field) => {
184
- const codes = p[field];
185
- if (Array.isArray(codes) && codes.length) {
186
- entry[field] = codes[0];
187
- isIdentifierExists = true;
188
- }
189
- });
190
- entry.identifier_exists = isIdentifierExists ? 'yes' : 'no';
191
- if (p.adult) {
192
- entry.adult = 'yes';
193
- }
194
- if (p.condition) {
195
- entry.condition = p.condition !== 'not_specified' ? p.condition : 'new';
196
- }
197
- if (p.weight) {
198
- entry.shipping_weight = `${p.weight.value} ${p.weight.unit || ''}`;
199
- }
200
- if (p.dimensions && !isFacebook) {
201
- ['length', 'width', 'height'].forEach((side) => {
202
- const dimension = p.dimensions[side];
203
- if (dimension) {
204
- entry[`shipping_${side}`] = `${dimension.value} ${dimension.unit || ''}`;
205
- }
206
- });
207
- }
208
- if (p.specifications) {
209
- let customLabel = 0;
210
- Object.keys(p.specifications).forEach((spec) => {
211
- const values = p.specifications[spec];
212
- if (!values.length) return;
213
- const [val] = values;
214
- /* eslint-disable no-case-declarations */
215
- switch (spec) {
216
- case 'energy_efficiency_class':
217
- case 'age_group':
218
- case 'gender':
219
- case 'size_type':
220
- case 'size_system':
221
- entry[spec] = val.value || val.text;
222
- break;
223
- case 'size':
224
- case 'pattern':
225
- case 'material':
226
- entry[spec] = val.text;
227
- break;
228
- case 'colors':
229
- case 'color':
230
- case 'cor':
231
- case 'cores':
232
- let colors = val.text.replace(/[/]/g, ' ');
233
- for (let i = 1; i < values.length; i++) {
234
- colors += `/${values[i].text.replace(/[/]/g, ' ')}`;
235
- }
236
- entry.color = colors;
237
- break;
238
- default:
239
- let commonSpec = null;
240
- let fixedText = val.value || val.text;
241
- switch (fixedText.toLowerCase()) {
242
- case 'm':
243
- case 'l':
244
- case 'g':
245
- case 's':
246
- case 'p':
247
- case 'xs':
248
- case 'pp':
249
- case 'xl':
250
- case 'gg':
251
- case 'xxl':
252
- case 'xg':
253
- case 'u':
254
- case 'Único':
255
- case 'unico':
256
- commonSpec = 'size';
257
- break;
258
- case 'adult':
259
- case 'adulto':
260
- case 'kids':
261
- case 'criança':
262
- case 'infant':
263
- case 'infantil':
264
- case 'newborn':
265
- case 'recém-nascido':
266
- case 'toddler':
267
- commonSpec = 'age_group';
268
- break;
269
- case 'male':
270
- case 'masculino':
271
- case 'female':
272
- case 'feminino':
273
- case 'unisex':
274
- commonSpec = 'gender';
275
- break;
276
- case 'homem':
277
- commonSpec = 'gender';
278
- fixedText = 'male';
279
- break;
280
- case 'mulher':
281
- commonSpec = 'gender';
282
- fixedText = 'female';
283
- break;
284
- default:
285
- if (customLabel < 5) {
286
- entry[`custom_label_${customLabel}`] = val.text;
287
- customLabel += 1;
288
- }
289
- break;
290
- }
291
- if (commonSpec !== null && !entry[commonSpec]) {
292
- entry[commonSpec] = fixedText;
293
- }
294
- break;
295
- }
296
- });
297
- }
298
- Object.keys(propsSet).forEach((key) => {
299
- entry[key] = propsSet[key];
300
- });
301
- xml += `
302
- <entry>`;
303
- Object.keys(entry).forEach((key) => {
304
- const val = entry[key];
305
- if (val === undefined || val === null) return;
306
- if (typeof val === 'object' && val) {
307
- Object.keys(entry).forEach((nKey) => {
308
- const nested = val[nKey];
309
- xml += `<g:${key}><![CDATA[${nested}]]></g:${key}>`;
310
- });
311
- return;
312
- }
313
- if (key === 'link') {
314
- xml += `<g:${key}><!--${p._id}-->${val}</g:${key}>`;
315
- return;
316
- }
317
- xml += `<g:${key}><![CDATA[${val}]]></g:${key}>`;
318
- });
319
- xml += `
320
- </entry>`;
321
- if (p.variations && !isSkipVariations) {
322
- p.variations.forEach((variation) => {
323
- const mergedItem = { ...p, ...variation };
324
- if (p.specifications) {
325
- mergedItem.specifications = {
326
- ...p.specifications,
327
- ...variation.specifications,
328
- };
329
- }
330
- if (!variation.sku && p.sku) {
331
- mergedItem.sku = `${p.sku}-${Math.ceil(Math.random() * 1000)}`;
332
- }
333
- if (variation.picture_id && p.pictures) {
334
- const picture = p.pictures.find(({ _id }) => _id === variation.picture_id);
335
- if (picture) mergedItem.pictures = [picture];
336
- }
337
- delete mergedItem.variations;
338
- convertProduct(mergedItem, entry.id);
339
- });
340
- }
341
- }
342
- };
343
- products.forEach((p) => convertProduct(p));
344
- xml += `
345
- </feed>`;
346
- res.send(xml);
347
99
  };
348
100
 
349
101
  export default serveFeeds;
@@ -1 +1 @@
1
- {"version":3,"file":"serve-feeds.js","sourceRoot":"","sources":["../../src/firebase/serve-feeds.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"serve-feeds.js","sourceRoot":"","sources":["../../src/firebase/serve-feeds.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@cloudcommerce/feeds",
3
3
  "type": "module",
4
- "version": "2.13.1",
4
+ "version": "2.14.0",
5
5
  "description": "e-com.plus Cloud Commerce catalog feeds",
6
6
  "main": "lib/index.js",
7
7
  "exports": {
@@ -0,0 +1,286 @@
1
+ import type { Request, Response } from 'firebase-functions';
2
+ import type { FeedProducts } from './serve-feeds';
3
+ import config from '@cloudcommerce/firebase/lib/config';
4
+
5
+ const renderCatalog = async (req: Request, res: Response, products: FeedProducts) => {
6
+ const {
7
+ storeId,
8
+ settingsContent: { domain, name },
9
+ } = config.get();
10
+ const title = `Products feed - ${name}`;
11
+ const isSkipVariations = !!req.query.skip_variations;
12
+ const discount = Number(req.query.discount) || 0;
13
+ let querystring = req.query.qs ? String(req.query.qs) : '?_=feed';
14
+ if (querystring.charAt(0) !== '?') {
15
+ querystring = `?${querystring}`;
16
+ }
17
+ let propsSet: Record<string, any> = {};
18
+ if (typeof req.query.set_properties === 'string') {
19
+ try {
20
+ propsSet = JSON.parse(req.query.set_properties);
21
+ if (typeof propsSet !== 'object' || !propsSet) {
22
+ throw new Error('Invalid');
23
+ }
24
+ } catch {
25
+ res.sendStatus(400);
26
+ return;
27
+ }
28
+ }
29
+ const isFacebook = (req.get('User-Agent') || '').includes('facebook');
30
+
31
+ let xml = `<?xml version="1.0"?>
32
+ <feed xmlns="http://www.w3.org/2005/Atom" xmlns:g="http://base.google.com/ns/1.0">
33
+ <title><![CDATA[${title}]]></title>
34
+ <link href="https://${domain}/" rel="alternate" type="text/html"/>
35
+ <updated>${new Date().toISOString()}</updated>
36
+ <id><![CDATA[#${storeId},${Math.random()}]]></id>
37
+ <author>
38
+ <name>e-com.plus Cloud Commerce</name>
39
+ </author>`;
40
+
41
+ const convertProduct = (p: (typeof products)[0], groupId?: string) => {
42
+ if (p.name) {
43
+ const entry: Record<string, any> = {
44
+ id: p.sku || p._id,
45
+ title: p.name,
46
+ item_group_id: groupId,
47
+ google_product_category: p.google_product_category_id,
48
+ };
49
+ if (p.short_description) {
50
+ entry.description = p.short_description;
51
+ } else if (p.body_html) {
52
+ entry.description = p.body_html
53
+ .replace(/<style\b[^>]*>.*?<\/style>/isg, '')
54
+ .replace(/<[^>]+>/g, '')
55
+ .replace(/&nbsp;/g, '');
56
+ } else {
57
+ entry.description = p.name;
58
+ }
59
+ if (p.slug) {
60
+ entry.link = `https://${domain}/${p.slug}${querystring}`;
61
+ if (groupId) entry.link += `&amp;var=${p._id}`;
62
+ if (discount > 0) entry.link += `&amp;discount=${discount}`;
63
+ }
64
+ if (
65
+ (p.quantity === undefined || p.quantity)
66
+ && (!p.min_quantity || p.quantity! >= p.min_quantity)
67
+ ) {
68
+ entry.availability = 'in stock';
69
+ } else {
70
+ entry.availability = 'out of stock';
71
+ }
72
+ if (p.production_time?.days) {
73
+ entry.min_handling_time = p.production_time.days;
74
+ if (p.production_time.max_time) {
75
+ entry.max_handling_time = p.production_time.max_time;
76
+ }
77
+ }
78
+ if (p.pictures?.length) {
79
+ const additionalImages: string[] = [];
80
+ for (let i = 0; i < p.pictures.length && i < 10; i++) {
81
+ const picture = p.pictures[i];
82
+ let img = picture.zoom?.url || picture.big?.url || picture.normal?.url;
83
+ if (img) {
84
+ img = img.replace(
85
+ /(\w+\.)?(ecoms\d)\.com/i,
86
+ '$2-nyc3.nyc3.cdn.digitaloceanspaces.com',
87
+ );
88
+ if (!entry.image_link) {
89
+ entry.image_link = img;
90
+ } else {
91
+ additionalImages.push(img);
92
+ }
93
+ }
94
+ }
95
+ if (additionalImages.length) {
96
+ entry.additional_image_link = additionalImages;
97
+ }
98
+ }
99
+ if (p.price) {
100
+ if (p.base_price && p.base_price > p.price) {
101
+ entry.price = `${p.base_price} ${p.currency_id}`;
102
+ entry.sale_price = (p.price * (1 - discount)).toFixed(2) + ` ${p.currency_id}`;
103
+ } else {
104
+ entry.price = (p.price * (1 - discount)).toFixed(2) + ` ${p.currency_id}`;
105
+ }
106
+ }
107
+ if (p.category_tree) {
108
+ entry.product_type = p.category_tree;
109
+ } else if (p.categories?.length) {
110
+ entry.product_type = p.categories[0].name;
111
+ }
112
+ let isIdentifierExists = false;
113
+ if (p.brands?.length) {
114
+ isIdentifierExists = true;
115
+ entry.brand = p.brands[0].name;
116
+ }
117
+ (['gtin', 'mpn'] as const).forEach((field) => {
118
+ const codes = p[field];
119
+ if (Array.isArray(codes) && codes.length) {
120
+ entry[field] = codes[0];
121
+ isIdentifierExists = true;
122
+ }
123
+ });
124
+ entry.identifier_exists = isIdentifierExists ? 'yes' : 'no';
125
+ if (p.adult) {
126
+ entry.adult = 'yes';
127
+ }
128
+ if (p.condition) {
129
+ entry.condition = p.condition !== 'not_specified' ? p.condition : 'new';
130
+ }
131
+ if (p.weight) {
132
+ entry.shipping_weight = `${p.weight.value} ${p.weight.unit || ''}`;
133
+ }
134
+ if (p.dimensions && !isFacebook) {
135
+ (['length', 'width', 'height'] as const).forEach((side) => {
136
+ const dimension = p.dimensions![side];
137
+ if (dimension) {
138
+ entry[`shipping_${side}`] = `${dimension.value} ${dimension.unit || ''}`;
139
+ }
140
+ });
141
+ }
142
+ if (p.specifications) {
143
+ let customLabel = 0;
144
+ Object.keys(p.specifications).forEach((spec) => {
145
+ const values = p.specifications![spec];
146
+ if (!values.length) return;
147
+ const [val] = values;
148
+ /* eslint-disable no-case-declarations */
149
+ switch (spec) {
150
+ case 'energy_efficiency_class':
151
+ case 'age_group':
152
+ case 'gender':
153
+ case 'size_type':
154
+ case 'size_system':
155
+ entry[spec] = val.value || val.text;
156
+ break;
157
+ case 'size':
158
+ case 'pattern':
159
+ case 'material':
160
+ entry[spec] = val.text;
161
+ break;
162
+ case 'colors':
163
+ case 'color':
164
+ case 'cor':
165
+ case 'cores':
166
+ let colors = val.text.replace(/[/]/g, ' ');
167
+ for (let i = 1; i < values.length; i++) {
168
+ colors += `/${values[i].text.replace(/[/]/g, ' ')}`;
169
+ }
170
+ entry.color = colors;
171
+ break;
172
+ default:
173
+ let commonSpec: string | null = null;
174
+ let fixedText = val.value || val.text;
175
+ switch (fixedText.toLowerCase()) {
176
+ case 'm':
177
+ case 'l':
178
+ case 'g':
179
+ case 's':
180
+ case 'p':
181
+ case 'xs':
182
+ case 'pp':
183
+ case 'xl':
184
+ case 'gg':
185
+ case 'xxl':
186
+ case 'xg':
187
+ case 'u':
188
+ case 'Único':
189
+ case 'unico':
190
+ commonSpec = 'size';
191
+ break;
192
+ case 'adult':
193
+ case 'adulto':
194
+ case 'kids':
195
+ case 'criança':
196
+ case 'infant':
197
+ case 'infantil':
198
+ case 'newborn':
199
+ case 'recém-nascido':
200
+ case 'toddler':
201
+ commonSpec = 'age_group';
202
+ break;
203
+ case 'male':
204
+ case 'masculino':
205
+ case 'female':
206
+ case 'feminino':
207
+ case 'unisex':
208
+ commonSpec = 'gender';
209
+ break;
210
+ case 'homem':
211
+ commonSpec = 'gender';
212
+ fixedText = 'male';
213
+ break;
214
+ case 'mulher':
215
+ commonSpec = 'gender';
216
+ fixedText = 'female';
217
+ break;
218
+ default:
219
+ if (customLabel < 5) {
220
+ entry[`custom_label_${customLabel}`] = val.text;
221
+ customLabel += 1;
222
+ }
223
+ break;
224
+ }
225
+ if (commonSpec !== null && !entry[commonSpec]) {
226
+ entry[commonSpec] = fixedText;
227
+ }
228
+ break;
229
+ }
230
+ });
231
+ }
232
+ Object.keys(propsSet).forEach((key) => {
233
+ entry[key] = propsSet[key];
234
+ });
235
+
236
+ xml += `
237
+ <entry>`;
238
+ Object.keys(entry).forEach((key) => {
239
+ const val = entry[key];
240
+ if (val === undefined || val === null) return;
241
+ if (typeof val === 'object' && val) {
242
+ Object.keys(entry).forEach((nKey) => {
243
+ const nested = val[nKey];
244
+ xml += `<g:${key}><![CDATA[${nested}]]></g:${key}>`;
245
+ });
246
+ return;
247
+ }
248
+ if (key === 'link') {
249
+ xml += `<g:${key}><!--${p._id}-->${val}</g:${key}>`;
250
+ return;
251
+ }
252
+ xml += `<g:${key}><![CDATA[${val}]]></g:${key}>`;
253
+ });
254
+ xml += `
255
+ </entry>`;
256
+
257
+ if (p.variations && !isSkipVariations) {
258
+ p.variations.forEach((variation) => {
259
+ const mergedItem = { ...p, ...variation };
260
+ if (p.specifications) {
261
+ mergedItem.specifications = {
262
+ ...p.specifications,
263
+ ...variation.specifications,
264
+ };
265
+ }
266
+ if (!variation.sku && p.sku) {
267
+ mergedItem.sku = `${p.sku}-${Math.ceil(Math.random() * 1000)}`;
268
+ }
269
+ if (variation.picture_id && p.pictures) {
270
+ const picture = p.pictures.find(({ _id }) => _id === variation.picture_id);
271
+ if (picture) mergedItem.pictures = [picture];
272
+ }
273
+ delete mergedItem.variations;
274
+ convertProduct(mergedItem as any, entry.id);
275
+ });
276
+ }
277
+ }
278
+ };
279
+
280
+ products.forEach((p) => convertProduct(p));
281
+ xml += `
282
+ </feed>`;
283
+ res.send(xml);
284
+ };
285
+
286
+ export default renderCatalog;
@@ -0,0 +1,46 @@
1
+ import type { Request, Response } from 'firebase-functions';
2
+ import type { FeedProducts } from './serve-feeds';
3
+ import api from '@cloudcommerce/api';
4
+ import config from '@cloudcommerce/firebase/lib/config';
5
+
6
+ const renderSitemap = async (req: Request, res: Response, products: FeedProducts) => {
7
+ const {
8
+ settingsContent: { domain },
9
+ } = config.get();
10
+ const fetchingCategories = api.get('categories', {
11
+ limit: 3000,
12
+ fields: ['slug'] as const,
13
+ });
14
+ const fetchingBrands = api.get('brands', {
15
+ limit: 3000,
16
+ fields: ['slug'] as const,
17
+ });
18
+ const { data: { result: categories } } = await fetchingCategories;
19
+ const { data: { result: brands } } = await fetchingBrands;
20
+
21
+ let xml = `<?xml version="1.0" encoding="UTF-8"?>
22
+ <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">`;
23
+ [...categories, ...brands].forEach(({ slug }) => {
24
+ if (!slug) return;
25
+ xml += `
26
+ <url>
27
+ <loc>https://${domain}/${slug}</loc>
28
+ <changefreq>weekly</changefreq>
29
+ <priority>0.8</priority>
30
+ </url>`;
31
+ });
32
+ products.forEach(({ slug }) => {
33
+ if (!slug) return;
34
+ xml += `
35
+ <url>
36
+ <loc>https://${domain}/${slug}</loc>
37
+ <changefreq>weekly</changefreq>
38
+ <priority>0.9</priority>
39
+ </url>`;
40
+ });
41
+ xml += `
42
+ </urlset>`;
43
+ res.send(xml);
44
+ };
45
+
46
+ export default renderSitemap;