diff --git a/.github/workflows/eslint.yml b/.github/workflows/quality.yml similarity index 88% rename from .github/workflows/eslint.yml rename to .github/workflows/quality.yml index d863c96a643..eb4243066db 100644 --- a/.github/workflows/eslint.yml +++ b/.github/workflows/quality.yml @@ -1,4 +1,4 @@ -name: ESLint +name: Biome Code Quality on: # Trigger the workflow on push or pull request, @@ -28,10 +28,14 @@ jobs: - name: Set up Node.js # Step to set up Node.js environment uses: actions/setup-node@v4 # Use the setup-node action version 4 with: - node-version: 20 # Specify Node.js version 20 + node-version-file: '.nvmrc' - name: Install Node.js dependencies # Step to install Node.js dependencies run: npm ci # Use 'npm ci' to install dependencies - + - name: eslint # Step to run linters run: npm run eslint-ci + + + - name: biome-lint # Step to run linters + run: npm run biome-ci diff --git a/biome.jsonc b/biome.jsonc index 06468290b0a..c5eabd155f0 100644 --- a/biome.jsonc +++ b/biome.jsonc @@ -1,52 +1,58 @@ { - "$schema": "https://biomejs.dev/schemas/1.9.4/schema.json", - "vcs": { - "enabled": false, - "clientKind": "git", - "useIgnoreFile": true, - "defaultBranch": "beta" - }, - "formatter": { - "enabled": false - }, - "files": { "ignoreUnknown": false, "ignore": [] }, - "organizeImports": { "enabled": false }, - "linter": { "enabled": true, "rules": { "recommended": false } }, - "javascript": { "formatter": { "quoteStyle": "double" } }, - "overrides": [ - { - "ignore": [ - "dist/*", - "build/*", - "coverage/*", - "public/*", - ".github/*", - "node_modules/*", - ".vscode/*" - ], - "include": ["src/**/*.{ts,tsx,js,jsx}", "test/**/*.{ts,tsx,js,jsx}"], - "javascript": { "globals": [] }, - "linter": { - "rules": { - "correctness": { - "noUndeclaredVariables": "off", - "noUnusedVariables": "error" - }, - "style": { - "noVar": "error", - "useBlockStatements": "error", - "useConst": "error", - "useImportType": "error" - }, - "suspicious": { "noDoubleEquals": "error" }, - "complexity": { "noExcessiveCognitiveComplexity": "warn"} - } - } - }, - { - "include": ["test/**/*.test.ts"], - "javascript": { "globals": [] }, - "linter": { "rules": {} } - } - ] + "$schema": "https://biomejs.dev/schemas/1.9.4/schema.json", + "vcs": { + "enabled": false, + "clientKind": "git", + "useIgnoreFile": true, + "defaultBranch": "beta" + }, + "formatter": { + "enabled": true, + "useEditorconfig": true + }, + "files": { + "ignoreUnknown": false, + "ignore": [ + "dist/*", + "build/*", + "coverage/*", + "public/*", + ".github/*", + "node_modules/*", + ".vscode/*" + ] + }, + "organizeImports": { "enabled": false }, + "linter": { + "enabled": true, + "rules": { + "recommended": true, + "correctness": { + "noUndeclaredVariables": "off", + "noUnusedVariables": "error" + }, + "style": { + "noVar": "error", + "useBlockStatements": "error", + "useConst": "error", + "useImportType": "error", + "useNamingConvention": "warn" + }, + "suspicious": { "noDoubleEquals": "error" }, + "complexity": { + "noExcessiveCognitiveComplexity": "warn", + "useSimplifiedLogicExpression": "warn" + } + } + }, + "javascript": { + "formatter": { "quoteStyle": "double", "arrowParentheses": "asNeeded" } + }, + "overrides": [ + { + "include": ["test/**/*.test.ts"], + "javascript": { "globals": [] }, + "linter": { "rules": {} } + } + ] } diff --git a/eslint.config.js b/eslint.config.js index e79395e1900..75604d4dcf6 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -17,37 +17,10 @@ export default [ '@typescript-eslint': tseslint }, rules: { - "eqeqeq": ["error", "always"], // Enforces the use of `===` and `!==` instead of `==` and `!=` - "indent": ["error", 2, { "SwitchCase": 1 }], // Enforces a 2-space indentation, enforces indentation of `case ...:` statements - "quotes": ["error", "double"], // Enforces the use of double quotes for strings - "no-var": "error", // Disallows the use of `var`, enforcing `let` or `const` instead "prefer-const": "error", // Enforces the use of `const` for variables that are never reassigned "no-undef": "off", // Disables the rule that disallows the use of undeclared variables (TypeScript handles this) - "@typescript-eslint/no-unused-vars": [ "error", { - "args": "none", // Allows unused function parameters. Useful for functions with specific signatures where not all parameters are always used. - "ignoreRestSiblings": true // Allows unused variables that are part of a rest property in object destructuring. Useful for excluding certain properties from an object while using the others. - }], - "eol-last": ["error", "always"], // Enforces at least one newline at the end of files - "@stylistic/ts/semi": ["error", "always"], // Requires semicolons for TypeScript-specific syntax - "semi": "off", // Disables the general semi rule for TypeScript files "no-extra-semi": ["error"], // Disallows unnecessary semicolons for TypeScript-specific syntax - "brace-style": "off", // Note: you must disable the base rule as it can report incorrect errors - "curly": ["error", "all"], // Enforces the use of curly braces for all control statements - "@stylistic/ts/brace-style": ["error", "1tbs"], // Enforces the following brace style: https://eslint.style/rules/js/brace-style#_1tbs - "no-trailing-spaces": ["error", { // Disallows trailing whitespace at the end of lines - "skipBlankLines": false, // Enforces the rule even on blank lines - "ignoreComments": false // Enforces the rule on lines containing comments - }], - "space-before-blocks": ["error", "always"], // Enforces a space before blocks - "keyword-spacing": ["error", { "before": true, "after": true }], // Enforces spacing before and after keywords - "comma-spacing": ["error", { "before": false, "after": true }], // Enforces spacing after commas "import-x/extensions": ["error", "never", { "json": "always" }], // Enforces no extension for imports unless json - "array-bracket-spacing": ["error", "always", { "objectsInArrays": false, "arraysInArrays": false }], // Enforces consistent spacing inside array brackets - "object-curly-spacing": ["error", "always", { "arraysInObjects": false, "objectsInObjects": false }], // Enforces consistent spacing inside braces of object literals, destructuring assignments, and import/export specifiers - "computed-property-spacing": ["error", "never" ], // Enforces consistent spacing inside computed property brackets - "space-infix-ops": ["error", { "int32Hint": false }], // Enforces spacing around infix operators - "no-multiple-empty-lines": ["error", { "max": 2, "maxEOF": 1, "maxBOF": 0 }], // Disallows multiple empty lines - "@typescript-eslint/consistent-type-imports": "error", // Enforces type-only imports wherever possible } }, { diff --git a/package.json b/package.json index f7df2b9ddd2..064994ebd95 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,8 @@ "typecheck": "tsc --noEmit", "eslint": "eslint --fix .", "eslint-ci": "eslint .", + "biome": "biome check --write", + "biome-ci": "biome ci --changed", "docs": "typedoc", "depcruise": "depcruise src", "depcruise:graph": "depcruise src --output-type dot | node dependency-graph.js > dependency-graph.svg",