Files
warmbly/web/vite.config.ts
T

88 lines
3.2 KiB
TypeScript

import { defineConfig } from "vite";
import react from "@vitejs/plugin-react";
import path from "path";
import tailwindcss from "@tailwindcss/vite";
import { sentryVitePlugin } from "@sentry/vite-plugin";
// Source-map upload, and nothing else, is what the Sentry plugin does here.
//
// It is never a required build step: a fork, a self-host build or a local
// `pnpm build` sets none of these and the plugin is simply not in the plugin
// list, so nothing needs a Sentry account and nothing is uploaded. CI passes
// the token as a build secret only for the hosted release.
//
// Source maps are emitted only in that case too, so the shipped bundle is
// unchanged for everybody else, and `filesToDeleteAfterUpload` keeps the .map
// files out of the image once they have been sent.
const sentryAuthToken = process.env.SENTRY_AUTH_TOKEN;
const sentryOrg = process.env.SENTRY_ORG;
const sentryProject = process.env.SENTRY_PROJECT;
const uploadSourceMaps = Boolean(sentryAuthToken && sentryOrg && sentryProject);
const sentryPlugins = uploadSourceMaps
? [
sentryVitePlugin({
authToken: sentryAuthToken,
org: sentryOrg,
project: sentryProject,
release: { name: process.env.VITE_SENTRY_RELEASE },
sourcemaps: { filesToDeleteAfterUpload: ["dist/**/*.map"] },
telemetry: false,
}),
]
: [];
export default defineConfig({
plugins: [
react(),
tailwindcss(),
...sentryPlugins,
],
build: {
// Only when they are going to be uploaded: shipping them otherwise
// would hand every visitor the dashboard's original sources.
sourcemap: uploadSourceMaps,
},
resolve: {
alias: {
"@": path.resolve(__dirname, "./src"),
},
},
// Pre-bundle heavy deps so the first request to the dev server
// doesn't trigger a cold compile of axios/framer-motion/etc. This
// shaves ~300-500ms off the first paint locally.
optimizeDeps: {
include: [
"react",
"react-dom",
"react-router-dom",
"axios",
"framer-motion",
"@tanstack/react-query",
"@tanstack/react-query-devtools",
"react-hot-toast",
"lucide-react",
"@remixicon/react",
],
},
server: {
// Permit Tailscale MagicDNS names (and any extra hosts via
// VITE_ALLOWED_HOSTS) when the server is exposed with --host. Vite
// always allows IPs + localhost; this only adds named hosts, so it's
// inert for normal local dev. Lets `make web PUBLIC_HOST=<name>` work
// when reached at https://<host>.<tailnet>.ts.net.
allowedHosts: [".ts.net", ...(process.env.VITE_ALLOWED_HOSTS?.split(",").filter(Boolean) ?? [])],
// Warm up the most-mounted entry points before the user
// clicks them so navigation doesn't trigger a cold compile.
warmup: {
clientFiles: [
"./src/main.tsx",
"./src/app/app/layout.tsx",
"./src/app/app/emails/page.tsx",
"./src/app/app/campaigns/page.tsx",
"./src/app/app/contacts/page.tsx",
],
},
},
});