From 2f35dae7dfeaa014d72c969fa39377902019f2fa Mon Sep 17 00:00:00 2001 From: Anthony Fu Date: Mon, 25 Sep 2023 01:58:11 +0800 Subject: [PATCH] feat: support reading `.gitignore` by default, close #254 --- README.md | 5 +++-- package.json | 1 + pnpm-lock.yaml | 14 ++++++++++++++ src/factory.ts | 21 +++++++++++++++++++-- src/types.ts | 12 ++++++++++++ 5 files changed, 49 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index d204bbe3af..1ef60db6fc 100644 --- a/README.md +++ b/README.md @@ -5,12 +5,13 @@ - Single quotes, no semi - Auto fix for formatting (aimed to be used standalone **without** Prettier) - Designed to work with TypeScript, Vue out-of-box -- Lint also for json, yaml, markdown +- Lints also for json, yaml, markdown - Sorted imports, dangling commas - Reasonable defaults, best practices, only one-line of config +- Respects `.gitignore` by default - [ESLint Flat config](https://eslint.org/docs/latest/use/configure/configuration-files-new), compose easily! - Using [ESLint Stylistic](https://github.com/eslint-stylistic/eslint-stylistic) -- **Style principle**: Minimal for reading, stable for diff +- **Style principle**: Minimal for reading, stable for diff, consistent > [!IMPORTANT] > The main branch is for v1.0-beta, which rewrites to ESLint Flat config, check [#250](https://github.com/antfu/eslint-config/pull/250) for more details. diff --git a/package.json b/package.json index 14670f8ab6..014110c33a 100644 --- a/package.json +++ b/package.json @@ -41,6 +41,7 @@ "@stylistic/eslint-plugin-ts": "0.0.4", "@typescript-eslint/eslint-plugin": "^6.7.2", "@typescript-eslint/parser": "^6.7.2", + "eslint-config-flat-gitignore": "^0.1.0", "eslint-define-config": "^1.23.0", "eslint-plugin-antfu": "^1.0.0-beta.6", "eslint-plugin-eslint-comments": "^3.2.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ec4336ad62..2468d4a198 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -23,6 +23,9 @@ importers: '@typescript-eslint/parser': specifier: ^6.7.2 version: 6.7.2(eslint@8.50.0)(typescript@5.2.2) + eslint-config-flat-gitignore: + specifier: ^0.1.0 + version: 0.1.0 eslint-define-config: specifier: ^1.23.0 version: 1.23.0 @@ -2061,6 +2064,12 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} + /eslint-config-flat-gitignore@0.1.0: + resolution: {integrity: sha512-5nQMQFRkkhCb+ejFhKSATn/41I7ot9oRcnEDzfqwMlBE9036qM9ioYBDtKLpwmlICXr/J7naMFfb39pa4v4sGA==} + dependencies: + parse-gitignore: 2.0.0 + dev: false + /eslint-define-config@1.23.0: resolution: {integrity: sha512-4mMyu0JuBkQHsCtR+42irIQdFLmLIW+pMAVcyOV/gZRL4O1R8iuH0eMG3oL3Cbi1eo9fDAfT5CIHVHgdyxcf6w==} engines: {node: ^16.13.0 || >=18.0.0, npm: '>=7.0.0', pnpm: '>= 8.6.0'} @@ -3367,6 +3376,11 @@ packages: is-hexadecimal: 1.0.4 dev: false + /parse-gitignore@2.0.0: + resolution: {integrity: sha512-RmVuCHWsfu0QPNW+mraxh/xjQVw/lhUCUru8Zni3Ctq3AoMhpDTq0OVdKS6iesd6Kqb7viCV3isAL43dciOSog==} + engines: {node: '>=14'} + dev: false + /parse-json@5.2.0: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} diff --git a/src/factory.ts b/src/factory.ts index 4c1786b2da..7d88c173e5 100644 --- a/src/factory.ts +++ b/src/factory.ts @@ -1,6 +1,8 @@ import process from 'node:process' +import fs from 'node:fs' import type { FlatESLintConfigItem } from 'eslint-define-config' import { isPackageExists } from 'local-pkg' +import gitignore from 'eslint-config-flat-gitignore' import { comments, ignores, @@ -43,8 +45,22 @@ export function antfu(options: OptionsConfig & FlatESLintConfigItem = {}, ...use const enableVue = options.vue ?? (isPackageExists('vue') || isPackageExists('nuxt') || isPackageExists('vitepress') || isPackageExists('@slidev/cli')) const enableTypeScript = options.typescript ?? (isPackageExists('typescript')) const enableStylistic = options.stylistic ?? true + const enableGitignore = options.gitignore ?? true - const configs = [ + const configs: FlatESLintConfigItem[][] = [] + + if (enableGitignore) { + if (typeof enableGitignore !== 'boolean') { + configs.push([gitignore(enableGitignore)]) + } + else { + if (fs.existsSync('.gitignore')) + configs.push([gitignore()]) + } + } + + // Base configs + configs.push( ignores, javascript({ isInEditor }), comments, @@ -52,10 +68,11 @@ export function antfu(options: OptionsConfig & FlatESLintConfigItem = {}, ...use jsdoc, imports, unicorn, - ] + ) // In the future we may support more component extensions like Svelte or so const componentExts: string[] = [] + if (enableVue) componentExts.push('vue') diff --git a/src/types.ts b/src/types.ts index 192d4ab122..070ec293fc 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,3 +1,5 @@ +import type { FlatGitignoreOptions } from 'eslint-config-flat-gitignore' + export interface OptionsComponentExts { /** * Additional extensions for components. @@ -22,6 +24,16 @@ export interface OptionsIsInEditor { } export interface OptionsConfig { + /** + * Enable gitignore support. + * + * Passing an object to configure the options. + * + * @see https://github.com/antfu/eslint-config-flat-gitignore + * @default true + */ + gitignore?: boolean | FlatGitignoreOptions + /** * Enable TypeScript support. *