crelte 0.5.0-alpha.1 → 0.5.0-alpha.10

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.
Files changed (54) hide show
  1. package/dist/entry/EntryRouter.d.ts +2 -2
  2. package/dist/entry/EntryRouter.d.ts.map +1 -1
  3. package/dist/entry/index.d.ts +11 -0
  4. package/dist/entry/index.d.ts.map +1 -1
  5. package/dist/entry/index.js +38 -0
  6. package/dist/graphql/GraphQl.d.ts +2 -0
  7. package/dist/graphql/GraphQl.d.ts.map +1 -1
  8. package/dist/graphql/GraphQl.js +6 -3
  9. package/dist/index.d.ts +1 -1
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/init/client.d.ts.map +1 -1
  12. package/dist/init/client.js +8 -1
  13. package/dist/init/shared.d.ts +0 -3
  14. package/dist/init/shared.d.ts.map +1 -1
  15. package/dist/init/shared.js +10 -38
  16. package/dist/init/svelteComponents.js +1 -1
  17. package/dist/init/{crelte-vite-plugin.d.ts → virtualSvelteComponents.d.ts} +1 -1
  18. package/dist/loadData/Globals.d.ts.map +1 -1
  19. package/dist/loadData/Globals.js +21 -17
  20. package/dist/plugins/Events.d.ts +2 -1
  21. package/dist/plugins/Events.d.ts.map +1 -1
  22. package/dist/routing/BaseRouter.d.ts +2 -1
  23. package/dist/routing/BaseRouter.d.ts.map +1 -1
  24. package/dist/routing/BaseRouter.js +3 -3
  25. package/dist/routing/ClientRouter.d.ts.map +1 -1
  26. package/dist/routing/ClientRouter.js +4 -12
  27. package/dist/routing/Route.d.ts +2 -1
  28. package/dist/routing/Route.d.ts.map +1 -1
  29. package/dist/routing/Route.js +1 -0
  30. package/dist/routing/Router.d.ts +2 -2
  31. package/dist/routing/Router.js +3 -3
  32. package/dist/routing/index.d.ts +2 -1
  33. package/dist/routing/index.d.ts.map +1 -1
  34. package/dist/routing/index.js +2 -1
  35. package/dist/ssr/index.d.ts +2 -2
  36. package/dist/ssr/index.d.ts.map +1 -1
  37. package/dist/ssr/index.js +2 -2
  38. package/package.json +2 -2
  39. package/src/entry/EntryRouter.ts +2 -2
  40. package/src/entry/index.ts +49 -0
  41. package/src/graphql/GraphQl.ts +6 -3
  42. package/src/index.ts +0 -1
  43. package/src/init/client.ts +7 -1
  44. package/src/init/shared.ts +17 -49
  45. package/src/init/svelteComponents.ts +1 -1
  46. package/src/init/{crelte-vite-plugin.d.ts → virtualSvelteComponents.d.ts} +1 -1
  47. package/src/loadData/Globals.ts +21 -22
  48. package/src/plugins/Events.ts +2 -1
  49. package/src/routing/BaseRouter.ts +5 -4
  50. package/src/routing/ClientRouter.ts +4 -12
  51. package/src/routing/Route.ts +3 -1
  52. package/src/routing/Router.ts +3 -3
  53. package/src/routing/index.ts +2 -0
  54. package/src/ssr/index.ts +2 -2
@@ -1,6 +1,6 @@
1
1
  import { Pattern } from 'trouter';
2
- import { Crelte, CrelteRequest, Entry, QueryOptions } from '../index.js';
3
- import { CrelteEntryRequest } from './index.js';
2
+ import { Crelte, CrelteRequest, QueryOptions } from '../index.js';
3
+ import { CrelteEntryRequest, Entry } from './index.js';
4
4
  import { GraphQlQuery } from '../graphql/GraphQl.js';
5
5
  export type EntryRouteHandler = (cr: CrelteEntryRequest) => Promise<Entry | null | undefined> | Entry | null | undefined | void;
6
6
  export type EntryRoutes = (router: EntryRouter) => Promise<void> | void;
@@ -1 +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"}
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,YAAY,EAAE,MAAM,aAAa,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,KAAK,EAAgB,MAAM,YAAY,CAAC;AACrE,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"}
@@ -1,3 +1,4 @@
1
+ import { GraphQlQuery } from '../graphql/index.js';
1
2
  import { Crelte, CrelteRequest } from '../index.js';
2
3
  import { Request, RequestOptions, Site } from '../routing/index.js';
3
4
  import EntryRouter, { EntryRouteHandler, EntryRoutes } from './EntryRouter.js';
@@ -34,4 +35,14 @@ export declare class CrelteEntryRequest extends CrelteRequest {
34
35
  req: EntryRequest;
35
36
  constructor(inner: Crelte, req: EntryRequest);
36
37
  }
38
+ export declare function queryEntry(cr: CrelteRequest, entryQuery: GraphQlQuery): Promise<Entry>;
39
+ /**
40
+ * Get the entry from the page
41
+ *
42
+ * entries should export sectionHandle and typeHandle
43
+ *
44
+ * products should alias productTypeHandle with typeHandle,
45
+ * sectionHandle will be automatically set to product
46
+ */
47
+ export declare function extractEntry(page: any): Entry | null;
37
48
  //# sourceMappingURL=index.d.ts.map
@@ -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,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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/entry/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,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;AAED,wBAAsB,UAAU,CAC/B,EAAE,EAAE,aAAa,EACjB,UAAU,EAAE,YAAY,GACtB,OAAO,CAAC,KAAK,CAAC,CAiBhB;AAOD;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,GAAG,GAAG,KAAK,GAAG,IAAI,CASpD"}
@@ -29,3 +29,41 @@ export class CrelteEntryRequest extends CrelteRequest {
29
29
  this.req = req;
30
30
  }
31
31
  }
