chore(lint): bring .tsx files into the eslint, lefthook, and jscpd lanes

.tsx sources and specs were invisible to every lint surface: the eslint
flat-config globs, the lefthook staged-file glob, and the jscpd clone
scan all matched *.ts only. Widen the five eslint file groups (source,
test, client-test, sonar, formatting), the pre-commit glob, and the
jscpd format/pattern to cover .tsx.

Existing .tsx files predate these lanes; follow-up commits on this PR
clear the backlog they surface.
This commit is contained in:
imccyu
2026-07-27 21:36:15 +08:00
parent c03c4fdbdd
commit 36e8141145
3 changed files with 29 additions and 8 deletions

View File

@@ -2,8 +2,8 @@
"minTokens": 60, "minTokens": 60,
"minLines": 6, "minLines": 6,
"mode": "mild", "mode": "mild",
"format": ["typescript"], "format": ["typescript", "tsx"],
"pattern": "**/*.ts", "pattern": "**/*.{ts,tsx}",
"ignore": ["**/tests/**", "**/tsdown.config.ts"], "ignore": ["**/tests/**", "**/tsdown.config.ts"],
"ignorePattern": [ "ignorePattern": [
"(?s)/\\* jscpd:ignore-start \\*/.*?/\\* jscpd:ignore-end \\*/" "(?s)/\\* jscpd:ignore-start \\*/.*?/\\* jscpd:ignore-end \\*/"

View File

@@ -27,7 +27,13 @@ export default tseslint.config(
// --- our packages: full strictness ------------------------------------- // --- 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: [ extends: [
...tseslint.configs.strictTypeChecked, ...tseslint.configs.strictTypeChecked,
], ],
@@ -80,7 +86,12 @@ export default tseslint.config(
// --- tests: same rules, minus the friction that fights test ergonomics -- // --- 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: [ extends: [
...tseslint.configs.strictTypeChecked, ...tseslint.configs.strictTypeChecked,
], ],
@@ -117,7 +128,10 @@ export default tseslint.config(
// Context merges collide), so the shared project service cannot resolve // Context merges collide), so the shared project service cannot resolve
// them — parse these through the client aggregate explicitly. // 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: { languageOptions: {
parserOptions: { parserOptions: {
projectService: false, projectService: false,
@@ -129,7 +143,7 @@ export default tseslint.config(
// --- file-local duplication (all owned TypeScript) --------------------- // --- 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 }, plugins: { sonarjs },
rules: { rules: {
// Cross-file clones are covered separately by jscpd. // Cross-file clones are covered separately by jscpd.
@@ -146,7 +160,14 @@ export default tseslint.config(
// --- formatting (everything we own) ------------------------------------- // --- 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 }, plugins: { '@stylistic': stylistic },
rules: { rules: {
'@stylistic/indent': ['error', 2], '@stylistic/indent': ['error', 2],

View File

@@ -5,7 +5,7 @@
pre-commit: pre-commit:
jobs: jobs:
- name: lint (staged) - name: lint (staged)
glob: '*.{ts,mts,cts,mjs}' glob: '*.{ts,tsx,mts,cts,mjs}'
exclude: exclude:
- 'vendor/*/src/**' - 'vendor/*/src/**'
run: node_modules/.bin/eslint --fix {staged_files} run: node_modules/.bin/eslint --fix {staged_files}