This commit is contained in:
Alex
2024-10-19 18:50:17 -04:00
parent 00d0dfa107
commit eb366f3b2e
17 changed files with 2650 additions and 385 deletions

View File

@ -30,7 +30,10 @@ export async function extendConfig({
]);
const result: FlatESLintConfig[] = [
{ rules: eslintRules }, //
{
name: 'eslint-rules/eslint',
rules: eslintRules,
},
...tseslint.configs.recommendedTypeChecked,
importPlugin.flatConfigs.recommended,
importPlugin.flatConfigs.react,
@ -38,6 +41,7 @@ export async function extendConfig({
...unicorn,
stylistic,
{
name: 'eslint-rules: TypeScript and import-x',
files: ['**/*.{js,mjs,cjs,jsx,mjsx,ts,tsx,mtsx}'],
languageOptions: {
parserOptions: {
@ -65,6 +69,7 @@ export async function extendConfig({
},
},
{
name: 'eslint-rules: Disable type checking',
files: ['*.js', '*.mjs', '*.cjs', '*.jsx'],
...tseslint.configs.disableTypeChecked,
rules: {
@ -76,6 +81,7 @@ export async function extendConfig({
},
},
{
name: 'eslint-rules: .d.ts files',
files: ['*.d.ts'],
rules: {
'@typescript-eslint/consistent-type-imports': off,

6
src/modules.d.ts vendored
View File

@ -18,7 +18,13 @@ declare module 'eslint-plugin-storybook' {
import type { Linter } from 'eslint';
export const configs: {
/** @deprecated */
csf: Linter.Config;
/** @deprecated */
recommended: Linter.Config;
'flat/csf': Linter.Config;
'flat/recommended': Linter.Config;
'flat/csf-strict': Linter.Config;
'flat/addon-interactions': Linter.Config;
};
}

View File

@ -4,6 +4,7 @@ import { defineConfig } from '../types';
export default defineConfig([
{
name: 'eslint-rules/custom',
plugins: { custom: plugin },
rules: {
'custom/no-import-dot': error,
@ -11,8 +12,10 @@ export default defineConfig([
} satisfies Partial<LocalRuleOptions>,
},
{
name: 'eslint-rules/typed-custom',
plugins: { 'typed-custom': typedPlugin },
files: ['*.ts', '!*.d.ts'],
files: ['*.ts'],
ignores: ['*.d.ts'],
rules: {
'typed-custom/restrict-template-expressions': error,
} satisfies Partial<LocalRuleOptions>,

View File

@ -10,5 +10,5 @@ const jsdocRules: Partial<JSDocRulesObject> = {
export default defineConfig([
module.configs['flat/recommended-typescript'],
{ rules: jsdocRules },
{ name: 'eslint-rules/jsdoc', rules: jsdocRules },
]);

View File

@ -2,8 +2,8 @@ import { def } from '../middleware';
import { defineConfig } from '../types';
export async function storybook() {
const { configs } = await import('eslint-plugin-storybook');
return defineConfig([configs.recommended]);
const { configs } = def(await import('eslint-plugin-storybook'));
return defineConfig([configs['flat/recommended']]);
}
export async function reactQuery() {

View File

@ -1,5 +1,6 @@
import type { ReactRulesObject } from '@aet/eslint-define-config/src/rules/react';
import type { ReactRefreshRulesObject } from '@aet/eslint-define-config/src/rules/react-refresh';
import type { Linter, ESLint } from 'eslint';
import { error, off, warn } from '../constants';
import { def } from '../middleware';
@ -17,10 +18,11 @@ export async function react() {
const hooks = await import('../../packages/eslint-plugin-react-hooks');
return defineConfig([
reactPlugin.configs['recommended-type-checked'] as any,
reactPlugin.configs['recommended-type-checked'] as unknown as Linter.Config,
hooks.flatConfigs.recommended,
a11y.flatConfigs.recommended,
{
name: 'eslint-rules/react',
files: ['*.tsx'],
rules: reactRules,
},
@ -34,9 +36,9 @@ const refreshRules: Partial<ReactRefreshRulesObject> = {
export async function reactRefresh() {
const refreshPlugin = def(await import('eslint-plugin-react-refresh'));
return defineConfig({
name: 'eslint-rules/react-refresh',
plugins: {
// @ts-expect-error no types
'react-refresh': refreshPlugin,
'react-refresh': refreshPlugin as unknown as ESLint.Plugin,
},
rules: refreshRules,
});

View File

@ -18,6 +18,7 @@ const stylisticRules: Partial<StylisticRulesObject> = {
};
export default defineConfig({
name: 'eslint-rules/stylistic',
plugins: {
stylistic,
},

View File

@ -10,5 +10,8 @@ const tailwindRules: Partial<TailwindRulesObject> = {
export default defineConfig([
...tailwind.configs['flat/recommended'],
{ rules: tailwindRules },
{
name: 'eslint-rules/tailwind',
rules: tailwindRules,
},
]);

View File

@ -6,6 +6,7 @@ import { defineConfig } from '../types';
const testingLibraryRules: Partial<TestingLibraryRulesObject> = {};
export default defineConfig({
name: 'eslint-rules/testing-library',
files: ['**/*.(spec|test).{ts,tsx}'],
...testingLibrary.configs['flat/react'],
rules: {

View File

@ -113,6 +113,7 @@ const unicornRules: Partial<UnicornRulesObject> = {
export default defineConfig([
{
name: 'eslint-rules/unicorn',
languageOptions: {
globals: globals.builtin,
},
@ -122,6 +123,7 @@ export default defineConfig([
rules: unicornRules,
},
{
name: 'eslint-rules/unicorn/tests',
files: ['*.test.ts', '*.test.tsx'],
rules: {
'unicorn/no-useless-undefined': off,

View File

@ -11,6 +11,10 @@ export function defineConfig(config: Linter.Config): Linter.Config;
export function defineConfig(config: Linter.Config[]): Linter.Config[];
export function defineConfig(config: Linter.Config | Linter.Config[]) {
if (!config || (Array.isArray(config) && config.some(c => !c))) {
console.trace();
throw new Error('Config cannot be empty');
}
return config;
}