109 lines
2.9 KiB
TypeScript
109 lines
2.9 KiB
TypeScript
import react from '@vitejs/plugin-react';
|
|
import { type UserConfig, defineConfig, loadEnv } from 'vite';
|
|
import webExtension, { readJsonFile } from 'vite-plugin-web-extension';
|
|
import tsconfigPaths from 'vite-tsconfig-paths';
|
|
|
|
// Browser types
|
|
const BROWSER_TYPES = {
|
|
CHROME: 'chrome',
|
|
FIREFOX: 'firefox',
|
|
BRAVE: 'brave',
|
|
} as const;
|
|
|
|
type BrowserType = (typeof BROWSER_TYPES)[keyof typeof BROWSER_TYPES];
|
|
|
|
export default defineConfig(({ mode }): UserConfig => {
|
|
const env = loadEnv(mode, process.cwd(), '');
|
|
const browser = (env.BROWSER || BROWSER_TYPES.CHROME) as BrowserType;
|
|
|
|
const isBrave = browser === BROWSER_TYPES.BRAVE;
|
|
|
|
// Validate Brave binary
|
|
if (env.NODE_ENV === 'development' && isBrave && !env.BRAVE_BINARY) {
|
|
// oxlint-disable-next-line no-console
|
|
console.error(`
|
|
⚛️ React Scan
|
|
==============
|
|
🚫 Error: BRAVE_BINARY environment variable is missing
|
|
|
|
This is required for Brave browser development.
|
|
Please check .env.example and set up your .env file with the correct path:
|
|
|
|
📍 For macOS:
|
|
BRAVE_BINARY="/Applications/Brave Browser.app/Contents/MacOS/Brave Browser"
|
|
|
|
📍 For Windows:
|
|
BRAVE_BINARY="C:\\Program Files\\BraveSoftware\\Brave-Browser\\Application\\brave.exe"
|
|
|
|
📍 For Linux:
|
|
BRAVE_BINARY="/usr/bin/brave"
|
|
===============
|
|
`);
|
|
process.exit(0);
|
|
}
|
|
|
|
// Get browser binary based on type
|
|
const getBrowserBinary = () => {
|
|
switch (browser) {
|
|
case BROWSER_TYPES.FIREFOX:
|
|
return env.FIREFOX_BINARY;
|
|
case BROWSER_TYPES.BRAVE:
|
|
return env.BRAVE_BINARY || env.CHROME_BINARY;
|
|
case BROWSER_TYPES.CHROME:
|
|
return env.CHROME_BINARY;
|
|
default:
|
|
return env.CHROME_BINARY;
|
|
}
|
|
};
|
|
|
|
// Generate manifest with package info
|
|
const generateManifest = () => {
|
|
const manifestPath =
|
|
browser === BROWSER_TYPES.FIREFOX
|
|
? 'src/manifest.firefox.json'
|
|
: 'src/manifest.chrome.json';
|
|
|
|
const manifest = readJsonFile(manifestPath);
|
|
const pkg = readJsonFile('package.json');
|
|
|
|
return {
|
|
name: pkg.name,
|
|
description: pkg.description,
|
|
...manifest,
|
|
version: pkg.version,
|
|
};
|
|
};
|
|
|
|
// Vite configuration
|
|
return {
|
|
build: {
|
|
minify: 'esbuild' as const,
|
|
},
|
|
esbuild: {
|
|
keepNames: true,
|
|
minifyIdentifiers: false,
|
|
},
|
|
plugins: [
|
|
react(),
|
|
tsconfigPaths(),
|
|
webExtension({
|
|
manifest: generateManifest,
|
|
// Use Chrome config for Brave
|
|
webExtConfig: {
|
|
target: isBrave
|
|
? 'chromium'
|
|
: browser === 'firefox'
|
|
? 'firefox-desktop'
|
|
: 'chromium',
|
|
chromiumBinary: getBrowserBinary(),
|
|
firefoxBinary: env.FIREFOX_BINARY,
|
|
startUrl: ['https://github.com/aidenybai/react-scan'],
|
|
},
|
|
}),
|
|
],
|
|
optimizeDeps: {
|
|
exclude: ['react-scan'],
|
|
},
|
|
};
|
|
});
|