diff --git a/.jscpd.json b/.jscpd.json index 89ec21f0fd..b42c2d17a0 100644 --- a/.jscpd.json +++ b/.jscpd.json @@ -2,8 +2,8 @@ "minTokens": 60, "minLines": 6, "mode": "mild", - "format": ["typescript"], - "pattern": "**/*.ts", + "format": ["typescript", "tsx"], + "pattern": "**/*.{ts,tsx}", "ignore": ["**/tests/**", "**/tsdown.config.ts"], "ignorePattern": [ "(?s)/\\* jscpd:ignore-start \\*/.*?/\\* jscpd:ignore-end \\*/" diff --git a/eslint.config.mjs b/eslint.config.mjs index ef03904390..696b082828 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -27,7 +27,13 @@ export default tseslint.config( // --- our packages: full strictness ------------------------------------- { - files: ['packages/*/*/src/**/*.ts', 'apps/*/src/**/*.ts', 'examples/**/*.ts', 'scripts/**/*.ts', 'website/**/*.ts'], + files: [ + 'packages/*/*/src/**/*.{ts,tsx}', + 'apps/*/src/**/*.{ts,tsx}', + 'examples/**/*.{ts,tsx}', + 'scripts/**/*.{ts,tsx}', + 'website/**/*.{ts,tsx}', + ], extends: [ ...tseslint.configs.strictTypeChecked, ], @@ -80,7 +86,12 @@ export default tseslint.config( // --- tests: same rules, minus the friction that fights test ergonomics -- { - files: ['packages/*/*/tests/**/*.ts', 'apps/*/tests/**/*.ts', 'examples/*/tests/**/*.ts', 'scripts/**/*.spec.ts'], + files: [ + 'packages/*/*/tests/**/*.{ts,tsx}', + 'apps/*/tests/**/*.{ts,tsx}', + 'examples/*/tests/**/*.{ts,tsx}', + 'scripts/**/*.spec.{ts,tsx}', + ], extends: [ ...tseslint.configs.strictTypeChecked, ], @@ -117,7 +128,10 @@ export default tseslint.config( // Context merges collide), so the shared project service cannot resolve // them — parse these through the client aggregate explicitly. { - files: ['packages/client/*/tests/**/*.ts', 'scripts/client-bundle-purity.spec.ts'], + files: [ + 'packages/client/*/tests/**/*.{ts,tsx}', + 'scripts/client-bundle-purity.spec.ts', + ], languageOptions: { parserOptions: { projectService: false, @@ -129,7 +143,7 @@ export default tseslint.config( // --- file-local duplication (all owned TypeScript) --------------------- { - files: ['packages/**/*.ts', 'apps/**/*.ts', 'examples/**/*.ts', 'scripts/**/*.ts', 'website/**/*.ts'], + files: ['packages/**/*.{ts,tsx}', 'apps/**/*.{ts,tsx}', 'examples/**/*.{ts,tsx}', 'scripts/**/*.{ts,tsx}', 'website/**/*.{ts,tsx}'], plugins: { sonarjs }, rules: { // Cross-file clones are covered separately by jscpd. @@ -146,7 +160,14 @@ export default tseslint.config( // --- formatting (everything we own) ------------------------------------- { - files: ['packages/**/*.ts', 'apps/**/*.ts', 'examples/**/*.ts', 'scripts/**/*.ts', 'website/**/*.ts', 'eslint.config.mjs'], + files: [ + 'packages/**/*.{ts,tsx}', + 'apps/**/*.{ts,tsx}', + 'examples/**/*.{ts,tsx}', + 'scripts/**/*.{ts,tsx}', + 'website/**/*.{ts,tsx}', + 'eslint.config.mjs', + ], plugins: { '@stylistic': stylistic }, rules: { '@stylistic/indent': ['error', 2], diff --git a/lefthook.yml b/lefthook.yml index cf2e6bb11d..7a9822a719 100644 --- a/lefthook.yml +++ b/lefthook.yml @@ -5,7 +5,7 @@ pre-commit: jobs: - name: lint (staged) - glob: '*.{ts,mts,cts,mjs}' + glob: '*.{ts,tsx,mts,cts,mjs}' exclude: - 'vendor/*/src/**' run: node_modules/.bin/eslint --fix {staged_files}