From 5b83adefbb82113303a0fddf5fffad4c251829a5 Mon Sep 17 00:00:00 2001 From: Nick Taylor Date: Mon, 30 Mar 2026 13:18:37 -0400 Subject: [PATCH 1/2] fix(cli): exit 0 when all fmt input files are excluded by ignorePatterns When `vp staged` passes files to `vp fmt` that are all excluded by ignorePatterns in vite.config.ts (e.g., package-lock.json), oxfmt would error with "Expected at least one target file". Now vp fmt automatically adds `--no-error-on-unmatched-pattern` when the fmt config has ignorePatterns, so it exits 0 gracefully instead. Closes #1210 Co-Authored-By: Claude Opus 4.6 (1M context) --- packages/cli/binding/src/cli.rs | 14 +++++++++++++- .../fmt-ignore-patterns-all-excluded/package.json | 6 ++++++ .../fmt-ignore-patterns-all-excluded/snap.txt | 2 ++ .../src/ignored.js | 4 ++++ .../fmt-ignore-patterns-all-excluded/steps.json | 5 +++++ .../vite.config.ts | 5 +++++ 6 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 packages/cli/snap-tests/fmt-ignore-patterns-all-excluded/package.json create mode 100644 packages/cli/snap-tests/fmt-ignore-patterns-all-excluded/snap.txt create mode 100644 packages/cli/snap-tests/fmt-ignore-patterns-all-excluded/src/ignored.js create mode 100644 packages/cli/snap-tests/fmt-ignore-patterns-all-excluded/steps.json create mode 100644 packages/cli/snap-tests/fmt-ignore-patterns-all-excluded/vite.config.ts diff --git a/packages/cli/binding/src/cli.rs b/packages/cli/binding/src/cli.rs index 6ddcb82688..c8d6279e2c 100644 --- a/packages/cli/binding/src/cli.rs +++ b/packages/cli/binding/src/cli.rs @@ -292,11 +292,23 @@ impl SubcommandResolver { &owned_resolved_vite_config }; - if let (Some(_), Some(config_file)) = + if let (Some(fmt_config), Some(config_file)) = (&resolved_vite_config.fmt, &resolved_vite_config.config_file) { args.insert(0, "-c".to_string()); args.insert(1, config_file.clone()); + + // Avoid "Expected at least one target file" error when + // ignorePatterns filters out all input files (e.g., `vp staged` + // passes only package-lock.json which is then excluded). + if fmt_config + .get("ignorePatterns") + .and_then(|v| v.as_array()) + .is_some_and(|arr| !arr.is_empty()) + && !has_flag_before_terminator(&args, "--no-error-on-unmatched-pattern") + { + args.push("--no-error-on-unmatched-pattern".to_string()); + } } Ok(ResolvedSubcommand { diff --git a/packages/cli/snap-tests/fmt-ignore-patterns-all-excluded/package.json b/packages/cli/snap-tests/fmt-ignore-patterns-all-excluded/package.json new file mode 100644 index 0000000000..38eead65dd --- /dev/null +++ b/packages/cli/snap-tests/fmt-ignore-patterns-all-excluded/package.json @@ -0,0 +1,6 @@ +{ + "name": "@test/fmt-ignore-patterns-all-excluded", + "version": "1.0.0", + "private": true, + "type": "module" +} diff --git a/packages/cli/snap-tests/fmt-ignore-patterns-all-excluded/snap.txt b/packages/cli/snap-tests/fmt-ignore-patterns-all-excluded/snap.txt new file mode 100644 index 0000000000..c042de0174 --- /dev/null +++ b/packages/cli/snap-tests/fmt-ignore-patterns-all-excluded/snap.txt @@ -0,0 +1,2 @@ +> vp fmt src/ # Test that fmt exits 0 when all input files are excluded by ignorePatterns +No files found matching the given patterns. diff --git a/packages/cli/snap-tests/fmt-ignore-patterns-all-excluded/src/ignored.js b/packages/cli/snap-tests/fmt-ignore-patterns-all-excluded/src/ignored.js new file mode 100644 index 0000000000..bab4e3d8e0 --- /dev/null +++ b/packages/cli/snap-tests/fmt-ignore-patterns-all-excluded/src/ignored.js @@ -0,0 +1,4 @@ +// This file is excluded by ignorePatterns +function ignored() { + return 'hello'; +} diff --git a/packages/cli/snap-tests/fmt-ignore-patterns-all-excluded/steps.json b/packages/cli/snap-tests/fmt-ignore-patterns-all-excluded/steps.json new file mode 100644 index 0000000000..a8a1cc2af9 --- /dev/null +++ b/packages/cli/snap-tests/fmt-ignore-patterns-all-excluded/steps.json @@ -0,0 +1,5 @@ +{ + "commands": [ + "vp fmt src/ # Test that fmt exits 0 when all input files are excluded by ignorePatterns" + ] +} diff --git a/packages/cli/snap-tests/fmt-ignore-patterns-all-excluded/vite.config.ts b/packages/cli/snap-tests/fmt-ignore-patterns-all-excluded/vite.config.ts new file mode 100644 index 0000000000..6bb98ef5cd --- /dev/null +++ b/packages/cli/snap-tests/fmt-ignore-patterns-all-excluded/vite.config.ts @@ -0,0 +1,5 @@ +export default { + fmt: { + ignorePatterns: ['src/**/*'], + }, +}; From 68ccdf8ab703ae8be85536e7f86d4e2fdf8a41e6 Mon Sep 17 00:00:00 2001 From: Nick Taylor Date: Tue, 31 Mar 2026 15:42:20 -0400 Subject: [PATCH 2/2] fix(test): add missing line to fmt-ignore-patterns-all-excluded snap.txt Co-Authored-By: Claude Opus 4.6 (1M context) --- .../cli/snap-tests/fmt-ignore-patterns-all-excluded/snap.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/cli/snap-tests/fmt-ignore-patterns-all-excluded/snap.txt b/packages/cli/snap-tests/fmt-ignore-patterns-all-excluded/snap.txt index c042de0174..8aa21456cd 100644 --- a/packages/cli/snap-tests/fmt-ignore-patterns-all-excluded/snap.txt +++ b/packages/cli/snap-tests/fmt-ignore-patterns-all-excluded/snap.txt @@ -1,2 +1,3 @@ > vp fmt src/ # Test that fmt exits 0 when all input files are excluded by ignorePatterns +Finished in ms on 0 files using threads. No files found matching the given patterns.