crelte 0.5.14 → 0.6.0-alpha.1

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 (104) hide show
  1. package/dist/blocks/Blocks.svelte +5 -4
  2. package/dist/blocks/Blocks.svelte.d.ts +4 -19
  3. package/dist/blocks/Blocks.svelte.d.ts.map +1 -1
  4. package/dist/crelte.d.ts +2 -2
  5. package/dist/crelte.d.ts.map +1 -1
  6. package/dist/index.d.ts +2 -2
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/init/InternalApp.d.ts.map +1 -1
  9. package/dist/init/InternalApp.js +2 -2
  10. package/dist/init/server.js +4 -4
  11. package/dist/loadData/loadData.d.ts +1 -1
  12. package/dist/loadData/loadData.d.ts.map +1 -1
  13. package/dist/queries/Queries.d.ts +9 -26
  14. package/dist/queries/Queries.d.ts.map +1 -1
  15. package/dist/queries/Queries.js +10 -20
  16. package/dist/queries/gql.d.ts +2 -2
  17. package/dist/queries/gql.d.ts.map +1 -1
  18. package/dist/queries/gql.js +3 -2
  19. package/dist/queries/index.d.ts +13 -13
  20. package/dist/queries/index.d.ts.map +1 -1
  21. package/dist/queries/index.js +2 -2
  22. package/dist/queries/vars.d.ts +3 -3
  23. package/dist/queries/vars.d.ts.map +1 -1
  24. package/dist/queries/vars.js +3 -3
  25. package/dist/routing/route/BaseRoute.d.ts.map +1 -1
  26. package/dist/routing/router/ClientRouter.d.ts.map +1 -1
  27. package/dist/routing/router/ClientRouter.js +3 -2
  28. package/dist/server/CrelteServer.d.ts +1 -1
  29. package/dist/server/CrelteServer.d.ts.map +1 -1
  30. package/dist/server/Request.d.ts +2 -2
  31. package/dist/server/Request.js +2 -2
  32. package/dist/server/ServerRouter.d.ts +1 -1
  33. package/dist/server/ServerRouter.d.ts.map +1 -1
  34. package/dist/server/queries/QueriesCaching.d.ts +0 -1
  35. package/dist/server/queries/QueriesCaching.d.ts.map +1 -1
  36. package/dist/server/queries/QueriesCaching.js +0 -2
  37. package/dist/server/queries/QueryGqlRoute.d.ts +2 -0
  38. package/dist/server/queries/QueryGqlRoute.d.ts.map +1 -1
  39. package/dist/server/queries/QueryGqlRoute.js +16 -5
  40. package/dist/server/queries/QueryHandleRoute.d.ts +1 -2
  41. package/dist/server/queries/QueryHandleRoute.d.ts.map +1 -1
  42. package/dist/server/queries/QueryHandleRoute.js +2 -2
  43. package/dist/server/queries/queries.d.ts.map +1 -1
  44. package/dist/server/queries/queries.js +2 -1
  45. package/dist/server/queries/routes.d.ts +3 -4
  46. package/dist/server/queries/routes.d.ts.map +1 -1
  47. package/dist/server/queries/routes.js +3 -3
  48. package/dist/server/shared.d.ts +3 -3
  49. package/dist/server/shared.d.ts.map +1 -1
  50. package/dist/server/shared.js +6 -6
  51. package/dist/ssr/SsrCache.d.ts +2 -2
  52. package/dist/ssr/SsrCache.d.ts.map +1 -1
  53. package/dist/ssr/SsrCache.js +10 -16
  54. package/dist/static/index.d.ts +1 -1
  55. package/dist/std/encdec/escaping.d.ts +2 -0
  56. package/dist/std/encdec/escaping.d.ts.map +1 -0
  57. package/dist/std/encdec/escaping.js +41 -0
  58. package/dist/std/encdec/index.d.ts +13 -0
  59. package/dist/std/encdec/index.d.ts.map +1 -0
  60. package/dist/std/encdec/index.js +15 -0
  61. package/dist/std/index.d.ts.map +1 -1
  62. package/dist/translations/index.d.ts +2 -2
  63. package/dist/translations/index.d.ts.map +1 -1
  64. package/dist/translations/translationsPlugin.d.ts +4 -1
  65. package/dist/translations/translationsPlugin.d.ts.map +1 -1
  66. package/dist/translations/translationsPlugin.js +32 -2
  67. package/dist/utils.d.ts +1 -0
  68. package/dist/utils.d.ts.map +1 -1
  69. package/dist/utils.js +17 -0
  70. package/dist/vite/index.d.ts +1 -5
  71. package/dist/vite/index.d.ts.map +1 -1
  72. package/dist/vite/index.js +35 -76
  73. package/package.json +12 -7
  74. package/src/blocks/Blocks.svelte +4 -3
  75. package/src/crelte.ts +2 -2
  76. package/src/index.ts +2 -2
  77. package/src/init/InternalApp.ts +3 -4
  78. package/src/init/server.ts +4 -4
  79. package/src/loadData/loadData.ts +0 -2
  80. package/src/queries/Queries.ts +19 -35
  81. package/src/queries/gql.ts +7 -3
  82. package/src/queries/index.ts +19 -16
  83. package/src/queries/vars.ts +5 -7
  84. package/src/routing/route/BaseRoute.ts +1 -7
  85. package/src/routing/router/ClientRouter.ts +3 -1
  86. package/src/server/CrelteServer.ts +1 -1
  87. package/src/server/Request.ts +2 -2
  88. package/src/server/ServerRouter.ts +1 -1
  89. package/src/server/queries/QueriesCaching.ts +0 -2
  90. package/src/server/queries/QueryGqlRoute.ts +17 -10
  91. package/src/server/queries/QueryHandleRoute.ts +2 -6
  92. package/src/server/queries/queries.ts +2 -3
  93. package/src/server/queries/routes.ts +9 -6
  94. package/src/server/shared.ts +8 -8
  95. package/src/ssr/SsrCache.ts +13 -23
  96. package/src/static/index.ts +1 -1
  97. package/src/std/encdec/escaping.ts +47 -0
  98. package/src/std/encdec/index.ts +16 -0
  99. package/src/std/index.ts +1 -6
  100. package/src/translations/index.ts +2 -0
  101. package/src/translations/translationsPlugin.ts +46 -3
  102. package/src/utils.ts +21 -0
  103. package/src/vite/index.ts +40 -85
  104. package/types.d.ts +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/vite/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAEN,MAAM,EAON,MAAM,MAAM,CAAC;AAkJd,MAAM,MAAM,aAAa,GAAG;IAC3B,kEAAkE;IAClE,OAAO,CAAC,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,MAAM,CAAC,OAAO,UAAU,MAAM,CAAC,IAAI,CAAC,EAAE,aAAa,GAAG,MAAM,CAyK3D"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/vite/index.ts"],"names":[],"mappings":"AACA,OAAO,EAEN,MAAM,EAON,MAAM,MAAM,CAAC;AAwHd,MAAM,CAAC,OAAO,UAAU,MAAM,IAAI,MAAM,CA4JvC"}
