mirror of
https://github.com/Comfy-Org/ComfyUI_frontend.git
synced 2026-03-05 13:10:24 +00:00
## Summary Enforce i18n import conventions via ESLint: Vue components must use `useI18n()`, non-composable `.ts` files must use the global `t` from `@/i18n`. ## Changes - **What**: Two new `no-restricted-imports` rules in `eslint.config.ts` (both `warn` severity for incremental migration). Removed the disabled `@/i18n--to-enable` placeholder from `.oxlintrc.json`. - `.vue` files: disallow importing `t`/`d`/`st`/`te` from `@/i18n` (37 existing violations to migrate) - Non-composable `.ts` files: disallow importing `useI18n` from `vue-i18n` (2 existing violations) - Composable `use*.ts`, test files, and `src/i18n.ts` are excluded from Rule 2 ## Review Focus - The rules are placed after `oxlint.buildFromOxlintConfigFile()` to re-enable ESLint's `no-restricted-imports` for these specific file scopes without conflicting with oxlint's base rule (which handles PrimeVue deprecations). - `warn` severity chosen so CI is not blocked while existing violations are migrated. ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-8701-feat-enforce-i18n-import-conventions-via-ESLint-2ff6d73d36508123b6f9edf2693fb5e0) by [Unito](https://www.unito.io) --------- Co-authored-by: Amp <amp@ampcode.com> Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
122 lines
3.8 KiB
JSON
122 lines
3.8 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": "off",
|
|
"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-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",
|
|
"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",
|
|
"vue/no-import-compiler-macros": "error",
|
|
"vue/no-dupe-keys": "error"
|
|
},
|
|
"overrides": [
|
|
{
|
|
"files": ["**/*.{stories,test,spec}.ts", "**/*.stories.vue"],
|
|
"rules": {
|
|
"no-console": "allow"
|
|
}
|
|
},
|
|
{
|
|
"files": ["browser_tests/**/*.ts"],
|
|
"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"
|
|
}
|
|
}
|
|
]
|
|
}
|