crelte 0.3.1 → 0.3.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.
@@ -0,0 +1,30 @@
1
+ import { Pattern } from 'trouter';
2
+ import { Crelte, CrelteRequest, Entry, QueryOptions } from '../index.js';
3
+ import { CrelteEntryRequest } from './index.js';
4
+ import { GraphQlQuery } from '../graphql/GraphQl.js';
5
+ export type EntryRouteHandler = (cr: CrelteEntryRequest) => Promise<Entry | null | undefined> | Entry | null | undefined | void;
6
+ export type EntryRoutes = (router: EntryRouter) => Promise<void> | void;
7
+ export default class EntryRouter {
8
+ private _crelte;
9
+ private inner;
10
+ constructor(crelte: Crelte);
11
+ add(pattern: Pattern, ...handlers: EntryRouteHandler[]): this;
12
+ /**
13
+ * returns an env variable from the craft/.env file.
14
+ */
15
+ getEnv(name: 'ENDPOINT_URL'): string;
16
+ getEnv(name: 'CRAFT_WEB_URL'): string;
17
+ getEnv(name: string): string | null;
18
+ /**
19
+ * Run a GraphQl Query
20
+ *
21
+ * @param query the default export from a graphql file or the gql`query {}`
22
+ * function
23
+ * @param variables variables that should be passed to the
24
+ * graphql query
25
+ */
26
+ query(query: GraphQlQuery, variables?: Record<string, unknown>, opts?: QueryOptions): Promise<unknown>;
27
+ /** @hidden */
28
+ _handle(cr: CrelteRequest): Promise<Entry | null>;
29
+ }
30
+ //# sourceMappingURL=EntryRouter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EntryRouter.d.ts","sourceRoot":"","sources":["../../../../src/entry/EntryRouter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAW,MAAM,SAAS,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACzE,OAAO,EAAE,kBAAkB,EAAgB,MAAM,YAAY,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErD,MAAM,MAAM,iBAAiB,GAAG,CAC/B,EAAE,EAAE,kBAAkB,KAClB,OAAO,CAAC,KAAK,GAAG,IAAI,GAAG,SAAS,CAAC,GAAG,KAAK,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI,CAAC;AAEzE,MAAM,MAAM,WAAW,GAAG,CAAC,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAExE,MAAM,CAAC,OAAO,OAAO,WAAW;IAC/B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,KAAK,CAA6B;gBAE9B,MAAM,EAAE,MAAM;IAK1B,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,QAAQ,EAAE,iBAAiB,EAAE,GAAG,IAAI;IAK7D;;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;;;;;;;OAOG;IACG,KAAK,CACV,KAAK,EAAE,YAAY,EACnB,SAAS,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EACvC,IAAI,GAAE,YAAiB,GACrB,OAAO,CAAC,OAAO,CAAC;IAKnB,cAAc;IACR,OAAO,CAAC,EAAE,EAAE,aAAa,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;CAiBvD"}
@@ -0,0 +1,45 @@
1
+ import { Trouter } from 'trouter';
2
+ import { CrelteEntryRequest, EntryRequest } from './index.js';
3
+ export default class EntryRouter {
4
+ _crelte;
5
+ inner;
6
+ constructor(crelte) {
7
+ this._crelte = crelte;
8
+ this.inner = new Trouter();
9
+ }
10
+ add(pattern, ...handlers) {
11
+ this.inner.add('GET', pattern, ...handlers);
12
+ return this;
13
+ }
14
+ getEnv(name) {
15
+ return this._crelte.getEnv(name);
16
+ }
17
+ /**
18
+ * Run a GraphQl Query
19
+ *
20
+ * @param query the default export from a graphql file or the gql`query {}`
21
+ * function
22
+ * @param variables variables that should be passed to the
23
+ * graphql query
24
+ */
25
+ async query(query, variables = {}, opts = {}) {
26
+ // this function is added as convenience
27
+ return this._crelte.graphQl.query(query, variables, opts);
28
+ }
29
+ /** @hidden */
30
+ async _handle(cr) {
31
+ const { params, handlers } = this.inner.find('GET', cr.req.uri);
32
+ if (!handlers.length)
33
+ return null;
34
+ const er = new EntryRequest(cr.req.url, cr.req.site, {
35
+ params: new Map(Object.entries(params)),
36
+ });
37
+ const cer = new CrelteEntryRequest(cr, er);
38
+ for (const handler of handlers) {
39
+ const res = await handler(cer);
40
+ if (res)
41
+ return res;
42
+ }
43
+ return null;
44
+ }
45
+ }
@@ -0,0 +1,32 @@
1
+ import { Crelte, CrelteRequest } from '../index.js';
2
+ import { Request, RequestOptions, Site } from '../routing/index.js';
3
+ import EntryRouter, { EntryRouteHandler, EntryRoutes } from './EntryRouter.js';
4
+ export { EntryRouter, type EntryRouteHandler, type EntryRoutes };
5
+ export type Entry = {
6
+ sectionHandle: string;
7
+ typeHandle: string;
8
+ [key: string]: any;
9
+ };
10
+ export type EntryRequestOptions = RequestOptions & {
11
+ params?: Map<string, string>;
12
+ };
13
+ export declare class EntryRequest extends Request {
14
+ private params;
15
+ constructor(url: string | URL, site: Site, opts?: EntryRequestOptions);
16
+ /**
17
+ * returns the url params from the request
18
+ *
19
+ * @example
20
+ * ```js
21
+ * router.get('/blog/:slug', async (cs, req) => {
22
+ * return Response.json({ slug: cs.getParam('slug') });
23
+ * });
24
+ * ```
25
+ */
26
+ getParam(name: string): string | null;
27
+ }
28
+ export declare class CrelteEntryRequest extends CrelteRequest {
29
+ req: EntryRequest;
30
+ constructor(inner: Crelte, req: EntryRequest);
31
+ }
32
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/entry/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AACpE,OAAO,WAAW,EAAE,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/E,OAAO,EAAE,WAAW,EAAE,KAAK,iBAAiB,EAAE,KAAK,WAAW,EAAE,CAAC;AAEjE,MAAM,MAAM,KAAK,GAAG;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG,cAAc,GAAG;IAClD,MAAM,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC7B,CAAC;AAEF,qBAAa,YAAa,SAAQ,OAAO;IACxC,OAAO,CAAC,MAAM,CAAsB;gBAExB,GAAG,EAAE,MAAM,GAAG,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,GAAE,mBAAwB;IAMzE;;;;;;;;;OASG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;CAGrC;AAED,qBAAa,kBAAmB,SAAQ,aAAa;IACpD,GAAG,EAAE,YAAY,CAAC;gBAEN,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY;CAI5C"}
@@ -0,0 +1,31 @@
1
+ import { CrelteRequest } from '../index.js';
2
+ import { Request } from '../routing/index.js';
3
+ import EntryRouter from './EntryRouter.js';
4
+ export { EntryRouter };
5
+ export class EntryRequest extends Request {
6
+ params;
7
+ constructor(url, site, opts = {}) {
8
+ super(url, site, opts);
9
+ this.params = opts.params ?? new Map();
10
+ }
11
+ /**
12
+ * returns the url params from the request
13
+ *
14
+ * @example
15
+ * ```js
16
+ * router.get('/blog/:slug', async (cs, req) => {
17
+ * return Response.json({ slug: cs.getParam('slug') });
18
+ * });
19
+ * ```
20
+ */
21
+ getParam(name) {
22
+ return this.params.get(name) ?? null;
23
+ }
24
+ }
25
+ export class CrelteEntryRequest extends CrelteRequest {
26
+ req;
27
+ constructor(inner, req) {
28
+ super(inner, req);
29
+ this.req = req;
30
+ }
31
+ }
package/dist/index.d.ts CHANGED
@@ -9,7 +9,8 @@ import type { Global } from './loadData/Globals.js';
9
9
  import type { Cookies } from './cookies/index.js';
