mirror of
https://github.com/Frooodle/Stirling-PDF.git
synced 2025-11-16 01:21:16 +01:00
Extend tsconfig.json from @tsconfig/vite-react and add the package to dependencies. Adjust TypeScript compiler options for improved compatibility with Vite and React, including type inclusions and path aliases. Simplify ESLint config to use recommended settings and remove TypeScript-specific parser options.
229 lines
7.5 KiB
JavaScript
229 lines
7.5 KiB
JavaScript
// @ts-check
|
|
|
|
import eslint from '@eslint/js';
|
|
import globals from 'globals';
|
|
import { defineConfig } from 'eslint/config';
|
|
import reactHooksPlugin from 'eslint-plugin-react-hooks';
|
|
import reactPlugin from 'eslint-plugin-react';
|
|
import tseslint from 'typescript-eslint';
|
|
import { fileURLToPath } from 'node:url';
|
|
|
|
const ignorePatterns = [
|
|
"__tests/**",
|
|
"dist/**",
|
|
"./dist/**",
|
|
"dist/**/*",
|
|
"./dist/**/*",
|
|
"**/dist/**",
|
|
"**/dist/**/*",
|
|
"build/**",
|
|
"./build/**",
|
|
"build/**/*",
|
|
"./build/**/*",
|
|
"**/build/**",
|
|
"**/build/**/*",
|
|
"node_modules/**",
|
|
"./node_modules/**",
|
|
"node_modules/**/*",
|
|
"./node_modules/**/*",
|
|
"**/node_modules/**",
|
|
"**/node_modules/**/*",
|
|
"public/**",
|
|
"./public/**",
|
|
"public/**/*",
|
|
"./public/**/*",
|
|
"**/public/**",
|
|
"**/public/**/*"
|
|
];
|
|
const jsGlobs = ['{src,frontend/src}/**/*.{js,jsx}'];
|
|
const srcGlobs = ['{src,frontend/src}/**/*.{ts,tsx}'];
|
|
const nodeGlobs = [
|
|
'scripts/**/*.{js,ts,mjs}',
|
|
'vite.config.ts',
|
|
'vitest.config.ts',
|
|
'vitest.minimal.config.ts',
|
|
'playwright.config.ts',
|
|
'tailwind.config.js',
|
|
'postcss.config.js',
|
|
'eslint.config.mjs',
|
|
];
|
|
|
|
const __dirname = fileURLToPath(new URL('./', import.meta.url));
|
|
|
|
export default defineConfig(
|
|
{ ignores: ignorePatterns },
|
|
|
|
// Shared settings for all files
|
|
{
|
|
ignores: ignorePatterns,
|
|
rules: {
|
|
semi: "error",
|
|
"prefer-const": "error",
|
|
},
|
|
},
|
|
|
|
// Core rules for all source files
|
|
eslint.configs.recommended,
|
|
|
|
// Specific rules for different types of files
|
|
{
|
|
ignores: [
|
|
...ignorePatterns,
|
|
...jsGlobs,
|
|
...nodeGlobs
|
|
],
|
|
files: srcGlobs,
|
|
extends: [
|
|
reactPlugin.configs.flat.recommended,
|
|
reactPlugin.configs.flat['jsx-runtime'],
|
|
...tseslint.configs.recommendedTypeChecked,
|
|
],
|
|
languageOptions: {
|
|
parser: tseslint.parser,
|
|
parserOptions: {
|
|
projectService: {
|
|
allowDefaultProject: [
|
|
'src/components/tooltips/usePageSelectionTips.tsx',
|
|
'src/reportWebVitals.js',
|
|
'src/setupTests.js'
|
|
],
|
|
defaultProject: './tsconfig.json'
|
|
},
|
|
tsconfigRootDir: __dirname,
|
|
},
|
|
globals: {
|
|
...globals.browser,
|
|
...globals.node,
|
|
},
|
|
},
|
|
plugins: {
|
|
'@typescript-eslint': tseslint.plugin,
|
|
react: reactPlugin,
|
|
'react-hooks': reactHooksPlugin,
|
|
},
|
|
settings: {
|
|
react: {
|
|
version: 'detect',
|
|
},
|
|
},
|
|
rules: {
|
|
// Enabled rules
|
|
'react-hooks/exhaustive-deps': 'warn',
|
|
'react-hooks/rules-of-hooks': 'warn',
|
|
'react/display-name': 'warn',
|
|
'react/no-children-prop': 'warn',
|
|
'react/prop-types': 'warn',
|
|
'react/no-unescaped-entities': 'warn',
|
|
|
|
'@typescript-eslint/array-type': ['warn', { default: 'array', readonly: 'array' }],
|
|
'@typescript-eslint/require-await': 'warn',
|
|
'@typescript-eslint/no-unnecessary-type-assertion': 'warn',
|
|
'@typescript-eslint/prefer-regexp-exec': 'warn',
|
|
'@typescript-eslint/prefer-includes': 'warn',
|
|
'@typescript-eslint/consistent-indexed-object-style': 'warn',
|
|
'@typescript-eslint/class-literal-property-style': 'warn',
|
|
'@typescript-eslint/consistent-type-definitions': 'warn',
|
|
"@typescript-eslint/no-empty-object-type": [
|
|
"error",
|
|
{
|
|
// Allow empty extending interfaces because there's no real reason not to, and it makes it obvious where to put extra attributes in the future
|
|
allowInterfaces: 'with-single-extends',
|
|
},
|
|
],
|
|
"@typescript-eslint/no-explicit-any": "warn", // Temporarily disabled until codebase conformant
|
|
"@typescript-eslint/no-require-imports": "warn", // Temporarily disabled until codebase conformant
|
|
"@typescript-eslint/no-unused-vars": [
|
|
"warn",
|
|
{
|
|
args: 'all', // All function args must be used (or explicitly ignored)
|
|
argsIgnorePattern: '^_', // Allow unused variables beginning with an underscore
|
|
caughtErrors: 'all', // Caught errors must be used (or explicitly ignored)
|
|
caughtErrorsIgnorePattern: '^_', // Allow unused variables beginning with an underscore
|
|
destructuredArrayIgnorePattern: '^_', // Allow unused variables beginning with an underscore
|
|
varsIgnorePattern: '^_', // Allow unused variables beginning with an underscore
|
|
ignoreRestSiblings: true, // Allow unused variables when removing attributes from objects (otherwise this requires explicit renaming like `({ x: _x, ...y }) => y`, which is clunky)
|
|
},
|
|
],
|
|
"no-redeclare": "warn", // Disallow variable redeclaration
|
|
|
|
// Disabled rules (too restrictive or not useful for this codebase)
|
|
'react/react-in-jsx-scope': 'off', // Not needed with React 17+
|
|
"no-unused-vars": "off", // Use the TypeScript version instead
|
|
"no-undef": "off", // Use the TypeScript version instead
|
|
'@typescript-eslint/no-empty-function': 'off', // Ignore empty functions (they're often useful)
|
|
'@typescript-eslint/prefer-nullish-coalescing': 'off', // Ignore preference of ?? over || (both have their uses)
|
|
'@typescript-eslint/unbound-method': 'off', // Ignore unbound methods (they're often useful)
|
|
'@typescript-eslint/restrict-template-expressions': 'off', // Ignore restrictions on template expressions (they're often useful)
|
|
'@typescript-eslint/dot-notation': 'off', // Ignore dot notation (it's often more readable to use bracket notation)
|
|
'@typescript-eslint/non-nullable-type-assertion-style': 'off', // Ignore preference of using !. over other methods (both have their uses)
|
|
'@typescript-eslint/consistent-generic-constructors': 'off', // Ignore preference of using new Array<T>() over Array<T> (both have their uses)
|
|
'@typescript-eslint/no-redundant-type-constituents': 'off', // Ignore redundant type constituents (they're often useful for clarity)
|
|
|
|
// Should be checked
|
|
"@typescript-eslint/no-inferrable-types": "off",
|
|
'@typescript-eslint/await-thenable': 'off',
|
|
'@typescript-eslint/no-unsafe-assignment': 'off',
|
|
'@typescript-eslint/no-unsafe-return': 'off',
|
|
'@typescript-eslint/no-unsafe-call': 'off',
|
|
'@typescript-eslint/no-unsafe-member-access': 'off',
|
|
'@typescript-eslint/no-unsafe-arguments': 'off',
|
|
'@typescript-eslint/no-unsafe-argument': 'off',
|
|
'@typescript-eslint/only-throw-error': 'off',
|
|
'@typescript-eslint/no-floating-promises': 'off',
|
|
'@typescript-eslint/prefer-promise-reject-errors': 'off',
|
|
'@typescript-eslint/prefer-optional-chain': 'off',
|
|
'@typescript-eslint/no-base-to-string': 'off',
|
|
'@typescript-eslint/no-misused-promises': 'off',
|
|
},
|
|
},
|
|
{
|
|
ignores: [
|
|
...ignorePatterns,
|
|
...jsGlobs
|
|
],
|
|
files: nodeGlobs,
|
|
extends: [
|
|
tseslint.configs.disableTypeChecked
|
|
],
|
|
languageOptions: {
|
|
globals: {
|
|
...globals.node,
|
|
},
|
|
},
|
|
},
|
|
{
|
|
files: jsGlobs,
|
|
ignores: [
|
|
...nodeGlobs,
|
|
...ignorePatterns
|
|
],
|
|
extends: [
|
|
reactPlugin.configs.flat.recommended,
|
|
eslint.configs.recommended,
|
|
],
|
|
languageOptions: {
|
|
parserOptions: {
|
|
ecmaFeatures: {
|
|
jsx: true,
|
|
},
|
|
tsconfigRootDir: __dirname,
|
|
},
|
|
globals: {
|
|
...globals.browser,
|
|
...globals.node,
|
|
},
|
|
},
|
|
plugins: {
|
|
react: reactPlugin,
|
|
'react-hooks': reactHooksPlugin,
|
|
},
|
|
settings: { react: { version: 'detect' } },
|
|
rules: {
|
|
'no-unused-vars': 'warn',
|
|
'no-console': 'error',
|
|
'react/jsx-uses-react': 'error',
|
|
'react/jsx-uses-vars': 'error',
|
|
}
|
|
}
|
|
);
|