@vp-tw/eslint-configViPro's ESLint configuration.
Check here to preview the ESLint inspection.
pnpm i -D eslint @antfu/eslint-config @vp-tw/eslint-config
Similar to antfu/eslint-config but with additional options:
// eslint.config.ts
import { fileURLToPath } from "node:url";
import { includeIgnoreFile } from "@eslint/compat";
import { vdustr } from "@vp-tw/eslint-config";
import path from "pathe";
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
const eslintignorePath = path.resolve(__dirname, ".eslintignore");
export default vdustr(
{
// By default, we disable `stylistic` and use `prettier` instead.
// stylistic: false,
// Options (defaults shown)
react: false, // Enable React support with eslint-react strict-typescript rules
svelte: false, // Enable Svelte support
packageJson: true, // Enable package.json linting
emotion: false, // Enable Emotion CSS-in-JS linting
tanstackQuery: false, // Enable TanStack Query linting
mdx: false, // Enable MDX linting
storybook: false, // Enable Storybook linting
prettier: true, // Enable eslint-config-prettier to disable formatting rules
// Extends options for fine-grained control
extends: {
react: {
typescript: true, // Use strict-typescript rules (default: true)
},
},
},
includeIgnoreFile(eslintignorePath),
);
When react: true, this config uses @eslint-react/eslint-plugin with strict-typescript rules by default. You can disable TypeScript-specific rules:
export default vdustr({
react: true,
extends: {
react: {
typescript: false, // Use strict rules instead of strict-typescript
},
},
});
Automatically sorts keys in pnpm-workspace.yaml alphabetically using yaml/sort-keys rule.
pnpm install # Install dependencies
pnpm build # Build @vp-tw/eslint-config (in packages/eslint-config)
pnpm test # Run tests for @vp-tw/eslint-config
pnpm run checkTypes # Type check entire workspace
pnpm lint # Lint entire workspace
Managed by changesets. CI auto-publishes when merged to main.
pnpm changeset # Create changeset interactively
When adding support for optional ESLint plugins, create a wrapper in src/lib/:
// src/lib/my-plugin.ts
import type MyPlugin from "eslint-plugin-my";
import { interopDefault } from "@antfu/eslint-config";
// Explicit return type required to avoid TS2742 build errors
const myPlugin = (): Promise<typeof MyPlugin> => interopDefault(import("eslint-plugin-my"));
export { myPlugin };
See CLAUDE.md for detailed architecture and patterns.
MIT © ViPro vdustr@gmail.com (http://vdustr.dev)