10
10
  import type { Readable } from 'crelte-std/stores';
11
11
  import { LoadData, LoadDataArray, LoadDataFn, LoadDataObj } from './loadData/index.js';
12
- export { Crelte, CrelteRequest, type Config, type QueryOptions, type LoadData, type LoadDataFn, type LoadDataObj, type LoadDataArray, };
12
+ import { Entry } from './entry/index.js';
13
+ export { Crelte, CrelteRequest, type Config, type QueryOptions, type LoadData, type LoadDataFn, type LoadDataObj, type LoadDataArray, type Entry, };
13
14
  /**
14
15
  * Get Crelte from the current context
15
16
  *
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,oBAAoB,CAAC;AAC5C,OAAO,KAAK,MAAM,MAAM,qBAAqB,CAAC;AAC9C,OAAO,KAAK,QAAQ,MAAM,mBAAmB,CAAC;AAC9C,OAAO,KAAK,IAAI,MAAM,mBAAmB,CAAC;AAC1C,OAAO,KAAK,OAAO,MAAM,sBAAsB,CAAC;AAChD,OAAO,MAAM,EAAE,EAAE,KAAK,YAAY,EAAE,KAAK,MAAM,EAAE,MAAM,aAAa,CAAC;AACrE,OAAO,aAAa,MAAM,oBAAoB,CAAC;AAC/C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EACN,QAAQ,EACR,aAAa,EACb,UAAU,EACV,WAAW,EACX,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACN,MAAM,EACN,aAAa,EACb,KAAK,MAAM,EACX,KAAK,YAAY,EACjB,KAAK,QAAQ,EACb,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,KAAK,aAAa,GAClB,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,SAAS,IAAI,MAAM,CAElC;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,IAAI,MAAM,CAElC;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,IAAI,QAAQ,CAEtC;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,IAAI,OAAO,CAEpC;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,IAAI,QAAQ,CAAC,KAAK,CAAC,CAK1C;AAED;;;;;GAKG;AACH,wBAAgB,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,CAKxC;AAED;;;;;;;GAOG;AACH,wBAAgB,MAAM,CAAC,IAAI,EAAE,cAAc,GAAG,MAAM,CAAC;AACrD,wBAAgB,MAAM,CAAC,IAAI,EAAE,eAAe,GAAG,MAAM,CAAC;AACtD,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;AAKpD;;;;;GAKG;AACH,wBAAgB,UAAU,IAAI,QAAQ,CAAC,OAAO,CAAC,CAE9C;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,IAAI,QAAQ,CAAC,MAAM,CAAC,CAErD;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,CAAC,GAAG,GAAG,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAEjE;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,IAAI,OAAO,CAEpC;AAED;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,QAOjE;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,aAAa,KAAK,IAAI,QAOxD"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,oBAAoB,CAAC;AAC5C,OAAO,KAAK,MAAM,MAAM,qBAAqB,CAAC;AAC9C,OAAO,KAAK,QAAQ,MAAM,mBAAmB,CAAC;AAC9C,OAAO,KAAK,IAAI,MAAM,mBAAmB,CAAC;AAC1C,OAAO,KAAK,OAAO,MAAM,sBAAsB,CAAC;AAChD,OAAO,MAAM,EAAE,EAAE,KAAK,YAAY,EAAE,KAAK,MAAM,EAAE,MAAM,aAAa,CAAC;AACrE,OAAO,aAAa,MAAM,oBAAoB,CAAC;AAC/C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EACN,QAAQ,EACR,aAAa,EACb,UAAU,EACV,WAAW,EACX,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAEzC,OAAO,EACN,MAAM,EACN,aAAa,EACb,KAAK,MAAM,EACX,KAAK,YAAY,EACjB,KAAK,QAAQ,EACb,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,KAAK,GACV,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,SAAS,IAAI,MAAM,CAElC;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,IAAI,MAAM,CAElC;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,IAAI,QAAQ,CAEtC;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,IAAI,OAAO,CAEpC;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,IAAI,QAAQ,CAAC,KAAK,CAAC,CAK1C;AAED;;;;;GAKG;AACH,wBAAgB,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,CAKxC;AAED;;;;;;;GAOG;AACH,wBAAgB,MAAM,CAAC,IAAI,EAAE,cAAc,GAAG,MAAM,CAAC;AACrD,wBAAgB,MAAM,CAAC,IAAI,EAAE,eAAe,GAAG,MAAM,CAAC;AACtD,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;AAKpD;;;;;GAKG;AACH,wBAAgB,UAAU,IAAI,QAAQ,CAAC,OAAO,CAAC,CAE9C;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,IAAI,QAAQ,CAAC,MAAM,CAAC,CAErD;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,CAAC,GAAG,GAAG,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAEjE;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,IAAI,OAAO,CAEpC;AAED;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,QAOjE;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,aAAa,KAAK,IAAI,QAOxD"}
@@ -31,5 +31,5 @@ export type MainData = {
31
31
  * });
32
32
  * ```
33
33
  */
