Skip to content

Commit

Permalink
feat: type support for rules
Browse files Browse the repository at this point in the history
  • Loading branch information
antfu committed Oct 8, 2023
1 parent 4422fb9 commit 4474554
Show file tree
Hide file tree
Showing 24 changed files with 139 additions and 121 deletions.
4 changes: 1 addition & 3 deletions eslint.config.js
@@ -1,3 +1,4 @@
// @ts-check
import sortKeys from 'eslint-plugin-sort-keys'
import styleMigrate from '@stylistic/eslint-plugin-migrate'
import antfu from './dist/index.js'
Expand All @@ -10,9 +11,6 @@ export default antfu(
'fixtures',
'_fixtures',
],
// typescript: {
// tsconfigPath: 'tsconfig.json',
// },
},
{
files: ['src/**/*.ts'],
Expand Down
2 changes: 1 addition & 1 deletion package.json
Expand Up @@ -37,11 +37,11 @@
"eslint": ">=8.0.0"
},
"dependencies": {
"@antfu/eslint-define-config": "^1.23.0-1",
"@stylistic/eslint-plugin": "0.0.6",
"@typescript-eslint/eslint-plugin": "^6.7.4",
"@typescript-eslint/parser": "^6.7.4",
"eslint-config-flat-gitignore": "^0.1.0",
"eslint-define-config": "^1.23.0",
"eslint-plugin-antfu": "^1.0.0-beta.10",
"eslint-plugin-eslint-comments": "^3.2.0",
"eslint-plugin-i": "^2.28.1",
Expand Down
16 changes: 8 additions & 8 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

24 changes: 24 additions & 0 deletions scripts/types.ts
@@ -0,0 +1,24 @@
import fs from 'node:fs/promises'
import { packages } from '@eslint-stylistic/metadata'

const main = packages.find(i => i.shortId === 'default')

console.log(main.rules)

const dts = `
import type {
EslintRules,
MergeIntersection,
TypeScriptRules,
Unprefix,
} from '@antfu/eslint-define-config'
type MergedRules = MergeIntersection<
EslintRules &
Unprefix<TypeScriptRules, '@typescript-eslint/'>
>
export type StylisticRules = Pick<MergedRules, ${main.rules.map(i => `'${i.name}'`).join(' | ')}>
`

fs.writeFile('src/generated/stylistic.ts', dts, 'utf-8')
4 changes: 2 additions & 2 deletions src/configs/comments.ts
@@ -1,7 +1,7 @@
import type { FlatESLintConfigItem } from '../types'
import type { ConfigItem } from '../types'
import { pluginComments } from '../plugins'

export function comments(): FlatESLintConfigItem[] {
export function comments(): ConfigItem[] {
return [
{
name: 'antfu:eslint-comments',
Expand Down
4 changes: 2 additions & 2 deletions src/configs/ignores.ts
@@ -1,7 +1,7 @@
import type { FlatESLintConfigItem } from '../types'
import type { ConfigItem } from '../types'
import { GLOB_EXCLUDE } from '../globs'

export function ignores(): FlatESLintConfigItem[] {
export function ignores(): ConfigItem[] {
return [
{
ignores: GLOB_EXCLUDE,
Expand Down
4 changes: 2 additions & 2 deletions src/configs/imports.ts
@@ -1,7 +1,7 @@
import type { FlatESLintConfigItem, OptionsStylistic } from '../types'
import type { ConfigItem, OptionsStylistic } from '../types'
import { pluginAntfu, pluginImport } from '../plugins'

export function imports(options: OptionsStylistic = {}): FlatESLintConfigItem[] {
export function imports(options: OptionsStylistic = {}): ConfigItem[] {
const {
stylistic = true,
} = options
Expand Down
4 changes: 2 additions & 2 deletions src/configs/javascript.ts
@@ -1,10 +1,10 @@
import globals from 'globals'
import type { FlatESLintConfigItem, OptionsIsInEditor, OptionsOverrides } from '../types'
import type { ConfigItem, OptionsIsInEditor, OptionsOverrides } from '../types'
import { pluginAntfu, pluginUnusedImports } from '../plugins'
import { OFF } from '../flags'
import { GLOB_SRC, GLOB_SRC_EXT } from '../globs'

export function javascript(options: OptionsIsInEditor & OptionsOverrides = {}): FlatESLintConfigItem[] {
export function javascript(options: OptionsIsInEditor & OptionsOverrides = {}): ConfigItem[] {
const {
isInEditor = false,
overrides = {},
Expand Down
4 changes: 2 additions & 2 deletions src/configs/jsdoc.ts
@@ -1,7 +1,7 @@
import type { FlatESLintConfigItem, OptionsStylistic } from '../types'
import type { ConfigItem, OptionsStylistic } from '../types'
import { pluginJsdoc } from '../plugins'

export function jsdoc(options: OptionsStylistic = {}): FlatESLintConfigItem[] {
export function jsdoc(options: OptionsStylistic = {}): ConfigItem[] {
const {
stylistic = true,
} = options
Expand Down
4 changes: 2 additions & 2 deletions src/configs/jsonc.ts
@@ -1,8 +1,8 @@
import type { FlatESLintConfigItem, OptionsOverrides, OptionsStylistic } from '../types'
import type { ConfigItem, OptionsOverrides, OptionsStylistic } from '../types'
import { GLOB_JSON, GLOB_JSON5, GLOB_JSONC } from '../globs'
import { parserJsonc, pluginJsonc } from '../plugins'

export function jsonc(options: OptionsStylistic & OptionsOverrides = {}): FlatESLintConfigItem[] {
export function jsonc(options: OptionsStylistic & OptionsOverrides = {}): ConfigItem[] {
const {
stylistic = true,
overrides = {},
Expand Down
4 changes: 2 additions & 2 deletions src/configs/markdown.ts
@@ -1,9 +1,9 @@
import type { FlatESLintConfigItem, OptionsComponentExts, OptionsOverrides } from '../types'
import type { ConfigItem, OptionsComponentExts, OptionsOverrides } from '../types'
import { GLOB_MARKDOWN, GLOB_MARKDOWN_CODE } from '../globs'
import { pluginMarkdown } from '../plugins'
import { OFF } from '../flags'

export function markdown(options: OptionsComponentExts & OptionsOverrides = {}): FlatESLintConfigItem[] {
export function markdown(options: OptionsComponentExts & OptionsOverrides = {}): ConfigItem[] {
const {
componentExts = [],
overrides = {},
Expand Down
4 changes: 2 additions & 2 deletions src/configs/node.ts
@@ -1,7 +1,7 @@
import type { FlatESLintConfigItem } from '../types'
import type { ConfigItem } from '../types'
import { pluginNode } from '../plugins'

export function node(): FlatESLintConfigItem[] {
export function node(): ConfigItem[] {
return [
{
name: 'antfu:node',
Expand Down
6 changes: 3 additions & 3 deletions src/configs/sort.ts
@@ -1,11 +1,11 @@
import type { FlatESLintConfigItem } from '../types'
import type { ConfigItem } from '../types'

/**
* Sort package.json
*
* Requires `jsonc` config
*/
export function sortPackageJson(): FlatESLintConfigItem[] {
export function sortPackageJson(): ConfigItem[] {
return [
{
files: ['**/package.json'],
Expand Down Expand Up @@ -100,7 +100,7 @@ export function sortPackageJson(): FlatESLintConfigItem[] {
* Requires `jsonc` config
*/

export function sortTsconfig(): FlatESLintConfigItem[] {
export function sortTsconfig(): ConfigItem[] {
return [
{
files: ['**/tsconfig.json', '**/tsconfig.*.json'],
Expand Down
4 changes: 2 additions & 2 deletions src/configs/stylistic.ts
@@ -1,7 +1,7 @@
import type { FlatESLintConfigItem, StylisticConfig } from '../types'
import type { ConfigItem, StylisticConfig } from '../types'
import { pluginAntfu, pluginStylistic } from '../plugins'

export function stylistic(options: StylisticConfig = {}): FlatESLintConfigItem[] {
export function stylistic(options: StylisticConfig = {}): ConfigItem[] {
const {
indent = 2,
quotes = 'single',
Expand Down
4 changes: 2 additions & 2 deletions src/configs/test.ts
@@ -1,9 +1,9 @@
import type { FlatESLintConfigItem, OptionsIsInEditor, OptionsOverrides } from '../types'
import type { ConfigItem, OptionsIsInEditor, OptionsOverrides } from '../types'
import { pluginNoOnlyTests, pluginVitest } from '../plugins'
import { GLOB_TESTS } from '../globs'
import { OFF } from '../flags'

export function test(options: OptionsIsInEditor & OptionsOverrides = {}): FlatESLintConfigItem[] {
export function test(options: OptionsIsInEditor & OptionsOverrides = {}): ConfigItem[] {
const {
isInEditor = false,
overrides = {},
Expand Down
6 changes: 3 additions & 3 deletions src/configs/typescript.ts
@@ -1,21 +1,21 @@
import process from 'node:process'
import type { FlatESLintConfigItem, OptionsComponentExts, OptionsOverrides, OptionsTypeScriptParserOptions, OptionsTypeScriptWithTypes } from '../types'
import type { ConfigItem, OptionsComponentExts, OptionsOverrides, OptionsTypeScriptParserOptions, OptionsTypeScriptWithTypes } from '../types'
import { GLOB_SRC } from '../globs'
import { parserTs, pluginAntfu, pluginImport, pluginTs } from '../plugins'
import { OFF } from '../flags'
import { renameRules } from '../utils'

export function typescript(
options?: OptionsComponentExts & OptionsOverrides & OptionsTypeScriptWithTypes & OptionsTypeScriptParserOptions,
): FlatESLintConfigItem[] {
): ConfigItem[] {
const {
componentExts = [],
overrides = {},
parserOptions = {},
tsconfigPath,
} = options ?? {}

const typeAwareRules: FlatESLintConfigItem['rules'] = {
const typeAwareRules: ConfigItem['rules'] = {
'dot-notation': OFF,
'no-implied-eval': OFF,
'no-throw-literal': OFF,
Expand Down
4 changes: 2 additions & 2 deletions src/configs/unicorn.ts
@@ -1,7 +1,7 @@
import type { FlatESLintConfigItem } from '../types'
import type { ConfigItem } from '../types'
import { pluginUnicorn } from '../plugins'

export function unicorn(): FlatESLintConfigItem[] {
export function unicorn(): ConfigItem[] {
return [
{
name: 'antfu:unicorn',
Expand Down
4 changes: 2 additions & 2 deletions src/configs/vue.ts
@@ -1,11 +1,11 @@
import type { FlatESLintConfigItem, OptionsHasTypeScript, OptionsOverrides, OptionsStylistic } from '../types'
import type { ConfigItem, OptionsHasTypeScript, OptionsOverrides, OptionsStylistic } from '../types'
import { GLOB_VUE } from '../globs'
import { parserTs, parserVue, pluginVue } from '../plugins'
import { OFF } from '../flags'

export function vue(
options: OptionsHasTypeScript & OptionsOverrides & OptionsStylistic = {},
): FlatESLintConfigItem[] {
): ConfigItem[] {
const {
overrides = {},
stylistic = true,
Expand Down
4 changes: 2 additions & 2 deletions src/configs/yaml.ts
@@ -1,11 +1,11 @@
import type { FlatESLintConfigItem, OptionsOverrides, OptionsStylistic } from '../types'
import type { ConfigItem, OptionsOverrides, OptionsStylistic } from '../types'
import { GLOB_YAML } from '../globs'
import { parserYaml, pluginYaml } from '../plugins'
import { OFF } from '../flags'

export function yaml(
options: OptionsOverrides & OptionsStylistic = {},
): FlatESLintConfigItem[] {
): ConfigItem[] {
const {
overrides = {},
stylistic = true,
Expand Down
10 changes: 5 additions & 5 deletions src/factory.ts
Expand Up @@ -2,7 +2,7 @@ import process from 'node:process'
import fs from 'node:fs'
import { isPackageExists } from 'local-pkg'
import gitignore from 'eslint-config-flat-gitignore'
import type { FlatESLintConfigItem, OptionsConfig } from './types'
import type { ConfigItem, OptionsConfig } from './types'
import {
comments,
ignores,
Expand All @@ -23,7 +23,7 @@ import {
} from './configs'
import { combine } from './utils'

const flatConfigProps: (keyof FlatESLintConfigItem)[] = [
const flatConfigProps: (keyof ConfigItem)[] = [
'files',
'ignores',
'languageOptions',
Expand All @@ -44,7 +44,7 @@ const VuePackages = [
/**
* Construct an array of ESLint flat config items.
*/
export function antfu(options: OptionsConfig & FlatESLintConfigItem = {}, ...userConfigs: (FlatESLintConfigItem | FlatESLintConfigItem[])[]) {
export function antfu(options: OptionsConfig & ConfigItem = {}, ...userConfigs: (ConfigItem | ConfigItem[])[]) {
const {
isInEditor = !!((process.env.VSCODE_PID || process.env.JETBRAINS_IDE) && !process.env.CI),
vue: enableVue = VuePackages.some(i => isPackageExists(i)),
Expand All @@ -55,7 +55,7 @@ export function antfu(options: OptionsConfig & FlatESLintConfigItem = {}, ...use
componentExts = [],
} = options

const configs: FlatESLintConfigItem[][] = []
const configs: ConfigItem[][] = []

if (enableGitignore) {
if (typeof enableGitignore !== 'boolean') {
Expand Down Expand Up @@ -152,7 +152,7 @@ export function antfu(options: OptionsConfig & FlatESLintConfigItem = {}, ...use
if (key in options)
acc[key] = options[key] as any
return acc
}, {} as FlatESLintConfigItem)
}, {} as ConfigItem)
if (Object.keys(fusedConfig).length)
configs.push([fusedConfig])

Expand Down
14 changes: 14 additions & 0 deletions src/generated/stylistic.ts
@@ -0,0 +1,14 @@

import type {
EslintRules,
MergeIntersection,
TypeScriptRules,
Unprefix,
} from '@antfu/eslint-define-config'

type MergedRules = MergeIntersection<
EslintRules &
Unprefix<TypeScriptRules, '@typescript-eslint/'>
>

export type StylisticRules = Pick<MergedRules, 'array-bracket-newline' | 'array-bracket-spacing' | 'array-element-newline' | 'arrow-spacing' | 'block-spacing' | 'brace-style' | 'comma-dangle' | 'comma-spacing' | 'comma-style' | 'computed-property-spacing' | 'dot-location' | 'eol-last' | 'func-call-spacing' | 'function-call-argument-newline' | 'function-paren-newline' | 'generator-star-spacing' | 'implicit-arrow-linebreak' | 'indent' | 'jsx-quotes' | 'key-spacing' | 'keyword-spacing' | 'linebreak-style' | 'lines-around-comment' | 'lines-around-directive' | 'lines-between-class-members' | 'max-len' | 'max-statements-per-line' | 'multiline-ternary' | 'new-parens' | 'newline-after-var' | 'newline-before-return' | 'newline-per-chained-call' | 'no-confusing-arrow' | 'no-extra-parens' | 'no-extra-semi' | 'no-floating-decimal' | 'no-mixed-operators' | 'no-mixed-spaces-and-tabs' | 'no-multi-spaces' | 'no-multiple-empty-lines' | 'no-spaced-func' | 'no-tabs' | 'no-trailing-spaces' | 'no-whitespace-before-property' | 'nonblock-statement-body-position' | 'object-curly-newline' | 'object-curly-spacing' | 'object-property-newline' | 'one-var-declaration-per-line' | 'operator-linebreak' | 'padded-blocks' | 'padding-line-between-statements' | 'quote-props' | 'quotes' | 'rest-spread-spacing' | 'semi' | 'semi-spacing' | 'semi-style' | 'space-before-blocks' | 'space-before-function-paren' | 'space-in-parens' | 'space-infix-ops' | 'space-unary-ops' | 'spaced-comment' | 'switch-colon-spacing' | 'template-curly-spacing' | 'template-tag-spacing' | 'wrap-iife' | 'wrap-regex' | 'yield-star-spacing' | 'member-delimiter-style' | 'type-annotation-spacing'>

0 comments on commit 4474554

Please sign in to comment.