@@ -1,13 +1,12 @@
1
1
  import { relative } from 'node:path';
2
- import MagicString from 'magic-string';
3
2
  import { build as viteBuild, } from 'vite';
4
3
  import fs from 'node:fs/promises';
5
4
  import { initEnvData, initSites, modRender, modRenderError, } from '../server/shared.js';
6
5
  import ServerRouter from '../server/ServerRouter.js';
7
- import sveltePackage from 'svelte/package.json' with { type: 'json' };
8
6
  import { initQueryRoutes } from '../server/queries/queries.js';
9
7
  import { PLATFORM, requestToWebRequest, webResponseToResponse, } from '../node/utils.js';
10
8
  import QueryError from '../queries/QueryError.js';
9
+ import { generateTransform, rolldownString, } from 'rolldown-string';
11
10
  const VIRT_MOD_ID = 'virtual:crelte/svelteComponents';
12
11
  const RESOLVED_VIRT_MOD_ID = '\0' + VIRT_MOD_ID;
13
12
  async function readFile(path) {
@@ -17,41 +16,31 @@ async function readFile(path) {
17
16
  // todo need to find a better solution
18
17
  // for reference https://github.com/sveltejs/svelte/issues/4854
19
18
  // and https://github.com/sveltejs/svelte/pull/5476
20
- function usedSsrComponents(code, id, options, svelte5) {
19
+ function usedSsrComponents(code, id, options) {
21
20
  if (!options?.ssr || !id.endsWith('.svelte'))
22
21
  return;
23
22
  const file = relative('.', id);
24
- let idx;
25
- if (svelte5) {
26
- const defFnSign = 'export default function ';
27
- idx = code.indexOf(defFnSign);
28
- if (idx < 0)
29
- return;
30
- const withPropsIdx = code.indexOf('($$renderer, $$props) {', idx);
31
- const noPropsIdx = code.indexOf('($$renderer) {', idx);
32
- idx = withPropsIdx >= 0 ? withPropsIdx : noPropsIdx;
33
- if (idx < 0) {
34
- console.error('could not find svelte5 init', id);
35
- return;
36
- }
37
- const renderCompSign = '$$renderer.component(($$renderer) => {';
38
- const renderCompIdx = code.indexOf(renderCompSign, idx);
39
- if (renderCompIdx >= 0)
40
- idx = renderCompIdx;
41
- // Find the end of the line where the pattern was found
42
- idx = code.indexOf('\n', idx);
43
- if (idx < 0)
44
- return;
45
- idx += 1; // \n
46
- }
47
- else {
48
- const initFnSign = 'create_ssr_component(($$result, $$props, $$bindings, slots) => {';
49
- idx = code.indexOf(initFnSign);
50
- if (idx < 0)
51
- return;
52
- idx += initFnSign.length;
23
+ const defFnSign = 'export default function ';
24
+ let idx = code.indexOf(defFnSign);
25
+ if (idx < 0)
26
+ return;
27
+ const withPropsIdx = code.indexOf('($$renderer, $$props) {', idx);
28
+ const noPropsIdx = code.indexOf('($$renderer) {', idx);
29
+ idx = withPropsIdx >= 0 ? withPropsIdx : noPropsIdx;
30
+ if (idx < 0) {
31
+ console.error('could not find svelte5 init', id);
32
+ return;
53
33
  }
54
- const s = new MagicString(code);
34
+ const renderCompSign = '$$renderer.component(($$renderer) => {';
35
+ const renderCompIdx = code.indexOf(renderCompSign, idx);
36
+ if (renderCompIdx >= 0)
37
+ idx = renderCompIdx;
38
+ // Find the end of the line where the pattern was found
39
+ idx = code.indexOf('\n', idx);
40
+ if (idx < 0)
41
+ return;
42
+ idx += 1; // \n
43
+ const s = rolldownString(code, id, options);
55
44
  s.prepend(`import { getContext as __modulesGetContext } from 'svelte';\n`);
56
45
  const ctxAdd = `
57
46
  (() => {
@@ -62,14 +51,7 @@ if (ctx && ctx instanceof Set) {
62
51
  })();
63
52
  `;
64
53
  s.appendLeft(idx, ctxAdd);
65
- return {
66
- map: s.generateMap({
67
- source: id,
68
- includeContent: true,
69
- hires: 'boundary',
70
- }),
71
- code: s.toString(),
72
- };
54
+ return generateTransform(s, id);
73
55
  }
74
56
  // transform graphql files into a GraphQlQuery which can called with
75
57
  // crelte.query or graphQl.query
@@ -82,18 +64,14 @@ function graphQlFiles(code, path, ssr) {
82
64
  const name = filename.substring(0, filename.length - '.graphql'.length);
83
65
  if (!ssr) {
84
66
  return `
85
- export default {
86
- queryName: ${JSON.stringify(name)}
87
- };
67
+ export default ${JSON.stringify(name)};
88
68
  `;
89
69
  }
90
70
  const json = JSON.stringify(code)
91
71
  .replace(/\u2028/g, '\\u2028')
92
72
  .replace(/\u2029/g, '\\u2029');
93
73
  return `
94
- export default {
95
- queryName: ${JSON.stringify(name)}
96
- };
74
+ export default ${JSON.stringify(name)};
97
75
 
98
76
  export const query = {
99
77
  path: ${JSON.stringify(path)},
@@ -101,21 +79,12 @@ export const query = {
101
79
  };
102
80
  `;
103
81
  }
104
- function isSvelte5() {
105
- if (sveltePackage && sveltePackage.version) {
106
- return sveltePackage.version.startsWith('5.');
107
- }
108
- // Fallback or error handling if version cannot be determined
109
- console.warn('Could not determine Svelte version. Assuming not Svelte 5.');
110
- return false;
111
- }
112
82
  // outside of crelte because each build executes crelte again
113
83
  let isSsrBuild = false;
114
- export default function crelte(opts) {
84
+ export default function crelte() {
115
85
  let viteConfig;
116
86
  let viteConfigEnv;
117
87
  let initialConfig;
118
- const svelte5 = opts?.svelte4 ? false : isSvelte5();
119
88
  return {
120
89
  name: 'crelte',
121
90
  config(config, configEnv) {
@@ -167,28 +136,18 @@ export default function crelte(opts) {
167
136
  `createServer(server, ${Date.now()});`);
168
137
  }
169
138
  if (id === RESOLVED_VIRT_MOD_ID) {
170
- if (svelte5) {
171
- return (`import { hydrate } from 'svelte';` +
172
- `import { render } from 'svelte/server';` +
173
- `export function internalSvelteMount(comp, options) {` +
174
- `return hydrate(comp, options);` +
175
- `}` +
176
- `export function internalSvelteRender(comp, options) {` +
177
- `return render(comp, options);` +
178
- `}`);
179
- }
180
- else {
181
- return (`export function internalSvelteMount(comp, options) {` +
182
- `return new comp({ ...options, hydrate: true });` +
183
- `}` +
184
- `export function internalSvelteRender(comp, options) {` +
185
- `return comp.render(options.props, options);` +
186
- `}`);
187
- }
139
+ return (`import { hydrate } from 'svelte';` +
140
+ `import { render } from 'svelte/server';` +
141
+ `export function internalSvelteMount(comp, options) {` +
142
+ `return hydrate(comp, options);` +
143
+ `}` +
144
+ `export function internalSvelteRender(comp, options) {` +
145
+ `return render(comp, options);` +
146
+ `}`);
188
147
  }
189
148
  },
190
149
  transform(code, id, options) {
191
- return (usedSsrComponents(code, id, options, svelte5) ||
150
+ return (usedSsrComponents(code, id, options) ||
192
151
  graphQlFiles(code, id, !!options?.ssr));
193
152
  },
194
153
  async configureServer(vite) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "crelte",
3
- "version": "0.5.14",
3
+ "version": "0.6.0-alpha.1",
4
4
  "author": "Crelte <support@crelte.com>",
5
5
  "type": "module",
6
6
  "scripts": {
@@ -111,22 +111,27 @@
111
111
  "./std/url": {
112
112
  "types": "./dist/std/url/index.d.ts",
113
113
  "default": "./dist/std/url/index.js"
114
+ },
115
+ "./std/encdec": {
116
+ "types": "./dist/std/encdec/index.d.ts",
117
+ "default": "./dist/std/encdec/index.js"
114
118
  }
115
119
  },
116
120
  "dependencies": {
117
- "magic-string": "^0.30.17",
121
+ "devalue": "^5.9.0",
122
+ "rolldown-string": "^0.3.1",
118
123
  "trouter": "^4.0.0"
119
124
  },
120
125
  "peerDependencies": {
121
- "svelte": "^4.0.0 || ^5.39.1",
122
- "vite": "^5.0.0 || ^6.0.0"
126
+ "svelte": "^5.39.1",
127
+ "vite": "^8.0.0"
123
128
  },
124
129
  "devDependencies": {
125
130
  "@sveltejs/package": "^2.3.1",
126
- "@sveltejs/vite-plugin-svelte": "^4.0.0",
131
+ "@sveltejs/vite-plugin-svelte": "^7.0.0",
132
+ "@types/node": "^22.13.10",
127
133
  "svelte-check": "^4.1.4",
128
134
  "typescript-svelte-plugin": "^0.3.45",
129
- "vitest": "^3.0.0",
130
- "@types/node": "^22.13.10"
135
+ "vitest": "^4.0.0"
131
136
  }
132
137
  }
@@ -1,9 +1,10 @@
1
1
  <script lang="ts">
2
2
  import { type BlocksInstance } from './index.js';
3
3
 
4
- export let blocks: BlocksInstance;
4
+ // eslint-disable-next-line svelte/valid-compile
5
+ let { blocks, ...rest }: { blocks: BlocksInstance } = $props();
5
6
  </script>
6
7
 
7
- {#each blocks.each() as { mod, props }}
8
- <svelte:component this={mod} {...props} {...$$restProps} />
8
+ {#each blocks.each() as { mod: Mod, props }}
9
+ <Mod {...props} {...rest} />
9
10
  {/each}
package/src/crelte.ts CHANGED
@@ -127,10 +127,10 @@ export type Crelte = {
127
127
  /**
128
128
  * returns an env variable from the craft/.env file.
129
129
  * All env variables need to start with VITE_
130
- * except ENDPOINT_URL, CRAFT_WEB_URL and FRONTEND_URL
130
+ * except ENDPOINT_URL, CRAFT_BASE_CP_URL and FRONTEND_URL
131
131
  */
132
132
  getEnv(name: 'ENDPOINT_URL'): string;
133
- getEnv(name: 'CRAFT_WEB_URL'): string;
133
+ getEnv(name: 'CRAFT_BASE_CP_URL'): string;
134
134
  getEnv(name: 'FRONTEND_URL'): string;
135
135
  getEnv(name: string): string | null;
136
136
 
package/src/index.ts CHANGED
@@ -125,13 +125,13 @@ export function getEntry(): Readable<Entry> {
125
125
  /**
126
126
  * returns an env variable from the craft/.env file.
127
127
  * All env variables need to start with VITE_
128
- * except ENDPOINT_URL, CRAFT_WEB_URL and FRONTEND_URL
128
+ * except ENDPOINT_URL, CRAFT_BASE_CP_URL and FRONTEND_URL
129
129
  *
130
130
  * #### Note
131
131
  * This only works during component initialisation.
132
132
  */
133
133
  export function getEnv(name: 'ENDPOINT_URL'): string;
134
- export function getEnv(name: 'CRAFT_WEB_URL'): string;
134
+ export function getEnv(name: 'CRAFT_BASE_CP_URL'): string;
135
135
  export function getEnv(name: 'FRONTEND_URL'): string;
136
136
  export function getEnv(name: string): string | null;
137
137
  export function getEnv(name: string): string | null {
@@ -27,8 +27,7 @@ export interface TemplateModule {
27
27
  }
28
28
 
29
29
  export type LazyTemplateModule =
30
- | (() => Promise<TemplateModule>)
31
- | TemplateModule;
30
+ (() => Promise<TemplateModule>) | TemplateModule;
32
31
 
33
32
  export type TemplateModules = Map<string, LazyTemplateModule>;
34
33
 
@@ -54,7 +53,7 @@ export default class InternalApp {
54
53
  }
55
54
 
56
55
  get loadGlobalData(): LoadData<null> {
57
- return this.inner.loadGlobalData ?? { queryName: 'global' };
56
+ return this.inner.loadGlobalData ?? 'global';
58
57
  }
59
58
 
60
59
  init(crelte: Crelte): void {
@@ -63,7 +62,7 @@ export default class InternalApp {
63
62
 
64
63
  get loadEntry(): LoadData<null> {
65
64
  // if no loadEntry property was defined we expect a graphql entry file
66
- return this.inner.loadEntry ?? { queryName: 'entry' };
65
+ return this.inner.loadEntry ?? 'entry';
67
66
  }
68
67
 
69
68
  async loadTemplate(entry: Entry): Promise<TemplateModule> {
@@ -7,7 +7,7 @@ import {
7
7
  setupPlugins,
8
8
  } from './shared.js';
9
9
  import SsrComponents from '../ssr/SsrComponents.js';
10
- import SsrCache from '../ssr/SsrCache.js';
10
+ import SsrCache, { ssrCacheExportToHead } from '../ssr/SsrCache.js';
11
11
  import ServerCookies from '../cookies/ServerCookies.js';
12
12
  import { svelteRender } from './svelteComponents.js';
13
13
  import ServerRouter from '../routing/router/ServerRouter.js';
@@ -74,7 +74,7 @@ export async function main(data: MainData): Promise<RenderResponse> {
74
74
 
75
75
  const endpoint = data.serverData.endpoint;
76
76
  ssrCache.set('ENDPOINT_URL', endpoint);
77
- ssrCache.set('CRAFT_WEB_URL', data.serverData.craftWeb);
77
+ ssrCache.set('CRAFT_BASE_CP_URL', data.serverData.craftUrl);
78
78
  ssrCache.set('FRONTEND_URL', data.serverData.frontend);
79
79
 
80
80
  const cookies = new ServerCookies(data.serverData.headers);
@@ -154,7 +154,7 @@ export async function main(data: MainData): Promise<RenderResponse> {
154
154
 
155
155
  bodyClass.z_populateSsrCache(ssrCache);
156
156
  head += ssrComponents.toHead(data.serverData.ssrManifest);
157
- head += crelte.ssrCache.z_exportToHead();
157
+ head += ssrCacheExportToHead(crelte.ssrCache);
158
158
 
159
159
  let htmlTemplate = data.serverData.htmlTemplate;
160
160
  htmlTemplate = htmlTemplate.replace(
@@ -234,7 +234,7 @@ export async function mainError(
234
234
  });
235
235
 
236
236
  head += ssrComponents.toHead(data.serverData.ssrManifest);
237
- head += ssrCache.z_exportToHead();
237
+ head += ssrCacheExportToHead(ssrCache);
238
238
 
239
239
  let htmlTemplate = data.serverData.htmlTemplate;
240
240
  htmlTemplate = htmlTemplate.replace('<!--page-lang-->', 'de');
@@ -74,8 +74,6 @@ export type LoadData<A1 = any> =
74
74
  | Query
75
75
  | LoadDataObj<A1>
76
76
  | LoadDataArray<A1>
77
- | string
78
- | number
79
77
  | null
80
78
  | undefined;
81
79
 
@@ -17,44 +17,28 @@ export type QueriesOptions = {
17
17
  /**
18
18
  * A GraphQL query
19
19
  *
20
- * **You should almost never**
21
- *
22
- * When importing a graphql file you will get a {@link NamedQuery}
23
- * or use the {@link gql} template function to create
24
- * an {@link InlineQuery}.
25
- * Alternatively you can use the {@link namedQuery} function to create
26
- * a {@link NamedQuery}.
20
+ * When importing a graphql file you will get a string with the name of the
21
+ * query or you can use the {@link gql} template function to create
22
+ * an {@link GqlQuery}.
23
+ * Alternatively you can use the name of the query directly, note thought
24
+ * that this will not reload when you're query changes.
27
25
  */
28
- export type Query = InlineQuery | NamedQuery;
26
+ export type Query = string | GqlQuery;
29
27
 
30
28
  /**
31
29
  * You should never create this type directly. It is returned from
32
30
  * the {@link gql} template function.
33
31
  */
34
- export type InlineQuery = { path?: string; query: string };
35
-
36
- /**
37
- * Always create this object via the {@link namedQuery} function
38
- */
39
- export type NamedQuery = { queryName: string };
32
+ export type GqlQuery = { path?: string; query: string };
40
33
 
41
- /**
42
- * Create a NamedQuery for the given server query name.
43
- *
44
- * Prefer importing a graphql file instead.
45
- *
46
- * #### Note
47
- * This needs to match the name of the js/ts file.
48
- */
49
- export function namedQuery(name: string): NamedQuery {
50
- return { queryName: name };
51
- }
52
-
53
- /** Returns true if the passed object is a GraphQlQuery */
34
+ /** Returns true if the passed object is a Query */
54
35
  export function isQuery(obj: any): obj is Query {
55
- if (typeof obj !== 'object' || obj === null) return false;
56
-
57
- return typeof obj.query === 'string' || typeof obj.queryName === 'string';
36
+ return (
37
+ typeof obj === 'string' ||
38
+ (typeof obj === 'object' &&
39
+ obj !== null &&
40
+ typeof obj.query === 'string')
41
+ );
58
42
  }
59
43
 
60
44
  /**
@@ -135,7 +119,7 @@ export default class Queries {
135
119
  }
136
120
 
137
121
  /**
138
- * Create a new Queries instance that always intented to call an
122
+ * Create a new Queries instance that is always intented to call an
139
123
  * external GraphQl endpoint.
140
124
  */
141
125
  static newExternal(endpoint: string, bearerToken?: string): Queries {
@@ -296,13 +280,13 @@ class Inner {
296
280
  ): Promise<unknown> {
297
281
  let logName: string, url: URL;
298
282
 
299
- if ('queryName' in query) {
283
+ if (typeof query === 'string') {
300
284
  if (!this.frontend)
301
285
  throw new Error('only inline queries supported');
302
286
 
303
- logName = `query (server: ${query.queryName})`;
287
+ logName = `query (server: ${query})`;
304
288
  url = new URL(this.frontend);
305
- url.pathname = '/queries/' + query.queryName;
289
+ url.pathname = '/queries/' + query;
306
290
  } else {
307
291
  logName = `query (${query.path ?? 'unknown'})`;
308
292
  url = new URL(this.endpoint);
@@ -329,7 +313,7 @@ class Inner {
329
313
  if (this.loggingTiming) timing = Date.now();
330
314
 
331
315
  let body: any;
332
- if ('queryName' in query) {
316
+ if (typeof query === 'string') {
333
317
  body = vars;
334
318
  } else {
335
319
  body = { query: query.query, variables: vars };
@@ -1,4 +1,4 @@
1
- import { InlineQuery, isQuery } from './Queries.js';
1
+ import { GqlQuery } from './Queries.js';
2
2
 
3
3
  /**
4
4
  * Create a GraphQL query string with variables.
@@ -13,7 +13,7 @@ import { InlineQuery, isQuery } from './Queries.js';
13
13
  export function gql(
14
14
  strings: TemplateStringsArray | string[] | string,
15
15
  ...keys: unknown[]
16
- ): InlineQuery {
16
+ ): GqlQuery {
17
17
  if (typeof strings === 'string') strings = [strings];
18
18
 
19
19
  let query = '';
@@ -24,7 +24,11 @@ export function gql(
24
24
  const variable = keys[i];
25
25
 
26
26
  // nesting support
27
- if (isQuery(variable) && 'query' in variable) {
27
+ if (
28
+ typeof variable === 'object' &&
29
+ variable !== null &&
30
+ 'query' in variable
31
+ ) {
28
32
  query += variable.query;
29
33
  } else if (typeof variable === 'string') {
30
34
  query += variable;
@@ -1,14 +1,11 @@
1
1
  import Queries, {
2
- InlineQuery,
2
+ GqlQuery,
3
3
  isQuery,
4
- namedQuery,
5
- NamedQuery,
6
4
  QueriesOptions,
7
5
  Query,
8
6
  QueryOptions,
9
7
  } from '../queries/Queries.js';
10
8
  import type CrelteServerRequest from '../server/CrelteServer.js';
11
- import ServerRouter from '../server/ServerRouter.js';
12
9
  import { gql } from './gql.js';
13
10
  import QueryError, { QueryErrorResponse } from './QueryError.js';
14
11
  import { QueryVar, ValidIf, vars, varsIdsEqual } from './vars.js';
@@ -18,9 +15,7 @@ export {
18
15
  type QueriesOptions,
19
16
  type QueryOptions,
20
17
  type Query,
21
- type InlineQuery as GqlQuery,
22
- type NamedQuery,
23
- namedQuery,
18
+ type GqlQuery,
24
19
  isQuery,
25
20
  QueryError,
26
21
  type QueryErrorResponse,
@@ -53,14 +48,14 @@ export type InferVariableTypes<T> = {
53
48
  * category: vars.id()
54
49
  * };
55
50
  *
56
- * export const validVars: ValidVars<typeof variables> = (vars, sr) => {
51
+ * export const validVars: ValidVars<typeof variables> = (vars, csr) => {
57
52
  * if (!vars.category === 5) throw new Error('category needs to be 5');
58
53
  * };
59
54
  * ```
60
55
  */
61
56
  export type ValidVars<T extends Record<string, QueryVar<any>>> = (
62
57
  vars: InferVariableTypes<T>,
63
- sr: ServerRouter,
58
+ csr: CrelteServerRequest,
64
59
  ) => void | boolean;
65
60
 
66
61
  /**
@@ -76,12 +71,18 @@ export type ValidVars<T extends Record<string, QueryVar<any>>> = (
76
71
  * };
77
72
  *
78
73
  * export const caching: Caching<typeof variables> =
79
- * (queryResponse, variables) => !!queryResponse.entries.length;
74
+ * (queryResponse, variables, csr) => !!queryResponse.entries.length;
80
75
  * ```
81
76
  */
82
77
  export type Caching<
83
78
  T extends Record<string, QueryVar<any>> = Record<string, QueryVar<any>>,
84
- > = boolean | ((response: any, vars: InferVariableTypes<T>) => boolean);
79
+ > =
80
+ | boolean
81
+ | ((
82
+ response: any,
83
+ vars: InferVariableTypes<T>,
84
+ csr: CrelteServerRequest,
85
+ ) => boolean);
85
86
 
86
87
  /** use {@link Transfrom} */
87
88
  export type TransformFn<
@@ -89,6 +90,7 @@ export type TransformFn<
89
90
  > = (
90
91
  response: any,
91
92
  vars: InferVariableTypes<T>,
93
+ csr: CrelteServerRequest,
92
94
  ) => void | any | Promise<void | any>;
93
95
 
94
96
  /**
@@ -96,11 +98,12 @@ export type TransformFn<
96
98
  *
97
99
  * #### Example
98
100
  * ```ts
99
- * export const transform: Transform<typeof variables> = (response, vars) => {
100
- * for (const entry of response.entries) {
101
- * entry.title = entry.title.toUpperCase();
102
- * }
103
- * };
101
+ * export const transform: Transform<typeof variables> =
102
+ * (response, vars, csr) => {
103
+ * for (const entry of response.entries) {
104
+ * entry.title = entry.title.toUpperCase();
105
+ * }
106
+ * };
104
107
  * ```
105
108
  */
106
109
  export type Transform<
@@ -1,4 +1,4 @@
1
- import ServerRouter from '../server/ServerRouter.js';
1
+ import CrelteServerRequest from '../server/CrelteServer.js';
2
2
 
3
3
  export const vars = {
4
4
  /**
@@ -65,14 +65,12 @@ export const vars = {
65
65
  siteId: (): QueryVar<number> =>
66
66
  new QueryVar()
67
67
  .number()
68
- .validIf(
69
- (num, router) => !!router.sites.find(site => site.id === num),
70
- ),
68
+ .validIf((num, csr) => !!csr.sites.find(site => site.id === num)),
71
69
  };
72
70
 
73
71
  /// either throw with an error which will get returned in a 400 response or
74
72
  // return false if the value is not valid
75
- export type ValidIf<T> = (v: T, sr: ServerRouter) => boolean;
73
+ export type ValidIf<T> = (v: T, csr: CrelteServerRequest) => boolean;
76
74
 
77
75
  export class QueryVar<T = any> {
78
76
  private name: string | null;
@@ -135,7 +133,7 @@ export class QueryVar<T = any> {
135
133
  return this;
136
134
  }
137
135
 
138
- validValue(v: any, cs: ServerRouter): T | null {
136
+ validValue(v: any, csr: CrelteServerRequest): T | null {
139
137
  // undefined is treated as null
140
138
  if (typeof v === 'undefined') v = null;
141
139
 
@@ -229,7 +227,7 @@ export class QueryVar<T = any> {
229
227
  throw new Error('uknown type ' + this.type);
230
228
  }
231
229
 
232
- if (!this.validIfFn(v, cs))
230
+ if (!this.validIfFn(v, csr))
233
231
  throw new Error(`variable ${this.name} is not valid`);
234
232
 
235
233
  return v;
@@ -31,13 +31,7 @@ export type BaseRouteOptions = {
31
31
  * `replace` and `push` will not call loadData
32
32
  */
33
33
  export type RouteOrigin =
34
- | 'init'
35
- | 'manual'
36
- | 'preload'
37
- | 'click'
38
- | 'pop'
39
- | 'replace'
40
- | 'push';
34
+ 'init' | 'manual' | 'preload' | 'click' | 'pop' | 'replace' | 'push';
41
35
 
42
36
  /**
43
37
  * A Route contains information about the current page for example the url and
@@ -249,7 +249,9 @@ export default class ClientRouter extends BaseRouter {
249
249
  updateScroll(cr: CrelteRequest, _route: Route): void {
250
250
  const req = cr.req;
251
251
 
252
- if (req.disableScroll) return;
252
+ if (req.disableScroll) {
253
+ return this.onScroll(); // make sure the current scrollY get's stored to the history
254
+ }
253
255
 
254
256
  // scroll to target
255
257
  let scrollTo:
@@ -86,7 +86,7 @@ export default class CrelteServerRequest {
86
86
  * returns an env variable from the craft/.env file.
87
87
  */
88
88
  getEnv(name: 'ENDPOINT_URL'): string;
89
- getEnv(name: 'CRAFT_WEB_URL'): string;
89
+ getEnv(name: 'CRAFT_BASE_CP_URL'): string;
90
90
  getEnv(name: 'FRONTEND_URL'): string;
91
91
  getEnv(name: string): string | null;
92
92
  getEnv(name: string): string | null {
@@ -33,8 +33,8 @@ export default class ServerRequest extends Request {
33
33
  *
34
34
  * @example
35
35
  * ```js
36
- * router.get('/blog/:slug', async (cs, req) => {
37
- * return Response.json({ slug: cs.getParam('slug') });
36
+ * router.get('/blog/:slug', async csr => {
37
+ * return Response.json({ slug: csr.req.getParam('slug') });
38
38
  * });
39
39
  * ```
40
40
  */
@@ -81,7 +81,7 @@ export default class ServerRouter {
81
81
  * returns an env variable from the craft/.env file.
82
82
  */
83
83
  getEnv(name: 'ENDPOINT_URL'): string;
84
- getEnv(name: 'CRAFT_WEB_URL'): string;
84
+ getEnv(name: 'CRAFT_BASE_CP_URL'): string;
85
85
  getEnv(name: string): string | null;
86
86
  getEnv(name: string): string | null {
87
87
  return this.env.get(name) ?? null;