34
- export declare function main(data: MainData): void;
34
+ export declare function main(data: MainData): Promise<void>;
35
35
  //# sourceMappingURL=client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../../src/init/client.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAKrD;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG;IACtB,4BAA4B;IAC5B,GAAG,EAAE,GAAG,CAAC;IACT,8BAA8B;IAC9B,SAAS,EAAE,GAAG,CAAC;IACf,iDAAiD;IACjD,UAAU,EAAE,YAAY,CAAC;IACzB,mDAAmD;IACnD,WAAW,CAAC,EAAE,YAAY,CAAC;CAC3B,CAAC;AAaF;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,IAAI,CAAC,IAAI,EAAE,QAAQ,QAsIlC"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../../src/init/client.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAKrD;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG;IACtB,4BAA4B;IAC5B,GAAG,EAAE,GAAG,CAAC;IACT,8BAA8B;IAC9B,SAAS,EAAE,GAAG,CAAC;IACf,iDAAiD;IACjD,UAAU,EAAE,YAAY,CAAC;IACzB,mDAAmD;IACnD,WAAW,CAAC,EAAE,YAAY,CAAC;CAC3B,CAAC;AAaF;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,IAAI,CAAC,IAAI,EAAE,QAAQ,iBA6IxC"}
@@ -1,6 +1,6 @@
1
1
  import { CrelteBuilder } from '../Crelte.js';
2
2
  import CrelteRequest from '../CrelteRequest.js';
3
- import { loadFn, pluginsBeforeRender, setupPlugins } from './shared.js';
3
+ import { pluginsBeforeRender, prepareLoadFn, setupPlugins } from './shared.js';
4
4
  import { tick } from 'svelte';
5
5
  const mainDataDefault = {
6
6
  preloadOnMouseOver: false,
@@ -30,7 +30,7 @@ const mainDataDefault = {
30
30
  * });
