crelte 0.5.10 → 0.5.12

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 (133) hide show
  1. package/dist/bodyClass/BodyClass.d.ts +39 -0
  2. package/dist/bodyClass/BodyClass.d.ts.map +1 -0
  3. package/dist/bodyClass/BodyClass.js +51 -0
  4. package/dist/bodyClass/ClientBodyClass.d.ts +12 -0
  5. package/dist/bodyClass/ClientBodyClass.d.ts.map +1 -0
  6. package/dist/bodyClass/ClientBodyClass.js +57 -0
  7. package/dist/bodyClass/ServerBodyClass.d.ts +12 -0
  8. package/dist/bodyClass/ServerBodyClass.d.ts.map +1 -0
  9. package/dist/bodyClass/ServerBodyClass.js +47 -0
  10. package/dist/bodyClass/index.d.ts +2 -0
  11. package/dist/bodyClass/index.d.ts.map +1 -0
  12. package/dist/bodyClass/index.js +1 -0
  13. package/dist/cookies/ClientCookies.d.ts +8 -3
  14. package/dist/cookies/ClientCookies.d.ts.map +1 -1
  15. package/dist/cookies/ClientCookies.js +31 -7
  16. package/dist/cookies/Cookies.d.ts +42 -0
  17. package/dist/cookies/Cookies.d.ts.map +1 -0
  18. package/dist/cookies/Cookies.js +44 -0
  19. package/dist/cookies/ServerCookies.d.ts +3 -2
  20. package/dist/cookies/ServerCookies.d.ts.map +1 -1
  21. package/dist/cookies/ServerCookies.js +6 -4
  22. package/dist/cookies/index.d.ts +1 -25
  23. package/dist/cookies/index.d.ts.map +1 -1
  24. package/dist/cookies/index.js +1 -1
  25. package/dist/crelte.d.ts +7 -1
  26. package/dist/crelte.d.ts.map +1 -1
  27. package/dist/crelte.js +2 -1
  28. package/dist/index.d.ts +13 -1
  29. package/dist/index.d.ts.map +1 -1
  30. package/dist/index.js +9 -0
  31. package/dist/init/client.d.ts +1 -8
  32. package/dist/init/client.d.ts.map +1 -1
  33. package/dist/init/client.js +26 -24
  34. package/dist/init/server.d.ts.map +1 -1
  35. package/dist/init/server.js +12 -4
  36. package/dist/init/shared.d.ts +1 -0
  37. package/dist/init/shared.d.ts.map +1 -1
  38. package/dist/init/shared.js +16 -5
  39. package/dist/loadData/Globals.d.ts.map +1 -1
  40. package/dist/node/index.js +1 -1
  41. package/dist/plugins/Events.d.ts +12 -7
  42. package/dist/plugins/Events.d.ts.map +1 -1
  43. package/dist/plugins/Plugins.d.ts +36 -1
  44. package/dist/plugins/Plugins.d.ts.map +1 -1
  45. package/dist/plugins/Plugins.js +32 -0
  46. package/dist/queries/Queries.d.ts +30 -5
  47. package/dist/queries/Queries.d.ts.map +1 -1
  48. package/dist/queries/Queries.js +19 -2
  49. package/dist/queries/gql.d.ts +2 -2
  50. package/dist/queries/gql.d.ts.map +1 -1
  51. package/dist/queries/index.d.ts +47 -2
  52. package/dist/queries/index.d.ts.map +1 -1
  53. package/dist/queries/index.js +2 -2
  54. package/dist/queries/vars.d.ts +2 -0
  55. package/dist/queries/vars.d.ts.map +1 -1
  56. package/dist/queries/vars.js +10 -0
  57. package/dist/routing/route/Request.d.ts +1 -1
  58. package/dist/routing/route/Request.d.ts.map +1 -1
  59. package/dist/routing/route/Request.js +7 -3
  60. package/dist/routing/router/BaseRouter.d.ts +2 -1
  61. package/dist/routing/router/BaseRouter.d.ts.map +1 -1
  62. package/dist/routing/router/BaseRouter.js +4 -2
  63. package/dist/routing/router/ClientRouter.d.ts.map +1 -1
  64. package/dist/routing/router/ClientRouter.js +21 -15
  65. package/dist/routing/router/Router.d.ts +2 -1
  66. package/dist/routing/router/Router.d.ts.map +1 -1
  67. package/dist/routing/router/Router.js +10 -13
  68. package/dist/routing/utils.d.ts +1 -0
  69. package/dist/routing/utils.d.ts.map +1 -1
  70. package/dist/routing/utils.js +1 -1
  71. package/dist/server/CrelteServer.d.ts +1 -0
  72. package/dist/server/CrelteServer.d.ts.map +1 -1
  73. package/dist/server/CrelteServer.js +5 -2
  74. package/dist/server/ServerRouter.d.ts.map +1 -1
  75. package/dist/server/ServerRouter.js +17 -7
  76. package/dist/server/queries/QueryGqlRoute.d.ts +28 -0
  77. package/dist/server/queries/QueryGqlRoute.d.ts.map +1 -0
  78. package/dist/server/queries/QueryGqlRoute.js +194 -0
  79. package/dist/server/queries/QueryHandleRoute.d.ts +12 -0
  80. package/dist/server/queries/QueryHandleRoute.d.ts.map +1 -0
  81. package/dist/server/queries/QueryHandleRoute.js +24 -0
  82. package/dist/server/queries/queries.d.ts.map +1 -1
  83. package/dist/server/queries/queries.js +42 -19
  84. package/dist/server/queries/routes.d.ts +7 -30
  85. package/dist/server/queries/routes.d.ts.map +1 -1
  86. package/dist/server/queries/routes.js +13 -199
  87. package/dist/std/stores/StagedWritable.d.ts +48 -0
  88. package/dist/std/stores/StagedWritable.d.ts.map +1 -0
  89. package/dist/std/stores/StagedWritable.js +84 -0
  90. package/dist/std/stores/index.d.ts +2 -1
  91. package/dist/std/stores/index.d.ts.map +1 -1
  92. package/dist/std/stores/index.js +2 -1
  93. package/dist/std/sync/Barrier.js +1 -1
  94. package/dist/utils.d.ts +9 -0
  95. package/dist/utils.d.ts.map +1 -1
  96. package/dist/utils.js +11 -0
  97. package/package.json +5 -1
  98. package/src/bodyClass/BodyClass.ts +72 -0
  99. package/src/bodyClass/ClientBodyClass.ts +62 -0
  100. package/src/bodyClass/ServerBodyClass.ts +65 -0
  101. package/src/bodyClass/index.ts +1 -0
  102. package/src/cookies/ClientCookies.ts +41 -10
  103. package/src/cookies/Cookies.ts +70 -0
  104. package/src/cookies/ServerCookies.ts +9 -6
  105. package/src/cookies/index.ts +5 -29
  106. package/src/crelte.ts +9 -0
  107. package/src/index.ts +15 -1
  108. package/src/init/client.ts +29 -24
  109. package/src/init/server.ts +12 -4
  110. package/src/init/shared.ts +18 -6
  111. package/src/loadData/Globals.ts +1 -1
  112. package/src/node/index.ts +1 -1
  113. package/src/plugins/Events.ts +22 -7
  114. package/src/plugins/Plugins.ts +66 -1
  115. package/src/queries/Queries.ts +47 -14
  116. package/src/queries/gql.ts +2 -2
  117. package/src/queries/index.ts +71 -0
  118. package/src/queries/vars.ts +13 -0
  119. package/src/routing/route/Request.ts +11 -4
  120. package/src/routing/router/BaseRouter.ts +4 -2
  121. package/src/routing/router/ClientRouter.ts +26 -18
  122. package/src/routing/router/Router.ts +10 -11
  123. package/src/routing/utils.ts +1 -1
  124. package/src/server/CrelteServer.ts +4 -2
  125. package/src/server/ServerRouter.ts +18 -7
  126. package/src/server/queries/QueryGqlRoute.ts +224 -0
  127. package/src/server/queries/QueryHandleRoute.ts +37 -0
  128. package/src/server/queries/queries.ts +57 -21
  129. package/src/server/queries/routes.ts +25 -229
  130. package/src/std/stores/StagedWritable.ts +96 -0
  131. package/src/std/stores/index.ts +2 -1
  132. package/src/std/sync/Barrier.ts +1 -1
  133. package/src/utils.ts +15 -0
