Lint with every Oxlint category and list only the offs and options
Check / check (pull_request) Successful in 51s
Check / check (pull_request) Successful in 51s
This commit is contained in:
+116
-70
@@ -1,7 +1,7 @@
|
||||
/**
|
||||
* `project` — lint rules this repository holds its own source to, on top of
|
||||
* the Oxlint categories in `vite.config.ts`. Its rules of its own are
|
||||
* `no-disable-comments` and `no-asset-imports`.
|
||||
* `project` — this repository's changes to the Oxlint categories in
|
||||
* `vite.config.ts`. Its rules of its own are `no-disable-comments` and
|
||||
* `no-asset-imports`.
|
||||
*
|
||||
* Loaded by `vite.config.ts` as an Oxlint `jsPlugins` entry.
|
||||
*
|
||||
@@ -14,7 +14,7 @@ import type { DummyRuleMap } from "vite-plus/lint";
|
||||
|
||||
/** The source code both hosts hand a rule, with the comment list. */
|
||||
interface ProjectSourceCode extends TextSourceCode {
|
||||
getAllComments(): TSESTree.Comment[];
|
||||
getAllComments: () => TSESTree.Comment[];
|
||||
}
|
||||
|
||||
/** ESLint's default rule types, reporting TypeScript-ESTree nodes. */
|
||||
@@ -161,11 +161,16 @@ const noAssetImportsRule: ProjectRule = {
|
||||
};
|
||||
|
||||
/**
|
||||
* This repository's own rule list, spread by `vite.config.ts`: rules that
|
||||
* sit outside the Oxlint categories, plus the template's extras. Built-in
|
||||
* Oxlint rule ids sit here too, so `vite.config.ts` lists no rule by name.
|
||||
* This repository's changes to the Oxlint categories in `vite.config.ts`,
|
||||
* which turn every non-nursery category on: its own rules, the category
|
||||
* rules it turns off, and options that differ from a rule's defaults.
|
||||
*/
|
||||
const rules: DummyRuleMap = {
|
||||
// Its own rules.
|
||||
"project/no-disable-comments": "error",
|
||||
"project/no-asset-imports": "error",
|
||||
|
||||
// Options.
|
||||
// The explicit-types template's `camelcase` stand-in: no `_` inside a name
|
||||
// once leading and trailing ones are trimmed, unless it has no lowercase
|
||||
// ASCII letter (UPPER_SNAKE).
|
||||
@@ -174,31 +179,6 @@ const rules: DummyRuleMap = {
|
||||
"^_*[^_]*_*$|^[^a-z]*$",
|
||||
{ properties: false, classFields: false, onlyDeclarations: false, ignoreDestructuring: true },
|
||||
],
|
||||
// Rules outside the categories.
|
||||
"no-array-constructor": "error",
|
||||
"no-case-declarations": "error",
|
||||
"no-empty": "error",
|
||||
"no-fallthrough": "error",
|
||||
"no-inner-declarations": "error",
|
||||
"no-prototype-builtins": "error",
|
||||
"no-redeclare": "error",
|
||||
"no-regex-spaces": "error",
|
||||
"no-var": "error",
|
||||
"prefer-const": "error",
|
||||
"require-await": "error",
|
||||
"require-yield": "error",
|
||||
"typescript/adjacent-overload-signatures": "error",
|
||||
"typescript/ban-ts-comment": "error",
|
||||
"typescript/no-empty-interface": "error",
|
||||
"typescript/no-empty-object-type": "error",
|
||||
"typescript/no-explicit-any": "error",
|
||||
"typescript/no-namespace": "error",
|
||||
"typescript/no-non-null-asserted-optional-chain": "error",
|
||||
"typescript/no-unsafe-function-type": "error",
|
||||
"typescript/no-wrapper-object-types": "error",
|
||||
"typescript/prefer-as-const": "error",
|
||||
"typescript/prefer-namespace-keyword": "error",
|
||||
"typescript/triple-slash-reference": "error",
|
||||
// On Node, these come from an explicit `node:` import instead of the global scope.
|
||||
"no-restricted-globals": [
|
||||
"error",
|
||||
@@ -209,45 +189,111 @@ const rules: DummyRuleMap = {
|
||||
"setImmediate",
|
||||
"clearImmediate",
|
||||
],
|
||||
// The explicit-types template's extras.
|
||||
"import/no-cycle": "error",
|
||||
// `../` is banned in every file; anything above a file needs a `#` alias.
|
||||
"import/no-relative-parent-imports": "error",
|
||||
"typescript/consistent-type-imports": "error",
|
||||
"typescript/no-import-type-side-effects": "error",
|
||||
"typescript/no-non-null-assertion": "error",
|
||||
// No disable comments at all.
|
||||
"project/no-disable-comments": "error",
|
||||
"project/no-asset-imports": "error",
|
||||
"unicorn/no-abusive-eslint-disable": "error",
|
||||
// Size and complexity limits match Deno's: this repo's `deno lint` ran the
|
||||
// `recommended` set with no config file, so no size or complexity rule
|
||||
// applied and none applies here. Each Oxlint limit rule, from a category or
|
||||
// not, is off:
|
||||
// - `complexity`: Deno had no `max-complexity`.
|
||||
// - `max-lines`: Deno had no `max-file-lines`.
|
||||
// - `max-params`: Deno had no `max-params`.
|
||||
// - `id-length`: Deno had no `max-identifier-length`.
|
||||
// - `no-nested-ternary`: Deno had no `max-nest-ternaries`.
|
||||
// - `max-lines-per-function`, `max-classes-per-file`, `max-depth`,
|
||||
// `max-nested-callbacks`, `max-statements`, `import/max-dependencies`,
|
||||
// `unicorn/max-nested-calls`: Deno had none of these.
|
||||
complexity: "off",
|
||||
"max-lines": "off",
|
||||
"max-params": "off",
|
||||
"id-length": "off",
|
||||
"no-nested-ternary": "off",
|
||||
"max-lines-per-function": "off",
|
||||
"max-classes-per-file": "off",
|
||||
"max-depth": "off",
|
||||
"max-nested-callbacks": "off",
|
||||
"max-statements": "off",
|
||||
"import/max-dependencies": "off",
|
||||
"unicorn/max-nested-calls": "off",
|
||||
// Pedantic, but Node's and the web's own types (`Response`, `Stats`,
|
||||
// `RequestInit`) are mutable, so no parameter of theirs can pass; the
|
||||
// explicit-types template and the app repos turn it off too.
|
||||
// Single capital type parameters, which explicit-types requires, may be one letter.
|
||||
"id-length": ["error", { exceptionPatterns: ["^[A-Z]$"] }],
|
||||
"one-var": ["error", "never"],
|
||||
"no-use-before-define": ["error", { functions: false }],
|
||||
"func-style": ["error", "declaration", { allowArrowFunctions: true }],
|
||||
"unicorn/import-style": ["error", { styles: { "node:path": { named: true } } }],
|
||||
// Each limit is the smallest value the current code passes.
|
||||
complexity: ["error", 26],
|
||||
"max-depth": ["error", 6],
|
||||
"max-lines": ["error", { max: 2048, skipBlankLines: false, skipComments: false }],
|
||||
"max-lines-per-function": ["error", 96],
|
||||
"max-params": ["error", 4],
|
||||
"max-statements": ["error", 32],
|
||||
"import/max-dependencies": ["error", { max: 13 }],
|
||||
"unicorn/max-nested-calls": ["error", { max: 4 }],
|
||||
|
||||
// Collides with another rule, a plugin config, or Oxfmt.
|
||||
// Collides with `#private`: members are public unless marked so.
|
||||
"typescript/explicit-member-accessibility": "off",
|
||||
// Collides with `typescript/prefer-readonly-parameter-types` being off.
|
||||
"typescript/prefer-readonly": "off",
|
||||
// Collides with Node's and the web's mutable types (`Response`, `Stats`).
|
||||
"typescript/prefer-readonly-parameter-types": "off",
|
||||
// Collides with explicit-types `no-utility-types`, which bans `Record`.
|
||||
"typescript/consistent-indexed-object-style": "off",
|
||||
// Collides with explicitly annotated declarations.
|
||||
"typescript/no-inferrable-types": "off",
|
||||
// Collides with import-structure `enforce-import-order`.
|
||||
"sort-imports": "off",
|
||||
// Collides with import-structure `enforce-mod-file` barrels.
|
||||
"oxc/no-barrel-file": "off",
|
||||
// Collides with exporting each declaration where it stands.
|
||||
"import/group-exports": "off",
|
||||
// Collides with exporting each declaration where it stands.
|
||||
"import/exports-last": "off",
|
||||
// Collides with `import/no-default-export`.
|
||||
"import/prefer-default-export": "off",
|
||||
// Collides with `unicorn/prefer-ternary`.
|
||||
"no-ternary": "off",
|
||||
// Collides with `require-await` and `promise-function-async`.
|
||||
"oxc/no-async-await": "off",
|
||||
// Collides with `typescript/prefer-optional-chain`.
|
||||
"oxc/no-optional-chaining": "off",
|
||||
// Collides with file mode checks such as `mode & 0o077`.
|
||||
"no-bitwise": "off",
|
||||
// Collides with explicit-types `no-optional-null`, which makes `undefined` the absent value.
|
||||
"no-undefined": "off",
|
||||
// Collides with `typescript/no-floating-promises`, which `void` satisfies.
|
||||
"no-void": "off",
|
||||
// Collides with JSON and Node APIs, which return `null`.
|
||||
"unicorn/no-null": "off",
|
||||
// Collides with `import/no-default-export`.
|
||||
"import/no-named-export": "off",
|
||||
// Collides with `typescript/consistent-type-imports`.
|
||||
"import/consistent-type-specifier-style": "off",
|
||||
// Collides with `require-await`, which fails an `async` wrapper with no `await`.
|
||||
"typescript/promise-function-async": "off",
|
||||
// Collides with explicit-types `no-undefined-type`: a `let` that `try`
|
||||
// assigns would need `T | undefined`.
|
||||
"init-declarations": "off",
|
||||
// Collides with `no-await-in-loop`: sequential steps chain through `reduce`.
|
||||
"unicorn/no-array-reduce": "off",
|
||||
// Collides with literal Gitea Actions `${{ }}` expressions in workflow strings.
|
||||
"no-template-curly-in-string": "off",
|
||||
|
||||
// Node code: this action runs on Node.
|
||||
// Node built-ins are the action's runtime.
|
||||
"import/no-nodejs-modules": "off",
|
||||
// Command-line entry points set their exit status.
|
||||
"unicorn/no-process-exit": "off",
|
||||
// The action reports to the job log through the console.
|
||||
"no-console": "off",
|
||||
|
||||
// PENDING USER: union members are values in profiles.json, the Gitea API,
|
||||
// and posted comments; renaming them changes behavior.
|
||||
"explicit-types/upper-snake-string-unions": "off",
|
||||
// PENDING USER: a fitting `name` needs a constructor and changes logged
|
||||
// error names.
|
||||
"unicorn/custom-error-definition": "off",
|
||||
|
||||
// Too much churn.
|
||||
// Literal numbers read better than a constant per use.
|
||||
"no-magic-numbers": "off",
|
||||
// Keys follow meaning, not the alphabet.
|
||||
"sort-keys": "off",
|
||||
// Comments may start with code or lowercase identifiers.
|
||||
"capitalized-comments": "off",
|
||||
// explicit-types `require-return-type` covers return types.
|
||||
"typescript/explicit-function-return-type": "off",
|
||||
// explicit-types `require-return-type` covers return types.
|
||||
"typescript/explicit-module-boundary-types": "off",
|
||||
// Empty callbacks are legitimate no-ops.
|
||||
"no-empty-function": "off",
|
||||
// Methods may not need `this`.
|
||||
"class-methods-use-this": "off",
|
||||
// Braces only where a case declares.
|
||||
"unicorn/switch-case-braces": "off",
|
||||
// Plain property reads are fine.
|
||||
"prefer-destructuring": "off",
|
||||
// Object rest and spread are idiomatic.
|
||||
"oxc/no-rest-spread-properties": "off",
|
||||
// Short numbers need no separators.
|
||||
"unicorn/numeric-separators-style": "off",
|
||||
// `continue` keeps loop bodies flat.
|
||||
"no-continue": "off",
|
||||
};
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user