import { sentryVitePlugin } from "@sentry/vite-plugin"; import { defineConfig, loadEnv, type Plugin } from "vite"; import react from "@vitejs/plugin-react"; import cssInjectedByJsPlugin from "vite-plugin-css-injected-by-js"; import { readFileSync } from "fs"; let version: string; let packageName: string; try { const packageJson = JSON.parse(readFileSync("./package.json", "utf8")); version = packageJson.version; packageName = packageJson.name; } catch (error) { console.error("Error reading package.json:", error); throw error; } const CDN_BASE_URL = `https://cdn.jsdelivr.net/npm/${packageName}@${version}/dist/`; function fixFontUrlsInCSS(baseUrl: string, buildMode: string): Plugin { return { name: "fix-font-urls-in-css", enforce: "post", generateBundle(_options, bundle) { Object.keys(bundle).forEach((fileName) => { const file = bundle[fileName]; if (file.type === "chunk" && fileName.endsWith(".js")) { // Handle: url(../fonts/Estedad-Thin.woff2) -> url(baseUrl + fonts/Estedad-Thin.woff2) file.code = file.code.replace( /url\(\.\.\/fonts\/([^)]+)\)/g, `url(${baseUrl}fonts/$1)` ); // Handle: url(./fonts/Estedad-Thin.woff2) -> url(baseUrl + fonts/Estedad-Thin.woff2) file.code = file.code.replace( /url\(\.\/fonts\/([^)]+)\)/g, `url(${baseUrl}fonts/$1)` ); // Handle: url(fonts/Estedad-Thin.woff2) -> url(baseUrl + fonts/Estedad-Thin.woff2) file.code = file.code.replace( /url\(fonts\/([^)]+)\)/g, `url(${baseUrl}fonts/$1)` ); } }); }, }; } export default defineConfig(({ mode }) => { const isWordPress = process.env.VITE_IS_WORDPRESS === "true"; const fontPath = isWordPress ? CDN_BASE_URL : // ? "~/.wp-content/plugins/dori-chatbot/assets/js/" CDN_BASE_URL; return { define: { '__VITE_IS_DEV_MODE__': JSON.stringify(false), '__VITE_ENVIRONMENT__': JSON.stringify(process.env.VITE_MODE || 'production') }, plugins: [ react(), cssInjectedByJsPlugin(), sentryVitePlugin({ org: "mori-style-sentry-test", project: "mori-widget", url: "https://sentry.hamravesh.com/", }), fixFontUrlsInCSS(fontPath, isWordPress ? "wordpress" : "cdn"), ], resolve: { alias: { "@": "/src", "~": "/src", }, }, build: { cssCodeSplit: false, assetsInlineLimit: 1024, outDir: "dist", assetsDir: "assets", rollupOptions: { treeshake: { moduleSideEffects: false, propertyReadSideEffects: false, tryCatchDeoptimization: false, unknownGlobalSideEffects: false, annotations: true, }, input: { widget: "/src/unified-widget.ts", }, output: { format: "es", entryFileNames: "[name].js", chunkFileNames: "assets/[name]-[hash].js", assetFileNames: (assetInfo) => { if (assetInfo.name && assetInfo.name.indexOf(".woff2") !== -1) { return "fonts/[name].[ext]"; } return "assets/[name].[ext]"; }, }, }, sourcemap: false, minify: "terser", terserOptions: { compress: { drop_console: true, drop_debugger: true, pure_funcs: [ "console.log", "console.info", "console.debug", "console.warn", ], passes: 2, }, mangle: { safari10: true, }, format: { comments: false, }, }, }, experimental: { renderBuiltUrl(filename, { hostType: _hostType }) { return { relative: true }; }, }, }; });