@@ -14,16 +14,9 @@ export type MainData = {
14
14
  * ```js
15
15
  * import * as app from './App.svelte';
16
16
  * import * as errorPage from './Error.svelte';
17
- * import entryQuery from './queries/entry.graphql';
18
- * import globalQuery from './queries/global.graphql';
19
17
  * import { main } from 'crelte/client';
20
18
  *
21
- * main({
22
- * app,
23
- * errorPage,
24
- * entryQuery,
25
- * globalQuery,
26
- * });
19
+ * main({ app, errorPage });
27
20
  * ```
28
21
  */
29
22
  export declare function main(data: MainData): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/init/client.ts"],"names":[],"mappings":"AAsBA;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG;IACtB,4BAA4B;IAC5B,GAAG,EAAE,GAAG,CAAC;IACT,8BAA8B;IAC9B,SAAS,EAAE,GAAG,CAAC;CACf,CAAC;AAEF;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,IAAI,CAAC,IAAI,EAAE,QAAQ,iBA6JxC"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/init/client.ts"],"names":[],"mappings":"AA0BA;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG;IACtB,4BAA4B;IAC5B,GAAG,EAAE,GAAG,CAAC;IACT,8BAA8B;IAC9B,SAAS,EAAE,GAAG,CAAC;CACf,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,wBAAsB,IAAI,CAAC,IAAI,EAAE,QAAQ,iBAqKxC"}
@@ -1,4 +1,4 @@
1
- import { loadFn, newQueries, onNewCrelteRequest, pluginsBeforeRender, pluginsBeforeRequest, setupPlugins, } from './shared.js';
1
+ import { loadFn, newQueries, onNewCrelteRequest, pluginsAfterRender, pluginsBeforeRender, pluginsBeforeRequest, setupPlugins, } from './shared.js';
2
2
  import { tick } from 'svelte';
3
3
  import { svelteMount } from './svelteComponents.js';
4
4
  import ClientCookies from '../cookies/ClientCookies.js';
@@ -11,6 +11,9 @@ import Plugins from '../plugins/Plugins.js';
11
11
  import Events from '../plugins/Events.js';
12
12
  import Globals from '../loadData/Globals.js';
13
13
  import { Writable } from '../std/stores/index.js';
14
+ import ClientBodyClass from '../bodyClass/ClientBodyClass.js';
15
+ import { BodyClass } from '../bodyClass/index.js';
16
+ import { Cookies } from '../cookies/index.js';
14
17
  /**
15
18
  * The main function to start the client side rendering
16
19
  *
@@ -18,16 +21,9 @@ import { Writable } from '../std/stores/index.js';
18
21
  * ```js
19
22
  * import * as app from './App.svelte';
20
23
  * import * as errorPage from './Error.svelte';
21
- * import entryQuery from './queries/entry.graphql';
22
- * import globalQuery from './queries/global.graphql';
23
24
  * import { main } from 'crelte/client';
24
25
  *
25
- * main({
26
- * app,
27
- * errorPage,
28
- * entryQuery,
29
- * globalQuery,
30
- * });
26
+ * main({ app, errorPage });
31
27
  * ```
32
28
  */
33
29
  export async function main(data) {
@@ -56,7 +52,6 @@ export async function main(data) {
56
52
  preloadOnMouseOver: config.preloadOnMouseOver ?? false,
57
53
  });
