Skip to content

Conversation

Copy link
Contributor

Copilot AI commented Sep 1, 2025

When using oxlint --type-aware with only non-TypeScript files (e.g., Svelte, Vue, or other files), tsgolint would fail with the error:

Error running tsgolint: "exit status: exit status: 1, error: no files specified in config"

This occurred because the json_input method filters files to only include those with valid JavaScript/TypeScript extensions, but the code didn't check if the filtered result was empty before attempting to run tsgolint.

The fix adds an early return in TsGoLintState::lint() when no TypeScript/JavaScript files remain after filtering, similar to the existing check for empty input paths. This ensures tsgolint is only invoked when there are actual TypeScript files to process.

Example scenarios that now work:

# Only Svelte files - no longer crashes
oxlint --type-aware component.svelte

# Mixed TypeScript and Svelte files - both processed correctly  
oxlint --type-aware component.svelte helper.ts

# Only TypeScript files - continues to work as before
oxlint --type-aware helper.ts

Added test case test_tsgolint_no_typescript_files to verify the fix and prevent regression.

Fixes #13501.


💬 Share your feedback on Copilot coding agent for the chance to win a $200 gift card! Click here to start the survey.

@graphite-app
Copy link
Contributor

graphite-app bot commented Sep 1, 2025

How to use the Graphite Merge Queue

Add either label to this PR to merge it via the merge queue:

  • 0-merge - adds this PR to the back of the merge queue
  • hotfix - for urgent hot fixes, skip the queue and merge this PR next

You must have a Graphite account in order to use the merge queue. Sign up using this link.

An organization admin has enabled the Graphite Merge Queue in this repository.

Please do not merge from GitHub as this will restart CI on PRs being processed by the merge queue.

Copilot AI and others added 2 commits September 1, 2025 11:44
Co-authored-by: camc314 <18101008+camc314@users.noreply.github.com>
Co-authored-by: camc314 <18101008+camc314@users.noreply.github.com>
Copilot AI changed the title [WIP] linter: oxlint-tsgolint failing when no typescript files passed in Fix tsgolint failure when no TypeScript files are passed Sep 1, 2025
Copilot AI requested a review from camc314 September 1, 2025 11:52
Copilot finished work on behalf of camc314 September 1, 2025 11:52
@camc314 camc314 marked this pull request as ready for review September 1, 2025 12:21
Copilot AI review requested due to automatic review settings September 1, 2025 12:21
@github-actions github-actions bot added A-linter Area - Linter A-cli Area - CLI labels Sep 1, 2025
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

Fixes a crash in tsgolint when running oxlint --type-aware with only non-TypeScript files (e.g., Svelte, Vue). The issue occurred because tsgolint would attempt to run even when no TypeScript/JavaScript files remained after filtering, resulting in a "no files specified in config" error.

  • Adds early return in TsGoLintState::lint() when no TypeScript/JavaScript files are found after filtering
  • Includes test case to verify the fix with a Svelte file containing linting violations
  • Ensures tsgolint is only invoked when there are actual TypeScript files to process

Reviewed Changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated no comments.

File Description
crates/oxc_linter/src/tsgolint.rs Adds early return check to prevent tsgolint execution when no TypeScript files remain
apps/oxlint/src/lint.rs Adds test case to verify tsgolint doesn't crash with non-TypeScript files
apps/oxlint/fixtures/tsgolint/test.svelte Test fixture containing Svelte code with a debugger statement
apps/oxlint/src/snapshots/fixtures__tsgolint_--type-aware test.svelte@oxlint.snap Expected test output showing regular linting still works

Tip: Customize your code reviews with copilot-instructions.md. Create the file or learn how to get started.

@camc314 camc314 marked this pull request as draft September 1, 2025 12:25
@codspeed-hq
Copy link

codspeed-hq bot commented Sep 1, 2025

CodSpeed Instrumentation Performance Report

Merging #13502 will not alter performance

Comparing copilot/fix-13501 (24b0fd8) with main (b677376)

Summary

✅ 37 untouched benchmarks

@camc314 camc314 changed the title Fix tsgolint failure when no TypeScript files are passed fix(linter): skip running tsgolint when no files need type aware linting Sep 2, 2025
@github-actions github-actions bot added the C-bug Category - Bug label Sep 2, 2025
@camc314 camc314 marked this pull request as ready for review September 2, 2025 03:14
@camc314 camc314 merged commit 0d867b1 into main Sep 2, 2025
24 checks passed
@camc314 camc314 deleted the copilot/fix-13501 branch September 2, 2025 03:19
camc314 added a commit that referenced this pull request Sep 11, 2025
## [1.15.0] - 2025-09-11

### 💥 BREAKING CHANGES

