Inject the Umami tracking script into index.html via a build-only Vite plugin (apply: 'build'), so it loads on production but never on the dev server. Website id comes from PUBLIC_UMAMI_WEBSITE_ID with a fallback to the gethumanai.pl stats id. The SPA serves PL and EN from the same index.html, so both language versions get the tag. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
29 lines
1,004 B
TypeScript
29 lines
1,004 B
TypeScript
import { defineConfig, loadEnv, type Plugin } from 'vite'
|
|
import react from '@vitejs/plugin-react'
|
|
|
|
const UMAMI_SRC = 'https://stats.gethumanai.pl/script.js'
|
|
// Fallback website id, used when PUBLIC_UMAMI_WEBSITE_ID is not provided.
|
|
const UMAMI_FALLBACK_ID = 'f5a3fd87-5ae1-408d-85a6-7af588484d37'
|
|
|
|
// Injects the Umami analytics tag into <head>. `apply: 'build'` means it runs
|
|
// only for production builds (`vite build`) — never on the dev server.
|
|
function umami(websiteId: string): Plugin {
|
|
return {
|
|
name: 'inject-umami',
|
|
apply: 'build',
|
|
transformIndexHtml(html) {
|
|
const tag = `<script defer src="${UMAMI_SRC}" data-website-id="${websiteId}"></script>`
|
|
return html.replace('</head>', ` ${tag}\n </head>`)
|
|
},
|
|
}
|
|
}
|
|
|
|
// https://vitejs.dev/config/
|
|
export default defineConfig(({ mode }) => {
|
|
const env = loadEnv(mode, process.cwd(), '')
|
|
const websiteId = env.PUBLIC_UMAMI_WEBSITE_ID || UMAMI_FALLBACK_ID
|
|
return {
|
|
plugins: [react(), umami(websiteId)],
|
|
}
|
|
})
|