Ctrl K
ComunidadGuías…

vite.config.ts

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
// ========= Copyright 2025-2026 @ Eigent.ai All Rights Reserved. =========
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// ========= Copyright 2025-2026 @ Eigent.ai All Rights Reserved. =========

import react from '@vitejs/plugin-react';
import { execSync } from 'node:child_process';
import { readFileSync } from 'node:fs';
import path from 'node:path';
import { defineConfig, loadEnv } from 'vite';
import electron from 'vite-plugin-electron/simple';
import pkg from './package.json';

// Git hash of the last commit that touched server/ — used for stale-server detection.
// Set as VITE_ env var so Vite exposes it to import.meta.env automatically.
try {
  process.env.VITE_SERVER_CODE_HASH = execSync(
    'git log -1 --format=%H -- server/'
  )
    .toString()
    .trim();
} catch {
  // git not available (CI, packaged build, etc.)
}

// https://vitejs.dev/config/
export default defineConfig(({ command, mode }) => {
  const isServe = command === 'serve';
  const isBuild = command === 'build';
  const sourcemap = isServe || !!process.env.VSCODE_DEBUG;
  const env = loadEnv(mode, process.cwd(), '');
  return {
    resolve: {
      alias: {
        '@': path.join(__dirname, 'src'),
      },
    },
    optimizeDeps: {
      exclude: ['@stackframe/react'],
      force: true,
    },
    plugins: [
      react(),
      {
        name: 'eigent-backend-shutdown',
        apply: 'serve',
        configureServer(server) {
          if (!server.httpServer) return;
          // Only an active dev server owns backend shutdown. Reading the config
          // for validation must not install a process-wide signal handler.
          const onSigint = () => {
            try {
              const backend = path.join(__dirname, 'backend');
              const pid = readFileSync(backend + '/runtime/run.pid', 'utf-8');
              process.kill(parseInt(pid), 'SIGINT');
            } catch (e) {
              console.log('no pid file');
              console.log(e);
            }
          };
          process.on('SIGINT', onSigint);
          server.httpServer?.once('close', () => {
            process.off('SIGINT', onSigint);
          });
        },
      },
      electron({
        main: {
          // Shortcut of `build.lib.entry`
          entry: 'electron/main/index.ts',
          onstart(args) {
            if (process.env.VSCODE_DEBUG) {
              console.log(
                /* For `.vscode/.debug.script.mjs` */ '[startup] Electron App'
              );
            } else {
              args.startup();
            }
          },
          vite: {
            build: {
              sourcemap,
              minify: isBuild,
              outDir: 'dist-electron/main',
              // Clean only this target when Vite writes a build, never when
              // this config is evaluated by tests or other validation tools.
              emptyOutDir: true,
              rollupOptions: {
                external: Object.keys(
                  'dependencies' in pkg ? pkg.dependencies : {}
                ),
              },
            },
          },
        },
        preload: {
          // Shortcut of `build.rollupOptions.input`.
          // Preload scripts may contain Web assets, so use the `build.rollupOptions.input` instead `build.lib.entry`.
          input: 'electron/preload/index.ts',
          vite: {
            build: {
              sourcemap: sourcemap ? 'inline' : undefined, // #332
              minify: isBuild,
              outDir: 'dist-electron/preload',
              emptyOutDir: true,
              rollupOptions: {
                external: Object.keys(
                  'dependencies' in pkg ? pkg.dependencies : {}
                ),
              },
            },
          },
        },
        // Ployfill the Electron and Node.js API for Renderer process.
        // If you want use Node.js in Renderer process, the `nodeIntegration` needs to be enabled in the Main process.
        // See 👉 https://github.com/electron-vite/vite-plugin-electron-renderer
        renderer: {},
      }),
    ],
    server: {
      open: false,
      ...(process.env.VSCODE_DEBUG &&
        (() => {
          const url = new URL(pkg.debug.env.VITE_DEV_SERVER_URL);
          return {
            host: url.hostname,
            port: +url.port,
          };
        })()),
      proxy: env.VITE_PROXY_URL
        ? {
            '/api': {
              target: env.VITE_PROXY_URL,
              changeOrigin: true,
              ws: true,
            },
          }
        : undefined,
      clearScreen: false,
    },
  };
});