crelte 0.4.3 → 0.4.5

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.
@@ -7,6 +7,11 @@ export type Entry = {
7
7
  typeHandle: string;
8
8
  [key: string]: any;
9
9
  };
10
+ export type EntryQueryVars = {
11
+ uri: string;
12
+ siteId: number;
13
+ [key: string]: any;
14
+ };
10
15
  export type EntryRequestOptions = RequestOptions & {
11
16
  params?: Map<string, string>;
12
17
  };
@@ -1 +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"}
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,cAAc,GAAG;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,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"}
package/dist/index.d.ts CHANGED
@@ -11,6 +11,7 @@ import type { Readable } from 'crelte-std/stores';
11
11
  import { LoadData, LoadDataArray, LoadDataFn, LoadDataObj } from './loadData/index.js';
12
12
  import { Entry } from './entry/index.js';
13
13
  export { Crelte, CrelteRequest, type Config, type QueryOptions, type LoadData, type LoadDataFn, type LoadDataObj, type LoadDataArray, type Entry, };
14
+ export type Init = (crelte: Crelte) => void;
14
15
  /**
15
16
  * Get Crelte from the current context
16
17
  *
@@ -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;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"}
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,MAAM,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;AAE5C;;;;;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 +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,wBAAsB,IAAI,CAAC,IAAI,EAAE,QAAQ,iBA6IxC"}
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,iBA8IxC"}
@@ -66,6 +66,7 @@ export async function main(data) {
66
66
  }
67
67
  // setup plugins
68
68
  setupPlugins(crelte, data.app.plugins ?? []);
69
+ data.app.init?.(crelte);
69
70
  const loadFn = await prepareLoadFn(crelte, data.app, data.entryQuery, data.globalQuery);
70
71
  // setup load Data
71
72
  crelte.router._internal.onLoad = (req, opts) => {
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/init/server.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAMrD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErD,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,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,eAAe,EAAE,CAAC;CACzB,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,CAgFD;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":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAMrD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErD,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,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,eAAe,EAAE,CAAC;CACzB,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"}
@@ -40,6 +40,7 @@ export async function main(data) {
40
40
  const crelte = builder.build();
41
41
  // setup plugins
42
42
  setupPlugins(crelte, data.app.plugins ?? []);
43
+ data.app.init?.(crelte);
43
44
  const loadFn = await prepareLoadFn(crelte, data.app, data.entryQuery, data.globalQuery);
44
45
  // setup load Data
45
46
  crelte.router._internal.onLoad = req => {
@@ -2,31 +2,24 @@ import Crelte from '../Crelte.js';
2
2
  import CrelteRequest from '../CrelteRequest.js';
3
3
  import { EntryRoutes } from '../entry/EntryRouter.js';
4
4
  import { GraphQlQuery } from '../graphql/GraphQl.js';
5
+ import { Entry } from '../index.js';
5
6
  import { LoadData } from '../loadData/index.js';
6
7
  import { PluginCreator } from '../plugins/Plugins.js';
7
8
  import { LoadOptions } from '../routing/PageLoader.js';
8
- interface App<E, T> {
9
+ interface App {
9
10
  loadGlobalData?: LoadData<null>;
10
- loadEntryData?: LoadData<any>;
11
- templates?: Record<string, LazyTemplateModule<E, T>>;
11
+ loadEntryData?: LoadData<Entry>;
12
+ templates?: Record<string, LazyTemplateModule>;
12
13
  entryRoutes?: EntryRoutes;
14
+ init?: (crelte: Crelte) => void;
13
15
  }
14
- interface TemplateModule<E, T> {
16
+ interface TemplateModule {
15
17
  default: any;
16
- loadData?(cr: CrelteRequest, entry: E): Promise<T>;
18
+ loadData?: LoadData<Entry>;
17
19
  }
18
- type LazyTemplateModule<E, T> = (() => Promise<TemplateModule<E, T>>) | TemplateModule<E, T>;
20
+ type LazyTemplateModule = (() => Promise<TemplateModule>) | TemplateModule;
19
21
  export declare function setupPlugins(crelte: Crelte, plugins: PluginCreator[]): void;
20
22
  export declare function pluginsBeforeRender(cr: CrelteRequest): void;
21
- /**
22
- * Get the entry from the page
23
- *
24
- * entries should export sectionHandle and typeHandle
25
- *
26
- * products should alias productTypeHandle with typeHandle,
27
- * sectionHandle will be automatically set to product
28
- */
29
- export declare function getEntry(page: any): 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>>;
23
+ export declare function prepareLoadFn(crelte: Crelte, app: App, entryQuery: GraphQlQuery, globalQuery?: GraphQlQuery): Promise<(cr: CrelteRequest, loadOpts?: LoadOptions) => Promise<any>>;
31
24
  export {};
