From 422f9420170307cad5c9a49e24462b443aebc504 Mon Sep 17 00:00:00 2001 From: snomiao Date: Wed, 15 Oct 2025 06:14:52 +0000 Subject: [PATCH 1/2] [feat] Add oxlint before eslint for faster linting MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Install oxlint and eslint-plugin-oxlint - Configure oxlint with recommended unicorn rules - Update lint scripts to run oxlint before eslint - Add eslint-plugin-oxlint to disable conflicting rules - Add standalone oxlint and oxlint:fix scripts This provides a faster feedback loop during development while maintaining full ESLint compatibility for advanced rules. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- .oxlintrc.json | 37 +++++++++++++++ eslint.config.ts | 2 + package.json | 12 +++-- pnpm-lock.yaml | 109 ++++++++++++++++++++++++++++++++++++++++++++ pnpm-workspace.yaml | 2 + 5 files changed, 158 insertions(+), 4 deletions(-) create mode 100644 .oxlintrc.json diff --git a/.oxlintrc.json b/.oxlintrc.json new file mode 100644 index 0000000000..e5b0d24fd7 --- /dev/null +++ b/.oxlintrc.json @@ -0,0 +1,37 @@ +{ + "$schema": "./node_modules/oxlint/configuration_schema.json", + "rules": { + "typescript/no-explicit-any": "off", + "typescript/no-unused-vars": "off", + "unicorn/prefer-at": "warn", + "unicorn/prefer-string-slice": "warn", + "unicorn/prefer-code-point": "warn", + "unicorn/prefer-date-now": "warn", + "unicorn/prefer-dom-node-text-content": "warn", + "unicorn/prefer-includes": "warn", + "unicorn/prefer-modern-dom-apis": "warn", + "unicorn/prefer-node-protocol": "warn", + "unicorn/prefer-number-properties": "warn", + "unicorn/prefer-optional-catch-binding": "warn", + "unicorn/prefer-string-starts-ends-with": "warn", + "unicorn/throw-new-error": "warn" + }, + "ignore": [ + "node_modules", + "dist", + "build", + ".storybook", + "storybook-static", + ".i18nrc.cjs", + "components.d.ts", + "lint-staged.config.js", + "vitest.setup.ts", + "**/vite.config.*.timestamp*", + "**/vitest.config.*.timestamp*", + "packages/registry-types/src/comfyRegistryTypes.ts", + "src/extensions/core/*", + "src/scripts/*", + "src/types/generatedManagerTypes.ts", + "src/types/vue-shim.d.ts" + ] +} diff --git a/eslint.config.ts b/eslint.config.ts index 2a4d219a91..aea4bdd01a 100644 --- a/eslint.config.ts +++ b/eslint.config.ts @@ -3,6 +3,7 @@ import pluginJs from '@eslint/js' import pluginI18n from '@intlify/eslint-plugin-vue-i18n' import { createTypeScriptImportResolver } from 'eslint-import-resolver-typescript' import { importX } from 'eslint-plugin-import-x' +import oxlint from 'eslint-plugin-oxlint' import eslintPluginPrettierRecommended from 'eslint-plugin-prettier/recommended' import storybook from 'eslint-plugin-storybook' import tailwind from 'eslint-plugin-tailwindcss' @@ -105,6 +106,7 @@ export default defineConfig([ importX.flatConfigs.recommended, // @ts-expect-error Bad types in the plugin importX.flatConfigs.typescript, + oxlint.configs['flat/recommended'], { plugins: { 'unused-imports': unusedImports, diff --git a/package.json b/package.json index e424b3fab9..993de55f0d 100644 --- a/package.json +++ b/package.json @@ -27,12 +27,14 @@ "json-schema": "tsx scripts/generate-json-schema.ts", "knip:no-cache": "knip", "knip": "knip --cache", - "lint:fix:no-cache": "eslint src --fix", - "lint:fix": "eslint src --cache --fix", - "lint:no-cache": "eslint src", + "lint:fix:no-cache": "oxlint && eslint src --fix", + "lint:fix": "oxlint && eslint src --cache --fix", + "lint:no-cache": "oxlint && eslint src", "lint:unstaged:fix": "git diff --name-only HEAD | grep -E '\\.(js|ts|vue|mts)$' | xargs -r eslint --cache --fix", "lint:unstaged": "git diff --name-only HEAD | grep -E '\\.(js|ts|vue|mts)$' | xargs -r eslint --cache", - "lint": "eslint src --cache", + "lint": "oxlint && eslint src --cache", + "oxlint": "oxlint", + "oxlint:fix": "oxlint --fix", "locale": "lobe-i18n locale", "preinstall": "pnpm dlx only-allow pnpm", "prepare": "husky || true && git config blame.ignoreRevsFile .git-blame-ignore-revs || true", @@ -76,6 +78,7 @@ "eslint-config-prettier": "catalog:", "eslint-import-resolver-typescript": "catalog:", "eslint-plugin-import-x": "catalog:", + "eslint-plugin-oxlint": "catalog:", "eslint-plugin-prettier": "catalog:", "eslint-plugin-storybook": "catalog:", "eslint-plugin-tailwindcss": "catalog:", @@ -92,6 +95,7 @@ "markdown-table": "catalog:", "mixpanel-browser": "catalog:", "nx": "catalog:", + "oxlint": "catalog:", "picocolors": "catalog:", "postcss-html": "catalog:", "prettier": "catalog:", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index eb38350f7f..f59d1aa935 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -147,6 +147,9 @@ catalogs: eslint-plugin-import-x: specifier: ^4.16.1 version: 4.16.1 + eslint-plugin-oxlint: + specifier: ^1.23.0 + version: 1.23.0 eslint-plugin-prettier: specifier: ^5.5.4 version: 5.5.4 @@ -195,6 +198,9 @@ catalogs: nx: specifier: 21.4.1 version: 21.4.1 + oxlint: + specifier: ^1.23.0 + version: 1.23.0 picocolors: specifier: ^1.1.1 version: 1.1.1 @@ -564,6 +570,9 @@ importers: eslint-plugin-import-x: specifier: 'catalog:' version: 4.16.1(@typescript-eslint/utils@8.44.0(eslint@9.35.0(jiti@2.4.2))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.35.0(jiti@2.4.2)) + eslint-plugin-oxlint: + specifier: 'catalog:' + version: 1.23.0 eslint-plugin-prettier: specifier: 'catalog:' version: 5.5.4(eslint-config-prettier@10.1.8(eslint@9.35.0(jiti@2.4.2)))(eslint@9.35.0(jiti@2.4.2))(prettier@3.6.2) @@ -612,6 +621,9 @@ importers: nx: specifier: 'catalog:' version: 21.4.1 + oxlint: + specifier: 'catalog:' + version: 1.23.0 picocolors: specifier: 'catalog:' version: 1.1.1 @@ -2541,6 +2553,46 @@ packages: cpu: [x64] os: [win32] + '@oxlint/darwin-arm64@1.23.0': + resolution: {integrity: sha512-sbxoftgEMKmZQO7O4wHR9Rs7MfiHa2UH2x4QJDoc4LXqSCsI4lUIJbFQ05vX+zOUbt7CQMPdxEzExd4DqeKY2w==} + cpu: [arm64] + os: [darwin] + + '@oxlint/darwin-x64@1.23.0': + resolution: {integrity: sha512-PjByWr1TlwHQiOqEc8CPyXCT4wnujSK3n9l1m4un0Eh0uLJEDG5WM9tyDWOGuakC0Ika9/SMp0HDRg3ySchRRA==} + cpu: [x64] + os: [darwin] + + '@oxlint/linux-arm64-gnu@1.23.0': + resolution: {integrity: sha512-sWlCwQ6xKeKC08qU3SfozqpRGCLJiO/onPYFJKEHbjzHkFp+OubOacFaT4ePcka28jCU1TvQ7Gi5BVQRncr0Xg==} + cpu: [arm64] + os: [linux] + + '@oxlint/linux-arm64-musl@1.23.0': + resolution: {integrity: sha512-MPkmSiezuVgjMbzDSkRhENdnb038JOI+OTpBrOho2crbCAuqSRvyFwkMRhncJGZskzo1yeKxrKXB8T83ofmSXw==} + cpu: [arm64] + os: [linux] + + '@oxlint/linux-x64-gnu@1.23.0': + resolution: {integrity: sha512-F6H9wmLfjBoNqtsgyg3P9abLnkVjNbCAnISKdRtDl7HvkMs4s/eU8np9+tSnqPeKOTBhkS+h/VSWgPGZTqIWQA==} + cpu: [x64] + os: [linux] + + '@oxlint/linux-x64-musl@1.23.0': + resolution: {integrity: sha512-Xra0Cow35mAku8mbUbviPRalTU4Ct6MXQ1Eue8GmN4HFkjosrNa5qfy7QkJBqzjiI+JdnHxPXwackGn92/XOQw==} + cpu: [x64] + os: [linux] + + '@oxlint/win32-arm64@1.23.0': + resolution: {integrity: sha512-FR+I+uGD3eFzTfBw87QRr+Y1jBYil3TqPM0wkSvuf3gOJTEXAfSkh9QHCgQqrseW3HDW7YJJ8ty1+sU31H/N4g==} + cpu: [arm64] + os: [win32] + + '@oxlint/win32-x64@1.23.0': + resolution: {integrity: sha512-/oX0b26YIC1OgS5B+G8Ux1Vs/PIjOP4CBRzsPpYr0T+RoboJ3ZuV32bztLRggJKQqIlozcqiRo9fl/UMOMp8kQ==} + cpu: [x64] + os: [win32] + '@phenomnomnominal/tsquery@5.0.1': resolution: {integrity: sha512-3nVv+e2FQwsW8Aw6qTU6f+1rfcJ3hrcnvH/mu9i8YhxO+9sqbOfpL8m6PbET5+xKOlz/VSbp0RoYWYCtIsnmuA==} peerDependencies: @@ -4679,6 +4731,9 @@ packages: '@typescript-eslint/parser': optional: true + eslint-plugin-oxlint@1.23.0: + resolution: {integrity: sha512-YT/ObCQMluSHVEqDJPwrVLERkUUQnmcRYYQbB7h6t2P4243WE3Z1UmUcPy1Q6vSVP/U7vw5affptlGV2RizDuw==} + eslint-plugin-prettier@5.5.4: resolution: {integrity: sha512-swNtI95SToIz05YINMA6Ox5R057IMAmWZ26GqPxusAp1TZzj+IdY9tXNWWD3vkF/wEqydCONcwjTFpxybBqZsg==} engines: {node: ^14.18.0 || >=16.0.0} @@ -5634,6 +5689,9 @@ packages: jsonc-parser@3.2.0: resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + jsonc-parser@3.3.1: + resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} + jsondiffpatch@0.6.0: resolution: {integrity: sha512-3QItJOXp2AP1uv7waBkao5nCvhEv+QmJAd38Ybq7wNI74Q+BBmnLn4EDKz6yI9xGAIQoUF87qHt+kc1IVxB4zQ==} engines: {node: ^18.0.0 || >=20.0.0} @@ -6316,6 +6374,16 @@ packages: oxc-resolver@11.6.1: resolution: {integrity: sha512-WQgmxevT4cM5MZ9ioQnEwJiHpPzbvntV5nInGAKo9NQZzegcOonHvcVcnkYqld7bTG35UFHEKeF7VwwsmA3cZg==} + oxlint@1.23.0: + resolution: {integrity: sha512-cLVdSE7Bza8npm+PffU0oufs15+M5uSMbQn0k2fJCayWU0xqQ3dyA3w9tEk8lgNOk1j1VJEdYctz64Vik8VG1w==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + oxlint-tsgolint: '>=0.2.0' + peerDependenciesMeta: + oxlint-tsgolint: + optional: true + p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} @@ -10010,6 +10078,30 @@ snapshots: '@oxc-resolver/binding-win32-x64-msvc@11.6.1': optional: true + '@oxlint/darwin-arm64@1.23.0': + optional: true + + '@oxlint/darwin-x64@1.23.0': + optional: true + + '@oxlint/linux-arm64-gnu@1.23.0': + optional: true + + '@oxlint/linux-arm64-musl@1.23.0': + optional: true + + '@oxlint/linux-x64-gnu@1.23.0': + optional: true + + '@oxlint/linux-x64-musl@1.23.0': + optional: true + + '@oxlint/win32-arm64@1.23.0': + optional: true + + '@oxlint/win32-x64@1.23.0': + optional: true + '@phenomnomnominal/tsquery@5.0.1(typescript@5.9.2)': dependencies: esquery: 1.6.0 @@ -12362,6 +12454,10 @@ snapshots: - supports-color optional: true + eslint-plugin-oxlint@1.23.0: + dependencies: + jsonc-parser: 3.3.1 + eslint-plugin-prettier@5.5.4(eslint-config-prettier@10.1.8(eslint@9.35.0(jiti@2.4.2)))(eslint@9.35.0(jiti@2.4.2))(prettier@3.6.2): dependencies: eslint: 9.35.0(jiti@2.4.2) @@ -13419,6 +13515,8 @@ snapshots: jsonc-parser@3.2.0: {} + jsonc-parser@3.3.1: {} + jsondiffpatch@0.6.0: dependencies: '@types/diff-match-patch': 1.0.36 @@ -14376,6 +14474,17 @@ snapshots: '@oxc-resolver/binding-win32-ia32-msvc': 11.6.1 '@oxc-resolver/binding-win32-x64-msvc': 11.6.1 + oxlint@1.23.0: + optionalDependencies: + '@oxlint/darwin-arm64': 1.23.0 + '@oxlint/darwin-x64': 1.23.0 + '@oxlint/linux-arm64-gnu': 1.23.0 + '@oxlint/linux-arm64-musl': 1.23.0 + '@oxlint/linux-x64-gnu': 1.23.0 + '@oxlint/linux-x64-musl': 1.23.0 + '@oxlint/win32-arm64': 1.23.0 + '@oxlint/win32-x64': 1.23.0 + p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index a7e91efdcf..e4aa6448e8 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -50,6 +50,7 @@ catalog: eslint-config-prettier: ^10.1.8 eslint-import-resolver-typescript: ^4.4.4 eslint-plugin-import-x: ^4.16.1 + eslint-plugin-oxlint: ^1.23.0 eslint-plugin-prettier: ^5.5.4 eslint-plugin-storybook: ^9.1.6 eslint-plugin-tailwindcss: 4.0.0-beta.0 @@ -65,6 +66,7 @@ catalog: lint-staged: ^15.2.7 markdown-table: ^3.0.4 nx: 21.4.1 + oxlint: ^1.23.0 picocolors: ^1.1.1 pinia: ^2.1.7 postcss-html: ^1.8.0 From 04416254d7cc5ac39acf5dc37ec2ce09a9f71d64 Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Sun, 26 Oct 2025 09:03:48 +0000 Subject: [PATCH 2/2] [automated] Apply ESLint and Prettier fixes --- src/composables/graph/useMoreOptionsMenu.ts | 2 +- src/lib/litegraph/src/ContextMenu.ts | 4 ++-- src/lib/litegraph/src/LGraphCanvas.ts | 5 ++--- src/lib/litegraph/src/LGraphNode.ts | 3 +-- src/utils/searchAndReplace.ts | 1 - 5 files changed, 6 insertions(+), 9 deletions(-) diff --git a/src/composables/graph/useMoreOptionsMenu.ts b/src/composables/graph/useMoreOptionsMenu.ts index fcf8ab8c7d..45ea6eb1f2 100644 --- a/src/composables/graph/useMoreOptionsMenu.ts +++ b/src/composables/graph/useMoreOptionsMenu.ts @@ -125,7 +125,7 @@ export function useMoreOptionsMenu() { const menuOptions = computed((): MenuOption[] => { // Reference selection flags to ensure re-computation when they change - // eslint-disable-next-line @typescript-eslint/no-unused-expressions + optionsVersion.value const states = computeSelectionFlags() diff --git a/src/lib/litegraph/src/ContextMenu.ts b/src/lib/litegraph/src/ContextMenu.ts index 40aed5c091..dc858da08f 100644 --- a/src/lib/litegraph/src/ContextMenu.ts +++ b/src/lib/litegraph/src/ContextMenu.ts @@ -15,7 +15,7 @@ export interface ContextMenu { /** * ContextMenu from LiteGUI */ -// eslint-disable-next-line @typescript-eslint/no-unsafe-declaration-merging + export class ContextMenu { options: IContextMenuOptions parentMenu?: ContextMenu @@ -274,7 +274,7 @@ export class ContextMenu { } // menu option clicked - // eslint-disable-next-line @typescript-eslint/no-this-alias + const that = this function inner_onclick(this: ContextMenuDivElement, e: MouseEvent) { const value = this.value diff --git a/src/lib/litegraph/src/LGraphCanvas.ts b/src/lib/litegraph/src/LGraphCanvas.ts index 4bac984027..820b5a1384 100644 --- a/src/lib/litegraph/src/LGraphCanvas.ts +++ b/src/lib/litegraph/src/LGraphCanvas.ts @@ -6484,7 +6484,7 @@ export class LGraphCanvas optPass || {} ) const dirty = () => this.#dirty() - // eslint-disable-next-line @typescript-eslint/no-this-alias + const that = this const { graph } = this const { afterRerouteId } = opts @@ -6686,7 +6686,6 @@ export class LGraphCanvas event: CanvasPointerEvent, multiline?: boolean ): HTMLDivElement { - // eslint-disable-next-line @typescript-eslint/no-this-alias const that = this title = title || '' @@ -6857,7 +6856,7 @@ export class LGraphCanvas Object.assign(options, searchOptions) // console.log(options); - // eslint-disable-next-line @typescript-eslint/no-this-alias + const that = this const graphcanvas = LGraphCanvas.active_canvas const { canvas } = graphcanvas diff --git a/src/lib/litegraph/src/LGraphNode.ts b/src/lib/litegraph/src/LGraphNode.ts index b65b0d7f49..b6082f8828 100644 --- a/src/lib/litegraph/src/LGraphNode.ts +++ b/src/lib/litegraph/src/LGraphNode.ts @@ -206,7 +206,6 @@ supported callbacks: + getExtraMenuOptions: to add option to context menu */ -// eslint-disable-next-line @typescript-eslint/no-unsafe-declaration-merging export interface LGraphNode { constructor: LGraphNodeConstructor } @@ -218,7 +217,7 @@ export interface LGraphNode { * @param title a name for the node * @param type a type for the node */ -// eslint-disable-next-line @typescript-eslint/no-unsafe-declaration-merging + export class LGraphNode implements NodeLike, Positionable, IPinnable, IColorable { diff --git a/src/utils/searchAndReplace.ts b/src/utils/searchAndReplace.ts index 1e9299c40d..6cdecd323b 100644 --- a/src/utils/searchAndReplace.ts +++ b/src/utils/searchAndReplace.ts @@ -48,7 +48,6 @@ export function applyTextReplacements( return match } return ((widget.value ?? '') + '').replaceAll( - // eslint-disable-next-line no-control-regex /[/?<>\\:*|"\x00-\x1F\x7F]/g, '_' )