31
31
  * ```
32
32
  */
33
- export function main(data) {
33
+ export async function main(data) {
34
34
  data = { ...mainDataDefault, ...data };
35
35
  // rendering steps
36
36
  // loadSites (first time)
@@ -66,10 +66,11 @@ export function main(data) {
66
66
  }
67
67
  // setup plugins
68
68
  setupPlugins(crelte, data.app.plugins ?? []);
69
+ const loadFn = await prepareLoadFn(crelte, data.app, data.entryQuery, data.globalQuery);
69
70
  // setup load Data
70
71
  crelte.router._internal.onLoad = (req, opts) => {
71
72
  const cr = new CrelteRequest(crelte, req);
72
- return loadFn(cr, data.app, data.entryQuery, data.globalQuery, opts);
73
+ return loadFn(cr, opts);
73
74
  };
74
75
  // render Space
75
76
  let appInstance;
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../../src/init/server.ts"],"names":[],"mappings":"AAOA,OAAO,EAAO,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE1D,MAAM,MAAM,UAAU,GAAG;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACtC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,OAAO,CAAC,EAAE,MAAM,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;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG;IACtB,4BAA4B;IAC5B,GAAG,EAAE,GAAG,CAAC;IACT,iDAAiD;IACjD,UAAU,EAAE,YAAY,CAAC;IACzB,mDAAmD;IACnD,WAAW,CAAC,EAAE,YAAY,CAAC;IAE3B,0CAA0C;IAC1C,UAAU,EAAE,UAAU,CAAC;CACvB,CAAC;AAEF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,IAAI,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC;IACnD,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB,CAAC,CA0ED;AAED,MAAM,MAAM,KAAK,GAAG;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,GAAG,CAAC;CACb,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAE3B,KAAK,EAAE,KAAK,CAAC;IACb,SAAS,EAAE,GAAG,CAAC;IAEf,UAAU,EAAE,UAAU,CAAC;CACvB,CAAC;AAEF;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,SAAS,CAC9B,IAAI,EAAE,aAAa,GACjB,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CA0B5C"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../../src/init/server.ts"],"names":[],"mappings":"AAOA,OAAO,EAAO,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE1D,MAAM,MAAM,UAAU,GAAG;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACtC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,OAAO,CAAC,EAAE,MAAM,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;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG;IACtB,4BAA4B;IAC5B,GAAG,EAAE,GAAG,CAAC;IACT,iDAAiD;IACjD,UAAU,EAAE,YAAY,CAAC;IACzB,mDAAmD;IACnD,WAAW,CAAC,EAAE,YAAY,CAAC;IAE3B,0CAA0C;IAC1C,UAAU,EAAE,UAAU,CAAC;CACvB,CAAC;AAEF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,IAAI,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC;IACnD,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB,CAAC,CAiFD;AAED,MAAM,MAAM,KAAK,GAAG;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,GAAG,CAAC;CACb,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAE3B,KAAK,EAAE,KAAK,CAAC;IACb,SAAS,EAAE,GAAG,CAAC;IAEf,UAAU,EAAE,UAAU,CAAC;CACvB,CAAC;AAEF;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,SAAS,CAC9B,IAAI,EAAE,aAAa,GACjB,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CA0B5C"}
@@ -1,5 +1,5 @@
1
1
  import { CrelteBuilder } from '../Crelte.js';
2
- import { loadFn, pluginsBeforeRender, setupPlugins } from './shared.js';
2
+ import { pluginsBeforeRender, prepareLoadFn, setupPlugins } from './shared.js';
3
3
  import SsrComponents from '../ssr/SsrComponents.js';
4
4
  import SsrCache from '../ssr/SsrCache.js';
5
5
  import CrelteRequest from '../CrelteRequest.js';
@@ -42,10 +42,11 @@ export async function main(data) {
42
42
  const crelte = builder.build();
43
43
  // setup plugins
44
44
  setupPlugins(crelte, data.app.plugins ?? []);
45
+ const loadFn = await prepareLoadFn(crelte, data.app, data.entryQuery, data.globalQuery);
45
46
  // setup load Data
46
47
  crelte.router._internal.onLoad = req => {
47
48
  const cr = new CrelteRequest(crelte, req);
48
- return loadFn(cr, data.app, data.entryQuery, data.globalQuery);
49
+ return loadFn(cr);
49
50
  };
50
51
  const { success, redirect, req, props } = await crelte.router._internal.initServer(data.serverData.url, data.serverData.acceptLang);
51
52
  if (!success)
@@ -1,5 +1,6 @@
1
1
  import Crelte from '../Crelte.js';
2
2
  import CrelteRequest from '../CrelteRequest.js';
3
+ import { EntryRoutes } from '../entry/EntryRouter.js';
3
4
  import { GraphQlQuery } from '../graphql/GraphQl.js';
4
5
  import { LoadData } from '../loadData/index.js';
5
6
  import { PluginCreator } from '../plugins/Plugins.js';
@@ -8,6 +9,7 @@ interface App<E, T> {
8
9
  loadGlobalData?: LoadData<null>;
9
10
  loadEntryData?: LoadData<any>;
10
11
  templates?: Record<string, LazyTemplateModule<E, T>>;
12
+ entryRoutes?: EntryRoutes;
11
13
  }
12
14
  interface TemplateModule<E, T> {
13
15
  default: any;
@@ -25,6 +27,6 @@ export declare function pluginsBeforeRender(cr: CrelteRequest): void;
25
27
  * sectionHandle will be automatically set to product
26
28
  */
27
29
  export declare function getEntry(page: any): any;
28
- export declare function loadFn<D, E, T>(cr: CrelteRequest, app: App<E, T>, entryQuery: GraphQlQuery, globalQuery?: GraphQlQuery, loadOpts?: LoadOptions): Promise<any>;
30
+ export declare function prepareLoadFn<E, T>(crelte: Crelte, app: App<E, T>, entryQuery: GraphQlQuery, globalQuery?: GraphQlQuery): Promise<(cr: CrelteRequest, loadOpts?: LoadOptions) => Promise<any>>;
29
31
  export {};
30
32
  //# sourceMappingURL=shared.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../../../src/init/shared.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,cAAc,CAAC;AAClC,OAAO,aAAa,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAgB,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvD,UAAU,GAAG,CAAC,CAAC,EAAE,CAAC;IACjB,cAAc,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;IAGhC,aAAa,CAAC,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC;IAE9B,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;CACrD;AAED,UAAU,cAAc,CAAC,CAAC,EAAE,CAAC;IAE5B,OAAO,EAAE,GAAG,CAAC;IAEb,QAAQ,CAAC,CAAC,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;CACnD;AAED,KAAK,kBAAkB,CAAC,CAAC,EAAE,CAAC,IACzB,CAAC,MAAM,OAAO,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GACrC,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAExB,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,QAKpE;AAED,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,aAAa,GAAG,IAAI,CAE3D;AAED;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,GAAG,GAAG,GAAG,CAYvC;AAED,wBAAsB,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EACnC,EAAE,EAAE,aAAa,EACjB,GAAG,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,EACd,UAAU,EAAE,YAAY,EACxB,WAAW,CAAC,EAAE,YAAY,EAC1B,QAAQ,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,GAAG,CAAC,CAqGd"}
1
+ {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../../../src/init/shared.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,cAAc,CAAC;AAClC,OAAO,aAAa,MAAM,qBAAqB,CAAC;AAChD,OAAoB,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAgB,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvD,UAAU,GAAG,CAAC,CAAC,EAAE,CAAC;IACjB,cAAc,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;IAGhC,aAAa,CAAC,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC;IAE9B,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAErD,WAAW,CAAC,EAAE,WAAW,CAAC;CAC1B;AAED,UAAU,cAAc,CAAC,CAAC,EAAE,CAAC;IAE5B,OAAO,EAAE,GAAG,CAAC;IAEb,QAAQ,CAAC,CAAC,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;CACnD;AAED,KAAK,kBAAkB,CAAC,CAAC,EAAE,CAAC,IACzB,CAAC,MAAM,OAAO,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GACrC,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAExB,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,QAKpE;AAED,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,aAAa,GAAG,IAAI,CAE3D;AAED;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,GAAG,GAAG,GAAG,CAYvC;AAGD,wBAAsB,aAAa,CAAC,CAAC,EAAE,CAAC,EACvC,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,EACd,UAAU,EAAE,YAAY,EACxB,WAAW,CAAC,EAAE,YAAY,GACxB,OAAO,CAAC,CAAC,EAAE,EAAE,aAAa,EAAE,QAAQ,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC,CAmBtE"}
@@ -1,3 +1,4 @@
1
+ import EntryRouter from '../entry/EntryRouter.js';
1
2
  import { callLoadData } from '../loadData/index.js';
2
3
  export function setupPlugins(crelte, plugins) {
3
4
  for (const plugin of plugins) {
@@ -29,7 +30,19 @@ export function getEntry(page) {
29
30
  typeHandle: '404',
30
31
  };
31
32
  }
32
- export async function loadFn(cr, app, entryQuery, globalQuery, loadOpts) {
33
+ // todo it would be nice to call this only once per server start
34
+ export async function prepareLoadFn(crelte, app, entryQuery, globalQuery) {
35
+ const templateModules = prepareTemplates(app.templates ?? {});
36
+ let entryRouter = null;
37
+ if (app.entryRoutes) {
38
+ entryRouter = new EntryRouter(crelte);
39
+ await app.entryRoutes(entryRouter);
40
+ }
41
+ return async (cr, loadOpts) => {
42
+ return await loadFn(cr, app, templateModules, entryRouter, entryQuery, globalQuery, loadOpts);
43
+ };
44
+ }
45
+ async function loadFn(cr, app, templateModules, entryRouter, entryQuery, globalQuery, loadOpts) {
33
46
  let dataProm = null;
34
47
  // @ts-ignore
35
48
  if (app.loadData) {
@@ -53,39 +66,24 @@ export async function loadFn(cr, app, entryQuery, globalQuery, loadOpts) {
53
66
  return res;
54
67
  })();
55
68
  }
56
- let pageProm = null;
57
- if (cr.req.siteMatches()) {
58
- let uri = decodeURI(cr.req.uri);
59
- if (uri.startsWith('/'))
60
- uri = uri.substring(1);
61
- if (uri === '' || uri === '/')
62
- uri = '__home__';
63
- pageProm = cr.query(entryQuery, {
64
- uri,
65
- siteId: cr.site.id,
66
- });
67
- }
69
+ const entryProm = queryEntry(cr, app, entryRouter, entryQuery);
68
70
  const pluginsLoadGlobalData = cr.events.trigger('loadGlobalData', cr);
69
71
  // loading progress is at 20%
70
72
  loadOpts?.setProgress(0.2);
71
- const [data, global, page] = await Promise.all([
73
+ const [data, global, entry] = await Promise.all([
72
74
  dataProm,
73
75
  globalProm,
74
- pageProm,
76
+ entryProm,
75
77
  ...pluginsLoadGlobalData,
76
78
  ]);
77
- if (global) {
78
- cr.globals._setData(cr.site.id, global);
79
- }
80
- else if (!cr.globals._wasLoaded(cr.site.id)) {
81
- // we need to set the global data to an empty object
82
- // so any waiters get's triggered
83
- cr.globals._setData(cr.site.id, {});
79
+ // global is only set if !wasLoaded but we need to store something
80
+ // even if no globalQuery exists
81
+ if (global || !cr.globals._wasLoaded(cr.site.id)) {
82
+ cr.globals._setData(cr.site.id, global ?? {});
84
83
  }
85
- const entry = getEntry(page);
86
84
  let template;
87
85
  if (app.templates) {
88
- template = await loadTemplate(app.templates, entry);
86
+ template = await loadTemplate(templateModules, entry);
89
87
  }
90
88
  else {
91
89
  throw new Error('App must have templates or loadTemplate method');
@@ -125,14 +123,37 @@ function parseFilename(path) {
125
123
  const ext = filename.substring(extPos + 1);
126
124
  return [name, ext];
127
125
  }
128
- async function loadTemplate(rawModules, entry) {
126
+ async function queryEntry(cr, app, entryRouter, entryQuery) {
127
+ // check
128
+ if (entryRouter) {
129
+ const entry = await entryRouter._handle(cr);
130
+ if (entry)
131
+ return entry;
132
+ }
133
+ if (cr.req.siteMatches()) {
134
+ let uri = decodeURI(cr.req.uri);
135
+ if (uri.startsWith('/'))
136
+ uri = uri.substring(1);
137
+ if (uri === '' || uri === '/')
138
+ uri = '__home__';
139
+ const page = await cr.query(entryQuery, {
140
+ uri,
141
+ siteId: cr.site.id,
142
+ });
143
+ return getEntry(page);
144
+ }
145
+ return null;
146
+ }
147
+ function prepareTemplates(rawModules) {
129
148
  // parse modules
130
- const modules = new Map(Object.entries(rawModules)
149
+ return new Map(Object.entries(rawModules)
131
150
  .map(([path, mod]) => {
132
151
  const [name, _ext] = parseFilename(path);
133
152
  return [name, mod];
134
153
  })
135
154
  .filter(([name, _mod]) => !!name));
155
+ }
156
+ async function loadTemplate(modules, entry) {
136
157
  const entr = entry;
137
158
  const handle = `${entr.sectionHandle}-${entr.typeHandle}`;
138
159
  if (
@@ -139,6 +139,17 @@ export default class Route {
139
139
  * ```
