crelte 0.5.0-beta.3 → 0.5.0-beta.4

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.
@@ -3,5 +3,6 @@ import Route, { type RouteOptions } from './route/Route.js';
3
3
  import Request, { type RequestOptions, type DelayRender } from './route/Request.js';
4
4
  import Site from './Site.js';
5
5
  import BaseRoute from './route/BaseRoute.js';
6
- export { Router, UpdateRequest, BaseRoute, Route, RouteOptions, Site, Request, DelayRender, RequestOptions, };
6
+ import { shouldInterceptClick } from './utils.js';
7
+ export { Router, UpdateRequest, BaseRoute, Route, RouteOptions, Site, Request, DelayRender, RequestOptions, shouldInterceptClick, };
7
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/routing/index.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,EAAE,EAAE,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,KAAK,EAAE,EAAE,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,OAAO,EAAE,EACf,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,SAAS,MAAM,sBAAsB,CAAC;AAE7C,OAAO,EACN,MAAM,EACN,aAAa,EACb,SAAS,EACT,KAAK,EACL,YAAY,EACZ,IAAI,EACJ,OAAO,EACP,WAAW,EACX,cAAc,GACd,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/routing/index.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,EAAE,EAAE,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,KAAK,EAAE,EAAE,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,OAAO,EAAE,EACf,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,SAAS,MAAM,sBAAsB,CAAC;AAC7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAElD,OAAO,EACN,MAAM,EACN,aAAa,EACb,SAAS,EACT,KAAK,EACL,YAAY,EACZ,IAAI,EACJ,OAAO,EACP,WAAW,EACX,cAAc,EACd,oBAAoB,GACpB,CAAC"}
@@ -3,4 +3,5 @@ import Route from './route/Route.js';
3
3
  import Request from './route/Request.js';
4
4
  import Site from './Site.js';
5
5
  import BaseRoute from './route/BaseRoute.js';
6
- export { Router, BaseRoute, Route, Site, Request, };
6
+ import { shouldInterceptClick } from './utils.js';
7
+ export { Router, BaseRoute, Route, Site, Request, shouldInterceptClick, };
@@ -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;AAE7C,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,KAAK,IAAI,CAAC;gBAEd,KAAK,EAAE,eAAe,EAAE,EAAE,IAAI,EAAE,mBAAmB;IAQ/D;;OAEG;IACG,IAAI;IAuBV;;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;IAiB7D;;;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;IAiEN,QAAQ;IAgCR,YAAY,CAAC,EAAE,EAAE,aAAa,EAAE,MAAM,EAAE,KAAK,GAAG,IAAI;CAwEpD"}
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,KAAK,IAAI,CAAC;gBAEd,KAAK,EAAE,eAAe,EAAE,EAAE,IAAI,EAAE,mBAAmB;IAQ/D;;OAEG;IACG,IAAI;IAuBV;;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;IAiB7D;;;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;IAgEN,QAAQ;IAgCR,YAAY,CAAC,EAAE,EAAE,aAAa,EAAE,MAAM,EAAE,KAAK,GAAG,IAAI;CAwEpD"}
@@ -1,4 +1,5 @@
1
1
  import BaseRouter from './BaseRouter.js';
