mirror of
https://github.com/CherryHQ/cherry-studio.git
synced 2025-12-26 03:31:24 +08:00
* build: add eslint-plugin-oxlint dependency Add new eslint plugin to enhance linting capabilities with oxlint rules * build(eslint): add oxlint plugin to eslint config Add oxlint plugin as recommended in the documentation to enhance linting capabilities * build: add oxlint v1.15.0 as a dependency * build: add oxlint to linting commands Add oxlint alongside eslint in test:lint and lint scripts for enhanced static analysis * build: add oxlint configuration file Configure oxlint with a comprehensive set of rules for JavaScript/TypeScript code quality checks * chore: update oxlint configuration and related settings - Add oxc to editor code actions on save - Update oxlint configs to use eslint, typescript, and unicorn presets - Extend ignore patterns in oxlint configuration - Simplify oxlint command in package.json scripts - Add oxlint-tsgolint dependency * fix: lint warning * chore: update oxlintrc from eslint.recommended * refactor(lint): update eslint and oxlint configurations - Add src/preload to eslint ignore patterns - Update oxlint env to es2022 and add environment overrides - Adjust several lint rule severities and configurations * fix: lint error * fix(file): replace eslint-disable with oxlint-disable in sanitizeFilename The linter was changed from ESLint to oxlint, so the directive needs to be updated accordingly. * fix: enforce stricter linting by failing on warnings in test:lint script * feat: add recommended ts-eslint rules into exlint * docs: remove outdated comment in oxlint config file * style: disable typescript/no-require-imports rule in oxlint config * docs(utils): fix comment typo from NODE to NOTE * fix(MessageErrorBoundary): correct error description display condition The error description was incorrectly showing in production and hiding in development. Fix the logic to show detailed errors only in development mode * chore: add oxc-vscode extension to recommended list * ci(workflows): reorder format check step in pr-ci.yml * chore: update yarn.lock
82 lines
2.1 KiB
TypeScript
82 lines
2.1 KiB
TypeScript
import fs from 'node:fs'
|
|
import fsAsync from 'node:fs/promises'
|
|
import path from 'node:path'
|
|
|
|
import { app } from 'electron'
|
|
|
|
export function getResourcePath() {
|
|
return path.join(app.getAppPath(), 'resources')
|
|
}
|
|
|
|
export function getDataPath() {
|
|
const dataPath = path.join(app.getPath('userData'), 'Data')
|
|
if (!fs.existsSync(dataPath)) {
|
|
fs.mkdirSync(dataPath, { recursive: true })
|
|
}
|
|
return dataPath
|
|
}
|
|
|
|
export function getInstanceName(baseURL: string) {
|
|
try {
|
|
return new URL(baseURL).host.split('.')[0]
|
|
} catch (error) {
|
|
return ''
|
|
}
|
|
}
|
|
|
|
export function debounce(func: (...args: any[]) => void, wait: number, immediate: boolean = false) {
|
|
let timeout: NodeJS.Timeout | null = null
|
|
return function (...args: any[]) {
|
|
if (timeout) clearTimeout(timeout)
|
|
if (immediate) {
|
|
func(...args)
|
|
} else {
|
|
timeout = setTimeout(() => func(...args), wait)
|
|
}
|
|
}
|
|
}
|
|
|
|
// NOTE: It's an unused function. localStorage should not be accessed in main process.
|
|
// export function dumpPersistState() {
|
|
// const persistState = JSON.parse(localStorage.getItem('persist:cherry-studio') || '{}')
|
|
// for (const key in persistState) {
|
|
// persistState[key] = JSON.parse(persistState[key])
|
|
// }
|
|
// return JSON.stringify(persistState)
|
|
// }
|
|
|
|
export const runAsyncFunction = async (fn: () => void) => {
|
|
await fn()
|
|
}
|
|
|
|
export function makeSureDirExists(dir: string) {
|
|
if (!fs.existsSync(dir)) {
|
|
fs.mkdirSync(dir, { recursive: true })
|
|
}
|
|
}
|
|
|
|
export async function calculateDirectorySize(directoryPath: string): Promise<number> {
|
|
let totalSize = 0
|
|
const items = await fsAsync.readdir(directoryPath)
|
|
|
|
for (const item of items) {
|
|
const itemPath = path.join(directoryPath, item)
|
|
const stats = await fsAsync.stat(itemPath)
|
|
|
|
if (stats.isFile()) {
|
|
totalSize += stats.size
|
|
} else if (stats.isDirectory()) {
|
|
totalSize += await calculateDirectorySize(itemPath)
|
|
}
|
|
}
|
|
return totalSize
|
|
}
|
|
|
|
export const removeEnvProxy = (env: Record<string, string>) => {
|
|
delete env.HTTPS_PROXY
|
|
delete env.HTTP_PROXY
|
|
delete env.grpc_proxy
|
|
delete env.http_proxy
|
|
delete env.https_proxy
|
|
}
|