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.
- package/dist/blocks/Blocks.svelte +5 -4
- package/dist/blocks/Blocks.svelte.d.ts +4 -19
- package/dist/blocks/Blocks.svelte.d.ts.map +1 -1
- package/dist/crelte.d.ts +2 -2
- package/dist/crelte.d.ts.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/init/InternalApp.d.ts.map +1 -1
- package/dist/init/InternalApp.js +2 -2
- package/dist/init/server.js +4 -4
- package/dist/loadData/loadData.d.ts +1 -1
- package/dist/loadData/loadData.d.ts.map +1 -1
- package/dist/queries/Queries.d.ts +9 -26
- package/dist/queries/Queries.d.ts.map +1 -1
- package/dist/queries/Queries.js +10 -20
- package/dist/queries/gql.d.ts +2 -2
- package/dist/queries/gql.d.ts.map +1 -1
- package/dist/queries/gql.js +3 -2
- package/dist/queries/index.d.ts +13 -13
- package/dist/queries/index.d.ts.map +1 -1
- package/dist/queries/index.js +2 -2
- package/dist/queries/vars.d.ts +3 -3
- package/dist/queries/vars.d.ts.map +1 -1
- package/dist/queries/vars.js +3 -3
- package/dist/routing/route/BaseRoute.d.ts.map +1 -1
- package/dist/routing/router/ClientRouter.d.ts.map +1 -1
- package/dist/routing/router/ClientRouter.js +3 -2
- package/dist/server/CrelteServer.d.ts +1 -1
- package/dist/server/CrelteServer.d.ts.map +1 -1
- package/dist/server/Request.d.ts +2 -2
- package/dist/server/Request.js +2 -2
- package/dist/server/ServerRouter.d.ts +1 -1
- package/dist/server/ServerRouter.d.ts.map +1 -1
- package/dist/server/queries/QueriesCaching.d.ts +0 -1
- package/dist/server/queries/QueriesCaching.d.ts.map +1 -1
- package/dist/server/queries/QueriesCaching.js +0 -2
- package/dist/server/queries/QueryGqlRoute.d.ts +2 -0
- package/dist/server/queries/QueryGqlRoute.d.ts.map +1 -1
- package/dist/server/queries/QueryGqlRoute.js +16 -5
- package/dist/server/queries/QueryHandleRoute.d.ts +1 -2
- package/dist/server/queries/QueryHandleRoute.d.ts.map +1 -1
- package/dist/server/queries/QueryHandleRoute.js +2 -2
- package/dist/server/queries/queries.d.ts.map +1 -1
- package/dist/server/queries/queries.js +2 -1
- package/dist/server/queries/routes.d.ts +3 -4
- package/dist/server/queries/routes.d.ts.map +1 -1
- package/dist/server/queries/routes.js +3 -3
- package/dist/server/shared.d.ts +3 -3
- package/dist/server/shared.d.ts.map +1 -1
- package/dist/server/shared.js +6 -6
- package/dist/ssr/SsrCache.d.ts +2 -2
- package/dist/ssr/SsrCache.d.ts.map +1 -1
- package/dist/ssr/SsrCache.js +10 -16
- package/dist/static/index.d.ts +1 -1
- package/dist/std/encdec/escaping.d.ts +2 -0
- package/dist/std/encdec/escaping.d.ts.map +1 -0
- package/dist/std/encdec/escaping.js +41 -0
- package/dist/std/encdec/index.d.ts +13 -0
- package/dist/std/encdec/index.d.ts.map +1 -0
- package/dist/std/encdec/index.js +15 -0
- package/dist/std/index.d.ts.map +1 -1
- package/dist/translations/index.d.ts +2 -2
- package/dist/translations/index.d.ts.map +1 -1
- package/dist/translations/translationsPlugin.d.ts +4 -1
- package/dist/translations/translationsPlugin.d.ts.map +1 -1
- package/dist/translations/translationsPlugin.js +32 -2
- package/dist/utils.d.ts +1 -0
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +17 -0
- package/dist/vite/index.d.ts +1 -5
- package/dist/vite/index.d.ts.map +1 -1
- package/dist/vite/index.js +35 -76
- package/package.json +12 -7
- package/src/blocks/Blocks.svelte +4 -3
- package/src/crelte.ts +2 -2
- package/src/index.ts +2 -2
- package/src/init/InternalApp.ts +3 -4
- package/src/init/server.ts +4 -4
- package/src/loadData/loadData.ts +0 -2
- package/src/queries/Queries.ts +19 -35
- package/src/queries/gql.ts +7 -3
- package/src/queries/index.ts +19 -16
- package/src/queries/vars.ts +5 -7
- package/src/routing/route/BaseRoute.ts +1 -7
- package/src/routing/router/ClientRouter.ts +3 -1
- package/src/server/CrelteServer.ts +1 -1
- package/src/server/Request.ts +2 -2
- package/src/server/ServerRouter.ts +1 -1
- package/src/server/queries/QueriesCaching.ts +0 -2
- package/src/server/queries/QueryGqlRoute.ts +17 -10
- package/src/server/queries/QueryHandleRoute.ts +2 -6
- package/src/server/queries/queries.ts +2 -3
- package/src/server/queries/routes.ts +9 -6
- package/src/server/shared.ts +8 -8
- package/src/ssr/SsrCache.ts +13 -23
- package/src/static/index.ts +1 -1
- package/src/std/encdec/escaping.ts +47 -0
- package/src/std/encdec/index.ts +16 -0
- package/src/std/index.ts +1 -6
- package/src/translations/index.ts +2 -0
- package/src/translations/translationsPlugin.ts +46 -3
- package/src/utils.ts +21 -0
- package/src/vite/index.ts +40 -85
- package/types.d.ts +1 -1
package/dist/vite/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/vite/index.ts"],"names":[],"mappings":"
|
|
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"}
|
package/dist/vite/index.js
CHANGED
|
@@ -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
|
|
19
|
+
function usedSsrComponents(code, id, options) {
|
|
21
20
|
if (!options?.ssr || !id.endsWith('.svelte'))
|
|
22
21
|
return;
|
|
23
22
|
const file = relative('.', id);
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
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
|
|
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(
|
|
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
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
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
|
|
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.
|
|
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
|
-
"
|
|
121
|
+
"devalue": "^5.9.0",
|
|
122
|
+
"rolldown-string": "^0.3.1",
|
|
118
123
|
"trouter": "^4.0.0"
|
|
119
124
|
},
|
|
120
125
|
"peerDependencies": {
|
|
121
|
-
"svelte": "^
|
|
122
|
-
"vite": "^
|
|
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": "^
|
|
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": "^
|
|
130
|
-
"@types/node": "^22.13.10"
|
|
135
|
+
"vitest": "^4.0.0"
|
|
131
136
|
}
|
|
132
137
|
}
|
package/src/blocks/Blocks.svelte
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import { type BlocksInstance } from './index.js';
|
|
3
3
|
|
|
4
|
-
|
|
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
|
-
<
|
|
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,
|
|
130
|
+
* except ENDPOINT_URL, CRAFT_BASE_CP_URL and FRONTEND_URL
|
|
131
131
|
*/
|
|
132
132
|
getEnv(name: 'ENDPOINT_URL'): string;
|
|
133
|
-
getEnv(name: '
|
|
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,
|
|
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: '
|
|
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 {
|
package/src/init/InternalApp.ts
CHANGED
|
@@ -27,8 +27,7 @@ export interface TemplateModule {
|
|
|
27
27
|
}
|
|
28
28
|
|
|
29
29
|
export type LazyTemplateModule =
|
|
30
|
-
|
|
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 ??
|
|
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 ??
|
|
65
|
+
return this.inner.loadEntry ?? 'entry';
|
|
67
66
|
}
|
|
68
67
|
|
|
69
68
|
async loadTemplate(entry: Entry): Promise<TemplateModule> {
|
package/src/init/server.ts
CHANGED
|
@@ -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('
|
|
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
|
|
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
|
|
237
|
+
head += ssrCacheExportToHead(ssrCache);
|
|
238
238
|
|
|
239
239
|
let htmlTemplate = data.serverData.htmlTemplate;
|
|
240
240
|
htmlTemplate = htmlTemplate.replace('<!--page-lang-->', 'de');
|
package/src/loadData/loadData.ts
CHANGED
package/src/queries/Queries.ts
CHANGED
|
@@ -17,44 +17,28 @@ export type QueriesOptions = {
|
|
|
17
17
|
/**
|
|
18
18
|
* A GraphQL query
|
|
19
19
|
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
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 =
|
|
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
|
|
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
|
-
|
|
56
|
-
|
|
57
|
-
|
|
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 ('
|
|
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
|
|
287
|
+
logName = `query (server: ${query})`;
|
|
304
288
|
url = new URL(this.frontend);
|
|
305
|
-
url.pathname = '/queries/' + query
|
|
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 ('
|
|
316
|
+
if (typeof query === 'string') {
|
|
333
317
|
body = vars;
|
|
334
318
|
} else {
|
|
335
319
|
body = { query: query.query, variables: vars };
|
package/src/queries/gql.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
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
|
-
):
|
|
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 (
|
|
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;
|
package/src/queries/index.ts
CHANGED
|
@@ -1,14 +1,11 @@
|
|
|
1
1
|
import Queries, {
|
|
2
|
-
|
|
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
|
|
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,
|
|
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
|
-
|
|
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
|
-
> =
|
|
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> =
|
|
100
|
-
*
|
|
101
|
-
* entry
|
|
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<
|
package/src/queries/vars.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
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,
|
|
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,
|
|
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,
|
|
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
|
-
| '
|
|
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)
|
|
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: '
|
|
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 {
|
package/src/server/Request.ts
CHANGED
|
@@ -33,8 +33,8 @@ export default class ServerRequest extends Request {
|
|
|
33
33
|
*
|
|
34
34
|
* @example
|
|
35
35
|
* ```js
|
|
36
|
-
* router.get('/blog/:slug', async
|
|
37
|
-
* return Response.json({ 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: '
|
|
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;
|