cloudcommerce 0.16.1 → 0.16.2
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.
- package/CHANGELOG.md +7 -0
- package/package.json +1 -1
- package/packages/api/package.json +1 -1
- package/packages/apps/affilate-program/package.json +1 -1
- package/packages/apps/correios/package.json +1 -1
- package/packages/apps/custom-payment/package.json +1 -1
- package/packages/apps/custom-shipping/package.json +1 -1
- package/packages/apps/datafrete/package.json +1 -1
- package/packages/apps/discounts/package.json +1 -1
- package/packages/apps/emails/package.json +1 -1
- package/packages/apps/fb-conversions/package.json +1 -1
- package/packages/apps/flash-courier/package.json +1 -1
- package/packages/apps/frenet/package.json +1 -1
- package/packages/apps/galaxpay/package.json +1 -1
- package/packages/apps/google-analytics/package.json +1 -1
- package/packages/apps/infinitepay/package.json +1 -1
- package/packages/apps/jadlog/package.json +1 -1
- package/packages/apps/loyalty-points/package.json +1 -1
- package/packages/apps/melhor-envio/package.json +1 -1
- package/packages/apps/mercadopago/package.json +1 -1
- package/packages/apps/pagarme/package.json +1 -1
- package/packages/apps/paghiper/package.json +1 -1
- package/packages/apps/pix/package.json +1 -1
- package/packages/apps/tiny-erp/package.json +1 -1
- package/packages/apps/webhooks/package.json +1 -1
- package/packages/cli/package.json +1 -1
- package/packages/config/package.json +1 -1
- package/packages/emails/package.json +1 -1
- package/packages/events/package.json +1 -1
- package/packages/feeds/package.json +1 -1
- package/packages/firebase/package.json +1 -1
- package/packages/i18n/package.json +1 -1
- package/packages/modules/package.json +1 -1
- package/packages/passport/package.json +1 -1
- package/packages/ssr/lib/firebase/serve-storefront.js +83 -7
- package/packages/ssr/lib/firebase/serve-storefront.js.map +1 -1
- package/packages/ssr/package.json +1 -1
- package/packages/ssr/src/firebase/serve-storefront.ts +91 -7
- package/packages/storefront/dist/server/entry.mjs +1 -1
- package/packages/storefront/package.json +1 -1
- package/packages/types/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,13 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
|
|
4
4
|
|
|
5
|
+
### [0.16.2](https://github.com/ecomplus/cloud-commerce/compare/v0.16.1...v0.16.2) (2023-07-11)
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
### Bug Fixes
|
|
9
|
+
|
|
10
|
+
* **ssr:** Use `writeHead` middleware to set X-SSR-Took header ([cdee5c5](https://github.com/ecomplus/cloud-commerce/commit/cdee5c54680ca5f28d48a286f407946781eebc14))
|
|
11
|
+
|
|
5
12
|
### [0.16.1](https://github.com/ecomplus/cloud-commerce/compare/v0.16.0...v0.16.1) (2023-07-11)
|
|
6
13
|
|
|
7
14
|
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cloudcommerce",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.16.
|
|
4
|
+
"version": "0.16.2",
|
|
5
5
|
"description": "Open fair-code headless commerce platform: API-first, microservices based, event driven and cloud native",
|
|
6
6
|
"main": "packages/api/lib/index.js",
|
|
7
7
|
"author": "E-Com Club Softwares para E-commerce <ti@e-com.club>",
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { join as joinPath } from 'node:path';
|
|
2
2
|
import { readFile } from 'node:fs/promises';
|
|
3
|
+
import { getFirestore, Timestamp } from 'firebase-admin/firestore';
|
|
3
4
|
import logger from 'firebase-functions/logger';
|
|
4
5
|
|
|
5
6
|
const { STOREFRONT_BASE_DIR } = process.env;
|
|
@@ -8,7 +9,11 @@ const clientRoot = new URL(joinPath(baseDir, 'dist/client/'), import.meta.url);
|
|
|
8
9
|
let imagesManifest;
|
|
9
10
|
const builtImages = [];
|
|
10
11
|
|
|
11
|
-
export default (req, res) => {
|
|
12
|
+
export default async (req, res) => {
|
|
13
|
+
if (req.path.startsWith('/~partytown')) {
|
|
14
|
+
res.sendStatus(404);
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
12
17
|
res.set('X-XSS-Protection', '1; mode=block');
|
|
13
18
|
const url = req.url.replace(/\?.*$/, '').replace(/\.html$/, '');
|
|
14
19
|
const setStatusAndCache = (status, cacheControl) => {
|
|
@@ -69,20 +74,91 @@ export default (req, res) => {
|
|
|
69
74
|
res.sendStatus(400);
|
|
70
75
|
return;
|
|
71
76
|
}
|
|
72
|
-
const
|
|
73
|
-
|
|
77
|
+
const startedAt = Date.now();
|
|
78
|
+
let ssrStartedAt;
|
|
79
|
+
let status;
|
|
80
|
+
let headers = {};
|
|
81
|
+
const chunks = [];
|
|
82
|
+
/*
|
|
83
|
+
Check Response methods used by Astro Node.js integration:
|
|
84
|
+
https://github.com/withastro/astro/blob/main/packages/integrations/node/src/nodeMiddleware.ts
|
|
85
|
+
*/
|
|
86
|
+
const _writeHead = res.writeHead;
|
|
74
87
|
/* eslint-disable prefer-rest-params */
|
|
75
88
|
// @ts-ignore
|
|
76
|
-
res.
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
89
|
+
res.writeHead = function writeHead(_status, _headers) {
|
|
90
|
+
_headers['X-Function-Took'] = String(Date.now() - startedAt);
|
|
91
|
+
if (ssrStartedAt) {
|
|
92
|
+
_headers['X-SSR-Took'] = String(Date.now() - ssrStartedAt);
|
|
93
|
+
}
|
|
94
|
+
if (!res.headersSent) {
|
|
95
|
+
// @ts-ignore
|
|
96
|
+
_writeHead.apply(res, arguments);
|
|
97
|
+
}
|
|
98
|
+
status = _status;
|
|
99
|
+
headers = _headers;
|
|
100
|
+
};
|
|
101
|
+
let cacheRef;
|
|
102
|
+
if (!req.query.__noCache && req.path.charAt(1) !== '~') {
|
|
103
|
+
try {
|
|
104
|
+
const firestore = getFirestore();
|
|
105
|
+
cacheRef = firestore.doc(`ssrCache/${req.path.slice(1).replace(/\//g, '_')}`);
|
|
106
|
+
const cacheDoc = await cacheRef.get();
|
|
107
|
+
if (cacheDoc.exists) {
|
|
108
|
+
const {
|
|
109
|
+
headers: cachedHeaders, status: cachedStatus, chunks: cachedChunks, __timestamp,
|
|
110
|
+
} = cacheDoc.data();
|
|
111
|
+
const isFresh = (Timestamp.now().toMillis() - __timestamp.toMillis()) < 1000 * 60 * 2;
|
|
112
|
+
cachedHeaders['X-SWR-Date'] = (isFresh ? 'fresh ' : '')
|
|
113
|
+
+ __timestamp.toDate().toISOString();
|
|
114
|
+
res.writeHead(cachedStatus || 200, cachedHeaders);
|
|
115
|
+
cachedChunks.forEach((chunk) => {
|
|
116
|
+
res.write(chunk);
|
|
117
|
+
});
|
|
118
|
+
res.end();
|
|
119
|
+
if (isFresh) {
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
} catch (err) {
|
|
124
|
+
cacheRef = null;
|
|
125
|
+
logger.warn(err);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
const _write = res.write;
|
|
129
|
+
// @ts-ignore
|
|
130
|
+
res.write = function write(chunk) {
|
|
131
|
+
if (!res.headersSent) {
|
|
132
|
+
// @ts-ignore
|
|
133
|
+
_write.apply(res, arguments);
|
|
134
|
+
}
|
|
135
|
+
chunks.push(chunk);
|
|
136
|
+
};
|
|
137
|
+
const _end = res.end;
|
|
138
|
+
// @ts-ignore
|
|
139
|
+
res.end = function end() {
|
|
140
|
+
if (!res.headersSent) {
|
|
141
|
+
// @ts-ignore
|
|
142
|
+
_end.apply(res, arguments);
|
|
143
|
+
}
|
|
144
|
+
if (!status) {
|
|
145
|
+
status = res.statusCode;
|
|
146
|
+
}
|
|
147
|
+
if (cacheRef && status === 200) {
|
|
148
|
+
cacheRef.set({
|
|
149
|
+
headers,
|
|
150
|
+
status,
|
|
151
|
+
chunks,
|
|
152
|
+
__timestamp: Timestamp.now(),
|
|
153
|
+
}).catch(logger.warn);
|
|
154
|
+
}
|
|
80
155
|
};
|
|
81
156
|
/*
|
|
82
157
|
https://github.com/withastro/astro/blob/main/examples/ssr/server/server.mjs
|
|
83
158
|
import { handler as renderStorefront } from '../dist/server/entry.mjs';
|
|
84
159
|
global.$renderStorefront = renderStorefront;
|
|
85
160
|
*/
|
|
161
|
+
ssrStartedAt = Date.now();
|
|
86
162
|
global.$renderStorefront(req, res, async (err) => {
|
|
87
163
|
if (err) {
|
|
88
164
|
if (res.headersSent) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serve-storefront.js","sourceRoot":"","sources":["../../src/firebase/serve-storefront.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"serve-storefront.js","sourceRoot":"","sources":["../../src/firebase/serve-storefront.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,10 @@
|
|
|
1
|
+
import type { OutgoingHttpHeaders } from 'node:http';
|
|
2
|
+
import type { Readable } from 'node:stream';
|
|
1
3
|
import type { Request, Response } from 'firebase-functions';
|
|
4
|
+
import type { DocumentReference } from 'firebase-admin/firestore';
|
|
2
5
|
import { join as joinPath } from 'node:path';
|
|
3
6
|
import { readFile } from 'node:fs/promises';
|
|
7
|
+
import { getFirestore, Timestamp } from 'firebase-admin/firestore';
|
|
4
8
|
import logger from 'firebase-functions/logger';
|
|
5
9
|
|
|
6
10
|
declare global {
|
|
@@ -19,7 +23,11 @@ let imagesManifest: string;
|
|
|
19
23
|
type BuiltImage = { filename: string, width: number, height: number };
|
|
20
24
|
const builtImages: BuiltImage[] = [];
|
|
21
25
|
|
|
22
|
-
export default (req: Request, res: Response) => {
|
|
26
|
+
export default async (req: Request, res: Response) => {
|
|
27
|
+
if (req.path.startsWith('/~partytown')) {
|
|
28
|
+
res.sendStatus(404);
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
23
31
|
res.set('X-XSS-Protection', '1; mode=block');
|
|
24
32
|
const url = req.url.replace(/\?.*$/, '').replace(/\.html$/, '');
|
|
25
33
|
|
|
@@ -84,14 +92,89 @@ export default (req: Request, res: Response) => {
|
|
|
84
92
|
return;
|
|
85
93
|
}
|
|
86
94
|
|
|
87
|
-
const
|
|
88
|
-
|
|
95
|
+
const startedAt = Date.now();
|
|
96
|
+
let ssrStartedAt: number | undefined;
|
|
97
|
+
let status: number;
|
|
98
|
+
let headers: OutgoingHttpHeaders = {};
|
|
99
|
+
const chunks: Readable[] = [];
|
|
100
|
+
/*
|
|
101
|
+
Check Response methods used by Astro Node.js integration:
|
|
102
|
+
https://github.com/withastro/astro/blob/main/packages/integrations/node/src/nodeMiddleware.ts
|
|
103
|
+
*/
|
|
104
|
+
const _writeHead = res.writeHead;
|
|
89
105
|
/* eslint-disable prefer-rest-params */
|
|
90
106
|
// @ts-ignore
|
|
91
|
-
res.
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
107
|
+
res.writeHead = function writeHead(_status: number, _headers: OutgoingHttpHeaders) {
|
|
108
|
+
_headers['X-Function-Took'] = String(Date.now() - startedAt);
|
|
109
|
+
if (ssrStartedAt) {
|
|
110
|
+
_headers['X-SSR-Took'] = String(Date.now() - ssrStartedAt);
|
|
111
|
+
}
|
|
112
|
+
if (!res.headersSent) {
|
|
113
|
+
// @ts-ignore
|
|
114
|
+
_writeHead.apply(res, arguments);
|
|
115
|
+
}
|
|
116
|
+
status = _status;
|
|
117
|
+
headers = _headers;
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
let cacheRef: DocumentReference<any> | undefined | null;
|
|
121
|
+
if (!req.query.__noCache && req.path.charAt(1) !== '~') {
|
|
122
|
+
try {
|
|
123
|
+
const firestore = getFirestore();
|
|
124
|
+
cacheRef = firestore.doc(`ssrCache/${req.path.slice(1).replace(/\//g, '_')}`);
|
|
125
|
+
const cacheDoc = await cacheRef.get();
|
|
126
|
+
if (cacheDoc.exists) {
|
|
127
|
+
const {
|
|
128
|
+
headers: cachedHeaders,
|
|
129
|
+
status: cachedStatus,
|
|
130
|
+
chunks: cachedChunks,
|
|
131
|
+
__timestamp,
|
|
132
|
+
} = cacheDoc.data();
|
|
133
|
+
const isFresh = (Timestamp.now().toMillis() - __timestamp.toMillis()) < 1000 * 60 * 2;
|
|
134
|
+
cachedHeaders['X-SWR-Date'] = (isFresh ? 'fresh ' : '')
|
|
135
|
+
+ __timestamp.toDate().toISOString();
|
|
136
|
+
res.writeHead(cachedStatus || 200, cachedHeaders);
|
|
137
|
+
cachedChunks.forEach((chunk: Readable) => {
|
|
138
|
+
res.write(chunk);
|
|
139
|
+
});
|
|
140
|
+
res.end();
|
|
141
|
+
if (isFresh) {
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
} catch (err) {
|
|
146
|
+
cacheRef = null;
|
|
147
|
+
logger.warn(err);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
const _write = res.write;
|
|
152
|
+
// @ts-ignore
|
|
153
|
+
res.write = function write(chunk: Readable) {
|
|
154
|
+
if (!res.headersSent) {
|
|
155
|
+
// @ts-ignore
|
|
156
|
+
_write.apply(res, arguments);
|
|
157
|
+
}
|
|
158
|
+
chunks.push(chunk);
|
|
159
|
+
};
|
|
160
|
+
const _end = res.end;
|
|
161
|
+
// @ts-ignore
|
|
162
|
+
res.end = function end() {
|
|
163
|
+
if (!res.headersSent) {
|
|
164
|
+
// @ts-ignore
|
|
165
|
+
_end.apply(res, arguments);
|
|
166
|
+
}
|
|
167
|
+
if (!status) {
|
|
168
|
+
status = res.statusCode;
|
|
169
|
+
}
|
|
170
|
+
if (cacheRef && status === 200) {
|
|
171
|
+
cacheRef.set({
|
|
172
|
+
headers,
|
|
173
|
+
status,
|
|
174
|
+
chunks,
|
|
175
|
+
__timestamp: Timestamp.now(),
|
|
176
|
+
}).catch(logger.warn);
|
|
177
|
+
}
|
|
95
178
|
};
|
|
96
179
|
|
|
97
180
|
/*
|
|
@@ -99,6 +182,7 @@ export default (req: Request, res: Response) => {
|
|
|
99
182
|
import { handler as renderStorefront } from '../dist/server/entry.mjs';
|
|
100
183
|
global.$renderStorefront = renderStorefront;
|
|
101
184
|
*/
|
|
185
|
+
ssrStartedAt = Date.now();
|
|
102
186
|
global.$renderStorefront(req, res, async (err: any) => {
|
|
103
187
|
if (err) {
|
|
104
188
|
if (res.headersSent) {
|
|
@@ -2830,7 +2830,7 @@ const _page2 = () => import('./chunks/fallback@_@astro.6c7c4acd.mjs');
|
|
|
2830
2830
|
const _page3 = () => import('./chunks/index@_@astro.f7e2409d.mjs');
|
|
2831
2831
|
const _page4 = () => import('./chunks/account@_@astro.d58b2d34.mjs');
|
|
2832
2832
|
const _page5 = () => import('./chunks/_...06f412d0.mjs');const pageMap = new Map([["../../node_modules/.pnpm/@astrojs+image@0.17.2_astro@2.8.0_sharp@0.32.1/node_modules/@astrojs/image/dist/endpoint.js", _page0],["src/pages/index.astro", _page1],["src/pages/fallback.astro", _page2],["src/pages/app/index.astro", _page3],["src/pages/app/account.astro", _page4],["src/pages/[...slug].astro", _page5]]);
|
|
2833
|
-
const _manifest = Object.assign(deserializeManifest({"adapterName":"@astrojs/node","routes":[{"file":"","links":[],"scripts":[],"styles":[],"routeData":{"type":"endpoint","route":"/_image","pattern":"^\\/_image$","segments":[[{"content":"_image","dynamic":false,"spread":false}]],"params":[],"component":"../../node_modules/.pnpm/@astrojs+image@0.17.2_astro@2.8.0_sharp@0.32.1/node_modules/@astrojs/image/dist/endpoint.js","pathname":"/_image","prerender":false,"_meta":{"trailingSlash":"ignore"}}},{"file":"","links":[],"scripts":[{"type":"external","value":"/_astro/hoisted.9d9d7ac4.js"}],"styles":[{"type":"external","src":"/_astro/_...slug_.45bc69ca.css"}],"routeData":{"route":"/","type":"page","pattern":"^\\/$","segments":[],"params":[],"component":"src/pages/index.astro","pathname":"/","prerender":false,"_meta":{"trailingSlash":"ignore"}}},{"file":"","links":[],"scripts":[{"type":"external","value":"/_astro/hoisted.9d9d7ac4.js"}],"styles":[{"type":"external","src":"/_astro/_...slug_.45bc69ca.css"}],"routeData":{"route":"/fallback","type":"page","pattern":"^\\/fallback\\/?$","segments":[[{"content":"fallback","dynamic":false,"spread":false}]],"params":[],"component":"src/pages/fallback.astro","pathname":"/fallback","prerender":false,"_meta":{"trailingSlash":"ignore"}}},{"file":"","links":[],"scripts":[],"styles":[],"routeData":{"route":"/app","type":"page","pattern":"^\\/app\\/?$","segments":[[{"content":"app","dynamic":false,"spread":false}]],"params":[],"component":"src/pages/app/index.astro","pathname":"/app","prerender":false,"_meta":{"trailingSlash":"ignore"}}},{"file":"","links":[],"scripts":[],"styles":[],"routeData":{"route":"/app/account","type":"page","pattern":"^\\/app\\/account\\/?$","segments":[[{"content":"app","dynamic":false,"spread":false}],[{"content":"account","dynamic":false,"spread":false}]],"params":[],"component":"src/pages/app/account.astro","pathname":"/app/account","prerender":false,"_meta":{"trailingSlash":"ignore"}}},{"file":"","links":[],"scripts":[{"type":"external","value":"/_astro/hoisted.9d9d7ac4.js"}],"styles":[{"type":"external","src":"/_astro/_...slug_.45bc69ca.css"}],"routeData":{"route":"/[...slug]","type":"page","pattern":"^(?:\\/(.*?))?\\/?$","segments":[[{"content":"...slug","dynamic":true,"spread":true}]],"params":["...slug"],"component":"src/pages/[...slug].astro","prerender":false,"_meta":{"trailingSlash":"ignore"}}}],"site":"https://ecom2-demo.web.app","base":"/","compressHTML":false,"markdown":{"drafts":false,"syntaxHighlight":"shiki","shikiConfig":{"langs":[],"theme":"github-dark","wrap":false},"remarkPlugins":[],"rehypePlugins":[],"remarkRehype":{},"gfm":true,"smartypants":true},"componentMetadata":[["/home/leo/code/ecomplus/cloud-commerce/packages/storefront/src/pages/[...slug].astro",{"propagation":"none","containsHead":true}],["/home/leo/code/ecomplus/cloud-commerce/packages/storefront/src/pages/fallback.astro",{"propagation":"none","containsHead":true}],["/home/leo/code/ecomplus/cloud-commerce/packages/storefront/src/pages/index.astro",{"propagation":"none","containsHead":true}]],"renderers":[],"clientDirectives":[["idle","(()=>{var i=t=>{let e=async()=>{await(await t())()};\"requestIdleCallback\"in window?window.requestIdleCallback(e):setTimeout(e,200)};(self.Astro||(self.Astro={})).idle=i;window.dispatchEvent(new Event(\"astro:idle\"));})();"],["load","(()=>{var e=async t=>{await(await t())()};(self.Astro||(self.Astro={})).load=e;window.dispatchEvent(new Event(\"astro:load\"));})();"],["media","(()=>{var s=(i,t)=>{let a=async()=>{await(await i())()};if(t.value){let e=matchMedia(t.value);e.matches?a():e.addEventListener(\"change\",a,{once:!0})}};(self.Astro||(self.Astro={})).media=s;window.dispatchEvent(new Event(\"astro:media\"));})();"],["only","(()=>{var e=async t=>{await(await t())()};(self.Astro||(self.Astro={})).only=e;window.dispatchEvent(new Event(\"astro:only\"));})();"],["visible","(()=>{var r=(i,c,n)=>{let s=async()=>{await(await i())()},t=new IntersectionObserver(e=>{for(let o of e)if(o.isIntersecting){t.disconnect(),s();break}});for(let e of n.children)t.observe(e)};(self.Astro||(self.Astro={})).visible=r;window.dispatchEvent(new Event(\"astro:visible\"));})();"]],"entryModules":{"\u0000@astrojs-ssr-virtual-entry":"_@astrojs-ssr-virtual-entry.mjs","\u0000@astro-renderers":"renderers.mjs","\u0000empty-middleware":"_empty-middleware.mjs","/src/pages/app/account.astro":"chunks/pages/account.astro.f630663e.mjs","/src/pages/fallback.astro":"chunks/pages/fallback.astro.42f81a9a.mjs","\u0000@astro-page:../../node_modules/.pnpm/@astrojs+image@0.17.2_astro@2.8.0_sharp@0.32.1/node_modules/@astrojs/image/dist/endpoint@_@js":"chunks/endpoint@_@js.ce919661.mjs","\u0000@astro-page:src/pages/index@_@astro":"chunks/index@_@astro.8e359cb4.mjs","\u0000@astro-page:src/pages/fallback@_@astro":"chunks/fallback@_@astro.6c7c4acd.mjs","\u0000@astro-page:src/pages/app/index@_@astro":"chunks/index@_@astro.f7e2409d.mjs","\u0000@astro-page:src/pages/app/account@_@astro":"chunks/account@_@astro.d58b2d34.mjs","\u0000@astro-page:src/pages/[...slug]@_@astro":"chunks/_...06f412d0.mjs","/
|
|
2833
|
+
const _manifest = Object.assign(deserializeManifest({"adapterName":"@astrojs/node","routes":[{"file":"","links":[],"scripts":[],"styles":[],"routeData":{"type":"endpoint","route":"/_image","pattern":"^\\/_image$","segments":[[{"content":"_image","dynamic":false,"spread":false}]],"params":[],"component":"../../node_modules/.pnpm/@astrojs+image@0.17.2_astro@2.8.0_sharp@0.32.1/node_modules/@astrojs/image/dist/endpoint.js","pathname":"/_image","prerender":false,"_meta":{"trailingSlash":"ignore"}}},{"file":"","links":[],"scripts":[{"type":"external","value":"/_astro/hoisted.9d9d7ac4.js"}],"styles":[{"type":"external","src":"/_astro/_...slug_.45bc69ca.css"}],"routeData":{"route":"/","type":"page","pattern":"^\\/$","segments":[],"params":[],"component":"src/pages/index.astro","pathname":"/","prerender":false,"_meta":{"trailingSlash":"ignore"}}},{"file":"","links":[],"scripts":[{"type":"external","value":"/_astro/hoisted.9d9d7ac4.js"}],"styles":[{"type":"external","src":"/_astro/_...slug_.45bc69ca.css"}],"routeData":{"route":"/fallback","type":"page","pattern":"^\\/fallback\\/?$","segments":[[{"content":"fallback","dynamic":false,"spread":false}]],"params":[],"component":"src/pages/fallback.astro","pathname":"/fallback","prerender":false,"_meta":{"trailingSlash":"ignore"}}},{"file":"","links":[],"scripts":[],"styles":[],"routeData":{"route":"/app","type":"page","pattern":"^\\/app\\/?$","segments":[[{"content":"app","dynamic":false,"spread":false}]],"params":[],"component":"src/pages/app/index.astro","pathname":"/app","prerender":false,"_meta":{"trailingSlash":"ignore"}}},{"file":"","links":[],"scripts":[],"styles":[],"routeData":{"route":"/app/account","type":"page","pattern":"^\\/app\\/account\\/?$","segments":[[{"content":"app","dynamic":false,"spread":false}],[{"content":"account","dynamic":false,"spread":false}]],"params":[],"component":"src/pages/app/account.astro","pathname":"/app/account","prerender":false,"_meta":{"trailingSlash":"ignore"}}},{"file":"","links":[],"scripts":[{"type":"external","value":"/_astro/hoisted.9d9d7ac4.js"}],"styles":[{"type":"external","src":"/_astro/_...slug_.45bc69ca.css"}],"routeData":{"route":"/[...slug]","type":"page","pattern":"^(?:\\/(.*?))?\\/?$","segments":[[{"content":"...slug","dynamic":true,"spread":true}]],"params":["...slug"],"component":"src/pages/[...slug].astro","prerender":false,"_meta":{"trailingSlash":"ignore"}}}],"site":"https://ecom2-demo.web.app","base":"/","compressHTML":false,"markdown":{"drafts":false,"syntaxHighlight":"shiki","shikiConfig":{"langs":[],"theme":"github-dark","wrap":false},"remarkPlugins":[],"rehypePlugins":[],"remarkRehype":{},"gfm":true,"smartypants":true},"componentMetadata":[["/home/leo/code/ecomplus/cloud-commerce/packages/storefront/src/pages/[...slug].astro",{"propagation":"none","containsHead":true}],["/home/leo/code/ecomplus/cloud-commerce/packages/storefront/src/pages/fallback.astro",{"propagation":"none","containsHead":true}],["/home/leo/code/ecomplus/cloud-commerce/packages/storefront/src/pages/index.astro",{"propagation":"none","containsHead":true}]],"renderers":[],"clientDirectives":[["idle","(()=>{var i=t=>{let e=async()=>{await(await t())()};\"requestIdleCallback\"in window?window.requestIdleCallback(e):setTimeout(e,200)};(self.Astro||(self.Astro={})).idle=i;window.dispatchEvent(new Event(\"astro:idle\"));})();"],["load","(()=>{var e=async t=>{await(await t())()};(self.Astro||(self.Astro={})).load=e;window.dispatchEvent(new Event(\"astro:load\"));})();"],["media","(()=>{var s=(i,t)=>{let a=async()=>{await(await i())()};if(t.value){let e=matchMedia(t.value);e.matches?a():e.addEventListener(\"change\",a,{once:!0})}};(self.Astro||(self.Astro={})).media=s;window.dispatchEvent(new Event(\"astro:media\"));})();"],["only","(()=>{var e=async t=>{await(await t())()};(self.Astro||(self.Astro={})).only=e;window.dispatchEvent(new Event(\"astro:only\"));})();"],["visible","(()=>{var r=(i,c,n)=>{let s=async()=>{await(await i())()},t=new IntersectionObserver(e=>{for(let o of e)if(o.isIntersecting){t.disconnect(),s();break}});for(let e of n.children)t.observe(e)};(self.Astro||(self.Astro={})).visible=r;window.dispatchEvent(new Event(\"astro:visible\"));})();"]],"entryModules":{"\u0000@astrojs-ssr-virtual-entry":"_@astrojs-ssr-virtual-entry.mjs","\u0000@astro-renderers":"renderers.mjs","\u0000empty-middleware":"_empty-middleware.mjs","/src/pages/app/account.astro":"chunks/pages/account.astro.f630663e.mjs","/src/pages/fallback.astro":"chunks/pages/fallback.astro.42f81a9a.mjs","\u0000@astro-page:../../node_modules/.pnpm/@astrojs+image@0.17.2_astro@2.8.0_sharp@0.32.1/node_modules/@astrojs/image/dist/endpoint@_@js":"chunks/endpoint@_@js.ce919661.mjs","\u0000@astro-page:src/pages/index@_@astro":"chunks/index@_@astro.8e359cb4.mjs","\u0000@astro-page:src/pages/fallback@_@astro":"chunks/fallback@_@astro.6c7c4acd.mjs","\u0000@astro-page:src/pages/app/index@_@astro":"chunks/index@_@astro.f7e2409d.mjs","\u0000@astro-page:src/pages/app/account@_@astro":"chunks/account@_@astro.d58b2d34.mjs","\u0000@astro-page:src/pages/[...slug]@_@astro":"chunks/_...06f412d0.mjs","~/components/HeroSlider.vue":"_astro/HeroSlider.3d4a1d1c.js","/astro/hoisted.js?q=0":"_astro/hoisted.9d9d7ac4.js","~/components/PitchBar.vue":"_astro/PitchBar.c53e6d0b.js","~/components/ProductShelf.vue":"_astro/ProductShelf.f013b3ee.js","@astrojs/vue/client.js":"_astro/client.2d950540.js","/home/leo/code/ecomplus/cloud-commerce/node_modules/workbox-window/build/workbox-window.prod.es5.mjs":"_astro/workbox-window.prod.es5.a7b12eab.js","~/components/Prices.vue":"_astro/Prices.de6df3cb.js","~/components/ShopHeader.vue":"_astro/ShopHeader.c0ba5061.js","/home/leo/code/ecomplus/cloud-commerce/packages/storefront/src/lib/scripts/firebase-app.ts":"_astro/firebase-app.84207480.js","astro:scripts/before-hydration.js":""},"assets":["/_astro/_...slug_.45bc69ca.css","/manifest.webmanifest","/robots.txt","/sw.js","/workbox-5e0bf4e4.js","/_astro/Carousel.f39be3c0.js","/_astro/HeroSlider.3d4a1d1c.js","/_astro/PitchBar.c53e6d0b.js","/_astro/Prices.de6df3cb.js","/_astro/ProductShelf.f013b3ee.js","/_astro/ShopHeader.c0ba5061.js","/_astro/_plugin-vue_export-helper.d3aaeb0d.js","/_astro/api.7f62c1ff.js","/_astro/client.2d950540.js","/_astro/firebase-app.84207480.js","/_astro/format-money.3b884fcb.js","/_astro/hoisted.9d9d7ac4.js","/_astro/idle-callback.889bf0ea.js","/_astro/img.517fec8e.js","/_astro/index.33347cbd.js","/_astro/modules-info.ad27b027.js","/_astro/preload-helper.cf010ec4.js","/_astro/runtime-dom.esm-bundler.00b967e0.js","/_astro/session-utm.744b0db3.js","/_astro/workbox-window.prod.es5.a7b12eab.js","/assets/cms-preview.css","/assets/cms.css","/assets/cvv.png","/assets/img-placeholder.png","/assets/payments.png","/assets/ssl-safe.png","/img/icon.png","/img/large-icon.png","/img/uploads/banner1.png","/img/uploads/banner2.png","/img/uploads/banner2.webp","/img/uploads/ecom-icon.png","/img/uploads/favicon.png","/img/uploads/headless.png","/img/uploads/headphone.png","/img/uploads/headphone.webp","/img/uploads/logo.png","/img/uploads/og-image.png","/img/uploads/passion.png","/img/uploads/passion.webp","/img/uploads/pwa-reliable.png","/img/uploads/rect8589.png","/img/uploads/rect859.png","/img/uploads/rect89.png","/img/uploads/rect89.webp","/img/uploads/ssl-safe.png"]}), {
|
|
2834
2834
|
pageMap,
|
|
2835
2835
|
renderers,
|
|
2836
2836
|
});
|