crelte 0.5.15 → 0.6.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 (101) 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/node/index.d.ts.map +1 -1
  14. package/dist/node/index.js +15 -11
  15. package/dist/queries/Queries.d.ts +16 -27
  16. package/dist/queries/Queries.d.ts.map +1 -1
  17. package/dist/queries/Queries.js +13 -20
  18. package/dist/queries/gql.d.ts +2 -2
  19. package/dist/queries/gql.d.ts.map +1 -1
  20. package/dist/queries/gql.js +3 -2
  21. package/dist/queries/index.d.ts +13 -13
  22. package/dist/queries/index.d.ts.map +1 -1
  23. package/dist/queries/index.js +2 -2
  24. package/dist/queries/vars.d.ts +3 -3
  25. package/dist/queries/vars.d.ts.map +1 -1
  26. package/dist/queries/vars.js +3 -3
  27. package/dist/routing/route/BaseRoute.d.ts +4 -0
  28. package/dist/routing/route/BaseRoute.d.ts.map +1 -1
  29. package/dist/routing/route/BaseRoute.js +6 -0
  30. package/dist/routing/router/BaseRouter.d.ts.map +1 -1
  31. package/dist/routing/router/BaseRouter.js +4 -3
  32. package/dist/routing/router/ClientRouter.d.ts +1 -0
  33. package/dist/routing/router/ClientRouter.d.ts.map +1 -1
  34. package/dist/routing/router/ClientRouter.js +22 -7
  35. package/dist/server/CrelteServer.d.ts +1 -1
  36. package/dist/server/CrelteServer.d.ts.map +1 -1
  37. package/dist/server/ServerRouter.d.ts +1 -1
  38. package/dist/server/ServerRouter.d.ts.map +1 -1
  39. package/dist/server/queries/QueriesCaching.d.ts +0 -1
  40. package/dist/server/queries/QueriesCaching.d.ts.map +1 -1
  41. package/dist/server/queries/QueriesCaching.js +0 -2
  42. package/dist/server/queries/QueryGqlRoute.d.ts +2 -0
  43. package/dist/server/queries/QueryGqlRoute.d.ts.map +1 -1
  44. package/dist/server/queries/QueryGqlRoute.js +22 -14
  45. package/dist/server/queries/QueryHandleRoute.d.ts +1 -2
  46. package/dist/server/queries/QueryHandleRoute.d.ts.map +1 -1
  47. package/dist/server/queries/QueryHandleRoute.js +2 -2
  48. package/dist/server/queries/queries.d.ts.map +1 -1
  49. package/dist/server/queries/queries.js +2 -1
  50. package/dist/server/queries/routes.d.ts +3 -4
  51. package/dist/server/queries/routes.d.ts.map +1 -1
  52. package/dist/server/queries/routes.js +3 -3
  53. package/dist/server/shared.d.ts +5 -4
  54. package/dist/server/shared.d.ts.map +1 -1
  55. package/dist/server/shared.js +26 -16
  56. package/dist/ssr/SsrCache.d.ts +2 -2
  57. package/dist/ssr/SsrCache.d.ts.map +1 -1
  58. package/dist/ssr/SsrCache.js +10 -16
  59. package/dist/std/encdec/escaping.d.ts +2 -0
  60. package/dist/std/encdec/escaping.d.ts.map +1 -0
  61. package/dist/std/encdec/escaping.js +41 -0
  62. package/dist/std/encdec/index.d.ts +13 -0
  63. package/dist/std/encdec/index.d.ts.map +1 -0
  64. package/dist/std/encdec/index.js +15 -0
  65. package/dist/std/index.d.ts.map +1 -1
  66. package/dist/utils.d.ts +1 -0
  67. package/dist/utils.d.ts.map +1 -1
  68. package/dist/utils.js +17 -0
  69. package/dist/vite/index.d.ts +1 -5
  70. package/dist/vite/index.d.ts.map +1 -1
  71. package/dist/vite/index.js +39 -79
  72. package/package.json +12 -7
  73. package/src/blocks/Blocks.svelte +4 -3
  74. package/src/crelte.ts +2 -2
  75. package/src/index.ts +2 -2
  76. package/src/init/InternalApp.ts +3 -4
  77. package/src/init/server.ts +4 -4
  78. package/src/loadData/loadData.ts +0 -2
  79. package/src/node/index.ts +24 -9
  80. package/src/queries/Queries.ts +31 -36
  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 +8 -7
  85. package/src/routing/router/BaseRouter.ts +6 -3
  86. package/src/routing/router/ClientRouter.ts +29 -8
  87. package/src/server/CrelteServer.ts +1 -1
  88. package/src/server/ServerRouter.ts +1 -1
  89. package/src/server/queries/QueriesCaching.ts +0 -2
  90. package/src/server/queries/QueryGqlRoute.ts +24 -20
  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 +34 -16
  95. package/src/ssr/SsrCache.ts +13 -23
  96. package/src/std/encdec/escaping.ts +47 -0
  97. package/src/std/encdec/index.ts +16 -0
  98. package/src/std/index.ts +1 -6
  99. package/src/utils.ts +21 -0
  100. package/src/vite/index.ts +51 -87
  101. package/types.d.ts +1 -1
