export default defineConfig()

in packages/eslint-config-ali/src/configs/stylistic.ts [4:607]


export default defineConfig({
  name: 'ali/stylistic',
  plugins: { '@stylistic': stylistic },
  rules: {
    // 强制在数组开括号后和闭括号前换行
    '@stylistic/array-bracket-newline': 'off',

    // 方括号内部两侧无空格-数组
    '@stylistic/array-bracket-spacing': ['error', 'never'],

    // 强制数组元素间换行
    '@stylistic/array-element-newline': 'off',

    // 箭头函数-函数参数始终加上小括号
    // @reason 同 prettier 默认配置值一致:https://prettier.io/docs/en/options.html#arrow-function-parentheses
    '@stylistic/arrow-parens': ['warn', 'always'],

    // 箭头函数的箭头前后各留一个空格
    // @unessential
    '@stylistic/arrow-spacing': ['error', { before: true, after: true }],

    // 单行代码块的大括号内部两侧有空格
    '@stylistic/block-spacing': ['error', 'always'],

    // 大括号换行风格:one true brace style 风格,且单行代码块可不换行
    '@stylistic/brace-style': ['error', '1tbs', { allowSingleLine: true }],

    // 使用小驼峰命名风格
    camelcase: 'off',

    // 强制或禁止对注释的第一个字母大写
    'capitalized-comments': 'off',

    // 用逗号分隔的多行结构,始终加上最后一个逗号(单行不用)
    '@stylistic/comma-dangle': ['error', 'always-multiline'],

    // 逗号的前面无空格,后面有空格
    '@stylistic/comma-spacing': ['error', { before: false, after: true }],

    // 用逗号分隔的多行结构,将逗号放到行尾
    '@stylistic/comma-style': ['error', 'last'],

    // 方括号内部两侧无空格-计算属性
    '@stylistic/computed-property-spacing': ['error', 'never'],

    // 使用一致的 this 别名
    'consistent-this': 'off',

    // 统一在点号之前换行
    // @unessential
    '@stylistic/dot-location': ['error', 'property'],

    // 在文件末尾保留一行空行
    '@stylistic/eol-last': ['warn', 'always'],

    // 函数名与调用它的括号间无空格
    '@stylistic/func-call-spacing': ['error', 'never'],

    // 要求函数名与赋值给它们的变量名或属性名相匹配
    'func-name-matching': [
      'off',
      'always',
      {
        includeCommonJSModuleExports: false,
      },
    ],

    // 要求或禁止命名的函数表达式
    'func-names': 'off',

    // 强制只能使用函数声明或函数表达式
    'func-style': 'off',

    // 在函数的小括号内使用一致的换行风格
    '@stylistic/function-paren-newline': ['error', 'consistent'],

    // generator 函数的 * 号前面无空格,后面有一个空格
    // @unessential
    '@stylistic/generator-star-spacing': ['error', { before: false, after: true }],

    // 禁用指定的标识符
    'id-blacklist': 'off',

    // 强制标识符的最小和最大长度
    'id-length': 'off',

    // 要求标识符匹配一个指定的正则表达式
    'id-match': 'off',

    // 隐式返回的箭头函数体不要换行
    // @reason 同 prettier 有冲突
    '@stylistic/implicit-arrow-linebreak': ['off', 'beside'],

    // 使用 2 个空格缩进
    // @unessential
    '@stylistic/indent': [
      'error',
      2,
      {
        SwitchCase: 1,
        VariableDeclarator: 1,
        outerIIFEBody: 1,
        // MemberExpression: null,
        FunctionDeclaration: {
          parameters: 1,
          body: 1,
        },
        FunctionExpression: {
          parameters: 1,
          body: 1,
        },
        CallExpression: {
          arguments: 1,
        },
        ArrayExpression: 1,
        ObjectExpression: 1,
        ImportDeclaration: 1,
        flatTernaryExpressions: false,
        // list derived from https://github.com/benjamn/ast-types/blob/HEAD/def/jsx.js
        ignoredNodes: [
          'JSXElement',
          'JSXElement > *',
          'JSXAttribute',
          'JSXIdentifier',
          'JSXNamespacedName',
          'JSXMemberExpression',
          'JSXSpreadAttribute',
          'JSXExpressionContainer',
          'JSXOpeningElement',
          'JSXClosingElement',
          'JSXText',
          'JSXEmptyExpression',
          'JSXSpreadChild',
        ],
        ignoreComments: false,
      },
    ],

    // 标签的属性有多行时,结束标签需另起一行
    // @unessential
    '@stylistic/jsx-closing-bracket-location': ['error', 'line-aligned'],

    // JSX 属性或子元素强制使用花括号或禁止使用不必要的花括号
    '@stylistic/jsx-curly-brace-presence': 'off',

    // JSX 属性的大括号内部两侧无空格
    // @unessential
    '@stylistic/jsx-curly-spacing': ['error', 'never', { allowMultiline: true }],

    // 不要在 JSX 属性的等号两边加空格
    // @unessential
    '@stylistic/jsx-equals-spacing': ['error', 'never'],

    // 设置第一个属性的位置。multiline-multiprop:如果JSX标签占用多行并且有多个属性,则第一个属性应始终放在新行上
    // @unessential
    '@stylistic/jsx-first-prop-new-line': ['error', 'multiline-multiprop'],

    // JSX 使用 2 个空格缩进
    // @unessential
    '@stylistic/jsx-indent': ['error', 2],

    // JSX 属性使用 2 个空格缩进
    // @unessential
    '@stylistic/jsx-indent-props': ['error', 2],

    // 标签属性的换行,如果标签有多个属性,且存在换行,则每个属性都需要换行独占一行
    // @unessential
    '@stylistic/jsx-max-props-per-line': ['error', { maximum: 1, when: 'multiline' }],

    // 使用大驼峰风格命名组件
    '@stylistic/jsx-pascal-case': [
      'error',
      {
        allowAllCaps: true,
        ignore: [],
      },
    ],

    // JSX 行内属性间仅有一个空格
    // @unessential
    '@stylistic/jsx-props-no-multi-spaces': 'error',

    // JSX 属性使用双引号,不要使用单引号
    // @unessential
    '@stylistic/jsx-quotes': ['error', 'prefer-double'],

    // 属性按首字母排序
    '@stylistic/jsx-sort-props': [
      'off',
      {
        ignoreCase: true,
        callbacksLast: false,
        shorthandFirst: false,
        shorthandLast: false,
        noSortAlphabetically: false,
        reservedFirst: true,
      },
    ],

    // 自闭合标签的斜线前有且仅有一个空格
    // @unessential
    '@stylistic/jsx-tag-spacing': [
      'error',
      {
        closingSlash: 'never',
        beforeSelfClosing: 'always',
        afterOpening: 'never',
      },
    ],

    // 多行的 JSX 标签需用小括号包裹
    // @unessential
    '@stylistic/jsx-wrap-multilines': [
      'error',
      {
        declaration: true,
        assignment: true,
        return: true,
        arrow: true,
      },
    ],

    // 定义对象字面量时,key, value 之间有且只有一个空格
    '@stylistic/key-spacing': ['error', { beforeColon: false, afterColon: true }],

    // 关键字前后各一个空格
    '@stylistic/keyword-spacing': [
      'error',
      {
        before: true,
        after: true,
        overrides: {
          return: { after: true },
          throw: { after: true },
          case: { after: true },
        },
      },
    ],

    // 单行注释应单独一行写在被注释对象的上方,不要追加在某条语句的后面
    '@stylistic/line-comment-position': [
      'off',
      {
        position: 'above',
        ignorePattern: '',
        applyDefaultPatterns: true,
      },
    ],

    // 指定 unix 或 windows 风格的换行符
    '@stylistic/linebreak-style': 'off',

    // 类成员之间保留一个空行
    '@stylistic/lines-between-class-members': ['off', 'always', { exceptAfterSingleLine: false }],

    // 要求在注释周围有空行
    '@stylistic/lines-around-comment': 'off',

    // 控制语句的嵌套层级不要过深,不要超过 4 级
    // @reason 适合做后置检查
    'max-depth': ['off', 4],

    // 单行最大字符数:100
    '@stylistic/max-len': [
      'warn',
      100,
      2,
      {
        ignoreUrls: true,
        ignoreComments: false,
        ignoreRegExpLiterals: true,
        ignoreStrings: true,
        ignoreTemplateLiterals: true,
      },
    ],

    // 文件最大行数:1000
    // @reason 适合做后置检查
    'max-lines': [
      'off',
      {
        max: 1000,
        skipBlankLines: true,
        skipComments: true,
      },
    ],

    // 函数最大行数:80
    // @reason 适合做后置检查
    'max-lines-per-function': [
      'off',
      {
        max: 80,
        skipBlankLines: true,
        skipComments: true,
        IIFEs: true,
      },
    ],

    // 回调函数最大嵌套深度
    'max-nested-callbacks': 'off',

    // 函数参数数量上限
    'max-params': ['off', 3],

    // 函数块最多允许的的语句数量
    'max-statements': ['off', 10],

    // 每一行中所允许的最大语句数量
    '@stylistic/max-statements-per-line': ['off', { max: 1 }],

    /**
     * 【强制】interface/type 类型中保持一致的成员分隔符分号「;」,单行类型的最后一个元素不加分号
     * @link https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/docs/rules/member-delimiter-style.md
     */
    '@stylistic/member-delimiter-style': 'error',

    // 多行注释的风格
    '@stylistic/multiline-comment-style': ['off', 'starred-block'],

    // 要求或禁止在三元操作数中间换行
    '@stylistic/multiline-ternary': ['off', 'never'],

    // 使用大驼峰风格命名类和构造函数
    'new-cap': [
      'error',
      {
        newIsCap: true,
        newIsCapExceptions: [],
        capIsNew: false,
        capIsNewExceptions: ['Immutable.Map', 'Immutable.Set', 'Immutable.List'],
      },
    ],

    // 禁止在调用构造函数时省略小括号
    '@stylistic/new-parens': 'error',

    // 在长方法链式调用时进行换行
    '@stylistic/newline-per-chained-call': ['warn', { ignoreChainWithDepth: 4 }],

    // 不要使用 new Array() 和 Array() 创建数组,除非为了构造某一长度的空数组。
    'no-array-constructor': 'error',

    // 不要使用按位操作符
    'no-bitwise': 'warn',

    // 避免箭头函数与比较操作符产生混淆
    // @unessential
    '@stylistic/no-confusing-arrow': 'error',

    // 禁用 continue 语句
    'no-continue': 'off',

    // 禁止不必要的小括号
    '@stylistic/no-extra-parens': [
      'off',
      'all',
      {
        conditionalAssign: true,
        nestedBinaryExpressions: false,
        returnAssign: false,
        ignoreJSX: 'all', // delegate to eslint-plugin-react
        enforceForArrowConditionals: false,
      },
    ],

    // 禁止不必要的分号
    '@stylistic/no-extra-semi': 'error',

    // 不要省略小数点前或小数点后的 0
    '@stylistic/no-floating-decimal': 'error',

    // 禁止行内注释
    'no-inline-comments': 'off',

    // 禁止 if 作为唯一语句出现在 else 中,此时应写成 else if
    'no-lonely-if': 'error',

    // 混合使用多种操作符时,用小括号包裹分组
    '@stylistic/no-mixed-operators': [
      'error',
      {
        groups: [
          ['%', '**'],
          ['%', '+'],
          ['%', '-'],
          ['%', '*'],
          ['%', '/'],
          ['**', '+'],
          ['**', '-'],
          ['**', '*'],
          ['**', '/'],
          ['&', '|', '^', '~', '<<', '>>', '>>>'],
          ['==', '!=', '===', '!==', '>', '>=', '<', '<='],
          ['&&', '||'],
          ['in', 'instanceof'],
        ],
        allowSamePrecedence: false,
      },
    ],

    // 不要混用空格和 tab
    '@stylistic/no-mixed-spaces-and-tabs': 'error',

    // 禁止连续赋值
    'no-multi-assign': ['error'],

    // 禁止出现多个连续空格
    // @unessential
    '@stylistic/no-multi-spaces': [
      'error',
      {
        ignoreEOLComments: false,
      },
    ],

    // 禁止出现多个(大于 2 个)连续空行
    '@stylistic/no-multiple-empty-lines': ['error', { max: 2, maxEOF: 1 }],

    // 禁用否定的表达式
    'no-negated-condition': 'off',

    // 不要使用嵌套的三元表达式
    'no-nested-ternary': 'error',

    // 使用字面量创建对象
    'no-new-object': 'error',

    // 不要使用一元自增自减运算符
    'no-plusplus': ['off', { allowForLoopAfterthoughts: true }],

    // 禁用特定的语法
    'no-restricted-syntax': 'off',

    // 禁止使用 tab
    '@stylistic/no-tabs': 'error',

    // 禁用三元操作符
    'no-ternary': 'off',

    // 行尾不要留有空格
    '@stylistic/no-trailing-spaces': [
      'error',
      {
        skipBlankLines: false,
        ignoreComments: false,
      },
    ],

    // 命名不要以下划线开头或结尾
    'no-underscore-dangle': 'off',

    // 避免不必要的三元表达式
    'no-unneeded-ternary': ['error', { defaultAssignment: false }],

    // 禁止属性调用前有空格
    '@stylistic/no-whitespace-before-property': 'error',

    // 省略大括号的单行语句前不要换行
    '@stylistic/nonblock-statement-body-position': ['error', 'beside', { overrides: {} }],

    // 强制大括号内换行符的一致性
    '@stylistic/object-curly-newline': 'off',

    // 大括号内部两侧有空格
    '@stylistic/object-curly-spacing': ['error', 'always'],

    // 对象的属性需遵循一致的换行风格:即所有属性要么都换行,要么都写在一行
    '@stylistic/object-property-newline': [
      'error',
      {
        allowAllPropertiesOnSameLine: true,
      },
    ],

    // 一条声明语句声明一个变量
    'one-var': ['error', 'never'],

    // 一行声明一个变量
    '@stylistic/one-var-declaration-per-line': ['error', 'always'],

    // 尽可能使用简写形式的赋值操作符
    'operator-assignment': ['warn', 'always'],

    // 强制操作符使用一致的换行符
    '@stylistic/operator-linebreak': 'off',

    // 块的开始和结束不能是空行
    '@stylistic/padded-blocks': ['warn', { blocks: 'never', classes: 'never', switches: 'never' }],

    // 要求或禁止在语句间填充空行
    '@stylistic/padding-line-between-statements': 'off',

    // 使用扩展运算符替代 Object.assign
    'prefer-object-spread': 'off',

    // 对象字面量的属性名不要用引号包裹,除非包含特殊字符
    '@stylistic/quote-props': [
      'error',
      'as-needed',
      { keywords: false, unnecessary: true, numbers: false },
    ],

    // 字符串优先使用单引号
    '@stylistic/quotes': ['error', 'single', { avoidEscape: true }],

    // 使用 JSDoc 注释
    'require-jsdoc': 'off',

    // 剩余和扩展操作符与操作对象间不应有空格
    '@stylistic/rest-spread-spacing': ['error', 'never'],

    // 使用分号
    // @unessential
    '@stylistic/semi': ['error', 'always'],

    // 分号的前面无空格,后面有空格
    '@stylistic/semi-spacing': ['error', { before: false, after: true }],

    // 分号必须写在行尾
    // @unessential
    '@stylistic/semi-style': ['error', 'last'],

    // 要求对对象属性名排序
    'sort-keys': ['off', 'asc', { caseSensitive: false, natural: true }],

    // 要求对变量声明排序
    'sort-vars': 'off',

    // 块的左大括号前有一个空格
    '@stylistic/space-before-blocks': 'error',

    // 函数声明时,对于命名函数,参数的小括号前无空格;对于匿名函数和 async 箭头函数,参数的小括号前有空格
    '@stylistic/space-before-function-paren': [
      'error',
      {
        anonymous: 'always',
        named: 'never',
        asyncArrow: 'always',
      },
    ],

    // 小括号内部两侧无空格
    '@stylistic/space-in-parens': ['error', 'never'],

    // 中缀操作符两侧有空格
    '@stylistic/space-infix-ops': 'error',

    // 一元操作符两侧无空格,包括 -、+、--、++、!、!!
    '@stylistic/space-unary-ops': [
      'error',
      {
        words: true,
        nonwords: false,
        overrides: {},
      },
    ],

    // 注释内容和注释符之间需留有一个空格
    '@stylistic/spaced-comment': [
      'error',
      'always',
      {
        line: {
          exceptions: ['-', '+'],
          markers: ['=', '!', '/'],
        },
        block: {
          exceptions: ['-', '+'],
          markers: ['=', '!'],
          balanced: true,
        },
      },
    ],

    // switch 的 case 和 default 子句冒号前面无空格,后面有空格
    '@stylistic/switch-colon-spacing': ['error', { after: true, before: false }],

    // 模板字符串中的大括号内部两侧无空格
    // @unessential
    '@stylistic/template-curly-spacing': 'warn',

    // 模板字符串的 tag 后面无空格
    '@stylistic/template-tag-spacing': ['error', 'never'],

    /**
     * 【强制】定义类型时应正确添加空格
     */
    '@stylistic/type-annotation-spacing': 'error',

    // 要求或禁止 Unicode 字节顺序标记 (BOM)
    'unicode-bom': ['off', 'never'],

    // 将立即执行函数表达式(IIFE)用小括号包裹
    '@stylistic/wrap-iife': ['error', 'any', { functionPrototypeMethods: false }],

    // 要求正则表达式被括号括起来
    '@stylistic/wrap-regex': 'off',

    // yield* 表达式的 * 号前面无空格,后面有一个空格
    // @unessential
    '@stylistic/yield-star-spacing': ['error', 'after'],
  },
});