cloudcommerce 0.16.4 → 0.18.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 (145) hide show
  1. package/.vscode/settings.json +2 -1
  2. package/CHANGELOG.md +41 -0
  3. package/package.json +1 -1
  4. package/packages/api/package.json +1 -1
  5. package/packages/apps/affilate-program/package.json +1 -1
  6. package/packages/apps/correios/package.json +1 -1
  7. package/packages/apps/custom-payment/package.json +1 -1
  8. package/packages/apps/custom-shipping/package.json +1 -1
  9. package/packages/apps/datafrete/package.json +1 -1
  10. package/packages/apps/discounts/package.json +1 -1
  11. package/packages/apps/emails/package.json +1 -1
  12. package/packages/apps/fb-conversions/package.json +1 -1
  13. package/packages/apps/flash-courier/package.json +1 -1
  14. package/packages/apps/frenet/package.json +1 -1
  15. package/packages/apps/galaxpay/package.json +1 -1
  16. package/packages/apps/google-analytics/package.json +1 -1
  17. package/packages/apps/jadlog/package.json +1 -1
  18. package/packages/apps/loyalty-points/package.json +1 -1
  19. package/packages/apps/melhor-envio/package.json +1 -1
  20. package/packages/apps/mercadopago/package.json +1 -1
  21. package/packages/apps/pagarme/package.json +1 -1
  22. package/packages/apps/paghiper/package.json +1 -1
  23. package/packages/apps/pix/package.json +1 -1
  24. package/packages/apps/tiny-erp/package.json +1 -1
  25. package/packages/apps/webhooks/package.json +1 -1
  26. package/packages/cli/package.json +1 -1
  27. package/packages/config/package.json +1 -1
  28. package/packages/emails/package.json +1 -1
  29. package/packages/events/lib/firebase.js +0 -2
  30. package/packages/events/lib/firebase.js.map +1 -1
  31. package/packages/events/package.json +1 -2
  32. package/packages/events/src/firebase.ts +0 -2
  33. package/packages/feeds/package.json +1 -1
  34. package/packages/firebase/lib/config.d.ts +0 -3
  35. package/packages/firebase/lib/config.js +0 -3
  36. package/packages/firebase/lib/config.js.map +1 -1
  37. package/packages/firebase/package.json +1 -1
  38. package/packages/firebase/src/config.ts +0 -3
  39. package/packages/i18n/package.json +1 -1
  40. package/packages/modules/lib/firebase/call-app-module.js +0 -12
  41. package/packages/modules/lib/firebase/call-app-module.js.map +1 -1
  42. package/packages/modules/package.json +1 -2
  43. package/packages/modules/src/firebase/call-app-module.ts +0 -12
  44. package/packages/passport/package.json +1 -1
  45. package/packages/ssr/lib/firebase/serve-storefront.js +144 -45
  46. package/packages/ssr/lib/firebase/serve-storefront.js.map +1 -1
  47. package/packages/ssr/package.json +1 -1
  48. package/packages/ssr/src/firebase/serve-storefront.ts +153 -49
  49. package/packages/storefront/.eslintrc.cjs +1 -0
  50. package/packages/storefront/dist/client/_astro/{Carousel.f39be3c0.js → Carousel.533b4b19.js} +1 -1
  51. package/packages/storefront/dist/client/_astro/HeroSlider.359c76cc.js +1 -0
  52. package/packages/storefront/dist/client/_astro/PitchBar.75d2999f.js +1 -0
  53. package/packages/storefront/dist/client/_astro/Prices.bd0d3474.js +1 -0
  54. package/packages/storefront/dist/client/_astro/ProductShelf.83c66e3e.js +1 -0
  55. package/packages/storefront/dist/client/_astro/ShopHeader.f66a56cb.js +4 -0
  56. package/packages/storefront/dist/client/_astro/_...slug_.b19aabfc.css +1 -0
  57. package/packages/storefront/dist/client/_astro/_plugin-vue_export-helper.4e6dc3af.js +1 -0
  58. package/packages/storefront/dist/client/_astro/client.24201f93.js +1 -0
  59. package/packages/storefront/dist/client/_astro/{img.517fec8e.js → img.22ad29ec.js} +1 -1
  60. package/packages/storefront/dist/client/_astro/{index.33347cbd.js → index.ddc27a3a.js} +1 -1
  61. package/packages/storefront/dist/client/_astro/modules-info.d6bd555b.js +1 -0
  62. package/packages/storefront/dist/client/_astro/{runtime-dom.esm-bundler.00b967e0.js → runtime-dom.esm-bundler.578d6e91.js} +1 -1
  63. package/packages/storefront/dist/client/sw.js +1 -1
  64. package/packages/storefront/dist/server/chunks/{_...06f412d0.mjs → _...ed1d4ed7.mjs} +2 -2
  65. package/packages/storefront/dist/server/chunks/{account@_@astro.d58b2d34.mjs → account@_@astro.97e06bd2.mjs} +1 -1
  66. package/packages/storefront/dist/server/chunks/{endpoint@_@js.ce919661.mjs → endpoint@_@js.e9171d18.mjs} +2 -2
  67. package/packages/storefront/dist/server/chunks/{fallback@_@astro.6c7c4acd.mjs → fallback@_@astro.4a1f8c08.mjs} +2 -2
  68. package/packages/storefront/dist/server/chunks/{index@_@astro.f7e2409d.mjs → index@_@astro.7472fe37.mjs} +2 -2
  69. package/packages/storefront/dist/server/chunks/{index@_@astro.8e359cb4.mjs → index@_@astro.de13f221.mjs} +2 -2
  70. package/packages/storefront/dist/server/chunks/pages/{_...slug_.astro.f0a57b8d.mjs → _...slug_.astro.9e731356.mjs} +279 -133
  71. package/packages/storefront/dist/server/chunks/pages/{endpoint.js.1d889b2f.mjs → endpoint.js.96a9b7f9.mjs} +1 -1
  72. package/packages/storefront/dist/server/chunks/pages/{fallback.astro.42f81a9a.mjs → fallback.astro.3ebb4e85.mjs} +3 -2
  73. package/packages/storefront/dist/server/chunks/pages/{index.astro.533679e1.mjs → index.astro.8d786fcb.mjs} +27 -25
  74. package/packages/storefront/dist/server/entry.mjs +8 -8
  75. package/packages/storefront/dist/server/renderers.mjs +4 -3
  76. package/packages/storefront/package.json +1 -1
  77. package/packages/storefront/src/lib/components/Drawer.vue +6 -2
  78. package/packages/storefront/src/lib/components/globals/AImg.vue +2 -1
  79. package/packages/storefront/src/lib/composables/use-prices.ts +10 -8
  80. package/packages/storefront/src/lib/composables/use-product-card.ts +15 -15
  81. package/packages/storefront/src/lib/layouts/BaseBody.astro +3 -3
  82. package/packages/storefront/src/lib/layouts/main/use-page-sections.ts +5 -0
  83. package/packages/storefront/src/lib/layouts/{use-page-layout.ts → use-page-header.ts} +24 -4
  84. package/packages/storefront/src/lib/ssr-context.ts +1 -1
  85. package/packages/storefront/src/lib/state/modules-info.ts +25 -0
  86. package/packages/storefront/src/lib/state/shopping-cart.ts +6 -0
  87. package/packages/types/package.json +1 -1
  88. package/packages/apps/infinitepay/CHANGELOG.md +0 -1
  89. package/packages/apps/infinitepay/README.md +0 -1
  90. package/packages/apps/infinitepay/assets/onload-expression.js +0 -57
  91. package/packages/apps/infinitepay/lib/functions-lib/add-installments.d.ts +0 -55
  92. package/packages/apps/infinitepay/lib/functions-lib/add-installments.js +0 -63
  93. package/packages/apps/infinitepay/lib/functions-lib/add-installments.js.map +0 -1
  94. package/packages/apps/infinitepay/lib/functions-lib/ip-auth/create-access.d.ts +0 -14
  95. package/packages/apps/infinitepay/lib/functions-lib/ip-auth/create-access.js +0 -67
  96. package/packages/apps/infinitepay/lib/functions-lib/ip-auth/create-access.js.map +0 -1
  97. package/packages/apps/infinitepay/lib/functions-lib/ip-auth/create-axios.d.ts +0 -2
  98. package/packages/apps/infinitepay/lib/functions-lib/ip-auth/create-axios.js +0 -19
  99. package/packages/apps/infinitepay/lib/functions-lib/ip-auth/create-axios.js.map +0 -1
  100. package/packages/apps/infinitepay/lib/functions-lib/ip-auth/oauth.d.ts +0 -2
  101. package/packages/apps/infinitepay/lib/functions-lib/ip-auth/oauth.js +0 -25
  102. package/packages/apps/infinitepay/lib/functions-lib/ip-auth/oauth.js.map +0 -1
  103. package/packages/apps/infinitepay/lib/functions-lib/utils.d.ts +0 -8
  104. package/packages/apps/infinitepay/lib/functions-lib/utils.js +0 -17
  105. package/packages/apps/infinitepay/lib/functions-lib/utils.js.map +0 -1
  106. package/packages/apps/infinitepay/lib/index.d.ts +0 -1
  107. package/packages/apps/infinitepay/lib/index.js +0 -3
  108. package/packages/apps/infinitepay/lib/index.js.map +0 -1
  109. package/packages/apps/infinitepay/lib/infinitepay.d.ts +0 -80
  110. package/packages/apps/infinitepay/lib/infinitepay.js +0 -12
  111. package/packages/apps/infinitepay/lib/infinitepay.js.map +0 -1
  112. package/packages/apps/infinitepay/lib/ip-create-transaction.d.ts +0 -75
  113. package/packages/apps/infinitepay/lib/ip-create-transaction.js +0 -324
  114. package/packages/apps/infinitepay/lib/ip-create-transaction.js.map +0 -1
  115. package/packages/apps/infinitepay/lib/ip-list-payments.d.ts +0 -7
  116. package/packages/apps/infinitepay/lib/ip-list-payments.js +0 -146
  117. package/packages/apps/infinitepay/lib/ip-list-payments.js.map +0 -1
  118. package/packages/apps/infinitepay/lib/ip-webhook.d.ts +0 -5
  119. package/packages/apps/infinitepay/lib/ip-webhook.js +0 -152
  120. package/packages/apps/infinitepay/lib/ip-webhook.js.map +0 -1
  121. package/packages/apps/infinitepay/package.json +0 -38
  122. package/packages/apps/infinitepay/scripts/build.sh +0 -4
  123. package/packages/apps/infinitepay/src/functions-lib/add-installments.ts +0 -78
  124. package/packages/apps/infinitepay/src/functions-lib/ip-auth/create-access.ts +0 -89
  125. package/packages/apps/infinitepay/src/functions-lib/ip-auth/create-axios.ts +0 -20
  126. package/packages/apps/infinitepay/src/functions-lib/ip-auth/oauth.ts +0 -30
  127. package/packages/apps/infinitepay/src/functions-lib/utils.ts +0 -23
  128. package/packages/apps/infinitepay/src/index.ts +0 -2
  129. package/packages/apps/infinitepay/src/infinitepay.ts +0 -12
  130. package/packages/apps/infinitepay/src/ip-create-transaction.ts +0 -441
  131. package/packages/apps/infinitepay/src/ip-list-payments.ts +0 -178
  132. package/packages/apps/infinitepay/src/ip-webhook.ts +0 -183
  133. package/packages/apps/infinitepay/tsconfig.json +0 -6
  134. package/packages/apps/infinitepay/webhook.js +0 -1
  135. package/packages/storefront/dist/client/_astro/HeroSlider.3d4a1d1c.js +0 -1
  136. package/packages/storefront/dist/client/_astro/PitchBar.c53e6d0b.js +0 -1
  137. package/packages/storefront/dist/client/_astro/Prices.de6df3cb.js +0 -1
  138. package/packages/storefront/dist/client/_astro/ProductShelf.f013b3ee.js +0 -1
  139. package/packages/storefront/dist/client/_astro/ShopHeader.c0ba5061.js +0 -4
  140. package/packages/storefront/dist/client/_astro/_...slug_.45bc69ca.css +0 -1
  141. package/packages/storefront/dist/client/_astro/_plugin-vue_export-helper.d3aaeb0d.js +0 -1
  142. package/packages/storefront/dist/client/_astro/client.2d950540.js +0 -1
  143. package/packages/storefront/dist/client/_astro/format-money.3b884fcb.js +0 -1
  144. package/packages/storefront/dist/client/_astro/idle-callback.889bf0ea.js +0 -1
  145. package/packages/storefront/dist/client/_astro/modules-info.ad27b027.js +0 -1
