mirror of
https://github.com/Comfy-Org/ComfyUI_frontend.git
synced 2026-07-19 02:06:38 +00:00
## Summary
Upgrade ESLint from v9 to v10.4.0, bump compatible plugins/configs, and
fix the 32 violations introduced by the new `eslint:recommended` rules.
## Changes
- **What**:
- Catalog bumps in `pnpm-workspace.yaml`:
- `eslint` 9.39.1 → 10.4.0
- `@eslint/js` 9.39.1 → 10.0.1
- `typescript-eslint` 8.49.0 → 8.60.0
- `eslint-plugin-vue` 10.6.2 → 10.9.1
- `eslint-plugin-import-x` 4.16.1 → 4.16.2
- `eslint-plugin-unused-imports` 4.3.0 → 4.4.1
- `@intlify/eslint-plugin-vue-i18n` 4.1.1 → 4.5.0
- Fixed 4 `preserve-caught-error` violations by passing `{ cause }` to
rethrown errors in `useMaskEditorLoader.ts` and `usePainter.ts`.
- Fixed 28 `no-useless-assignment` violations across litegraph
(`LGraph.ts`, `LGraphCanvas.ts`, `LiteGraphGlobal.ts`, `polyfills.ts`)
and seven other files (`colorUtil.ts`, `linkFixer.ts`, `usePaste.ts`,
`audioService.ts`, `versionUtil.ts`, `subscriptionCheckoutTracker.ts`,
`ShiftClick.test.ts`) by removing dead initializers or redundant writes.
- Removed two now-unnecessary `@ts-expect-error` directives on
`importX.flatConfigs.*` (newer plugin ships correct types).
- **Breaking**: None for runtime; consumers using ESLint locally must
use Node ≥20.19/22.13/24 (already required by repo `engines.node:
">=25"`).
## Review Focus
- Audit of the [v10 migration
guide](https://eslint.org/docs/latest/use/migrate-to-10.0.0) found no
other patterns in this codebase to address (no `eslint-env` comments, no
removed `context.*`/`SourceCode` APIs, no `RuleTester` usage, no
affected rule configs).
- `no-useless-assignment` fixes were chosen conservatively: prefer
keeping the variable with a typed declaration over deleting the
statement, except where the assignment was clearly dead after the last
read.
- Per-file diffs in litegraph (especially `LGraphCanvas.ts`) — worth a
glance to confirm intent.
## Verification
- `pnpm exec eslint --version` → v10.4.0
- `pnpm exec eslint src` → 0 errors
- `pnpm typecheck` → clean
- Unit tests for every touched file pass (319/319 in spot checks:
`colorUtil`, `linkFixer`, `audioService`, `usePaste`, `usePainter`,
`versionUtil`, `LGraph`, `litegraph`, all `LGraphCanvas.*`,
`ShiftClick`).
Co-authored-by: Amp <amp@ampcode.com>
84 lines
2.1 KiB
TypeScript
84 lines
2.1 KiB
TypeScript
import { register } from 'extendable-media-recorder'
|
|
import { connect } from 'extendable-media-recorder-wav-encoder'
|
|
|
|
import { useToastStore } from '@/platform/updates/common/toastStore'
|
|
import { api } from '@/scripts/api'
|
|
|
|
export interface AudioRecordingError {
|
|
type: 'permission' | 'not_supported' | 'encoder' | 'recording' | 'unknown'
|
|
message: string
|
|
originalError?: unknown
|
|
}
|
|
|
|
let isEncoderRegistered: boolean = false
|
|
|
|
export const useAudioService = () => {
|
|
const handleError = (
|
|
type: AudioRecordingError['type'],
|
|
message: string,
|
|
originalError?: unknown
|
|
) => {
|
|
console.error(`Audio Service Error (${type}):`, message, originalError)
|
|
}
|
|
|
|
const stopAllTracks = (currentStream: MediaStream | null) => {
|
|
if (currentStream) {
|
|
currentStream.getTracks().forEach((track) => {
|
|
track.stop()
|
|
})
|
|
}
|
|
}
|
|
|
|
const registerWavEncoder = async (): Promise<void> => {
|
|
if (isEncoderRegistered) {
|
|
return
|
|
}
|
|
|
|
try {
|
|
await register(await connect())
|
|
isEncoderRegistered = true
|
|
} catch (err) {
|
|
if (
|
|
err instanceof Error &&
|
|
err.message.includes('already an encoder stored')
|
|
) {
|
|
isEncoderRegistered = true
|
|
} else {
|
|
handleError('encoder', 'Failed to register WAV encoder', err)
|
|
}
|
|
}
|
|
}
|
|
|
|
const convertBlobToFileAndSubmit = async (blob: Blob): Promise<string> => {
|
|
const name = `recording-${Date.now()}.wav`
|
|
const file = new File([blob], name, { type: blob.type || 'audio/wav' })
|
|
|
|
const body = new FormData()
|
|
body.append('image', file)
|
|
body.append('subfolder', 'audio')
|
|
body.append('type', 'temp')
|
|
|
|
const resp = await api.fetchApi('/upload/image', {
|
|
method: 'POST',
|
|
body
|
|
})
|
|
|
|
if (resp.status !== 200) {
|
|
const err = `Error uploading temp file: ${resp.status} - ${resp.statusText}`
|
|
useToastStore().addAlert(err)
|
|
throw new Error(err)
|
|
}
|
|
|
|
const tempAudio = await resp.json()
|
|
|
|
return `audio/${tempAudio.name} [temp]`
|
|
}
|
|
|
|
return {
|
|
// Methods
|
|
convertBlobToFileAndSubmit,
|
|
registerWavEncoder,
|
|
stopAllTracks
|
|
}
|
|
}
|