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.
This commit is contained in:
David Sherret 2024-03-25 18:20:15 -04:00 committed by GitHub
parent fb1aa4e6d2
commit 0346e597bf
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
10 changed files with 104 additions and 44 deletions

View File

@ -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<String> {
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;

View File

@ -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
}]
}

View File

@ -0,0 +1 @@
Checked 2 files

View File

@ -0,0 +1,3 @@
import { MyType } from "./type.ts";
export const myVar: MyType = "hello";

View File

@ -0,0 +1 @@
export type MyType = string;

View File

@ -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

View File

@ -0,0 +1,5 @@
{
"name": "@scope/package",
"version": "1.0.0",
"exports": "./mod.ts"
}

View File

@ -0,0 +1,3 @@
import { MyType } from "./type.ts";
export const myVar: MyType = "hello";

View File

@ -0,0 +1 @@
export type MyType = string;

View File

@ -128,19 +128,22 @@ fn run_test(test: &Test, diagnostic_logger: Rc<RefCell<Vec<u8>>>) {
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<String>,
#[serde(default)]
pub envs: HashMap<String, String>,
pub output: String,
@ -299,12 +303,23 @@ fn collect_tests() -> Vec<TestCategory> {
}
.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,
});