32
25
  //# 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,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
+ {"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;AAEnE,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,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;IACZ,cAAc,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;IAGhC,aAAa,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEhC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IAE/C,WAAW,CAAC,EAAE,WAAW,CAAC;IAE1B,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CAChC;AAED,UAAU,cAAc;IAEvB,OAAO,EAAE,GAAG,CAAC;IAEb,QAAQ,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;CAC3B;AAED,KAAK,kBAAkB,GAAG,CAAC,MAAM,OAAO,CAAC,cAAc,CAAC,CAAC,GAAG,cAAc,CAAC;AAE3E,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,QAKpE;AAED,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,aAAa,GAAG,IAAI,CAE3D;AA2BD,wBAAsB,aAAa,CAClC,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,GAAG,EACR,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"}
@@ -9,6 +9,10 @@ export function setupPlugins(crelte, plugins) {
9
9
  export function pluginsBeforeRender(cr) {
10
10
  cr.events.trigger('beforeRender', cr);
11
11
  }
12
+ const ERROR_404_ENTRY = {
13
+ sectionHandle: 'error',
14
+ typeHandle: '404',
15
+ };
12
16
  /**
13
17
  * Get the entry from the page
14
18
  *
@@ -17,7 +21,7 @@ export function pluginsBeforeRender(cr) {
17
21
  * products should alias productTypeHandle with typeHandle,
18
22
  * sectionHandle will be automatically set to product
19
23
  */
20
- export function getEntry(page) {
24
+ function getEntry(page) {
21
25
  if (page?.entry)
22
26
  return { ...page.entry };
23
27
  if (page?.product)
@@ -25,10 +29,7 @@ export function getEntry(page) {
25
29
  sectionHandle: 'product',
26
30
  ...page.product,
27
31
  };
28
- return {
29
- sectionHandle: 'error',
30
- typeHandle: '404',
31
- };
32
+ return null;
32
33
  }
33
34
  // todo it would be nice to call this only once per server start
34
35
  export async function prepareLoadFn(crelte, app, entryQuery, globalQuery) {
@@ -86,7 +87,7 @@ async function loadFn(cr, app, templateModules, entryRouter, entryQuery, globalQ
86
87
  template = await loadTemplate(templateModules, entry);
87
88
  }
88
89
  else {
89
- throw new Error('App must have templates or loadTemplate method');
90
+ throw new Error('App must export some templates');
90
91
  }
91
92
  // loading progress is at 60%
92
93
  loadOpts?.setProgress(0.6);
@@ -124,25 +125,45 @@ function parseFilename(path) {
124
125
  return [name, ext];
125
126
  }
126
127
  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
- }
128
+ let vars = null;
133
129
  if (cr.req.siteMatches()) {
134
130
  let uri = decodeURI(cr.req.uri);
135
131
  if (uri.startsWith('/'))
136
132
  uri = uri.substring(1);
137
133
  if (uri === '' || uri === '/')
138
134
  uri = '__home__';
139
- const page = await cr.query(entryQuery, {
135
+ vars = {
140
136
  uri,
141
137
  siteId: cr.site.id,
142
- });
143
- return getEntry(page);
138
+ };
144
139
  }
145
- return null;
140
+ if (vars) {
141
+ await Promise.all(cr.events.trigger('beforeQueryEntry', cr, vars));
142
+ }
143
+ // basic query function
144
+ let loadFn = async (vars) => {
145
+ if (entryRouter) {
146
+ const entry = await entryRouter._handle(cr);
147
+ if (entry)
148
+ return entry;
149
+ }
150
+ if (vars) {
151
+ const page = await cr.query(entryQuery, vars);
152
+ return getEntry(page);
153
+ }
154
+ return null;
155
+ };
156
+ // check if a plugin wants to override the query
157
+ const fns = cr.events.getListeners('queryEntry');
158
+ for (const fn of fns) {
159
+ const prevLoadFn = loadFn;
160
+ loadFn = async (vars) => {
161
+ return await fn(cr, vars, prevLoadFn);
162
+ };
163
+ }
164
+ const entry = (await loadFn(vars)) ?? ERROR_404_ENTRY;
165
+ await Promise.all(cr.events.trigger('afterQueryEntry', cr, entry));
166
+ return entry;
146
167
  }
147
168
  function prepareTemplates(rawModules) {
148
169
  // parse modules
@@ -1,4 +1,5 @@
1
- import { CrelteRequest } from '../index.js';
1
+ import { EntryQueryVars } from '../entry/index.js';
2
+ import { CrelteRequest, Entry } from '../index.js';
2
3
  export default class Events {
3
4
  inner: Map<string, Set<any>>;
4
5
  constructor();
@@ -8,17 +9,32 @@ export default class Events {
8
9
  * @returns a function to remove the listener
9
10
  */
10
11
  on(ev: 'loadGlobalData', fn: (cr: CrelteRequest) => Promise<any>): () => void;
11
- on(ev: 'loadData', fn: (cr: CrelteRequest, entry: any) => Promise<any>): () => void;
12
+ on(ev: 'loadData', fn: (cr: CrelteRequest, entry: Entry) => Promise<any>): () => void;
12
13
  on(ev: 'beforeRender', fn: (cr: CrelteRequest) => void): () => void;
14
+ on(ev: 'beforeQueryEntry', fn: (cr: CrelteRequest, vars: EntryQueryVars) => Promise<void> | void): () => void;
15
+ on(ev: 'queryEntry', fn: (cr: CrelteRequest, vars: EntryQueryVars | null,
16
+ /** this might contain other plugin calls */
17
+ runQuery: (vars: EntryQueryVars | null) => Promise<Entry | null>) => Promise<Entry | null>): () => void;
18
+ on(ev: 'afterQueryEntry', fn: (cr: CrelteRequest, entry: Entry) => Promise<void> | void): () => void;
13
19
  /**
14
20
  * Remove a listener
15
21
  */
16
22
  remove(ev: string, fn: any): void;
23
+ /**
24
+ * Check if an event has listeners
25
+ */
26
+ has(ev: string): boolean;
17
27
  /**
18
28
  * Trigger an event
19
29
  */
20
30
  trigger(ev: 'loadGlobalData', cr: CrelteRequest): Promise<any>[];
21
- trigger(ev: 'loadData', cr: CrelteRequest, entry: any): Promise<any>[];
31
+ trigger(ev: 'loadData', cr: CrelteRequest, entry: Entry): Promise<any>[];
22
32
  trigger(ev: 'beforeRender', cr: CrelteRequest): void[];
33
+ trigger(ev: 'beforeQueryEntry', cr: CrelteRequest, vars: EntryQueryVars): void[];
34
+ trigger(ev: 'afterQueryEntry', cr: CrelteRequest, entry: Entry): Promise<void>[];
35
+ /**
36
+ * Get all listeners for an event
37
+ */
38
+ getListeners(ev: 'queryEntry'): ((cr: CrelteRequest, vars: EntryQueryVars | null, runQuery: (vars: EntryQueryVars | null) => Promise<Entry | null>) => Promise<Entry | null>)[];
23
39
  }
24
40
  //# sourceMappingURL=Events.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Events.d.ts","sourceRoot":"","sources":["../../src/plugins/Events.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,CAAC,OAAO,OAAO,MAAM;IAC1B,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;;IAM7B;;;;OAIG;IAEH,EAAE,CACD,EAAE,EAAE,gBAAgB,EACpB,EAAE,EAAE,CAAC,EAAE,EAAE,aAAa,KAAK,OAAO,CAAC,GAAG,CAAC,GACrC,MAAM,IAAI;IACb,EAAE,CACD,EAAE,EAAE,UAAU,EACd,EAAE,EAAE,CAAC,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,GACjD,MAAM,IAAI;IACb,EAAE,CAAC,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,aAAa,KAAK,IAAI,GAAG,MAAM,IAAI;IAenE;;OAEG;IACH,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG;IAO1B;;OAEG;IACH,OAAO,CAAC,EAAE,EAAE,gBAAgB,EAAE,EAAE,EAAE,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE;IAChE,OAAO,CAAC,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE;IACtE,OAAO,CAAC,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE,aAAa,GAAG,IAAI,EAAE;CAOtD"}
1
+ {"version":3,"file":"Events.d.ts","sourceRoot":"","sources":["../../src/plugins/Events.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEnD,MAAM,CAAC,OAAO,OAAO,MAAM;IAC1B,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;;IAM7B;;;;OAIG;IAEH,EAAE,CACD,EAAE,EAAE,gBAAgB,EACpB,EAAE,EAAE,CAAC,EAAE,EAAE,aAAa,KAAK,OAAO,CAAC,GAAG,CAAC,GACrC,MAAM,IAAI;IACb,EAAE,CACD,EAAE,EAAE,UAAU,EACd,EAAE,EAAE,CAAC,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,KAAK,OAAO,CAAC,GAAG,CAAC,GACnD,MAAM,IAAI;IACb,EAAE,CAAC,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,aAAa,KAAK,IAAI,GAAG,MAAM,IAAI;IACnE,EAAE,CACD,EAAE,EAAE,kBAAkB,EACtB,EAAE,EAAE,CAAC,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,cAAc,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,GACnE,MAAM,IAAI;IACb,EAAE,CACD,EAAE,EAAE,YAAY,EAChB,EAAE,EAAE,CACH,EAAE,EAAE,aAAa,EACjB,IAAI,EAAE,cAAc,GAAG,IAAI;IAC3B,4CAA4C;IAC5C,QAAQ,EAAE,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI,KAAK,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,KAC5D,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,GACxB,MAAM,IAAI;IACb,EAAE,CACD,EAAE,EAAE,iBAAiB,EACrB,EAAE,EAAE,CAAC,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,GAC3D,MAAM,IAAI;IAeb;;OAEG;IACH,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG;IAO1B;;OAEG;IACH,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAKxB;;OAEG;IACH,OAAO,CAAC,EAAE,EAAE,gBAAgB,EAAE,EAAE,EAAE,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE;IAChE,OAAO,CAAC,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE;IACxE,OAAO,CAAC,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE,aAAa,GAAG,IAAI,EAAE;IACtD,OAAO,CACN,EAAE,EAAE,kBAAkB,EACtB,EAAE,EAAE,aAAa,EACjB,IAAI,EAAE,cAAc,GAClB,IAAI,EAAE;IACT,OAAO,CACN,EAAE,EAAE,iBAAiB,EACrB,EAAE,EAAE,aAAa,EACjB,KAAK,EAAE,KAAK,GACV,OAAO,CAAC,IAAI,CAAC,EAAE;IAQlB;;OAEG;IACH,YAAY,CACX,EAAE,EAAE,YAAY,GACd,CAAC,CACH,EAAE,EAAE,aAAa,EACjB,IAAI,EAAE,cAAc,GAAG,IAAI,EAC3B,QAAQ,EAAE,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI,KAAK,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,KAC5D,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,EAAE;CAI7B"}
@@ -23,10 +23,20 @@ export default class Events {
23
23
  return;
24
24
  set.delete(fn);
25
25
  }
26
+ /**
27
+ * Check if an event has listeners
28
+ */
29
+ has(ev) {
30
+ const size = this.inner.get(ev)?.size ?? 0;
31
+ return size > 0;
32
+ }
26
33
  trigger(ev, ...args) {
27
34
  const set = this.inner.get(ev);
28
35
  if (!set)
29
36
  return [];
30
37
  return Array.from(set).map(fn => fn(...args));
31
38
  }
39
+ getListeners(ev) {
40
+ return Array.from(this.inner.get(ev) ?? []);
41
+ }
32
42
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Request.d.ts","sourceRoot":"","sources":["../../src/routing/Request.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,KAAK,EAAE,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG;IAC5B,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;IAC9B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,OAAO,OAAO,OAAQ,SAAQ,KAAK;IACzC;;;OAGG;IACH,aAAa,EAAE,OAAO,CAAC;IAEvB;;;OAGG;IACH,eAAe,EAAE,OAAO,CAAC;IAEzB;;OAEG;IACH,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAE1B,cAAc;IACd,cAAc,EAAE,aAAa,CAAC;IAE9B;;OAEG;gBACS,GAAG,EAAE,MAAM,GAAG,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,GAAE,cAAmB;IASpE;;OAEG;IACH,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,GAAE,cAAmB;IAWxD;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2BG;IACH,WAAW,IAAI,WAAW;IAI1B;;OAEG;IACH,KAAK;IAYL;;OAEG;IACH,OAAO;IAUP,cAAc;IACd,WAAW,CAAC,IAAI,GAAE,cAAmB;CASrC;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,IAAI,OAAO,CAElD;AAED,cAAM,aAAa;IAClB,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IACxB,SAAS,EAAE,OAAO,CAAC;IACnB,IAAI,EAAE,WAAW,CAAC;;IAQlB,MAAM,IAAI,OAAO;IAIjB,GAAG,IAAI,WAAW;IAclB,cAAc;IACd,MAAM;IAQN,cAAc;IACd,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC;CAGzB;AAED;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG;IACzB;;;;;OAKG;IACH,KAAK,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IAE9B;;OAEG;IACH,MAAM,EAAE,MAAM,IAAI,CAAC;CACnB,CAAC"}
1
+ {"version":3,"file":"Request.d.ts","sourceRoot":"","sources":["../../src/routing/Request.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,KAAK,EAAE,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG;IAC5B,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;IAC9B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,OAAO,OAAO,OAAQ,SAAQ,KAAK;IACzC;;;OAGG;IACH,aAAa,EAAE,OAAO,CAAC;IAEvB;;;OAGG;IACH,eAAe,EAAE,OAAO,CAAC;IAEzB;;OAEG;IACH,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAE1B,cAAc;IACd,cAAc,EAAE,aAAa,CAAC;IAE9B;;OAEG;gBACS,GAAG,EAAE,MAAM,GAAG,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,GAAE,cAAmB;IASpE;;OAEG;IACH,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,GAAE,cAAmB;IAWxD;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2BG;IACH,WAAW,IAAI,WAAW;IAI1B;;OAEG;IACH,KAAK;IAaL;;OAEG;IACH,OAAO;IAUP,cAAc;IACd,WAAW,CAAC,IAAI,GAAE,cAAmB;CAUrC;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,IAAI,OAAO,CAElD;AAED,cAAM,aAAa;IAClB,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IACxB,SAAS,EAAE,OAAO,CAAC;IACnB,IAAI,EAAE,WAAW,CAAC;;IAQlB,MAAM,IAAI,OAAO;IAIjB,GAAG,IAAI,WAAW;IAclB,cAAc;IACd,MAAM;IAQN,cAAc;IACd,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC;CAGzB;AAED;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG;IACzB;;;;;OAKG;IACH,KAAK,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IAE9B;;OAEG;IACH,MAAM,EAAE,MAAM,IAAI,CAAC;CACnB,CAAC"}
@@ -88,6 +88,7 @@ export default class Request extends Route {
88
88
  state: objClone(this._state),
89
89
  context: this._context,
90
90
  disableScroll: this.disableScroll,
91
+ disableLoadData: this.disableLoadData,
91
92
  statusCode: this.statusCode ?? undefined,
92
93
  });
93
94
  }
@@ -111,6 +112,7 @@ export default class Request extends Route {
111
112
  this._state = opts.state ?? this._state;
112
113
  this._context = opts.context ?? this._context;
113
114
  this.disableScroll = opts.disableScroll ?? this.disableScroll;
115
+ this.disableLoadData = opts.disableLoadData ?? this.disableLoadData;
114
116
  this.statusCode = opts.statusCode ?? this.statusCode;
115
117
  }
116
118
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "crelte",
3
- "version": "0.4.3",
3
+ "version": "0.4.5",
4
4
  "author": "Crelte <support@crelte.com>",
5
5
  "type": "module",
6
6
  "scripts": {
@@ -10,6 +10,12 @@ export type Entry = {
10
10
  [key: string]: any;
11
11
  };
12
12
 
13
+ export type EntryQueryVars = {
14
+ uri: string;
15
+ siteId: number;
16
+ [key: string]: any;
17
+ };
18
+
13
19
  export type EntryRequestOptions = RequestOptions & {
14
20
  params?: Map<string, string>;
15
21
  };
package/src/index.ts CHANGED
@@ -29,6 +29,8 @@ export {
29
29
  type Entry,
30
30
  };
31
31
 
32
+ export type Init = (crelte: Crelte) => void;
33
+
32
34
  /**
33
35
  * Get Crelte from the current context
34
36
  *
@@ -96,6 +96,7 @@ export async function main(data: MainData) {
96
96
 
97
97
  // setup plugins
98
98
  setupPlugins(crelte, data.app.plugins ?? []);
99
+ data.app.init?.(crelte);
99
100
 
100
101
  const loadFn = await prepareLoadFn(
101
102
  crelte,
@@ -82,6 +82,7 @@ export async function main(data: MainData): Promise<{
82
82
 
83
83
  // setup plugins
84
84
  setupPlugins(crelte, data.app.plugins ?? []);
85
+ data.app.init?.(crelte);
85
86
 
86
87
  const loadFn = await prepareLoadFn(
87
88
  crelte,
@@ -1,32 +1,34 @@
1
1
  import Crelte from '../Crelte.js';
2
2
  import CrelteRequest from '../CrelteRequest.js';
3
3
  import EntryRouter, { EntryRoutes } from '../entry/EntryRouter.js';
4
+ import { EntryQueryVars } from '../entry/index.js';
4
5
  import { GraphQlQuery } from '../graphql/GraphQl.js';
6
+ import { Entry } from '../index.js';
5
7
  import { LoadData, callLoadData } from '../loadData/index.js';
6
8
  import { PluginCreator } from '../plugins/Plugins.js';
7
9
  import { LoadOptions } from '../routing/PageLoader.js';
8
10
 
9
- interface App<E, T> {
11
+ interface App {
10
12
  loadGlobalData?: LoadData<null>;
11
13
 
12
14
  // todo: add a generic
13
- loadEntryData?: LoadData<any>;
15
+ loadEntryData?: LoadData<Entry>;
14
16
 
15
- templates?: Record<string, LazyTemplateModule<E, T>>;
17
+ templates?: Record<string, LazyTemplateModule>;
16
18
 
17
19
  entryRoutes?: EntryRoutes;
20
+
21
+ init?: (crelte: Crelte) => void;
18
22
  }
19
23
 
20
- interface TemplateModule<E, T> {
24
+ interface TemplateModule {
21
25
  // svelte component
22
26
  default: any;
23
27
 
24
- loadData?(cr: CrelteRequest, entry: E): Promise<T>;
28
+ loadData?: LoadData<Entry>;
25
29
  }
26
30
 
27
- type LazyTemplateModule<E, T> =
28
- | (() => Promise<TemplateModule<E, T>>)
29
- | TemplateModule<E, T>;
31
+ type LazyTemplateModule = (() => Promise<TemplateModule>) | TemplateModule;
30
32
 
31
33
  export function setupPlugins(crelte: Crelte, plugins: PluginCreator[]) {
32
34
  for (const plugin of plugins) {
@@ -39,6 +41,11 @@ export function pluginsBeforeRender(cr: CrelteRequest): void {
39
41
  cr.events.trigger('beforeRender', cr);
40
42
  }
41
43
 
44
+ const ERROR_404_ENTRY: Entry = {
45
+ sectionHandle: 'error',
46
+ typeHandle: '404',
47
+ };
48
+
42
49
  /**
43
50
  * Get the entry from the page
44
51
  *
@@ -47,7 +54,7 @@ export function pluginsBeforeRender(cr: CrelteRequest): void {
47
54
  * products should alias productTypeHandle with typeHandle,
48
55
  * sectionHandle will be automatically set to product
49
56
  */
50
- export function getEntry(page: any): any {
57
+ function getEntry(page: any): Entry | null {
51
58
  if (page?.entry) return { ...page.entry };
52
59
  if (page?.product)
53
60
  return {
@@ -55,16 +62,13 @@ export function getEntry(page: any): any {
55
62
  ...page.product,
56
63
  };
57
64
 
58
- return {
59
- sectionHandle: 'error',
60
- typeHandle: '404',
61
- };
65
+ return null;
62
66
  }
63
67
 
64
68
  // todo it would be nice to call this only once per server start
65
- export async function prepareLoadFn<E, T>(
69
+ export async function prepareLoadFn(
66
70
  crelte: Crelte,
67
- app: App<E, T>,
71
+ app: App,
68
72
  entryQuery: GraphQlQuery,
69
73
  globalQuery?: GraphQlQuery,
70
74
  ): Promise<(cr: CrelteRequest, loadOpts?: LoadOptions) => Promise<any>> {
@@ -88,10 +92,10 @@ export async function prepareLoadFn<E, T>(
88
92
  };
89
93
  }
90
94
 
91
- async function loadFn<E, T>(
95
+ async function loadFn(
92
96
  cr: CrelteRequest,
93
- app: App<E, T>,
94
- templateModules: Map<string, LazyTemplateModule<E, T>>,
97
+ app: App,
98
+ templateModules: Map<string, LazyTemplateModule>,
95
99
  entryRouter: EntryRouter | null,
96
100
  entryQuery: GraphQlQuery,
97
101
  globalQuery?: GraphQlQuery,
@@ -149,7 +153,7 @@ async function loadFn<E, T>(
149
153
  if (app.templates) {
150
154
  template = await loadTemplate(templateModules, entry);
151
155
  } else {
152
- throw new Error('App must have templates or loadTemplate method');
156
+ throw new Error('App must export some templates');
153
157
  }
154
158
 
155
159
  // loading progress is at 60%
@@ -198,52 +202,79 @@ function parseFilename(path: string): [string, string] {
198
202
  return [name, ext];
199
203
  }
200
204
 
201
- async function queryEntry<E, T>(
205
+ async function queryEntry(
202
206
  cr: CrelteRequest,
203
- app: App<E, T>,
207
+ app: App,
204
208
  entryRouter: EntryRouter | null,
205
209
  entryQuery: GraphQlQuery,
206
- ): Promise<any | null> {
207
- // check
208
- if (entryRouter) {
209
- const entry = await entryRouter._handle(cr);
210
- if (entry) return entry;
211
- }
210
+ ): Promise<Entry> {
211
+ let vars: EntryQueryVars | null = null;
212
212
 
213
213
  if (cr.req.siteMatches()) {
214
214
  let uri = decodeURI(cr.req.uri);
215
215
  if (uri.startsWith('/')) uri = uri.substring(1);
216
216
  if (uri === '' || uri === '/') uri = '__home__';
217
217
 
218
- const page = await cr.query(entryQuery, {
218
+ vars = {
219
219
  uri,
220
220
  siteId: cr.site.id,
221
- });
221
+ };
222
+ }
222
223
 
223
- return getEntry(page);
224
+ if (vars) {
225
+ await Promise.all(cr.events.trigger('beforeQueryEntry', cr, vars));
224
226
  }
225
227
 
226
- return null;
228
+ // basic query function
229
+ let loadFn = async (vars: EntryQueryVars | null) => {
230
+ if (entryRouter) {
231
+ const entry = await entryRouter._handle(cr);
232
+ if (entry) return entry;
233
+ }
234
+
235
+ if (vars) {
236
+ const page = await cr.query(entryQuery, vars);
237
+
238
+ return getEntry(page);
239
+ }
240
+
241
+ return null;
242
+ };
243
+
244
+ // check if a plugin wants to override the query
245
+ const fns = cr.events.getListeners('queryEntry');
246
+ for (const fn of fns) {
247
+ const prevLoadFn = loadFn;
248
+ loadFn = async vars => {
249
+ return await fn(cr, vars, prevLoadFn);
250
+ };
251
+ }
252
+
253
+ const entry = (await loadFn(vars)) ?? ERROR_404_ENTRY;
254
+
255
+ await Promise.all(cr.events.trigger('afterQueryEntry', cr, entry));
256
+
257
+ return entry;
227
258
  }
228
259
 
229
- function prepareTemplates<E, T>(
230
- rawModules: Record<string, LazyTemplateModule<E, T>>,
231
- ): Map<string, LazyTemplateModule<E, T>> {
260
+ function prepareTemplates(
261
+ rawModules: Record<string, LazyTemplateModule>,
262
+ ): Map<string, LazyTemplateModule> {
232
263
  // parse modules
233
264
  return new Map(
234
265
  Object.entries(rawModules)
235
266
  .map(([path, mod]) => {
236
267
  const [name, _ext] = parseFilename(path);
237
- return [name, mod] as [string, LazyTemplateModule<E, T>];
268
+ return [name, mod] as [string, LazyTemplateModule];
238
269
  })
239
270
  .filter(([name, _mod]) => !!name),
240
271
  );
241
272
  }
242
273
 
243
- async function loadTemplate<E, T>(
244
- modules: Map<string, LazyTemplateModule<E, T>>,
245
- entry: E,
246
- ): Promise<TemplateModule<E, T>> {
274
+ async function loadTemplate(
275
+ modules: Map<string, LazyTemplateModule>,
276
+ entry: Entry,
277
+ ): Promise<TemplateModule> {
247
278
  const entr = entry as any;
248
279
  const handle = `${entr.sectionHandle}-${entr.typeHandle}`;
249
280
 
@@ -1,4 +1,5 @@
1
- import { CrelteRequest } from '../index.js';
1
+ import { EntryQueryVars } from '../entry/index.js';
2
+ import { CrelteRequest, Entry } from '../index.js';
2
3
 
3
4
  export default class Events {
4
5
  inner: Map<string, Set<any>>;
@@ -19,9 +20,26 @@ export default class Events {
19
20
  ): () => void;
20
21
  on(
21
22
  ev: 'loadData',
22
- fn: (cr: CrelteRequest, entry: any) => Promise<any>,
23
+ fn: (cr: CrelteRequest, entry: Entry) => Promise<any>,
23
24
  ): () => void;
24
25
  on(ev: 'beforeRender', fn: (cr: CrelteRequest) => void): () => void;
26
+ on(
27
+ ev: 'beforeQueryEntry',
28
+ fn: (cr: CrelteRequest, vars: EntryQueryVars) => Promise<void> | void,
29
+ ): () => void;
30
+ on(
31
+ ev: 'queryEntry',
32
+ fn: (
33
+ cr: CrelteRequest,
34
+ vars: EntryQueryVars | null,
35
+ /** this might contain other plugin calls */
36
+ runQuery: (vars: EntryQueryVars | null) => Promise<Entry | null>,
37
+ ) => Promise<Entry | null>,
38
+ ): () => void;
39
+ on(
40
+ ev: 'afterQueryEntry',
41
+ fn: (cr: CrelteRequest, entry: Entry) => Promise<void> | void,
42
+ ): () => void;
25
43
  on(ev: string, fn: (...args: any[]) => any): () => void {
26
44
  let set = this.inner.get(ev);
27
45
  if (!set) {
@@ -46,16 +64,48 @@ export default class Events {
46
64
  set.delete(fn);
47
65
  }
48
66
 
67
+ /**
68
+ * Check if an event has listeners
69
+ */
70
+ has(ev: string): boolean {
71
+ const size = this.inner.get(ev)?.size ?? 0;
72
+ return size > 0;
73
+ }
74
+
49
75
  /**
50
76
  * Trigger an event
51
77
  */
52
78
  trigger(ev: 'loadGlobalData', cr: CrelteRequest): Promise<any>[];
53
- trigger(ev: 'loadData', cr: CrelteRequest, entry: any): Promise<any>[];
79
+ trigger(ev: 'loadData', cr: CrelteRequest, entry: Entry): Promise<any>[];
54
80
  trigger(ev: 'beforeRender', cr: CrelteRequest): void[];
81
+ trigger(
82
+ ev: 'beforeQueryEntry',
83
+ cr: CrelteRequest,
84
+ vars: EntryQueryVars,
85
+ ): void[];
86
+ trigger(
87
+ ev: 'afterQueryEntry',
88
+ cr: CrelteRequest,
89
+ entry: Entry,
90
+ ): Promise<void>[];
55
91
  trigger(ev: string, ...args: any[]): any[] {
56
92
  const set = this.inner.get(ev);
57
93
  if (!set) return [];
58
94
 
59
95
  return Array.from(set).map(fn => fn(...args));
60
96
  }
97
+
98
+ /**
99
+ * Get all listeners for an event
100
+ */
101
+ getListeners(
102
+ ev: 'queryEntry',
103
+ ): ((
104
+ cr: CrelteRequest,
105
+ vars: EntryQueryVars | null,
106
+ runQuery: (vars: EntryQueryVars | null) => Promise<Entry | null>,
107
+ ) => Promise<Entry | null>)[];
108
+ getListeners(ev: string): any[] {
109
+ return Array.from(this.inner.get(ev) ?? []);
110
+ }
61
111
  }
@@ -112,6 +112,7 @@ export default class Request extends Route {
112
112
  state: objClone(this._state),
113
113
  context: this._context,
114
114
  disableScroll: this.disableScroll,
115
+ disableLoadData: this.disableLoadData,
115
116
  statusCode: this.statusCode ?? undefined,
116
117
  });
117
118
  }
@@ -137,6 +138,7 @@ export default class Request extends Route {
137
138
  this._state = opts.state ?? this._state;
138
139
  this._context = opts.context ?? this._context;
139
140
  this.disableScroll = opts.disableScroll ?? this.disableScroll;
141
+ this.disableLoadData = opts.disableLoadData ?? this.disableLoadData;
140
142
  this.statusCode = opts.statusCode ?? this.statusCode;
141
143
  }
142
144
  }