Files
template-app/apps/web/vite.config.ts
T
2026-11-14 09:56:45 +00:00

55 lines
2.4 KiB
TypeScript

// SPDX-License-Identifier: LicenseRef-ConusAI-Template-1.0
// The web shell's build: TanStack Start on Vite (F10, docs/reference/app-kit.md). `vite build` writes
// `dist/client` (the browser's assets) and `dist/server/server.js` (the Start handler `server.mjs` serves).
//
// The workspace's own packages resolve to their source, as they do for `tsc` (tsconfig.paths.json), so a
// build needs no `build:libs` step first. The kit is left external, Vite's default: a kit package bundled with
// `ssr.noExternal` leaves bare imports of its own dependencies behind (`pg`, `@modelcontextprotocol/server`),
// which pnpm's strict `node_modules` does not resolve (M5, docs/how-to/use-the-kit-outside-the-template.md §3).
import { readFileSync } from "node:fs"
import { createRequire } from "node:module"
import { fileURLToPath } from "node:url"
import { tanstackStart } from "@tanstack/react-start/plugin/vite"
import react from "@vitejs/plugin-react"
import { defineConfig, type Plugin } from "vite"
const source = (path: string): string => fileURLToPath(new URL(path, import.meta.url))
/**
* The tab icon is the ConusAI mark: the bytes @conusai-kit/brand ships, at `/favicon.png`, the path `appBrand.logo`
* names. `dist/client` is what `server.mjs` serves before anything else, signed in or not. An app with a mark of its own
* names it in `config/src/brand.ts`.
*/
function brandFavicon(): Plugin {
const file = createRequire(import.meta.url).resolve("@conusai-kit/brand/logo/favicon.png")
return {
name: "app:brand-favicon",
configureServer(server) {
server.middlewares.use("/favicon.png", (_request, response) => {
response.setHeader("content-type", "image/png")
response.end(readFileSync(file))
})
},
generateBundle() {
if (this.environment.name === "client") {
this.emitFile({ type: "asset", fileName: "favicon.png", source: readFileSync(file) })
}
},
}
}
export default defineConfig({
resolve: {
alias: [
{ find: /^@app\/config$/, replacement: source("../../config/src/index.ts") },
{ find: /^@app\/config\/(.*)$/, replacement: source("../../config/src/$1") },
{ find: /^@app\/modules$/, replacement: source("../../modules/index.ts") },
{ find: /^@app\/modules\/(.*)$/, replacement: source("../../modules/$1") },
],
},
server: { port: 3510, strictPort: true },
build: { outDir: "dist" },
plugins: [tanstackStart(), react(), brandFavicon()],
})