build: refactor linting setup

This commit is contained in:
iCrawl
2023-08-24 06:43:23 +02:00
parent 788888ab9a
commit fb81f7befb
103 changed files with 1546 additions and 972 deletions

View File

@@ -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,
];