import { resolve } from "path";
import { defineConfig, BuildOptions } from "vite";
import react from "@vitejs/plugin-react";
import dts from "vite-plugin-dts";
import tsconfigPaths from "vite-tsconfig-paths";

// https://vitejs.dev/config/
export default defineConfig(({ mode }) => {
  let buildOptions: { watch: BuildOptions["watch"] };
  let emptyOutDir = true;
  if (mode.includes("watch")) {
    emptyOutDir = false;
    buildOptions = {
      watch: {
        include: ["src/**/*"],
      },
    };

    if (mode.includes("polling")) {
      buildOptions = {
        watch: {
          ...buildOptions.watch,
          chokidar: {
            usePolling: true,
            interval: 1000,
          },
        },
      };
    }
  }

  return {
    build: {
      emptyOutDir,
      outDir: "dist",
      sourcemap: true,
      lib: {
        entry: {
          index: "./src/index.ts",
        },
        formats: ["es", "cjs"],
      },
      rollupOptions: {
        external: ["react", "react-dom"],
        output: {
          globals: {
            react: "React",
            "react-dom": "ReactDOM",
          },
        },
      },
      copyPublicDir: false,
      ...buildOptions,
    },
    plugins: [
      tsconfigPaths(),
      dts({
        rollupTypes: true,
        beforeWriteFile: (filePath, content) => {
          return {
            filePath,
            content: content.replace("../../locales", "./locales"),
          };
        },
      }),
      react(),
    ],
    test: {
      environment: "jsdom",
      reporters: "verbose",
      globals: true,
      watchExclude: ["**/cunningham-tokens.js"],
      coverage: {
        all: true,
        include: ["src/**/*.{ts,tsx}"],
        exclude: ["**/*.stories.tsx", "**/*.spec.tsx"],
      },
      globalSetup: ["src/tests/Global.ts"],
      setupFiles: ["src/tests/Setup.ts"],
    },
    resolve: {
      alias: [
        {
          find: ":",
          replacement: resolve(__dirname, "./src"),
        },
      ],
    },
  };
});
