From 25a17efa4d68f32dd93f9f3c314eb2e2c65f5cb0 Mon Sep 17 00:00:00 2001 From: Anders Hassis Date: Tue, 17 Sep 2024 10:29:52 +0200 Subject: [PATCH 1/2] Enable @typescript-eslint/no-unsafe-assignment and add a more structured fixture --- README.md | 18 +++++++++++++++ __tests__/fixtures/react/eslint.config.js | 16 +++++++++++++ __tests__/fixtures/react/tsconfig.json | 23 +++++++++++++++++++ __tests__/fixtures/vanilla/eslint.config.js | 16 +++++++++++++ __tests__/fixtures/vanilla/frontend.ts | 6 ++++- .../fixtures/vanilla/invalidFolder/.gitkeep | 0 __tests__/fixtures/vanilla/tsconfig.json | 23 +++++++++++++++++++ __tests__/validate-frontend.test.ts | 3 ++- __tests__/validate-react.test.ts | 4 ++-- src/frontend-vanilla.js | 1 + 10 files changed, 106 insertions(+), 4 deletions(-) create mode 100644 __tests__/fixtures/react/eslint.config.js create mode 100644 __tests__/fixtures/react/tsconfig.json create mode 100644 __tests__/fixtures/vanilla/eslint.config.js create mode 100644 __tests__/fixtures/vanilla/invalidFolder/.gitkeep create mode 100644 __tests__/fixtures/vanilla/tsconfig.json diff --git a/README.md b/README.md index 418bf2f..ad6b1d7 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,15 @@ To use this configuration you'll need `eslint.config.js` file in your project ro + + const config = [ + { ignores: ["src/accessmanagement-api.ts", "src/types/caspeco-navigation"] }, ++ { ++ files: ['**/*.ts', '**/*.tsx'], ++ languageOptions: { ++ parserOptions: { ++ project: true, ++ tsconfigRootDir: import.meta.dirname, ++ }, ++ }, ++ }, + ...vanillaConfig, + ]; + @@ -36,6 +45,15 @@ To use this configuration you'll need `eslint.config.js` file in your project ro + + const config = [ + { ignores: ["src/accessmanagement-api.ts", "src/types/caspeco-navigation"] }, ++ { ++ files: ['**/*.ts', '**/*.tsx'], ++ languageOptions: { ++ parserOptions: { ++ project: true, ++ tsconfigRootDir: import.meta.dirname, ++ }, ++ }, ++ }, + ...reactConfig, + ]; + diff --git a/__tests__/fixtures/react/eslint.config.js b/__tests__/fixtures/react/eslint.config.js new file mode 100644 index 0000000..264f4e6 --- /dev/null +++ b/__tests__/fixtures/react/eslint.config.js @@ -0,0 +1,16 @@ +import reactConfig from "./../../../src/frontend-react.js"; + +const config = [ + { + files: ['**/*.ts', '**/*.tsx'], + languageOptions: { + parserOptions: { + project: true, + tsconfigRootDir: import.meta.dirname, + }, + }, + }, + ...reactConfig +]; + +export default config; diff --git a/__tests__/fixtures/react/tsconfig.json b/__tests__/fixtures/react/tsconfig.json new file mode 100644 index 0000000..8268527 --- /dev/null +++ b/__tests__/fixtures/react/tsconfig.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "target": "ES2020", + "allowJs": true, + "useDefineForClassFields": true, + "module": "ESNext", + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, +} diff --git a/__tests__/fixtures/vanilla/eslint.config.js b/__tests__/fixtures/vanilla/eslint.config.js new file mode 100644 index 0000000..f28034d --- /dev/null +++ b/__tests__/fixtures/vanilla/eslint.config.js @@ -0,0 +1,16 @@ +import vanillaConfig from "./../../../src/frontend-vanilla.js"; + +const config = [ + { + files: ['**/*.ts', '**/*.tsx'], + languageOptions: { + parserOptions: { + project: true, + tsconfigRootDir: import.meta.dirname, + }, + }, + }, + ...vanillaConfig +]; + +export default config; diff --git a/__tests__/fixtures/vanilla/frontend.ts b/__tests__/fixtures/vanilla/frontend.ts index 8114fd1..a460cc5 100644 --- a/__tests__/fixtures/vanilla/frontend.ts +++ b/__tests__/fixtures/vanilla/frontend.ts @@ -3,4 +3,8 @@ var unusedFunction = function() { console.log("I'm not used anywhere!"); }; - console.log("Hello") \ No newline at end of file + console.log("Hello") + +const x = 1 as any, + y = 1 as any; +const [x] = 1 as any; \ No newline at end of file diff --git a/__tests__/fixtures/vanilla/invalidFolder/.gitkeep b/__tests__/fixtures/vanilla/invalidFolder/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/__tests__/fixtures/vanilla/tsconfig.json b/__tests__/fixtures/vanilla/tsconfig.json new file mode 100644 index 0000000..8268527 --- /dev/null +++ b/__tests__/fixtures/vanilla/tsconfig.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "target": "ES2020", + "allowJs": true, + "useDefineForClassFields": true, + "module": "ESNext", + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, +} diff --git a/__tests__/validate-frontend.test.ts b/__tests__/validate-frontend.test.ts index 53b0efc..31605f8 100644 --- a/__tests__/validate-frontend.test.ts +++ b/__tests__/validate-frontend.test.ts @@ -1,6 +1,6 @@ import { describe, it } from "vitest"; import eslint from "eslint"; -import frontendVanilla from "../src/frontend-vanilla"; +import frontendVanilla from "./fixtures/vanilla/eslint.config"; import { assertHasEslintError } from "./helper"; describe("validate frontend config", () => { @@ -13,6 +13,7 @@ describe("validate frontend config", () => { const result = await cli.lintFiles("__tests__/fixtures/vanilla/frontend.ts"); assertHasEslintError(result, "@typescript-eslint/no-unused-vars"); + assertHasEslintError(result, "@typescript-eslint/no-unsafe-assignment"); assertHasEslintError(result, "no-var"); }); diff --git a/__tests__/validate-react.test.ts b/__tests__/validate-react.test.ts index 1d965bd..bb101f5 100644 --- a/__tests__/validate-react.test.ts +++ b/__tests__/validate-react.test.ts @@ -1,9 +1,9 @@ import { describe, it } from "vitest"; import eslint from "eslint"; -import frontendReact from "../src/frontend-react"; +import frontendReact from "./fixtures/react/eslint.config"; import { assertHasEslintError } from "./helper"; -describe("validate frontend config", () => { +describe("validate react config", () => { describe("vanilla", () => { it.skip("validates hooks rules", async function async() { const cli = new eslint.ESLint({ diff --git a/src/frontend-vanilla.js b/src/frontend-vanilla.js index 1445078..0b6a97b 100644 --- a/src/frontend-vanilla.js +++ b/src/frontend-vanilla.js @@ -22,6 +22,7 @@ const flatConfig = [ "check-file": checkFile, }, rules: { + "@typescript-eslint/no-unsafe-assignment": "error", "check-file/filename-naming-convention": [ "error", { From ede1ebe4d4869383dd1f3eb5efb0d2f2afc7ea92 Mon Sep 17 00:00:00 2001 From: Anders Hassis Date: Tue, 17 Sep 2024 13:23:12 +0200 Subject: [PATCH 2/2] Move to recommended types rule set instead --- src/frontend-vanilla.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/frontend-vanilla.js b/src/frontend-vanilla.js index 0b6a97b..95673f6 100644 --- a/src/frontend-vanilla.js +++ b/src/frontend-vanilla.js @@ -6,7 +6,7 @@ import eslintConfigPrettier from "eslint-config-prettier"; /** @type {import('eslint').Linter.Config[]} */ const flatConfig = [ js.configs.recommended, - ...typescriptEslintConfig.recommended, + ...typescriptEslintConfig.recommendedTypeChecked, { files: ["**/*.ts", "**/*.tsx"], ignores: ["**/*.d.ts", "**/dist/**/*", "**/node_modules/**/*"], @@ -22,7 +22,6 @@ const flatConfig = [ "check-file": checkFile, }, rules: { - "@typescript-eslint/no-unsafe-assignment": "error", "check-file/filename-naming-convention": [ "error", {