From 741d35db1ec9e558fa42d3f56d1a211f3dda60f2 Mon Sep 17 00:00:00 2001 From: vcoppe Date: Sun, 18 Oct 2026 16:53:39 +0200 Subject: [PATCH] sparse desktop build --- tauri/tauri.conf.json | 2 +- website/package.json | 1 + website/src/hooks.server.js | 7 +++++- website/svelte.config.js | 7 +++++- website/vite.config.ts | 45 +++++++++++++++++++++++++++++++++++-- 5 files changed, 57 insertions(+), 5 deletions(-) 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(), + ], });