- edc70ea allocator/pool: [**BREAKING**] Remove `disable_fixed_size`
Cargo feature (#13625) (overlookmotel)

### 🚀 Features

- b20b56d linter: Add `vue/no-multiple-slot-args` rule (#13579) (Sysix)
- aafe08c linter: Add `vue/define-emits-declaration` rule (#13567)
(Sysix)
- 2ed5059 linter: Add `vue/define-props-declaration` rule (#13566)
(Sysix)
- a718c23 linter: Add `vue/valid-define-props` rule (#13565) (Sysix)
- 75a673e editor: Support relative path for `oxc.path.server` (#13542)
(Sysix)
- 4af886b linter: Add `unicorn/no-array-reverse` rule (#13530) (yefan)
- 2db32eb data_structures: Add `boxed_slice!` and `boxed_array!` macros
(#13596) (overlookmotel)

### 🐛 Bug Fixes

- fb9d0f4 language_server: Don't resend diagnostic on save, when
`typeAware` is disabled and run is onType (#13604) (YongSeok Jang (장용석))
- 2f36350 editor: Add notice for a possible restart when fixing
`filename-case` (#13557) (Sysix)
- e17fccc linter: Update `RuleRunner` impl after merge (#13642)
(camc314)
- 3d27c5b linter/no-unused-private-class-members: False positive with
spread expr (#13634) (yefan)
- 8314ed5 linter/tsgolint: Correct comment (#13589) (camc314)
- 198243b semantic: Dont parse `@` as jsdoc tags inside quotes (#13571)
(Gwenn Le Bihan)
- 89084d7 linter/custom-plugins: Enforce exact matching for disable
directives (#13538) (Copilot)
- 277c5e1 linter: Output `eslint-plugin-vue` for vue diagnostics
(#13564) (Sysix)
- 34d3cde rust: Fix clippy issues (#13540) (Boshen)
- 5fccafc linter: `unicorn/prefer-array-flat-map` ignore
`React.Children` (#13534) (Sysix)
- 7e78e39 linter: Don't panic when parsing regex with multiple
parentheses (#13524) (Sysix)
- 0d867b1 linter: Skip running tsgolint when no files need type aware
linting (#13502) (Copilot)
- b677376 language_server: Include the diagnostic of the other linter
(#13490) (Sysix)
- e87d7bd linter: Parse regex inside `new RegExp()` with parentheses
(#13448) (Sysix)
- 5990f17 linter: Change `typescript/no-confusing-void-expression` to
pedantic (#13473) (Boshen)

### 🚜 Refactor

- 7775c21 linter/plugins: Remove `oxlint2` Cargo feature (#13648)
(overlookmotel)
- 8f37e88 linter: Update tsgolint payload (#13547) (camchenry)
- 2d53203 linter/plugins: Move `tokio` usage from `oxc_linter` to
`napi/oxlint2` (#13647) (overlookmotel)
- 6cd6be2 linter: Add `--experimental-js-plugins` CLI arg (#13658)
(overlookmotel)
- 476729b linter: Simplify `RuleRunner` trait definition (#13637)
(camchenry)
- 2f02ac6 linter/plugins: Remove `disable_oxlint2` Cargo feature
(#13626) (overlookmotel)
- ff9e4fb linter/plugins: Use fixed-size allocators when
`ExternalLinter` exists (#13623) (overlookmotel)
- f9bff64 linter_codegen: Improve code style for collecting nodes
(#13636) (camchenry)
- babbaca all: Remove `pub` from modules with no exports (#13618)
(overlookmotel)
- 91759c6 linter/plugins: Only use `RawTransferFileSystem` if JS plugins
registered (#13599) (overlookmotel)
- 118020c linter/plugins: Discard `ExternalLinter` if no JS plugins
registered (#13598) (overlookmotel)
- 8d30bce linter/tsgolint: Report an error if the tsgolint exe could not
be found (#13590) (camc314)
- bccc276 eslint/for-direction: Clean up implementation and improve
documentation (#13532) (Antoine Zanardi)
- 1425da2 eslint/default-case-last: Simplify default case last check in
switch statement (#13529) (Antoine Zanardi)
- d245376 oxlint: Remove unused `runner` module (#13561) (camc314)
- 53f2fc1 eslint/default-case: Simplify implementation and enhance
readability (#13430) (Antoine Zanardi)
- 6f15060 eslint/block-scoped-var: Clean up implementation and improve
documentation (#13417) (Antoine Zanardi)
- 671e0fd language_server: Only store one instance of a diagnostic
(#13514) (Sysix)
- 1b425d6 eslint/default-case-last: Simplify implementation and enhance
readability (#13515) (Antoine Zanardi)
- e4bbbce eslint/default-param-last: Simplify implementation and enhance
readability (#13516) (Antoine Zanardi)
- e0396fd linter: Remove `static` lifetime from disable directives
function argument (#13492) (camc314)

### 📚 Documentation

- eb1f167 linter: Note which rules require type info to run on rule page
(#13675) (camc314)
- e66f93b linter: Fix backtick formatting in no-return-wrap (#13633)
(camc314)

### ⚡ Performance

- e6a25e7 linter: Remove unnecessary `should_run` check (#13639)
(camchenry)
- f6a9687 linter: Store rules by AST type in a boxed array (#13578)
(overlookmotel)
- b81f081 linter: Reduce indirection (#13574) (overlookmotel)
- a744aff linter: Skip rules that do not have any relevant node types
(#13138) (camchenry)

### 🎨 Styling

- e110476 linter: Reformat code (#13573) (overlookmotel)

### 🧪 Testing

- 58e6c94 oxlint: Add test for ignorePatterns whitelist (#13372) (Sysix)

Co-authored-by: camc314 <18101008+camc314@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

A-cli Area - CLI A-linter Area - Linter C-bug Category - Bug

Projects

None yet

Development

Successfully merging this pull request may close these issues.

linter: oxlint-tsgolint failing when no typescript files passed in

2 participants