2
+ import { shouldInterceptClick } from '../utils.js';
2
3
  export default class ClientRouter extends BaseRouter {
3
4
  scrollDebounceTimeout;
4
5
  preloadOnMouseOver;
@@ -103,16 +104,13 @@ export default class ClientRouter extends BaseRouter {
103
104
  window.addEventListener('click', async (e) => {
104
105
  // @ts-ignore
105
106
  const link = e.target.closest('a');
106
- const openInNewTab = e.metaKey || e.ctrlKey || e.shiftKey;
107
- const saveLink = e.altKey;
108
- if (!link || !link.href || openInNewTab || saveLink)
109
- return;
110
- if (link.target.toLowerCase() === '_blank')
111
- return;
112
- if (!link.href.startsWith('http'))
107
+ if (!shouldInterceptClick(e, link))
113
108
  return;
114
109
  e.preventDefault();
115
- const req = this.targetToRequest(link.href, { origin: 'click' });
110
+ const req = this.targetToRequest(link.href, {
111
+ origin: 'click',
112
+ context: { ...link.dataset },
113
+ });
116
114
  const currRoute = this.route.get();
117
115
  const routeEq = currRoute && currRoute.eqUrl(req) && currRoute.eqSearch(req);
118
116
  // this means the route is the same maybe with a different hash
@@ -2,4 +2,8 @@ import Site from './Site.js';
2
2
  export declare function trimSlashEnd(str: string): string;
3
3
  export declare function orDef<T>(a: T | undefined, def: T): T;
4
4
  export declare function preferredSite(sites: Site[], languages: string[]): Site | null;
5
+ /**
6
+ * Returns true if the click should be intercepted
7
+ */
8
+ export declare function shouldInterceptClick(e: PointerEvent, link: HTMLAnchorElement | undefined): boolean;
5
9
  //# sourceMappingURL=utils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/routing/utils.ts"],"names":[],"mappings":"AACA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,UAEvC;AAGD,wBAAgB,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAEpD;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,IAAI,GAAG,IAAI,CAK7E"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/routing/utils.ts"],"names":[],"mappings":"AACA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,UAEvC;AAGD,wBAAgB,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAEpD;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,IAAI,GAAG,IAAI,CAK7E;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CACnC,CAAC,EAAE,YAAY,EACf,IAAI,EAAE,iBAAiB,GAAG,SAAS,GACjC,OAAO,CAQT"}
@@ -11,3 +11,17 @@ export function preferredSite(sites, languages) {
11
11
  const lang = matchLanguages(Array.from(map.keys()), languages);
12
12
  return lang ? map.get(lang) : null;
13
13
  }
14
+ /**
15
+ * Returns true if the click should be intercepted
16
+ */
17
+ export function shouldInterceptClick(e, link) {
18
+ const openInNewTab = e.metaKey || e.ctrlKey || e.shiftKey;
19
+ const saveLink = e.altKey;
20
+ if (!link || !link.href || openInNewTab || saveLink)
21
+ return false;
22
+ if (link.target.toLowerCase() === '_blank')
23
+ return false;
24
+ if (!link.href.startsWith('http'))
25
+ return false;
26
+ return true;
27
+ }
@@ -51,7 +51,22 @@ export default class CrelteServerRequest {
51
51
  */
52
52
  getEnv(name: 'ENDPOINT_URL'): string;
53
53
  getEnv(name: 'CRAFT_WEB_URL'): string;
54
+ getEnv(name: 'FRONTEND_URL'): string;
54
55
  getEnv(name: string): string | null;
56
+ /**
57
+ * returns the frontend url with an optional path
58
+ *
59
+ * ## Note
60
+ * For the origin the `FRONTEND_URL` env variable is used
61
+ */
62
+ frontendUrl(path?: string): URL;
63
+ /**
64
+ * returns the backend url with an optional path
65
+ *
66
+ * ## Note
67
+ * For the origin the `ENDPOINT_URL` env variable is used
68
+ */
69
+ backendUrl(path?: string): URL;
55
70
  /**
56
71
  * Returns the primary site
57
72
  */
@@ -1 +1 @@
1
- {"version":3,"file":"CrelteServer.d.ts","sourceRoot":"","sources":["../../src/server/CrelteServer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAE9C,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,EAAW,IAAI,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,aAAa,MAAM,cAAc,CAAC;AAEzC,MAAM,MAAM,0BAA0B,GAAG;IACxC,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzB,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,aAAa,EAAE,IAAI,GAAG,IAAI,CAAC;IAC3B,OAAO,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF,MAAM,CAAC,OAAO,OAAO,mBAAmB;IACvC;;OAEG;IACH,GAAG,EAAE,aAAa,CAAC;IAEnB,OAAO,CAAC,IAAI,CAAsB;IAClC,OAAO,CAAC,QAAQ,CAAc;IAC9B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAAW;IACzB,OAAO,CAAC,QAAQ,CAAU;IAC1B,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC;gBAEhB,GAAG,EAAE,aAAa,EAAE,IAAI,EAAE,0BAA0B;IAchE;;;;;;;OAOG;IACH,IAAI,IAAI,IAAI,IAAI,CAEf;IAED;;OAEG;IACH,IAAI,OAAO,IAAI,OAAO,CAErB;IAED;;OAEG;IACH,IAAI,OAAO,IAAI,OAAO,CAErB;IAED;;OAEG;IACH,IAAI,KAAK,IAAI,IAAI,EAAE,CAElB;IAED;;OAEG;IACH,IAAI,kBAAkB,IAAI,MAAM,EAAE,CAEjC;IAED;;OAEG;IACH,MAAM,CAAC,IAAI,EAAE,cAAc,GAAG,MAAM;IACpC,MAAM,CAAC,IAAI,EAAE,eAAe,GAAG,MAAM;IACrC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAKnC;;OAEG;IACH,WAAW,IAAI,IAAI;IAInB;;;;OAIG;IACH,aAAa,IAAI,IAAI,GAAG,IAAI;IAI5B;;;;;;;OAOG;IACG,KAAK,CACV,KAAK,EAAE,KAAK,EACZ,SAAS,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EACvC,IAAI,GAAE,YAAiB,GACrB,OAAO,CAAC,OAAO,CAAC;IAInB,cAAc;IACd,gBAAgB,CAAC,IAAI,EAAE,QAAQ;CAG/B"}
1
+ {"version":3,"file":"CrelteServer.d.ts","sourceRoot":"","sources":["../../src/server/CrelteServer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAE9C,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,EAAW,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,aAAa,MAAM,cAAc,CAAC;AAEzC,MAAM,MAAM,0BAA0B,GAAG;IACxC,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzB,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,aAAa,EAAE,IAAI,GAAG,IAAI,CAAC;IAC3B,OAAO,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF,MAAM,CAAC,OAAO,OAAO,mBAAmB;IACvC;;OAEG;IACH,GAAG,EAAE,aAAa,CAAC;IAEnB,OAAO,CAAC,IAAI,CAAsB;IAClC,OAAO,CAAC,QAAQ,CAAc;IAC9B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAAW;IACzB,OAAO,CAAC,QAAQ,CAAU;IAC1B,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC;gBAEhB,GAAG,EAAE,aAAa,EAAE,IAAI,EAAE,0BAA0B;IAchE;;;;;;;OAOG;IACH,IAAI,IAAI,IAAI,IAAI,CAEf;IAED;;OAEG;IACH,IAAI,OAAO,IAAI,OAAO,CAErB;IAED;;OAEG;IACH,IAAI,OAAO,IAAI,OAAO,CAErB;IAED;;OAEG;IACH,IAAI,KAAK,IAAI,IAAI,EAAE,CAElB;IAED;;OAEG;IACH,IAAI,kBAAkB,IAAI,MAAM,EAAE,CAEjC;IAED;;OAEG;IACH,MAAM,CAAC,IAAI,EAAE,cAAc,GAAG,MAAM;IACpC,MAAM,CAAC,IAAI,EAAE,eAAe,GAAG,MAAM;IACrC,MAAM,CAAC,IAAI,EAAE,cAAc,GAAG,MAAM;IACpC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAKnC;;;;;OAKG;IACH,WAAW,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,GAAG;IAI/B;;;;;OAKG;IACH,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,GAAG;IAI9B;;OAEG;IACH,WAAW,IAAI,IAAI;IAInB;;;;OAIG;IACH,aAAa,IAAI,IAAI,GAAG,IAAI;IAI5B;;;;;;;OAOG;IACG,KAAK,CACV,KAAK,EAAE,KAAK,EACZ,SAAS,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EACvC,IAAI,GAAE,YAAiB,GACrB,OAAO,CAAC,OAAO,CAAC;IAInB,cAAc;IACd,gBAAgB,CAAC,IAAI,EAAE,QAAQ;CAG/B"}
@@ -1,5 +1,6 @@
1
1
  import ServerCookies from '../cookies/ServerCookies.js';
2
2
  import { Request } from '../routing/index.js';
3
+ import { urlWithPath } from '../utils.js';
3
4
  export default class CrelteServerRequest {
4
5
  /**
5
6
  * The current request
@@ -58,6 +59,24 @@ export default class CrelteServerRequest {
58
59
  getEnv(name) {
59
60
  return this._env.get(name) ?? null;
60
61
  }
62
+ /**
63
+ * returns the frontend url with an optional path
64
+ *
65
+ * ## Note
66
+ * For the origin the `FRONTEND_URL` env variable is used
67
+ */
68
+ frontendUrl(path) {
69
+ return urlWithPath(this.getEnv('FRONTEND_URL'), path);
70
+ }
71
+ /**
72
+ * returns the backend url with an optional path
73
+ *
74
+ * ## Note
75
+ * For the origin the `ENDPOINT_URL` env variable is used
76
+ */
77
+ backendUrl(path) {
78
+ return urlWithPath(this.getEnv('ENDPOINT_URL'), path);
79
+ }
61
80
  /**
62
81
  * Returns the primary site
63
82
  */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "crelte",
3
- "version": "0.5.0-beta.3",
3
+ "version": "0.5.0-beta.4",
4
4
  "author": "Crelte <support@crelte.com>",
5
5
  "type": "module",
6
6
  "scripts": {
@@ -6,6 +6,7 @@ import Request, {
6
6
  } from './route/Request.js';
7
7
  import Site from './Site.js';
8
8
  import BaseRoute from './route/BaseRoute.js';
9
+ import { shouldInterceptClick } from './utils.js';
9
10
 
10
11
  export {
11
12
  Router,
@@ -17,4 +18,5 @@ export {
17
18
  Request,
18
19
  DelayRender,
19
20
  RequestOptions,
21
+ shouldInterceptClick,
20
22
  };
@@ -3,6 +3,7 @@ import BaseRouter, { BaseRouterOptions } from './BaseRouter.js';
3
3
  import { Request, RequestOptions } from '../index.js';
4
4
  import Route from '../route/Route.js';
5
5
  import { SiteFromGraphQl } from '../Site.js';
6
+ import { shouldInterceptClick } from '../utils.js';
6
7
 
7
8
  export type ClientRouterOptions = {
8
9
  preloadOnMouseOver: boolean;
@@ -145,15 +146,14 @@ export default class ClientRouter extends BaseRouter {
145
146
  window.addEventListener('click', async e => {
146
147
  // @ts-ignore
147
148
  const link = e.target.closest('a');
148
- const openInNewTab = e.metaKey || e.ctrlKey || e.shiftKey;
149
- const saveLink = e.altKey;
150
- if (!link || !link.href || openInNewTab || saveLink) return;
151
- if (link.target.toLowerCase() === '_blank') return;
152
- if (!link.href.startsWith('http')) return;
149
+ if (!shouldInterceptClick(e, link)) return;
153
150
 
154
151
  e.preventDefault();
155
152
 
156
- const req = this.targetToRequest(link.href, { origin: 'click' });
153
+ const req = this.targetToRequest(link.href, {
154
+ origin: 'click',
155
+ context: { ...link.dataset },
156
+ });
157
157
  const currRoute = this.route.get();
158
158
  const routeEq =
159
159
  currRoute && currRoute.eqUrl(req) && currRoute.eqSearch(req);
@@ -16,3 +16,19 @@ export function preferredSite(sites: Site[], languages: string[]): Site | null {
16
16
  const lang = matchLanguages(Array.from(map.keys()), languages);
17
17
  return lang ? map.get(lang)! : null;
18
18
  }
19
+
20
+ /**
21
+ * Returns true if the click should be intercepted
22
+ */
23
+ export function shouldInterceptClick(
24
+ e: PointerEvent,
25
+ link: HTMLAnchorElement | undefined,
26
+ ): boolean {
27
+ const openInNewTab = e.metaKey || e.ctrlKey || e.shiftKey;
28
+ const saveLink = e.altKey;
29
+ if (!link || !link.href || openInNewTab || saveLink) return false;
30
+ if (link.target.toLowerCase() === '_blank') return false;
31
+ if (!link.href.startsWith('http')) return false;
32
+
33
+ return true;
34
+ }
@@ -2,6 +2,7 @@ import { Cookies } from '../cookies/index.js';
2
2
  import ServerCookies from '../cookies/ServerCookies.js';
3
3
  import { Queries, Query, QueryOptions } from '../queries/index.js';
4
4
  import { Request, Site } from '../routing/index.js';
5
+ import { urlWithPath } from '../utils.js';
5
6
  import ServerRequest from './Request.js';
6
7
 
7
8
  export type CrelteServerRequestOptions = {
@@ -84,11 +85,32 @@ export default class CrelteServerRequest {
84
85
  */
85
86
  getEnv(name: 'ENDPOINT_URL'): string;
86
87
  getEnv(name: 'CRAFT_WEB_URL'): string;
88
+ getEnv(name: 'FRONTEND_URL'): string;
87
89
  getEnv(name: string): string | null;
88
90
  getEnv(name: string): string | null {
89
91
  return this._env.get(name) ?? null;
90
92
  }
91
93
 
94
+ /**
95
+ * returns the frontend url with an optional path
96
+ *
97
+ * ## Note
98
+ * For the origin the `FRONTEND_URL` env variable is used
99
+ */
100
+ frontendUrl(path?: string): URL {
101
+ return urlWithPath(this.getEnv('FRONTEND_URL'), path);
102
+ }
103
+
104
+ /**
105
+ * returns the backend url with an optional path
106
+ *
107
+ * ## Note
108
+ * For the origin the `ENDPOINT_URL` env variable is used
109
+ */
110
+ backendUrl(path?: string): URL {
111
+ return urlWithPath(this.getEnv('ENDPOINT_URL'), path);
112
+ }
113
+
92
114
  /**
93
115
  * Returns the primary site
94
116
  */