crelte 0.4.8 → 0.5.0-alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (110) hide show
  1. package/dist/Crelte.d.ts +7 -6
  2. package/dist/Crelte.d.ts.map +1 -1
  3. package/dist/Crelte.js +5 -13
  4. package/dist/CrelteRequest.d.ts +9 -0
  5. package/dist/CrelteRequest.d.ts.map +1 -1
  6. package/dist/CrelteRequest.js +16 -2
  7. package/dist/blocks/Blocks.svelte +2 -2
  8. package/dist/blocks/Blocks.svelte.d.ts +3 -19
  9. package/dist/blocks/Blocks.svelte.d.ts.map +1 -1
  10. package/dist/cookies/ClientCookies.d.ts +0 -1
  11. package/dist/cookies/ClientCookies.d.ts.map +1 -1
  12. package/dist/cookies/ClientCookies.js +0 -1
  13. package/dist/cookies/ServerCookies.d.ts +1 -2
  14. package/dist/cookies/ServerCookies.d.ts.map +1 -1
  15. package/dist/cookies/ServerCookies.js +2 -6
  16. package/dist/cookies/index.d.ts +0 -2
  17. package/dist/cookies/index.d.ts.map +1 -1
  18. package/dist/graphql/GraphQl.d.ts +2 -2
  19. package/dist/graphql/GraphQl.d.ts.map +1 -1
  20. package/dist/index.d.ts +9 -3
  21. package/dist/index.d.ts.map +1 -1
  22. package/dist/index.js +14 -6
  23. package/dist/init/InternalApp.d.ts +30 -0
  24. package/dist/init/InternalApp.d.ts.map +1 -0
  25. package/dist/init/InternalApp.js +71 -0
  26. package/dist/init/client.d.ts +0 -5
  27. package/dist/init/client.d.ts.map +1 -1
  28. package/dist/init/client.js +88 -75
  29. package/dist/init/crelte-vite-plugin.d.ts +5 -0
  30. package/dist/init/server.d.ts +0 -5
  31. package/dist/init/server.d.ts.map +1 -1
  32. package/dist/init/server.js +49 -20
  33. package/dist/init/shared.d.ts +7 -18
  34. package/dist/init/shared.d.ts.map +1 -1
  35. package/dist/init/shared.js +97 -154
  36. package/dist/init/svelteComponents.d.ts +3 -0
  37. package/dist/init/svelteComponents.d.ts.map +1 -0
  38. package/dist/init/svelteComponents.js +7 -0
  39. package/dist/loadData/Globals.d.ts +40 -33
  40. package/dist/loadData/Globals.d.ts.map +1 -1
  41. package/dist/loadData/Globals.js +99 -88
  42. package/dist/loadData/index.d.ts +3 -2
  43. package/dist/loadData/index.d.ts.map +1 -1
  44. package/dist/loadData/index.js +2 -0
  45. package/dist/plugins/Events.d.ts +11 -13
  46. package/dist/plugins/Events.d.ts.map +1 -1
  47. package/dist/plugins/Events.js +10 -3
  48. package/dist/routing/BaseRoute.d.ts +255 -0
  49. package/dist/routing/BaseRoute.d.ts.map +1 -0
  50. package/dist/routing/BaseRoute.js +349 -0
  51. package/dist/routing/BaseRouter.d.ts +210 -0
  52. package/dist/routing/BaseRouter.d.ts.map +1 -0
  53. package/dist/routing/BaseRouter.js +444 -0
  54. package/dist/routing/ClientRouter.d.ts +32 -0
  55. package/dist/routing/ClientRouter.d.ts.map +1 -0
  56. package/dist/routing/ClientRouter.js +259 -0
  57. package/dist/routing/LoadRunner.d.ts +39 -0
  58. package/dist/routing/LoadRunner.d.ts.map +1 -0
  59. package/dist/routing/{PageLoader.js → LoadRunner.js} +32 -20
  60. package/dist/routing/Request.d.ts +35 -3
  61. package/dist/routing/Request.d.ts.map +1 -1
  62. package/dist/routing/Request.js +64 -5
  63. package/dist/routing/Route.d.ts +24 -223
  64. package/dist/routing/Route.d.ts.map +1 -1
  65. package/dist/routing/Route.js +26 -315
  66. package/dist/routing/Router.d.ts +49 -73
  67. package/dist/routing/Router.d.ts.map +1 -1
  68. package/dist/routing/Router.js +85 -251
  69. package/dist/routing/ServerRouter.d.ts +23 -0
  70. package/dist/routing/ServerRouter.d.ts.map +1 -0
  71. package/dist/routing/ServerRouter.js +57 -0
  72. package/dist/routing/utils.d.ts +5 -0
  73. package/dist/routing/utils.d.ts.map +1 -1
  74. package/dist/routing/utils.js +39 -0
  75. package/dist/utils.d.ts +1 -0
  76. package/dist/utils.d.ts.map +1 -1
  77. package/dist/utils.js +3 -0
  78. package/package.json +7 -6
  79. package/src/Crelte.ts +12 -18
  80. package/src/CrelteRequest.ts +21 -2
  81. package/src/cookies/ClientCookies.ts +0 -2
  82. package/src/cookies/ServerCookies.ts +2 -7
  83. package/src/cookies/index.ts +0 -3
  84. package/src/graphql/GraphQl.ts +2 -1
  85. package/src/index.ts +17 -9
  86. package/src/init/InternalApp.ts +134 -0
  87. package/src/init/client.ts +104 -93
  88. package/src/init/crelte-vite-plugin.d.ts +5 -0
  89. package/src/init/server.ts +67 -35
  90. package/src/init/shared.ts +107 -227
  91. package/src/init/svelteComponents.ts +12 -0
  92. package/src/loadData/Globals.ts +121 -102
  93. package/src/loadData/index.ts +3 -2
  94. package/src/plugins/Events.ts +40 -42
  95. package/src/routing/BaseRoute.ts +422 -0
  96. package/src/routing/BaseRouter.ts +528 -0
  97. package/src/routing/ClientRouter.ts +329 -0
  98. package/src/routing/{PageLoader.ts → LoadRunner.ts} +43 -30
  99. package/src/routing/Request.ts +97 -12
  100. package/src/routing/Route.ts +56 -376
  101. package/src/routing/Router.ts +100 -359
  102. package/src/routing/ServerRouter.ts +78 -0
  103. package/src/routing/utils.ts +53 -0
  104. package/src/utils.ts +4 -0
  105. package/dist/routing/InnerRouter.d.ts +0 -113
  106. package/dist/routing/InnerRouter.d.ts.map +0 -1
  107. package/dist/routing/InnerRouter.js +0 -417
  108. package/dist/routing/PageLoader.d.ts +0 -36
  109. package/dist/routing/PageLoader.d.ts.map +0 -1
  110. package/src/routing/InnerRouter.ts +0 -498