32
+ export async function queryEntry(cr, entryQuery) {
33
+ if (!cr.req.siteMatches())
34
+ throw new Error('to run the entryQuery the request needs to have a matching site');
35
+ let uri = decodeURI(cr.req.uri);
36
+ if (uri.startsWith('/'))
37
+ uri = uri.substring(1);
38
+ if (uri === '' || uri === '/')
39
+ uri = '__home__';
40
+ const vars = {
41
+ uri,
42
+ siteId: cr.site.id,
43
+ };
44
+ const page = await cr.query(entryQuery, vars);
45
+ return extractEntry(page) ?? ERROR_404_ENTRY;
46
+ }
47
+ const ERROR_404_ENTRY = {
48
+ sectionHandle: 'error',
49
+ typeHandle: '404',
50
+ };
51
+ /**
52
+ * Get the entry from the page
53
+ *
54
+ * entries should export sectionHandle and typeHandle
55
+ *
56
+ * products should alias productTypeHandle with typeHandle,
57
+ * sectionHandle will be automatically set to product
58
+ */
59
+ export function extractEntry(page) {
60
+ if (page?.entry)
61
+ return { ...page.entry };
62
+ if (page?.product)
63
+ return {
64
+ sectionHandle: 'product',
65
+ ...page.product,
66
+ };
67
+ return null;
68
+ }
69
+ // todo maybe move everything here to /loadData
@@ -35,6 +35,7 @@ export declare class GraphQlError extends Error {
35
35
  * Options for the GraphQl class
36
36
  */
37
37
  export type GraphQlOptions = {
38
+ bearerToken?: string;
38
39
  XCraftSiteHeader?: boolean;
39
40
  debug?: boolean;
40
41
  debugTiming?: boolean;
@@ -71,6 +72,7 @@ export default class GraphQl {
71
72
  private endpoint;
72
73
  private ssrCache;
73
74
  private listeners;
75
+ private bearerToken;
74
76
  private XCraftSiteHeader;
75
77
  private loggingRequests;
76
78
  private loggingTiming;
@@ -1 +1 @@
1
- {"version":3,"file":"GraphQl.d.ts","sourceRoot":"","sources":["../../src/graphql/GraphQl.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,yBAAyB,CAAC;AAEhD,OAAO,QAAwC,MAAM,oBAAoB,CAAC;AAE1E,MAAM,MAAM,oBAAoB,GAAG;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACd,CAAC;AAEF;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACd;AAGD;;GAEG;AACH,qBAAa,YAAa,SAAQ,KAAK;IACtC,IAAI,EAAE,oBAAoB,CAAC;IAC3B,GAAG,EAAE,GAAG,CAAC;gBAGG,IAAI,EAAE,oBAAoB,EAAE,GAAG,GAAE,GAAU;IAOvD;;OAEG;IACH,MAAM,IAAI,MAAM;IAIhB,kBAAkB;IAElB;;OAEG;IACH,IAAI,OAAO,IAAI,MAAM,CAEpB;CACD;AAED;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG;IAC5B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,WAAW,CAAC,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF;;;;;;;;;GASG;AACH,MAAM,MAAM,qBAAqB,GAAG;IACnC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,KAAK,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC;IACxB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEjC,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,OAAO;IAC3B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,SAAS,CAGf;IAEF,OAAO,CAAC,gBAAgB,CAAU;IAClC,OAAO,CAAC,eAAe,CAAU;IACjC,OAAO,CAAC,aAAa,CAAU;IAE/B;;OAEG;gBAEF,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,QAAQ,EAClB,IAAI,GAAE,cAAmB;IAW1B;;;;;;;OAOG;IACG,KAAK,CACV,KAAK,EAAE,YAAY,EACnB,SAAS,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EACvC,IAAI,GAAE,qBAA0B,GAC9B,OAAO,CAAC,OAAO,CAAC;YAiCL,OAAO;YA0DP,UAAU;CAsFxB;AAED,0DAA0D;AAC1D,wBAAgB,cAAc,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,IAAI,YAAY,CAI5D;AAED;;;;;;;;;GASG;AACH,wBAAgB,GAAG,CAClB,OAAO,EAAE,oBAAoB,GAAG,MAAM,EAAE,GAAG,MAAM,EACjD,GAAG,IAAI,EAAE,OAAO,EAAE,GAChB,YAAY,CAuBd"}
1
+ {"version":3,"file":"GraphQl.d.ts","sourceRoot":"","sources":["../../src/graphql/GraphQl.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,yBAAyB,CAAC;AAEhD,OAAO,QAAwC,MAAM,oBAAoB,CAAC;AAE1E,MAAM,MAAM,oBAAoB,GAAG;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACd,CAAC;AAEF;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACd;AAGD;;GAEG;AACH,qBAAa,YAAa,SAAQ,KAAK;IACtC,IAAI,EAAE,oBAAoB,CAAC;IAC3B,GAAG,EAAE,GAAG,CAAC;gBAGG,IAAI,EAAE,oBAAoB,EAAE,GAAG,GAAE,GAAU;IAOvD;;OAEG;IACH,MAAM,IAAI,MAAM;IAIhB,kBAAkB;IAElB;;OAEG;IACH,IAAI,OAAO,IAAI,MAAM,CAEpB;CACD;AAED;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG;IAC5B,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;;;;;;;;;GASG;AACH,MAAM,MAAM,qBAAqB,GAAG;IACnC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,KAAK,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC;IACxB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEjC,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,OAAO;IAC3B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,SAAS,CAGf;IAEF,OAAO,CAAC,WAAW,CAAgB;IACnC,OAAO,CAAC,gBAAgB,CAAU;IAClC,OAAO,CAAC,eAAe,CAAU;IACjC,OAAO,CAAC,aAAa,CAAU;IAE/B;;OAEG;gBAEF,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,QAAQ,EAClB,IAAI,GAAE,cAAmB;IAY1B;;;;;;;OAOG;IACG,KAAK,CACV,KAAK,EAAE,YAAY,EACnB,SAAS,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EACvC,IAAI,GAAE,qBAA0B,GAC9B,OAAO,CAAC,OAAO,CAAC;YAiCL,OAAO;YA0DP,UAAU;CAsFxB;AAED,0DAA0D;AAC1D,wBAAgB,cAAc,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,IAAI,YAAY,CAI5D;AAED;;;;;;;;;GASG;AACH,wBAAgB,GAAG,CAClB,OAAO,EAAE,oBAAoB,GAAG,MAAM,EAAE,GAAG,MAAM,EACjD,GAAG,IAAI,EAAE,OAAO,EAAE,GAChB,YAAY,CAuBd"}
@@ -33,6 +33,7 @@ export default class GraphQl {
33
33
  endpoint;
34
34
  ssrCache;
35
35
  listeners;
36
+ bearerToken;
36
37
  XCraftSiteHeader;
37
38
  loggingRequests;
38
39
  loggingTiming;
@@ -43,6 +44,7 @@ export default class GraphQl {
43
44
  this.endpoint = endpoint;
44
45
  this.ssrCache = ssrCache;
45
46
  this.listeners = new Map();
47
+ this.bearerToken = opts?.bearerToken ?? null;
46
48
  this.XCraftSiteHeader = opts?.XCraftSiteHeader ?? false;
47
49
  this.loggingRequests = opts?.debug ?? false;
48
50
  this.loggingTiming = opts?.debugTiming ?? false;
@@ -58,7 +60,7 @@ export default class GraphQl {
58
60
  async query(query, variables = {}, opts = {}) {
59
61
  if (opts.route) {
60
62
  const search = opts.route.searchParams ?? opts.route.search;
61
- if (search.has('token') && search.get('x-craft-live-preview')) {
63
+ if (search.has('token')) {
62
64
  opts.previewToken = search.get('token');
63
65
  }
64
66
  else if (search.has('siteToken')) {
@@ -137,8 +139,9 @@ export default class GraphQl {
137
139
  url += '?siteToken=' + opts.siteToken;
138
140
  const headers = opts?.headers ?? {};
139
141
  headers['Content-Type'] = 'application/json';
140
- if (opts?.bearerToken)
141
- headers['Authorization'] = 'Bearer ' + opts.bearerToken;
142
+ const bearerToken = opts?.bearerToken ?? this.bearerToken;
143
+ if (bearerToken)
144
+ headers['Authorization'] = 'Bearer ' + bearerToken;
142
145
  if (this.loggingRequests) {
143
146
  console.log('query to ', url, variables, opts);
144
147
  headers['X-Debug'] = 'enable';
package/dist/index.d.ts CHANGED
@@ -9,7 +9,7 @@ import type { Cookies } from './cookies/index.js';
9
9
  import type { Readable } from 'crelte-std/stores';
10
10
  import { LoadData, LoadDataArray, LoadDataFn, LoadDataObj } from './loadData/index.js';
11
11
  import { Entry } from './entry/index.js';
12
- export { Crelte, CrelteRequest, type Config, type QueryOptions, type LoadData, type LoadDataFn, type LoadDataObj, type LoadDataArray, type Entry, };
12
+ export { Crelte, CrelteRequest, type Config, type QueryOptions, type LoadData, type LoadDataFn, type LoadDataObj, type LoadDataArray, };
13
13
  export type Init = (crelte: Crelte) => void;
14
14
  /**
15
15
  * Get Crelte from the current context
@@ -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,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;;;;;GAKG;AACH,wBAAgB,QAAQ,IAAI,QAAQ,CAAC,KAAK,CAAC,CAK1C;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,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI,CAEnE;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,IAAI,OAAO,CAEpC;AAED;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,QAKjD;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,aAAa,KAAK,IAAI,QAKxD"}
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,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,GAClB,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;;;;;GAKG;AACH,wBAAgB,QAAQ,IAAI,QAAQ,CAAC,KAAK,CAAC,CAK1C;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,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI,CAEnE;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,IAAI,OAAO,CAEpC;AAED;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,QAKjD;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,aAAa,KAAK,IAAI,QAKxD"}
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/init/client.ts"],"names":[],"mappings":"AAiBA;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG;IACtB,4BAA4B;IAC5B,GAAG,EAAE,GAAG,CAAC;IACT,8BAA8B;IAC9B,SAAS,EAAE,GAAG,CAAC;CACf,CAAC;AAaF;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,IAAI,CAAC,IAAI,EAAE,QAAQ,iBAmJxC"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/init/client.ts"],"names":[],"mappings":"AAiBA;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG;IACtB,4BAA4B;IAC5B,GAAG,EAAE,GAAG,CAAC;IACT,8BAA8B;IAC9B,SAAS,EAAE,GAAG,CAAC;CACf,CAAC;AAaF;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,IAAI,CAAC,IAAI,EAAE,QAAQ,iBAyJxC"}
@@ -114,7 +114,8 @@ export async function main(data) {
114
114
  let render = async () => {
115
115
  const route = readyForRoute();
116
116
  cr.router._requestCompleted();
117
- cr.globals._syncToStores();
117
+ if (route.entryChanged)
118
+ cr.globals._syncToStores();
118
119
  // we should trigger the route update here
119
120
  pluginsBeforeRender(cr, route);
120
121
  renderApp(route);
@@ -138,6 +139,12 @@ export async function main(data) {
138
139
  }
139
140
  return await render();
140
141
  };
142
+ // listen for a site change and update the lang attribute on the html tag
143
+ router.site.subscribe(site => {
144
+ if (!site)
145
+ return;
146
+ document.documentElement.lang = site.language;
147
+ });
141
148
  try {
142
149
  await router.init();
143
150
  }
@@ -1,7 +1,5 @@
1
1
  import Crelte from '../Crelte.js';
2
2
  import CrelteRequest from '../CrelteRequest.js';
3
- import { GraphQlQuery } from '../graphql/GraphQl.js';
4
- import { Entry } from '../index.js';
5
3
  import { PluginCreator } from '../plugins/Plugins.js';
6
4
  import { LoadOptions } from '../routing/LoadRunner.js';
7
5
  import InternalApp from './InternalApp.js';
@@ -10,5 +8,4 @@ export declare function setupPlugins(crelte: Crelte, plugins: PluginCreator[]):
10
8
  export declare function pluginsBeforeRequest(cr: CrelteRequest): Promise<void> | void;
11
9
  export declare function pluginsBeforeRender(cr: CrelteRequest, route: Route): void;
12
10
  export declare function loadFn(cr: CrelteRequest, app: InternalApp, loadOpts?: LoadOptions): Promise<void>;
13
- export declare function queryEntry(cr: CrelteRequest, entryQuery: GraphQlQuery): Promise<Entry>;
14
11
  //# 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,EAAkB,MAAM,uBAAuB,CAAC;AACrE,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEpC,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvD,OAAO,WAA+B,MAAM,kBAAkB,CAAC;AAC/D,OAAO,KAAK,MAAM,qBAAqB,CAAC;AAExC,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,QAKpE;AAED,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAM5E;AAED,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI,CAEzE;AAOD,wBAAsB,MAAM,CAC3B,EAAE,EAAE,aAAa,EACjB,GAAG,EAAE,WAAW,EAChB,QAAQ,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,IAAI,CAAC,CAgGf;AAED,wBAAsB,UAAU,CAC/B,EAAE,EAAE,aAAa,EACjB,UAAU,EAAE,YAAY,GACtB,OAAO,CAAC,KAAK,CAAC,CAiBhB"}
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;AAGhD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvD,OAAO,WAA+B,MAAM,kBAAkB,CAAC;AAC/D,OAAO,KAAK,MAAM,qBAAqB,CAAC;AAIxC,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,QAKpE;AAED,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAM5E;AAED,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI,CAEzE;AAOD,wBAAsB,MAAM,CAC3B,EAAE,EAAE,aAAa,EACjB,GAAG,EAAE,WAAW,EAChB,QAAQ,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,IAAI,CAAC,CA6Gf"}
@@ -1,6 +1,8 @@
1
1
  import { isGraphQlQuery } from '../graphql/GraphQl.js';
2
2
  import { callLoadData } from '../loadData/index.js';
3
3
  import { isPromise } from '../utils.js';
4
+ import { timeout } from 'crelte-std';
5
+ import { queryEntry } from '../entry/index.js';
4
6
  export function setupPlugins(crelte, plugins) {
5
7
  for (const plugin of plugins) {
6
8
  const p = plugin(crelte);
@@ -69,11 +71,18 @@ export async function loadFn(cr, app, loadOpts) {
69
71
  const pluginsLoadGlobalData = cr.events.trigger('loadGlobalData', cr);
70
72
  // loading progress is at 20%
71
73
  loadOpts?.setProgress(0.2);
72
- const [_global, [entry, template]] = await Promise.all([
74
+ const loadGlobalDataProm = Promise.all([
73
75
  globalProm,
74
76
  entryProm,
75
77
  ...pluginsLoadGlobalData,
76
78
  ]);
79
+ if (import.meta.env.DEV &&
80
+ !(await Promise.any([loadGlobalDataProm, timeout(2000)]))) {
81
+ console.error('DEV: globals took longer than 2 seconds to load. ' +
82
+ 'Resolving globals now to fix potential deadlocks');
83
+ cr.globals._globalsLoaded();
84
+ }
85
+ const [_global, [entry, template]] = await loadGlobalDataProm;
77
86
  if (isCanceled())
78
87
  return;
79
88
  cr.globals._globalsLoaded();
@@ -100,40 +109,3 @@ export async function loadFn(cr, app, loadOpts) {
100
109
  // loading progress is at 100%
101
110
  loadOpts?.setProgress(1);
102
111
  }
103
- export async function queryEntry(cr, entryQuery) {
104
- if (!cr.req.siteMatches())
105
- throw new Error('to run the entryQuery the request needs to have a matching site');
106
- let uri = decodeURI(cr.req.uri);
107
- if (uri.startsWith('/'))
108
- uri = uri.substring(1);
109
- if (uri === '' || uri === '/')
110
- uri = '__home__';
111
- const vars = {
112
- uri,
113
- siteId: cr.site.id,
114
- };
115
- const page = await cr.query(entryQuery, vars);
116
- return getEntry(page) ?? ERROR_404_ENTRY;
117
- }
118
- const ERROR_404_ENTRY = {
119
- sectionHandle: 'error',
120
- typeHandle: '404',
121
- };
122
- /**
123
- * Get the entry from the page
124
- *
125
- * entries should export sectionHandle and typeHandle
126
- *
127
- * products should alias productTypeHandle with typeHandle,
128
- * sectionHandle will be automatically set to product
129
- */
130
- function getEntry(page) {
131
- if (page?.entry)
132
- return { ...page.entry };
133
- if (page?.product)
134
- return {
135
- sectionHandle: 'product',
136
- ...page.product,
137
- };
138
- return null;
139
- }
@@ -1,4 +1,4 @@
1
- import { internalSvelteMount, internalSvelteRender, } from 'crelte-vite-plugin/svelteComponents.js';
1
+ import { internalSvelteMount, internalSvelteRender, } from 'virtual:crelte/svelteComponents';
2
2
  export function svelteMount(comp, options) {
3
3
  return internalSvelteMount(comp, options);
4
4
  }
@@ -1,4 +1,4 @@
1
- declare module 'crelte-vite-plugin/svelteComponents.js' {
1
+ declare module 'virtual:crelte/svelteComponents' {
2
2
  // Declarations for the internal functions imported from the plugin
3
3
  export function internalSvelteMount(comp: any, options: any): any;
4
4
  export function internalSvelteRender(comp: any, options: any): any;
@@ -1 +1 @@
1
- {"version":3,"file":"Globals.d.ts","sourceRoot":"","sources":["../../src/loadData/Globals.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAEvD,MAAM,MAAM,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;AAEzD;;;;;;;;GAQG;AACH,MAAM,CAAC,OAAO,OAAO,OAAO;IAK3B,OAAO,CAAC,OAAO,CAAyC;IAIxD,OAAO,CAAC,OAAO,CAA0B;IAGzC,OAAO,CAAC,MAAM,CAA6B;gBAE/B,MAAM,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC;IAM/C;;;;;;OAMG;IACH,GAAG,CAAC,CAAC,GAAG,GAAG,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,GAAG,IAAI;IAmBpC;;;;;;;OAOG;IACH,QAAQ,CAAC,CAAC,GAAG,GAAG,EAAE,IAAI,EAAE,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI;IAInD;;;;;;OAMG;IACH,QAAQ,CAAC,CAAC,GAAG,GAAG,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI;IAiB7D;;OAEG;IACH,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IA4B5B;;;OAGG;IACH,UAAU;IAQV;;;OAGG;IACH,cAAc;IAMd;;;;OAIG;IACH,aAAa;CAyBb"}
1
+ {"version":3,"file":"Globals.d.ts","sourceRoot":"","sources":["../../src/loadData/Globals.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAEvD,MAAM,MAAM,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;AAEzD;;;;;;;;GAQG;AACH,MAAM,CAAC,OAAO,OAAO,OAAO;IAK3B,OAAO,CAAC,OAAO,CAAyC;IAIxD,OAAO,CAAC,OAAO,CAA0B;IAGzC,OAAO,CAAC,MAAM,CAA6B;gBAE/B,MAAM,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC;IAM/C;;;;;;OAMG;IACH,GAAG,CAAC,CAAC,GAAG,GAAG,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,GAAG,IAAI;IAWpC;;;;;;;OAOG;IACH,QAAQ,CAAC,CAAC,GAAG,GAAG,EAAE,IAAI,EAAE,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI;IAInD;;;;;;OAMG;IACH,QAAQ,CAAC,CAAC,GAAG,GAAG,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI;IAkB7D;;OAEG;IACH,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IA4B5B;;;OAGG;IACH,UAAU;IAQV;;;OAGG;IACH,cAAc;IAYd;;;;OAIG;IACH,aAAa;CAyBb"}
@@ -42,13 +42,9 @@ export default class Globals {
42
42
  get(name) {
43
43
  if (this.waiters)
44
44
  throw new Error('calling get in loadGlobalData will not work. call getAsync');
45
- if (!this.newData) {
46
- throw new Error('calling get outside of a loadData is forbidden. use getStore');
47
- // todo do we wan't to allow this?
48
- // isn't it just a footgun?
49
- // return this.getStore(name)?.get() ?? null;
50
- }
51
- return this.newData.get(name) ?? null;
45
+ if (this.newData)
46
+ return this.newData.get(name) ?? null;
47
+ return this.getStore(name)?.get() ?? null;
52
48
  }
53
49
  /**
54
50
  * returns a store which contains a globalSet
@@ -69,16 +65,19 @@ export default class Globals {
69
65
  * you can use `.get` which does not return a Promise
70
66
  */
71
67
  getAsync(name) {
72
- if (this.newData)
68
+ if (this.newData?.has(name))
73
69
  return this.newData.get(name) ?? null;
74
- if (!this.waiters)
75
- throw new Error('calling getAsync in non loadGlobalData contexts is pointless. Use getStore instead');
76
- let listeners = this.waiters.get(name);
77
- if (!listeners) {
78
- listeners = [];
79
- this.waiters.set(name, listeners);
70
+ if (this.waiters) {
71
+ let listeners = this.waiters.get(name);
72
+ if (!listeners) {
73
+ listeners = [];
74
+ this.waiters.set(name, listeners);
75
+ }
76
+ return new Promise(resolve => listeners.push(resolve));
80
77
  }
81
- return new Promise(resolve => listeners.push(resolve));
78
+ if (this.newData)
79
+ return this.newData.get(name) ?? null;
80
+ return this.stores.get(name)?.get() ?? null;
82
81
  }
83
82
  /**
84
83
  * can only be called in loadGlobalData contexts
@@ -118,8 +117,13 @@ export default class Globals {
118
117
  * call this after the loadGlobalData phase
119
118
  */
120
119
  _globalsLoaded() {
121
- // todo should we check if there are still waiters?
122
- // theoretically this should never happen
120
+ if (!this.waiters)
121
+ return;
122
+ for (const [name, listeners] of this.waiters.entries()) {
123
+ const data = this.stores.get(name)?.get() ?? null;
124
+ listeners.forEach(fn => fn(data));
125
+ }
126
+ this.waiters.clear();
123
127
  this.waiters = null;
124
128
  }
125
129
  /**
@@ -1,4 +1,5 @@
1
- import { CrelteRequest, Entry } from '../index.js';
1
+ import { Entry } from '../entry/index.js';
2
+ import { CrelteRequest } from '../index.js';
2
3
  import { Route } from '../routing/index.js';
3
4
  export default class Events {
4
5
  inner: Map<string, Set<any>>;
@@ -1 +1 @@
1
- {"version":3,"file":"Events.d.ts","sourceRoot":"","sources":["../../src/plugins/Events.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAE5C,MAAM,CAAC,OAAO,OAAO,MAAM;IAC1B,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;;IAM7B;;;;;;;;;OASG;IAEH,EAAE,CACD,EAAE,EAAE,eAAe,EACnB,EAAE,EAAE,CAAC,EAAE,EAAE,aAAa,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,GAC7C,MAAM,IAAI;IACb,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,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;IAyBnE;;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,eAAe,EAAE,EAAE,EAAE,aAAa,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE;IACzE,OAAO,CAAC,EAAE,EAAE,gBAAgB,EAAE,EAAE,EAAE,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE;IAChE,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,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI,EAAE;CAqBpE"}
1
+ {"version":3,"file":"Events.d.ts","sourceRoot":"","sources":["../../src/plugins/Events.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAE5C,MAAM,CAAC,OAAO,OAAO,MAAM;IAC1B,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;;IAM7B;;;;;;;;;OASG;IAEH,EAAE,CACD,EAAE,EAAE,eAAe,EACnB,EAAE,EAAE,CAAC,EAAE,EAAE,aAAa,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,GAC7C,MAAM,IAAI;IACb,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,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;IAyBnE;;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,eAAe,EAAE,EAAE,EAAE,aAAa,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE;IACzE,OAAO,CAAC,EAAE,EAAE,gBAAgB,EAAE,EAAE,EAAE,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE;IAChE,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,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI,EAAE;CAqBpE"}
@@ -7,8 +7,9 @@ import Request, { RequestOptions } from './Request.js';
7
7
  import Route from './Route.js';
8
8
  import Site, { SiteFromGraphQl } from './Site.js';
9
9
  import LoadRunner, { LoadRunnerOptions } from './LoadRunner.js';
10
- import { Entry, type CrelteRequest } from '../index.js';
10
+ import { type CrelteRequest } from '../index.js';
11
11
  import { Listeners } from 'crelte-std/sync';
12
+ import { Entry } from '../entry/index.js';
12
13
  export type BaseRouterOptions = {} & LoadRunnerOptions;
13
14
  export default class BaseRouter {
14
15
  sites: Site[];
@@ -1 +1 @@
1
- {"version":3,"file":"BaseRouter.d.ts","sourceRoot":"","sources":["../../src/routing/BaseRouter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"BaseRouter.d.ts","sourceRoot":"","sources":["../../src/routing/BaseRouter.ts"],"names":[],"mappings":"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"}
@@ -8,7 +8,7 @@ import Site, { siteFromUrl } from './Site.js';
8
8
  import { matchAcceptLang } from './utils.js';
9
9
  import LoadRunner from './LoadRunner.js';
10
10
  import { Listeners } from 'crelte-std/sync';
11
- import { isPromise, objClone } from '../utils.js';
11
+ import { isPromise } from '../utils.js';
12
12
  const INF_LOOP_CHECK = '__REQ_FROM_REQ_START__';
13
13
  export default class BaseRouter {
14
14
  sites;
@@ -423,9 +423,9 @@ export default class BaseRouter {
423
423
  const route = this.route.get();
424
424
  if (!route)
425
425
  throw new Error('the first request is not allowed to disableLoadData');
426
- req.entry = objClone(route.entry);
426
+ req.entry = route.entry;
427
427
  req.template = route.template;
428
- req.loadedData = objClone(route.loadedData);
428
+ req.loadedData = route.loadedData;
429
429
  }
430
430
  triggerRoute(route) {
431
431
  this.route.setSilent(route);
@@ -1 +1 @@
1
- {"version":3,"file":"ClientRouter.d.ts","sourceRoot":"","sources":["../../src/routing/ClientRouter.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,MAAM,qBAAqB,CAAC;AAChD,OAAO,UAAU,EAAE,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,KAAK,MAAM,YAAY,CAAC;AAC/B,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAE5C,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;IAaV;;OAEG;IACG,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IA6ChD,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,GAAE,cAAmB;IAyBpD,cAAc,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,GAAE,cAAmB;IA8B7D;;;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;IAiGN,YAAY,CAAC,EAAE,EAAE,aAAa,EAAE,MAAM,EAAE,KAAK,GAAG,IAAI;CAwEpD"}
1
+ {"version":3,"file":"ClientRouter.d.ts","sourceRoot":"","sources":["../../src/routing/ClientRouter.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,MAAM,qBAAqB,CAAC;AAChD,OAAO,UAAU,EAAE,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,KAAK,MAAM,YAAY,CAAC;AAC/B,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAE5C,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;IAaV;;OAEG;IACG,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IA6ChD,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,GAAE,cAAmB;IAqBpD,cAAc,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,GAAE,cAAmB;IA0B7D;;;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;IAiGN,YAAY,CAAC,EAAE,EAAE,aAAa,EAAE,MAAM,EAAE,KAAK,GAAG,IAAI;CAwEpD"}
@@ -61,38 +61,30 @@ export default class ClientRouter extends BaseRouter {
61
61
  async pushRequest(req, _opts = {}) {
62
62
  const url = req.url;
63
63
  // todo a push should also store the previous scrollY
64
- let nReq = req;
65
64
  if (req.scrollY === null) {
66
65
  // if there is no scrollY stored we store the current scrollY
67
66
  // since a push does not cause a scroll top
68
67
  // todo: probably should refactor something probably
69
68
  // should not be here
70
- nReq = req.clone();
71
- nReq.scrollY = window.scrollY;
72
- // todo this does not work? nReq is never used
73
- // why not assign it without a clone?
69
+ req.scrollY = window.scrollY;
74
70
  }
75
71
  return await this.handleRequest(req, route => {
76
- window.history.pushState(route._toState(), url.pathname + url.search + url.hash);
72
+ window.history.pushState(route._toState(), '', url.pathname + url.search + url.hash);
77
73
  });
78
74
  }
79
75
  async replaceRequest(req, _opts = {}) {
80
76
  const url = req.url;
81
- let nReq = req;
82
77
  if (req.scrollY === null) {
83
78
  // if there is no scrollY stored we store the current scrollY
84
79
  // since a replace does not cause a scrollTo and we wan't
85
80
  // history back to work as intended
86
81
  // todo: probably should refactor something probably
87
82
  // should not be here
88
- nReq = req.clone();
89
- nReq.scrollY = window.scrollY;
90
- // todo this does not work? nReq is never used
91
- // why not assign it without a clone?
83
+ req.scrollY = window.scrollY;
92
84
  }
93
85
  try {
94
86
  return await this.handleRequest(req, () => {
95
- window.history.replaceState(req._toState(), url.pathname + url.search + url.hash);
87
+ window.history.replaceState(req._toState(), '', url.pathname + url.search + url.hash);
96
88
  });
97
89
  }
98
90
  catch (e) {
@@ -1,6 +1,7 @@
1
1
  import Site from './Site.js';
2
- import { Entry, LoadData } from '../index.js';
2
+ import { LoadData } from '../index.js';
3
3
  import BaseRoute, { RouteOrigin } from './BaseRoute.js';
4
+ import { Entry } from '../entry/index.js';
4
5
  export type RouteOptions = {
5
6
  entryChanged?: boolean;
6
7
  scrollY?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"Route.d.ts","sourceRoot":"","sources":["../../src/routing/Route.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,SAAS,EAAE,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAExD,MAAM,MAAM,YAAY,GAAG;IAC1B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,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,MAAM,WAAW,cAAc;IAE9B,OAAO,EAAE,GAAG,CAAC;IAEb,QAAQ,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;CAC3B;AAED;;;GAGG;AACH,MAAM,CAAC,OAAO,OAAO,KAAM,SAAQ,SAAS;IAC3C;;OAEG;IACH,KAAK,EAAE,KAAK,CAAC;IAEb;;OAEG;IACH,QAAQ,EAAE,cAAc,CAAC;IAEzB;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAEhC;;OAEG;IACH,YAAY,EAAE,OAAO,CAAC;IAEtB;;;;;OAKG;gBAEF,GAAG,EAAE,MAAM,GAAG,GAAG,EACjB,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,cAAc,EACxB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC/B,IAAI,GAAE,YAAiB;IAUxB;;;;;OAKG;IACH,KAAK;CAgBL;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,GAAG,GAAG,KAAK,IAAI,KAAK,CAIlD"}
1
+ {"version":3,"file":"Route.d.ts","sourceRoot":"","sources":["../../src/routing/Route.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,SAAS,EAAE,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAE1C,MAAM,MAAM,YAAY,GAAG;IAC1B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,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,MAAM,WAAW,cAAc;IAE9B,OAAO,EAAE,GAAG,CAAC;IAEb,QAAQ,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;CAC3B;AAED;;;GAGG;AACH,MAAM,CAAC,OAAO,OAAO,KAAM,SAAQ,SAAS;IAC3C;;OAEG;IACH,KAAK,EAAE,KAAK,CAAC;IAEb;;OAEG;IACH,QAAQ,EAAE,cAAc,CAAC;IAEzB;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAGhC;;OAEG;IACH,YAAY,EAAE,OAAO,CAAC;IAEtB;;;;;OAKG;gBAEF,GAAG,EAAE,MAAM,GAAG,GAAG,EACjB,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,cAAc,EACxB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC/B,IAAI,GAAE,YAAiB;IAUxB;;;;;OAKG;IACH,KAAK;CAgBL;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,GAAG,GAAG,KAAK,IAAI,KAAK,CAIlD"}
@@ -17,6 +17,7 @@ export default class Route extends BaseRoute {
17
17
  * The loaded data of the route
18
18
  */
19
19
  loadedData;
20
+ // todo should this be renamed to data changed? or loadData called?
20
21
  /**
21
22
  * Wether the entry changed since the last Route change
22
23
  */
@@ -102,8 +102,8 @@ export default class Router {
102
102
  *
103
103
  * ## Note
104
104
  * This will always set the origin to 'push'
105
- * And will clear the scrollY value if you not provide a new one via the `opts`
106
- * This will disableLoadData by default if you not provide an override via the `opts`
105
+ * And will clear the scrollY value if you dont provide a new one via the `opts`
106
+ * This will disableLoadData by default if you dont provide an override via the `opts`
107
107
  *
108
108
  * ## Example using the update function
109
109
  * ```
@@ -114,8 +114,8 @@ export default class Router {
114
114
  *
115
115
  * ## Note
116
116
  * This will always set the origin to 'push'
117
- * And will clear the scrollY value if you not provide a new one via the `opts`
118
- * This will disableLoadData by default if you not provide an override via the `opts`
117
+ * And will clear the scrollY value if you dont provide a new one via the `opts`
118
+ * This will disableLoadData by default if you dont provide an override via the `opts`
119
119
  *
120
120
  * ## Example using the update function
121
121
  * ```
@@ -261,7 +261,7 @@ export default class Router {
261
261
  targetOrUpdateToRequest(target, opts = {}) {
262
262
  // we have an update request
263
263
  if (typeof target === 'function') {
264
- const source = this._request ?? this.route.get();
264
+ const source = this._request?.clone() ?? this.route.get();
265
265
  if (!source) {
266
266
  // todo should we use the request here?
267
267
  throw new Error('route to update missing in first loadData call. ' +
@@ -2,5 +2,6 @@ import Router, { type UpdateRequest } from './Router.js';
2
2
  import Route, { type RouteOptions } from './Route.js';
3
3
  import Request, { type RequestOptions, type DelayRender } from './Request.js';
4
4
  import Site from './Site.js';
5
- export { Router, UpdateRequest, Route, RouteOptions, Site, Request, DelayRender, RequestOptions, };
5
+ import BaseRoute from './BaseRoute.js';
6
+ export { Router, UpdateRequest, BaseRoute, Route, RouteOptions, Site, Request, DelayRender, RequestOptions, };
6
7
  //# 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,aAAa,CAAC;AACzD,OAAO,KAAK,EAAE,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AACtD,OAAO,OAAO,EAAE,EAAE,KAAK,cAAc,EAAE,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAC9E,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EACN,MAAM,EACN,aAAa,EACb,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,aAAa,CAAC;AACzD,OAAO,KAAK,EAAE,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AACtD,OAAO,OAAO,EAAE,EAAE,KAAK,cAAc,EAAE,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAC9E,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,SAAS,MAAM,gBAAgB,CAAC;AAEvC,OAAO,EACN,MAAM,EACN,aAAa,EACb,SAAS,EACT,KAAK,EACL,YAAY,EACZ,IAAI,EACJ,OAAO,EACP,WAAW,EACX,cAAc,GACd,CAAC"}
@@ -2,4 +2,5 @@ import Router from './Router.js';
2
2
  import Route from './Route.js';
3
3
  import Request from './Request.js';
4
4
  import Site from './Site.js';
5
- export { Router, Route, Site, Request, };
5
+ import BaseRoute from './BaseRoute.js';
6
+ export { Router, BaseRoute, Route, Site, Request, };
@@ -1,4 +1,4 @@
1
- import SsrCache from './SsrCache.js';
1
+ import SsrCache, { calcKey } from './SsrCache.js';
2
2
  import SsrComponents from './SsrComponents.js';
3
- export { SsrCache, SsrComponents };
3
+ export { SsrCache, SsrComponents, calcKey };
4
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ssr/index.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,eAAe,CAAC;AACrC,OAAO,aAAa,MAAM,oBAAoB,CAAC;AAE/C,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ssr/index.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,EAAE,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,aAAa,MAAM,oBAAoB,CAAC;AAE/C,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,OAAO,EAAE,CAAC"}
package/dist/ssr/index.js CHANGED
@@ -1,3 +1,3 @@
1
- import SsrCache from './SsrCache.js';
1
+ import SsrCache, { calcKey } from './SsrCache.js';
2
2
  import SsrComponents from './SsrComponents.js';
3
- export { SsrCache, SsrComponents };
3
+ export { SsrCache, SsrComponents, calcKey };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "crelte",
3
- "version": "0.5.0-alpha.1",
3
+ "version": "0.5.0-alpha.10",
4
4
  "author": "Crelte <support@crelte.com>",
5
5
  "type": "module",
6
6
  "scripts": {
@@ -78,7 +78,7 @@
78
78
  }
79
79
  },
80
80
  "dependencies": {
81
- "crelte-std": "^0.1.1",
81
+ "crelte-std": "^0.1.2",
82
82
  "trouter": "^4.0.0"
83
83
  },
84
84
  "peerDependencies": {
@@ -1,6 +1,6 @@
1
1
  import { Pattern, Trouter } from 'trouter';
2
- import { Crelte, CrelteRequest, Entry, QueryOptions } from '../index.js';
3
- import { CrelteEntryRequest, EntryRequest } from './index.js';
2
+ import { Crelte, CrelteRequest, QueryOptions } from '../index.js';
3
+ import { CrelteEntryRequest, Entry, EntryRequest } from './index.js';
4
4
  import { GraphQlQuery } from '../graphql/GraphQl.js';
5
5
 
6
6
  export type EntryRouteHandler = (
@@ -1,3 +1,4 @@
1
+ import { GraphQlQuery } from '../graphql/index.js';
1
2
  import { Crelte, CrelteRequest } from '../index.js';
2
3
  import { Request, RequestOptions, Site } from '../routing/index.js';
3
4
  import EntryRouter, { EntryRouteHandler, EntryRoutes } from './EntryRouter.js';
@@ -52,3 +53,51 @@ export class CrelteEntryRequest extends CrelteRequest {
52
53
  this.req = req;
53
54
  }
54
55
  }
56
+
57
+ export async function queryEntry(
58
+ cr: CrelteRequest,
59
+ entryQuery: GraphQlQuery,
60
+ ): Promise<Entry> {
61
+ if (!cr.req.siteMatches())
62
+ throw new Error(
63
+ 'to run the entryQuery the request needs to have a matching site',
64
+ );
65
+
66
+ let uri = decodeURI(cr.req.uri);
67
+ if (uri.startsWith('/')) uri = uri.substring(1);
68
+ if (uri === '' || uri === '/') uri = '__home__';
69
+
70
+ const vars = {
71
+ uri,
72
+ siteId: cr.site.id,
73
+ };
74
+
75
+ const page = await cr.query(entryQuery, vars);
76
+ return extractEntry(page) ?? ERROR_404_ENTRY;
77
+ }
78
+
79
+ const ERROR_404_ENTRY: Entry = {
80
+ sectionHandle: 'error',
81
+ typeHandle: '404',
82
+ };
83
+
84
+ /**
85
+ * Get the entry from the page
86
+ *
87
+ * entries should export sectionHandle and typeHandle
88
+ *
89
+ * products should alias productTypeHandle with typeHandle,
90
+ * sectionHandle will be automatically set to product
91
+ */
92
+ export function extractEntry(page: any): Entry | null {
93
+ if (page?.entry) return { ...page.entry };
94
+ if (page?.product)
95
+ return {
96
+ sectionHandle: 'product',
97
+ ...page.product,
98
+ };
99
+
100
+ return null;
101
+ }
102
+
103
+ // todo maybe move everything here to /loadData
@@ -55,6 +55,7 @@ export class GraphQlError extends Error {
55
55
  * Options for the GraphQl class
56
56
  */
57
57
  export type GraphQlOptions = {
58
+ bearerToken?: string;
58
59
  XCraftSiteHeader?: boolean;
59
60
  debug?: boolean;
60
61
  debugTiming?: boolean;
@@ -98,6 +99,7 @@ export default class GraphQl {
98
99
  [(resp: unknown) => void, (error: unknown) => void][]
99
100
  >;
100
101
 
102
+ private bearerToken: string | null;
101
103
  private XCraftSiteHeader: boolean;
102
104
  private loggingRequests: boolean;
103
105
  private loggingTiming: boolean;
@@ -114,6 +116,7 @@ export default class GraphQl {
114
116
  this.ssrCache = ssrCache;
115
117
  this.listeners = new Map();
116
118
 
119
+ this.bearerToken = opts?.bearerToken ?? null;
117
120
  this.XCraftSiteHeader = opts?.XCraftSiteHeader ?? false;
118
121
  this.loggingRequests = opts?.debug ?? false;
119
122
  this.loggingTiming = opts?.debugTiming ?? false;
@@ -136,7 +139,7 @@ export default class GraphQl {
136
139
  const search =
137
140
  (opts.route as URL).searchParams ?? opts.route.search;
138
141
 
139
- if (search.has('token') && search.get('x-craft-live-preview')) {
142
+ if (search.has('token')) {
140
143
  opts.previewToken = search.get('token')!;
141
144
  } else if (search.has('siteToken')) {
142
145
  opts.siteToken = search.get('siteToken')!;
@@ -237,8 +240,8 @@ export default class GraphQl {
237
240
  const headers = opts?.headers ?? {};
238
241
  headers['Content-Type'] = 'application/json';
239
242
 
240
- if (opts?.bearerToken)
241
- headers['Authorization'] = 'Bearer ' + opts.bearerToken;
243
+ const bearerToken = opts?.bearerToken ?? this.bearerToken;
244
+ if (bearerToken) headers['Authorization'] = 'Bearer ' + bearerToken;
242
245
 
243
246
  if (this.loggingRequests) {
244
247
  console.log('query to ', url, variables, opts);
package/src/index.ts CHANGED
@@ -25,7 +25,6 @@ export {
25
25
  type LoadDataFn,
26
26
  type LoadDataObj,
27
27
  type LoadDataArray,
28
- type Entry,
29
28
  };
30
29
 
31
30
  export type Init = (crelte: Crelte) => void;
@@ -158,7 +158,7 @@ export async function main(data: MainData) {
158
158
  let render = async () => {
159
159
  const route = readyForRoute();
160
160
  cr.router._requestCompleted();
161
- cr.globals._syncToStores();
161
+ if (route.entryChanged) cr.globals._syncToStores();
162
162
  // we should trigger the route update here
163
163
  pluginsBeforeRender(cr, route);
164
164
  renderApp(route);
@@ -194,6 +194,12 @@ export async function main(data: MainData) {
194
194
  return await render();
195
195
  };
196
196
 
197
+ // listen for a site change and update the lang attribute on the html tag
198
+ router.site.subscribe(site => {
199
+ if (!site) return;
200
+ document.documentElement.lang = site.language;
201
+ });
202
+
197
203
  try {
198
204
  await router.init();
199
205
  } catch (e) {
@@ -1,13 +1,14 @@
1
1
  import Crelte from '../Crelte.js';
2
2
  import CrelteRequest from '../CrelteRequest.js';
3
- import { GraphQlQuery, isGraphQlQuery } from '../graphql/GraphQl.js';
4
- import { Entry } from '../index.js';
3
+ import { isGraphQlQuery } from '../graphql/GraphQl.js';
5
4
  import { callLoadData } from '../loadData/index.js';
6
5
  import { PluginCreator } from '../plugins/Plugins.js';
7
6
  import { LoadOptions } from '../routing/LoadRunner.js';
8
7
  import { isPromise } from '../utils.js';
9
8
  import InternalApp, { TemplateModule } from './InternalApp.js';
10
9
  import Route from '../routing/Route.js';
10
+ import { timeout } from 'crelte-std';
11
+ import { Entry, queryEntry } from '../entry/index.js';
11
12
 
12
13
  export function setupPlugins(crelte: Crelte, plugins: PluginCreator[]) {
13
14
  for (const plugin of plugins) {
@@ -96,11 +97,24 @@ export async function loadFn(
96
97
  // loading progress is at 20%
97
98
  loadOpts?.setProgress(0.2);
98
99
 
99
- const [_global, [entry, template]] = await Promise.all([
100
+ const loadGlobalDataProm = Promise.all([
100
101
  globalProm,
101
102
  entryProm,
102
103
  ...pluginsLoadGlobalData,
103
104
  ]);
105
+
106
+ if (
107
+ import.meta.env.DEV &&
108
+ !(await Promise.any([loadGlobalDataProm, timeout(2000)]))
109
+ ) {
110
+ console.error(
111
+ 'DEV: globals took longer than 2 seconds to load. ' +
112
+ 'Resolving globals now to fix potential deadlocks',
113
+ );
114
+ cr.globals._globalsLoaded();
115
+ }
116
+
117
+ const [_global, [entry, template]] = await loadGlobalDataProm;
104
118
  if (isCanceled()) return;
105
119
 
106
120
  cr.globals._globalsLoaded();
@@ -134,49 +148,3 @@ export async function loadFn(
134
148
  // loading progress is at 100%
135
149
  loadOpts?.setProgress(1);
136
150
  }
137
-
138
- export async function queryEntry(
139
- cr: CrelteRequest,
140
- entryQuery: GraphQlQuery,
141
- ): Promise<Entry> {
142
- if (!cr.req.siteMatches())
143
- throw new Error(
144
- 'to run the entryQuery the request needs to have a matching site',
145
- );
146
-
147
- let uri = decodeURI(cr.req.uri);
148
- if (uri.startsWith('/')) uri = uri.substring(1);
149
- if (uri === '' || uri === '/') uri = '__home__';
150
-
151
- const vars = {
152
- uri,
153
- siteId: cr.site.id,
154
- };
155
-
156
- const page = await cr.query(entryQuery, vars);
157
- return getEntry(page) ?? ERROR_404_ENTRY;
158
- }
159
-
160
- const ERROR_404_ENTRY: Entry = {
161
- sectionHandle: 'error',
162
- typeHandle: '404',
163
- };
164
-
165
- /**
166
- * Get the entry from the page
167
- *
168
- * entries should export sectionHandle and typeHandle
169
- *
170
- * products should alias productTypeHandle with typeHandle,
171
- * sectionHandle will be automatically set to product
172
- */
173
- function getEntry(page: any): Entry | null {
174
- if (page?.entry) return { ...page.entry };
175
- if (page?.product)
176
- return {
177
- sectionHandle: 'product',
178
- ...page.product,
179
- };
180
-
181
- return null;
182
- }
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  internalSvelteMount,
3
3
  internalSvelteRender,
4
- } from 'crelte-vite-plugin/svelteComponents.js';
4
+ } from 'virtual:crelte/svelteComponents';
5
5
 
6
6
  export function svelteMount(comp: any, options: any): any {
7
7
  return internalSvelteMount(comp, options);
@@ -1,4 +1,4 @@
1
- declare module 'crelte-vite-plugin/svelteComponents.js' {
1
+ declare module 'virtual:crelte/svelteComponents' {
2
2
  // Declarations for the internal functions imported from the plugin
3
3
  export function internalSvelteMount(comp: any, options: any): any;
4
4
  export function internalSvelteRender(comp: any, options: any): any;
@@ -53,17 +53,9 @@ export default class Globals {
53
53
  'calling get in loadGlobalData will not work. call getAsync',
54
54
  );
55
55
 
56
- if (!this.newData) {
57
- throw new Error(
58
- 'calling get outside of a loadData is forbidden. use getStore',
59
- );
60
-
61
- // todo do we wan't to allow this?
62
- // isn't it just a footgun?
63
- // return this.getStore(name)?.get() ?? null;
64
- }
56
+ if (this.newData) return this.newData.get(name) ?? null;
65
57
 
66
- return this.newData.get(name) ?? null;
58
+ return this.getStore(name)?.get() ?? null;
67
59
  }
68
60
 
69
61
  /**
@@ -86,20 +78,21 @@ export default class Globals {
86
78
  * you can use `.get` which does not return a Promise
87
79
  */
88
80
  getAsync<T = any>(name: string): Promise<T | null> | T | null {
89
- if (this.newData) return this.newData.get(name) ?? null;
81
+ if (this.newData?.has(name)) return this.newData.get(name) ?? null;
90
82
 
91
- if (!this.waiters)
92
- throw new Error(
93
- 'calling getAsync in non loadGlobalData contexts is pointless. Use getStore instead',
94
- );
83
+ if (this.waiters) {
84
+ let listeners = this.waiters.get(name);
85
+ if (!listeners) {
86
+ listeners = [];
87
+ this.waiters.set(name, listeners);
88
+ }
95
89
 
96
- let listeners = this.waiters.get(name);
97
- if (!listeners) {
98
- listeners = [];
99
- this.waiters.set(name, listeners);
90
+ return new Promise(resolve => listeners.push(resolve));
100
91
  }
101
92
 
102
- return new Promise(resolve => listeners.push(resolve));
93
+ if (this.newData) return this.newData.get(name) ?? null;
94
+
95
+ return this.stores.get(name)?.get() ?? null;
103
96
  }
104
97
 
105
98
  /**
@@ -150,8 +143,14 @@ export default class Globals {
150
143
  * call this after the loadGlobalData phase
151
144
  */
152
145
  _globalsLoaded() {
153
- // todo should we check if there are still waiters?
154
- // theoretically this should never happen
146
+ if (!this.waiters) return;
147
+
148
+ for (const [name, listeners] of this.waiters.entries()) {
149
+ const data = this.stores.get(name)?.get() ?? null;
150
+ listeners.forEach(fn => fn(data));
151
+ }
152
+
153
+ this.waiters.clear();
155
154
  this.waiters = null;
156
155
  }
157
156
 
@@ -1,4 +1,5 @@
1
- import { CrelteRequest, Entry } from '../index.js';
1
+ import { Entry } from '../entry/index.js';
2
+ import { CrelteRequest } from '../index.js';
2
3
  import { Route } from '../routing/index.js';
3
4
 
4
5
  export default class Events {
@@ -9,9 +9,10 @@ import Route from './Route.js';
9
9
  import Site, { SiteFromGraphQl, siteFromUrl } from './Site.js';
10
10
  import { matchAcceptLang } from './utils.js';
11
11
  import LoadRunner, { LoadRunnerOptions } from './LoadRunner.js';
12
- import { Entry, type CrelteRequest } from '../index.js';
12
+ import { type CrelteRequest } from '../index.js';
13
13
  import { Listeners } from 'crelte-std/sync';
14
- import { isPromise, objClone } from '../utils.js';
14
+ import { isPromise } from '../utils.js';
15
+ import { Entry } from '../entry/index.js';
15
16
 
16
17
  export type BaseRouterOptions = {} & LoadRunnerOptions;
17
18
 
@@ -506,9 +507,9 @@ export default class BaseRouter {
506
507
  'the first request is not allowed to disableLoadData',
507
508
  );
508
509
 
509
- req.entry = objClone(route.entry);
510
+ req.entry = route.entry;
510
511
  req.template = route.template;
511
- req.loadedData = objClone(route.loadedData);
512
+ req.loadedData = route.loadedData;
512
513
  }
513
514
 
514
515
  triggerRoute(route: Route) {
@@ -90,22 +90,18 @@ export default class ClientRouter extends BaseRouter {
90
90
  const url = req.url;
91
91
  // todo a push should also store the previous scrollY
92
92
 
93
- let nReq = req;
94
93
  if (req.scrollY === null) {
95
94
  // if there is no scrollY stored we store the current scrollY
96
95
  // since a push does not cause a scroll top
97
96
  // todo: probably should refactor something probably
98
97
  // should not be here
99
- nReq = req.clone();
100
- nReq.scrollY = window.scrollY;
101
-
102
- // todo this does not work? nReq is never used
103
- // why not assign it without a clone?
98
+ req.scrollY = window.scrollY;
104
99
  }
105
100
 
106
101
  return await this.handleRequest(req, route => {
107
102
  window.history.pushState(
108
103
  route._toState(),
104
+ '',
109
105
  url.pathname + url.search + url.hash,
110
106
  );
111
107
  });
@@ -114,24 +110,20 @@ export default class ClientRouter extends BaseRouter {
114
110
  async replaceRequest(req: Request, _opts: RequestOptions = {}) {
115
111
  const url = req.url;
116
112
 
117
- let nReq = req;
118
113
  if (req.scrollY === null) {
119
114
  // if there is no scrollY stored we store the current scrollY
120
115
  // since a replace does not cause a scrollTo and we wan't
121
116
  // history back to work as intended
122
117
  // todo: probably should refactor something probably
123
118
  // should not be here
124
- nReq = req.clone();
125
- nReq.scrollY = window.scrollY;
126
-
127
- // todo this does not work? nReq is never used
128
- // why not assign it without a clone?
119
+ req.scrollY = window.scrollY;
129
120
  }
130
121
 
131
122
  try {
132
123
  return await this.handleRequest(req, () => {
133
124
  window.history.replaceState(
134
125
  req._toState(),
126
+ '',
135
127
  url.pathname + url.search + url.hash,
136
128
  );
137
129
  });
@@ -1,7 +1,8 @@
1
1
  import Site from './Site.js';
2
2
  import { objClone } from '../utils.js';
3
- import { Entry, LoadData } from '../index.js';
3
+ import { LoadData } from '../index.js';
4
4
  import BaseRoute, { RouteOrigin } from './BaseRoute.js';
5
+ import { Entry } from '../entry/index.js';
5
6
 
6
7
  export type RouteOptions = {
7
8
  entryChanged?: boolean;
@@ -39,6 +40,7 @@ export default class Route extends BaseRoute {
39
40
  */
40
41
  loadedData: Record<string, any>;
41
42
 
43
+ // todo should this be renamed to data changed? or loadData called?
42
44
  /**
43
45
  * Wether the entry changed since the last Route change
44
46
  */
@@ -145,8 +145,8 @@ export default class Router {
145
145
  *
146
146
  * ## Note
147
147
  * This will always set the origin to 'push'
148
- * And will clear the scrollY value if you not provide a new one via the `opts`
149
- * This will disableLoadData by default if you not provide an override via the `opts`
148
+ * And will clear the scrollY value if you dont provide a new one via the `opts`
149
+ * This will disableLoadData by default if you dont provide an override via the `opts`
150
150
  *
151
151
  * ## Example using the update function
152
152
  * ```
@@ -314,7 +314,7 @@ export default class Router {
314
314
  ): Request | null {
315
315
  // we have an update request
316
316
  if (typeof target === 'function') {
317
- const source = this._request ?? this.route.get();
317
+ const source = this._request?.clone() ?? this.route.get();
318
318
  if (!source) {
319
319
  // todo should we use the request here?
320
320
  throw new Error(
@@ -2,10 +2,12 @@ import Router, { type UpdateRequest } from './Router.js';
2
2
  import Route, { type RouteOptions } from './Route.js';
3
3
  import Request, { type RequestOptions, type DelayRender } from './Request.js';
4
4
  import Site from './Site.js';
5
+ import BaseRoute from './BaseRoute.js';
5
6
 
6
7
  export {
7
8
  Router,
8
9
  UpdateRequest,
10
+ BaseRoute,
9
11
  Route,
10
12
  RouteOptions,
11
13
  Site,
package/src/ssr/index.ts CHANGED
@@ -1,4 +1,4 @@
1
- import SsrCache from './SsrCache.js';
1
+ import SsrCache, { calcKey } from './SsrCache.js';
2
2
  import SsrComponents from './SsrComponents.js';
3
3
 
4
- export { SsrCache, SsrComponents };
4
+ export { SsrCache, SsrComponents, calcKey };