123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182 |
- import { defineConfig, loadEnv } from "vite";
- import react from "@vitejs/plugin-react";
- import svgrPlugin from "vite-plugin-svgr";
- import { ViteEjsPlugin } from "vite-plugin-ejs";
- import { VitePWA } from "vite-plugin-pwa";
- import checker from "vite-plugin-checker";
- // To load .env.local variables
- const envVars = loadEnv("", process.cwd());
- // https://vitejs.dev/config/
- export default defineConfig({
- server: {
- port: Number(envVars.VITE_APP_PORT || 3000),
- // open the browser
- open: true,
- },
- build: {
- outDir: "build",
- rollupOptions: {
- output: {
- // Creating separate chunk for locales except for en and percentages.json so they
- // can be cached at runtime and not merged with
- // app precache. en.json and percentages.json are needed for first load
- // or fallback hence not clubbing with locales so first load followed by offline mode works fine. This is how CRA used to work too.
- manualChunks(id) {
- if (
- id.includes("src/locales") &&
- id.match(/en.json|percentages.json/) === null
- ) {
- const index = id.indexOf("locales/");
- // Taking the substring after "locales/"
- return `locales/${id.substring(index + 8)}`;
- }
- },
- },
- },
- sourcemap: true,
- },
- plugins: [
- react(),
- checker({
- typescript: true,
- eslint:
- envVars.VITE_APP_ENABLE_ESLINT === "false"
- ? undefined
- : { lintCommand: 'eslint "./src/**/*.{js,ts,tsx}"' },
- overlay: {
- initialIsOpen: envVars.VITE_APP_COLLAPSE_OVERLAY === "false",
- badgeStyle: "margin-bottom: 4rem; margin-left: 1rem",
- },
- }),
- svgrPlugin(),
- ViteEjsPlugin(),
- VitePWA({
- registerType: "autoUpdate",
- devOptions: {
- /* set this flag to true to enable in Development mode */
- enabled: false,
- },
- workbox: {
- // Don't push fonts and locales to app precache
- globIgnores: ["fonts.css", "**/locales/**", "service-worker.js"],
- runtimeCaching: [
- {
- urlPattern: new RegExp("/.+.(ttf|woff2|otf)"),
- handler: "CacheFirst",
- options: {
- cacheName: "fonts",
- expiration: {
- maxEntries: 50,
- maxAgeSeconds: 60 * 60 * 24 * 90, // <== 90 days
- },
- },
- },
- {
- urlPattern: new RegExp("fonts.css"),
- handler: "StaleWhileRevalidate",
- options: {
- cacheName: "fonts",
- expiration: {
- maxEntries: 50,
- },
- },
- },
- {
- urlPattern: new RegExp("locales/[^/]+.js"),
- handler: "CacheFirst",
- options: {
- cacheName: "locales",
- expiration: {
- maxEntries: 50,
- maxAgeSeconds: 60 * 60 * 24 * 30, // <== 30 days
- },
- },
- },
- ],
- },
- manifest: {
- short_name: "Excalidraw",
- name: "Excalidraw",
- description:
- "Excalidraw is a whiteboard tool that lets you easily sketch diagrams that have a hand-drawn feel to them.",
- icons: [
- {
- src: "android-chrome-192x192.png",
- sizes: "192x192",
- type: "image/png",
- },
- {
- src: "apple-touch-icon.png",
- type: "image/png",
- sizes: "180x180",
- },
- ],
- start_url: "/",
- display: "standalone",
- theme_color: "#121212",
- background_color: "#ffffff",
- file_handlers: [
- {
- action: "/",
- accept: {
- "application/vnd.excalidraw+json": [".excalidraw"],
- },
- },
- ],
- share_target: {
- action: "/web-share-target",
- method: "POST",
- enctype: "multipart/form-data",
- params: {
- files: [
- {
- name: "file",
- accept: [
- "application/vnd.excalidraw+json",
- "application/json",
- ".excalidraw",
- ],
- },
- ],
- },
- },
- screenshots: [
- {
- src: "/screenshots/virtual-whiteboard.png",
- type: "image/png",
- sizes: "462x945",
- },
- {
- src: "/screenshots/wireframe.png",
- type: "image/png",
- sizes: "462x945",
- },
- {
- src: "/screenshots/illustration.png",
- type: "image/png",
- sizes: "462x945",
- },
- {
- src: "/screenshots/shapes.png",
- type: "image/png",
- sizes: "462x945",
- },
- {
- src: "/screenshots/collaboration.png",
- type: "image/png",
- sizes: "462x945",
- },
- {
- src: "/screenshots/export.png",
- type: "image/png",
- sizes: "462x945",
- },
- ],
- },
- }),
- ],
- publicDir: "./public",
- });
|