crelte 0.6.0-alpha.1 → 0.6.0-alpha.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/dist/node/index.d.ts.map +1 -1
- package/dist/node/index.js +15 -11
- package/dist/queries/Queries.d.ts +7 -1
- package/dist/queries/Queries.d.ts.map +1 -1
- package/dist/queries/Queries.js +3 -0
- package/dist/routing/route/BaseRoute.d.ts +4 -0
- package/dist/routing/route/BaseRoute.d.ts.map +1 -1
- package/dist/routing/route/BaseRoute.js +6 -0
- package/dist/routing/router/BaseRouter.d.ts.map +1 -1
- package/dist/routing/router/BaseRouter.js +4 -3
- package/dist/routing/router/ClientRouter.d.ts +1 -0
- package/dist/routing/router/ClientRouter.d.ts.map +1 -1
- package/dist/routing/router/ClientRouter.js +19 -5
- package/dist/server/queries/QueryGqlRoute.d.ts.map +1 -1
- package/dist/server/queries/QueryGqlRoute.js +6 -9
- package/dist/server/shared.d.ts +2 -1
- package/dist/server/shared.d.ts.map +1 -1
- package/dist/server/shared.js +20 -10
- package/dist/vite/index.d.ts.map +1 -1
- package/dist/vite/index.js +4 -3
- package/package.json +1 -1
- package/src/node/index.ts +24 -9
- package/src/queries/Queries.ts +12 -1
- package/src/routing/route/BaseRoute.ts +7 -0
- package/src/routing/router/BaseRouter.ts +6 -3
- package/src/routing/router/ClientRouter.ts +26 -7
- package/src/server/queries/QueryGqlRoute.ts +7 -10
- package/src/server/shared.ts +26 -8
- package/src/vite/index.ts +11 -2
package/dist/node/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/node/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/node/index.ts"],"names":[],"mappings":"AAqEA;;;;GAIG;AACH,wBAA8B,YAAY,CAAC,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,iBA8G3E"}
|
package/dist/node/index.js
CHANGED
|
@@ -2,7 +2,7 @@ import http from 'node:http';
|
|
|
2
2
|
import path, { join } from 'node:path';
|
|
3
3
|
import fs from 'node:fs/promises';
|
|
4
4
|
import { createReadStream } from 'node:fs';
|
|
5
|
-
import { initEnvData, initSites, modRender, modRenderError, } from '../server/shared.js';
|
|
5
|
+
import { initEnvData, initSites, initRequestSites, modRender, modRenderError, } from '../server/shared.js';
|
|
6
6
|
import ServerRouter from '../server/ServerRouter.js';
|
|
7
7
|
import { fileURLToPath } from 'node:url';
|
|
8
8
|
import { initQueryRoutes } from '../server/queries/queries.js';
|
|
@@ -17,12 +17,14 @@ async function readSitesCache() {
|
|
|
17
17
|
async function writeSitesCache(data) {
|
|
18
18
|
return await writeFile(localDir('sites.json'), JSON.stringify(data));
|
|
19
19
|
}
|
|
20
|
-
async function initRouter(serverMod, env) {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
20
|
+
async function initRouter(serverMod, env, sites) {
|
|
21
|
+
if (!sites) {
|
|
22
|
+
sites = await initSites(env, {
|
|
23
|
+
enabled: process.env.NODE_ENV === 'production',
|
|
24
|
+
writeSitesCache,
|
|
25
|
+
readSitesCache,
|
|
26
|
+
});
|
|
27
|
+
}
|
|
26
28
|
const router = new ServerRouter(env.endpointUrl, env.frontendUrl, env.env, sites, {
|
|
27
29
|
endpointToken: env.endpointToken,
|
|
28
30
|
});
|
|
@@ -75,16 +77,18 @@ export default async function createServer(serverMod, buildTime) {
|
|
|
75
77
|
if (routesError || !router || !sites) {
|
|
76
78
|
throw routesError ?? new Error('Router not initialized');
|
|
77
79
|
}
|
|
78
|
-
const
|
|
80
|
+
const requestSites = await initRequestSites(env, sites, req);
|
|
81
|
+
const requestRouter = requestSites === sites
|
|
82
|
+
? router
|
|
83
|
+
: (await initRouter(serverMod, env, requestSites))[1];
|
|
84
|
+
const routeResp = await requestRouter.z_handle(req);
|
|
79
85
|
if (routeResp) {
|
|
80
86
|
await webResponseToResponse(routeResp, res);
|
|
81
87
|
return;
|
|
82
88
|
}
|
|
83
89
|
if (await basicAuthCheck(req, res, env))
|
|
84
90
|
return;
|
|
85
|
-
const response = await modRender(env,
|
|
86
|
-
ssrManifest,
|
|
87
|
-
});
|
|
91
|
+
const response = await modRender(env, requestSites, serverMod, template, req, { ssrManifest });
|
|
88
92
|
await webResponseToResponse(response, res);
|
|
89
93
|
};
|
|
90
94
|
http.createServer(async (nodeReq, res) => {
|
|
@@ -47,10 +47,16 @@ export type QueryOptions = {
|
|
|
47
47
|
*/
|
|
48
48
|
bearerToken?: string;
|
|
49
49
|
/**
|
|
50
|
-
* Configure caching
|
|
50
|
+
* Configure Crelte's local query caching.
|
|
51
51
|
* @default true
|
|
52
52
|
*/
|
|
53
53
|
caching?: boolean;
|
|
54
|
+
/**
|
|
55
|
+
* Allow Craft's configured GraphQL caching. Set false to bypass it.
|
|
56
|
+
* Does not affect Crelte's caching.
|
|
57
|
+
* @default true
|
|
58
|
+
*/
|
|
59
|
+
craftCaching?: boolean;
|
|
54
60
|
/**
|
|
55
61
|
* Usually automatically set
|
|
56
62
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Queries.d.ts","sourceRoot":"","sources":["../../src/queries/Queries.ts"],"names":[],"mappings":"AAAA,OAAO,QAAwC,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EAAa,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAEhE,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAElD;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG;IAC5B,KAAK,CAAC,EAAE,QAAQ,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,WAAW,CAAC,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,MAAM,KAAK,GAAG,MAAM,GAAG,QAAQ,CAAC;AAEtC;;;GAGG;AACH,MAAM,MAAM,QAAQ,GAAG;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAExD,mDAAmD;AACnD,wBAAgB,OAAO,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,IAAI,KAAK,CAO9C;AAED;;;;;;;;;GASG;AACH,MAAM,MAAM,YAAY,GAAG;IAC1B;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,OAAO,OAAO,OAAO;IAC3B,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,KAAK,CAAgC;IAE7C,OAAO,CAAC,OAAO,CAAiB;IAEhC,OAAO;IAUP;;;;;;;;OAQG;IACH,MAAM,CAAC,GAAG,CACT,QAAQ,EAAE,MAAM,EAChB,QAAQ,GAAE,MAAM,GAAG,IAAW,EAC9B,QAAQ,GAAE,QAAyB,EACnC,IAAI,GAAE,cAAmB,GACvB,OAAO;IAQV;;;OAGG;IACH,MAAM,CAAC,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO;IAQnE;;;;;;;OAOG;IACG,KAAK,CACV,KAAK,EAAE,KAAK,EACZ,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EAClC,IAAI,GAAE,YAAiB,GACrB,OAAO,CAAC,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"Queries.d.ts","sourceRoot":"","sources":["../../src/queries/Queries.ts"],"names":[],"mappings":"AAAA,OAAO,QAAwC,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EAAa,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAEhE,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAElD;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG;IAC5B,KAAK,CAAC,EAAE,QAAQ,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,WAAW,CAAC,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,MAAM,KAAK,GAAG,MAAM,GAAG,QAAQ,CAAC;AAEtC;;;GAGG;AACH,MAAM,MAAM,QAAQ,GAAG;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAExD,mDAAmD;AACnD,wBAAgB,OAAO,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,IAAI,KAAK,CAO9C;AAED;;;;;;;;;GASG;AACH,MAAM,MAAM,YAAY,GAAG;IAC1B;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB;;;;OAIG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IAEvB;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,OAAO,OAAO,OAAO;IAC3B,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,KAAK,CAAgC;IAE7C,OAAO,CAAC,OAAO,CAAiB;IAEhC,OAAO;IAUP;;;;;;;;OAQG;IACH,MAAM,CAAC,GAAG,CACT,QAAQ,EAAE,MAAM,EAChB,QAAQ,GAAE,MAAM,GAAG,IAAW,EAC9B,QAAQ,GAAE,QAAyB,EACnC,IAAI,GAAE,cAAmB,GACvB,OAAO;IAQV;;;OAGG;IACH,MAAM,CAAC,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO;IAQnE;;;;;;;OAOG;IACG,KAAK,CACV,KAAK,EAAE,KAAK,EACZ,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EAClC,IAAI,GAAE,YAAiB,GACrB,OAAO,CAAC,OAAO,CAAC;IA2BnB;;;OAGG;IACH,WAAW,CAAC,GAAG,EAAE,OAAO;CAGxB"}
|
package/dist/queries/Queries.js
CHANGED
|
@@ -68,6 +68,7 @@ export default class Queries {
|
|
|
68
68
|
bearerToken,
|
|
69
69
|
xCraftSiteId,
|
|
70
70
|
caching: opts.caching ?? true,
|
|
71
|
+
craftCaching: opts.craftCaching ?? true,
|
|
71
72
|
});
|
|
72
73
|
}
|
|
73
74
|
/**
|
|
@@ -165,6 +166,8 @@ class Inner {
|
|
|
165
166
|
headers['Authorization'] = 'Bearer ' + opts.bearerToken;
|
|
166
167
|
if (opts.xCraftSiteId)
|
|
167
168
|
headers['X-Craft-Site'] = opts.xCraftSiteId.toString();
|
|
169
|
+
if (!opts.craftCaching)
|
|
170
|
+
headers['X-Craft-GQL-Cache'] = 'no-cache';
|
|
168
171
|
if (this.loggingRequests) {
|
|
169
172
|
console.log(logName + ' to:', url.toString(), vars, headers);
|
|
170
173
|
headers['X-Debug'] = 'enable';
|
|
@@ -209,6 +209,10 @@ export default class BaseRoute {
|
|
|
209
209
|
* The context is not cloned in the clone call and will be the same object.
|
|
210
210
|
*/
|
|
211
211
|
setContext<T>(key: string, value: T | null | undefined): void;
|
|
212
|
+
/**
|
|
213
|
+
* Returns the site preview token, or null if it is missing or empty.
|
|
214
|
+
*/
|
|
215
|
+
getSiteToken(): string | null;
|
|
212
216
|
/**
|
|
213
217
|
* Returns true if the route is in live preview mode
|
|
214
218
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaseRoute.d.ts","sourceRoot":"","sources":["../../../src/routing/route/BaseRoute.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"BaseRoute.d.ts","sourceRoot":"","sources":["../../../src/routing/route/BaseRoute.ts"],"names":[],"mappings":"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"}
|
|
@@ -240,6 +240,12 @@ export default class BaseRoute {
|
|
|
240
240
|
this.z_context[key] = value;
|
|
241
241
|
}
|
|
242
242
|
}
|
|
243
|
+
/**
|
|
244
|
+
* Returns the site preview token, or null if it is missing or empty.
|
|
245
|
+
*/
|
|
246
|
+
getSiteToken() {
|
|
247
|
+
return this.search.get('siteToken') || null;
|
|
248
|
+
}
|
|
243
249
|
/**
|
|
244
250
|
* Returns true if the route is in live preview mode
|
|
245
251
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaseRouter.d.ts","sourceRoot":"","sources":["../../../src/routing/router/BaseRouter.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"BaseRouter.d.ts","sourceRoot":"","sources":["../../../src/routing/router/BaseRouter.ts"],"names":[],"mappings":"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"}
|
|
@@ -175,9 +175,10 @@ export default class BaseRouter {
|
|
|
175
175
|
async preload(target) {
|
|
176
176
|
const req = this.targetToRequest(target, { origin: 'preload' });
|
|
177
177
|
const current = this.route.get();
|
|
178
|
-
//
|
|
179
|
-
|
|
180
|
-
|
|
178
|
+
// Preload only within the current origin and site preview context.
|
|
179
|
+
if (current &&
|
|
180
|
+
current.url.origin === req.url.origin &&
|
|
181
|
+
current.getSiteToken() === req.getSiteToken()) {
|
|
181
182
|
// todo i don't wan't to send a CrelteRequest?
|
|
182
183
|
// todo, it would be nice if this could not have any side effects
|
|
183
184
|
// but at the moment cr.router.open will cause a redirect
|
|
@@ -22,6 +22,7 @@ export default class ClientRouter extends BaseRouter {
|
|
|
22
22
|
pushRequest(req: Request, _opts?: RequestOptions): Promise<void | Route>;
|
|
23
23
|
replaceRequest(req: Request, _opts?: RequestOptions): Promise<void | Route>;
|
|
24
24
|
back(): void;
|
|
25
|
+
private requiresPageLoad;
|
|
25
26
|
/**
|
|
26
27
|
* This returns a route if it was handled else if an error occured
|
|
27
28
|
* or the request was cancelled returns void
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ClientRouter.d.ts","sourceRoot":"","sources":["../../../src/routing/router/ClientRouter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,UAAU,EAAE,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,KAAK,MAAM,mBAAmB,CAAC;AACtC,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAG7C,MAAM,MAAM,mBAAmB,GAAG;IACjC,kBAAkB,EAAE,OAAO,CAAC;CAC5B,GAAG,iBAAiB,CAAC;AAEtB,MAAM,CAAC,OAAO,OAAO,YAAa,SAAQ,UAAU;IACnD,OAAO,CAAC,qBAAqB,CAAa;IAC1C,OAAO,CAAC,kBAAkB,CAAU;IAEpC,OAAO,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,KAAK,IAAI,CAAC;gBAE5B,KAAK,EAAE,eAAe,EAAE,EAAE,IAAI,EAAE,mBAAmB;
|
|
1
|
+
{"version":3,"file":"ClientRouter.d.ts","sourceRoot":"","sources":["../../../src/routing/router/ClientRouter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,UAAU,EAAE,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,KAAK,MAAM,mBAAmB,CAAC;AACtC,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAG7C,MAAM,MAAM,mBAAmB,GAAG;IACjC,kBAAkB,EAAE,OAAO,CAAC;CAC5B,GAAG,iBAAiB,CAAC;AAEtB,MAAM,CAAC,OAAO,OAAO,YAAa,SAAQ,UAAU;IACnD,OAAO,CAAC,qBAAqB,CAAa;IAC1C,OAAO,CAAC,kBAAkB,CAAU;IAEpC,OAAO,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,KAAK,IAAI,CAAC;gBAE5B,KAAK,EAAE,eAAe,EAAE,EAAE,IAAI,EAAE,mBAAmB;IAS/D;;OAEG;IACG,IAAI;IA8BV;;OAEG;IACG,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IAuChD,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,GAAE,cAAmB;IAiBpD,cAAc,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,GAAE,cAAmB;IAiB7D,IAAI,IAAI,IAAI;IAIZ,OAAO,CAAC,gBAAgB;IASxB;;;OAGG;IACG,qBAAqB,CAC1B,GAAG,EAAE,OAAO,EACZ,aAAa,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GACnC,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IASxB,MAAM;IAuEN,QAAQ;IAgCR,YAAY,CAAC,EAAE,EAAE,aAAa,EAAE,MAAM,EAAE,KAAK,GAAG,IAAI;CAgEpD"}
|
|
@@ -59,11 +59,7 @@ export default class ClientRouter extends BaseRouter {
|
|
|
59
59
|
window.history.replaceState(current.z_toState(), '');
|
|
60
60
|
}
|
|
61
61
|
}
|
|
62
|
-
|
|
63
|
-
// new site we need to do a window.location.href call
|
|
64
|
-
if ((current && current.url.origin !== req.url.origin) ||
|
|
65
|
-
// @ts-ignore
|
|
66
|
-
import.meta.env.SSR) {
|
|
62
|
+
if (this.requiresPageLoad(req)) {
|
|
67
63
|
window.location.href = req.url.href;
|
|
68
64
|
return;
|
|
69
65
|
}
|
|
@@ -75,12 +71,20 @@ export default class ClientRouter extends BaseRouter {
|
|
|
75
71
|
}
|
|
76
72
|
async pushRequest(req, _opts = {}) {
|
|
77
73
|
const url = req.url;
|
|
74
|
+
if (this.requiresPageLoad(req)) {
|
|
75
|
+
window.location.href = url.href;
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
78
|
return this.handleRequest(req, route => {
|
|
79
79
|
window.history.pushState(route.z_toState(), '', url.pathname + url.search + url.hash);
|
|
80
80
|
});
|
|
81
81
|
}
|
|
82
82
|
async replaceRequest(req, _opts = {}) {
|
|
83
83
|
const url = req.url;
|
|
84
|
+
if (this.requiresPageLoad(req)) {
|
|
85
|
+
window.location.replace(url.href);
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
84
88
|
return this.handleRequest(req, () => {
|
|
85
89
|
window.history.replaceState(req.z_toState(), '', url.pathname + url.search + url.hash);
|
|
86
90
|
});
|
|
@@ -88,6 +92,12 @@ export default class ClientRouter extends BaseRouter {
|
|
|
88
92
|
back() {
|
|
89
93
|
window.history.back();
|
|
90
94
|
}
|
|
95
|
+
requiresPageLoad(req) {
|
|
96
|
+
const current = this.route.get();
|
|
97
|
+
return (!!current &&
|
|
98
|
+
(current.url.origin !== req.url.origin ||
|
|
99
|
+
current.getSiteToken() !== req.getSiteToken()));
|
|
100
|
+
}
|
|
91
101
|
/**
|
|
92
102
|
* This returns a route if it was handled else if an error occured
|
|
93
103
|
* or the request was cancelled returns void
|
|
@@ -147,6 +157,10 @@ export default class ClientRouter extends BaseRouter {
|
|
|
147
157
|
origin: 'pop',
|
|
148
158
|
});
|
|
149
159
|
req.z_fillFromState(e.state);
|
|
160
|
+
if (this.requiresPageLoad(req)) {
|
|
161
|
+
window.location.reload();
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
150
164
|
// todo handle errors
|
|
151
165
|
this.handleRequest(req, () => { });
|
|
152
166
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"QueryGqlRoute.d.ts","sourceRoot":"","sources":["../../../src/server/queries/QueryGqlRoute.ts"],"names":[],"mappings":"AAAA,OAAO,mBAAmB,MAAM,oBAAoB,CAAC;AACrD,OAAO,cAAc,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAQ,MAAM,uBAAuB,CAAC;AAGvD,OAAO,EACN,SAAS,EAET,WAAW,EAEX,SAAS,EACT,MAAM,aAAa,CAAC;AAGrB,MAAM,MAAM,YAAY,GAAG;IAC1B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,IAAI,CAAC;IACtC,SAAS,EAAE,SAAS,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAE,SAAS,GAAG,IAAI,CAAC;IAC5B,cAAc,EAAE,OAAO,CAAC;IACxB,WAAW,EAAE,WAAW,GAAG,IAAI,CAAC;CAChC,CAAC;AAGF,MAAM,CAAC,OAAO,OAAO,aAAa;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,IAAI,CAAC;IACtC,SAAS,EAAE,SAAS,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAE,SAAS,GAAG,IAAI,CAAC;IAC5B,WAAW,EAAE,WAAW,GAAG,IAAI,CAAC;gBAEpB,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY;IA6BrD,IAAI;IAIV,OAAO,CAAC,iBAAiB;IAazB,OAAO,CAAC,kBAAkB;IAO1B;;;OAGG;IACH,OAAO,CAAC,iBAAiB;YAuBX,SAAS;IAWjB,MAAM,CACX,OAAO,EAAE,cAAc,EACvB,GAAG,EAAE,mBAAmB,GACtB,OAAO,CAAC,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"QueryGqlRoute.d.ts","sourceRoot":"","sources":["../../../src/server/queries/QueryGqlRoute.ts"],"names":[],"mappings":"AAAA,OAAO,mBAAmB,MAAM,oBAAoB,CAAC;AACrD,OAAO,cAAc,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAQ,MAAM,uBAAuB,CAAC;AAGvD,OAAO,EACN,SAAS,EAET,WAAW,EAEX,SAAS,EACT,MAAM,aAAa,CAAC;AAGrB,MAAM,MAAM,YAAY,GAAG;IAC1B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,IAAI,CAAC;IACtC,SAAS,EAAE,SAAS,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAE,SAAS,GAAG,IAAI,CAAC;IAC5B,cAAc,EAAE,OAAO,CAAC;IACxB,WAAW,EAAE,WAAW,GAAG,IAAI,CAAC;CAChC,CAAC;AAGF,MAAM,CAAC,OAAO,OAAO,aAAa;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,IAAI,CAAC;IACtC,SAAS,EAAE,SAAS,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAE,SAAS,GAAG,IAAI,CAAC;IAC5B,WAAW,EAAE,WAAW,GAAG,IAAI,CAAC;gBAEpB,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY;IA6BrD,IAAI;IAIV,OAAO,CAAC,iBAAiB;IAazB,OAAO,CAAC,kBAAkB;IAO1B;;;OAGG;IACH,OAAO,CAAC,iBAAiB;YAuBX,SAAS;IAWjB,MAAM,CACX,OAAO,EAAE,cAAc,EACvB,GAAG,EAAE,mBAAmB,GACtB,OAAO,CAAC,QAAQ,CAAC;CAqHpB"}
|
|
@@ -106,19 +106,13 @@ export default class QueryGqlRoute {
|
|
|
106
106
|
if (caching.debug) {
|
|
107
107
|
logInfo = `[queries: ${this.name}] vars: ${JSON.stringify(vars)}`;
|
|
108
108
|
}
|
|
109
|
-
let previewToken = null;
|
|
110
|
-
let siteToken = null;
|
|
111
109
|
const reqSearch = new URL(csr.req.url).searchParams;
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
}
|
|
115
|
-
else if (reqSearch.has('siteToken')) {
|
|
116
|
-
siteToken = reqSearch.get('siteToken');
|
|
117
|
-
}
|
|
110
|
+
const previewToken = reqSearch.get('token');
|
|
111
|
+
const siteToken = reqSearch.get('siteToken');
|
|
118
112
|
// check for x-craft-site header and pass it on
|
|
119
113
|
const xCraftSite = csr.req.headers.get('X-Craft-Site');
|
|
120
114
|
let cacheKey = null;
|
|
121
|
-
const useCache = !previewToken && caching.isEnabled();
|
|
115
|
+
const useCache = !previewToken && !siteToken && caching.isEnabled();
|
|
122
116
|
if (useCache) {
|
|
123
117
|
cacheKey = await calcKey({
|
|
124
118
|
...vars,
|
|
@@ -149,6 +143,9 @@ export default class QueryGqlRoute {
|
|
|
149
143
|
headers['X-Debug'] = xDebug;
|
|
150
144
|
if (xCraftSite)
|
|
151
145
|
headers['X-Craft-Site'] = xCraftSite;
|
|
146
|
+
if (csr.req.headers.get('X-Craft-GQL-Cache') === 'no-cache') {
|
|
147
|
+
headers['X-Craft-GQL-Cache'] = 'no-cache';
|
|
148
|
+
}
|
|
152
149
|
// now execute the gql request
|
|
153
150
|
let resp;
|
|
154
151
|
try {
|
package/dist/server/shared.d.ts
CHANGED
|
@@ -23,7 +23,8 @@ export type SitesCache = {
|
|
|
23
23
|
readSitesCache?: () => Promise<any>;
|
|
24
24
|
writeSitesCache?: (data: any) => Promise<void>;
|
|
25
25
|
};
|
|
26
|
-
export declare function initSites(env: EnvData, cache?: SitesCache): Promise<SiteFromGraphQl[]>;
|
|
26
|
+
export declare function initSites(env: EnvData, cache?: SitesCache, siteToken?: string): Promise<SiteFromGraphQl[]>;
|
|
27
|
+
export declare function initRequestSites(env: EnvData, sites: SiteFromGraphQl[], req: Request): Promise<SiteFromGraphQl[]>;
|
|
27
28
|
export type ModRenderOptions = {
|
|
28
29
|
ssrManifest?: Record<string, string[]>;
|
|
29
30
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/server/shared.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAGrD,MAAM,MAAM,aAAa,GAAG;IAE3B,EAAE,CAAC,EAAE,OAAO,CAAC;CACb,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;CACjB,CAAC;AAQF,MAAM,MAAM,OAAO,GAAG;IACrB,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC7B,CAAC;AAEF,wBAAsB,WAAW,CAAC,EAAE,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,CAkChE;AAED,MAAM,MAAM,UAAU,GAAG;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;IACpC,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/C,CAAC;AAEF,wBAAsB,SAAS,CAC9B,GAAG,EAAE,OAAO,EACZ,KAAK,CAAC,EAAE,UAAU,GAChB,OAAO,CAAC,eAAe,EAAE,CAAC,CAQ5B;
|
|
1
|
+
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/server/shared.ts"],"names":[],"mappings":"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"}
|
package/dist/server/shared.js
CHANGED
|
@@ -32,16 +32,24 @@ export async function initEnvData(os) {
|
|
|
32
32
|
viteEnv,
|
|
33
33
|
};
|
|
34
34
|
}
|
|
35
|
-
export async function initSites(env, cache) {
|
|
35
|
+
export async function initSites(env, cache, siteToken) {
|
|
36
36
|
const queries = Queries.new(env.endpointUrl, env.frontendUrl, new SsrCache(), { bearerToken: env.endpointToken });
|
|
37
|
-
return await loadSites(queries, cache);
|
|
37
|
+
return await loadSites(queries, cache, siteToken);
|
|
38
|
+
}
|
|
39
|
+
export async function initRequestSites(env, sites, req) {
|
|
40
|
+
const siteToken = new URL(req.url).searchParams.get('siteToken');
|
|
41
|
+
if (!siteToken)
|
|
42
|
+
return sites;
|
|
43
|
+
// Preview sites belong to this request, not the shared site cache.
|
|
44
|
+
return await initSites(env, undefined, siteToken);
|
|
38
45
|
}
|
|
39
46
|
// requires, GraphQl, SsrCache
|
|
40
|
-
async function loadSites(queries, cache) {
|
|
41
|
-
|
|
47
|
+
async function loadSites(queries, cache, siteToken) {
|
|
48
|
+
const useCache = !siteToken;
|
|
49
|
+
if (useCache && 'CRAFT_SITES_CACHED' in globalThis) {
|
|
42
50
|
return globalThis['CRAFT_SITES_CACHED'];
|
|
43
51
|
}
|
|
44
|
-
if (cache?.enabled && cache?.readSitesCache) {
|
|
52
|
+
if (useCache && cache?.enabled && cache?.readSitesCache) {
|
|
45
53
|
try {
|
|
46
54
|
const sites = (await cache.readSitesCache());
|
|
47
55
|
// @ts-ignore
|
|
@@ -65,11 +73,13 @@ async function loadSites(queries, cache) {
|
|
|
65
73
|
}
|
|
66
74
|
`, {},
|
|
67
75
|
// don't cache since we cache ourself
|
|
68
|
-
{ caching: false }));
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
76
|
+
{ caching: false, craftCaching: useCache, siteToken }));
|
|
77
|
+
if (useCache) {
|
|
78
|
+
// @ts-ignore
|
|
79
|
+
globalThis['CRAFT_SITES_CACHED'] = resp.crelteSites;
|
|
80
|
+
if (cache?.enabled && cache?.writeSitesCache) {
|
|
81
|
+
await cache.writeSitesCache(resp.crelteSites);
|
|
82
|
+
}
|
|
73
83
|
}
|
|
74
84
|
return resp.crelteSites;
|
|
75
85
|
}
|
package/dist/vite/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/vite/index.ts"],"names":[],"mappings":"AACA,OAAO,EAEN,MAAM,EAON,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/vite/index.ts"],"names":[],"mappings":"AACA,OAAO,EAEN,MAAM,EAON,MAAM,MAAM,CAAC;AAyHd,MAAM,CAAC,OAAO,UAAU,MAAM,IAAI,MAAM,CA4JvC"}
|
package/dist/vite/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { relative } from 'node:path';
|
|
2
2
|
import { build as viteBuild, } from 'vite';
|
|
3
3
|
import fs from 'node:fs/promises';
|
|
4
|
-
import { initEnvData, initSites, modRender, modRenderError, } from '../server/shared.js';
|
|
4
|
+
import { initEnvData, initSites, initRequestSites, modRender, modRenderError, } from '../server/shared.js';
|
|
5
5
|
import ServerRouter from '../server/ServerRouter.js';
|
|
6
6
|
import { initQueryRoutes } from '../server/queries/queries.js';
|
|
7
7
|
import { PLATFORM, requestToWebRequest, webResponseToResponse, } from '../node/utils.js';
|
|
@@ -223,7 +223,8 @@ async function serveVite(env, vite) {
|
|
|
223
223
|
if (!sites) {
|
|
224
224
|
sites = await initSites(env);
|
|
225
225
|
}
|
|
226
|
-
const
|
|
226
|
+
const requestSites = await initRequestSites(env, sites, req);
|
|
227
|
+
const router = new ServerRouter(env.endpointUrl, env.frontendUrl, env.env, requestSites, { endpointToken: env.endpointToken });
|
|
227
228
|
await initQueryRoutes(PLATFORM, serverMod, router);
|
|
228
229
|
if (typeof serverMod.routes === 'function') {
|
|
229
230
|
await serverMod.routes(router);
|
|
@@ -250,7 +251,7 @@ async function serveVite(env, vite) {
|
|
|
250
251
|
await webResponseToResponse(errorResp, res);
|
|
251
252
|
return;
|
|
252
253
|
}
|
|
253
|
-
const response = await modRender(env,
|
|
254
|
+
const response = await modRender(env, requestSites, serverMod, template, req);
|
|
254
255
|
await webResponseToResponse(response, res);
|
|
255
256
|
};
|
|
256
257
|
vite.middlewares.use(async (nReq, res, next) => {
|
package/package.json
CHANGED
package/src/node/index.ts
CHANGED
|
@@ -6,6 +6,7 @@ import {
|
|
|
6
6
|
EnvData,
|
|
7
7
|
initEnvData,
|
|
8
8
|
initSites,
|
|
9
|
+
initRequestSites,
|
|
9
10
|
modRender,
|
|
10
11
|
modRenderError,
|
|
11
12
|
} from '../server/shared.js';
|
|
@@ -37,12 +38,15 @@ async function writeSitesCache(data: any): Promise<void> {
|
|
|
37
38
|
async function initRouter(
|
|
38
39
|
serverMod: any,
|
|
39
40
|
env: EnvData,
|
|
41
|
+
sites?: SiteFromGraphQl[],
|
|
40
42
|
): Promise<[SiteFromGraphQl[], ServerRouter]> {
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
43
|
+
if (!sites) {
|
|
44
|
+
sites = await initSites(env, {
|
|
45
|
+
enabled: process.env.NODE_ENV === 'production',
|
|
46
|
+
writeSitesCache,
|
|
47
|
+
readSitesCache,
|
|
48
|
+
});
|
|
49
|
+
}
|
|
46
50
|
|
|
47
51
|
const router = new ServerRouter(
|
|
48
52
|
env.endpointUrl,
|
|
@@ -113,7 +117,13 @@ export default async function createServer(serverMod: any, buildTime: string) {
|
|
|
113
117
|
throw routesError ?? new Error('Router not initialized');
|
|
114
118
|
}
|
|
115
119
|
|
|
116
|
-
const
|
|
120
|
+
const requestSites = await initRequestSites(env, sites, req);
|
|
121
|
+
const requestRouter =
|
|
122
|
+
requestSites === sites
|
|
123
|
+
? router
|
|
124
|
+
: (await initRouter(serverMod, env, requestSites))[1];
|
|
125
|
+
|
|
126
|
+
const routeResp = await requestRouter.z_handle(req);
|
|
117
127
|
if (routeResp) {
|
|
118
128
|
await webResponseToResponse(routeResp, res);
|
|
119
129
|
return;
|
|
@@ -121,9 +131,14 @@ export default async function createServer(serverMod: any, buildTime: string) {
|
|
|
121
131
|
|
|
122
132
|
if (await basicAuthCheck(req, res, env)) return;
|
|
123
133
|
|
|
124
|
-
const response = await modRender(
|
|
125
|
-
|
|
126
|
-
|
|
134
|
+
const response = await modRender(
|
|
135
|
+
env,
|
|
136
|
+
requestSites,
|
|
137
|
+
serverMod,
|
|
138
|
+
template,
|
|
139
|
+
req,
|
|
140
|
+
{ ssrManifest },
|
|
141
|
+
);
|
|
127
142
|
await webResponseToResponse(response, res);
|
|
128
143
|
};
|
|
129
144
|
|
package/src/queries/Queries.ts
CHANGED
|
@@ -58,11 +58,18 @@ export type QueryOptions = {
|
|
|
58
58
|
bearerToken?: string;
|
|
59
59
|
|
|
60
60
|
/**
|
|
61
|
-
* Configure caching
|
|
61
|
+
* Configure Crelte's local query caching.
|
|
62
62
|
* @default true
|
|
63
63
|
*/
|
|
64
64
|
caching?: boolean;
|
|
65
65
|
|
|
66
|
+
/**
|
|
67
|
+
* Allow Craft's configured GraphQL caching. Set false to bypass it.
|
|
68
|
+
* Does not affect Crelte's caching.
|
|
69
|
+
* @default true
|
|
70
|
+
*/
|
|
71
|
+
craftCaching?: boolean;
|
|
72
|
+
|
|
66
73
|
/**
|
|
67
74
|
* Usually automatically set
|
|
68
75
|
*/
|
|
@@ -165,6 +172,7 @@ export default class Queries {
|
|
|
165
172
|
bearerToken,
|
|
166
173
|
xCraftSiteId,
|
|
167
174
|
caching: opts.caching ?? true,
|
|
175
|
+
craftCaching: opts.craftCaching ?? true,
|
|
168
176
|
});
|
|
169
177
|
}
|
|
170
178
|
|
|
@@ -183,6 +191,7 @@ type InnerQueryOptions = {
|
|
|
183
191
|
bearerToken: string | null;
|
|
184
192
|
xCraftSiteId: number | null;
|
|
185
193
|
caching: boolean;
|
|
194
|
+
craftCaching: boolean;
|
|
186
195
|
};
|
|
187
196
|
|
|
188
197
|
class Inner {
|
|
@@ -304,6 +313,8 @@ class Inner {
|
|
|
304
313
|
if (opts.xCraftSiteId)
|
|
305
314
|
headers['X-Craft-Site'] = opts.xCraftSiteId.toString();
|
|
306
315
|
|
|
316
|
+
if (!opts.craftCaching) headers['X-Craft-GQL-Cache'] = 'no-cache';
|
|
317
|
+
|
|
307
318
|
if (this.loggingRequests) {
|
|
308
319
|
console.log(logName + ' to:', url.toString(), vars, headers);
|
|
309
320
|
headers['X-Debug'] = 'enable';
|
|
@@ -292,6 +292,13 @@ export default class BaseRoute {
|
|
|
292
292
|
this.z_context[key] = value;
|
|
293
293
|
}
|
|
294
294
|
}
|
|
295
|
+
/**
|
|
296
|
+
* Returns the site preview token, or null if it is missing or empty.
|
|
297
|
+
*/
|
|
298
|
+
getSiteToken(): string | null {
|
|
299
|
+
return this.search.get('siteToken') || null;
|
|
300
|
+
}
|
|
301
|
+
|
|
295
302
|
/**
|
|
296
303
|
* Returns true if the route is in live preview mode
|
|
297
304
|
*/
|
|
@@ -235,9 +235,12 @@ export default class BaseRouter {
|
|
|
235
235
|
const req = this.targetToRequest(target, { origin: 'preload' });
|
|
236
236
|
const current = this.route.get();
|
|
237
237
|
|
|
238
|
-
//
|
|
239
|
-
|
|
240
|
-
|
|
238
|
+
// Preload only within the current origin and site preview context.
|
|
239
|
+
if (
|
|
240
|
+
current &&
|
|
241
|
+
current.url.origin === req.url.origin &&
|
|
242
|
+
current.getSiteToken() === req.getSiteToken()
|
|
243
|
+
) {
|
|
241
244
|
// todo i don't wan't to send a CrelteRequest?
|
|
242
245
|
// todo, it would be nice if this could not have any side effects
|
|
243
246
|
// but at the moment cr.router.open will cause a redirect
|
|
@@ -20,6 +20,7 @@ export default class ClientRouter extends BaseRouter {
|
|
|
20
20
|
|
|
21
21
|
this.scrollDebounceTimeout = null;
|
|
22
22
|
this.preloadOnMouseOver = opts.preloadOnMouseOver;
|
|
23
|
+
|
|
23
24
|
this.onError = () => {};
|
|
24
25
|
}
|
|
25
26
|
|
|
@@ -82,13 +83,7 @@ export default class ClientRouter extends BaseRouter {
|
|
|
82
83
|
}
|
|
83
84
|
}
|
|
84
85
|
|
|
85
|
-
|
|
86
|
-
// new site we need to do a window.location.href call
|
|
87
|
-
if (
|
|
88
|
-
(current && current.url.origin !== req.url.origin) ||
|
|
89
|
-
// @ts-ignore
|
|
90
|
-
import.meta.env.SSR
|
|
91
|
-
) {
|
|
86
|
+
if (this.requiresPageLoad(req)) {
|
|
92
87
|
window.location.href = req.url.href;
|
|
93
88
|
return;
|
|
94
89
|
}
|
|
@@ -107,6 +102,11 @@ export default class ClientRouter extends BaseRouter {
|
|
|
107
102
|
async pushRequest(req: Request, _opts: RequestOptions = {}) {
|
|
108
103
|
const url = req.url;
|
|
109
104
|
|
|
105
|
+
if (this.requiresPageLoad(req)) {
|
|
106
|
+
window.location.href = url.href;
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
110
|
return this.handleRequest(req, route => {
|
|
111
111
|
window.history.pushState(
|
|
112
112
|
route.z_toState(),
|
|
@@ -119,6 +119,11 @@ export default class ClientRouter extends BaseRouter {
|
|
|
119
119
|
async replaceRequest(req: Request, _opts: RequestOptions = {}) {
|
|
120
120
|
const url = req.url;
|
|
121
121
|
|
|
122
|
+
if (this.requiresPageLoad(req)) {
|
|
123
|
+
window.location.replace(url.href);
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
|
|
122
127
|
return this.handleRequest(req, () => {
|
|
123
128
|
window.history.replaceState(
|
|
124
129
|
req.z_toState(),
|
|
@@ -132,6 +137,15 @@ export default class ClientRouter extends BaseRouter {
|
|
|
132
137
|
window.history.back();
|
|
133
138
|
}
|
|
134
139
|
|
|
140
|
+
private requiresPageLoad(req: Request): boolean {
|
|
141
|
+
const current = this.route.get();
|
|
142
|
+
return (
|
|
143
|
+
!!current &&
|
|
144
|
+
(current.url.origin !== req.url.origin ||
|
|
145
|
+
current.getSiteToken() !== req.getSiteToken())
|
|
146
|
+
);
|
|
147
|
+
}
|
|
148
|
+
|
|
135
149
|
/**
|
|
136
150
|
* This returns a route if it was handled else if an error occured
|
|
137
151
|
* or the request was cancelled returns void
|
|
@@ -205,6 +219,11 @@ export default class ClientRouter extends BaseRouter {
|
|
|
205
219
|
});
|
|
206
220
|
req.z_fillFromState(e.state);
|
|
207
221
|
|
|
222
|
+
if (this.requiresPageLoad(req)) {
|
|
223
|
+
window.location.reload();
|
|
224
|
+
return;
|
|
225
|
+
}
|
|
226
|
+
|
|
208
227
|
// todo handle errors
|
|
209
228
|
this.handleRequest(req, () => {});
|
|
210
229
|
});
|
|
@@ -143,22 +143,15 @@ export default class QueryGqlRoute {
|
|
|
143
143
|
logInfo = `[queries: ${this.name}] vars: ${JSON.stringify(vars)}`;
|
|
144
144
|
}
|
|
145
145
|
|
|
146
|
-
let previewToken: string | null = null;
|
|
147
|
-
let siteToken: string | null = null;
|
|
148
|
-
|
|
149
146
|
const reqSearch = new URL(csr.req.url).searchParams;
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
previewToken = reqSearch.get('token');
|
|
153
|
-
} else if (reqSearch.has('siteToken')) {
|
|
154
|
-
siteToken = reqSearch.get('siteToken');
|
|
155
|
-
}
|
|
147
|
+
const previewToken = reqSearch.get('token');
|
|
148
|
+
const siteToken = reqSearch.get('siteToken');
|
|
156
149
|
|
|
157
150
|
// check for x-craft-site header and pass it on
|
|
158
151
|
const xCraftSite = csr.req.headers.get('X-Craft-Site');
|
|
159
152
|
|
|
160
153
|
let cacheKey: string | null = null;
|
|
161
|
-
const useCache = !previewToken && caching.isEnabled();
|
|
154
|
+
const useCache = !previewToken && !siteToken && caching.isEnabled();
|
|
162
155
|
if (useCache) {
|
|
163
156
|
cacheKey = await calcKey({
|
|
164
157
|
...vars,
|
|
@@ -190,6 +183,10 @@ export default class QueryGqlRoute {
|
|
|
190
183
|
|
|
191
184
|
if (xCraftSite) headers['X-Craft-Site'] = xCraftSite;
|
|
192
185
|
|
|
186
|
+
if (csr.req.headers.get('X-Craft-GQL-Cache') === 'no-cache') {
|
|
187
|
+
headers['X-Craft-GQL-Cache'] = 'no-cache';
|
|
188
|
+
}
|
|
189
|
+
|
|
193
190
|
// now execute the gql request
|
|
194
191
|
let resp: Response;
|
|
195
192
|
try {
|
package/src/server/shared.ts
CHANGED
|
@@ -77,6 +77,7 @@ export type SitesCache = {
|
|
|
77
77
|
export async function initSites(
|
|
78
78
|
env: EnvData,
|
|
79
79
|
cache?: SitesCache,
|
|
80
|
+
siteToken?: string,
|
|
80
81
|
): Promise<SiteFromGraphQl[]> {
|
|
81
82
|
const queries = Queries.new(
|
|
82
83
|
env.endpointUrl,
|
|
@@ -84,19 +85,34 @@ export async function initSites(
|
|
|
84
85
|
new SsrCache(),
|
|
85
86
|
{ bearerToken: env.endpointToken },
|
|
86
87
|
);
|
|
87
|
-
return await loadSites(queries, cache);
|
|
88
|
+
return await loadSites(queries, cache, siteToken);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
export async function initRequestSites(
|
|
92
|
+
env: EnvData,
|
|
93
|
+
sites: SiteFromGraphQl[],
|
|
94
|
+
req: Request,
|
|
95
|
+
): Promise<SiteFromGraphQl[]> {
|
|
96
|
+
const siteToken = new URL(req.url).searchParams.get('siteToken');
|
|
97
|
+
if (!siteToken) return sites;
|
|
98
|
+
|
|
99
|
+
// Preview sites belong to this request, not the shared site cache.
|
|
100
|
+
return await initSites(env, undefined, siteToken);
|
|
88
101
|
}
|
|
89
102
|
|
|
90
103
|
// requires, GraphQl, SsrCache
|
|
91
104
|
async function loadSites(
|
|
92
105
|
queries: Queries,
|
|
93
106
|
cache?: SitesCache,
|
|
107
|
+
siteToken?: string,
|
|
94
108
|
): Promise<SiteFromGraphQl[]> {
|
|
95
|
-
|
|
109
|
+
const useCache = !siteToken;
|
|
110
|
+
|
|
111
|
+
if (useCache && 'CRAFT_SITES_CACHED' in globalThis) {
|
|
96
112
|
return (globalThis as any)['CRAFT_SITES_CACHED'];
|
|
97
113
|
}
|
|
98
114
|
|
|
99
|
-
if (cache?.enabled && cache?.readSitesCache) {
|
|
115
|
+
if (useCache && cache?.enabled && cache?.readSitesCache) {
|
|
100
116
|
try {
|
|
101
117
|
const sites = (await cache.readSitesCache()) as SiteFromGraphQl[];
|
|
102
118
|
// @ts-ignore
|
|
@@ -122,13 +138,15 @@ async function loadSites(
|
|
|
122
138
|
`,
|
|
123
139
|
{},
|
|
124
140
|
// don't cache since we cache ourself
|
|
125
|
-
{ caching: false },
|
|
141
|
+
{ caching: false, craftCaching: useCache, siteToken },
|
|
126
142
|
)) as { crelteSites: SiteFromGraphQl[] };
|
|
127
143
|
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
144
|
+
if (useCache) {
|
|
145
|
+
// @ts-ignore
|
|
146
|
+
globalThis['CRAFT_SITES_CACHED'] = resp.crelteSites;
|
|
147
|
+
if (cache?.enabled && cache?.writeSitesCache) {
|
|
148
|
+
await cache.writeSitesCache(resp.crelteSites);
|
|
149
|
+
}
|
|
132
150
|
}
|
|
133
151
|
return resp.crelteSites;
|
|
134
152
|
}
|
package/src/vite/index.ts
CHANGED
|
@@ -14,6 +14,7 @@ import {
|
|
|
14
14
|
EnvData,
|
|
15
15
|
initEnvData,
|
|
16
16
|
initSites,
|
|
17
|
+
initRequestSites,
|
|
17
18
|
modRender,
|
|
18
19
|
modRenderError,
|
|
19
20
|
} from '../server/shared.js';
|
|
@@ -306,11 +307,13 @@ async function serveVite(env: EnvData, vite: ViteDevServer) {
|
|
|
306
307
|
sites = await initSites(env);
|
|
307
308
|
}
|
|
308
309
|
|
|
310
|
+
const requestSites = await initRequestSites(env, sites, req);
|
|
311
|
+
|
|
309
312
|
const router = new ServerRouter(
|
|
310
313
|
env.endpointUrl,
|
|
311
314
|
env.frontendUrl,
|
|
312
315
|
env.env,
|
|
313
|
-
|
|
316
|
+
requestSites,
|
|
314
317
|
{ endpointToken: env.endpointToken },
|
|
315
318
|
);
|
|
316
319
|
|
|
@@ -355,7 +358,13 @@ async function serveVite(env: EnvData, vite: ViteDevServer) {
|
|
|
355
358
|
return;
|
|
356
359
|
}
|
|
357
360
|
|
|
358
|
-
const response = await modRender(
|
|
361
|
+
const response = await modRender(
|
|
362
|
+
env,
|
|
363
|
+
requestSites,
|
|
364
|
+
serverMod,
|
|
365
|
+
template,
|
|
366
|
+
req,
|
|
367
|
+
);
|
|
359
368
|
await webResponseToResponse(response, res);
|
|
360
369
|
};
|
|
361
370
|
|