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..8aa21456cd --- /dev/null +++ b/packages/cli/snap-tests/fmt-ignore-patterns-all-excluded/snap.txt @@ -0,0 +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. 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/**/*'], + }, +};