From c9df9faeaab51c8cacdf7061dedc0246e0415c45 Mon Sep 17 00:00:00 2001 From: Amin Yahyaabadi Date: Tue, 5 Mar 2024 01:06:42 -0800 Subject: [PATCH] fix: improve type-safety by the config files --- .vscode/settings.json | 2 +- src/astro.cts | 4 +++- src/coffeescript.cts | 3 ++- src/cson.cts | 3 ++- src/html.cts | 4 +++- src/index-react.cts | 13 +++++++------ src/index-solid.cts | 13 +++++++------ src/index-strict-react.cts | 9 ++++++--- src/index-strict-solid.cts | 9 ++++++--- src/index-strict.cts | 9 ++++++--- src/index.cts | 5 +++-- src/javascript.cts | 8 ++++---- src/json.cts | 4 +++- src/official-eslint-rules.cts | 4 +++- src/plugin-import-rules.cts | 6 ++++-- src/plugin-node-rules.cts | 4 +++- src/typescript.cts | 9 +++++---- src/yaml.cts | 4 +++- tsconfig.json | 13 ++----------- 19 files changed, 73 insertions(+), 53 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 77982bc..cf862d7 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,5 +1,5 @@ { - "cSpell.words": ["globify"], + "cSpell.words": ["Globified", "globify"], "explorer.fileNesting.patterns": { "index.js": "*.js" } diff --git a/src/astro.cts b/src/astro.cts index d17bd8e..5724cc7 100644 --- a/src/astro.cts +++ b/src/astro.cts @@ -1,4 +1,6 @@ -export const astroConfig = { +import { Linter } from "eslint" + +export const astroConfig: Linter.ConfigOverride = { // astro files files: ["*.astro"], parser: "astro-eslint-parser", diff --git a/src/coffeescript.cts b/src/coffeescript.cts index e408377..addb991 100644 --- a/src/coffeescript.cts +++ b/src/coffeescript.cts @@ -1,7 +1,8 @@ import { pluginNodeRules } from "./plugin-node-rules.cjs" import { pluginImportRulesExtra } from "./plugin-import-rules.cjs" +import { Linter } from "eslint" -export const coffeeConfig = { +export const coffeeConfig: Linter.ConfigOverride = { // CoffeeScript files files: ["**/*.coffee"], parser: "eslint-plugin-coffee", diff --git a/src/cson.cts b/src/cson.cts index e035fd4..2861d9c 100644 --- a/src/cson.cts +++ b/src/cson.cts @@ -1,6 +1,7 @@ +import { Linter } from "eslint" import { coffeeConfig } from "./coffeescript.cjs" -export const csonConfig = { +export const csonConfig: Linter.ConfigOverride = { ...coffeeConfig, files: ["**/*.cson"], rules: { diff --git a/src/html.cts b/src/html.cts index 0ebb9c1..70afc69 100644 --- a/src/html.cts +++ b/src/html.cts @@ -1,4 +1,6 @@ -export const htmlConfig = { +import { Linter } from "eslint" + +export const htmlConfig: Linter.ConfigOverride = { files: [ "**/*.erb", "**/*.handlebars", diff --git a/src/index-react.cts b/src/index-react.cts index a358a36..0cf1b3d 100644 --- a/src/index-react.cts +++ b/src/index-react.cts @@ -1,20 +1,21 @@ +import { Linter } from "eslint" import base from "./index.cjs" import { tsConfig } from "./typescript.cjs" -const nonStrictConfig = { +const nonStrictConfig: Linter.Config = { ...base, - plugins: ["react", ...base.plugins], - extends: ["plugin:react/recommended", ...base.extends], + plugins: ["react", ...(base.plugins ?? [])], + extends: ["plugin:react/recommended", ...(base.extends ?? [])], overrides: [ // TypeScript: { ...tsConfig, - plugins: ["react", ...tsConfig.plugins], - extends: ["plugin:react/recommended", ...tsConfig.extends], + plugins: ["react", ...(tsConfig.plugins ?? [])], + extends: ["plugin:react/recommended", ...(tsConfig.extends ?? [])], rules: tsConfig.rules, }, // The rest is the same - ...base.overrides.slice(1), + ...(base.overrides?.slice(1) ?? []), ], settings: { ...base.settings, diff --git a/src/index-solid.cts b/src/index-solid.cts index 1503244..6e743e0 100644 --- a/src/index-solid.cts +++ b/src/index-solid.cts @@ -1,20 +1,21 @@ +import { Linter } from "eslint" import base from "./index.cjs" import { tsConfig } from "./typescript.cjs" -const nonStrictConfig = { +const nonStrictConfig: Linter.Config = { ...base, - plugins: ["solid", ...base.plugins], - extends: ["plugin:solid/recommended", ...base.extends], + plugins: ["solid", ...(base.plugins ?? [])], + extends: ["plugin:solid/recommended", ...(base.extends ?? [])], overrides: [ // TypeScript: { ...tsConfig, - plugins: ["solid", ...tsConfig.plugins], - extends: ["plugin:solid/typescript", ...tsConfig.extends], + plugins: ["solid", ...(tsConfig.plugins ?? [])], + extends: ["plugin:solid/typescript", ...(tsConfig.extends ?? [])], rules: tsConfig.rules, }, // The rest is the same - ...base.overrides.slice(1), + ...(base.overrides?.slice(1) ?? []), ], } diff --git a/src/index-strict-react.cts b/src/index-strict-react.cts index 82857a9..9c7e969 100644 --- a/src/index-strict-react.cts +++ b/src/index-strict-react.cts @@ -1,13 +1,16 @@ import nonStrictConfig from "./index-react.cjs" // remove only-warn from javascript -if (nonStrictConfig.plugins[nonStrictConfig.plugins.length - 1] === "only-warn") { +if ( + nonStrictConfig.plugins !== undefined && + nonStrictConfig.plugins[nonStrictConfig.plugins.length - 1] === "only-warn" +) { nonStrictConfig.plugins.pop() } // remove only-warn from overrides -nonStrictConfig.overrides.forEach((overrides) => { - if (overrides.plugins[overrides.plugins.length - 1] === "only-warn") { +nonStrictConfig.overrides?.forEach((overrides) => { + if (overrides.plugins !== undefined && overrides.plugins[overrides.plugins.length - 1] === "only-warn") { overrides.plugins.pop() } }) diff --git a/src/index-strict-solid.cts b/src/index-strict-solid.cts index 5628890..f2ac87b 100644 --- a/src/index-strict-solid.cts +++ b/src/index-strict-solid.cts @@ -1,13 +1,16 @@ import nonStrictConfig from "./index-solid.cjs" // remove only-warn from javascript -if (nonStrictConfig.plugins[nonStrictConfig.plugins.length - 1] === "only-warn") { +if ( + nonStrictConfig.plugins !== undefined && + nonStrictConfig.plugins[nonStrictConfig.plugins.length - 1] === "only-warn" +) { nonStrictConfig.plugins.pop() } // remove only-warn from overrides -nonStrictConfig.overrides.forEach((overrides) => { - if (overrides.plugins[overrides.plugins.length - 1] === "only-warn") { +nonStrictConfig.overrides?.forEach((overrides) => { + if (overrides.plugins !== undefined && overrides.plugins[overrides.plugins.length - 1] === "only-warn") { overrides.plugins.pop() } }) diff --git a/src/index-strict.cts b/src/index-strict.cts index d2ad498..a9bc76e 100644 --- a/src/index-strict.cts +++ b/src/index-strict.cts @@ -1,13 +1,16 @@ import nonStrictConfig from "./index.cjs" // remove only-warn from javascript -if (nonStrictConfig.plugins[nonStrictConfig.plugins.length - 1] === "only-warn") { +if ( + nonStrictConfig.plugins !== undefined && + nonStrictConfig.plugins[nonStrictConfig.plugins.length - 1] === "only-warn" +) { nonStrictConfig.plugins.pop() } // remove only-warn from overrides -nonStrictConfig.overrides.forEach((overrides) => { - if (overrides.plugins[overrides.plugins.length - 1] === "only-warn") { +nonStrictConfig.overrides?.forEach((overrides) => { + if (overrides.plugins !== undefined && overrides.plugins[overrides.plugins.length - 1] === "only-warn") { overrides.plugins.pop() } }) diff --git a/src/index.cts b/src/index.cts index ad0ac3c..44bcf70 100644 --- a/src/index.cts +++ b/src/index.cts @@ -32,11 +32,12 @@ const config: Linter.Config = { atomtest: true, es6: true, node: true, - browser: true + browser: true, }, globals: { - atom: "readonly" + atom: "readonly", }, + ignorePatterns: ["node_modules/"], ...jsConfig, overrides: [tsConfig, jsonConfig, yamlConfig, htmlConfig, astroConfig, ...maybeAddCoffeeScript()], settings: { diff --git a/src/javascript.cts b/src/javascript.cts index 34af72f..aeb3735 100644 --- a/src/javascript.cts +++ b/src/javascript.cts @@ -1,8 +1,9 @@ import { eslintRulesExtra } from "./official-eslint-rules.cjs" import { pluginNodeRules } from "./plugin-node-rules.cjs" import { pluginImportRulesExtra } from "./plugin-import-rules.cjs" +import { Linter } from "eslint" -export const jsConfig = { +export const jsConfig: Linter.Config = { parser: "@babel/eslint-parser", parserOptions: { requireConfigFile: false, @@ -16,12 +17,11 @@ export const jsConfig = { "@babel/plugin-syntax-jsx", ], }, - ecmaVersion: 2021, - sourceType: "module", + ecmaVersion: 2021 as const, + sourceType: "module" as const, }, plugins: ["node", "import", "only-warn"], extends: ["eslint:recommended", "plugin:optimize-regex/all", "plugin:import/recommended", "prettier"], - ignorePatterns: ["node_modules/"], rules: { ...eslintRulesExtra, ...pluginNodeRules, diff --git a/src/json.cts b/src/json.cts index d8838e4..fd91250 100644 --- a/src/json.cts +++ b/src/json.cts @@ -1,4 +1,6 @@ -export const jsonConfig = { +import { Linter } from "eslint" + +export const jsonConfig: Linter.ConfigOverride = { // JSON files files: ["*.json"], plugins: ["json"], diff --git a/src/official-eslint-rules.cts b/src/official-eslint-rules.cts index f61ad06..cbf39bc 100644 --- a/src/official-eslint-rules.cts +++ b/src/official-eslint-rules.cts @@ -1,8 +1,10 @@ +import { Linter } from "eslint" + /** * The official Eslint rules that are constructive and not included in recommended. The formatting/stylistic rules are * not among these. The rules that might be useful in future are commented. */ -export const eslintRulesExtra = { +export const eslintRulesExtra: Linter.RulesRecord = { "no-unused-vars": [ "error", { diff --git a/src/plugin-import-rules.cts b/src/plugin-import-rules.cts index 9c3e8eb..50b6dd1 100644 --- a/src/plugin-import-rules.cts +++ b/src/plugin-import-rules.cts @@ -1,4 +1,6 @@ -export const pluginImportRulesExtra = { +import { Linter } from "eslint" + +export const pluginImportRulesExtra: Linter.RulesRecord = { "import/no-absolute-path": "error", "import/no-useless-path-segments": "error", "import/no-deprecated": "error", @@ -15,7 +17,7 @@ export const pluginImportRulesExtra = { // "import/no-unused-modules": ["warn", {"missingExports": true}], } -export const pluginImportTypeScriptRulesExtra = { +export const pluginImportTypeScriptRulesExtra: Linter.RulesRecord = { // Buggy on TypeScript: "import/no-unresolved": "off", "import/named": "off", diff --git a/src/plugin-node-rules.cts b/src/plugin-node-rules.cts index c6f5950..24ced91 100644 --- a/src/plugin-node-rules.cts +++ b/src/plugin-node-rules.cts @@ -1,4 +1,6 @@ -export const pluginNodeRules = { +import { Linter } from "eslint" + +export const pluginNodeRules: Linter.RulesRecord = { "node/no-exports-assign": "error", "node/process-exit-as-throw": "error", "node/shebang": "error", diff --git a/src/typescript.cts b/src/typescript.cts index 6bc7451..9692a44 100644 --- a/src/typescript.cts +++ b/src/typescript.cts @@ -4,6 +4,7 @@ import { pluginNodeRules } from "./plugin-node-rules.cjs" import makeSynchronous from "make-synchronous" import { findOneFile } from "./utils.cjs" import type { GlobifiedEntry } from "globify-gitignore" +import { Linter } from "eslint" const tsFiles = ["**/*.tsx", "**/*.ts", "**/*.mts", "**/*.cts"] const project = ["**/tsconfig.json", "!**/node_modules/**/tsconfig.json"] @@ -63,12 +64,12 @@ function disableProjectBasedRules() { return disable } -function javaScriptRules() { +function javaScriptRules(): Linter.RulesRecord { // turn-off no-unused-vars for typescript files return { ...eslintRulesExtra, "no-unused-vars": "off" } } -const pluginTypeScriptRulesExtra = { +const pluginTypeScriptRulesExtra: Linter.RulesRecord = { "@typescript-eslint/no-unused-vars": [ "error", { @@ -97,7 +98,7 @@ const pluginTypeScriptRulesExtra = { // "@typescript-eslint/prefer-string-starts-ends-with": "error", } -const pluginTypeScriptProjectRules = disableProjectBasedRules() +const pluginTypeScriptProjectRules: Linter.RulesRecord = disableProjectBasedRules() ? {} : { "@typescript-eslint/no-floating-promises": "error", @@ -113,7 +114,7 @@ const pluginTypeScriptProjectRules = disableProjectBasedRules() "@typescript-eslint/switch-exhaustiveness-check": "warn", } -export const tsConfig = { +export const tsConfig: Linter.ConfigOverride = { // TypeScript files files: tsFiles, parser: "@typescript-eslint/parser", diff --git a/src/yaml.cts b/src/yaml.cts index 1fd3d19..74eee63 100644 --- a/src/yaml.cts +++ b/src/yaml.cts @@ -1,4 +1,6 @@ -export const yamlConfig = { +import { Linter } from "eslint" + +export const yamlConfig: Linter.ConfigOverride = { // YAML files files: ["*.yaml", "*.yml"], plugins: ["yaml", "only-warn"], diff --git a/tsconfig.json b/tsconfig.json index 07931d0..fca9da0 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,17 +1,8 @@ { "compilerOptions": { // target - "target": "EsNext", - "lib": [ - "es2021", - "EsNext", - "DOM", - "DOM.Iterable", - "WebWorker", - "WebWorker.ImportScripts", - "Webworker.Iterable", - "ScriptHost" - ], + "target": "ES2022", + "lib": ["ES2022"], "importHelpers": false, "module": "CommonJS", "moduleResolution": "node",