npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@deviltea/eslint-config

v9.0.0

Published

DevilTea's opinionated ESLint flat config for JavaScript, TypeScript, and Vue.

Readme

@deviltea/eslint-config

npm

An opinionated ESLint flat config for JavaScript, TypeScript, and Vue, built on @antfu/eslint-config.

This package keeps Antfu's composable factory API while applying DevilTea's project conventions. It is intentionally a personal, strongly opinionated config rather than a general-purpose preset.

Requirements

| Runtime | Supported version | | --- | --- | | Node.js | >=24 | | ESLint | ^10.4.0 | | Configuration format | ESLint flat config |

TypeScript and Vue support are enabled by default. They can be disabled explicitly when a project does not need them.

Opinionated defaults

The package inherits all defaults from @antfu/[email protected] and adds the following rules.

Stylistic

  • Tabs for indentation.
  • Require a newline for chained calls deeper than one level.
  • Disable antfu/consistent-chaining in favor of style/newline-per-chained-call.

JavaScript and TypeScript

  • Enable no-lonely-if.

Vue

  • Use non-hyphenated attributes and event names.
  • Limit attributes to one per line.
  • Require Composition API or <script setup> component style.
  • Require type-based defineProps and defineEmits declarations.
  • Require the conventional macro variable names props, emit, slots, and attrs.
  • Prefer defineOptions and validate its usage.
  • Disallow unsafe _blank template targets.
  • Require PascalCase component names in templates, including unregistered components.

User-provided nested options are preserved, and user rule overrides take precedence over these defaults.

Installation

pnpm add -D eslint@^10.4.0 @deviltea/eslint-config

Usage

Create eslint.config.mjs:

import deviltea from '@deviltea/eslint-config'

export default deviltea()

Add scripts to package.json:

{
	"scripts": {
		"lint": "eslint .",
		"lint:fix": "eslint . --fix"
	}
}

Customization

The factory accepts the same option shape and returns the same composer type as @antfu/eslint-config.

Override rules

Pass additional flat config objects after the options object:

import deviltea from '@deviltea/eslint-config'

export default deviltea(
	{},
	{
		rules: {
			'no-console': 'warn',
		},
	},
)

Nested overrides take precedence over this package's defaults:

import deviltea from '@deviltea/eslint-config'

export default deviltea({
	typescript: {
		overrides: {
			'no-lonely-if': 'off',
		},
	},
	vue: {
		overrides: {
			'vue/attribute-hyphenation': 'off',
		},
	},
})

Type-aware TypeScript rules

Upstream TypeScript options are preserved while this package merges its default rule overrides:

import deviltea from '@deviltea/eslint-config'

export default deviltea({
	typescript: {
		tsconfigPath: './tsconfig.json',
		overridesTypeAware: {
			'ts/no-floating-promises': 'error',
		},
	},
})

Vue options

Upstream Vue options are preserved while this package merges its default rule overrides:

import deviltea from '@deviltea/eslint-config'

export default deviltea({
	vue: {
		a11y: true,
		vueVersion: 3,
	},
})

Disable TypeScript or Vue

import deviltea from '@deviltea/eslint-config'

export default deviltea({
	typescript: false,
	vue: false,
})

Composer API

The returned config supports the upstream flat-config composer methods:

import deviltea from '@deviltea/eslint-config'

export default deviltea()
	.prepend({
		ignores: ['coverage/**'],
	})

VS Code

Install the VS Code ESLint extension, then add the following to .vscode/settings.json:

{
	// Let ESLint own formatting and fixes.
	"prettier.enable": false,
	"editor.formatOnSave": false,
	"editor.codeActionsOnSave": {
		"source.fixAll.eslint": "explicit",
		"source.organizeImports": "never"
	},

	// Hide fixable stylistic diagnostics in the editor while preserving save fixes.
	"eslint.rules.customizations": [
		{ "rule": "style/*", "severity": "off", "fixable": true },
		{ "rule": "format/*", "severity": "off", "fixable": true },
		{ "rule": "*-indent", "severity": "off", "fixable": true },
		{ "rule": "*-spacing", "severity": "off", "fixable": true },
		{ "rule": "*-spaces", "severity": "off", "fixable": true },
		{ "rule": "*-order", "severity": "off", "fixable": true },
		{ "rule": "*-dangle", "severity": "off", "fixable": true },
		{ "rule": "*-newline", "severity": "off", "fixable": true },
		{ "rule": "*quotes", "severity": "off", "fixable": true },
		{ "rule": "*semi", "severity": "off", "fixable": true }
	],

	// Extend this list with other languages used by the project.
	"eslint.validate": [
		"javascript",
		"javascriptreact",
		"typescript",
		"typescriptreact",
		"vue",
		"json",
		"jsonc",
		"yaml",
		"markdown"
	]
}

The fixable filter is important: it suppresses only diagnostics that ESLint can automatically fix, without hiding non-fixable correctness rules.

Lint staged files

To apply fixes before each commit:

{
	"simple-git-hooks": {
		"pre-commit": "pnpm lint-staged"
	},
	"lint-staged": {
		"*": "eslint --fix"
	}
}
pnpm add -D lint-staged simple-git-hooks
pnpm exec simple-git-hooks

Compatibility and upgrades

@antfu/eslint-config is pinned exactly so reinstalling the same @deviltea/eslint-config version cannot silently change lint behavior. Upstream upgrades are reviewed and released deliberately.

Changes to the supported Node.js or ESLint range, enabled config families, or existing opinionated rule behavior are treated as breaking changes and released as a new major version.