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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/node/index.ts"],"names":[],"mappings":"AAiEA;;;;GAIG;AACH,wBAA8B,YAAY,CAAC,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,iBAmG3E"}
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"}
@@ -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
- const sites = await initSites(env, {
22
- enabled: process.env.NODE_ENV === 'production',
23
- writeSitesCache,
24
- readSitesCache,
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 routeResp = await router.z_handle(req);
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, sites, serverMod, template, req, {
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;IA0BnB;;;OAGG;IACH,WAAW,CAAC,GAAG,EAAE,OAAO;CAGxB"}
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"}
@@ -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
- // if the origin matches, the route will be able to be loaded
179
- // so let's preload it
180
- if (current && current.url.origin === req.url.origin) {
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;IAQ/D;;OAEG;IACG,IAAI;IA8BV;;OAEG;IACG,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IA6ChD,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,GAAE,cAAmB;IAYpD,cAAc,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,GAAE,cAAmB;IAY7D,IAAI,IAAI,IAAI;IAIZ;;;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;IAkEN,QAAQ;IAgCR,YAAY,CAAC,EAAE,EAAE,aAAa,EAAE,MAAM,EAAE,KAAK,GAAG,IAAI;CAgEpD"}
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
- // if the domain of the current site is different than the domain of the
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;CAwHpB"}
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
- if (reqSearch.has('token')) {
113
- previewToken = reqSearch.get('token');
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 {
@@ -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":"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"}
1
+ {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/server/shared.ts"],"names":[],"mappings":"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"}
@@ -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
- if ('CRAFT_SITES_CACHED' in globalThis) {
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
- // @ts-ignore
70
- globalThis['CRAFT_SITES_CACHED'] = resp.crelteSites;
71
- if (cache?.enabled && cache?.writeSitesCache) {
72
- await cache.writeSitesCache(resp.crelteSites);
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
  }
@@ -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;AAwHd,MAAM,CAAC,OAAO,UAAU,MAAM,IAAI,MAAM,CA4JvC"}
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"}
@@ -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 router = new ServerRouter(env.endpointUrl, env.frontendUrl, env.env, sites, { endpointToken: env.endpointToken });
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, sites, serverMod, template, req);
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "crelte",
3
- "version": "0.6.0-alpha.1",
3
+ "version": "0.6.0-alpha.2",
4
4
  "author": "Crelte <support@crelte.com>",
5
5
  "type": "module",
6
6
  "scripts": {
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
- const sites = await initSites(env, {
42
- enabled: process.env.NODE_ENV === 'production',
43
- writeSitesCache,
44
- readSitesCache,
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 routeResp = await router.z_handle(req);
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(env, sites, serverMod, template, req, {
125
- ssrManifest,
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
 
@@ -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
- // if the origin matches, the route will be able to be loaded
239
- // so let's preload it
240
- if (current && current.url.origin === req.url.origin) {
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
- // if the domain of the current site is different than the domain of the
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
- if (reqSearch.has('token')) {
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 {
@@ -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
- if ('CRAFT_SITES_CACHED' in globalThis) {
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
- // @ts-ignore
129
- globalThis['CRAFT_SITES_CACHED'] = resp.crelteSites;
130
- if (cache?.enabled && cache?.writeSitesCache) {
131
- await cache.writeSitesCache(resp.crelteSites);
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
- sites,
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(env, sites, serverMod, template, req);
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