Skip to content

Commit

Permalink
fix: improve type-safety by the config files
Browse files Browse the repository at this point in the history
  • Loading branch information
aminya committed Mar 5, 2024
1 parent 732a929 commit c9df9fa
Show file tree
Hide file tree
Showing 19 changed files with 73 additions and 53 deletions.
2 changes: 1 addition & 1 deletion .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"cSpell.words": ["globify"],
"cSpell.words": ["Globified", "globify"],
"explorer.fileNesting.patterns": {
"index.js": "*.js"
}
Expand Down
4 changes: 3 additions & 1 deletion src/astro.cts
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
export const astroConfig = {
import { Linter } from "eslint"

export const astroConfig: Linter.ConfigOverride<Linter.RulesRecord> = {
// astro files
files: ["*.astro"],
parser: "astro-eslint-parser",
Expand Down
3 changes: 2 additions & 1 deletion src/coffeescript.cts
Original file line number Diff line number Diff line change
@@ -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<Linter.RulesRecord> = {
// CoffeeScript files
files: ["**/*.coffee"],
parser: "eslint-plugin-coffee",
Expand Down
3 changes: 2 additions & 1 deletion src/cson.cts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { Linter } from "eslint"
import { coffeeConfig } from "./coffeescript.cjs"

export const csonConfig = {
export const csonConfig: Linter.ConfigOverride<Linter.RulesRecord> = {
...coffeeConfig,
files: ["**/*.cson"],
rules: {
Expand Down
4 changes: 3 additions & 1 deletion src/html.cts
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
export const htmlConfig = {
import { Linter } from "eslint"

export const htmlConfig: Linter.ConfigOverride<Linter.RulesRecord> = {
files: [
"**/*.erb",
"**/*.handlebars",
Expand Down
13 changes: 7 additions & 6 deletions src/index-react.cts
Original file line number Diff line number Diff line change
@@ -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,
Expand Down
13 changes: 7 additions & 6 deletions src/index-solid.cts
Original file line number Diff line number Diff line change
@@ -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) ?? []),
],
}

Expand Down
9 changes: 6 additions & 3 deletions src/index-strict-react.cts
Original file line number Diff line number Diff line change
@@ -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()
}
})
Expand Down
9 changes: 6 additions & 3 deletions src/index-strict-solid.cts
Original file line number Diff line number Diff line change
@@ -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()
}
})
Expand Down
9 changes: 6 additions & 3 deletions src/index-strict.cts
Original file line number Diff line number Diff line change
@@ -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()
}
})
Expand Down
5 changes: 3 additions & 2 deletions src/index.cts
Original file line number Diff line number Diff line change
Expand Up @@ -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: {
Expand Down
8 changes: 4 additions & 4 deletions src/javascript.cts
Original file line number Diff line number Diff line change
@@ -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,
Expand All @@ -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,
Expand Down
4 changes: 3 additions & 1 deletion src/json.cts
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
export const jsonConfig = {
import { Linter } from "eslint"

export const jsonConfig: Linter.ConfigOverride<Linter.RulesRecord> = {
// JSON files
files: ["*.json"],
plugins: ["json"],
Expand Down
4 changes: 3 additions & 1 deletion src/official-eslint-rules.cts
Original file line number Diff line number Diff line change
@@ -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",
{
Expand Down
6 changes: 4 additions & 2 deletions src/plugin-import-rules.cts
Original file line number Diff line number Diff line change
@@ -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",
Expand All @@ -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",
Expand Down
4 changes: 3 additions & 1 deletion src/plugin-node-rules.cts
Original file line number Diff line number Diff line change
@@ -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",
Expand Down
9 changes: 5 additions & 4 deletions src/typescript.cts
Original file line number Diff line number Diff line change
Expand Up @@ -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"]
Expand Down Expand Up @@ -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",
{
Expand Down Expand Up @@ -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",
Expand All @@ -113,7 +114,7 @@ const pluginTypeScriptProjectRules = disableProjectBasedRules()
"@typescript-eslint/switch-exhaustiveness-check": "warn",
}

export const tsConfig = {
export const tsConfig: Linter.ConfigOverride<Linter.RulesRecord> = {
// TypeScript files
files: tsFiles,
parser: "@typescript-eslint/parser",
Expand Down
4 changes: 3 additions & 1 deletion src/yaml.cts
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
export const yamlConfig = {
import { Linter } from "eslint"

export const yamlConfig: Linter.ConfigOverride<Linter.RulesRecord> = {
// YAML files
files: ["*.yaml", "*.yml"],
plugins: ["yaml", "only-warn"],
Expand Down
13 changes: 2 additions & 11 deletions tsconfig.json
Original file line number Diff line number Diff line change
@@ -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",
Expand Down

0 comments on commit c9df9fa

Please sign in to comment.