From 0346e597bf2d95f5bfce20d3aadf697e9ee45fe4 Mon Sep 17 00:00:00 2001 From: David Sherret Date: Mon, 25 Mar 2024 18:20:15 -0400 Subject: [PATCH] feat(lint): automatically opt-in packages to `jsr` lint tag (#23072) This automatically opts packages (deno.json's with a name, version, and exports field) into the "jsr" lint tag. --- cli/tools/lint/mod.rs | 69 +++++++++++--------- tests/specs/lint/jsr_tag/__test__.jsonc | 14 ++++ tests/specs/lint/jsr_tag/non_package.out | 1 + tests/specs/lint/jsr_tag/non_package/mod.ts | 3 + tests/specs/lint/jsr_tag/non_package/type.ts | 1 + tests/specs/lint/jsr_tag/package.out | 12 ++++ tests/specs/lint/jsr_tag/package/deno.json | 5 ++ tests/specs/lint/jsr_tag/package/mod.ts | 3 + tests/specs/lint/jsr_tag/package/type.ts | 1 + tests/specs/mod.rs | 39 +++++++---- 10 files changed, 104 insertions(+), 44 deletions(-) create mode 100644 tests/specs/lint/jsr_tag/__test__.jsonc create mode 100644 tests/specs/lint/jsr_tag/non_package.out create mode 100644 tests/specs/lint/jsr_tag/non_package/mod.ts create mode 100644 tests/specs/lint/jsr_tag/non_package/type.ts create mode 100644 tests/specs/lint/jsr_tag/package.out create mode 100644 tests/specs/lint/jsr_tag/package/deno.json create mode 100644 tests/specs/lint/jsr_tag/package/mod.ts create mode 100644 tests/specs/lint/jsr_tag/package/type.ts diff --git a/cli/tools/lint/mod.rs b/cli/tools/lint/mod.rs index bf96eca06d..cb282663ca 100644 --- a/cli/tools/lint/mod.rs +++ b/cli/tools/lint/mod.rs @@ -878,41 +878,46 @@ pub fn get_configured_rules( let implicit_no_slow_types = maybe_config_file .map(|c| c.is_package() || !c.json.workspaces.is_empty()) .unwrap_or(false); - if rules.tags.is_none() && rules.include.is_none() && rules.exclude.is_none() - { - ConfiguredRules { - rules: rules::get_recommended_rules(), - no_slow_types: implicit_no_slow_types, - } - } else { - let no_slow_types = implicit_no_slow_types - && !rules - .exclude - .as_ref() - .map(|exclude| exclude.iter().any(|i| i == NO_SLOW_TYPES_NAME)) - .unwrap_or(false); - let rules = rules::get_filtered_rules( - rules.tags.or_else(|| Some(vec!["recommended".to_string()])), - rules.exclude.map(|exclude| { - exclude - .into_iter() - .filter(|c| c != NO_SLOW_TYPES_NAME) - .collect() - }), - rules.include.map(|include| { - include - .into_iter() - .filter(|c| c != NO_SLOW_TYPES_NAME) - .collect() - }), - ); - ConfiguredRules { - rules, - no_slow_types, - } + let no_slow_types = implicit_no_slow_types + && !rules + .exclude + .as_ref() + .map(|exclude| exclude.iter().any(|i| i == NO_SLOW_TYPES_NAME)) + .unwrap_or(false); + let rules = rules::get_filtered_rules( + rules + .tags + .or_else(|| Some(get_default_tags(maybe_config_file))), + rules.exclude.map(|exclude| { + exclude + .into_iter() + .filter(|c| c != NO_SLOW_TYPES_NAME) + .collect() + }), + rules.include.map(|include| { + include + .into_iter() + .filter(|c| c != NO_SLOW_TYPES_NAME) + .collect() + }), + ); + ConfiguredRules { + rules, + no_slow_types, } } +fn get_default_tags( + maybe_config_file: Option<&deno_config::ConfigFile>, +) -> Vec { + let mut tags = Vec::with_capacity(2); + tags.push("recommended".to_string()); + if maybe_config_file.map(|c| c.is_package()).unwrap_or(false) { + tags.push("jsr".to_string()); + } + tags +} + #[cfg(test)] mod test { use deno_lint::rules::get_recommended_rules; diff --git a/tests/specs/lint/jsr_tag/__test__.jsonc b/tests/specs/lint/jsr_tag/__test__.jsonc new file mode 100644 index 0000000000..100dcbd13d --- /dev/null +++ b/tests/specs/lint/jsr_tag/__test__.jsonc @@ -0,0 +1,14 @@ +{ + // packages will be automatically entered into the "jsr" tag + "steps": [{ + "args": "lint", + "cwd": "./package", + "output": "package.out", + "exitCode": 1 + }, { + "args": "lint", + "cwd": "./non_package", + "output": "non_package.out", + "exitCode": 0 + }] +} diff --git a/tests/specs/lint/jsr_tag/non_package.out b/tests/specs/lint/jsr_tag/non_package.out new file mode 100644 index 0000000000..158c556c29 --- /dev/null +++ b/tests/specs/lint/jsr_tag/non_package.out @@ -0,0 +1 @@ +Checked 2 files diff --git a/tests/specs/lint/jsr_tag/non_package/mod.ts b/tests/specs/lint/jsr_tag/non_package/mod.ts new file mode 100644 index 0000000000..efb884a2c6 --- /dev/null +++ b/tests/specs/lint/jsr_tag/non_package/mod.ts @@ -0,0 +1,3 @@ +import { MyType } from "./type.ts"; + +export const myVar: MyType = "hello"; diff --git a/tests/specs/lint/jsr_tag/non_package/type.ts b/tests/specs/lint/jsr_tag/non_package/type.ts new file mode 100644 index 0000000000..ed7545c161 --- /dev/null +++ b/tests/specs/lint/jsr_tag/non_package/type.ts @@ -0,0 +1 @@ +export type MyType = string; diff --git a/tests/specs/lint/jsr_tag/package.out b/tests/specs/lint/jsr_tag/package.out new file mode 100644 index 0000000000..5169d9815f --- /dev/null +++ b/tests/specs/lint/jsr_tag/package.out @@ -0,0 +1,12 @@ +error[verbatim-module-syntax]: All import identifiers are used in types + --> [WILDCARD]mod.ts:1:1 + | +1 | import { MyType } from "./type.ts"; + | ^^^^^^ + = hint: Change `import` to `import type` and optionally add an explicit side effect import + + docs: https://lint.deno.land/rules/verbatim-module-syntax + + +Found 1 problem (1 fixable via --fix) +Checked 2 files diff --git a/tests/specs/lint/jsr_tag/package/deno.json b/tests/specs/lint/jsr_tag/package/deno.json new file mode 100644 index 0000000000..8c1c8f8a44 --- /dev/null +++ b/tests/specs/lint/jsr_tag/package/deno.json @@ -0,0 +1,5 @@ +{ + "name": "@scope/package", + "version": "1.0.0", + "exports": "./mod.ts" +} diff --git a/tests/specs/lint/jsr_tag/package/mod.ts b/tests/specs/lint/jsr_tag/package/mod.ts new file mode 100644 index 0000000000..efb884a2c6 --- /dev/null +++ b/tests/specs/lint/jsr_tag/package/mod.ts @@ -0,0 +1,3 @@ +import { MyType } from "./type.ts"; + +export const myVar: MyType = "hello"; diff --git a/tests/specs/lint/jsr_tag/package/type.ts b/tests/specs/lint/jsr_tag/package/type.ts new file mode 100644 index 0000000000..ed7545c161 --- /dev/null +++ b/tests/specs/lint/jsr_tag/package/type.ts @@ -0,0 +1 @@ +export type MyType = string; diff --git a/tests/specs/mod.rs b/tests/specs/mod.rs index feed098711..3eb8bb3866 100644 --- a/tests/specs/mod.rs +++ b/tests/specs/mod.rs @@ -128,19 +128,22 @@ fn run_test(test: &Test, diagnostic_logger: Rc>>) { context.deno_dir().path().remove_dir_all(); } - let expected_output = if step.output.ends_with(".out") { - let test_output_path = cwd.join(&step.output); - test_output_path.read_to_string() - } else { - step.output.clone() - }; let command = context.new_command().envs(&step.envs); let command = match &step.args { VecOrString::Vec(args) => command.args_vec(args), VecOrString::String(text) => command.args(text), }; + let command = match &step.cwd { + Some(cwd) => command.current_dir(cwd), + None => command, + }; let output = command.run(); - output.assert_matches_text(expected_output); + if step.output.ends_with(".out") { + let test_output_path = cwd.join(&step.output); + output.assert_matches_file(test_output_path); + } else { + output.assert_matches_text(&step.output); + } output.assert_exit_code(step.exit_code); } } @@ -194,6 +197,7 @@ struct StepMetaData { #[serde(default)] pub clean_deno_dir: bool, pub args: VecOrString, + pub cwd: Option, #[serde(default)] pub envs: HashMap, pub output: String, @@ -299,12 +303,23 @@ fn collect_tests() -> Vec { } .with_context(|| format!("Failed to parse {}", metadata_path)) .unwrap(); + + let test_name = + format!("{}::{}", category.name, entry.file_name().to_string_lossy()); + + // only support characters that work with filtering with `cargo test` + if !test_name + .chars() + .all(|c| c.is_alphanumeric() || matches!(c, '_' | ':')) + { + panic!( + "Invalid test name (only supports alphanumeric and underscore): {}", + test_name + ); + } + category.tests.push(Test { - name: format!( - "{}::{}", - category.name, - entry.file_name().to_string_lossy() - ), + name: test_name, cwd: test_dir, metadata, });