Presupuestador_web/client/vite.config.ts
2026-10-14 12:00:19 +02:00

96 lines
2.5 KiB
TypeScript

import react from "@vitejs/plugin-react";
import { readFileSync } from "fs";
import { createRequire } from "node:module";
import { randomUUID } from "node:crypto";
import path from "node:path";
import { defineConfig, normalizePath } from "vite";
import { robots } from "vite-plugin-robots";
import { viteStaticCopy } from "vite-plugin-static-copy";
const pkg = JSON.parse(readFileSync("./package.json", "utf-8"));
const require = createRequire(import.meta.url);
const buildId = randomUUID();
const htmlTranslations: Array<{
language: string;
labels: { title: string; javascript_required: string };
}> = ["es", "en", "fr", "ca"].map((language) => ({
language,
labels: JSON.parse(readFileSync(`./src/locales/${language}.json`, "utf8")).translation.app,
}));
const escapeHtml = (value: string) =>
value.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
const pdfjsDistPath = path.dirname(require.resolve("pdfjs-dist/package.json"));
const cMapsDir = normalizePath(path.join(pdfjsDistPath, "cmaps"));
const standardFontsDir = normalizePath(
path.join(path.dirname(require.resolve("pdfjs-dist/package.json")), "standard_fonts")
);
export default defineConfig({
define: {
__APP_VERSION__: JSON.stringify(pkg.version),
__APP_BUILD_ID__: JSON.stringify(buildId),
},
build: {
outDir: "../dist/client",
emptyOutDir: true,
},
plugins: [
{
name: "localized-html",
transformIndexHtml(html) {
return html
.replace("<!-- app-title -->", escapeHtml(htmlTranslations[0].labels.title))
.replace(
"<!-- app-noscript -->",
htmlTranslations
.map(({ language, labels }) =>
`<p lang="${language}">${escapeHtml(labels.javascript_required)}</p>`
)
.join("\n")
);
},
},
{
name: "app-build-version",
apply: "build",
generateBundle() {
this.emitFile({
type: "asset",
fileName: "version.json",
source: JSON.stringify({ buildId }),
});
},
},
react(),
robots({}),
viteStaticCopy({
targets: [
{
src: cMapsDir,
dest: "",
},
{
src: standardFontsDir,
dest: "",
},
],
}),
],
css: { postcss: "./postcss.config.js" },
resolve: {
alias: [
{
find: "@",
replacement: path.resolve(__dirname, "./src"),
},
{
find: "@shared",
replacement: path.resolve(__dirname, "../shared/lib/"),
},
],
},
});