@@ -1,7 +1,12 @@
1
1
  import { CrelteBuilder } from '../Crelte.js';
2
2
  import CrelteRequest from '../CrelteRequest.js';
3
- import { pluginsBeforeRender, prepareLoadFn, setupPlugins } from './shared.js';
3
+ import { loadFn, pluginsBeforeRender, pluginsBeforeRequest, setupPlugins, } from './shared.js';
4
4
  import { tick } from 'svelte';
5
+ import { svelteMount } from './svelteComponents.js';
6
+ import ClientCookies from '../cookies/ClientCookies.js';
7
+ import ClientRouter from '../routing/ClientRouter.js';
8
+ import InternalApp from './InternalApp.js';
9
+ import { Writable } from 'crelte-std/stores';
5
10
  const mainDataDefault = {
6
11
  preloadOnMouseOver: false,
7
12
  viewTransition: false,
@@ -32,108 +37,116 @@ const mainDataDefault = {
32
37
  */
33
38
  export async function main(data) {
34
39
  data = { ...mainDataDefault, ...data };
35
- // rendering steps
36
- // loadSites (first time)
37
- // determine route (if site is empty on server redirect to correct language)
38
- // loadData, entry (make globally available), pluginsData
39
- // loadTemplate
40
- // render
41
- // on route change
42
- // determine route
43
- // entry, pluginsData
44
- // loadTemplate
45
- // update
46
- // construct Crelte
40
+ // todo if entryQuery or globalQuery is present show a hint
41
+ // they should be added to App.svelte and removed from here
47
42
  const builder = new CrelteBuilder(data.app.config ?? {});
48
- const endpoint = builder.ssrCache.get('ENDPOINT_URL');
49
- builder.setupGraphQl(endpoint);
50
- // on the client the cookies are always coming from document.cookie
51
- builder.setupCookies('');
52
- const csites = builder.ssrCache.get('crelteSites');
53
- builder.setupRouter(csites);
54
- const crelte = builder.build();
55
- const serverError = crelte.ssrCache.get('ERROR');
43
+ const serverError = builder.ssrCache.get('ERROR');
56
44
  if (serverError) {
57
- // should this be called??
58
- crelte.router._internal.initClient();
59
- new data.errorPage.default({
45
+ // todo should this init the client, but maybe we just
46
+ // want it as minimal as possible
47
+ svelteMount(data.errorPage.default, {
60
48
  target: document.body,
61
- props: { ...serverError },
62
- hydrate: true,
63
- context: crelte._getContext(),
49
+ props: serverError,
64
50
  });
65
51
  return;
66
52
  }
53
+ const endpoint = builder.ssrCache.get('ENDPOINT_URL');
54
+ builder.setupGraphQl(endpoint);
55
+ // on the client the cookies are always coming from document.cookie
56
+ builder.setupCookies(new ClientCookies());
57
+ const csites = builder.ssrCache.get('crelteSites');
58
+ const router = new ClientRouter(csites, {
59
+ debugTiming: builder.config.debugTiming ?? false,
60
+ preloadOnMouseOver: builder.config.preloadOnMouseOver ?? false,
61
+ });
62
+ builder.setupRouter(router);
63
+ const crelte = builder.build();
64
+ const app = new InternalApp(data.app);
67
65
  // setup plugins
68
- setupPlugins(crelte, data.app.plugins ?? []);
69
- data.app.init?.(crelte);
70
- const loadFn = await prepareLoadFn(crelte, data.app, data.entryQuery, data.globalQuery);
71
- // setup load Data
72
- crelte.router._internal.onLoad = (req, opts) => {
66
+ setupPlugins(crelte, app.plugins);
67
+ app.init(crelte);
68
+ router.onNewCrelteRequest = req => {
73
69
  const cr = new CrelteRequest(crelte, req);
74
- return loadFn(cr, opts);
70
+ cr._setRouter(cr.router._toRequest(req));
71
+ cr._setGlobals(cr.globals._toRequest());
72
+ return cr;
75
73
  };
74
+ router.onBeforeRequest = pluginsBeforeRequest;
75
+ router.loadRunner.loadFn = (cr, opts) => loadFn(cr, app, opts);
76
76
  // render Space
77
77
  let appInstance;
78
- const updateAppProps = (props) => {
79
- if (!appInstance) {
80
- appInstance = new data.app.default({
81
- target: document.body,
82
- props,
83
- hydrate: true,
84
- context: crelte._getContext(),
85
- intro: builder.config.playIntro,
86
- });
87
- }
88
- else {
89
- appInstance.$set(props);
78
+ let routeProp;
79
+ const renderApp = (route) => {
80
+ if (appInstance) {
81
+ routeProp.set(route);
82
+ return;
90
83
  }
84
+ routeProp = new Writable(route);
85
+ appInstance = svelteMount(data.app.default, {
86
+ target: document.body,
87
+ props: { route: routeProp },
88
+ context: crelte._getContext(),
89
+ intro: builder.config.playIntro,
90
+ });
91
91
  };
92
- let firstLoad = true;
93
- crelte.router._internal.onLoaded = async (success, req, readyForProps) => {
94
- const isFirstLoad = firstLoad;
95
- firstLoad = false;
96
- if (!success) {
97
- // if this is not the first load we should reload the page
98
- // we don't reload everytime because this might cause a reload loop
99
- // and since the first load will probably just contain ssrCache data
100
- // in almost all cases the first load will never faill
101
- if (!isFirstLoad) {
102
- // the load might contain a js error and we prefer the error
103
- // page
104
- window.location.reload();
105
- return;
106
- }
107
- return handleLoadError(readyForProps());
92
+ router.onError = e => {
93
+ console.error('routing failed:', e, 'reloading trying to fix it');
94
+ // since onError is called only on subsequent requests we should never
95
+ // have an infinite loop here
96
+ window.location.reload();
97
+ };
98
+ // let firstLoad = true;
99
+ router.onRender = async (cr, readyForRoute, domUpdated) => {
100
+ if (appInstance && cr.req.disableLoadData) {
101
+ // if the app is already rendered and entry did not change
102
+ // we just wan't to run domUpdated because we don't wan't to update anything
103
+ const route = readyForRoute();
104
+ cr.router._requestCompleted();
105
+ // globals should not be run because they will be empty
106
+ // since nobody called loadGlobalData (todo maybe globals should also,
107
+ // know if it accepts updates)
108
+ // todo should we wait a tick here?
109
+ await tick();
110
+ domUpdated(cr, route);
111
+ return route;
108
112
  }
109
- const cr = new CrelteRequest(crelte, req);
110
113
  const startTime = builder.config.debugTiming ? Date.now() : null;
111
114
  let render = async () => {
115
+ const route = readyForRoute();
116
+ cr.router._requestCompleted();
117
+ cr.globals._syncToStores();
112
118
  // we should trigger the route update here
113
- pluginsBeforeRender(cr);
114
- crelte.globals._updateSiteId(cr.site.id);
115
- updateAppProps(readyForProps());
119
+ pluginsBeforeRender(cr, route);
120
+ renderApp(route);
116
121
  await tick();
117
122
  if (startTime) {
118
123
  console.log('dom update took ' + (Date.now() - startTime) + 'ms');
119
124
  }
120
- crelte.router._internal.domReady(cr.req);
125
+ domUpdated(cr, route);
126
+ return route;
121
127
  };
122
128
  // render with view Transition if enabled and not in hydration
123
129
  if (builder.config.viewTransition &&
124
130
  appInstance &&
125
131
  document.startViewTransition) {
126
- render = () => document.startViewTransition(render);
132
+ const prevRender = render;
133
+ render = async () => new Promise(resolve => {
134
+ document.startViewTransition(async () => {
135
+ resolve(await prevRender());
136
+ });
137
+ });
127
138
  }
128
- await render();
139
+ return await render();
129
140
  };
130
- crelte.router._internal.onNothingLoaded = async (req, ready) => {
131
- crelte.globals._updateSiteId(req.site.id);
132
- ready();
133
- await tick();
134
- crelte.router._internal.domReady(req);
135
- };
136
- crelte.router._internal.initClient();
141
+ try {
142
+ await router.init();
143
+ }
144
+ catch (e) {
145
+ // the first load we can't handle with a redirect since this might
146
+ // cause an infinite loop
147
+ // but since almost everything should be ssrCached nothing should fail
148
+ handleLoadError(e);
149
+ }
137
150
  }
138
151
  function handleLoadError(e) {
139
152
  console.log('loading or rendering the page failed with the error:');
@@ -0,0 +1,5 @@
1
+ declare module 'crelte-vite-plugin/svelteComponents.js' {
2
+ // Declarations for the internal functions imported from the plugin
3
+ export function internalSvelteMount(comp: any, options: any): any;
4
+ export function internalSvelteRender(comp: any, options: any): any;
5
+ }
@@ -1,5 +1,4 @@
1
1
  import { SiteFromGraphQl } from '../routing/Site.js';
2
- import { GraphQlQuery } from '../graphql/GraphQl.js';
3
2
  export type ServerData = {
4
3
  url: string;
5
4
  htmlTemplate: string;
@@ -17,10 +16,6 @@ export type ServerData = {
17
16
  export type MainData = {
18
17
  /** The App.svelte module */
19
18
  app: any;
20
- /** The entry query from queries/entry.graphql */
21
- entryQuery: GraphQlQuery;
22
- /** The global query from queries/global.graphql */
23
- globalQuery?: GraphQlQuery;
24
19
  /** Server data provided by crelte-node */
25
20
  serverData: ServerData;
26
21
  };
@@ -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,CAuFD;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;AAgBrD,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;IAET,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,CA6GD;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,CAgC5C"}
@@ -1,8 +1,13 @@
1
1
  import { CrelteBuilder } from '../Crelte.js';
2
- import { pluginsBeforeRender, prepareLoadFn, setupPlugins } from './shared.js';
2
+ import { loadFn, pluginsBeforeRender, pluginsBeforeRequest, setupPlugins, } from './shared.js';
3
3
  import SsrComponents from '../ssr/SsrComponents.js';
4
4
  import SsrCache from '../ssr/SsrCache.js';
5
+ import ServerCookies from '../cookies/ServerCookies.js';
5
6
  import CrelteRequest from '../CrelteRequest.js';
7
+ import { svelteRender } from './svelteComponents.js';
8
+ import { Writable } from 'crelte-std/stores';
9
+ import ServerRouter from '../routing/ServerRouter.js';
10
+ import InternalApp from './InternalApp.js';
6
11
  /**
7
12
  * The main function to start the server side rendering
8
13
  *
@@ -24,6 +29,8 @@ import CrelteRequest from '../CrelteRequest.js';
24
29
  * ```
25
30
  */
26
31
  export async function main(data) {
32
+ // todo if entryQuery or globalQuery is present show a hint
33
+ // they should be added to App.svelte and removed from here
27
34
  const builder = new CrelteBuilder(data.app.config ?? {});
28
35
  // setup viteEnv
29
36
  data.serverData.viteEnv.forEach((v, k) => {
@@ -34,23 +41,36 @@ export async function main(data) {
34
41
  builder.ssrCache.set('CRAFT_WEB_URL', data.serverData.craftWeb);
35
42
  builder.setupGraphQl(endpoint);
36
43
  const cookies = data.serverData.cookies ?? '';
37
- builder.setupCookies(cookies);
44
+ builder.setupCookies(new ServerCookies(cookies));
38
45
  builder.ssrCache.set('crelteSites', data.serverData.sites);
39
- builder.setupRouter(data.serverData.sites);
46
+ const router = new ServerRouter(data.serverData.sites, {
47
+ debugTiming: builder.config.debugTiming ?? false,
48
+ });
49
+ builder.setupRouter(router);
40
50
  const crelte = builder.build();
51
+ const app = new InternalApp(data.app);
41
52
  // setup plugins
42
- setupPlugins(crelte, data.app.plugins ?? []);
43
- data.app.init?.(crelte);
44
- const loadFn = await prepareLoadFn(crelte, data.app, data.entryQuery, data.globalQuery);
45
- // setup load Data
46
- crelte.router._internal.onLoad = req => {
53
+ setupPlugins(crelte, app.plugins);
54
+ app.init(crelte);
55
+ router.onNewCrelteRequest = req => {
47
56
  const cr = new CrelteRequest(crelte, req);
48
- return loadFn(cr);
57
+ cr._setRouter(cr.router._toRequest(req));
58
+ cr._setGlobals(cr.globals._toRequest());
59
+ return cr;
60
+ };
61
+ router.onBeforeRequest = pluginsBeforeRequest;
62
+ router.loadRunner.loadFn = (cr, opts) => loadFn(cr, app, opts);
63
+ router.onRender = (cr, readyForRoute, _domUpdated) => {
64
+ const route = readyForRoute();
65
+ cr.router._requestCompleted();
66
+ cr.globals._syncToStores();
67
+ pluginsBeforeRender(cr, route);
68
+ return route;
49
69
  };
50
- const { success, redirect, req, props } = await crelte.router._internal.initServer(data.serverData.url, data.serverData.acceptLang);
51
- if (!success)
52
- throw props;
53
- if (redirect) {
70
+ // throws if there was an error
71
+ const [req, route] = await router.init(data.serverData.url, data.serverData.acceptLang);
72
+ // if redirect
73
+ if (!route) {
54
74
  return {
55
75
  status: req.statusCode ?? 302,
56
76
  location: req.url.toString(),
@@ -60,19 +80,23 @@ export async function main(data) {
60
80
  const context = crelte._getContext();
61
81
  const ssrComponents = new SsrComponents();
62
82
  ssrComponents.addToContext(context);
63
- const cr = new CrelteRequest(crelte, req);
64
- pluginsBeforeRender(cr);
65
- crelte.globals._updateSiteId(cr.site.id);
83
+ // app should not use getRoute but use the route store
84
+ // received from the props, since it will only update when
85
+ // the entryChanges
86
+ const routeProp = new Writable(route);
66
87
  // eslint-disable-next-line prefer-const
67
- let { html, head } = data.app.default.render(props, { context });
88
+ let { html, head } = svelteRender(data.app.default, {
89
+ props: { route: routeProp },
90
+ context,
91
+ });
68
92
  head += ssrComponents.toHead(data.serverData.ssrManifest);
69
93
  head += crelte.ssrCache._exportToHead();
70
94
  let htmlTemplate = data.serverData.htmlTemplate;
71
- htmlTemplate = htmlTemplate.replace('<!--page-lang-->', cr.site.language);
95
+ htmlTemplate = htmlTemplate.replace('<!--page-lang-->', route.site.language);
72
96
  const finalHtml = htmlTemplate
73
97
  .replace('</head>', head + '\n\t</head>')
74
98
  .replace('<!--ssr-body-->', html);
75
- const entry = props.entry;
99
+ const entry = route.entry;
76
100
  return {
77
101
  status: req.statusCode ??
78
102
  (entry.sectionHandle === 'error'
@@ -105,8 +129,13 @@ export async function mainError(data) {
105
129
  const ssrComponents = new SsrComponents();
106
130
  ssrComponents.addToContext(context);
107
131
  ssrCache.set('ERROR', data.error);
132
+ // todo on the client crelte is in the context
133
+ // but it should match this impl
108
134
  // eslint-disable-next-line prefer-const
109
- let { html, head } = data.errorPage.default.render(data.error, { context });
135
+ let { html, head } = svelteRender(data.errorPage.default, {
136
+ props: data.error,
137
+ context,
138
+ });
110
139
  head += ssrComponents.toHead(data.serverData.ssrManifest);
111
140
  head += ssrCache._exportToHead();
112
141
  let htmlTemplate = data.serverData.htmlTemplate;
@@ -1,25 +1,14 @@
1
1
  import Crelte from '../Crelte.js';
2
2
  import CrelteRequest from '../CrelteRequest.js';
3
- import { EntryRoutes } from '../entry/EntryRouter.js';
4
3
  import { GraphQlQuery } from '../graphql/GraphQl.js';
5
4
  import { Entry } from '../index.js';
6
- import { LoadData } from '../loadData/index.js';
7
5
  import { PluginCreator } from '../plugins/Plugins.js';
8
- import { LoadOptions } from '../routing/PageLoader.js';
9
- interface App {
10
- loadGlobalData?: LoadData<null>;
11
- loadEntryData?: LoadData<Entry>;
12
- templates?: Record<string, LazyTemplateModule>;
13
- entryRoutes?: EntryRoutes;
14
- init?: (crelte: Crelte) => void;
15
- }
16
- interface TemplateModule {
17
- default: any;
18
- loadData?: LoadData<Entry>;
19
- }
20
- type LazyTemplateModule = (() => Promise<TemplateModule>) | TemplateModule;
6
+ import { LoadOptions } from '../routing/LoadRunner.js';
7
+ import InternalApp from './InternalApp.js';
8
+ import Route from '../routing/Route.js';
21
9
  export declare function setupPlugins(crelte: Crelte, plugins: PluginCreator[]): void;
22
- export declare function pluginsBeforeRender(cr: CrelteRequest): void;
23
- export declare function prepareLoadFn(crelte: Crelte, app: App, entryQuery: GraphQlQuery, globalQuery?: GraphQlQuery): Promise<(cr: CrelteRequest, loadOpts?: LoadOptions) => Promise<any>>;
24
- export {};
10
+ export declare function pluginsBeforeRequest(cr: CrelteRequest): Promise<void> | void;
11
+ export declare function pluginsBeforeRender(cr: CrelteRequest, route: Route): void;
12
+ export declare function loadFn(cr: CrelteRequest, app: InternalApp, loadOpts?: LoadOptions): Promise<void>;
13
+ export declare function queryEntry(cr: CrelteRequest, entryQuery: GraphQlQuery): Promise<Entry>;
25
14
  //# 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;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"}
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"}