@@ -0,0 +1,2 @@
1
+ export declare function escape_html<V>(value: V, is_attr?: boolean): string;
2
+ //# sourceMappingURL=escaping.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"escaping.d.ts","sourceRoot":"","sources":["../../../src/std/encdec/escaping.ts"],"names":[],"mappings":"AA2BA,wBAAgB,WAAW,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,GAAE,OAAe,UAmBhE"}
@@ -0,0 +1,41 @@
1
+ /*
2
+ * Code from Svelte (https://github.com/sveltejs/svelte/blob/b4968584df6be22222f58c273bdd8e04307ad36b/packages/svelte/src/escaping.js)
3
+ *
4
+ * Copyright (c) 2016-24 these people (https://github.com/sveltejs/svelte/graphs/contributors)
5
+ *
6
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ * of this software and associated documentation files (the "Software"), to deal
8
+ * in the Software without restriction, including without limitation the rights
9
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ * copies of the Software, and to permit persons to whom the Software is
11
+ * furnished to do so, subject to the following conditions:
12
+ *
13
+ * The above copyright notice and this permission notice shall be included in all
14
+ * copies or substantial portions of the Software.
15
+ *
16
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
+ * SOFTWARE.
23
+ */
24
+ const ATTR_REGEX = /[&"<]/g;
25
+ const CONTENT_REGEX = /[&<]/g;
26
+ export function escape_html(value, is_attr = false) {
27
+ const str = String(value ?? '');
28
+ const pattern = is_attr ? ATTR_REGEX : CONTENT_REGEX;
29
+ pattern.lastIndex = 0;
30
+ let escaped = '';
31
+ let last = 0;
32
+ while (pattern.test(str)) {
33
+ const i = pattern.lastIndex - 1;
34
+ const ch = str[i];
35
+ escaped +=
36
+ str.substring(last, i) +
37
+ (ch === '&' ? '&amp;' : ch === '"' ? '&quot;' : '&lt;');
38
+ last = i + 1;
39
+ }
40
+ return escaped + str.substring(last);
41
+ }
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Convert newlines to <br> tags and escape HTML.
3
+ *
4
+ * #### Warning
5
+ * When used in an attribute, the `isAttr` parameter needs to be set to `true`.
6
+ *
7
+ * #### Example
8
+ * ```svelte
9
+ * {@html nl2br("Hello\nWorld")}
10
+ * ```
11
+ */
12
+ export declare function nl2br(str: string, isAttr?: boolean): string;
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/std/encdec/index.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;GAUG;AACH,wBAAgB,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,GAAE,OAAe,GAAG,MAAM,CAElE"}
@@ -0,0 +1,15 @@
1
+ import { escape_html } from './escaping.js';
2
+ /**
3
+ * Convert newlines to <br> tags and escape HTML.
4
+ *
5
+ * #### Warning
6
+ * When used in an attribute, the `isAttr` parameter needs to be set to `true`.
7
+ *
8
+ * #### Example
9
+ * ```svelte
10
+ * {@html nl2br("Hello\nWorld")}
11
+ * ```
12
+ */
13
+ export function nl2br(str, isAttr = false) {
14
+ return escape_html(str, isAttr).replace(/\n/g, '<br>');
15
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/std/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEjD;AAED,MAAM,WAAW,SAAS;IACzB,KAAK,IAAI,IAAI,CAAC;CACd;AAED;;GAEG;AACH,MAAM,MAAM,oBAAoB,GAC7B,SAAS,GACT,MAAM,GACN,MAAM,GACN,OAAO,GACP,IAAI,GACJ,SAAS,CAAC;AAEb;;;GAGG;AACH,wBAAgB,KAAK,CAAC,CAAC,SAAS,oBAAoB,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAIjE"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/std/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEjD;AAED,MAAM,WAAW,SAAS;IACzB,KAAK,IAAI,IAAI,CAAC;CACd;AAED;;GAEG;AACH,MAAM,MAAM,oBAAoB,GAC/B,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC;AAE1D;;;GAGG;AACH,wBAAgB,KAAK,CAAC,CAAC,SAAS,oBAAoB,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAIjE"}
package/dist/utils.d.ts CHANGED
@@ -10,4 +10,5 @@ export declare function isPromise<T>(p: Promise<T> | T): p is Promise<T>;
10
10
  */
11
11
  export declare function promiseThen<T, R = void>(p: Promise<T> | T, then: (val: T) => R): Promise<R> | R;
12
12
  export declare function urlWithPath(url: string, path?: string): URL;
13
+ export declare function cryptoSha1Hash(str: string): Promise<string>;
13
14
  //# sourceMappingURL=utils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAGA,wBAAgB,QAAQ,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,CAMtC;AAED,wBAAgB,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,CAE/D;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,EACtC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,EACjB,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,GACjB,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAEhB;AAGD,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,GAAG,CAI3D"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAGA,wBAAgB,QAAQ,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,CAMtC;AAED,wBAAgB,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,CAE/D;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,EACtC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,EACjB,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,GACjB,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAEhB;AAGD,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,GAAG,CAI3D;AAED,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAmBjE"}
package/dist/utils.js CHANGED
@@ -26,3 +26,20 @@ export function urlWithPath(url, path) {
26
26
  u.pathname = path ?? '';
27
27
  return u;
28
28
  }
29
+ export async function cryptoSha1Hash(str) {
30
+ // Convert the string data to an ArrayBuffer
31
+ const encoder = new TextEncoder();
32
+ const dataBuffer = encoder.encode(str);
33
+ // Use the Web Crypto API to hash the data with SHA-1
34
+ const hashBuffer = await crypto.subtle.digest('SHA-1', dataBuffer);
35
+ const bytes = new Uint8Array(hashBuffer);
36
+ // @ts-ignore using 2025 baseline feature
37
+ if (typeof bytes.toHex === 'function')
38
+ return bytes.toHex();
39
+ // Convert the ArrayBuffer to a hex string
40
+ const hashArray = Array.from(bytes); // Create an array from the buffer
41
+ const hashHex = hashArray
42
+ .map(b => b.toString(16).padStart(2, '0'))
43
+ .join(''); // Convert to hex string
44
+ return hashHex;
45
+ }
@@ -1,7 +1,3 @@
1
1
  import { Plugin } from 'vite';
2
- export type CrelteOptions = {
3
- /** If not specified tries to detect which version is installed */
4
- svelte4?: boolean;
5
- };
6
- export default function crelte(opts?: CrelteOptions): Plugin;
2
+ export default function crelte(): Plugin;
7
3
  //# sourceMappingURL=index.d.ts.map
@@ -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;AAyHd,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
- import { initEnvData, initSites, modRender, modRenderError, } from '../server/shared.js';
4
+ import { initEnvData, initSites, initRequestSites, 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) {
@@ -264,7 +223,8 @@ async function serveVite(env, vite) {
264
223
  if (!sites) {
265
224
  sites = await initSites(env);
266
225
  }
267
- const router = new ServerRouter(env.endpointUrl, env.frontendUrl, env.env, sites, { endpointToken: env.endpointToken });
226
+ const requestSites = await initRequestSites(env, sites, req);
227
+ const router = new ServerRouter(env.endpointUrl, env.frontendUrl, env.env, requestSites, { endpointToken: env.endpointToken });
268
228
  await initQueryRoutes(PLATFORM, serverMod, router);
269
229
  if (typeof serverMod.routes === 'function') {
270
230
  await serverMod.routes(router);
@@ -291,7 +251,7 @@ async function serveVite(env, vite) {
291
251
  await webResponseToResponse(errorResp, res);
292
252
  return;
293
253
  }
294
- const response = await modRender(env, sites, serverMod, template, req);
254
+ const response = await modRender(env, requestSites, serverMod, template, req);
295
255
  await webResponseToResponse(response, res);
296
256
  };
297
257
  vite.middlewares.use(async (nReq, res, next) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "crelte",
3
- "version": "0.5.15",
3
+ "version": "0.6.0-alpha.2",
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
 
package/src/node/index.ts CHANGED
@@ -6,6 +6,7 @@ import {
6
6
  EnvData,
7
7
  initEnvData,
8
8
  initSites,
9
+ initRequestSites,
9
10
  modRender,
10
11
  modRenderError,
11
12
  } from '../server/shared.js';
@@ -37,12 +38,15 @@ async function writeSitesCache(data: any): Promise<void> {
37
38
  async function initRouter(
38
39
  serverMod: any,
39
40
  env: EnvData,
41
+ sites?: SiteFromGraphQl[],
40
42
  ): Promise<[SiteFromGraphQl[], ServerRouter]> {
41
- const sites = await initSites(env, {
42
- enabled: process.env.NODE_ENV === 'production',
43
- writeSitesCache,
44
- readSitesCache,
45
- });
43
+ if (!sites) {
44
+ sites = await initSites(env, {
45
+ enabled: process.env.NODE_ENV === 'production',
46
+ writeSitesCache,
47
+ readSitesCache,
48
+ });
49
+ }
46
50
 
47
51
  const router = new ServerRouter(
48
52
  env.endpointUrl,
@@ -113,7 +117,13 @@ export default async function createServer(serverMod: any, buildTime: string) {
113
117
  throw routesError ?? new Error('Router not initialized');
114
118
  }
115
119
 
116
- const routeResp = await router.z_handle(req);
120
+ const requestSites = await initRequestSites(env, sites, req);
121
+ const requestRouter =
122
+ requestSites === sites
123
+ ? router
124
+ : (await initRouter(serverMod, env, requestSites))[1];
125
+
126
+ const routeResp = await requestRouter.z_handle(req);
117
127
  if (routeResp) {
118
128
  await webResponseToResponse(routeResp, res);
119
129
  return;
@@ -121,9 +131,14 @@ export default async function createServer(serverMod: any, buildTime: string) {
121
131
 
122
132
  if (await basicAuthCheck(req, res, env)) return;
123
133
 
124
- const response = await modRender(env, sites, serverMod, template, req, {
125
- ssrManifest,
126
- });
134
+ const response = await modRender(
135
+ env,
136
+ requestSites,
137
+ serverMod,
138
+ template,
139
+ req,
140
+ { ssrManifest },
141
+ );
127
142
  await webResponseToResponse(response, res);
128
143
  };
129
144