mirror of
https://github.com/discordjs/discord.js.git
synced 2026-03-09 16:13:31 +01:00
build: refactor linting setup
This commit is contained in:
137
eslint.config.js
137
eslint.config.js
@@ -1,3 +1,5 @@
|
||||
import { dirname } from 'node:path';
|
||||
import { fileURLToPath } from 'node:url';
|
||||
import unocss from '@unocss/eslint-plugin';
|
||||
import common from 'eslint-config-neon/flat/common.js';
|
||||
import edge from 'eslint-config-neon/flat/edge.js';
|
||||
@@ -6,74 +8,82 @@ import node from 'eslint-config-neon/flat/node.js';
|
||||
import prettier from 'eslint-config-neon/flat/prettier.js';
|
||||
import react from 'eslint-config-neon/flat/react.js';
|
||||
import typescript from 'eslint-config-neon/flat/typescript.js';
|
||||
import deepMerge from 'ts-deepmerge';
|
||||
import merge from 'lodash.merge';
|
||||
|
||||
const generalRuleset = Object.freeze(
|
||||
deepMerge.withOptions({ mergeArrays: false }, ...common, ...node, ...typescript, {
|
||||
files: [
|
||||
'{apps,packages}/**/src/**/*.{ts,tsx,mts,cts,js,jsx,mjs,cjs}',
|
||||
'{apps,packages}/**/bin/**/*.{ts,tsx,mts,cts,js,jsx,mjs,cjs}',
|
||||
'{apps,packages}/**/__tests__/**/*.{ts,tsx,mts,cts,js,jsx,mjs,cjs}',
|
||||
],
|
||||
languageOptions: {
|
||||
parserOptions: {
|
||||
const __filename = fileURLToPath(import.meta.url);
|
||||
const __dirname = dirname(__filename);
|
||||
|
||||
const commonFiles = '{js,mjs,cjs,ts,mts,cts,jsx,tsx}';
|
||||
|
||||
const commonRuleset = merge(...common, { files: [`**/*${commonFiles}`] });
|
||||
|
||||
const nodeRuleset = merge(...node, { files: [`**/*${commonFiles}`] });
|
||||
|
||||
const typeScriptRuleset = merge(...typescript, {
|
||||
files: [`**/*${commonFiles}`],
|
||||
languageOptions: {
|
||||
parserOptions: {
|
||||
allowAutomaticSingleRunInference: true,
|
||||
tsconfigRootDir: __dirname,
|
||||
project: ['./tsconfig.eslint.json', './apps/*/tsconfig.eslint.json', './packages/*/tsconfig.eslint.json'],
|
||||
},
|
||||
},
|
||||
rules: {
|
||||
'@typescript-eslint/consistent-type-definitions': [2, 'interface'],
|
||||
},
|
||||
settings: {
|
||||
'import/resolver': {
|
||||
typescript: {
|
||||
project: ['./tsconfig.eslint.json', './apps/*/tsconfig.eslint.json', './packages/*/tsconfig.eslint.json'],
|
||||
},
|
||||
},
|
||||
rules: {
|
||||
'@typescript-eslint/consistent-type-definitions': [2, 'interface'],
|
||||
'jsdoc/no-undefined-types': 1,
|
||||
},
|
||||
}),
|
||||
);
|
||||
},
|
||||
});
|
||||
|
||||
const reactRuleset = Object.freeze(
|
||||
deepMerge.withOptions({ mergeArrays: false }, generalRuleset, ...react, ...next, ...edge, {
|
||||
files: [
|
||||
'apps/**/src/**/*.{ts,tsx,mts,cts,js,jsx,mjs,cjs}',
|
||||
'apps/**/bin/**/*.{ts,tsx,mts,cts,js,jsx,mjs,cjs}',
|
||||
'apps/**/__tests__/**/*.{ts,tsx,mts,cts,js,jsx,mjs,cjs}',
|
||||
'packages/ui/src/**/*.{ts,tsx,mts,cts,js,jsx,mjs,cjs}',
|
||||
],
|
||||
plugins: {
|
||||
'@unocss': unocss,
|
||||
},
|
||||
rules: {
|
||||
'@unocss/order': 2,
|
||||
'@next/next/no-html-link-for-pages': 0,
|
||||
'react/react-in-jsx-scope': 0,
|
||||
'react/jsx-filename-extension': [1, { extensions: ['.tsx'] }],
|
||||
},
|
||||
settings: {
|
||||
react: {
|
||||
version: 'detect',
|
||||
},
|
||||
},
|
||||
}),
|
||||
);
|
||||
const reactRuleset = merge(...react, {
|
||||
files: [`apps/**/*${commonFiles}`, `packages/ui/**/*${commonFiles}`],
|
||||
plugins: { '@unocss': unocss },
|
||||
rules: {
|
||||
'@unocss/order': 2,
|
||||
'@next/next/no-html-link-for-pages': 0,
|
||||
'react/react-in-jsx-scope': 0,
|
||||
'react/jsx-filename-extension': [1, { extensions: ['.tsx'] }],
|
||||
},
|
||||
});
|
||||
|
||||
const prettierRuleset = Object.freeze(
|
||||
deepMerge.withOptions({ mergeArrays: false }, ...prettier, {
|
||||
files: [
|
||||
'{apps,packages}/**/src/**/*.{ts,tsx,mts,cts,js,jsx,mjs,cjs}',
|
||||
'{apps,packages}/**/bin/**/*.{ts,tsx,mts,cts,js,jsx,mjs,cjs}',
|
||||
'{apps,packages}/**/__tests__/**/*.{ts,tsx,mts,cts,js,jsx,mjs,cjs}',
|
||||
],
|
||||
}),
|
||||
);
|
||||
const nextRuleset = merge(...next, { files: [`apps/**/*${commonFiles}`] });
|
||||
|
||||
const edgeRuleset = merge(...edge, { files: [`apps/**/*${commonFiles}`] });
|
||||
|
||||
const prettierRuleset = merge(...prettier, { files: [`**/*${commonFiles}`] });
|
||||
|
||||
/** @type {import('eslint').Linter.FlatConfig[]} */
|
||||
export default [
|
||||
{
|
||||
ignores: ['**/.next', '**/coverage', '**/dist', '**/node_modules', '**/.contentlayer', '**/template'],
|
||||
},
|
||||
generalRuleset,
|
||||
reactRuleset,
|
||||
{
|
||||
files: [
|
||||
'packages/rest/src/**/*.{ts,tsx,mts,cts,js,jsx,mjs,cjs}',
|
||||
'packages/rest/__tests__/**/*.{ts,tsx,mts,cts,js,jsx,mjs,cjs}',
|
||||
ignores: [
|
||||
'**/node_modules/',
|
||||
'.git/',
|
||||
'**/dist/',
|
||||
'**/template/',
|
||||
'**/coverage/',
|
||||
'**/storybook-static/',
|
||||
'**/.next/',
|
||||
'packages/discord.js/',
|
||||
],
|
||||
},
|
||||
commonRuleset,
|
||||
nodeRuleset,
|
||||
typeScriptRuleset,
|
||||
{
|
||||
files: ['**/*{ts,mts,cts,tsx}'],
|
||||
rules: { 'jsdoc/no-undefined-types': 0 },
|
||||
},
|
||||
{
|
||||
files: [`packages/docgen/**/*${commonFiles}`],
|
||||
rules: { 'import/extensions': 0 },
|
||||
},
|
||||
{
|
||||
files: [`packages/rest/**/*${commonFiles}`],
|
||||
rules: {
|
||||
'n/prefer-global/url': 0,
|
||||
'n/prefer-global/url-search-params': 0,
|
||||
@@ -84,15 +94,18 @@ export default [
|
||||
},
|
||||
},
|
||||
{
|
||||
files: [
|
||||
'packages/voice/src/**/*.{ts,tsx,mts,cts,js,jsx,mjs,cjs}',
|
||||
'packages/voice/__tests__/**/*.{ts,tsx,mts,cts,js,jsx,mjs,cjs}',
|
||||
'packages/voice/__mocks__/**/*.{ts,tsx,mts,cts,js,jsx,mjs,cjs}',
|
||||
],
|
||||
files: [`packages/voice/**/*${commonFiles}`],
|
||||
rules: {
|
||||
'import/extensions': 0,
|
||||
'no-restricted-globals': 0,
|
||||
},
|
||||
},
|
||||
nextRuleset,
|
||||
edgeRuleset,
|
||||
reactRuleset,
|
||||
{
|
||||
files: ['**/*{js,mjs,cjs,jsx}'],
|
||||
rules: { 'tsdoc/syntax': 0 },
|
||||
},
|
||||
prettierRuleset,
|
||||
];
|
||||
|
||||
Reference in New Issue
Block a user