mirror of
https://github.com/Comfy-Org/ComfyUI_frontend.git
synced 2026-04-20 14:30:41 +00:00
## Summary Add eslint-plugin-playwright as an oxlint JS plugin scoped to browser_tests/, enforcing Playwright best practices at lint time. ## Changes - **What**: Configure eslint-plugin-playwright@2.10.1 via oxlint's alpha `jsPlugins` field (`.oxlintrc.json` override scoped to `browser_tests/**/*.ts`). 18 recommended rules + `prefer-native-locators` + `require-to-pass-timeout` at error severity. All 173 initial violations resolved (config, auto-fix, manual fixes). `no-force-option` set to off — 28 violations need triage (canvas overlay workarounds vs unnecessary force) in a dedicated PR. - **Dependencies**: `eslint-plugin-playwright@^2.10.1` (devDependency, required by oxlint jsPlugins at runtime) ## Review Focus - `.oxlintrc.json` override structure — this is the first use of oxlint's JS plugins alpha feature in this repo - Manual fixes in spec files: `waitForSelector` → `locator.waitFor`, deprecated page methods → locator equivalents, `toPass()` timeout additions - Compound CSS selectors replaced with `.and()` (Playwright native locator composition) to avoid `prefer-native-locators` suppressions - Lint script changes in `package.json` to include `browser_tests/` in oxlint targets --------- Co-authored-by: Amp <amp@ampcode.com> Co-authored-by: GitHub Action <action@github.com>
178 lines
5.9 KiB
JSON
178 lines
5.9 KiB
JSON
{
|
|
"$schema": "./node_modules/oxlint/configuration_schema.json",
|
|
"ignorePatterns": [
|
|
".i18nrc.cjs",
|
|
".nx/*",
|
|
"**/vite.config.*.timestamp*",
|
|
"**/vitest.config.*.timestamp*",
|
|
"components.d.ts",
|
|
"coverage/*",
|
|
"dist/*",
|
|
"packages/registry-types/src/comfyRegistryTypes.ts",
|
|
"playwright-report/*",
|
|
"src/extensions/core/*",
|
|
"src/scripts/*",
|
|
"src/types/generatedManagerTypes.ts",
|
|
"src/types/vue-shim.d.ts",
|
|
"test-results/*",
|
|
"vitest.setup.ts"
|
|
],
|
|
"plugins": [
|
|
"eslint",
|
|
"import",
|
|
"oxc",
|
|
"typescript",
|
|
"unicorn",
|
|
"vitest",
|
|
"vue"
|
|
],
|
|
"rules": {
|
|
"no-async-promise-executor": "off",
|
|
"no-console": [
|
|
"error",
|
|
{
|
|
"allow": ["warn", "error"]
|
|
}
|
|
],
|
|
"no-control-regex": "off",
|
|
"no-eval": "error",
|
|
"no-redeclare": "error",
|
|
"no-restricted-imports": [
|
|
"error",
|
|
{
|
|
"paths": [
|
|
{
|
|
"name": "primevue/calendar",
|
|
"message": "Calendar is deprecated in PrimeVue 4+. Use DatePicker instead: import DatePicker from 'primevue/datepicker'"
|
|
},
|
|
{
|
|
"name": "primevue/dropdown",
|
|
"message": "Dropdown is deprecated in PrimeVue 4+. Use Select instead: import Select from 'primevue/select'"
|
|
},
|
|
{
|
|
"name": "primevue/inputswitch",
|
|
"message": "InputSwitch is deprecated in PrimeVue 4+. Use ToggleSwitch instead: import ToggleSwitch from 'primevue/toggleswitch'"
|
|
},
|
|
{
|
|
"name": "primevue/overlaypanel",
|
|
"message": "OverlayPanel is deprecated in PrimeVue 4+. Use Popover instead: import Popover from 'primevue/popover'"
|
|
},
|
|
{
|
|
"name": "primevue/sidebar",
|
|
"message": "Sidebar is deprecated in PrimeVue 4+. Use Drawer instead: import Drawer from 'primevue/drawer'"
|
|
}
|
|
]
|
|
}
|
|
],
|
|
"no-unsafe-optional-chaining": "error",
|
|
"no-self-assign": "allow",
|
|
"no-unused-expressions": "off",
|
|
"no-unused-private-class-members": "off",
|
|
"no-useless-rename": "off",
|
|
"import/default": "error",
|
|
"import/export": "error",
|
|
"import/namespace": "error",
|
|
"import/no-duplicates": "error",
|
|
"import/consistent-type-specifier-style": ["error", "prefer-top-level"],
|
|
"jest/expect-expect": "off",
|
|
"jest/no-conditional-expect": "off",
|
|
"jest/no-disabled-tests": "off",
|
|
"jest/no-standalone-expect": "off",
|
|
"jest/valid-title": "off",
|
|
"typescript/no-this-alias": "off",
|
|
"typescript/no-unnecessary-parameter-property-assignment": "off",
|
|
"typescript/no-unsafe-declaration-merging": "off",
|
|
"typescript/no-unused-vars": "off",
|
|
"unicorn/no-empty-file": "off",
|
|
"vitest/require-mock-type-parameters": "off",
|
|
"unicorn/no-new-array": "off",
|
|
"unicorn/no-single-promise-in-promise-methods": "off",
|
|
"unicorn/no-useless-fallback-in-spread": "off",
|
|
"unicorn/no-useless-spread": "off",
|
|
"typescript/await-thenable": "off",
|
|
"typescript/no-base-to-string": "off",
|
|
"typescript/no-duplicate-type-constituents": "off",
|
|
"typescript/no-for-in-array": "off",
|
|
"typescript/no-meaningless-void-operator": "off",
|
|
"typescript/no-redundant-type-constituents": "off",
|
|
"typescript/restrict-template-expressions": "off",
|
|
"typescript/unbound-method": "off",
|
|
"typescript/no-floating-promises": "error",
|
|
"typescript/no-explicit-any": "error",
|
|
"typescript/no-import-type-side-effects": "error",
|
|
"typescript/no-empty-object-type": [
|
|
"error",
|
|
{
|
|
"allowInterfaces": "always"
|
|
}
|
|
],
|
|
"vue/no-import-compiler-macros": "error"
|
|
},
|
|
"overrides": [
|
|
{
|
|
"files": ["**/*.{stories,test,spec}.ts", "**/*.stories.vue"],
|
|
"rules": {
|
|
"no-console": "allow"
|
|
}
|
|
},
|
|
{
|
|
"files": ["browser_tests/**/*.ts"],
|
|
"jsPlugins": ["eslint-plugin-playwright"],
|
|
"rules": {
|
|
"typescript/no-explicit-any": "error",
|
|
"no-async-promise-executor": "error",
|
|
"no-control-regex": "error",
|
|
"no-useless-rename": "error",
|
|
"no-unused-private-class-members": "error",
|
|
"unicorn/no-empty-file": "error",
|
|
"playwright/consistent-spacing-between-blocks": "error",
|
|
"playwright/expect-expect": [
|
|
"error",
|
|
{
|
|
"assertFunctionNames": [
|
|
"recordMeasurement",
|
|
"logMeasurement",
|
|
"builderSaveAs"
|
|
],
|
|
"assertFunctionPatterns": [
|
|
"^expect",
|
|
"^assert",
|
|
"^verify",
|
|
"^searchAndExpect",
|
|
"waitForOpen",
|
|
"waitForClosed",
|
|
"waitForRequest"
|
|
]
|
|
}
|
|
],
|
|
"playwright/max-nested-describe": "error",
|
|
"playwright/no-duplicate-hooks": "error",
|
|
"playwright/no-element-handle": "error",
|
|
"playwright/no-eval": "error",
|
|
"playwright/no-focused-test": "error",
|
|
"playwright/no-force-option": "off",
|
|
"playwright/no-networkidle": "error",
|
|
"playwright/no-page-pause": "error",
|
|
"playwright/no-skipped-test": "error",
|
|
"playwright/no-unsafe-references": "error",
|
|
"playwright/no-unused-locators": "error",
|
|
"playwright/no-useless-await": "error",
|
|
"playwright/no-useless-not": "error",
|
|
"playwright/no-wait-for-navigation": "error",
|
|
"playwright/no-wait-for-selector": "error",
|
|
"playwright/no-wait-for-timeout": "error",
|
|
"playwright/prefer-hooks-on-top": "error",
|
|
"playwright/prefer-locator": "error",
|
|
"playwright/prefer-to-have-count": "error",
|
|
"playwright/prefer-to-have-length": "error",
|
|
"playwright/prefer-web-first-assertions": "error",
|
|
"playwright/prefer-native-locators": "error",
|
|
"playwright/require-to-pass-timeout": "error",
|
|
"playwright/valid-expect": "error",
|
|
"playwright/valid-expect-in-promise": "error",
|
|
"playwright/valid-title": "error"
|
|
}
|
|
}
|
|
]
|
|
}
|