2025-08-30 08:52:35 +08:00

161 lines
4.1 KiB
TypeScript

import { is } from '@electron-toolkit/utils'
import { existsSync, mkdirSync } from 'fs'
import { app } from 'electron'
import path from 'path'
export const homeDir = app.getPath('home')
export function isPortable(): boolean {
return existsSync(path.join(exeDir(), 'PORTABLE'))
}
export function dataDir(): string {
if (isPortable()) {
return path.join(exeDir(), 'data')
} else {
return app.getPath('userData')
}
}
export function taskDir(): string {
const userDataDir = app.getPath('userData')
// 确保 userData 目录存在
if (!existsSync(userDataDir)) {
mkdirSync(userDataDir, { recursive: true })
}
const dir = path.join(userDataDir, 'tasks')
if (!existsSync(dir)) {
mkdirSync(dir, { recursive: true })
}
return dir
}
export function subStoreDir(): string {
return path.join(dataDir(), 'substore')
}
export function exeDir(): string {
return path.dirname(exePath())
}
export function exePath(): string {
return app.getPath('exe')
}
export function resourcesDir(): string {
if (is.dev) {
return path.join(__dirname, '../../extra')
} else {
if (app.getAppPath().endsWith('asar')) {
return process.resourcesPath
} else {
return path.join(app.getAppPath(), 'resources')
}
}
}
export function resourcesFilesDir(): string {
return path.join(resourcesDir(), 'files')
}
export function themesDir(): string {
return path.join(dataDir(), 'themes')
}
export function mihomoCoreDir(): string {
return path.join(resourcesDir(), 'sidecar')
}
export function mihomoCorePath(core: string): string {
const isWin = process.platform === 'win32'
// 处理 Smart 内核
if (core === 'mihomo-smart') {
return path.join(mihomoCoreDir(), `mihomo-smart${isWin ? '.exe' : ''}`)
}
return path.join(mihomoCoreDir(), `${core}${isWin ? '.exe' : ''}`)
}
export function appConfigPath(): string {
return path.join(dataDir(), 'config.yaml')
}
export function controledMihomoConfigPath(): string {
return path.join(dataDir(), 'mihomo.yaml')
}
export function profileConfigPath(): string {
return path.join(dataDir(), 'profile.yaml')
}
export function profilesDir(): string {
return path.join(dataDir(), 'profiles')
}
export function profilePath(id: string): string {
return path.join(profilesDir(), `${id}.yaml`)
}
export function overrideDir(): string {
return path.join(dataDir(), 'override')
}
export function overrideConfigPath(): string {
return path.join(dataDir(), 'override.yaml')
}
export function overridePath(id: string, ext: 'js' | 'yaml' | 'log'): string {
return path.join(overrideDir(), `${id}.${ext}`)
}
export function mihomoWorkDir(): string {
return path.join(dataDir(), 'work')
}
export function mihomoProfileWorkDir(id: string | undefined): string {
return path.join(mihomoWorkDir(), id || 'default')
}
export function mihomoTestDir(): string {
return path.join(dataDir(), 'test')
}
export function mihomoWorkConfigPath(id: string | undefined): string {
if (id === 'work') {
return path.join(mihomoWorkDir(), 'config.yaml')
} else {
return path.join(mihomoProfileWorkDir(id), 'config.yaml')
}
}
export function logDir(): string {
return path.join(dataDir(), 'logs')
}
export function logPath(): string {
const date = new Date()
const year = date.getFullYear()
const month = String(date.getMonth() + 1).padStart(2, '0')
const day = String(date.getDate()).padStart(2, '0')
const name = `clash-party-${year}-${month}-${day}`
return path.join(logDir(), `${name}.log`)
}
export function substoreLogPath(): string {
const date = new Date()
const year = date.getFullYear()
const month = String(date.getMonth() + 1).padStart(2, '0')
const day = String(date.getDate()).padStart(2, '0')
const name = `sub-store-${year}-${month}-${day}`
return path.join(logDir(), `${name}.log`)
}
export function coreLogPath(): string {
const date = new Date()
const year = date.getFullYear()
const month = String(date.getMonth() + 1).padStart(2, '0')
const day = String(date.getDate()).padStart(2, '0')
const name = `core-${year}-${month}-${day}`
return path.join(logDir(), `${name}.log`)
}