import { defineConfig, transformWithEsbuild } from "vite"; import react from "@vitejs/plugin-react"; import { VitePWA } from "vite-plugin-pwa"; import path from "path"; export default defineConfig({ plugins: [ { name: "load-js-files-as-jsx", enforce: "pre", async transform(code, id) { if (!id.match(/src\/.*\.js$/)) return null; return transformWithEsbuild(code, id, { loader: "jsx", jsx: "automatic", }); }, }, react({ fastRefresh: true, include: /\.js$/, jsxRuntime: "automatic", }), VitePWA({ registerType: "autoUpdate", includeAssets: [ "favicon.ico", "android-chrome-192x192.png", "android-chrome-512x512.png", "apple-touch-icon.png", "logo192.png", "logo512.png", ], manifest: { short_name: "سامانه رصدیار", name: "سامانه رصدیار", icons: [ { src: "/android-chrome-192x192.png", sizes: "192x192", type: "image/png", }, { src: "/android-chrome-512x512.png", sizes: "512x512", type: "image/png", }, ], start_url: ".", display: "standalone", theme_color: "#000000", background_color: "#ffffff", }, workbox: { globPatterns: [ "**/*.{js,css,html,ico,png,svg,jpg,jpeg,webp,woff,woff2}", ], runtimeCaching: [ { urlPattern: /^https:\/\/.*\.(?:png|jpg|jpeg|svg|gif|webp)$/, handler: "CacheFirst", options: { cacheName: "images-cache", expiration: { maxEntries: 100, maxAgeSeconds: 60 * 60 * 24 * 30, }, }, }, ], }, }), ], preview: { allowedHosts: ["rasadyar.com", "rasadyar.net", "rasadyar.ir", "dev.rasadyar.com"], }, // Resolve configuration resolve: { alias: { "@": path.resolve(__dirname, "./src"), }, }, server: { port: 3000, open: true, host: true, hmr: { overlay: true, }, watch: { usePolling: false, interval: 100, }, }, build: { outDir: "build", sourcemap: false, chunkSizeWarningLimit: 1000, rollupOptions: { output: { manualChunks: { "react-vendor": ["react", "react-dom", "react-router-dom"], "mui-vendor": [ "@mui/material", "@mui/icons-material", "@mui/lab", "@emotion/react", "@emotion/styled", ], "redux-vendor": ["@reduxjs/toolkit", "react-redux", "redux-persist"], "chart-vendor": [ "chart.js", "react-chartjs-2", "echarts", "echarts-for-react", ], }, }, }, }, optimizeDeps: { include: [ "react", "react-dom", "react-router-dom", "@mui/material", "@mui/icons-material", "@reduxjs/toolkit", "react-redux", ], esbuildOptions: { loader: { ".js": "jsx", }, jsx: "automatic", }, }, define: { "process.env": {}, }, });