140
140
  */
141
141
  get hash(): string;
142
+ /**
143
+ * Set the hash of the route
144
+ *
145
+ * ## Example
146
+ * ```
147
+ * const route = new Route('https://example.com/foo/bar/', null);
148
+ * route.hash = '#hash';
149
+ * console.log(route.url.href); // 'https://example.com/foo/bar/#hash'
150
+ * ```
151
+ */
152
+ set hash(hash: string);
142
153
  /**
143
154
  * Checks if there are previous routes which would allow it to go back
144
155
  */
@@ -1 +1 @@
1
- {"version":3,"file":"Route.d.ts","sourceRoot":"","sources":["../../../../src/routing/Route.ts"],"names":[],"mappings":"AACA,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,MAAM,MAAM,YAAY,GAAG;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC9B,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,MAAM,MAAM,WAAW,GACpB,MAAM,GACN,QAAQ,GACR,OAAO,GACP,KAAK,GACL,SAAS,GACT,MAAM,CAAC;AAEV;;;GAGG;AACH,MAAM,CAAC,OAAO,OAAO,KAAK;IACzB;;OAEG;IACH,GAAG,EAAE,GAAG,CAAC;IAET;;;;;;;;;OASG;IACH,IAAI,EAAE,IAAI,CAAC;IAEX;;;;;;;;;OASG;IACH,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAEvB;;;OAGG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,MAAM,EAAE,WAAW,CAAC;IAEpB;;;OAGG;IACH,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAE5B;;;;;;;;;;OAUG;IACH,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAE9B;;OAEG;gBACS,GAAG,EAAE,MAAM,GAAG,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,GAAE,YAAiB;IAWlE;;;;;;;;;;;;;;;OAeG;IACH,IAAI,GAAG,IAAI,MAAM,CAQhB;IAED;;;;;;;;;;;;;;;OAeG;IACH,IAAI,OAAO,IAAI,MAAM,CAIpB;IAED;;;;;;;;;;;OAWG;IACH,IAAI,MAAM,IAAI,eAAe,CAE5B;IAED;;;;;;;;OAQG;IACH,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED;;OAEG;IACH,SAAS,IAAI,OAAO;IAIpB;;;;;;;;OAQG;IACH,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAI1C;;;;;;;;;;;;;OAaG;IACH,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAa1D;;OAEG;IACH,QAAQ,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,IAAI;IAIxC;;;;;;;;;OASG;IACH,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,GAAG,SAAS;IAQpD;;OAEG;IACH,UAAU,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,IAAI;IAI1C;;;;;;;;OAQG;IACH,UAAU,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,GAAG,SAAS;IAOtD;;OAEG;IACH,aAAa,IAAI,OAAO;IAIxB;;OAEG;IACH,WAAW,IAAI,OAAO;IAatB;;;;;;;;OAQG;IACH,EAAE,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAStB;;;;OAIG;IACH,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAQzB;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAkB5B;;OAEG;IACH,MAAM,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAI1B;;OAEG;IACH,KAAK;IAUL,cAAc;IACd,cAAc,CAAC,KAAK,EAAE,GAAG;IAYzB,cAAc;IACd,QAAQ,IAAI,GAAG;CASf"}
1
+ {"version":3,"file":"Route.d.ts","sourceRoot":"","sources":["../../../../src/routing/Route.ts"],"names":[],"mappings":"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"}
@@ -139,6 +139,19 @@ export default class Route {
139
139
  get hash() {
140
140
  return this.url.hash;
141
141
  }
142
+ /**
143
+ * Set the hash of the route
144
+ *
145
+ * ## Example
146
+ * ```
147
+ * const route = new Route('https://example.com/foo/bar/', null);
148
+ * route.hash = '#hash';
149
+ * console.log(route.url.href); // 'https://example.com/foo/bar/#hash'
150
+ * ```
151
+ */
152
+ set hash(hash) {
153
+ this.url.hash = hash;
154
+ }
142
155
  /**
143
156
  * Checks if there are previous routes which would allow it to go back
144
157
  */
@@ -7,6 +7,17 @@ export type RouterOptions = {
7
7
  preloadOnMouseOver?: boolean;
8
8
  debugTiming?: boolean;
9
9
  };
10
+ /**
11
+ * Allows to easely modify a Request
12
+ *
13
+ * If you return `false` the request will be aborted
14
+ *
15
+ * ## Example
16
+ * ```
17
+ * router.replace(req => (req.hash = ''));
18
+ * ```
19
+ */
20
+ export type UpdateRequest = (req: Request) => boolean | null | undefined | void;
10
21
  /**
11
22
  * internal only
12
23
  */
@@ -106,7 +117,7 @@ export default class Router {
106
117
  * // the following page will be opened https://example.com/de/foo/bar
107
118
  * ```
108
119
  */
109
- open(target: string | URL | Route | Request, opts?: RequestOptions): void;
120
+ open(target: string | URL | Route | Request | UpdateRequest, opts?: RequestOptions): void;
110
121
  /**
111
122
  * This pushes the new route without triggering a new pageload
112
123
  *
@@ -118,7 +129,17 @@ export default class Router {
118
129
  * And will clear the scrollY value if you not provide a new one via the `opts`
119
130
  * This will disableLoadData by default if you not provide an override via the `opts`
120
131
  *
121
- * ## Example
132
+ * ## Example using the update function
133
+ * ```
134
+ * import { getRouter } from 'crelte';
135
+ *
136
+ * const router = getRouter();
137
+ *
138
+ * const page = 1;
139
+ * router.push(req => req.setSearchParam('page', page || null));
140
+ * ```
141
+ *
142
+ * ## Example using the route object
122
143
  * ```
123
144
  * import { getRouter } from 'crelte';
124
145
  *
@@ -130,22 +151,32 @@ export default class Router {
130
151
  * router.push(route);
131
152
  * ```
132
153
  */
133
- push(route: Route | Request, opts?: RequestOptions): void;
154
+ push(route: Route | Request | UpdateRequest, opts?: RequestOptions): void;
134
155
  /**
135
156
  * @deprecated use push instead
136
157
  */
137
158
  pushState(route: Route | Request): void;
138
159
  /**
139
- * This replaces the state of the route without triggering an event
160
+ * This replaces the state of the route without triggering a new pageload
140
161
  *
141
162
  * You can use this when using some filters for example a search filter
142
163
  *
143
164
  * ## Note
144
165
  * This will always set the origin to 'replace'
145
- * And will clear the scrollY value if you not provide a new one via the `opts`
146
- * This will disableLoadData by default if you not provide an override via the `opts`
166
+ * And will clear the scrollY value if you don't provide a new one via the `opts`
167
+ * This will disableLoadData by default if you don't provide an override via the `opts`
147
168
  *
148
- * ## Example
169
+ * ## Example using the update function
170
+ * ```
171
+ * import { getRouter } from 'crelte';
172
+ *
173
+ * const router = getRouter();
174
+ *
175
+ * const search = 'foo';
176
+ * router.replace(req => req.setSearchParam('search', search));
177
+ * ```
178
+ *
179
+ * ## Example using the route object
149
180
  * ```
150
181
  * import { getRouter } from 'crelte';
151
182
  *
@@ -153,11 +184,11 @@ export default class Router {
153
184
  *
154
185
  * const search = 'foo';
155
186
  * const route = router.route.get();
156
- * route.setSearchParam('search', search ? search : null);
157
- * router.replaceState(route);
187
+ * route.setSearchParam('search', search);
188
+ * router.replace(route);
158
189
  * ```
159
190
  */
160
- replace(route: Route | Request, opts?: RequestOptions): void;
191
+ replace(route: Route | Request | UpdateRequest, opts?: RequestOptions): void;
161
192
  /**
162
193
  * @deprecated use replace instead
163
194
  */
@@ -209,6 +240,12 @@ export default class Router {
209
240
  private _onLoaded;
210
241
  private _onNothingLoaded;
211
242
  private _onProgress;
243
+ /**
244
+ * Transforms a target to a request
245
+ *
246
+ * returns null if the request was canceled by the update request
247
+ */
248
+ private targetOrUpdateToRequest;
212
249
  }
213
250
  export {};
214
251
  //# sourceMappingURL=Router.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Router.d.ts","sourceRoot":"","sources":["../../../../src/routing/Router.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,YAAY,CAAC;AAC/B,OAAO,IAAI,EAAE,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAElD,OAAmB,EAAE,MAAM,EAAgB,MAAM,iBAAiB,CAAC;AAEnE,OAAO,EAAE,QAAQ,EAAY,MAAM,mBAAmB,CAAC;AAEvD,OAAO,OAAO,EAAE,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAEvD,MAAM,MAAM,aAAa,GAAG;IAC3B,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,WAAW,CAAC,EAAE,OAAO,CAAC;CACtB,CAAC;AAWF;;GAEG;AACH,KAAK,QAAQ,GAAG;IACf,QAAQ,EAAE,CACT,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,OAAO,EAKZ,KAAK,EAAE,MAAM,GAAG,KACZ,IAAI,CAAC;IAIV,eAAe,EAAE,CAChB,GAAG,EAAE,OAAO,EAKZ,KAAK,EAAE,MAAM,IAAI,KACb,IAAI,CAAC;IAEV,MAAM,EAAE,MAAM,CAAC;IAEf,QAAQ,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,CAAC;IAEjC,UAAU,EAAE,MAAM,IAAI,CAAC;IAEvB,UAAU,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;CACxE,CAAC;AAEF,KAAK,YAAY,GAAG;IACnB,OAAO,EAAE,OAAO,CAAC;IAEjB,QAAQ,EAAE,OAAO,CAAC;IAClB,GAAG,EAAE,OAAO,CAAC;IACb,KAAK,EAAE,GAAG,CAAC;CACX,CAAC;AAGF,MAAM,CAAC,OAAO,OAAO,MAAM;IAC1B;;;;;OAKG;IACH,OAAO,CAAC,MAAM,CAAyB;IAEvC;;;;;OAKG;IACH,OAAO,CAAC,KAAK,CAAwB;IAGrC,OAAO,CAAC,QAAQ,CAAiB;IAEjC;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAoB;IAEpC;;OAEG;IACH,OAAO,CAAC,gBAAgB,CAAmB;IAE3C,OAAO,CAAC,UAAU,CAAuB;IAEzC,cAAc;IACd,SAAS,EAAE,QAAQ,CAAC;IAEpB,OAAO,CAAC,KAAK,CAAc;IAC3B,OAAO,CAAC,UAAU,CAAyB;gBAE/B,KAAK,EAAE,eAAe,EAAE,EAAE,IAAI,GAAE,aAAkB;IAwC9D;;;;;;;OAOG;IACH,IAAI,KAAK,IAAI,QAAQ,CAAC,KAAK,GAAG,IAAI,CAAC,CAElC;IAED;;;;;;;OAOG;IACH,IAAI,IAAI,IAAI,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC,CAEhC;IAED;;OAEG;IACH,IAAI,KAAK,IAAI,IAAI,EAAE,CAElB;IAED;;OAEG;IACH,IAAI,OAAO,IAAI,QAAQ,CAAC,OAAO,CAAC,CAE/B;IAED;;OAEG;IACH,IAAI,eAAe,IAAI,QAAQ,CAAC,MAAM,CAAC,CAEtC;IAED;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,GAAG,GAAG,KAAK,GAAG,OAAO,EAAE,IAAI,GAAE,cAAmB;IAQtE;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,IAAI,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,EAAE,IAAI,GAAE,cAAmB;IAYtD;;OAEG;IACH,SAAS,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO;IAKhC;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,OAAO,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,EAAE,IAAI,GAAE,cAAmB;IAWzD;;OAEG;IACH,YAAY,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO;IAKnC;;OAEG;IACH,SAAS,IAAI,OAAO;IAIpB;;OAEG;IACH,IAAI;IAIJ;;OAEG;IACH,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,GAAG,GAAG,KAAK;IAIpC;;;;;;;;OAQG;IACH,OAAO,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,MAAM,IAAI;IAK/C;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,GAAG,MAAM,IAAI;IAIjD;;;;;;OAMG;IACH,eAAe,CACd,MAAM,EAAE,MAAM,GAAG,GAAG,GAAG,KAAK,GAAG,OAAO,EACtC,IAAI,GAAE,cAAmB,GACvB,OAAO;IAIV,OAAO,CAAC,WAAW;YAQL,WAAW;YAIX,WAAW;IA6DzB,OAAO,CAAC,QAAQ;IAoBhB,OAAO,CAAC,cAAc;IAOtB,OAAO,CAAC,UAAU;YAIJ,SAAS;YAsBT,gBAAgB;IAkB9B,OAAO,CAAC,WAAW;CAKnB"}
1
+ {"version":3,"file":"Router.d.ts","sourceRoot":"","sources":["../../../../src/routing/Router.ts"],"names":[],"mappings":"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"}