Files
test-repo/eslint.config.js
T

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

463 lines
12 KiB
JavaScript
Raw Normal View History

2024-01-08 14:48:45 +08:00
import url from "node:url";
import eslintPluginJs from "@eslint/js";
import eslintPluginStylisticJs from "@stylistic/eslint-plugin-js";
import eslintPluginTypescriptEslint from "@typescript-eslint/eslint-plugin";
import { isCI } from "ci-info";
import eslintConfigPrettier from "eslint-config-prettier";
import eslintPluginJest from "eslint-plugin-jest";
import eslintPluginN from "eslint-plugin-n";
2024-09-19 00:41:52 +08:00
import eslintPluginReact from "eslint-plugin-react";
2024-01-08 14:48:45 +08:00
import eslintPluginRegexp from "eslint-plugin-regexp";
import eslintPluginSimpleImportSort from "eslint-plugin-simple-import-sort";
import eslintPluginUnicorn from "eslint-plugin-unicorn";
2024-09-19 00:41:52 +08:00
import globals from "globals";
2024-01-08 14:48:45 +08:00
import eslintPluginPrettierInternalRules from "./scripts/tools/eslint-plugin-prettier-internal-rules/index.js";
const toPath = (file) => url.fileURLToPath(new URL(file, import.meta.url));
const ignores = `
.tmp
# Ignore directories and files in 'tests/format'
tests/format/**/*
# Unignore directories and 'jsfmt.spec.js', 'format.test.js' file
!tests/format/**/
!tests/format/**/format.test.js
# TODO: Remove this in 2025
!tests/format/**/jsfmt.spec.js
tests/integration/cli/
test*.*
scripts/release/node_modules
coverage/
dist*/
**/node_modules/**
website/build/
website/static/playground.js
website/static/lib/
scripts/benchmark/*/
**/.yarn/**
**/.pnp.*
`
.split("\n")
.filter((pattern) => pattern && !pattern.startsWith("#"));
2024-01-08 14:48:45 +08:00
export default [
eslintPluginJs.configs.recommended,
eslintPluginRegexp.configs["flat/recommended"],
2024-01-08 14:48:45 +08:00
eslintPluginUnicorn.configs["flat/recommended"],
eslintConfigPrettier,
{
2024-09-19 00:41:52 +08:00
languageOptions: {
globals: { ...globals.builtin, ...globals.node },
},
2024-01-08 14:48:45 +08:00
plugins: {
"@stylistic/js": eslintPluginStylisticJs,
"@typescript-eslint": eslintPluginTypescriptEslint,
n: eslintPluginN,
"prettier-internal-rules": eslintPluginPrettierInternalRules,
"simple-import-sort": eslintPluginSimpleImportSort,
},
rules: {
"arrow-body-style": ["error", "as-needed"],
curly: "error",
"dot-notation": "error",
eqeqeq: "error",
"logical-assignment-operators": "error",
"no-console": isCI ? "error" : "warn",
"no-constant-binary-expression": "error",
"no-duplicate-imports": "error",
"no-else-return": [
"error",
{
allowElseIf: false,
},
],
"no-implicit-coercion": "error",
"no-inner-declarations": "error",
"no-lonely-if": "error",
"no-unneeded-ternary": "error",
"no-useless-return": "error",
"no-unused-expressions": [
"error",
{
allowShortCircuit: true,
allowTernary: true,
},
],
"no-unused-vars": [
"error",
{
ignoreRestSiblings: true,
},
],
"no-var": "error",
"object-shorthand": [
"error",
"always",
{
avoidExplicitReturnArrows: true,
},
],
"one-var": ["error", "never"],
"prefer-arrow-callback": "error",
"prefer-const": [
"error",
{
destructuring: "all",
},
],
"prefer-destructuring": [
"error",
{
VariableDeclarator: {
array: false,
object: true,
},
AssignmentExpression: {
array: false,
object: false,
},
},
{
enforceForRenamedProperties: false,
},
],
"prefer-object-has-own": "error",
"prefer-object-spread": "error",
"prefer-rest-params": "error",
"prefer-spread": "error",
"require-await": "error",
"require-unicode-regexp": "error",
2024-01-08 14:48:45 +08:00
"symbol-description": "error",
yoda: [
"error",
"never",
{
exceptRange: true,
},
],
// Internal rules
"prettier-internal-rules/jsx-identifier-case": "error",
"prettier-internal-rules/massage-ast-parameter-names": "error",
2024-01-08 14:48:45 +08:00
"prettier-internal-rules/no-identifier-n": "error",
"prettier-internal-rules/prefer-fs-promises-submodule": "error",
/* @stylistic/eslint-plugin-js */
2024-01-08 14:48:45 +08:00
"@stylistic/js/quotes": [
"error",
"double",
{
avoidEscape: true,
},
],
/* @typescript-eslint/eslint-plugin */
"@typescript-eslint/prefer-ts-expect-error": "error",
/* eslint-plugin-n */
2024-01-08 14:48:45 +08:00
"n/no-path-concat": "error",
/* eslint-plugin-regexp */
2024-01-08 14:48:45 +08:00
"regexp/match-any": [
"error",
{
allows: ["dotAll"],
},
],
/* cspell:disable-next-line */
"regexp/no-extra-lookaround-assertions": "error",
"regexp/no-missing-g-flag": "error",
"regexp/no-useless-flag": [
"error",
{
strictTypes: false,
},
],
/* cspell:disable-next-line */
"regexp/prefer-lookaround": [
"error",
{
strictTypes: false,
},
],
"regexp/no-super-linear-backtracking": "off",
"regexp/unicode-property": [
"error",
{
generalCategory: "never",
key: "long",
property: {
binary: "long",
generalCategory: "long",
script: "long",
},
},
],
2024-01-08 14:48:45 +08:00
/* eslint-plugin-simple-import-sort */
2024-01-08 14:48:45 +08:00
"simple-import-sort/imports": "error",
"simple-import-sort/exports": "error",
/* eslint-plugin-unicorn */
2024-01-08 14:48:45 +08:00
"unicorn/escape-case": "off",
"unicorn/catch-error-name": "off",
"unicorn/consistent-destructuring": "off",
"unicorn/consistent-function-scoping": "off",
"unicorn/import-style": "off",
"unicorn/no-array-callback-reference": "off",
"unicorn/no-array-method-this-argument": "off",
"unicorn/no-array-reduce": "off",
"unicorn/no-await-expression-member": "off",
"unicorn/no-for-loop": "off",
"unicorn/no-hex-escape": "off",
"unicorn/no-negated-condition": "off",
"unicorn/no-nested-ternary": "off",
"unicorn/no-null": "off",
"unicorn/no-process-exit": "off",
"unicorn/no-thenable": "off",
"unicorn/no-unreadable-array-destructuring": "off",
"unicorn/no-useless-switch-case": "off",
"unicorn/no-useless-undefined": [
"error",
{
checkArrowFunctionBody: false,
},
],
"unicorn/number-literal-case": "off",
"unicorn/numeric-separators-style": "off",
"unicorn/prefer-array-flat": [
"error",
{
functions: ["flat", "flatten"],
},
],
"unicorn/prefer-add-event-listener": "off",
"unicorn/prefer-at": [
"error",
{
getLastElementFunctions: ["getLast"],
},
],
"unicorn/prefer-code-point": "off",
"unicorn/prefer-dom-node-append": "off",
"unicorn/prefer-dom-node-remove": "off",
"unicorn/prefer-export-from": [
"error",
{
ignoreUsedVariables: true,
},
],
"unicorn/prefer-query-selector": "off",
"unicorn/prefer-ternary": "off",
"unicorn/prevent-abbreviations": "off",
"unicorn/relative-url-style": "off",
"unicorn/switch-case-braces": ["error", "avoid"],
2024-06-13 09:13:41 +08:00
"unicorn/template-indent": "error",
2024-01-08 14:48:45 +08:00
},
linterOptions: {
reportUnusedDisableDirectives: "error",
},
2024-01-08 14:48:45 +08:00
},
{
ignores,
2024-01-08 14:48:45 +08:00
},
// CommonJS modules
{
files: [
"**/*.cjs",
"scripts/tools/eslint-plugin-prettier-internal-rules/**/*.js",
"website/**/*.js",
],
languageOptions: {
sourceType: "script",
},
rules: {
strict: ["error", "global"],
2024-01-08 14:48:45 +08:00
"unicorn/prefer-module": "off",
"unicorn/prefer-node-protocol": "off",
},
},
{
files: ["scripts/**/*", "tests/config/install-prettier.js"],
rules: {
"no-console": "off",
},
},
{
files: ["scripts/**/*.js"],
rules: {
"unicorn/prefer-top-level-await": "error",
},
},
2024-02-21 15:36:05 +08:00
{
2024-01-08 14:48:45 +08:00
files: [
"tests/config/**/*.js",
"tests/format/**/format.test.js",
"tests/integration/**/*.js",
"tests/unit/**/*.js",
"tests/dts/unit/**/*.js",
"scripts/release/__tests__/**/*.spec.js",
],
plugins: { jest: eslintPluginJest },
2024-02-21 15:36:05 +08:00
languageOptions: {
globals: eslintPluginJest.environments.globals.globals,
},
2024-01-08 14:48:45 +08:00
rules: {
"@stylistic/js/quotes": [
"error",
"double",
{
avoidEscape: true,
allowTemplateLiterals: true,
},
],
"jest/valid-expect": [
"error",
{
alwaysAwait: true,
},
],
"jest/prefer-to-be": "error",
},
2024-02-21 15:36:05 +08:00
},
2024-01-08 14:48:45 +08:00
{
files: ["tests/format/**/*.js"],
rules: {
"prettier-internal-rules/no-legacy-format-test": "error",
2024-01-08 14:48:45 +08:00
},
},
{
files: ["tests/integration/**/*.js"],
rules: {
"prettier-internal-rules/await-cli-tests": "error",
},
},
{
files: ["tests/**/*.js"],
rules: {
// TODO: Enable this when we drop support for Node.js v14
"logical-assignment-operators": "off",
"unicorn/prefer-array-flat": "off",
"unicorn/prefer-array-flat-map": "off",
"unicorn/prefer-string-replace-all": "off",
},
languageOptions: {
globals: {
runCli: "readonly",
runFormatTest: "readonly",
2024-01-08 14:48:45 +08:00
},
},
},
{
files: ["src/cli/**/*.js"],
rules: {
"n/no-restricted-import": [
"error",
[
{
name: [
toPath("src/**"),
`!${toPath("src/cli/**")}`,
`!${toPath("src/index.js")}`,
],
message: "Don't use code from other directory.",
},
],
],
},
},
{
files: ["src/language-js/needs-parens.js"],
rules: {
"prettier-internal-rules/better-parent-property-check-in-needs-parens":
"error",
},
},
{
files: ["src/**/*.js"],
rules: {
"prettier-internal-rules/flat-ast-path-call": "error",
"prettier-internal-rules/no-conflicting-comment-check-flags": "error",
"prettier-internal-rules/no-doc-public-import": "error",
"prettier-internal-rules/no-empty-flat-contents-for-if-break": "error",
"prettier-internal-rules/no-unnecessary-ast-path-call": "error",
"prettier-internal-rules/prefer-ast-path-each": "error",
"prettier-internal-rules/prefer-indent-if-break": "error",
"prettier-internal-rules/prefer-is-non-empty-array": "error",
"prettier-internal-rules/prefer-ast-path-getters": "error",
},
},
{
files: ["src/language-*/**/*.js"],
rules: {
"prettier-internal-rules/directly-loc-start-end": "error",
},
},
{
files: ["src/language-js/**/*.js"],
ignores: ["src/language-js/parse/postprocess/*.js"],
rules: {
"prettier-internal-rules/no-node-comments": [
"error",
{
file: "src/language-js/utils/index.js",
functions: ["hasComment", "getComments"],
},
"src/language-js/pragma.js",
"src/language-js/parse/babel.js",
"src/language-js/parse/meriyah.js",
"src/language-js/parse/json.js",
"src/language-js/parse/acorn.js",
"src/language-js/parse/utils/wrap-babel-expression.js",
],
"prettier-internal-rules/prefer-create-type-check-function": [
"error",
{
ignoreSingleType: true,
onlyTopLevelFunctions: true,
},
],
},
},
2024-09-19 00:41:52 +08:00
{
2024-01-08 14:48:45 +08:00
files: ["website/**/*"],
2024-09-19 00:41:52 +08:00
...eslintPluginReact.configs.flat.recommended,
},
{
files: ["website/**/*"],
languageOptions: {
globals: { ...globals.browser, ...globals.worker },
},
2024-01-08 14:48:45 +08:00
settings: {
react: {
version: "18",
},
},
rules: {
"react/display-name": "off",
"react/no-deprecated": "off",
"react/prop-types": "off",
"unicorn/filename-case": "off",
},
},
{
files: ["website/playground/**/*"],
languageOptions: {
sourceType: "module",
},
},
{
files: ["bin/prettier.cjs"],
languageOptions: {
ecmaVersion: 5,
},
rules: {
"no-var": "off",
"prefer-arrow-callback": "off",
},
},
];