From eaffa6ef1521ab915ad2e6aed03de8d12a218475 Mon Sep 17 00:00:00 2001 From: Tapan Prakash Date: Sun, 12 Jan 2025 23:19:25 +0530 Subject: [PATCH 1/4] feat(oxlint): implement `--init` cli option Implemented to --init cli option to create oxlint configuration files with default values. --- apps/oxlint/src/command/lint.rs | 4 ++ apps/oxlint/src/lint.rs | 39 ++++++++++++++----- apps/oxlint/src/result.rs | 5 +++ tasks/website/src/linter/snapshots/cli.snap | 2 + .../src/linter/snapshots/cli_terminal.snap | 1 + 5 files changed, 42 insertions(+), 9 deletions(-) diff --git a/apps/oxlint/src/command/lint.rs b/apps/oxlint/src/command/lint.rs index c2435c1a1fc57..d630cf114dc7f 100644 --- a/apps/oxlint/src/command/lint.rs +++ b/apps/oxlint/src/command/lint.rs @@ -71,6 +71,10 @@ pub struct BasicOptions { /// TypeScript `tsconfig.json` path for reading path alias and project references for import plugin #[bpaf(argument("./tsconfig.json"), hide_usage)] pub tsconfig: Option, + + /// Initialize oxlint configuration with default values + #[bpaf(switch, hide_usage)] + pub init: bool, } // This is formatted according to diff --git a/apps/oxlint/src/lint.rs b/apps/oxlint/src/lint.rs index 5ca498dfcc0d6..661306fc77070 100644 --- a/apps/oxlint/src/lint.rs +++ b/apps/oxlint/src/lint.rs @@ -1,8 +1,5 @@ use std::{ - env, - io::BufWriter, - path::{Path, PathBuf}, - time::Instant, + env, fs, io::BufWriter, path::{Path, PathBuf}, time::Instant }; use ignore::gitignore::Gitignore; @@ -119,14 +116,26 @@ impl Runner for LintRunner { enable_plugins.apply_overrides(&mut oxlintrc.plugins); let oxlintrc_for_print = - if misc_options.print_config { Some(oxlintrc.clone()) } else { None }; + if misc_options.print_config || basic_options.init { Some(oxlintrc.clone()) } else { None }; let config_builder = ConfigStoreBuilder::from_oxlintrc(false, oxlintrc).with_filters(filter); if let Some(basic_config_file) = oxlintrc_for_print { - return CliRunResult::PrintConfigResult { - config_file: config_builder.resolve_final_config_file(basic_config_file), - }; + let config_file = config_builder.resolve_final_config_file(basic_config_file); + if misc_options.print_config { + return CliRunResult::PrintConfigResult { + config_file, + }; + } else if basic_options.init { + match fs::write(Self::DEFAULT_OXLINTRC, config_file) { + Ok(()) => return CliRunResult::ConfigFileInitResult { + message: "Configuration file created".to_string(), + }, + Err(_) => return CliRunResult::ConfigFileInitResult { + message: "Failed to create configuration file".to_string(), + } + } + } } let mut options = LintServiceOptions::new(self.cwd, paths) @@ -283,7 +292,7 @@ impl LintRunner { #[cfg(test)] mod test { - use std::{env, path::MAIN_SEPARATOR_STR}; + use std::{env, fs, path::MAIN_SEPARATOR_STR}; use super::LintRunner; use crate::cli::{lint_command, CliRunResult, LintResult, Runner}; @@ -750,6 +759,18 @@ mod test { assert_eq!(config, expect_json.trim()); } + #[test] + fn test_init_config() { + let args = &["--init"]; + let options = lint_command().run_inner(args).unwrap(); + let ret = LintRunner::new(options).run(); + let CliRunResult::ConfigFileInitResult { message } = ret else { + panic!("Expected configuation file to be created, got {ret:?}") + }; + assert_eq!(message, "Configuration file created"); + fs::remove_file(LintRunner::DEFAULT_OXLINTRC).unwrap(); + } + #[test] fn test_overrides() { let result = diff --git a/apps/oxlint/src/result.rs b/apps/oxlint/src/result.rs index 49f01e213881b..ca8c1880ff4cc 100644 --- a/apps/oxlint/src/result.rs +++ b/apps/oxlint/src/result.rs @@ -11,6 +11,7 @@ pub enum CliRunResult { PathNotFound { paths: Vec }, LintResult(LintResult), PrintConfigResult { config_file: String }, + ConfigFileInitResult { message: String }, } /// A summary of a complete linter run. @@ -92,6 +93,10 @@ impl Termination for CliRunResult { Self::PrintConfigResult { config_file } => { println!("{config_file}"); ExitCode::from(0) + }, + Self::ConfigFileInitResult { message } => { + println!("{message}"); + ExitCode::from(0) } } } diff --git a/tasks/website/src/linter/snapshots/cli.snap b/tasks/website/src/linter/snapshots/cli.snap index d2766eb69aee8..b3c8669efe3fa 100644 --- a/tasks/website/src/linter/snapshots/cli.snap +++ b/tasks/website/src/linter/snapshots/cli.snap @@ -15,6 +15,8 @@ snapshot_kind: text If not provided, Oxlint will look for `.oxlintrc.json` in the current working directory. - **` --tsconfig`**=_`<./tsconfig.json>`_ — TypeScript `tsconfig.json` path for reading path alias and project references for import plugin +- **` --init`** — + Initialize oxlint configuration with default values diff --git a/tasks/website/src/linter/snapshots/cli_terminal.snap b/tasks/website/src/linter/snapshots/cli_terminal.snap index fef1bf28b61fc..92ebf168e1b15 100644 --- a/tasks/website/src/linter/snapshots/cli_terminal.snap +++ b/tasks/website/src/linter/snapshots/cli_terminal.snap @@ -11,6 +11,7 @@ Basic Configuration * tries to be compatible with the ESLint v8's format --tsconfig=<./tsconfig.json> TypeScript `tsconfig.json` path for reading path alias and project references for import plugin + --init Initialize oxlint configuration with default values Allowing / Denying Multiple Lints Accumulate rules and categories from left to right on the command-line. From 9cbeeb6a7fb2a0356baac374222431fc3d05edb0 Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Sun, 12 Jan 2025 17:51:28 +0000 Subject: [PATCH 2/4] [autofix.ci] apply automated fixes --- apps/oxlint/src/command/lint.rs | 2 +- apps/oxlint/src/lint.rs | 30 +++++++++++++++++++----------- apps/oxlint/src/result.rs | 2 +- 3 files changed, 21 insertions(+), 13 deletions(-) diff --git a/apps/oxlint/src/command/lint.rs b/apps/oxlint/src/command/lint.rs index d630cf114dc7f..d170574ca0e54 100644 --- a/apps/oxlint/src/command/lint.rs +++ b/apps/oxlint/src/command/lint.rs @@ -72,7 +72,7 @@ pub struct BasicOptions { #[bpaf(argument("./tsconfig.json"), hide_usage)] pub tsconfig: Option, - /// Initialize oxlint configuration with default values + /// Initialize oxlint configuration with default values #[bpaf(switch, hide_usage)] pub init: bool, } diff --git a/apps/oxlint/src/lint.rs b/apps/oxlint/src/lint.rs index 661306fc77070..5823a7dee17d0 100644 --- a/apps/oxlint/src/lint.rs +++ b/apps/oxlint/src/lint.rs @@ -1,5 +1,8 @@ use std::{ - env, fs, io::BufWriter, path::{Path, PathBuf}, time::Instant + env, fs, + io::BufWriter, + path::{Path, PathBuf}, + time::Instant, }; use ignore::gitignore::Gitignore; @@ -115,24 +118,29 @@ impl Runner for LintRunner { enable_plugins.apply_overrides(&mut oxlintrc.plugins); - let oxlintrc_for_print = - if misc_options.print_config || basic_options.init { Some(oxlintrc.clone()) } else { None }; + let oxlintrc_for_print = if misc_options.print_config || basic_options.init { + Some(oxlintrc.clone()) + } else { + None + }; let config_builder = ConfigStoreBuilder::from_oxlintrc(false, oxlintrc).with_filters(filter); if let Some(basic_config_file) = oxlintrc_for_print { let config_file = config_builder.resolve_final_config_file(basic_config_file); if misc_options.print_config { - return CliRunResult::PrintConfigResult { - config_file, - }; + return CliRunResult::PrintConfigResult { config_file }; } else if basic_options.init { match fs::write(Self::DEFAULT_OXLINTRC, config_file) { - Ok(()) => return CliRunResult::ConfigFileInitResult { - message: "Configuration file created".to_string(), - }, - Err(_) => return CliRunResult::ConfigFileInitResult { - message: "Failed to create configuration file".to_string(), + Ok(()) => { + return CliRunResult::ConfigFileInitResult { + message: "Configuration file created".to_string(), + } + } + Err(_) => { + return CliRunResult::ConfigFileInitResult { + message: "Failed to create configuration file".to_string(), + } } } } diff --git a/apps/oxlint/src/result.rs b/apps/oxlint/src/result.rs index ca8c1880ff4cc..78c7eddb55fc5 100644 --- a/apps/oxlint/src/result.rs +++ b/apps/oxlint/src/result.rs @@ -93,7 +93,7 @@ impl Termination for CliRunResult { Self::PrintConfigResult { config_file } => { println!("{config_file}"); ExitCode::from(0) - }, + } Self::ConfigFileInitResult { message } => { println!("{message}"); ExitCode::from(0) From 08fb63d0e996d17b6d48a54b21d120cec01bbec4 Mon Sep 17 00:00:00 2001 From: Tapan Prakash Date: Sun, 12 Jan 2025 23:23:24 +0530 Subject: [PATCH 3/4] Fixed spell check issue --- apps/oxlint/src/lint.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/oxlint/src/lint.rs b/apps/oxlint/src/lint.rs index 5823a7dee17d0..c3f2400ab0d38 100644 --- a/apps/oxlint/src/lint.rs +++ b/apps/oxlint/src/lint.rs @@ -773,7 +773,7 @@ mod test { let options = lint_command().run_inner(args).unwrap(); let ret = LintRunner::new(options).run(); let CliRunResult::ConfigFileInitResult { message } = ret else { - panic!("Expected configuation file to be created, got {ret:?}") + panic!("Expected configuration file to be created, got {ret:?}") }; assert_eq!(message, "Configuration file created"); fs::remove_file(LintRunner::DEFAULT_OXLINTRC).unwrap(); From 29bdfa6568b476a3fc0c0ffc89974c547fdd36c0 Mon Sep 17 00:00:00 2001 From: Tapan Prakash Date: Sun, 12 Jan 2025 23:30:29 +0530 Subject: [PATCH 4/4] Fixed snapshot issues --- tasks/website/src/linter/snapshots/cli.snap | 2 +- tasks/website/src/linter/snapshots/cli_terminal.snap | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tasks/website/src/linter/snapshots/cli.snap b/tasks/website/src/linter/snapshots/cli.snap index b3c8669efe3fa..ba44d6240edf1 100644 --- a/tasks/website/src/linter/snapshots/cli.snap +++ b/tasks/website/src/linter/snapshots/cli.snap @@ -16,7 +16,7 @@ snapshot_kind: text - **` --tsconfig`**=_`<./tsconfig.json>`_ — TypeScript `tsconfig.json` path for reading path alias and project references for import plugin - **` --init`** — - Initialize oxlint configuration with default values + Initialize oxlint configuration with default values diff --git a/tasks/website/src/linter/snapshots/cli_terminal.snap b/tasks/website/src/linter/snapshots/cli_terminal.snap index 92ebf168e1b15..8896e922ac411 100644 --- a/tasks/website/src/linter/snapshots/cli_terminal.snap +++ b/tasks/website/src/linter/snapshots/cli_terminal.snap @@ -11,7 +11,7 @@ Basic Configuration * tries to be compatible with the ESLint v8's format --tsconfig=<./tsconfig.json> TypeScript `tsconfig.json` path for reading path alias and project references for import plugin - --init Initialize oxlint configuration with default values + --init Initialize oxlint configuration with default values Allowing / Denying Multiple Lints Accumulate rules and categories from left to right on the command-line.