import { defineConfig, externalizeDepsPlugin } from 'electron-vite'import react from '@vitejs/plugin-react'import { readFileSync } from 'fs'import { resolve } from 'path'import type { Plugin } from 'vite' // Read all production dependencies from package.json// so they get bundled into the main process output.// This avoids pnpm symlink issues with electron-builder's asar packaging.const pkg = JSON.parse(readFileSync(resolve(__dirname, 'package.json'), 'utf-8'))const prodDeps = Object.keys(pkg.dependencies || {}) // Rollup plugin: stub out native .node addon imports with empty modules.// ssh2 and cpu-features use optional native bindings that can't be bundled,// but they have pure JS fallbacks when the native module isn't available.function nativeModuleStub(): Plugin { const STUB_ID = '\0native-stub' return { name: 'native-module-stub', resolveId(source) { if (source.endsWith('.node')) return STUB_ID return null }, load(id) { if (id === STUB_ID) return 'export default {}' return null } }} export default defineConfig({ main: { plugins: [ externalizeDepsPlugin({ exclude: prodDeps }), nativeModuleStub() ], resolve: { alias: { '@main': resolve(__dirname, 'src/main'), '@shared': resolve(__dirname, 'src/shared'), '@preload': resolve(__dirname, 'src/preload') } }, build: { outDir: 'dist-electron/main', rollupOptions: { input: { index: resolve(__dirname, 'src/main/index.ts') }, output: { // CJS format so bundled deps can use __dirname/require. // Use .cjs extension since package.json has "type": "module". format: 'cjs', entryFileNames: '[name].cjs' } } } }, preload: { plugins: [externalizeDepsPlugin()], resolve: { alias: { '@preload': resolve(__dirname, 'src/preload'), '@shared': resolve(__dirname, 'src/shared'), '@main': resolve(__dirname, 'src/main') } }, build: { outDir: 'dist-electron/preload', rollupOptions: { input: { index: resolve(__dirname, 'src/preload/index.ts') }, output: { format: 'cjs', entryFileNames: '[name].js' } } } }, renderer: { resolve: { alias: { '@renderer': resolve(__dirname, 'src/renderer'), '@shared': resolve(__dirname, 'src/shared'), '@main': resolve(__dirname, 'src/main') } }, plugins: [react()], build: { rollupOptions: { input: { index: resolve(__dirname, 'src/renderer/index.html') } } } }})
import { defineConfig, externalizeDepsPlugin } from 'electron-vite'
import react from '@vitejs/plugin-react'
import { readFileSync } from 'fs'
import { resolve } from 'path'
import type { Plugin } from 'vite'
// Read all production dependencies from package.json
// so they get bundled into the main process output.
// This avoids pnpm symlink issues with electron-builder's asar packaging.
const pkg = JSON.parse(readFileSync(resolve(__dirname, 'package.json'), 'utf-8'))
const prodDeps = Object.keys(pkg.dependencies || {})
// Rollup plugin: stub out native .node addon imports with empty modules.
// ssh2 and cpu-features use optional native bindings that can't be bundled,
// but they have pure JS fallbacks when the native module isn't available.
function nativeModuleStub(): Plugin {
const STUB_ID = '\0native-stub'
return {
name: 'native-module-stub',
resolveId(source) {
if (source.endsWith('.node')) return STUB_ID
return null
},
load(id) {
if (id === STUB_ID) return 'export default {}'
return null
}
}
}
export default defineConfig({
main: {
plugins: [
externalizeDepsPlugin({
exclude: prodDeps
}),
nativeModuleStub()
],
resolve: {
alias: {
'@main': resolve(__dirname, 'src/main'),
'@shared': resolve(__dirname, 'src/shared'),
'@preload': resolve(__dirname, 'src/preload')
}
},
build: {
outDir: 'dist-electron/main',
rollupOptions: {
input: {
index: resolve(__dirname, 'src/main/index.ts')
},
output: {
// CJS format so bundled deps can use __dirname/require.
// Use .cjs extension since package.json has "type": "module".
format: 'cjs',
entryFileNames: '[name].cjs'
}
}
}
},
preload: {
plugins: [externalizeDepsPlugin()],
resolve: {
alias: {
'@preload': resolve(__dirname, 'src/preload'),
'@shared': resolve(__dirname, 'src/shared'),
'@main': resolve(__dirname, 'src/main')
}
},
build: {
outDir: 'dist-electron/preload',
rollupOptions: {
input: {
index: resolve(__dirname, 'src/preload/index.ts')
},
output: {
format: 'cjs',
entryFileNames: '[name].js'
}
}
}
},
renderer: {
resolve: {
alias: {
'@renderer': resolve(__dirname, 'src/renderer'),
'@shared': resolve(__dirname, 'src/shared'),
'@main': resolve(__dirname, 'src/main')
}
},
plugins: [react()],
build: {
rollupOptions: {
input: {
index: resolve(__dirname, 'src/renderer/index.html')
}
}
}
}
})