import js from '@eslint/js'; import globals from 'globals'; import tseslint from 'typescript-eslint'; import reactHooks from 'eslint-plugin-react-hooks'; import reactRefresh from 'eslint-plugin-react-refresh'; import { jsdoc } from 'eslint-plugin-jsdoc'; import { fileURLToPath } from 'node:url'; import { dirname } from 'node:path'; const __dirname = dirname(fileURLToPath(import.meta.url)); export default tseslint.config( jsdoc({ rules: { 'jsdoc/no-undefined-types': 'error', }, }), { ignores: [ '**/dist/**', '**/build/**', '**/coverage/**', '**/templates/angular-ts/.angular/**', ], }, js.configs.recommended, { files: ['**/*.{js,cjs,mjs}'], languageOptions: { ecmaVersion: 'latest', sourceType: 'module', globals: globals.node, parserOptions: { project: false, tsconfigRootDir: __dirname, }, }, }, ...tseslint.configs.recommended, { files: ['**/*.{ts,tsx}'], languageOptions: { parser: tseslint.parser, ecmaVersion: 'latest', sourceType: 'module', globals: { ...globals.browser, ...globals.node }, parserOptions: { project: [ './tsconfig.json', './crates/bindings-typescript/tsconfig.json', './crates/bindings-typescript/test-app/tsconfig.json', './templates/react-ts/tsconfig.json', './templates/chat-react-ts/tsconfig.json', './templates/basic-ts/tsconfig.json', './templates/angular-ts/tsconfig.app.json', './docs/tsconfig.json', ], projectService: true, tsconfigRootDir: __dirname, }, }, linterOptions: { reportUnusedDisableDirectives: 'off', }, plugins: { '@typescript-eslint': tseslint.plugin, 'react-hooks': reactHooks, 'react-refresh': reactRefresh, }, rules: { '@typescript-eslint/no-explicit-any': 'off', '@typescript-eslint/no-namespace': 'error', '@typescript-eslint/no-unused-vars': [ 'error', { argsIgnorePattern: '^_', varsIgnorePattern: '^_', destructuredArrayIgnorePattern: '^_', caughtErrorsIgnorePattern: '^_', }, ], 'no-restricted-syntax': [ 'error', { selector: 'TSEnumDeclaration', message: 'Do not use enums; stick to JS-compatible types.', }, { selector: 'TSEnumDeclaration[const=true]', message: 'Do not use const enum; use unions or objects.', }, { selector: 'Decorator', message: 'Do not use decorators.' }, ], ...reactHooks.configs.recommended.rules, 'react-refresh/only-export-components': [ 'warn', { allowConstantExport: true }, ], 'eslint-comments/no-unused-disable': 'off', '@typescript-eslint/no-empty-object-type': [ 'error', { allowObjectTypes: 'always' }, ], }, }, { files: ['templates/angular-ts/src/**/*.ts'], rules: { 'no-restricted-syntax': [ 'error', { selector: 'TSEnumDeclaration', message: 'Do not use enums; stick to JS-compatible types.', }, { selector: 'TSEnumDeclaration[const=true]', message: 'Do not use const enum; use unions or objects.', }, ], 'react-hooks/rules-of-hooks': 'off', 'react-hooks/exhaustive-deps': 'off', 'react-refresh/only-export-components': 'off', }, } );