diff --git a/src/Umbraco.Web.UI.Client/.eslintignore b/src/Umbraco.Web.UI.Client/.eslintignore deleted file mode 100644 index 0e94763217..0000000000 --- a/src/Umbraco.Web.UI.Client/.eslintignore +++ /dev/null @@ -1,9 +0,0 @@ -.eslintrc.js -/types -dist -dist-cms -schemas -temp-schema-generator -APP_PLUGINS -/src/external/router-slot -/examples diff --git a/src/Umbraco.Web.UI.Client/.eslintrc.json b/src/Umbraco.Web.UI.Client/.eslintrc.json deleted file mode 100644 index db94153396..0000000000 --- a/src/Umbraco.Web.UI.Client/.eslintrc.json +++ /dev/null @@ -1,105 +0,0 @@ -{ - "ignorePatterns": ["vite.*.ts", "src/external/**/*.ts"], - "root": true, - "plugins": ["import", "eslint-plugin-local-rules"], - "parserOptions": { - "ecmaVersion": "latest" - }, - "env": { - "es6": true - }, - "overrides": [ - { - "files": ["**/*.ts"], - "extends": [ - "eslint:recommended", - "plugin:import/recommended", - "plugin:import/typescript", - "plugin:@typescript-eslint/eslint-recommended", - "plugin:@typescript-eslint/recommended", - "plugin:wc/recommended", - "plugin:lit/recommended", - "plugin:lit-a11y/recommended", - "plugin:storybook/recommended", - "prettier" - ], - "parser": "@typescript-eslint/parser", - "parserOptions": { - "project": "./tsconfig.json", - "tsconfigRootDir": "./", - "ecmaVersion": "latest", - "sourceType": "module" - }, - "env": { - "browser": true, - "es2021": true - }, - "rules": { - "no-var": "error", - "import/no-unresolved": "off", - "import/order": "warn", - "import/no-self-import": "error", - "import/no-cycle": ["error", { "maxDepth": 6, "allowUnsafeDynamicCyclicDependency": true }], - "local-rules/bad-type-import": "error", - "local-rules/enforce-element-suffix-on-element-class-name": "error", - "local-rules/enforce-umb-prefix-on-element-name": "error", - "local-rules/ensure-relative-import-use-js-extension": "error", - "local-rules/no-direct-api-import": "warn", - "local-rules/prefer-import-aliases": "error", - "local-rules/prefer-static-styles-last": "warn", - "local-rules/umb-class-prefix": "error", - "local-rules/no-relative-import-to-import-map-module": "error", - "local-rules/enforce-umbraco-external-imports": [ - "error", - { - "exceptions": ["@umbraco-cms", "@open-wc/testing", "@storybook", "msw", ".", "vite"] - } - ], - "local-rules/exported-string-constant-naming": [ - "error", - { - "excludedFileNames": ["umbraco-package", "input-tiny-mce.defaults"] // TODO: what to do about the tiny mce defaults? - } - ], - "@typescript-eslint/no-non-null-assertion": "off", - "@typescript-eslint/no-explicit-any": "warn", - "@typescript-eslint/no-unused-vars": "warn", - "@typescript-eslint/consistent-type-exports": "error", - "@typescript-eslint/consistent-type-imports": "error", - "@typescript-eslint/no-import-type-side-effects": "warn" - }, - "settings": { - "import/parsers": { - "@typescript-eslint/parser": [".ts"] - }, - "import/resolver": { - "typescript": { - "alwaysTryTypes": true, - "project": "./tsconfig.json" - } - } - } - }, - { - "files": ["**/*.js"], - "extends": ["eslint:recommended", "plugin:import/recommended", "prettier"], - "env": { - "node": true, - "browser": true, - "es6": true - }, - "parserOptions": { - "sourceType": "module", - "ecmaVersion": "latest" - }, - "settings": { - "import/resolver": { - "node": { - "extensions": [".js"], - "moduleDirectory": ["node_modules"] - } - } - } - } - ] -} diff --git a/src/Umbraco.Web.UI.Client/eslint.config.js b/src/Umbraco.Web.UI.Client/eslint.config.js new file mode 100644 index 0000000000..73d94eff90 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/eslint.config.js @@ -0,0 +1,90 @@ +import js from "@eslint/js"; +import globals from "globals"; +import importPlugin from "eslint-plugin-import"; +import localRules from "eslint-plugin-local-rules"; +import wcPlugin from "eslint-plugin-wc"; +import litPlugin from "eslint-plugin-lit"; +import litA11yPlugin from "eslint-plugin-lit-a11y"; +import storybookPlugin from "eslint-plugin-storybook"; +import eslintPluginPrettierRecommended from 'eslint-plugin-prettier/recommended'; +import tseslint from 'typescript-eslint'; + +export default [ + // Recommended config applied to all files + js.configs.recommended, + ...tseslint.configs.recommended, + eslintPluginPrettierRecommended, + + // Global ignores + { + ignores: ["**/rollup.config.js", "**/vite.config.ts", "src/external/router-slot", "src/packages/core/icon-registry/icons", "src/packages/core/icon-registry/icons.ts"], + }, + + // Global config + { + languageOptions: { + parserOptions: { + project: true, + tsconfigRootDir: import.meta.dirname, + }, + globals: { + ...globals.browser, + } + }, + plugins: { + import: importPlugin, + "local-rules": localRules, + "wc": wcPlugin, + "lit": litPlugin, + "lit-a11y": litA11yPlugin, + "storybook": storybookPlugin + }, + rules: { + semi: ["warn", "always"], + "no-unused-vars": "warn", + "no-var": "error", + "import/no-unresolved": "off", + "import/order": "warn", + "import/no-self-import": "error", + "import/no-cycle": ["error", { "maxDepth": 6, "allowUnsafeDynamicCyclicDependency": true }], + "local-rules/bad-type-import": "error", + "local-rules/enforce-element-suffix-on-element-class-name": "error", + "local-rules/enforce-umb-prefix-on-element-name": "error", + "local-rules/ensure-relative-import-use-js-extension": "error", + "local-rules/no-direct-api-import": "warn", + "local-rules/prefer-import-aliases": "error", + "local-rules/prefer-static-styles-last": "warn", + "local-rules/umb-class-prefix": "error", + "local-rules/no-relative-import-to-import-map-module": "error", + "local-rules/enforce-umbraco-external-imports": [ + "error", + { + "exceptions": ["@umbraco-cms", "@open-wc/testing", "@storybook", "msw", ".", "vite"] + } + ], + "local-rules/exported-string-constant-naming": [ + "error", + { + "excludedFileNames": ["umbraco-package", "input-tiny-mce.defaults"] // TODO: what to do about the tiny mce defaults? + } + ], + "@typescript-eslint/no-non-null-assertion": "off", + "@typescript-eslint/no-explicit-any": "warn", + "@typescript-eslint/no-unused-vars": "warn", + "@typescript-eslint/consistent-type-exports": "error", + "@typescript-eslint/consistent-type-imports": "error", + "@typescript-eslint/no-import-type-side-effects": "warn" + } + }, + + // Pattern-specific overrides + { + files: ['**/*.js'], + ...tseslint.configs.disableTypeChecked, + languageOptions: { + globals: { + ...globals.node, + } + } + }, +];