diff --git a/tauri/tauri.conf.json b/tauri/tauri.conf.json
index c644349aa..95424c8d4 100644
--- a/tauri/tauri.conf.json
+++ b/tauri/tauri.conf.json
@@ -6,7 +6,7 @@
"build": {
"beforeDevCommand": "npm --prefix ../website run dev -- --port 4283",
"devUrl": "http://localhost:4283",
- "beforeBuildCommand": "BASE_PATH='' npm --prefix ../website run build",
+ "beforeBuildCommand": "npm --prefix ../website run build:desktop",
"frontendDist": "../website/build"
},
"app": {
diff --git a/website/package.json b/website/package.json
index f4a51d1e3..2415d3ca0 100644
--- a/website/package.json
+++ b/website/package.json
@@ -5,6 +5,7 @@
"scripts": {
"dev": "vite dev",
"build": "vite build",
+ "build:desktop": "BUILD_TARGET=desktop BASE_PATH='' vite build",
"prebuild": "npx tsx src/lib/scripts/pwa-manifest.ts",
"postbuild": "npx tsx src/lib/scripts/sitemap.ts",
"preview": "vite preview",
diff --git a/website/src/hooks.server.js b/website/src/hooks.server.js
index 7441e52c7..fbf839d5a 100644
--- a/website/src/hooks.server.js
+++ b/website/src/hooks.server.js
@@ -46,8 +46,13 @@ export async function handle({ event, resolve }) {
-
+ `;
+
+ // the manifests are made for the website, not for the desktop app (`npm run build:desktop`)
+ if (process.env.BUILD_TARGET !== 'desktop') {
+ headTag += `
`;
+ }
if (page !== '404') {
for (let lang of Object.keys(languages)) {
diff --git a/website/svelte.config.js b/website/svelte.config.js
index 07e954378..3ea6526b2 100644
--- a/website/svelte.config.js
+++ b/website/svelte.config.js
@@ -7,6 +7,9 @@ const mdsvexOptions = {
extensions: ['.mdx'],
};
+/** Whether the website is built for the desktop app (`npm run build:desktop`), which only has the app. */
+const desktop = process.env.BUILD_TARGET === 'desktop';
+
/** @type {import('@sveltejs/kit').Config} */
const config = {
extensions: ['.svelte', ...mdsvexOptions.extensions],
@@ -23,7 +26,9 @@ const config = {
relative: false,
},
prerender: {
- crawl: true,
+ // the desktop app only has the pages of the app, the others are left empty (vite.config.ts)
+ crawl: !desktop,
+ handleUnseenRoutes: desktop ? 'ignore' : 'fail',
},
},
};
diff --git a/website/vite.config.ts b/website/vite.config.ts
index 05677b2bd..0fdebafa5 100644
--- a/website/vite.config.ts
+++ b/website/vite.config.ts
@@ -1,9 +1,50 @@
import { sveltekit } from '@sveltejs/kit/vite';
import { enhancedImages } from '@sveltejs/enhanced-img';
-import { defineConfig } from 'vite';
+import { defineConfig, type Plugin } from 'vite';
import tailwindcss from '@tailwindcss/vite';
import wasm from 'vite-plugin-wasm';
+/** Whether the website is built for the desktop app (`npm run build:desktop`), which only has the app. */
+const desktop = process.env.BUILD_TARGET === 'desktop';
+
+/** The pages of the website, which the desktop app opens on gpx.studio: home, help and embed. */
+const websitePage = /\/src\/routes\/\[\[language\]\]\/(\+page\.|help\/|embed\/)/;
+
+/** The help guides, which the server imports too (for the titles of the pages). */
+const guide = /\/src\/lib\/docs\/.*\.mdx$/;
+
+/**
+ * For the desktop app, empties the pages of the website, the help guides and the WebAssembly engine
+ * (the app has its own), so that their code, images and the module are not in the build.
+ */
+function desktopBuild(): Plugin {
+ return {
+ name: 'desktop-build',
+ enforce: 'pre',
+ load(id) {
+ const path = id.split('?')[0];
+ if (websitePage.test(path)) {
+ // no entries: the page is not prerendered
+ return path.endsWith('.server.ts') ? 'export const entries = () => [];' : '';
+ }
+ if (guide.test(path)) {
+ return "---\ntitle: ''\n---\n";
+ }
+ if (path.endsWith('/src/lib/engine/backend/wasm.ts')) {
+ return `export async function createWasmBackend() {
+ throw new Error('The desktop app has no WebAssembly engine');
+ }`;
+ }
+ },
+ };
+}
+
export default defineConfig({
- plugins: [enhancedImages(), tailwindcss(), wasm(), sveltekit()],
+ plugins: [
+ ...(desktop ? [desktopBuild()] : []),
+ enhancedImages(),
+ tailwindcss(),
+ wasm(),
+ sveltekit(),
+ ],
});