npm.io
6.1.5 • Published 4 months ago

@ntnyq/eslint-config

Licence
MIT
Version
6.1.5
Deps
42
Size
904 kB
Vulns
0
Weekly
0

@ntnyq/eslint-config

ESLint config for JavaScript, TypeScript, Vue, JSON, Markdown, YAML, TOML, SVG, and more.

CI NPM VERSION NPM DOWNLOADS LICENSE

Feel free to create and maintain your own fork if you think this is too opinionated.

Requirements

  • Node.js ^20.19.0 || ^22.13.0 || >=24
  • ESLint ^9.38.0

For Node.js v18 support, please use v4.

For Node.js versions below 20.19.0, please use v5.

Features

  • Designed to work alongside formatters, e.g. Prettier or oxfmt
  • Opinionated: single quote, no semi, trailing comma, etc
  • Respect .gitignore via eslint-config-flat-gitignore
  • Out-of-the-box support for TypeScript, Vue, JSON, Markdown, YAML, TOML, SVG, Astro, Svelte, etc
  • Strict but provides useful rules to guard your codebase
  • Custom ESLint commands for eslint-plugin-command
  • ESLint flat config for ESLint v9.38.0+

Install

npm i eslint typescript @ntnyq/eslint-config -D
yarn add eslint typescript @ntnyq/eslint-config -D
pnpm add eslint typescript @ntnyq/eslint-config -D
bun add eslint typescript @ntnyq/eslint-config -D

Usage

Highly recommend using eslint.config.mjs as the config file:

// @ts-check

import { defineESLintConfig } from '@ntnyq/eslint-config'

export default defineESLintConfig(
  // Options here
  {
    // Enable a config
    svgo: true,
    // Disable a config
    jsdoc: false,
    vue: {
      // Overrides built-in rules
      overrides: {
        'vue/slot-name-casing': 'off',
      },
    },
  },
  // Optional user configs here
  [
    {
      files: ['**/utils/*.ts'],
      rules: {
        'antfu/top-level-function': 'error',
      },
    },
  ],
)

Add a lint script to package.json:

{
  "scripts": {
    "lint": "eslint",
    "lint:fix": "eslint --fix"
  }
}
Integration: Prettier, VS Code, husky and nano-staged

Prettier config

Feel free to use your own prettier config.

Install prettier and set up your Prettier config:

npm i prettier @ntnyq/prettier-config -D
yarn add prettier @ntnyq/prettier-config -D
pnpm add prettier @ntnyq/prettier-config -D
bun add prettier @ntnyq/prettier-config -D
// prettier.config.mjs
// @ts-check

import { defineConfig } from '@ntnyq/prettier-config'

export default defineConfig({
  // Custom options if needed
  printWidth: 100,
  trailingComma: 'none',
  overrides: [
    {
      files: ['**/*.html'],
      options: {
        singleAttributePerLine: false,
      },
    },
    {
      files: ['**/*.{css,scss,less}'],
      options: {
        singleQuote: false,
      },
    },
  ],
})

VS Code config

{
  "eslint.enable": true,
  "prettier.enable": true,
  "editor.formatOnSave": true,
  "prettier.configPath": "./prettier.config.mjs",
  "editor.defaultFormatter": "esbenp.prettier-vscode",
  "editor.codeActionsOnSave": {
    "source.fixAll.eslint": "explicit",
    "source.organizeImports": "never",
    "source.sortImports": "never"
  },
  "eslint.validate": [
    "vue",
    "yaml",
    "toml",
    "json",
    "jsonc",
    "json5",
    "markdown",
    "javascript",
    "typescript",
    "javascriptreact",
    "typescriptreact"
  ]
}

Lint changed files only

1. Add dependencies
pnpm add husky nano-staged -D
2. Config in package.json
{
  "scripts": {
    "prepare": "husky"
  },
  "nano-staged": {
    "*.{js,ts,cjs,mjs,jsx,tsx,vue,md,svg,yml,yaml,toml,json}": "eslint --fix",
    "*.{css,scss,html}": "prettier -uw"
  }
}
3. Add a Git hook
echo "nano-staged" > .husky/pre-commit

View what rules are enabled

Please check eslint-config-inspector powered by @eslint/config-inspector.

Advanced config

For details, see:

Config interface
export interface ConfigOptions {
  /**
   * Shareable options
   */
  shareable?: OptionsShareable

  /**
   * Configs enabled by default
   */
  command?: ConfigCommandOptions
  eslintComments?: ConfigESLintCommentsOptions
  ignores?: ConfigIgnoresOptions
  javascript?: ConfigJavaScriptOptions
  node?: ConfigNodeOptions

  /**
   * Configs below can be disabled
   */
  antfu?: boolean | ConfigAntfuOptions
  deMorgan?: boolean | ConfigDeMorganOptions
  depend?: boolean | ConfigDependOptions
  githubAction?: boolean | ConfigGitHubActionOptions
  gitignore?: boolean | ConfigGitIgnoreOptions
  importX?: boolean | ConfigImportXOptions
  jsdoc?: boolean | ConfigJsdocOptions
  jsonc?: boolean | ConfigJsoncOptions
  markdown?: boolean | ConfigMarkdownOptions
  ntnyq?: boolean | ConfigNtnyqOptions
  perfectionist?: boolean | ConfigPerfectionistOptions
  pinia?: boolean | ConfigPiniaOptions
  prettier?: boolean | ConfigPrettierOptions
  regexp?: boolean | ConfigRegexpOptions
  sort?: boolean | ConfigSortOptions
  specials?: boolean | ConfigSpecialsOptions
  test?: boolean | ConfigTestOptions
  toml?: boolean | ConfigTomlOptions
  typescript?: boolean | ConfigTypeScriptOptions
  unicorn?: boolean | ConfigUnicornOptions
  unocss?: boolean | ConfigUnoCSSOptions
  vue?: boolean | ConfigVueOptions
  yml?: boolean | ConfigYmlOptions

  /**
   * Configs below are disabled by default
   */
  astro?: boolean | ConfigAstroOptions
  html?: boolean | ConfigHtmlOptions
  pnpm?: boolean | ConfigPnpmOptions
  oxfmt?: boolean | ConfigOxfmtOptions
  svelte?: boolean | ConfigSvelteOptions
  svgo?: boolean | ConfigSVGOOptions
  eslintPlugin?: boolean | ConfigESLintPluginOptions
  unusedImports?: boolean | ConfigUnusedImportsOptions
}

Versioning policy

This project aims to follow Semantic Versioning for releases.

Changes treated as Breaking Changes
  • Node.js version requirement changes
  • Huge refactors that might break the config
  • Plugins made major changes that might break the config
  • Changes that might affect most of the codebases
Changes treated as Non-Breaking Changes
  • Enable/disable rules and plugins (that might become stricter)
  • Rule option changes
  • Version bumps of dependencies

Credits

License

MIT License 2023-PRESENT ntnyq

Keywords