summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.dprint.json2
-rw-r--r--Cargo.lock1
-rw-r--r--cli/Cargo.toml1
-rw-r--r--cli/args/config_file.rs17
-rw-r--r--cli/args/mod.rs122
-rw-r--r--cli/schemas/config-file.v1.json34
-rw-r--r--cli/tests/integration/fmt_tests.rs92
-rw-r--r--cli/tests/integration/lint_tests.rs95
-rw-r--r--cli/tests/integration/test_tests.rs58
-rw-r--r--cli/tests/testdata/fmt/deno.glob.json11
-rw-r--r--cli/tests/testdata/fmt/glob/data/tes.ts3
-rw-r--r--cli/tests/testdata/fmt/glob/data/test1.js2
-rw-r--r--cli/tests/testdata/fmt/glob/data/test1.ts2
-rw-r--r--cli/tests/testdata/fmt/glob/data/test12.ts3
-rw-r--r--cli/tests/testdata/fmt/glob/nested/fizz/bar.ts2
-rw-r--r--cli/tests/testdata/fmt/glob/nested/fizz/bazz.ts3
-rw-r--r--cli/tests/testdata/fmt/glob/nested/fizz/fizz.ts2
-rw-r--r--cli/tests/testdata/fmt/glob/nested/fizz/foo.ts2
-rw-r--r--cli/tests/testdata/fmt/glob/nested/foo/bar.ts2
-rw-r--r--cli/tests/testdata/fmt/glob/nested/foo/bazz.ts3
-rw-r--r--cli/tests/testdata/fmt/glob/nested/foo/fizz.ts2
-rw-r--r--cli/tests/testdata/fmt/glob/nested/foo/foo.ts2
-rw-r--r--cli/tests/testdata/fmt/glob/pages/[id].ts2
-rw-r--r--cli/tests/testdata/lint/deno.glob.json11
-rw-r--r--cli/tests/testdata/lint/glob/data/tes.ts3
-rw-r--r--cli/tests/testdata/lint/glob/data/test1.js3
-rw-r--r--cli/tests/testdata/lint/glob/data/test1.ts3
-rw-r--r--cli/tests/testdata/lint/glob/data/test12.ts3
-rw-r--r--cli/tests/testdata/lint/glob/nested/fizz/bar.ts3
-rw-r--r--cli/tests/testdata/lint/glob/nested/fizz/bazz.ts3
-rw-r--r--cli/tests/testdata/lint/glob/nested/fizz/fizz.ts2
-rw-r--r--cli/tests/testdata/lint/glob/nested/fizz/foo.ts3
-rw-r--r--cli/tests/testdata/lint/glob/nested/foo/bar.ts3
-rw-r--r--cli/tests/testdata/lint/glob/nested/foo/bazz.ts3
-rw-r--r--cli/tests/testdata/lint/glob/nested/foo/fizz.ts3
-rw-r--r--cli/tests/testdata/lint/glob/nested/foo/foo.ts3
-rw-r--r--cli/tests/testdata/lint/glob/pages/[id].ts3
-rw-r--r--cli/tests/testdata/test/deno.glob.json11
-rw-r--r--cli/tests/testdata/test/glob/data/tes.ts3
-rw-r--r--cli/tests/testdata/test/glob/data/test1.js3
-rw-r--r--cli/tests/testdata/test/glob/data/test1.ts3
-rw-r--r--cli/tests/testdata/test/glob/data/test12.ts3
-rw-r--r--cli/tests/testdata/test/glob/nested/fizz/bar.ts3
-rw-r--r--cli/tests/testdata/test/glob/nested/fizz/bazz.ts3
-rw-r--r--cli/tests/testdata/test/glob/nested/fizz/fizz.ts2
-rw-r--r--cli/tests/testdata/test/glob/nested/fizz/foo.ts3
-rw-r--r--cli/tests/testdata/test/glob/nested/foo/bar.ts3
-rw-r--r--cli/tests/testdata/test/glob/nested/foo/bazz.ts3
-rw-r--r--cli/tests/testdata/test/glob/nested/foo/fizz.ts3
-rw-r--r--cli/tests/testdata/test/glob/nested/foo/foo.ts3
-rw-r--r--cli/tests/testdata/test/glob/pages/[id].ts3
-rwxr-xr-xtools/lint.js1
52 files changed, 528 insertions, 34 deletions
diff --git a/.dprint.json b/.dprint.json
index 31f945acd..0e10e067a 100644
--- a/.dprint.json
+++ b/.dprint.json
@@ -35,6 +35,8 @@
"cli/tests/testdata/byte_order_mark.ts",
"cli/tests/testdata/encoding",
"cli/tests/testdata/fmt/*",
+ "cli/tests/testdata/lint/glob/*",
+ "cli/tests/testdata/test/glob/*",
"cli/tests/testdata/import_assertions/json_with_shebang.json",
"cli/tests/testdata/run/inline_js_source_map*",
"cli/tests/testdata/malformed_config/*",
diff --git a/Cargo.lock b/Cargo.lock
index 30d42d8d1..272c9c0b0 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -750,6 +750,7 @@ dependencies = [
"fs3",
"fwdansi",
"glibc_version",
+ "glob",
"http",
"hyper 0.14.26",
"import_map 0.15.0",
diff --git a/cli/Cargo.toml b/cli/Cargo.toml
index 59cabd915..4c6db695f 100644
--- a/cli/Cargo.toml
+++ b/cli/Cargo.toml
@@ -75,6 +75,7 @@ fancy-regex = "=0.10.0"
fastwebsockets.workspace = true
flate2.workspace = true
fs3.workspace = true
+glob = "0.3.1"
http.workspace = true
hyper.workspace = true
import_map = "=0.15.0"
diff --git a/cli/args/config_file.rs b/cli/args/config_file.rs
index c2f02e5c1..61f7778d9 100644
--- a/cli/args/config_file.rs
+++ b/cli/args/config_file.rs
@@ -299,24 +299,19 @@ impl SerializedFilesConfig {
self,
config_file_specifier: &ModuleSpecifier,
) -> Result<FilesConfig, AnyError> {
- let config_dir = specifier_parent(config_file_specifier);
+ let config_dir =
+ specifier_to_file_path(&specifier_parent(config_file_specifier))?;
Ok(FilesConfig {
include: self
.include
.into_iter()
- .map(|p| {
- let url = config_dir.join(&p)?;
- specifier_to_file_path(&url)
- })
- .collect::<Result<Vec<_>, _>>()?,
+ .map(|p| config_dir.join(p))
+ .collect::<Vec<_>>(),
exclude: self
.exclude
.into_iter()
- .map(|p| {
- let url = config_dir.join(&p)?;
- specifier_to_file_path(&url)
- })
- .collect::<Result<Vec<_>, _>>()?,
+ .map(|p| config_dir.join(p))
+ .collect::<Vec<_>>(),
})
}
diff --git a/cli/args/mod.rs b/cli/args/mod.rs
index 5dd723eaf..513d4b39e 100644
--- a/cli/args/mod.rs
+++ b/cli/args/mod.rs
@@ -138,7 +138,7 @@ impl BenchOptions {
files: resolve_files(
maybe_bench_config.map(|c| c.files),
Some(bench_flags.files),
- ),
+ )?,
filter: bench_flags.filter,
json: bench_flags.json,
no_run: bench_flags.no_run,
@@ -183,7 +183,7 @@ impl FmtOptions {
files: resolve_files(
maybe_config_files,
maybe_fmt_flags.map(|f| f.files),
- ),
+ )?,
})
}
}
@@ -253,7 +253,7 @@ impl TestOptions {
files: resolve_files(
maybe_test_config.map(|c| c.files),
Some(test_flags.files),
- ),
+ )?,
allow_none: test_flags.allow_none,
concurrent_jobs: test_flags
.concurrent_jobs
@@ -348,7 +348,7 @@ impl LintOptions {
Ok(Self {
reporter_kind: maybe_reporter_kind.unwrap_or_default(),
is_stdin,
- files: resolve_files(maybe_config_files, Some(maybe_file_flags)),
+ files: resolve_files(maybe_config_files, Some(maybe_file_flags))?,
rules: resolve_lint_rules_options(
maybe_config_rules,
maybe_rules_tags,
@@ -1323,13 +1323,46 @@ impl StorageKeyResolver {
}
}
+fn expand_globs(paths: &[PathBuf]) -> Result<Vec<PathBuf>, AnyError> {
+ let mut new_paths = vec![];
+ for path in paths {
+ let path_str = path.to_string_lossy();
+ if path_str.chars().any(|c| matches!(c, '*' | '?')) {
+ // Escape brackets - we currently don't support them, because with introduction
+ // of glob expansion paths like "pages/[id].ts" would suddenly start giving
+ // wrong results. We might want to revisit that in the future.
+ let escaped_path_str = path_str.replace('[', "[[]").replace(']', "[]]");
+ let globbed_paths = glob::glob_with(
+ &escaped_path_str,
+ // Matches what `deno_task_shell` does
+ glob::MatchOptions {
+ // false because it should work the same way on case insensitive file systems
+ case_sensitive: false,
+ // true because it copies what sh does
+ require_literal_separator: true,
+ // true because it copies with sh does—these files are considered "hidden"
+ require_literal_leading_dot: true,
+ },
+ )?;
+
+ for globbed_path_result in globbed_paths {
+ new_paths.push(globbed_path_result?);
+ }
+ } else {
+ new_paths.push(path.clone());
+ }
+ }
+
+ Ok(new_paths)
+}
+
/// Collect included and ignored files. CLI flags take precedence
/// over config file, i.e. if there's `files.ignore` in config file
/// and `--ignore` CLI flag, only the flag value is taken into account.
fn resolve_files(
maybe_files_config: Option<FilesConfig>,
maybe_file_flags: Option<FileFlags>,
-) -> FilesConfig {
+) -> Result<FilesConfig, AnyError> {
let mut result = maybe_files_config.unwrap_or_default();
if let Some(file_flags) = maybe_file_flags {
if !file_flags.include.is_empty() {
@@ -1339,7 +1372,16 @@ fn resolve_files(
result.exclude = file_flags.ignore;
}
}
- result
+ // Now expand globs if there are any
+ if !result.include.is_empty() {
+ result.include = expand_globs(&result.include)?;
+ }
+
+ if !result.exclude.is_empty() {
+ result.exclude = expand_globs(&result.exclude)?;
+ }
+
+ Ok(result)
}
/// Resolves the no_prompt value based on the cli flags and environment.
@@ -1365,6 +1407,7 @@ pub fn npm_pkg_req_ref_to_binary_command(
#[cfg(test)]
mod test {
use super::*;
+ use pretty_assertions::assert_eq;
#[cfg(not(windows))]
#[test]
@@ -1520,4 +1563,71 @@ mod test {
let resolver = StorageKeyResolver::empty();
assert_eq!(resolver.resolve_storage_key(&specifier), None);
}
+
+ #[test]
+ fn resolve_files_test() {
+ use test_util::TempDir;
+ let temp_dir = TempDir::new();
+
+ temp_dir.create_dir_all("data");
+ temp_dir.create_dir_all("nested");
+ temp_dir.create_dir_all("nested/foo");
+ temp_dir.create_dir_all("nested/fizz");
+ temp_dir.create_dir_all("pages");
+
+ temp_dir.write("data/tes.ts", "");
+ temp_dir.write("data/test1.js", "");
+ temp_dir.write("data/test1.ts", "");
+ temp_dir.write("data/test12.ts", "");
+
+ temp_dir.write("nested/foo/foo.ts", "");
+ temp_dir.write("nested/foo/bar.ts", "");
+ temp_dir.write("nested/foo/fizz.ts", "");
+ temp_dir.write("nested/foo/bazz.ts", "");
+
+ temp_dir.write("nested/fizz/foo.ts", "");
+ temp_dir.write("nested/fizz/bar.ts", "");
+ temp_dir.write("nested/fizz/fizz.ts", "");
+ temp_dir.write("nested/fizz/bazz.ts", "");
+
+ temp_dir.write("pages/[id].ts", "");
+
+ let resolved_files = resolve_files(
+ Some(FilesConfig {
+ include: vec![
+ temp_dir.path().join("data/test1.?s"),
+ temp_dir.path().join("nested/foo/*.ts"),
+ temp_dir.path().join("nested/fizz/*.ts"),
+ temp_dir.path().join("pages/[id].ts"),
+ ],
+ exclude: vec![temp_dir.path().join("nested/**/*bazz.ts")],
+ }),
+ None,
+ )
+ .unwrap();
+
+ assert_eq!(
+ resolved_files.include,
+ vec![
+ temp_dir.path().join("data/test1.js"),
+ temp_dir.path().join("data/test1.ts"),
+ temp_dir.path().join("nested/foo/bar.ts"),
+ temp_dir.path().join("nested/foo/bazz.ts"),
+ temp_dir.path().join("nested/foo/fizz.ts"),
+ temp_dir.path().join("nested/foo/foo.ts"),
+ temp_dir.path().join("nested/fizz/bar.ts"),
+ temp_dir.path().join("nested/fizz/bazz.ts"),
+ temp_dir.path().join("nested/fizz/fizz.ts"),
+ temp_dir.path().join("nested/fizz/foo.ts"),
+ temp_dir.path().join("pages/[id].ts"),
+ ]
+ );
+ assert_eq!(
+ resolved_files.exclude,
+ vec![
+ temp_dir.path().join("nested/fizz/bazz.ts"),
+ temp_dir.path().join("nested/foo/bazz.ts"),
+ ]
+ )
+ }
}
diff --git a/cli/schemas/config-file.v1.json b/cli/schemas/config-file.v1.json
index 99f2b3a79..73723c52b 100644
--- a/cli/schemas/config-file.v1.json
+++ b/cli/schemas/config-file.v1.json
@@ -225,7 +225,7 @@
},
"exclude": {
"type": "array",
- "description": "List of files or directories that will be ignored by all other configurations. Requires Deno 1.34 or later.",
+ "description": "List of files, directories or globs that will be ignored by all other configurations. Requires Deno 1.34 or later.",
"items": {
"type": "string"
}
@@ -236,14 +236,14 @@
"properties": {
"include": {
"type": "array",
- "description": "List of files or directories that will be linted.",
+ "description": "List of files, directories or globs that will be linted.",
"items": {
"type": "string"
}
},
"exclude": {
"type": "array",
- "description": "List of files or directories that will not be linted.",
+ "description": "List of files, directories or globs that will not be linted.",
"items": {
"type": "string"
}
@@ -253,14 +253,14 @@
"properties": {
"include": {
"type": "array",
- "description": "List of files or directories that will be linted.",
+ "description": "List of files, directories or globs that will be linted.",
"items": {
"type": "string"
}
},
"exclude": {
"type": "array",
- "description": "List of files or directories that will not be linted.",
+ "description": "List of files, directories or globs that will not be linted.",
"items": {
"type": "string"
}
@@ -316,14 +316,14 @@
"properties": {
"include": {
"type": "array",
- "description": "List of files or directories that will be formatted.",
+ "description": "List of files, directories or globs that will be formatted.",
"items": {
"type": "string"
}
},
"exclude": {
"type": "array",
- "description": "List of files or directories that will not be formatted.",
+ "description": "List of files, directories or globs that will not be formatted.",
"items": {
"type": "string"
}
@@ -333,14 +333,14 @@
"properties": {
"include": {
"type": "array",
- "description": "List of files or directories that will be formatted.",
+ "description": "List of files, directories or globs that will be formatted.",
"items": {
"type": "string"
}
},
"exclude": {
"type": "array",
- "description": "List of files or directories that will not be formatted.",
+ "description": "List of files, directories or globs that will not be formatted.",
"items": {
"type": "string"
}
@@ -443,14 +443,14 @@
"properties": {
"include": {
"type": "array",
- "description": "List of files or directories that will be searched for tests.",
+ "description": "List of files, directories or globs that will be searched for tests.",
"items": {
"type": "string"
}
},
"exclude": {
"type": "array",
- "description": "List of files or directories that will not be searched for tests.",
+ "description": "List of files, directories or globs that will not be searched for tests.",
"items": {
"type": "string"
}
@@ -460,14 +460,14 @@
"properties": {
"include": {
"type": "array",
- "description": "List of files or directories that will be searched for tests.",
+ "description": "List of files, directories or globs that will be searched for tests.",
"items": {
"type": "string"
}
},
"exclude": {
"type": "array",
- "description": "List of files or directories that will not be searched for tests.",
+ "description": "List of files, directories or globs that will not be searched for tests.",
"items": {
"type": "string"
}
@@ -482,14 +482,14 @@
"properties": {
"include": {
"type": "array",
- "description": "List of files or directories that will be searched for benchmarks.",
+ "description": "List of files, directories or globs that will be searched for benchmarks.",
"items": {
"type": "string"
}
},
"exclude": {
"type": "array",
- "description": "List of files or directories that will not be searched for benchmarks.",
+ "description": "List of files, directories or globs that will not be searched for benchmarks.",
"items": {
"type": "string"
}
@@ -499,14 +499,14 @@
"properties": {
"include": {
"type": "array",
- "description": "List of files or directories that will be searched for benchmarks.",
+ "description": "List of files, directories or globs that will be searched for benchmarks.",
"items": {
"type": "string"
}
},
"exclude": {
"type": "array",
- "description": "List of files or directories that will not be searched for benchmarks.",
+ "description": "List of files, directories or globs that will not be searched for benchmarks.",
"items": {
"type": "string"
}
diff --git a/cli/tests/integration/fmt_tests.rs b/cli/tests/integration/fmt_tests.rs
index e47311cf0..e674f4a52 100644
--- a/cli/tests/integration/fmt_tests.rs
+++ b/cli/tests/integration/fmt_tests.rs
@@ -2,7 +2,9 @@
use test_util as util;
use test_util::TempDir;
+use util::assert_contains;
use util::TestContext;
+use util::TestContextBuilder;
#[test]
fn fmt_test() {
@@ -257,3 +259,93 @@ itest!(fmt_with_malformed_config2 {
output: "fmt/fmt_with_malformed_config2.out",
exit_code: 1,
});
+
+#[test]
+fn fmt_with_glob_config() {
+ let context = TestContextBuilder::new().cwd("fmt").build();
+
+ let cmd_output = context
+ .new_command()
+ .args("fmt --check --config deno.glob.json")
+ .run();
+
+ cmd_output.assert_exit_code(1);
+
+ let output = cmd_output.combined_output();
+ if cfg!(windows) {
+ assert_contains!(output, r#"glob\nested\fizz\fizz.ts"#);
+ assert_contains!(output, r#"glob\pages\[id].ts"#);
+ assert_contains!(output, r#"glob\nested\fizz\bar.ts"#);
+ assert_contains!(output, r#"glob\nested\foo\foo.ts"#);
+ assert_contains!(output, r#"glob\data\test1.js"#);
+ assert_contains!(output, r#"glob\nested\foo\bar.ts"#);
+ assert_contains!(output, r#"glob\nested\foo\fizz.ts"#);
+ assert_contains!(output, r#"glob\nested\fizz\foo.ts"#);
+ assert_contains!(output, r#"glob\data\test1.ts"#);
+ } else {
+ assert_contains!(output, "glob/nested/fizz/fizz.ts");
+ assert_contains!(output, "glob/pages/[id].ts");
+ assert_contains!(output, "glob/nested/fizz/bar.ts");
+ assert_contains!(output, "glob/nested/foo/foo.ts");
+ assert_contains!(output, "glob/data/test1.js");
+ assert_contains!(output, "glob/nested/foo/bar.ts");
+ assert_contains!(output, "glob/nested/foo/fizz.ts");
+ assert_contains!(output, "glob/nested/fizz/foo.ts");
+ assert_contains!(output, "glob/data/test1.ts");
+ }
+
+ assert_contains!(output, "Found 9 not formatted files in 9 files");
+}
+
+#[test]
+fn fmt_with_glob_config_and_flags() {
+ let context = TestContextBuilder::new().cwd("fmt").build();
+
+ let cmd_output = context
+ .new_command()
+ .args("fmt --check --config deno.glob.json --ignore=glob/nested/**/bar.ts")
+ .run();
+
+ cmd_output.assert_exit_code(1);
+
+ let output = cmd_output.combined_output();
+ if cfg!(windows) {
+ assert_contains!(output, r#"glob\nested\fizz\fizz.ts"#);
+ assert_contains!(output, r#"glob\pages\[id].ts"#);
+ assert_contains!(output, r#"glob\nested\fizz\bazz.ts"#);
+ assert_contains!(output, r#"glob\nested\foo\foo.ts"#);
+ assert_contains!(output, r#"glob\data\test1.js"#);
+ assert_contains!(output, r#"glob\nested\foo\bazz.ts"#);
+ assert_contains!(output, r#"glob\nested\foo\fizz.ts"#);
+ assert_contains!(output, r#"glob\nested\fizz\foo.ts"#);
+ assert_contains!(output, r#"glob\data\test1.ts"#);
+ } else {
+ assert_contains!(output, "glob/nested/fizz/fizz.ts");
+ assert_contains!(output, "glob/pages/[id].ts");
+ assert_contains!(output, "glob/nested/fizz/bazz.ts");
+ assert_contains!(output, "glob/nested/foo/foo.ts");
+ assert_contains!(output, "glob/data/test1.js");
+ assert_contains!(output, "glob/nested/foo/bazz.ts");
+ assert_contains!(output, "glob/nested/foo/fizz.ts");
+ assert_contains!(output, "glob/nested/fizz/foo.ts");
+ assert_contains!(output, "glob/data/test1.ts");
+ }
+ assert_contains!(output, "Found 9 not formatted files in 9 files");
+ let cmd_output = context
+ .new_command()
+ .args("fmt --check --config deno.glob.json glob/data/test1.?s")
+ .run();
+
+ cmd_output.assert_exit_code(1);
+
+ let output = cmd_output.combined_output();
+ if cfg!(windows) {
+ assert_contains!(output, r#"glob\data\test1.js"#);
+ assert_contains!(output, r#"glob\data\test1.ts"#);
+ } else {
+ assert_contains!(output, "glob/data/test1.js");
+ assert_contains!(output, "glob/data/test1.ts");
+ }
+
+ assert_contains!(output, "Found 2 not formatted files in 2 files");
+}
diff --git a/cli/tests/integration/lint_tests.rs b/cli/tests/integration/lint_tests.rs
index 8bf35ed8f..6fef3c000 100644
--- a/cli/tests/integration/lint_tests.rs
+++ b/cli/tests/integration/lint_tests.rs
@@ -1,5 +1,8 @@
// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license.
+use test_util::assert_contains;
+use test_util::TestContextBuilder;
+
itest!(ignore_unexplicit_files {
args: "lint --unstable --ignore=./",
output_str: Some("error: No target files found.\n"),
@@ -114,3 +117,95 @@ itest!(lint_with_malformed_config2 {
output: "lint/with_malformed_config2.out",
exit_code: 1,
});
+
+#[test]
+fn lint_with_glob_config() {
+ let context = TestContextBuilder::new().cwd("lint").build();
+
+ let cmd_output = context
+ .new_command()
+ .args("lint --config deno.glob.json")
+ .run();
+
+ cmd_output.assert_exit_code(1);
+
+ let output = cmd_output.combined_output();
+ if cfg!(windows) {
+ assert_contains!(output, r#"glob\nested\fizz\fizz.ts:1:10"#);
+ assert_contains!(output, r#"glob\pages\[id].ts:1:10"#);
+ assert_contains!(output, r#"glob\nested\fizz\bar.ts:1:10"#);
+ assert_contains!(output, r#"glob\nested\foo\foo.ts:1:10"#);
+ assert_contains!(output, r#"glob\data\test1.js:1:10"#);
+ assert_contains!(output, r#"glob\nested\foo\bar.ts:1:10"#);
+ assert_contains!(output, r#"glob\nested\foo\fizz.ts:1:10"#);
+ assert_contains!(output, r#"glob\nested\fizz\foo.ts:1:10"#);
+ assert_contains!(output, r#"glob\data\test1.ts:1:10"#);
+ } else {
+ assert_contains!(output, "glob/nested/fizz/fizz.ts:1:10");
+ assert_contains!(output, "glob/pages/[id].ts:1:10");
+ assert_contains!(output, "glob/nested/fizz/bar.ts:1:10");
+ assert_contains!(output, "glob/nested/foo/foo.ts:1:10");
+ assert_contains!(output, "glob/data/test1.js:1:10");
+ assert_contains!(output, "glob/nested/foo/bar.ts:1:10");
+ assert_contains!(output, "glob/nested/foo/fizz.ts:1:10");
+ assert_contains!(output, "glob/nested/fizz/foo.ts:1:10");
+ assert_contains!(output, "glob/data/test1.ts:1:10");
+ }
+ assert_contains!(output, "Found 9 problems");
+ assert_contains!(output, "Checked 9 files");
+}
+
+#[test]
+fn lint_with_glob_config_and_flags() {
+ let context = TestContextBuilder::new().cwd("lint").build();
+
+ let cmd_output = context
+ .new_command()
+ .args("lint --config deno.glob.json --ignore=glob/nested/**/bar.ts")
+ .run();
+
+ cmd_output.assert_exit_code(1);
+
+ let output = cmd_output.combined_output();
+ if cfg!(windows) {
+ assert_contains!(output, r#"glob\nested\fizz\fizz.ts:1:10"#);
+ assert_contains!(output, r#"glob\pages\[id].ts:1:10"#);
+ assert_contains!(output, r#"glob\nested\fizz\bazz.ts:1:10"#);
+ assert_contains!(output, r#"glob\nested\foo\foo.ts:1:10"#);
+ assert_contains!(output, r#"glob\data\test1.js:1:10"#);
+ assert_contains!(output, r#"glob\nested\foo\bazz.ts:1:10"#);
+ assert_contains!(output, r#"glob\nested\foo\fizz.ts:1:10"#);
+ assert_contains!(output, r#"glob\nested\fizz\foo.ts:1:10"#);
+ assert_contains!(output, r#"glob\data\test1.ts:1:10"#);
+ } else {
+ assert_contains!(output, "glob/nested/fizz/fizz.ts:1:10");
+ assert_contains!(output, "glob/pages/[id].ts:1:10");
+ assert_contains!(output, "glob/nested/fizz/bazz.ts:1:10");
+ assert_contains!(output, "glob/nested/foo/foo.ts:1:10");
+ assert_contains!(output, "glob/data/test1.js:1:10");
+ assert_contains!(output, "glob/nested/foo/bazz.ts:1:10");
+ assert_contains!(output, "glob/nested/foo/fizz.ts:1:10");
+ assert_contains!(output, "glob/nested/fizz/foo.ts:1:10");
+ assert_contains!(output, "glob/data/test1.ts:1:10");
+ }
+ assert_contains!(output, "Found 9 problems");
+ assert_contains!(output, "Checked 9 files");
+
+ let cmd_output = context
+ .new_command()
+ .args("lint --config deno.glob.json glob/data/test1.?s")
+ .run();
+
+ cmd_output.assert_exit_code(1);
+
+ let output = cmd_output.combined_output();
+ if cfg!(windows) {
+ assert_contains!(output, r#"glob\data\test1.js:1:10"#);
+ assert_contains!(output, r#"glob\data\test1.ts:1:10"#);
+ } else {
+ assert_contains!(output, "glob/data/test1.js:1:10");
+ assert_contains!(output, "glob/data/test1.ts:1:10");
+ }
+ assert_contains!(output, "Found 2 problems");
+ assert_contains!(output, "Checked 2 files");
+}
diff --git a/cli/tests/integration/test_tests.rs b/cli/tests/integration/test_tests.rs
index 04966f4ee..4dd29528f 100644
--- a/cli/tests/integration/test_tests.rs
+++ b/cli/tests/integration/test_tests.rs
@@ -6,6 +6,7 @@ use util::assert_contains;
use util::env_vars_for_npm_tests;
use util::wildcard_match;
use util::TestContext;
+use util::TestContextBuilder;
#[test]
fn no_color() {
@@ -508,3 +509,60 @@ itest!(test_no_lock {
cwd: Some("lockfile/basic"),
output: "lockfile/basic/test.nolock.out",
});
+
+#[test]
+fn test_with_glob_config() {
+ let context = TestContextBuilder::new().cwd("test").build();
+
+ let cmd_output = context
+ .new_command()
+ .args("test --config deno.glob.json")
+ .run();
+
+ cmd_output.assert_exit_code(0);
+
+ let output = cmd_output.combined_output();
+ assert_contains!(output, "glob/nested/fizz/fizz.ts");
+ assert_contains!(output, "glob/pages/[id].ts");
+ assert_contains!(output, "glob/nested/fizz/bar.ts");
+ assert_contains!(output, "glob/nested/foo/foo.ts");
+ assert_contains!(output, "glob/data/test1.js");
+ assert_contains!(output, "glob/nested/foo/bar.ts");
+ assert_contains!(output, "glob/nested/foo/fizz.ts");
+ assert_contains!(output, "glob/nested/fizz/foo.ts");
+ assert_contains!(output, "glob/data/test1.ts");
+}
+
+#[test]
+fn test_with_glob_config_and_flags() {
+ let context = TestContextBuilder::new().cwd("test").build();
+
+ let cmd_output = context
+ .new_command()
+ .args("test --config deno.glob.json --ignore=glob/nested/**/bar.ts")
+ .run();
+
+ cmd_output.assert_exit_code(0);
+
+ let output = cmd_output.combined_output();
+ assert_contains!(output, "glob/nested/fizz/fizz.ts");
+ assert_contains!(output, "glob/pages/[id].ts");
+ assert_contains!(output, "glob/nested/fizz/bazz.ts");
+ assert_contains!(output, "glob/nested/foo/foo.ts");
+ assert_contains!(output, "glob/data/test1.js");
+ assert_contains!(output, "glob/nested/foo/bazz.ts");
+ assert_contains!(output, "glob/nested/foo/fizz.ts");
+ assert_contains!(output, "glob/nested/fizz/foo.ts");
+ assert_contains!(output, "glob/data/test1.ts");
+
+ let cmd_output = context
+ .new_command()
+ .args("test --config deno.glob.json glob/data/test1.?s")
+ .run();
+
+ cmd_output.assert_exit_code(0);
+
+ let output = cmd_output.combined_output();
+ assert_contains!(output, "glob/data/test1.js");
+ assert_contains!(output, "glob/data/test1.ts");
+}
diff --git a/cli/tests/testdata/fmt/deno.glob.json b/cli/tests/testdata/fmt/deno.glob.json
new file mode 100644
index 000000000..ff74e9d2b
--- /dev/null
+++ b/cli/tests/testdata/fmt/deno.glob.json
@@ -0,0 +1,11 @@
+{
+ "fmt": {
+ "include": [
+ "glob/data/test1.?s",
+ "glob/nested/foo/*.ts",
+ "glob/nested/fizz/*.ts",
+ "glob/pages/[id].ts"
+ ],
+ "exclude": ["glob/nested/**/*bazz.ts"]
+ }
+}
diff --git a/cli/tests/testdata/fmt/glob/data/tes.ts b/cli/tests/testdata/fmt/glob/data/tes.ts
new file mode 100644
index 000000000..0127c4af3
--- /dev/null
+++ b/cli/tests/testdata/fmt/glob/data/tes.ts
@@ -0,0 +1,3 @@
+ function foo() {
+
+} \ No newline at end of file
diff --git a/cli/tests/testdata/fmt/glob/data/test1.js b/cli/tests/testdata/fmt/glob/data/test1.js
new file mode 100644
index 000000000..e939e4595
--- /dev/null
+++ b/cli/tests/testdata/fmt/glob/data/test1.js
@@ -0,0 +1,2 @@
+ function foo() {
+}
diff --git a/cli/tests/testdata/fmt/glob/data/test1.ts b/cli/tests/testdata/fmt/glob/data/test1.ts
new file mode 100644
index 000000000..e939e4595
--- /dev/null
+++ b/cli/tests/testdata/fmt/glob/data/test1.ts
@@ -0,0 +1,2 @@
+ function foo() {
+}
diff --git a/cli/tests/testdata/fmt/glob/data/test12.ts b/cli/tests/testdata/fmt/glob/data/test12.ts
new file mode 100644
index 000000000..0127c4af3
--- /dev/null
+++ b/cli/tests/testdata/fmt/glob/data/test12.ts
@@ -0,0 +1,3 @@
+ function foo() {
+
+} \ No newline at end of file
diff --git a/cli/tests/testdata/fmt/glob/nested/fizz/bar.ts b/cli/tests/testdata/fmt/glob/nested/fizz/bar.ts
new file mode 100644
index 000000000..e939e4595
--- /dev/null
+++ b/cli/tests/testdata/fmt/glob/nested/fizz/bar.ts
@@ -0,0 +1,2 @@
+ function foo() {
+}
diff --git a/cli/tests/testdata/fmt/glob/nested/fizz/bazz.ts b/cli/tests/testdata/fmt/glob/nested/fizz/bazz.ts
new file mode 100644
index 000000000..0127c4af3
--- /dev/null
+++ b/cli/tests/testdata/fmt/glob/nested/fizz/bazz.ts
@@ -0,0 +1,3 @@
+ function foo() {
+
+} \ No newline at end of file
diff --git a/cli/tests/testdata/fmt/glob/nested/fizz/fizz.ts b/cli/tests/testdata/fmt/glob/nested/fizz/fizz.ts
new file mode 100644
index 000000000..e939e4595
--- /dev/null
+++ b/cli/tests/testdata/fmt/glob/nested/fizz/fizz.ts
@@ -0,0 +1,2 @@
+ function foo() {
+}
diff --git a/cli/tests/testdata/fmt/glob/nested/fizz/foo.ts b/cli/tests/testdata/fmt/glob/nested/fizz/foo.ts
new file mode 100644
index 000000000..e939e4595
--- /dev/null
+++ b/cli/tests/testdata/fmt/glob/nested/fizz/foo.ts
@@ -0,0 +1,2 @@
+ function foo() {
+}
diff --git a/cli/tests/testdata/fmt/glob/nested/foo/bar.ts b/cli/tests/testdata/fmt/glob/nested/foo/bar.ts
new file mode 100644
index 000000000..e939e4595
--- /dev/null
+++ b/cli/tests/testdata/fmt/glob/nested/foo/bar.ts
@@ -0,0 +1,2 @@
+ function foo() {
+}
diff --git a/cli/tests/testdata/fmt/glob/nested/foo/bazz.ts b/cli/tests/testdata/fmt/glob/nested/foo/bazz.ts
new file mode 100644
index 000000000..0127c4af3
--- /dev/null
+++ b/cli/tests/testdata/fmt/glob/nested/foo/bazz.ts
@@ -0,0 +1,3 @@
+ function foo() {
+
+} \ No newline at end of file
diff --git a/cli/tests/testdata/fmt/glob/nested/foo/fizz.ts b/cli/tests/testdata/fmt/glob/nested/foo/fizz.ts
new file mode 100644
index 000000000..e939e4595
--- /dev/null
+++ b/cli/tests/testdata/fmt/glob/nested/foo/fizz.ts
@@ -0,0 +1,2 @@
+ function foo() {
+}
diff --git a/cli/tests/testdata/fmt/glob/nested/foo/foo.ts b/cli/tests/testdata/fmt/glob/nested/foo/foo.ts
new file mode 100644
index 000000000..e939e4595
--- /dev/null
+++ b/cli/tests/testdata/fmt/glob/nested/foo/foo.ts
@@ -0,0 +1,2 @@
+ function foo() {
+}
diff --git a/cli/tests/testdata/fmt/glob/pages/[id].ts b/cli/tests/testdata/fmt/glob/pages/[id].ts
new file mode 100644
index 000000000..e939e4595
--- /dev/null
+++ b/cli/tests/testdata/fmt/glob/pages/[id].ts
@@ -0,0 +1,2 @@
+ function foo() {
+}
diff --git a/cli/tests/testdata/lint/deno.glob.json b/cli/tests/testdata/lint/deno.glob.json
new file mode 100644
index 000000000..f6781b0d8
--- /dev/null
+++ b/cli/tests/testdata/lint/deno.glob.json
@@ -0,0 +1,11 @@
+{
+ "lint": {
+ "include": [
+ "glob/data/test1.?s",
+ "glob/nested/foo/*.ts",
+ "glob/nested/fizz/*.ts",
+ "glob/pages/[id].ts"
+ ],
+ "exclude": ["glob/nested/**/*bazz.ts"]
+ }
+}
diff --git a/cli/tests/testdata/lint/glob/data/tes.ts b/cli/tests/testdata/lint/glob/data/tes.ts
new file mode 100644
index 000000000..26f07fba5
--- /dev/null
+++ b/cli/tests/testdata/lint/glob/data/tes.ts
@@ -0,0 +1,3 @@
+function foo() {
+
+} \ No newline at end of file
diff --git a/cli/tests/testdata/lint/glob/data/test1.js b/cli/tests/testdata/lint/glob/data/test1.js
new file mode 100644
index 000000000..26f07fba5
--- /dev/null
+++ b/cli/tests/testdata/lint/glob/data/test1.js
@@ -0,0 +1,3 @@
+function foo() {
+
+} \ No newline at end of file
diff --git a/cli/tests/testdata/lint/glob/data/test1.ts b/cli/tests/testdata/lint/glob/data/test1.ts
new file mode 100644
index 000000000..26f07fba5
--- /dev/null
+++ b/cli/tests/testdata/lint/glob/data/test1.ts
@@ -0,0 +1,3 @@
+function foo() {
+
+} \ No newline at end of file
diff --git a/cli/tests/testdata/lint/glob/data/test12.ts b/cli/tests/testdata/lint/glob/data/test12.ts
new file mode 100644
index 000000000..26f07fba5
--- /dev/null
+++ b/cli/tests/testdata/lint/glob/data/test12.ts
@@ -0,0 +1,3 @@
+function foo() {
+
+} \ No newline at end of file
diff --git a/cli/tests/testdata/lint/glob/nested/fizz/bar.ts b/cli/tests/testdata/lint/glob/nested/fizz/bar.ts
new file mode 100644
index 000000000..26f07fba5
--- /dev/null
+++ b/cli/tests/testdata/lint/glob/nested/fizz/bar.ts
@@ -0,0 +1,3 @@
+function foo() {
+
+} \ No newline at end of file
diff --git a/cli/tests/testdata/lint/glob/nested/fizz/bazz.ts b/cli/tests/testdata/lint/glob/nested/fizz/bazz.ts
new file mode 100644
index 000000000..26f07fba5
--- /dev/null
+++ b/cli/tests/testdata/lint/glob/nested/fizz/bazz.ts
@@ -0,0 +1,3 @@
+function foo() {
+
+} \ No newline at end of file
diff --git a/cli/tests/testdata/lint/glob/nested/fizz/fizz.ts b/cli/tests/testdata/lint/glob/nested/fizz/fizz.ts
new file mode 100644
index 000000000..6940729e9
--- /dev/null
+++ b/cli/tests/testdata/lint/glob/nested/fizz/fizz.ts
@@ -0,0 +1,2 @@
+function foo() {
+}
diff --git a/cli/tests/testdata/lint/glob/nested/fizz/foo.ts b/cli/tests/testdata/lint/glob/nested/fizz/foo.ts
new file mode 100644
index 000000000..26f07fba5
--- /dev/null
+++ b/cli/tests/testdata/lint/glob/nested/fizz/foo.ts
@@ -0,0 +1,3 @@
+function foo() {
+
+} \ No newline at end of file
diff --git a/cli/tests/testdata/lint/glob/nested/foo/bar.ts b/cli/tests/testdata/lint/glob/nested/foo/bar.ts
new file mode 100644
index 000000000..26f07fba5
--- /dev/null
+++ b/cli/tests/testdata/lint/glob/nested/foo/bar.ts
@@ -0,0 +1,3 @@
+function foo() {
+
+} \ No newline at end of file
diff --git a/cli/tests/testdata/lint/glob/nested/foo/bazz.ts b/cli/tests/testdata/lint/glob/nested/foo/bazz.ts
new file mode 100644
index 000000000..26f07fba5
--- /dev/null
+++ b/cli/tests/testdata/lint/glob/nested/foo/bazz.ts
@@ -0,0 +1,3 @@
+function foo() {
+
+} \ No newline at end of file
diff --git a/cli/tests/testdata/lint/glob/nested/foo/fizz.ts b/cli/tests/testdata/lint/glob/nested/foo/fizz.ts
new file mode 100644
index 000000000..26f07fba5
--- /dev/null
+++ b/cli/tests/testdata/lint/glob/nested/foo/fizz.ts
@@ -0,0 +1,3 @@
+function foo() {
+
+} \ No newline at end of file
diff --git a/cli/tests/testdata/lint/glob/nested/foo/foo.ts b/cli/tests/testdata/lint/glob/nested/foo/foo.ts
new file mode 100644
index 000000000..26f07fba5
--- /dev/null
+++ b/cli/tests/testdata/lint/glob/nested/foo/foo.ts
@@ -0,0 +1,3 @@
+function foo() {
+
+} \ No newline at end of file
diff --git a/cli/tests/testdata/lint/glob/pages/[id].ts b/cli/tests/testdata/lint/glob/pages/[id].ts
new file mode 100644
index 000000000..26f07fba5
--- /dev/null
+++ b/cli/tests/testdata/lint/glob/pages/[id].ts
@@ -0,0 +1,3 @@
+function foo() {
+
+} \ No newline at end of file
diff --git a/cli/tests/testdata/test/deno.glob.json b/cli/tests/testdata/test/deno.glob.json
new file mode 100644
index 000000000..9deb4d2f2
--- /dev/null
+++ b/cli/tests/testdata/test/deno.glob.json
@@ -0,0 +1,11 @@
+{
+ "test": {
+ "include": [
+ "glob/data/test1.?s",
+ "glob/nested/foo/*.ts",
+ "glob/nested/fizz/*.ts",
+ "glob/pages/[id].ts"
+ ],
+ "exclude": ["glob/nested/**/*bazz.ts"]
+ }
+}
diff --git a/cli/tests/testdata/test/glob/data/tes.ts b/cli/tests/testdata/test/glob/data/tes.ts
new file mode 100644
index 000000000..26f07fba5
--- /dev/null
+++ b/cli/tests/testdata/test/glob/data/tes.ts
@@ -0,0 +1,3 @@
+function foo() {
+
+} \ No newline at end of file
diff --git a/cli/tests/testdata/test/glob/data/test1.js b/cli/tests/testdata/test/glob/data/test1.js
new file mode 100644
index 000000000..26f07fba5
--- /dev/null
+++ b/cli/tests/testdata/test/glob/data/test1.js
@@ -0,0 +1,3 @@
+function foo() {
+
+} \ No newline at end of file
diff --git a/cli/tests/testdata/test/glob/data/test1.ts b/cli/tests/testdata/test/glob/data/test1.ts
new file mode 100644
index 000000000..26f07fba5
--- /dev/null
+++ b/cli/tests/testdata/test/glob/data/test1.ts
@@ -0,0 +1,3 @@
+function foo() {
+
+} \ No newline at end of file
diff --git a/cli/tests/testdata/test/glob/data/test12.ts b/cli/tests/testdata/test/glob/data/test12.ts
new file mode 100644
index 000000000..26f07fba5
--- /dev/null
+++ b/cli/tests/testdata/test/glob/data/test12.ts
@@ -0,0 +1,3 @@
+function foo() {
+
+} \ No newline at end of file
diff --git a/cli/tests/testdata/test/glob/nested/fizz/bar.ts b/cli/tests/testdata/test/glob/nested/fizz/bar.ts
new file mode 100644
index 000000000..26f07fba5
--- /dev/null
+++ b/cli/tests/testdata/test/glob/nested/fizz/bar.ts
@@ -0,0 +1,3 @@
+function foo() {
+
+} \ No newline at end of file
diff --git a/cli/tests/testdata/test/glob/nested/fizz/bazz.ts b/cli/tests/testdata/test/glob/nested/fizz/bazz.ts
new file mode 100644
index 000000000..26f07fba5
--- /dev/null
+++ b/cli/tests/testdata/test/glob/nested/fizz/bazz.ts
@@ -0,0 +1,3 @@
+function foo() {
+
+} \ No newline at end of file
diff --git a/cli/tests/testdata/test/glob/nested/fizz/fizz.ts b/cli/tests/testdata/test/glob/nested/fizz/fizz.ts
new file mode 100644
index 000000000..6940729e9
--- /dev/null
+++ b/cli/tests/testdata/test/glob/nested/fizz/fizz.ts
@@ -0,0 +1,2 @@
+function foo() {
+}
diff --git a/cli/tests/testdata/test/glob/nested/fizz/foo.ts b/cli/tests/testdata/test/glob/nested/fizz/foo.ts
new file mode 100644
index 000000000..26f07fba5
--- /dev/null
+++ b/cli/tests/testdata/test/glob/nested/fizz/foo.ts
@@ -0,0 +1,3 @@
+function foo() {
+
+} \ No newline at end of file
diff --git a/cli/tests/testdata/test/glob/nested/foo/bar.ts b/cli/tests/testdata/test/glob/nested/foo/bar.ts
new file mode 100644
index 000000000..26f07fba5
--- /dev/null
+++ b/cli/tests/testdata/test/glob/nested/foo/bar.ts
@@ -0,0 +1,3 @@
+function foo() {
+
+} \ No newline at end of file
diff --git a/cli/tests/testdata/test/glob/nested/foo/bazz.ts b/cli/tests/testdata/test/glob/nested/foo/bazz.ts
new file mode 100644
index 000000000..26f07fba5
--- /dev/null
+++ b/cli/tests/testdata/test/glob/nested/foo/bazz.ts
@@ -0,0 +1,3 @@
+function foo() {
+
+} \ No newline at end of file
diff --git a/cli/tests/testdata/test/glob/nested/foo/fizz.ts b/cli/tests/testdata/test/glob/nested/foo/fizz.ts
new file mode 100644
index 000000000..26f07fba5
--- /dev/null
+++ b/cli/tests/testdata/test/glob/nested/foo/fizz.ts
@@ -0,0 +1,3 @@
+function foo() {
+
+} \ No newline at end of file
diff --git a/cli/tests/testdata/test/glob/nested/foo/foo.ts b/cli/tests/testdata/test/glob/nested/foo/foo.ts
new file mode 100644
index 000000000..26f07fba5
--- /dev/null
+++ b/cli/tests/testdata/test/glob/nested/foo/foo.ts
@@ -0,0 +1,3 @@
+function foo() {
+
+} \ No newline at end of file
diff --git a/cli/tests/testdata/test/glob/pages/[id].ts b/cli/tests/testdata/test/glob/pages/[id].ts
new file mode 100644
index 000000000..26f07fba5
--- /dev/null
+++ b/cli/tests/testdata/test/glob/pages/[id].ts
@@ -0,0 +1,3 @@
+function foo() {
+
+} \ No newline at end of file
diff --git a/tools/lint.js b/tools/lint.js
index bdaa01562..c88b0e933 100755
--- a/tools/lint.js
+++ b/tools/lint.js
@@ -55,6 +55,7 @@ async function dlint() {
":!:cli/tests/testdata/lint/**",
":!:cli/tests/testdata/run/**",
":!:cli/tests/testdata/tsc/**",
+ ":!:cli/tests/testdata/test/glob/**",
":!:cli/tsc/*typescript.js",
":!:cli/tsc/compiler.d.ts",
":!:test_util/wpt/**",