58
54
  const queries = newQueries(ssrCache, router.route.readonly(), config);
59
- const cookies = new ClientCookies();
60
55
  const crelte = newCrelte({
61
56
  config,
62
57
  ssrCache,
@@ -65,7 +60,8 @@ export async function main(data) {
65
60
  globals: new Globals(),
66
61
  router: new Router(router),
67
62
  queries,
68
- cookies,
63
+ cookies: new Cookies(new ClientCookies()),
64
+ bodyClass: new BodyClass(new ClientBodyClass()),
69
65
  });
70
66
  const app = new InternalApp(data.app);
71
67
  // setup plugins
@@ -75,21 +71,21 @@ export async function main(data) {
75
71
  router.onBeforeRequest = pluginsBeforeRequest;
76
72
  router.loadRunner.loadFn = (cr, opts) => loadFn(cr, app, opts);
77
73
  // render Space
78
- let appInstance;
79
- let routeProp;
74
+ let routeProp = null;
80
75
  const renderApp = (route) => {
81
- if (appInstance) {
76
+ if (routeProp) {
82
77
  routeProp.set(route);
83
78
  return;
84
79
  }
85
80
  routeProp = new Writable(route);
86
- appInstance = svelteMount(data.app.default, {
81
+ svelteMount(data.app.default, {
87
82
  target: document.body,
88
83
  props: { route: routeProp },
89
84
  context: new Map([['crelte', crelte]]),
90
85
  intro: config.playIntro,
91
86
  });
92
87
  };
88
+ const appMounted = () => !!routeProp;
93
89
  router.onError = (e, req) => {
94
90
  console.error('routing failed:', e, 'reloading trying to fix it');
95
91
  // since onError is called only on subsequent requests we should never
@@ -97,38 +93,44 @@ export async function main(data) {
97
93
  window.location.href = req.url.href;
98
94
  };
99
95
  router.onRender = async (cr, readyForRoute, domUpdated) => {
100
- if (appInstance && cr.req.disableLoadData) {
96
+ if (appMounted() && cr.req.disableLoadData) {
101
97
  // 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
98
+ // we just wan't to run domUpdated because we don't want to update anything
103
99
  const route = readyForRoute();
104
- cr.router._requestCompleted();
100
+ cr.router.z_requestCompleted();
105
101
  // globals should not be run because they will be empty
106
102
  // since nobody called loadGlobalData (todo maybe globals should also,
107
103
  // know if it accepts updates)
108
104
  // todo should we wait a tick here?
109
105
  await tick();
110
106
  domUpdated(cr, route);
107
+ pluginsAfterRender(cr, route);
111
108
  return route;
112
109
  }
113
110
  const startTime = config.debugTiming ? Date.now() : null;
114
111
  let render = async () => {
115
112
  const route = readyForRoute();
116
- cr.router._requestCompleted();
117
- if (route.entryChanged)
113
+ cr.router.z_requestCompleted();
114
+ // this is only important on the first render
115
+ // else we will catch an earlier branch in onRender
116
+ if (route.entryChanged) {
118
117
  cr.globals.z_syncToStores();
119
- // we should trigger the route update here
120
- pluginsBeforeRender(cr, route);
118
+ pluginsBeforeRender(cr, route);
119
+ cr.cookies.z_render();
120
+ cr.bodyClass.z_render();
121
+ }
121
122
  renderApp(route);
122
123
  await tick();
123
124
  if (startTime) {
124
125
  console.log('dom update took ' + (Date.now() - startTime) + 'ms');
125
126
  }
126
127
  domUpdated(cr, route);
128
+ pluginsAfterRender(cr, route);
127
129
  return route;
128
130
  };
129
131
  // render with view Transition if enabled and not in hydration
130
132
  if (config.viewTransition &&
131
- appInstance &&
133
+ appMounted() &&
132
134
  document.startViewTransition) {
133
135
  const prevRender = render;
134
136
  render = async () => new Promise(resolve => {
@@ -163,8 +165,8 @@ function handleLoadError(e) {
163
165
  const userLang = navigator.language || navigator.userLanguage;
164
166
  // Messages in different languages
165
167
  const messages = {
166
- en: 'An error has occurred. Please reload the page or try again later.',
167
168
  de: 'Leider ist ein Fehler aufgetreten. Laden Sie die Seite neu, oder versuchen Sie es später noch mal.',
169
+ en: 'An error has occurred. Please reload the page or try again later.',
168
170
  fr: 'Une erreur s’est produite. Veuillez recharger la page ou réessayer plus tard.',
169
171
  it: 'Si è verificato un errore. Ricarica la pagina o riprova più tardi.',
170
172
  nl: 'Er is een fout opgetreden. Herlaad de pagina of probeer het later opnieuw.',
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/init/server.ts"],"names":[],"mappings":"AAoBA,OAAO,EACN,kBAAkB,EAClB,aAAa,EACb,cAAc,EACd,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE9E,MAAM,MAAM,UAAU,GAAG,aAAa,CAAC;AAEvC;;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,cAAc,CAAC,CAiHlE;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,kBAAkB,CAAC;CAC/B,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
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/init/server.ts"],"names":[],"mappings":"AAoBA,OAAO,EACN,kBAAkB,EAClB,aAAa,EACb,cAAc,EACd,MAAM,qBAAqB,CAAC;AAK7B,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE9E,MAAM,MAAM,UAAU,GAAG,aAAa,CAAC;AAEvC;;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,cAAc,CAAC,CAsHlE;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,kBAAkB,CAAC;CAC/B,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"}
@@ -11,6 +11,9 @@ import Events from '../plugins/Events.js';
11
11
  import Globals from '../loadData/Globals.js';
12
12
  import { Router } from '../routing/index.js';
13
13
  import { Writable } from '../std/stores/index.js';
14
+ import ServerBodyClass from '../bodyClass/ServerBodyClass.js';
15
+ import BodyClass from '../bodyClass/BodyClass.js';
16
+ import { Cookies } from '../cookies/index.js';
14
17
  /**
15
18
  * The main function to start the server side rendering
16
19
  *
@@ -43,6 +46,7 @@ export async function main(data) {
43
46
  ssrCache.set('CRAFT_WEB_URL', data.serverData.craftWeb);
44
47
  ssrCache.set('FRONTEND_URL', data.serverData.frontend);
45
48
  const cookies = new ServerCookies(data.serverData.headers);
49
+ const bodyClass = new ServerBodyClass();
46
50
  ssrCache.set('crelteSites', data.serverData.sites);
47
51
  const router = new ServerRouter(data.serverData.sites, data.serverData.headers.get('Accept-Language') ?? '', { debugTiming: config.debugTiming ?? false });
48
52
  const queries = newQueries(ssrCache, router.route.readonly(), config);
@@ -54,7 +58,8 @@ export async function main(data) {
54
58
  globals: new Globals(),
55
59
  router: new Router(router),
56
60
  queries,
57
- cookies,
61
+ cookies: new Cookies(cookies),
62
+ bodyClass: new BodyClass(bodyClass),
58
63
  });
59
64
  const app = new InternalApp(data.app);
60
65
  // setup plugins
@@ -65,9 +70,11 @@ export async function main(data) {
65
70
  router.loadRunner.loadFn = (cr, opts) => loadFn(cr, app, opts);
66
71
  router.onRender = (cr, readyForRoute, _domUpdated) => {
67
72
  const route = readyForRoute();
68
- cr.router._requestCompleted();
73
+ cr.router.z_requestCompleted();
69
74
  cr.globals.z_syncToStores();
70
75
  pluginsBeforeRender(cr, route);
76
+ cr.cookies.z_render();
77
+ cr.bodyClass.z_render();
71
78
  return route;
72
79
  };
73
80
  // throws if there was an error
@@ -75,7 +82,7 @@ export async function main(data) {
75
82
  // if redirect
76
83
  if (!route) {
77
84
  const headers = new Headers();
78
- crelte.cookies._populateHeaders(headers);
85
+ cookies._populateHeaders(headers);
79
86
  return {
80
87
  status: req.statusCode ?? 302,
81
88
  location: req.url.toString(),
@@ -98,12 +105,13 @@ export async function main(data) {
98
105
  head += crelte.ssrCache.z_exportToHead();
99
106
  let htmlTemplate = data.serverData.htmlTemplate;
100
107
  htmlTemplate = htmlTemplate.replace('<!--page-lang-->', route.site.language);
108
+ htmlTemplate = bodyClass.z_processHtmlTemplate(htmlTemplate);
101
109
  const finalHtml = htmlTemplate
102
110
  .replace('</head>', head + '\n\t</head>')
103
111
  .replace('<!--ssr-body-->', html);
104
112
  const entry = route.entry;
105
113
  const headers = new Headers();
106
- crelte.cookies._populateHeaders(headers);
114
+ cookies._populateHeaders(headers);
107
115
  return {
108
116
  status: req.statusCode ??
109
117
  (entry.sectionHandle === 'error'
@@ -9,6 +9,7 @@ import { Readable } from '../std/stores/index.js';
9
9
  export declare function setupPlugins(crelte: Crelte, plugins: PluginCreator[]): void;
10
10
  export declare function pluginsBeforeRequest(cr: CrelteRequest): Promise<void> | void;
11
11
  export declare function pluginsBeforeRender(cr: CrelteRequest, route: Route): void;
12
+ export declare function pluginsAfterRender(cr: CrelteRequest, route: Route): void;
12
13
  export declare function newQueries(ssrCache: SsrCache, route: Readable<Route | null>, config: Required<Config>): Queries;
13
14
  export declare function onNewCrelteRequest(crelte: Crelte, req: Request): CrelteRequest;
14
15
  export declare function loadFn(cr: CrelteRequest, app: InternalApp, loadOpts?: LoadOptions): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/init/shared.ts"],"names":[],"mappings":"AAMA,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,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,QAAQ,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAmB,MAAM,cAAc,CAAC;AAC9E,OAAO,OAA2B,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAGlD,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;AAED,wBAAgB,UAAU,CACzB,QAAQ,EAAE,QAAQ,EAClB,KAAK,EAAE,QAAQ,CAAC,KAAK,GAAG,IAAI,CAAC,EAC7B,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,WAcxB;AAED,wBAAgB,kBAAkB,CACjC,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,OAAO,GACV,aAAa,CAWf;AAsBD,wBAAsB,MAAM,CAC3B,EAAE,EAAE,aAAa,EACjB,GAAG,EAAE,WAAW,EAChB,QAAQ,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,IAAI,CAAC,CAoHf"}
1
+ {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/init/shared.ts"],"names":[],"mappings":"AAMA,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,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,QAAQ,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAmB,MAAM,cAAc,CAAC;AAC9E,OAAO,OAA2B,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAGlD,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,CAGzE;AAED,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI,CAExE;AAED,wBAAgB,UAAU,CACzB,QAAQ,EAAE,QAAQ,EAClB,KAAK,EAAE,QAAQ,CAAC,KAAK,GAAG,IAAI,CAAC,EAC7B,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,WAcxB;AAED,wBAAgB,kBAAkB,CACjC,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,OAAO,GACV,aAAa,CAcf;AAsBD,wBAAsB,MAAM,CAC3B,EAAE,EAAE,aAAa,EACjB,GAAG,EAAE,WAAW,EAChB,QAAQ,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,IAAI,CAAC,CAwHf"}
@@ -18,6 +18,10 @@ export function pluginsBeforeRequest(cr) {
18
18
  }
19
19
  export function pluginsBeforeRender(cr, route) {
20
20
  cr.events.trigger('beforeRender', cr, route);
21
+ cr.plugins.z_render(cr, route);
22
+ }
23
+ export function pluginsAfterRender(cr, route) {
24
+ cr.events.trigger('afterRender', cr, route);
21
25
  }
22
26
  export function newQueries(ssrCache, route, config) {
23
27
  return Queries.new(ssrCache.get('ENDPOINT_URL'),
@@ -37,11 +41,14 @@ export function onNewCrelteRequest(crelte, req) {
37
41
  ...crelte,
38
42
  router: crelte.router.z_toRequest(req),
39
43
  queries: crelte.queries.z_toRequest(req),
44
+ plugins: crelte.plugins.z_toRequest(req),
40
45
  globals: crelte.globals.z_toRequest(),
46
+ cookies: crelte.cookies.z_toRequest(),
47
+ bodyClass: crelte.bodyClass.z_toRequest(),
41
48
  };
42
49
  return crelteToRequest(nCrelte, req);
43
50
  }
44
- async function pluginsLoadEntry(cr) {
51
+ async function eventsLoadEntry(cr) {
45
52
  const listeners = cr.events.getListeners('loadEntry');
46
53
  for (const loadEntry of listeners) {
47
54
  const entry = await loadEntry(cr);
@@ -79,7 +86,7 @@ export async function loadFn(cr, app, loadOpts) {
79
86
  // checked to be empty before doing it
80
87
  const entryProm = (async () => {
81
88
  // first let's try to call the plugin loadEntry
82
- let entry = await pluginsLoadEntry(cr);
89
+ let entry = await eventsLoadEntry(cr);
83
90
  if (isCanceled())
84
91
  return [];
85
92
  // if no plugin provides an entry we load it from the app
@@ -106,18 +113,20 @@ export async function loadFn(cr, app, loadOpts) {
106
113
  cr.req.template = template;
107
114
  return [entry, template];
108
115
  })();
109
- const pluginsLoadGlobalData = cr.events.trigger('loadGlobalData', cr);
116
+ const eventsLoadGlobalData = cr.events.trigger('loadGlobalData', cr);
117
+ const pluginsLoadGlobalData = cr.plugins.z_loadGlobalData(cr);
110
118
  // loading progress is at 20%
111
119
  loadOpts?.setProgress(0.2);
112
120
  const loadGlobalDataProm = Promise.all([
113
121
  globalProm,
114
122
  entryProm,
123
+ ...eventsLoadGlobalData,
115
124
  ...pluginsLoadGlobalData,
116
125
  ]);
117
126
  // if globals take longer than 2 seconds to load in dev mode
118
127
  // we force resolve them to prevent deadlocks
119
128
  if (import.meta.env.DEV &&
120
- !(await Promise.any([loadGlobalDataProm, timeout(2000)]))) {
129
+ !(await Promise.race([loadGlobalDataProm, timeout(2000)]))) {
121
130
  console.error('DEV: globals took longer than 2 seconds to load. ' +
122
131
  'Resolving globals now to fix potential deadlocks');
123
132
  cr.globals.z_globalsLoaded();
@@ -128,7 +137,6 @@ export async function loadFn(cr, app, loadOpts) {
128
137
  cr.globals.z_globalsLoaded();
129
138
  // loading progress is at 60%
130
139
  loadOpts?.setProgress(0.6);
131
- const pluginsLoadData = cr.events.trigger('loadData', cr, entry);
132
140
  let loadDataProm = null;
133
141
  if (template.loadData) {
134
142
  loadDataProm = callLoadData(template.loadData, cr, entry);
@@ -137,9 +145,12 @@ export async function loadFn(cr, app, loadOpts) {
137
145
  if (app.loadEntryData) {
138
146
  entryDataProm = callLoadData(app.loadEntryData, cr, entry);
139
147
  }
148
+ const eventsLoadData = cr.events.trigger('loadData', cr, entry);
149
+ const pluginsLoadData = cr.plugins.z_loadData(cr);
140
150
  const [templateData, entryData] = await Promise.all([
141
151
  loadDataProm,
142
152
  entryDataProm,
153
+ ...eventsLoadData,
143
154
  ...pluginsLoadData,
144
155
  ]);
145
156
  cr.req.loadedData = {
@@ -1 +1 @@
1
- {"version":3,"file":"Globals.d.ts","sourceRoot":"","sources":["../../src/loadData/Globals.ts"],"names":[],"mappings":"AASA,OAAO,QAAQ,MAAM,2BAA2B,CAAC;AACjD,OAAO,QAAQ,MAAM,2BAA2B,CAAC;AAEjD,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,WAAW;IAQX;;;OAGG;IACH,eAAe;IAYf;;;;OAIG;IACH,cAAc;CAyBd"}
1
+ {"version":3,"file":"Globals.d.ts","sourceRoot":"","sources":["../../src/loadData/Globals.ts"],"names":[],"mappings":"AASA,OAAO,QAAQ,MAAM,2BAA2B,CAAC;AACjD,OAAO,QAAQ,MAAM,2BAA2B,CAAC;AAEjD,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,WAAW,IAAI,OAAO;IAQtB;;;OAGG;IACH,eAAe;IAYf;;;;OAIG;IACH,cAAc;CAyBd"}
@@ -115,7 +115,7 @@ export default async function createServer(serverMod, buildTime) {
115
115
  catch (e) {
116
116
  basicError(res, e);
117
117
  }
118
- }).listen(8080);
118
+ }).listen(process.env.PORT ?? 8080);
119
119
  }
120
120
  function basicError(res, err) {
121
121
  console.error('Internal Server Error:', err);
@@ -27,14 +27,18 @@ export default class Events {
27
27
  * Will be executed in preload as well.
28
28
  *
29
29
  * @returns a function to remove the listener
30
+ *
31
+ * #### afterRender
32
+ * Note this will also be executed when disableLoadData is true
30
33
  */
31
34
  on(ev: 'beforeRequest', fn: (cr: CrelteRequest) => Promise<void> | void): () => void;
32
- on(ev: 'loadGlobalData', fn: (cr: CrelteRequest) => Promise<any>): () => void;
35
+ on(ev: 'loadGlobalData', fn: (cr: CrelteRequest) => Promise<any> | any): () => void;
33
36
  on(ev: 'loadEntry', fn: (cr: CrelteRequest) => Promise<Entry | null> | Entry | null): () => void;
34
37
  on(ev: 'beforeQueryEntry', fn: (cr: CrelteRequest, vars: EntryQueryVars) => Promise<void> | void): () => void;
35
- on(ev: 'afterLoadEntry', fn: (cr: CrelteRequest) => Promise<any>): () => void;
36
- on(ev: 'loadData', fn: (cr: CrelteRequest, entry: Entry) => Promise<any>): () => void;
37
- on(ev: 'beforeRender', fn: (cr: CrelteRequest) => void): () => void;
38
+ on(ev: 'afterLoadEntry', fn: (cr: CrelteRequest) => Promise<any> | any): () => void;
39
+ on(ev: 'loadData', fn: (cr: CrelteRequest, entry: Entry) => Promise<any> | any): () => void;
40
+ on(ev: 'beforeRender', fn: (cr: CrelteRequest, route: Route) => void): () => void;
41
+ on(ev: 'afterRender', fn: (cr: CrelteRequest, route: Route) => void): () => void;
38
42
  /**
39
43
  * Remove a listener
40
44
  */
@@ -47,11 +51,12 @@ export default class Events {
47
51
  * Trigger an event
48
52
  */
49
53
  trigger(ev: 'beforeRequest', cr: CrelteRequest): (Promise<void> | void)[];
50
- trigger(ev: 'loadGlobalData', cr: CrelteRequest): Promise<any>[];
54
+ trigger(ev: 'loadGlobalData', cr: CrelteRequest): (Promise<any> | any)[];
51
55
  trigger(ev: 'beforeQueryEntry', cr: CrelteRequest, vars: EntryQueryVars): (Promise<void> | void)[];
52
- trigger(ev: 'afterLoadEntry', cr: CrelteRequest): Promise<any>[];
53
- trigger(ev: 'loadData', cr: CrelteRequest, entry: Entry): Promise<any>[];
56
+ trigger(ev: 'afterLoadEntry', cr: CrelteRequest): (Promise<any> | any)[];
57
+ trigger(ev: 'loadData', cr: CrelteRequest, entry: Entry): (Promise<any> | any)[];
54
58
  trigger(ev: 'beforeRender', cr: CrelteRequest, route: Route): void[];
59
+ trigger(ev: 'afterRender', cr: CrelteRequest, route: Route): void[];
55
60
  /**
56
61
  * Get all listeners for an event
57
62
  */
@@ -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;AAC5C,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC7D,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;;;;;;;;;;;;;;;;;;;;;;;OAuBG;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,WAAW,EACf,EAAE,EAAE,CAAC,EAAE,EAAE,aAAa,KAAK,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,KAAK,GAAG,IAAI,GAC7D,MAAM,IAAI;IACb,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,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;IAenE;;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,CACN,EAAE,EAAE,kBAAkB,EACtB,EAAE,EAAE,aAAa,EACjB,IAAI,EAAE,cAAc,GAClB,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE;IAC3B,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;IAQpE;;OAEG;IACH,YAAY,CACX,EAAE,EAAE,WAAW,GACb,CAAC,CAAC,EAAE,EAAE,aAAa,KAAK,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,KAAK,GAAG,IAAI,CAAC,EAAE;CAIlE"}
1
+ {"version":3,"file":"Events.d.ts","sourceRoot":"","sources":["../../src/plugins/Events.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,28 @@
1
- import { Crelte } from '../crelte.js';
1
+ import { Crelte, CrelteRequest } from '../crelte.js';
2
+ import { Request, Route } from '../routing/index.js';
2
3
  /**
3
4
  * A plugin
4
5
  */
5
6
  export interface Plugin {
6
7
  name: string;
8
+ /**
9
+ * The returned value will be used inside of CrelteRequest
10
+ */
11
+ toRequest?: (req: Request) => Plugin;
12
+ /**
13
+ * This will be called during the loadGlobalData phase.
14
+ */
15
+ loadGlobalData?: (cr: CrelteRequest) => Promise<void> | void;
16
+ /**
17
+ * This will be called during the loadData phase.
18
+ */
19
+ loadData?: (cr: CrelteRequest) => Promise<void> | void;
20
+ /**
21
+ * This will be called before the dom gets updated.
22
+ *
23
+ * At this point you can update variables or stores.
24
+ */
25
+ render?: (cr: CrelteRequest, route: Route) => void;
7
26
  }
8
27
  /**
9
28
  * A plugin create function
@@ -34,5 +53,21 @@ export default class Plugins {
34
53
  */
35
54
  add(plugin: Plugin): void;
36
55
  get(name: string): Plugin | null;
56
+ /**
57
+ * @hidden
58
+ */
59
+ z_toRequest(req: Request): Plugins;
60
+ /**
61
+ * @hidden
62
+ */
63
+ z_loadGlobalData(cr: CrelteRequest): (Promise<void> | void | undefined)[];
64
+ /**
65
+ * @hidden
66
+ */
67
+ z_loadData(cr: CrelteRequest): (Promise<void> | void | undefined)[];
68
+ /**
69
+ * @hidden
70
+ */
71
+ z_render(cr: CrelteRequest, route: Route): void;
37
72
  }
38
73
  //# sourceMappingURL=Plugins.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Plugins.d.ts","sourceRoot":"","sources":["../../src/plugins/Plugins.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC;;GAEG;AACH,MAAM,WAAW,MAAM;IACtB,IAAI,EAAE,MAAM,CAAC;CACb;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,MAAM,aAAa,GAAG,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC;AAEvD;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,OAAO;IAC3B,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;;IAM7B;;;;OAIG;IACH,GAAG,CAAC,MAAM,EAAE,MAAM;IAIlB,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;CAGhC"}
1
+ {"version":3,"file":"Plugins.d.ts","sourceRoot":"","sources":["../../src/plugins/Plugins.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAErD;;GAEG;AACH,MAAM,WAAW,MAAM;IACtB,IAAI,EAAE,MAAM,CAAC;IACb;;OAEG;IACH,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,MAAM,CAAC;IAErC;;OAEG;IACH,cAAc,CAAC,EAAE,CAAC,EAAE,EAAE,aAAa,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAE7D;;OAEG;IACH,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,aAAa,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAEvD;;;;OAIG;IACH,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CACnD;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,MAAM,aAAa,GAAG,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC;AAEvD;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,OAAO;IAC3B,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;;IAM7B;;;;OAIG;IACH,GAAG,CAAC,MAAM,EAAE,MAAM;IAIlB,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAIhC;;OAEG;IACH,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO;IAalC;;OAEG;IACH,gBAAgB,CAAC,EAAE,EAAE,aAAa,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC,EAAE;IAMzE;;OAEG;IACH,UAAU,CAAC,EAAE,EAAE,aAAa,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC,EAAE;IAMnE;;OAEG;IACH,QAAQ,CAAC,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI;CAK/C"}
@@ -17,4 +17,36 @@ export default class Plugins {
17
17
  get(name) {
18
18
  return this.plugins.get(name) ?? null;
19
19
  }
20
+ /**
21
+ * @hidden
22
+ */
23
+ z_toRequest(req) {
24
+ const nPlugins = new Plugins();
25
+ for (let plugin of this.plugins.values()) {
26
+ if (typeof plugin.toRequest === 'function')
27
+ plugin = plugin.toRequest(req);
28
+ nPlugins.add(plugin);
29
+ }
30
+ return nPlugins;
31
+ }
32
+ /**
33
+ * @hidden
34
+ */
35
+ z_loadGlobalData(cr) {
36
+ return Array.from(this.plugins.values()).map(plugin => plugin.loadGlobalData?.(cr));
37
+ }
38
+ /**
39
+ * @hidden
40
+ */
41
+ z_loadData(cr) {
42
+ return Array.from(this.plugins.values()).map(plugin => plugin.loadData?.(cr));
43
+ }
44
+ /**
45
+ * @hidden
46
+ */
47
+ z_render(cr, route) {
48
+ for (const plugin of this.plugins.values()) {
49
+ plugin.render?.(cr, route);
50
+ }
51
+ }
20
52
  }
@@ -14,15 +14,35 @@ export type QueriesOptions = {
14
14
  /**
15
15
  * A GraphQL query
16
16
  *
17
- * You should almost never create this object directly
18
- * but instead import a graphql file or use the gql template.
17
+ * **You should almost never**
18
+ *
19
+ * When importing a graphql file you will get a {@link NamedQuery}
20
+ * or use the {@link gql} template function to create
21
+ * an {@link InlineQuery}.
22
+ * Alternatively you can use the {@link namedQuery} function to create
23
+ * a {@link NamedQuery}.
24
+ */
25
+ export type Query = InlineQuery | NamedQuery;
26
+ /**
27
+ * You should never create this type directly. It is returned from
28
+ * the {@link gql} template function.
19
29
  */
20
- export type Query = {
30
+ export type InlineQuery = {
21
31
  path?: string;
22
32
  query: string;
23
- } | {
33
+ };
34
+ /**
35
+ * Always create this object via the {@link namedQuery} function
36
+ */
37
+ export type NamedQuery = {
24
38
  queryName: string;
25
39
  };
40
+ /**
41
+ * Create a NamedQuery for the given server query name.
42
+ *
43
+ * Prefer importing a graphql file instead.
44
+ */
45
+ export declare function namedQuery(name: string): NamedQuery;
26
46
  /** Returns true if the passed object is a GraphQlQuery */
27
47
  export declare function isQuery(obj: any): obj is Query;
28
48
  /**
@@ -74,7 +94,12 @@ export default class Queries {
74
94
  * @param opts options
75
95
  * @returns
76
96
  */
77
- static new(endpoint: string, frontend: string, ssrCache: SsrCache, opts?: QueriesOptions): Queries;
97
+ static new(endpoint: string, frontend?: string | null, ssrCache?: SsrCache, opts?: QueriesOptions): Queries;
98
+ /**
99
+ * Create a new Queries instance that always intented to call an
100
+ * external GraphQl endpoint.
101
+ */
102
+ static newExternal(endpoint: string, bearerToken?: string): Queries;
78
103
  /**
79
104
  * Run a GraphQl Query
80
105
  *
@@ -1 +1 @@
1
- {"version":3,"file":"Queries.d.ts","sourceRoot":"","sources":["../../src/queries/Queries.ts"],"names":[],"mappings":"AAAA,OAAO,QAAwC,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EAAa,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAEhE,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAElD;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG;IAC5B,KAAK,CAAC,EAAE,QAAQ,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;IAC/B,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;;;;;GAKG;AACH,MAAM,MAAM,KAAK,GACd;IACA,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACb,GACD;IACA,SAAS,EAAE,MAAM,CAAC;CACjB,CAAC;AAEL,0DAA0D;AAC1D,wBAAgB,OAAO,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,IAAI,KAAK,CAI9C;AAED;;;;;;;;;GASG;AACH,MAAM,MAAM,YAAY,GAAG;IAC1B;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,OAAO,OAAO,OAAO;IAC3B,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,KAAK,CAAgC;IAE7C,OAAO,CAAC,OAAO,CAAiB;IAEhC,OAAO;IAUP;;;;;;;;OAQG;IACH,MAAM,CAAC,GAAG,CACT,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,QAAQ,EAClB,IAAI,GAAE,cAAmB,GACvB,OAAO;IAQV;;;;;;;OAOG;IACG,KAAK,CACV,KAAK,EAAE,KAAK,EACZ,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EAClC,IAAI,GAAE,YAAiB,GACrB,OAAO,CAAC,OAAO,CAAC;IA0BnB;;;OAGG;IACH,WAAW,CAAC,GAAG,EAAE,OAAO;CAGxB"}
1
+ {"version":3,"file":"Queries.d.ts","sourceRoot":"","sources":["../../src/queries/Queries.ts"],"names":[],"mappings":"AAAA,OAAO,QAAwC,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EAAa,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAEhE,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAElD;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG;IAC5B,KAAK,CAAC,EAAE,QAAQ,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;IAC/B,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;;;;;;;;;;GAUG;AACH,MAAM,MAAM,KAAK,GAAG,WAAW,GAAG,UAAU,CAAC;AAE7C;;;GAGG;AACH,MAAM,MAAM,WAAW,GAAG;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3D;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/C;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAEnD;AAED,0DAA0D;AAC1D,wBAAgB,OAAO,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,IAAI,KAAK,CAI9C;AAED;;;;;;;;;GASG;AACH,MAAM,MAAM,YAAY,GAAG;IAC1B;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,OAAO,OAAO,OAAO;IAC3B,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,KAAK,CAAgC;IAE7C,OAAO,CAAC,OAAO,CAAiB;IAEhC,OAAO;IAUP;;;;;;;;OAQG;IACH,MAAM,CAAC,GAAG,CACT,QAAQ,EAAE,MAAM,EAChB,QAAQ,GAAE,MAAM,GAAG,IAAW,EAC9B,QAAQ,GAAE,QAAyB,EACnC,IAAI,GAAE,cAAmB,GACvB,OAAO;IAQV;;;OAGG;IACH,MAAM,CAAC,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO;IAQnE;;;;;;;OAOG;IACG,KAAK,CACV,KAAK,EAAE,KAAK,EACZ,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EAClC,IAAI,GAAE,YAAiB,GACrB,OAAO,CAAC,OAAO,CAAC;IA0BnB;;;OAGG;IACH,WAAW,CAAC,GAAG,EAAE,OAAO;CAGxB"}
@@ -1,5 +1,13 @@
1
- import { calcKey as ssrCacheCalcKey } from '../ssr/SsrCache.js';
1
+ import SsrCache, { calcKey as ssrCacheCalcKey } from '../ssr/SsrCache.js';
2
2
  import QueryError from './QueryError.js';
3
+ /**
4
+ * Create a NamedQuery for the given server query name.
5
+ *
6
+ * Prefer importing a graphql file instead.
7
+ */
8
+ export function namedQuery(name) {
9
+ return { queryName: name };
10
+ }
3
11
  /** Returns true if the passed object is a GraphQlQuery */
4
12
  export function isQuery(obj) {
5
13
  if (typeof obj !== 'object' || obj === null)
@@ -31,9 +39,16 @@ export default class Queries {
31
39
  * @param opts options
32
40
  * @returns
33
41
  */
34
- static new(endpoint, frontend, ssrCache, opts = {}) {
42
+ static new(endpoint, frontend = null, ssrCache = new SsrCache(), opts = {}) {
35
43
  return new Queries(new Inner(endpoint, frontend, ssrCache, opts), opts?.route ?? null, null);
36
44
  }
45
+ /**
46
+ * Create a new Queries instance that always intented to call an
47
+ * external GraphQl endpoint.
48
+ */
49
+ static newExternal(endpoint, bearerToken) {
50
+ return new Queries(new Inner(endpoint, null, new SsrCache(), { bearerToken }), null, null);
51
+ }
37
52
  /**
38
53
  * Run a GraphQl Query
39
54
  *
@@ -136,6 +151,8 @@ class Inner {
136
151
  async queryNotCached(query, vars, opts) {
137
152
  let logName, url;
138
153
  if ('queryName' in query) {
154
+ if (!this.frontend)
155
+ throw new Error('only inline queries supported');
139
156
  logName = `query (server: ${query.queryName})`;
140
157
  url = new URL(this.frontend);
141
158
  url.pathname = '/queries/' + query.queryName;
@@ -1,4 +1,4 @@
1
- import { Query } from './Queries.js';
1
+ import { InlineQuery } from './Queries.js';
2
2
  /**
3
3
  * Create a GraphQL query string with variables.
4
4
  * @param strings
@@ -9,5 +9,5 @@ import { Query } from './Queries.js';
9
9
  * const query = gql`query ($id: ID!) { page(id: $id) { id } }`;
10
10
  * ```
11
11
  */
12
- export declare function gql(strings: TemplateStringsArray | string[] | string, ...keys: unknown[]): Query;
12
+ export declare function gql(strings: TemplateStringsArray | string[] | string, ...keys: unknown[]): InlineQuery;
13
13
  //# sourceMappingURL=gql.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"gql.d.ts","sourceRoot":"","sources":["../../src/queries/gql.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,KAAK,EAAE,MAAM,cAAc,CAAC;AAE9C;;;;;;;;;GASG;AACH,wBAAgB,GAAG,CAClB,OAAO,EAAE,oBAAoB,GAAG,MAAM,EAAE,GAAG,MAAM,EACjD,GAAG,IAAI,EAAE,OAAO,EAAE,GAChB,KAAK,CAuBP"}
1
+ {"version":3,"file":"gql.d.ts","sourceRoot":"","sources":["../../src/queries/gql.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAW,MAAM,cAAc,CAAC;AAEpD;;;;;;;;;GASG;AACH,wBAAgB,GAAG,CAClB,OAAO,EAAE,oBAAoB,GAAG,MAAM,EAAE,GAAG,MAAM,EACjD,GAAG,IAAI,EAAE,OAAO,EAAE,GAChB,WAAW,CAuBb"}