@@ -3,21 +3,103 @@ import { readFile } from 'node:fs/promises';
3
3
  import { getFirestore, Timestamp } from 'firebase-admin/firestore';
4
4
  import logger from 'firebase-functions/logger';
5
5
 
6
- const { STOREFRONT_BASE_DIR, SSR_CACHE_MAXAGE, SSR_CACHE_SWR } = process.env;
7
- const baseDir = STOREFRONT_BASE_DIR || process.cwd();
6
+ const {
7
+ STOREFRONT_BASE_DIR, SSR_CACHE_MAXAGE, SSR_CACHE_SWR, SSR_PROXY_DEBUG, SSR_PROXY_TIMEOUT,
8
+ } = process.env;
8
9
  const cacheMaxAge = SSR_CACHE_MAXAGE ? Number(SSR_CACHE_MAXAGE) : 1000 * 60 * 2;
9
10
  const isCacheSWR = SSR_CACHE_SWR ? String(SSR_CACHE_SWR).toLowerCase() === 'true' : true;
11
+ const lockedCacheKeys = [];
12
+ const baseDir = STOREFRONT_BASE_DIR || process.cwd();
10
13
  const clientRoot = new URL(joinPath(baseDir, 'dist/client/'), import.meta.url);
11
14
  let imagesManifest;
12
15
  const builtImages = [];
16
+ const isProxyDebug = SSR_PROXY_DEBUG ? String(SSR_PROXY_DEBUG).toLowerCase() === 'true' : false;
17
+ const proxyTimeout = SSR_PROXY_TIMEOUT ? Number(SSR_PROXY_TIMEOUT) : 3000;
18
+ const proxy = async (req, res) => {
19
+ let proxyURL;
20
+ try {
21
+ proxyURL = new URL(req.query.url);
22
+ } catch {
23
+ //
24
+ }
25
+ if (proxyURL) {
26
+ const { headers } = req;
27
+ /* eslint-disable dot-notation */
28
+ headers['origin'] = String(headers['x-forwarded-host']);
29
+ headers['host'] = proxyURL.hostname;
30
+ if (!headers['accept']) {
31
+ headers['accept'] = 'text/plain,text/html,application/javascript,application/x-javascript';
32
+ }
33
+ headers['accept-encoding'] = 'gzip';
34
+ delete headers['forwarded'];
35
+ delete headers['via'];
36
+ delete headers['traceparent'];
37
+ delete headers['upgrade-insecure-requests'];
38
+ delete headers['x-timer'];
39
+ delete headers['x-varnish'];
40
+ delete headers['x-orig-accept-language'];
41
+ /* eslint-enable dot-notation */
42
+ Object.keys(headers).forEach((headerName) => {
43
+ if (headerName.startsWith('x-forwarded-')
44
+ || headerName.startsWith('cdn-')
45
+ || headerName.startsWith('fastly-')
46
+ || headerName.startsWith('x-firebase-')
47
+ || headerName.startsWith('x-cloud-')
48
+ || headerName.startsWith('x-appengine-')
49
+ || headerName.startsWith('function-')
50
+ || typeof headers[headerName] !== 'string') {
51
+ delete headers[headerName];
52
+ }
53
+ });
54
+ if (isProxyDebug) {
55
+ logger.info({ proxy: proxyURL.href });
56
+ }
57
+ try {
58
+ const abortController = new AbortController();
59
+ const timer = setTimeout(() => {
60
+ abortController.abort();
61
+ }, proxyTimeout);
62
+ const response = await fetch(proxyURL, {
63
+ method: 'get',
64
+ headers,
65
+ signal: abortController.signal,
66
+ });
67
+ clearTimeout(timer);
68
+ res.status(response.status);
69
+ Object.keys(response.headers).forEach((headerName) => {
70
+ switch (headerName) {
71
+ case 'transfer-encoding':
72
+ case 'connection':
73
+ case 'strict-transport-security':
74
+ case 'alt-svc':
75
+ case 'server':
76
+ break;
77
+ default:
78
+ res.set(headerName, response.headers[headerName]);
79
+ }
80
+ });
81
+ res.set('access-control-allow-origin', '*');
82
+ res.send(await response.text());
83
+ } catch (err) {
84
+ logger.warn(err);
85
+ res.status(400).send(err.message);
86
+ }
87
+ return;
88
+ }
89
+ res.sendStatus(400);
90
+ };
13
91
 
14
92
  export default async (req, res) => {
15
93
  if (req.path.startsWith('/~partytown')) {
16
94
  res.sendStatus(404);
17
95
  return;
18
96
  }
97
+ if (req.path.startsWith('/~reverse-proxy')) {
98
+ proxy(req, res);
99
+ return;
100
+ }
19
101
  res.set('X-XSS-Protection', '1; mode=block');
20
- const url = req.url.replace(/\?.*$/, '').replace(/\.html$/, '');
102
+ const url = req.path.replace(/\.html$/, '');
21
103
  const setStatusAndCache = (status, cacheControl) => {
22
104
  if (res.headersSent) return res;
23
105
  return res.status(status)
@@ -77,8 +159,57 @@ export default async (req, res) => {
77
159
  return;
78
160
  }
79
161
  const startedAt = Date.now();
80
- let cacheFindStartedAt;
81
162
  let ssrStartedAt;
163
+ const setTimerHeaders = (headers) => {
164
+ const now = Date.now();
165
+ headers['X-Function-Took'] = String(now - startedAt);
166
+ if (ssrStartedAt) {
167
+ headers['X-SSR-Took'] = String(now - ssrStartedAt);
168
+ }
169
+ };
170
+ let isSSRChunkSent = false;
171
+ const cacheKey = (!req.path || req.path === '/')
172
+ ? '__home'
173
+ : req.path.slice(1).replace(/\//g, '_');
174
+ const isSWRLocked = lockedCacheKeys.includes(cacheKey);
175
+ let cacheRef;
176
+ let isCachedBodySent = false;
177
+ let gettingCacheDoc;
178
+ if (req.query.__noCache === undefined && req.path.charAt(1) !== '~' && cacheMaxAge > 0) {
179
+ gettingCacheDoc = (async () => {
180
+ try {
181
+ const firestore = getFirestore();
182
+ cacheRef = firestore.doc(`ssrCache/${cacheKey}`);
183
+ const cacheDoc = await cacheRef.get();
184
+ if (!isSSRChunkSent && cacheDoc.exists) {
185
+ const {
186
+ headers: cachedHeaders, status: cachedStatus = 200, body: cachedBody, __timestamp,
187
+ } = cacheDoc.data();
188
+ const isFresh = (Timestamp.now().toMillis() - __timestamp.toMillis()) <= cacheMaxAge;
189
+ if (isFresh || isCacheSWR) {
190
+ cachedHeaders['X-SWR-Date'] = (isFresh ? 'fresh ' : '')
191
+ + __timestamp.toDate().toISOString();
192
+ setTimerHeaders(cachedHeaders);
193
+ Object.keys(cachedHeaders).forEach((headerName) => {
194
+ res.set(headerName, cachedHeaders[headerName]);
195
+ });
196
+ res.status(cachedStatus).send(cachedBody);
197
+ isCachedBodySent = true;
198
+ }
199
+ }
200
+ } catch (err) {
201
+ cacheRef = null;
202
+ logger.warn(err);
203
+ }
204
+ })();
205
+ }
206
+ if (gettingCacheDoc && (!isCacheSWR || isSWRLocked)) {
207
+ await gettingCacheDoc;
208
+ if (isCachedBodySent) return;
209
+ }
210
+ if (isCacheSWR) {
211
+ lockedCacheKeys.push(cacheKey);
212
+ }
82
213
  let status;
83
214
  let headers = {};
84
215
  const chunks = [];
@@ -90,13 +221,7 @@ export default async (req, res) => {
90
221
  /* eslint-disable prefer-rest-params */
91
222
  // @ts-ignore
92
223
  res.writeHead = function writeHead(_status, _headers) {
93
- _headers['X-Function-Took'] = String(Date.now() - startedAt);
94
- if (ssrStartedAt) {
95
- _headers['X-SSR-Took'] = String(Date.now() - ssrStartedAt);
96
- }
97
- if (cacheFindStartedAt) {
98
- _headers['X-Cache-Took'] = String(Date.now() - cacheFindStartedAt);
99
- }
224
+ setTimerHeaders(_headers);
100
225
  if (!res.headersSent) {
101
226
  // @ts-ignore
102
227
  _writeHead.apply(res, arguments);
@@ -104,51 +229,20 @@ export default async (req, res) => {
104
229
  status = _status;
105
230
  headers = _headers;
106
231
  };
107
- let cacheRef;
108
- let isBodySent = false;
109
- if (!req.query.__noCache && req.path.charAt(1) !== '~') {
110
- cacheFindStartedAt = Date.now();
111
- try {
112
- const firestore = getFirestore();
113
- const cacheKey = (!req.path || req.path === '/')
114
- ? '__home'
115
- : req.path.slice(1).replace(/\//g, '_');
116
- cacheRef = firestore.doc(`ssrCache/${cacheKey}`);
117
- const cacheDoc = await cacheRef.get();
118
- if (cacheDoc.exists) {
119
- const {
120
- headers: cachedHeaders, status: cachedStatus, body: cachedBody, __timestamp,
121
- } = cacheDoc.data();
122
- const isFresh = (Timestamp.now().toMillis() - __timestamp.toMillis()) < cacheMaxAge;
123
- if (isFresh || isCacheSWR) {
124
- cachedHeaders['X-SWR-Date'] = (isFresh ? 'fresh ' : '')
125
- + __timestamp.toDate().toISOString();
126
- res.writeHead(cachedStatus || 200, cachedHeaders);
127
- res.send(cachedBody);
128
- isBodySent = true;
129
- }
130
- if (isFresh) {
131
- return;
132
- }
133
- }
134
- } catch (err) {
135
- cacheRef = null;
136
- logger.warn(err);
137
- }
138
- }
139
232
  const _write = res.write;
140
233
  // @ts-ignore
141
234
  res.write = function write(chunk) {
142
- if (!isBodySent) {
235
+ if (!isCachedBodySent) {
143
236
  // @ts-ignore
144
237
  _write.apply(res, arguments);
238
+ isSSRChunkSent = true;
145
239
  }
146
240
  chunks.push(chunk);
147
241
  };
148
242
  const _end = res.end;
149
243
  // @ts-ignore
150
244
  res.end = function end() {
151
- if (!isBodySent) {
245
+ if (!isCachedBodySent) {
152
246
  // @ts-ignore
153
247
  _end.apply(res, arguments);
154
248
  }
@@ -163,6 +257,11 @@ export default async (req, res) => {
163
257
  __timestamp: Timestamp.now(),
164
258
  }).catch(logger.warn);
165
259
  }
260
+ for (let i = 0; i < lockedCacheKeys.length; i++) {
261
+ if (lockedCacheKeys[i] === cacheKey) {
262
+ lockedCacheKeys.splice(i, 1);
263
+ }
264
+ }
166
265
  };
167
266
  /*
168
267
  https://github.com/withastro/astro/blob/main/examples/ssr/server/server.mjs
@@ -1 +1 @@
1
- {"version":3,"file":"serve-storefront.js","sourceRoot":"","sources":["../../src/firebase/serve-storefront.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"serve-storefront.js","sourceRoot":"","sources":["../../src/firebase/serve-storefront.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@cloudcommerce/ssr",
3
3
  "type": "module",
4
- "version": "0.16.4",
4
+ "version": "0.18.0",
5
5
  "description": "E-Com Plus Cloud Commerce storefront SSR",
6
6
  "main": "lib/index.js",
7
7
  "exports": {
@@ -19,23 +19,110 @@ const {
19
19
  STOREFRONT_BASE_DIR,
20
20
  SSR_CACHE_MAXAGE,
21
21
  SSR_CACHE_SWR,
22
+ SSR_PROXY_DEBUG,
23
+ SSR_PROXY_TIMEOUT,
22
24
  } = process.env;
23
- const baseDir = STOREFRONT_BASE_DIR || process.cwd();
25
+
24
26
  const cacheMaxAge = SSR_CACHE_MAXAGE ? Number(SSR_CACHE_MAXAGE) : 1000 * 60 * 2;
25
27
  const isCacheSWR = SSR_CACHE_SWR ? String(SSR_CACHE_SWR).toLowerCase() === 'true' : true;
28
+ const lockedCacheKeys: string[] = [];
26
29
 
30
+ const baseDir = STOREFRONT_BASE_DIR || process.cwd();
27
31
  const clientRoot = new URL(joinPath(baseDir, 'dist/client/'), import.meta.url);
28
32
  let imagesManifest: string;
29
33
  type BuiltImage = { filename: string, width: number, height: number };
30
34
  const builtImages: BuiltImage[] = [];
31
35
 
36
+ const isProxyDebug = SSR_PROXY_DEBUG ? String(SSR_PROXY_DEBUG).toLowerCase() === 'true' : false;
37
+ const proxyTimeout = SSR_PROXY_TIMEOUT ? Number(SSR_PROXY_TIMEOUT) : 3000;
38
+
39
+ const proxy = async (req: Request, res: Response) => {
40
+ let proxyURL: URL | undefined;
41
+ try {
42
+ proxyURL = new URL(req.query.url as any);
43
+ } catch {
44
+ //
45
+ }
46
+ if (proxyURL) {
47
+ const { headers } = req;
48
+ /* eslint-disable dot-notation */
49
+ headers['origin'] = String(headers['x-forwarded-host']);
50
+ headers['host'] = proxyURL.hostname;
51
+ if (!headers['accept']) {
52
+ headers['accept'] = 'text/plain,text/html,application/javascript,application/x-javascript';
53
+ }
54
+ headers['accept-encoding'] = 'gzip';
55
+ delete headers['forwarded'];
56
+ delete headers['via'];
57
+ delete headers['traceparent'];
58
+ delete headers['upgrade-insecure-requests'];
59
+ delete headers['x-timer'];
60
+ delete headers['x-varnish'];
61
+ delete headers['x-orig-accept-language'];
62
+ /* eslint-enable dot-notation */
63
+ Object.keys(headers).forEach((headerName) => {
64
+ if (
65
+ headerName.startsWith('x-forwarded-')
66
+ || headerName.startsWith('cdn-')
67
+ || headerName.startsWith('fastly-')
68
+ || headerName.startsWith('x-firebase-')
69
+ || headerName.startsWith('x-cloud-')
70
+ || headerName.startsWith('x-appengine-')
71
+ || headerName.startsWith('function-')
72
+ || typeof headers[headerName] !== 'string'
73
+ ) {
74
+ delete headers[headerName];
75
+ }
76
+ });
77
+ if (isProxyDebug) {
78
+ logger.info({ proxy: proxyURL.href });
79
+ }
80
+ try {
81
+ const abortController = new AbortController();
82
+ const timer = setTimeout(() => {
83
+ abortController.abort();
84
+ }, proxyTimeout);
85
+ const response = await fetch(proxyURL, {
86
+ method: 'get',
87
+ headers: (headers as Record<string, string>),
88
+ signal: abortController.signal,
89
+ });
90
+ clearTimeout(timer);
91
+ res.status(response.status);
92
+ Object.keys(response.headers).forEach((headerName) => {
93
+ switch (headerName) {
94
+ case 'transfer-encoding':
95
+ case 'connection':
96
+ case 'strict-transport-security':
97
+ case 'alt-svc':
98
+ case 'server':
99
+ break;
100
+ default:
101
+ res.set(headerName, response.headers[headerName]);
102
+ }
103
+ });
104
+ res.set('access-control-allow-origin', '*');
105
+ res.send(await response.text());
106
+ } catch (err: any) {
107
+ logger.warn(err);
108
+ res.status(400).send(err.message);
109
+ }
110
+ return;
111
+ }
112
+ res.sendStatus(400);
113
+ };
114
+
32
115
  export default async (req: Request, res: Response) => {
33
116
  if (req.path.startsWith('/~partytown')) {
34
117
  res.sendStatus(404);
35
118
  return;
36
119
  }
120
+ if (req.path.startsWith('/~reverse-proxy')) {
121
+ proxy(req, res);
122
+ return;
123
+ }
37
124
  res.set('X-XSS-Protection', '1; mode=block');
38
- const url = req.url.replace(/\?.*$/, '').replace(/\.html$/, '');
125
+ const url = req.path.replace(/\.html$/, '');
39
126
 
40
127
  const setStatusAndCache = (status: number, cacheControl: string) => {
41
128
  if (res.headersSent) return res;
@@ -99,8 +186,62 @@ export default async (req: Request, res: Response) => {
99
186
  }
100
187
 
101
188
  const startedAt = Date.now();
102
- let cacheFindStartedAt: number | undefined;
103
189
  let ssrStartedAt: number | undefined;
190
+ const setTimerHeaders = (headers: OutgoingHttpHeaders) => {
191
+ const now = Date.now();
192
+ headers['X-Function-Took'] = String(now - startedAt);
193
+ if (ssrStartedAt) {
194
+ headers['X-SSR-Took'] = String(now - ssrStartedAt);
195
+ }
196
+ };
197
+
198
+ let isSSRChunkSent = false;
199
+ const cacheKey = (!req.path || req.path === '/')
200
+ ? '__home'
201
+ : req.path.slice(1).replace(/\//g, '_');
202
+ const isSWRLocked = lockedCacheKeys.includes(cacheKey);
203
+ let cacheRef: DocumentReference<any> | undefined | null;
204
+ let isCachedBodySent = false;
205
+ let gettingCacheDoc: Promise<void> | undefined;
206
+ if (req.query.__noCache === undefined && req.path.charAt(1) !== '~' && cacheMaxAge > 0) {
207
+ gettingCacheDoc = (async () => {
208
+ try {
209
+ const firestore = getFirestore();
210
+ cacheRef = firestore.doc(`ssrCache/${cacheKey}`);
211
+ const cacheDoc = await cacheRef.get();
212
+ if (!isSSRChunkSent && cacheDoc.exists) {
213
+ const {
214
+ headers: cachedHeaders,
215
+ status: cachedStatus = 200,
216
+ body: cachedBody,
217
+ __timestamp,
218
+ } = cacheDoc.data();
219
+ const isFresh = (Timestamp.now().toMillis() - __timestamp.toMillis()) <= cacheMaxAge;
220
+ if (isFresh || isCacheSWR) {
221
+ cachedHeaders['X-SWR-Date'] = (isFresh ? 'fresh ' : '')
222
+ + __timestamp.toDate().toISOString();
223
+ setTimerHeaders(cachedHeaders);
224
+ Object.keys(cachedHeaders).forEach((headerName) => {
225
+ res.set(headerName, cachedHeaders[headerName]);
226
+ });
227
+ res.status(cachedStatus).send(cachedBody);
228
+ isCachedBodySent = true;
229
+ }
230
+ }
231
+ } catch (err) {
232
+ cacheRef = null;
233
+ logger.warn(err);
234
+ }
235
+ })();
236
+ }
237
+ if (gettingCacheDoc && (!isCacheSWR || isSWRLocked)) {
238
+ await gettingCacheDoc;
239
+ if (isCachedBodySent) return;
240
+ }
241
+ if (isCacheSWR) {
242
+ lockedCacheKeys.push(cacheKey);
243
+ }
244
+
104
245
  let status: number;
105
246
  let headers: OutgoingHttpHeaders = {};
106
247
  const chunks: any[] = [];
@@ -112,13 +253,7 @@ export default async (req: Request, res: Response) => {
112
253
  /* eslint-disable prefer-rest-params */
113
254
  // @ts-ignore
114
255
  res.writeHead = function writeHead(_status: number, _headers: OutgoingHttpHeaders) {
115
- _headers['X-Function-Took'] = String(Date.now() - startedAt);
116
- if (ssrStartedAt) {
117
- _headers['X-SSR-Took'] = String(Date.now() - ssrStartedAt);
118
- }
119
- if (cacheFindStartedAt) {
120
- _headers['X-Cache-Took'] = String(Date.now() - cacheFindStartedAt);
121
- }
256
+ setTimerHeaders(_headers);
122
257
  if (!res.headersSent) {
123
258
  // @ts-ignore
124
259
  _writeHead.apply(res, arguments);
@@ -126,56 +261,20 @@ export default async (req: Request, res: Response) => {
126
261
  status = _status;
127
262
  headers = _headers;
128
263
  };
129
-
130
- let cacheRef: DocumentReference<any> | undefined | null;
131
- let isBodySent = false;
132
- if (!req.query.__noCache && req.path.charAt(1) !== '~') {
133
- cacheFindStartedAt = Date.now();
134
- try {
135
- const firestore = getFirestore();
136
- const cacheKey = (!req.path || req.path === '/')
137
- ? '__home'
138
- : req.path.slice(1).replace(/\//g, '_');
139
- cacheRef = firestore.doc(`ssrCache/${cacheKey}`);
140
- const cacheDoc = await cacheRef.get();
141
- if (cacheDoc.exists) {
142
- const {
143
- headers: cachedHeaders,
144
- status: cachedStatus,
145
- body: cachedBody,
146
- __timestamp,
147
- } = cacheDoc.data();
148
- const isFresh = (Timestamp.now().toMillis() - __timestamp.toMillis()) < cacheMaxAge;
149
- if (isFresh || isCacheSWR) {
150
- cachedHeaders['X-SWR-Date'] = (isFresh ? 'fresh ' : '')
151
- + __timestamp.toDate().toISOString();
152
- res.writeHead(cachedStatus || 200, cachedHeaders);
153
- res.send(cachedBody);
154
- isBodySent = true;
155
- }
156
- if (isFresh) {
157
- return;
158
- }
159
- }
160
- } catch (err) {
161
- cacheRef = null;
162
- logger.warn(err);
163
- }
164
- }
165
-
166
264
  const _write = res.write;
167
265
  // @ts-ignore
168
266
  res.write = function write(chunk: any) {
169
- if (!isBodySent) {
267
+ if (!isCachedBodySent) {
170
268
  // @ts-ignore
171
269
  _write.apply(res, arguments);
270
+ isSSRChunkSent = true;
172
271
  }
173
272
  chunks.push(chunk);
174
273
  };
175
274
  const _end = res.end;
176
275
  // @ts-ignore
177
276
  res.end = function end() {
178
- if (!isBodySent) {
277
+ if (!isCachedBodySent) {
179
278
  // @ts-ignore
180
279
  _end.apply(res, arguments);
181
280
  }
@@ -190,6 +289,11 @@ export default async (req: Request, res: Response) => {
190
289
  __timestamp: Timestamp.now(),
191
290
  }).catch(logger.warn);
192
291
  }
292
+ for (let i = 0; i < lockedCacheKeys.length; i++) {
293
+ if (lockedCacheKeys[i] === cacheKey) {
294
+ lockedCacheKeys.splice(i, 1);
295
+ }
296
+ }
193
297
  };
194
298
 
195
299
  /*
@@ -13,6 +13,7 @@ module.exports = {
13
13
  'global-require': 'off',
14
14
  'import/no-dynamic-require': 'off',
15
15
  'import/prefer-default-export': 'warn',
16
+ 'import/extensions': 'off',
16
17
  'vue/multi-word-component-names': ['error', {
17
18
  ignores: ['Fade', 'Carousel', 'Drawer', 'Prices'],
18
19
  }],
@@ -1 +1 @@
1
- import{u as X,a as Y,b as Z}from"./index.33347cbd.js";import{_ as K,s as M,V as q,x as P,u as G,D as v,z as J,C as A,N as c,K as h,W as D,r as F,X as Q,L as ee,Y as te,Z as ae,E as oe,w as L,G as le,v as H,$ as se,a0 as re}from"./_plugin-vue_export-helper.d3aaeb0d.js";const U=Symbol("carousel"),ne=M({__name:"CarouselControl",props:{isPrev:{type:Boolean,default:!1}},setup(r,{expose:u}){u();const{changeSlide:l}=q(U),t={changeSlide:l};return Object.defineProperty(t,"__isScriptSetup",{enumerable:!1,value:!0}),t}}),ue=["aria-label","data-carousel-control"];function ie(r,u,l,t,n,o){return P(),G("button",{type:"button","aria-label":l.isPrev?"Anterior":"Próximo",onClick:u[0]||(u[0]=m=>t.changeSlide(l.isPrev?-1:1)),class:A(["group absolute top-0 z-1",l.isPrev?"left-0":"right-0"]),"data-carousel-control":l.isPrev?"previous":"next"},[v(r.$slots,"default",{},()=>[J("i",{class:A(["m-0",l.isPrev?"i-chevron-left group-active:-translate-x-1":"i-chevron-right group-active:translate-x-1"])},null,2)])],10,ue)}const ce=K(ne,[["render",ie]]),de=M({__name:"Carousel",props:{as:{default:"ul"},modelValue:{default:1},autoplay:{}},emits:["update:modelValue"],setup(r,{expose:u,emit:l}){u();const t=r,n=c(t.modelValue-1);h(D(t,"modelValue"),e=>{n.value=e-1}),h(n,(e,a)=>{e!==a&&l("update:modelValue",e+1)});const o=c(null),{x:m,isScrolling:B,arrivedState:_}=X(o),W=F(()=>_.left),T=F(()=>_.right),s=c([]),g=c(0),p=c(0),I=c(0),V=()=>{o.value&&(g.value=o.value.scrollWidth,p.value=o.value.offsetWidth)},k=()=>{if(!o.value)return;let e=[...o.value.children];e.length===1&&e[0].tagName.endsWith("SLOT")&&(e=[...e[0].children]),s.value=e.map(a=>({offsetLeft:a.offsetLeft,width:a.offsetWidth}))},z=e=>{let a=n.value+e;if(a>=s.value.length)return 0;a<0&&(a=s.value.length+a);const{offsetLeft:b,width:d}=s.value[a]||{};return d?b:0},x=()=>{const e=s.value.findIndex(a=>Math.abs(a.offsetLeft-m.value)<=5);e>-1&&(n.value=e||0)},E=()=>{const e=g.value-p.value;I.value=s.value.findIndex(({offsetLeft:a})=>a>=e-5)};let i;const f=()=>{t.autoplay&&(clearTimeout(i),i=setTimeout(()=>{C(1)},t.autoplay))},C=(e,a=!0)=>{if(s.value.length<2)return;if(a&&(e===1||e===-1)){let d=0,$=0;for(let S=n.value;S<s.value.length;S++){const{width:j}=s.value[S]||{};if(j&&(d+=1,$+=j,$>=p.value))break}d&&(e=e>0?d:-d)}t.autoplay||console.log({direction:e},n.value,s.value.length);const b=z(e);o.value?.scrollTo({left:b,behavior:"smooth"}),f()};h(B,e=>{e?clearTimeout(i):(x(),f())});const N=c(null),O=Y(N);h(O,e=>{e?clearTimeout(i):f()});const w=()=>{o.value&&(V(),k(),x(),E())},y=Z(()=>{o.value&&(o.value.scrollLeft=0,w())},400);Q(()=>{w(),ee(()=>{o.value&&[...o.value.children].forEach(e=>{e.setAttribute("tabindex","0")})}),f(),window.addEventListener("resize",y)}),te(()=>{window.removeEventListener("resize",y),clearTimeout(i)}),ae(U,{autoplay:D(t,"autoplay"),changeSlide:C,isBoundLeft:W,isBoundRight:T});const R={props:t,emit:l,currentIndex:n,wrapper:o,currentPos:m,isScrolling:B,arrivedState:_,isBoundLeft:W,isBoundRight:T,slidesWidth:s,wrapperScrollWidth:g,wrapperVisibleWidth:p,indexCount:I,calcWrapperWidth:V,calcSlidesWidth:k,calcNextOffsetLeft:z,calcCurrentIndex:x,calcIndexCount:E,get autoplayTimer(){return i},set autoplayTimer(e){i=e},restartAutoplay:f,changeSlide:C,carousel:N,isHovered:O,calcOnInit:w,onResize:y,CarouselControl:ce};return Object.defineProperty(R,"__isScriptSetup",{enumerable:!1,value:!0}),R}}),fe={ref:"carousel",class:"relative","data-carousel":""};function ve(r,u,l,t,n,o){return P(),G("div",fe,[(P(),oe(le(l.as),{ref:"wrapper",class:"flex overflow-x-scroll overflow-y-hidden list-none m-0 p-0 snap-x snap-mandatory scroll-smooth [&>*]:snap-start [&>*]:outline-none",style:{"scrollbar-width":"none","-webkit-overflow-scrolling":"touch","-ms-overflow-style":"none"},"data-carousel-wrapper":""},{default:L(()=>[v(r.$slots,"default")]),_:3},512)),v(r.$slots,"controls",se(re({changeSlide:t.changeSlide,isBoundLeft:t.isBoundLeft,isBoundRight:t.isBoundRight,currentPage:t.currentIndex+1,pageCount:t.indexCount+1})),()=>[H(t.CarouselControl,{"is-prev":""},{default:L(()=>[v(r.$slots,"previous")]),_:3}),H(t.CarouselControl,null,{default:L(()=>[v(r.$slots,"next")]),_:3})])],512)}const me=K(de,[["render",ve]]);export{me as C,ce as a};
1
+ import{u as X,a as Y,b as Z}from"./index.ddc27a3a.js";import{_ as K,s as M,V as q,x as P,u as G,D as v,z as J,C as A,N as c,K as h,W as D,r as F,X as Q,L as ee,Y as te,Z as ae,E as oe,w as L,G as le,v as H,$ as se,a0 as re}from"./_plugin-vue_export-helper.4e6dc3af.js";const U=Symbol("carousel"),ne=M({__name:"CarouselControl",props:{isPrev:{type:Boolean,default:!1}},setup(r,{expose:u}){u();const{changeSlide:l}=q(U),t={changeSlide:l};return Object.defineProperty(t,"__isScriptSetup",{enumerable:!1,value:!0}),t}}),ue=["aria-label","data-carousel-control"];function ie(r,u,l,t,n,o){return P(),G("button",{type:"button","aria-label":l.isPrev?"Anterior":"Próximo",onClick:u[0]||(u[0]=m=>t.changeSlide(l.isPrev?-1:1)),class:A(["group absolute top-0 z-1",l.isPrev?"left-0":"right-0"]),"data-carousel-control":l.isPrev?"previous":"next"},[v(r.$slots,"default",{},()=>[J("i",{class:A(["m-0",l.isPrev?"i-chevron-left group-active:-translate-x-1":"i-chevron-right group-active:translate-x-1"])},null,2)])],10,ue)}const ce=K(ne,[["render",ie]]),de=M({__name:"Carousel",props:{as:{default:"ul"},modelValue:{default:1},autoplay:{}},emits:["update:modelValue"],setup(r,{expose:u,emit:l}){u();const t=r,n=c(t.modelValue-1);h(D(t,"modelValue"),e=>{n.value=e-1}),h(n,(e,a)=>{e!==a&&l("update:modelValue",e+1)});const o=c(null),{x:m,isScrolling:B,arrivedState:_}=X(o),W=F(()=>_.left),T=F(()=>_.right),s=c([]),g=c(0),p=c(0),I=c(0),V=()=>{o.value&&(g.value=o.value.scrollWidth,p.value=o.value.offsetWidth)},k=()=>{if(!o.value)return;let e=[...o.value.children];e.length===1&&e[0].tagName.endsWith("SLOT")&&(e=[...e[0].children]),s.value=e.map(a=>({offsetLeft:a.offsetLeft,width:a.offsetWidth}))},z=e=>{let a=n.value+e;if(a>=s.value.length)return 0;a<0&&(a=s.value.length+a);const{offsetLeft:b,width:d}=s.value[a]||{};return d?b:0},x=()=>{const e=s.value.findIndex(a=>Math.abs(a.offsetLeft-m.value)<=5);e>-1&&(n.value=e||0)},E=()=>{const e=g.value-p.value;I.value=s.value.findIndex(({offsetLeft:a})=>a>=e-5)};let i;const f=()=>{t.autoplay&&(clearTimeout(i),i=setTimeout(()=>{C(1)},t.autoplay))},C=(e,a=!0)=>{if(s.value.length<2)return;if(a&&(e===1||e===-1)){let d=0,$=0;for(let S=n.value;S<s.value.length;S++){const{width:j}=s.value[S]||{};if(j&&(d+=1,$+=j,$>=p.value))break}d&&(e=e>0?d:-d)}t.autoplay||console.log({direction:e},n.value,s.value.length);const b=z(e);o.value?.scrollTo({left:b,behavior:"smooth"}),f()};h(B,e=>{e?clearTimeout(i):(x(),f())});const N=c(null),O=Y(N);h(O,e=>{e?clearTimeout(i):f()});const w=()=>{o.value&&(V(),k(),x(),E())},y=Z(()=>{o.value&&(o.value.scrollLeft=0,w())},400);Q(()=>{w(),ee(()=>{o.value&&[...o.value.children].forEach(e=>{e.setAttribute("tabindex","0")})}),f(),window.addEventListener("resize",y)}),te(()=>{window.removeEventListener("resize",y),clearTimeout(i)}),ae(U,{autoplay:D(t,"autoplay"),changeSlide:C,isBoundLeft:W,isBoundRight:T});const R={props:t,emit:l,currentIndex:n,wrapper:o,currentPos:m,isScrolling:B,arrivedState:_,isBoundLeft:W,isBoundRight:T,slidesWidth:s,wrapperScrollWidth:g,wrapperVisibleWidth:p,indexCount:I,calcWrapperWidth:V,calcSlidesWidth:k,calcNextOffsetLeft:z,calcCurrentIndex:x,calcIndexCount:E,get autoplayTimer(){return i},set autoplayTimer(e){i=e},restartAutoplay:f,changeSlide:C,carousel:N,isHovered:O,calcOnInit:w,onResize:y,CarouselControl:ce};return Object.defineProperty(R,"__isScriptSetup",{enumerable:!1,value:!0}),R}}),fe={ref:"carousel",class:"relative","data-carousel":""};function ve(r,u,l,t,n,o){return P(),G("div",fe,[(P(),oe(le(l.as),{ref:"wrapper",class:"flex overflow-x-scroll overflow-y-hidden list-none m-0 p-0 snap-x snap-mandatory scroll-smooth [&>*]:snap-start [&>*]:outline-none",style:{"scrollbar-width":"none","-webkit-overflow-scrolling":"touch","-ms-overflow-style":"none"},"data-carousel-wrapper":""},{default:L(()=>[v(r.$slots,"default")]),_:3},512)),v(r.$slots,"controls",se(re({changeSlide:t.changeSlide,isBoundLeft:t.isBoundLeft,isBoundRight:t.isBoundRight,currentPage:t.currentIndex+1,pageCount:t.indexCount+1})),()=>[H(t.CarouselControl,{"is-prev":""},{default:L(()=>[v(r.$slots,"previous")]),_:3}),H(t.CarouselControl,null,{default:L(()=>[v(r.$slots,"next")]),_:3})])],512)}const me=K(de,[["render",ve]]);export{me as C,ce as a};
@@ -0,0 +1 @@
1
+ import{v as x}from"./runtime-dom.esm-bundler.578d6e91.js";import{p as d}from"./modules-info.d6bd555b.js";import{r as b,_ as g,s as v,u as a,v as m,w as i,x as r,y as w,z as o,F as y,A as C,C as f,D as S,E as k,G as H,H as T,I as p,J as h}from"./_plugin-vue_export-helper.4e6dc3af.js";import{C as B,a as D}from"./Carousel.533b4b19.js";import"./session-utm.744b0db3.js";import"./index.ddc27a3a.js";const N=l=>({parsedSlides:b(()=>l.slides.map(e=>{const s=e.title?d(e.title).value:"",n=e.subtitle?d(e.subtitle).value:"",_=e.buttonText?d(e.buttonText).value:"";return{...e,hasHeader:!!(s||n||_)}}))}),V=v({__name:"HeroSlider",props:{autoplay:{},slides:{}},setup(l,{expose:c}){c();const e=l,{parsedSlides:s}=N(e),n={props:e,parsedSlides:s,Carousel:B,CarouselControl:D};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}}),z={class:"relative mx-auto"},j=["href"],E={key:0,class:"basis-1/2 grow-0 p-12 xl:ps-32 mb-3 md:mb-0"},F={key:0,class:"text-lg mt-4 md:mt-6"},L=["href"],P={class:"absolute z-10 bottom-5 flex justify-end items-center w-screen right-5 xl:right-auto xl:max-w-screen-xl xl:left-1/2 xl:-ms-[640px]"},A={class:"relative w-20 h-10 rounded-full bg-white/50 text-primary shadow-sm ring-1 ring-black/5"},G=o("i",{class:"i-arrow-left"},null,-1),I=o("i",{class:"i-arrow-right"},null,-1);function J(l,c,e,s,n,_){return r(),a("section",z,[m(s.Carousel,{autoplay:e.autoplay},{controls:i(()=>[w(o("div",P,[o("div",A,[m(s.CarouselControl,{class:"w-10 h-10 rounded-full hover:bg-primary/10","is-prev":""},{default:i(()=>[G]),_:1}),m(s.CarouselControl,{class:"w-10 h-10 rounded-full hover:bg-primary/10"},{default:i(()=>[I]),_:1})])],512),[[x,s.parsedSlides.length>1]])]),default:i(()=>[(r(!0),a(y,null,C(s.parsedSlides,(t,u)=>(r(),a("li",{key:u,class:"shrink-0 basis-full h-full secondary"},[o("div",{class:f(["w-screen max-w-screen-2xl mx-auto overflow-x-hidden",t.hasHeader?"grid grid-cols-1 md:grid-cols-2 items-center":null])},[o("a",{href:t.href,class:f(t.hasHeader?"basis-1/2 grow-0 md:order-last":null)},[S(l.$slots,`picture-${u}`)],10,j),t.hasHeader?(r(),a("div",E,[(r(),k(H(u===0?"h2":"h3"),{class:"ui-title mt-1"},{default:i(()=>[T(p(t.title),1)]),_:2},1024)),t.subtitle?(r(),a("p",F,p(t.subtitle),1)):h("",!0),t.buttonText?(r(),a("a",{key:1,href:t.buttonLink,class:"ui-btn-lg ui-btn-contrast min-w-[150px] mt-7 md:mt-10"},p(t.buttonText),9,L)):h("",!0)])):h("",!0)],2)]))),128))]),_:3},8,["autoplay"])])}const U=g(V,[["render",J]]);export{U as default};
@@ -0,0 +1 @@
1
+ import{v as m}from"./runtime-dom.esm-bundler.578d6e91.js";import{p as _}from"./modules-info.d6bd555b.js";import{U as f,r as u,_ as v,s as C,u as l,z as h,v as d,w as p,x as o,y as g,F as b,A as x,E as w,G as y,C as S,J as k}from"./_plugin-vue_export-helper.4e6dc3af.js";import{C as B,a as P}from"./Carousel.533b4b19.js";import"./session-utm.744b0db3.js";import"./index.ddc27a3a.js";function V(t,s){{const a=btoa(JSON.stringify({filename:t}));window.parent.postMessage(JSON.parse(JSON.stringify({type:"open",filename:t,id:a})),window.location.origin),window.addEventListener("message",e=>{e.data.id===a&&s(e.data.data)})}}const L=t=>{const s=f(null);return window.$isCmsPreview&&V(t,a=>{s.value=a}),{liveContent:s}},N=t=>{const s={slides:[]};return t.header?.pitch_bar&&(s.slides=t.header.pitch_bar),s},J=t=>{const{liveContent:s}=L("layout"),a=u(()=>(s.value?N(s.value).slides:t.slides).map(({html:n})=>_(n).value.replace(/<\/?p>/g,"").replace(/&lt;(\/?d-md)&gt;/g,"<$1>"))),e=u(()=>a.value.filter(r=>r).length);return{parsedContents:a,countValidSlides:e}},O=C({__name:"PitchBar",props:{slides:{}},setup(t,{expose:s}){s();const a=t,{parsedContents:e,countValidSlides:r}=J(a),n={props:a,parsedContents:e,countValidSlides:r,Carousel:B,CarouselControl:P};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}}),z={class:"bg-base-100 relative z-20"},E={class:"container md:w-2/3 mx-auto px-3 py-1"},M=["innerHTML"],A={class:"text-xl leading-none text-base-400"};function D(t,s,a,e,r,n){return o(),l("div",z,[h("div",E,[d(e.Carousel,{autoplay:e.countValidSlides>1?7e3:void 0},{controls:p(()=>[g(h("div",A,[d(e.CarouselControl,{class:"pr-2 bg-base-100 hover:text-base-700","is-prev":""}),d(e.CarouselControl,{class:"pl-2 bg-base-100 hover:text-base-700"})],512),[[m,e.countValidSlides>1]])]),default:p(()=>[(o(!0),l(b,null,x(a.slides,(i,c)=>(o(),l("li",{key:c,class:"shrink-0 basis-full h-full text-center"},[(o(),w(y(i.href?"ALink":"span"),{href:i.href,target:i.target,class:S(["inline-block px-8",i.href?"hover:underline":null])},{default:p(()=>[e.parsedContents[c]?(o(),l("span",{key:0,innerHTML:e.parsedContents[c],class:"prose text-sm text-base-800"},null,8,M)):k("",!0)]),_:2},1032,["href","target","class"]))]))),128))]),_:1},8,["autoplay"])])])}const R=v(O,[["render",D]]);export{R as default};
@@ -0,0 +1 @@
1
+ import{a as z,b as W,d as A,l as S}from"./modules-info.d6bd555b.js";import{r as s,a3 as k,a4 as E,_ as M,s as T,a5 as F,u as o,I as r,J as c,z as h,H as N,C,v as B,w as L,x as i}from"./_plugin-vue_export-helper.4e6dc3af.js";import"./session-utm.744b0db3.js";const I=(a,l)=>{const{type:n,value:e}=l;let d;return e?(n==="percentage"?d=a*((100-e)/100):d=a-e,d>0?d:0):a},H=a=>{const l=s(()=>a.product||{price:a.price||0,base_price:a.basePrice}),n=s(()=>{const{variations:t}=l.value;if(t){const u=k(l.value);for(let b=0;b<t.length;b++)if(k({...l.value,...t[b]})>u)return!0}return!1}),e=s(()=>{const t=k(l.value),u=z.value;return u&&(!u.min_amount||t>u.min_amount)?I(t,u):t}),d=s(()=>{if(E(l.value))return l.value.base_price;const t=k(l.value);return t>e.value?t:0}),_=s(()=>a.installmentsOption||W.value||{max_number:1}),m=s(()=>{if(_.value.max_number<=1)return 1;const t=_.value.min_installment||5,u=Math.round(e.value/t);return Math.min(u,_.value.max_number)}),P=s(()=>_.value.monthly_interest||0),g=s(()=>{if(m.value>=2){if(!P.value)return e.value/m.value;const t=P.value/100;return e.value*t/(1-(1+t)**-m.value)}return 0}),y=s(()=>{const t=a.discountOption||A.value;return t&&(!t.min_amount||t.min_amount<=e.value)&&(!a.isAmountTotal||t.apply_at==="total")?t:{}}),O=s(()=>{const{label:t}=y.value;return t?t.includes(" ")?t:`via ${t}`:""}),V=s(()=>I(e.value,y.value)),v=s(()=>{if(a.loyaltyPointsProgram)return a.loyaltyPointsProgram;const t=S.value;if(t){const u=Object.keys(t);for(let b=0;b<u.length;b++){const p=t[u[b]];if(p?.earn_percentage&&p.earn_percentage>0)return p}}return{ratio:0}}),f=s(()=>v.value.min_subtotal_to_earn||0),j=s(()=>v.value.name||""),D=s(()=>v.value.earn_percentage||0),x=s(()=>D.value*v.value.ratio),w=s(()=>x.value>=1?e.value*(x.value/100):0);return{hasVariedPrices:n,salePrice:e,comparePrice:d,installmentsObject:_,installmentsNumber:m,monthlyInterest:P,installmentValue:g,discountObject:y,discountLabel:O,priceWithDiscount:V,pointsProgramObject:v,pointsMinPrice:f,pointsProgramName:j,earnPointsPercentage:D,cashbackPercentage:x,cashbackValue:w}},J=T({__name:"Prices",props:{isBig:{type:Boolean},isLiteral:{type:Boolean},hasCashback:{type:Boolean,default:!0},hasPriceOptions:{type:Boolean,default:!0},product:{},price:{},basePrice:{},isAmountTotal:{type:Boolean},installmentsOption:{},discountOption:{},loyaltyPointsProgram:{}},setup(a,{expose:l}){l();const n=a,{hasVariedPrices:e,salePrice:d,comparePrice:_,cashbackPercentage:m,cashbackValue:P,installmentsNumber:g,monthlyInterest:y,installmentValue:O,priceWithDiscount:V,discountLabel:v}=H(n),f={props:n,hasVariedPrices:e,salePrice:d,comparePrice:_,cashbackPercentage:m,cashbackValue:P,installmentsNumber:g,monthlyInterest:y,installmentValue:O,priceWithDiscount:V,discountLabel:v};return Object.defineProperty(f,"__isScriptSetup",{enumerable:!1,value:!0}),f}}),R={key:0,class:"text-base-500 mr-1 [font-size:87%]"},q={key:0},G={key:1},K={key:0},Q={key:0,class:"relative z-10"},U=["data-tooltip"],X=h("i",{class:"i-cashback mr-1"},null,-1),Y={class:"font-medium"},Z=h("small",null," cashback",-1),$={key:0},ee={key:0},te={key:1},ae={key:2},ne={key:0},se={key:0},re={key:1};function oe(a,l,n,e,d,_){const m=F("Fade");return i(),o("div",{class:C(["text-base-600 [&>div]:[font-size:90%] [&_small]:lowercase [&_small]:[font-size:92%]",n.isBig?"text-lg":null]),"data-prices":""},[e.comparePrice?(i(),o("span",R,[n.isLiteral?(i(),o("small",q,r("De "))):c("",!0),h("s",null,r(a.$money(e.comparePrice)),1),n.isLiteral?(i(),o("small",G,r(" Por"))):c("",!0)])):c("",!0),h("strong",{class:C(["inline-block text-base-800",n.isBig?"text-5xl block":null])},[e.hasVariedPrices?(i(),o("small",K,r("A partir de "))):c("",!0),N(" "+r(a.$money(e.salePrice)),1)],2),B(m,{slide:"down"},{default:L(()=>[e.cashbackValue&&n.hasCashback?(i(),o("div",Q,[h("span",{"data-tooltip":"Receba $1 de volta".replace("$1",a.$percentage(e.cashbackPercentage))},[X,h("span",Y,r(a.$money(e.cashbackValue)),1),Z],8,U)])):c("",!0)]),_:1}),B(m,{slide:"down"},{default:L(()=>[e.installmentValue&&n.hasPriceOptions?(i(),o("div",$,[n.isLiteral?(i(),o("small",ee,r("Até "))):c("",!0),N(" "+r(e.installmentsNumber)+"x ",1),n.isLiteral?(i(),o("small",te,r(" De "))):c("",!0),h("span",null,r(a.$money(e.installmentValue)),1),!e.monthlyInterest&&n.isLiteral?(i(),o("small",ae,r("Sem juros"))):c("",!0)])):c("",!0)]),_:1}),B(m,{slide:"down"},{default:L(()=>[e.priceWithDiscount<e.salePrice&&n.hasPriceOptions?(i(),o("div",ne,[e.discountLabel?c("",!0):(i(),o("small",se,r("A partir de "))),h("span",null,r(a.$money(e.priceWithDiscount)),1),e.discountLabel?(i(),o("small",re,r(` ${e.discountLabel}`),1)):c("",!0)])):c("",!0)]),_:1})],2)}const ue=M(J,[["render",oe]]);export{ue as default};
@@ -0,0 +1 @@
1
+ import{v as z}from"./runtime-dom.esm-bundler.578d6e91.js";import{a as C}from"./api.7f62c1ff.js";import{T as F,N as m,a2 as E,a3 as A,r as _,a4 as T,_ as N,s as Q,a5 as B,x as u,u as g,E as x,w,z as b,F as P,v,J as H,G as O,C as V,H as I,I as S,y as D,A as M}from"./_plugin-vue_export-helper.4e6dc3af.js";import{C as G,a as J}from"./Carousel.533b4b19.js";import{a as R,w as K}from"./index.ddc27a3a.js";import{i as U,g as j}from"./img.22ad29ec.js";import W from"./Prices.bd0d3474.js";import"./modules-info.d6bd555b.js";import"./session-utm.744b0db3.js";const X=(t,n=F.get("lang"))=>n&&t.i18n&&t.i18n[n]?t.i18n[n]:t.name||t.title||U(t.i18n,n)||"",Y=X,Z=t=>t&&t.min_quantity||1,$=Z,tt=t=>!t.hasOwnProperty("quantity")||t.quantity>=$(t),q=tt,et=t=>{const n=m(t.title||""),s=m(t.titleLink||""),e=m(!1);let o=null;const i=m(null),l=E(t.products||[]);return t.products||(e.value=!0,o=(async()=>{let c=t.searchQuery||"",d;if(t.collectionId){try{const{data:a}=await C.get(`collections/${t.collectionId}`);d=a}catch(a){console.error(a),i.value=a}const r=d?.products;Array.isArray(r)&&r.length&&(c+=`&_id=${r.slice(0,60).join(",")}`),!n.value&&n.value!==null&&d?.name&&(n.value=d?.name)}const h=t.limit||24;let y=`offset=${t.page?(t.page-1)*h:0}&limit=${h}`;t.sort&&(y+=`&sort=${t.sort}`),y+=c;try{const{data:r}=await C.get(`search/v1?${y}`);if(t.isShuffle){let a=r.result.filter(L=>L.available&&q(L)).length,p,f;for(;a;)f=Math.floor(Math.random()*a--),p=r.result[a],r.result[a]=r.result[f],r.result[f]=p}r.result.forEach(a=>l.push(a))}catch(r){console.error(r),i.value=r}e.value=!1})()),{title:n,titleLink:s,isFetching:e,fetching:o,fetchError:i,products:l}},rt=t=>{const n=m(!1);let s=null;const e=m(null),o=E({...t.product,price:A(t.product||{})}),{productId:i}=t;!t.product&&i&&(n.value=!0,s=(async()=>{try{const{data:r}=await C.get(`products/${i}`);Object.assign(o,r)}catch(r){console.error(r),e.value=r}n.value=!1})());const l=_(()=>Y(o)),c=_(()=>{const{slug:r}=o;return typeof r=="string"?`/${r}`:null}),d=_(()=>{const{pictures:r}=o,a=[];if(r)r.forEach(p=>{const f=j(p);f&&a.push(f)});else{const{picture:p}=o;if(p){const f=j(p);f&&a.push(f)}}return a}),h=_(()=>q(o)),k=_(()=>h.value&&o.available&&o.visible),y=_(()=>{if(T(o)){const r=o.base_price;return Math.round((r-A(o))*100/r)}return 0});return{isFetching:n,fetching:s,fetchError:e,product:o,title:l,link:c,images:d,isInStock:h,isActive:k,discountPercentage:y}},ot=Q({__name:"ProductCard",props:{product:{},productId:{},headingTag:{default:"h3"}},setup(t,{expose:n}){n();const s=t,{product:e,title:o,link:i,images:l}=rt({product:s.product,productId:s.productId}),c=m(null),d=R(c),h=m(!1);K(d,()=>{h.value=!0});const k={props:s,product:e,title:o,link:i,images:l,card:c,isHovered:d,wasHoveredOnce:h,Prices:W};return Object.defineProperty(k,"__isScriptSetup",{enumerable:!1,value:!0}),k}}),nt=["data-sku"],at={class:"aspect-square p-2 motion-safe:group-hover:scale-110 transition-transform"},st={class:"relative w-full h-full bg-white rounded overflow-hidden group-hover:rounded-none"},lt={key:1,class:"w-full h-full bg-gradient-to-br from-base-50/20 to-base-100"},ct={class:"flex flex-col grow justify-between p-4 group-hover:backdrop-blur-md bg-white/40 z-10"},it={class:"pt-2"};function ut(t,n,s,e,o,i){const l=B("AImg");return u(),g("article",{ref:"card","data-sku":e.product.sku,class:"relative h-full max-w-[350px] mx-auto py-3 group"},[(u(),x(O(e.link?"ALink":"span"),{href:e.link,class:"flex flex-col h-full rounded overflow-hidden group-hover:shadow group-hover:ring-1 ring-black/5"},{default:w(()=>[b("div",at,[b("div",st,[e.images?.length?(u(),g(P,{key:0},[v(l,{picture:e.images[0],alt:e.title,class:"absolute top-0 left-0 block w-full h-full object-cover"},null,8,["picture","alt"]),e.images[1]&&e.wasHoveredOnce?(u(),x(l,{key:0,picture:e.images[1],alt:e.title,class:"absolute top-0 left-0 block w-full h-full object-cover opacity-0 group-hover:opacity-100 transition-opacity motion-safe:duration-300 text-transparent z-10"},null,8,["picture","alt"])):H("",!0)],64)):(u(),g("div",lt))])]),b("div",ct,[(u(),x(O(s.headingTag),{class:V(["ui-link text-base-700 no-underline line-clamp-2",e.link?"group-hover:underline group-hover:text-primary":null])},{default:w(()=>[I(S(e.title),1)]),_:1},8,["class"])),b("div",it,[v(e.Prices,{product:e.product},null,8,["product"])])])]),_:1},8,["href"]))],8,nt)}const dt=N(ot,[["render",ut]]),ft=Q({__name:"ProductShelf",props:{collectionId:{},searchQuery:{},sort:{},title:{},titleLink:{},isShuffle:{type:Boolean},limit:{},page:{},products:{}},async setup(t,{expose:n}){n();const s=t,{title:e,titleLink:o,fetching:i,products:l}=et(s),c={props:s,title:e,titleLink:o,fetching:i,products:l,Carousel:G,CarouselControl:J,ProductCard:dt};return Object.defineProperty(c,"__isScriptSetup",{enumerable:!1,value:!0}),c}}),ht={class:"container mx-auto"},gt={key:0},mt={class:"text-3xl lg:text-xl leading-none text-primary lg:opacity-0 group-hover/shelf:opacity-90 transition-opacity"};function pt(t,n,s,e,o,i){const l=B("ALink");return u(),g("section",ht,[e.title?(u(),g("h2",gt,[e.titleLink?(u(),x(l,{key:0,href:e.titleLink},{default:w(()=>[I(S(e.title),1)]),_:1},8,["href"])):(u(),g(P,{key:1},[I(S(e.title),1)],64))])):H("",!0),v(e.Carousel,{class:"group/shelf"},{controls:w(()=>[D(b("div",mt,[v(e.CarouselControl,{class:"!top-1/2 lg:-left-2 w-10 h-10 bg-transparent lg:bg-white/80 lg:hover:bg-primary/10 rounded-full lg:shadow-sm lg:ring-1 ring-black/5","is-prev":""}),v(e.CarouselControl,{class:"!top-1/2 lg:-right-2 w-10 h-10 bg-transparent lg:bg-white/80 lg:hover:bg-primary/10 rounded-full lg:shadow-sm lg:ring-1 ring-black/5"})],512),[[z,e.products.length>2]])]),default:w(()=>[(u(!0),g(P,null,M(e.products,c=>(u(),g("li",{key:c._id,class:"basis-1/2 md:basis-1/3 lg:basis-1/4 shrink-0"},[v(e.ProductCard,{product:c},null,8,["product"])]))),128))]),_:1})])}const It=N(ft,[["render",pt]]);export{It as default};