summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKamil Ogórek <kamil.ogorek@gmail.com>2024-09-05 10:51:40 +0200
committerGitHub <noreply@github.com>2024-09-05 08:51:40 +0000
commit2c4d99a4586a8aa143feb8614e3b0d4de09dd190 (patch)
tree0c07ee12254da10d9710616be8cc98a32c0f35c7
parent49340b96f6b3603186e03f0102b99bc4a34a1b63 (diff)
feat: include version number in all --json based outputs (#25335)
Co-authored-by: Bartek Iwańczuk <biwanczuk@gmail.com>
-rw-r--r--cli/tools/bench/reporters.rs4
-rw-r--r--cli/tools/doc.rs15
-rw-r--r--cli/tools/info.rs15
-rw-r--r--cli/tools/lint/mod.rs27
-rw-r--r--cli/tools/lint/reporters.rs4
-rw-r--r--tests/specs/bench/json_output/pass.json.out1
-rw-r--r--tests/specs/doc/json/__test__.jsonc4
-rw-r--r--tests/specs/doc/json/json.js2
-rw-r--r--tests/specs/doc/json/json.out28
-rw-r--r--tests/specs/doc/json/types.d.ts2
-rw-r--r--tests/specs/doc/lint_json_success/lint_success_json.out101
-rw-r--r--tests/specs/info/multiple_redirects/main.out1
-rw-r--r--tests/testdata/info/076_info_json_deps_order.out1
-rw-r--r--tests/testdata/info/info_json.out1
-rw-r--r--tests/testdata/info/info_json_location.out1
-rw-r--r--tests/testdata/info/json_output/main.out1
-rw-r--r--tests/testdata/lint/expected_from_stdin_json.out1
-rw-r--r--tests/testdata/lint/expected_json.out1
-rw-r--r--tests/testdata/lint/with_report_config_override.out1
-rw-r--r--tests/testdata/npm/cjs_with_deps/main_info_json.out1
-rw-r--r--tests/testdata/npm/info/chalk_json.out1
-rw-r--r--tests/testdata/npm/peer_deps_with_copied_folders/main_info_json.out1
22 files changed, 145 insertions, 69 deletions
diff --git a/cli/tools/bench/reporters.rs b/cli/tools/bench/reporters.rs
index 250655be7..9aabd760b 100644
--- a/cli/tools/bench/reporters.rs
+++ b/cli/tools/bench/reporters.rs
@@ -18,8 +18,11 @@ pub trait BenchReporter {
fn report_uncaught_error(&mut self, origin: &str, error: Box<JsError>);
}
+const JSON_SCHEMA_VERSION: u8 = 1;
+
#[derive(Debug, Serialize)]
struct JsonReporterOutput {
+ version: u8,
runtime: String,
cpu: String,
benches: Vec<JsonReporterBench>,
@@ -28,6 +31,7 @@ struct JsonReporterOutput {
impl Default for JsonReporterOutput {
fn default() -> Self {
Self {
+ version: JSON_SCHEMA_VERSION,
runtime: format!(
"{} {}",
version::DENO_VERSION_INFO.user_agent,
diff --git a/cli/tools/doc.rs b/cli/tools/doc.rs
index ce31c8068..0ba3b84fb 100644
--- a/cli/tools/doc.rs
+++ b/cli/tools/doc.rs
@@ -5,8 +5,7 @@ use crate::args::DocHtmlFlag;
use crate::args::DocSourceFileFlag;
use crate::args::Flags;
use crate::colors;
-use crate::display::write_json_to_stdout;
-use crate::display::write_to_stdout_ignore_sigpipe;
+use crate::display;
use crate::factory::CliFactory;
use crate::graph_util::graph_exit_lock_errors;
use crate::tsc::get_types_declaration_file_text;
@@ -17,6 +16,7 @@ use deno_config::glob::PathOrPatternSet;
use deno_core::anyhow::bail;
use deno_core::anyhow::Context;
use deno_core::error::AnyError;
+use deno_core::serde_json;
use deno_doc as doc;
use deno_doc::html::UrlResolveKind;
use deno_graph::source::NullFileSystem;
@@ -31,6 +31,8 @@ use std::collections::BTreeMap;
use std::rc::Rc;
use std::sync::Arc;
+const JSON_SCHEMA_VERSION: u8 = 1;
+
async fn generate_doc_nodes_for_builtin_types(
doc_flags: DocFlags,
parser: &dyn ModuleParser,
@@ -228,7 +230,11 @@ pub async fn doc(
doc_nodes_by_url.into_values().flatten().collect::<Vec<_>>();
if doc_flags.json {
- write_json_to_stdout(&doc_nodes)
+ let json_output = serde_json::json!({
+ "version": JSON_SCHEMA_VERSION,
+ "nodes": &doc_nodes
+ });
+ display::write_json_to_stdout(&json_output)
} else if doc_flags.lint {
// don't output docs if running with only the --lint flag
log::info!(
@@ -553,7 +559,8 @@ fn print_docs_to_stdout(
)
};
- write_to_stdout_ignore_sigpipe(details.as_bytes()).map_err(AnyError::from)
+ display::write_to_stdout_ignore_sigpipe(details.as_bytes())
+ .map_err(AnyError::from)
}
fn check_diagnostics(diagnostics: &[DocDiagnostic]) -> Result<(), AnyError> {
diff --git a/cli/tools/info.rs b/cli/tools/info.rs
index a32f9dc45..6aa044a92 100644
--- a/cli/tools/info.rs
+++ b/cli/tools/info.rs
@@ -11,7 +11,6 @@ use deno_core::anyhow::bail;
use deno_core::error::AnyError;
use deno_core::resolve_url_or_path;
use deno_core::serde_json;
-use deno_core::serde_json::json;
use deno_graph::Dependency;
use deno_graph::GraphKind;
use deno_graph::Module;
@@ -35,6 +34,8 @@ use crate::npm::CliNpmResolver;
use crate::npm::ManagedCliNpmResolver;
use crate::util::checksum;
+const JSON_SCHEMA_VERSION: u8 = 1;
+
pub async fn info(
flags: Arc<Flags>,
info_flags: InfoFlags,
@@ -79,7 +80,10 @@ pub async fn info(
}
if info_flags.json {
- let mut json_graph = json!(graph);
+ let mut json_graph = serde_json::json!(graph);
+ if let Some(output) = json_graph.as_object_mut() {
+ output.insert("version".to_string(), JSON_SCHEMA_VERSION.into());
+ }
add_npm_packages_to_json(&mut json_graph, npm_resolver.as_ref());
display::write_json_to_stdout(&json_graph)?;
} else {
@@ -121,7 +125,8 @@ fn print_cache_info(
let local_storage_dir = origin_dir.join("local_storage");
if json {
- let mut output = json!({
+ let mut json_output = serde_json::json!({
+ "version": JSON_SCHEMA_VERSION,
"denoDir": deno_dir,
"modulesCache": modules_cache,
"npmCache": npm_cache,
@@ -131,10 +136,10 @@ fn print_cache_info(
});
if location.is_some() {
- output["localStorage"] = serde_json::to_value(local_storage_dir)?;
+ json_output["localStorage"] = serde_json::to_value(local_storage_dir)?;
}
- display::write_json_to_stdout(&output)
+ display::write_json_to_stdout(&json_output)
} else {
println!("{} {}", colors::bold("DENO_DIR location:"), deno_dir);
println!(
diff --git a/cli/tools/lint/mod.rs b/cli/tools/lint/mod.rs
index 5b51b2b40..d5d174bf7 100644
--- a/cli/tools/lint/mod.rs
+++ b/cli/tools/lint/mod.rs
@@ -45,6 +45,7 @@ use crate::colors;
use crate::factory::CliFactory;
use crate::graph_util::ModuleGraphCreator;
use crate::tools::fmt::run_parallelized;
+use crate::util::display;
use crate::util::file_watcher;
use crate::util::fs::canonicalize_path;
use crate::util::path::is_script_ext;
@@ -60,6 +61,8 @@ pub use rules::collect_no_slow_type_diagnostics;
pub use rules::ConfiguredRules;
pub use rules::LintRuleProvider;
+const JSON_SCHEMA_VERSION: u8 = 1;
+
static STDIN_FILE_NAME: &str = "$deno$stdin.ts";
pub async fn lint(
@@ -440,18 +443,20 @@ pub fn print_rules_list(json: bool, maybe_rules_tags: Option<Vec<String>>) {
.rules;
if json {
- let json_rules: Vec<serde_json::Value> = lint_rules
- .iter()
- .map(|rule| {
- serde_json::json!({
- "code": rule.code(),
- "tags": rule.tags(),
- "docs": rule.docs(),
+ let json_output = serde_json::json!({
+ "version": JSON_SCHEMA_VERSION,
+ "rules": lint_rules
+ .iter()
+ .map(|rule| {
+ serde_json::json!({
+ "code": rule.code(),
+ "tags": rule.tags(),
+ "docs": rule.docs(),
+ })
})
- })
- .collect();
- let json_str = serde_json::to_string_pretty(&json_rules).unwrap();
- println!("{json_str}");
+ .collect::<Vec<serde_json::Value>>(),
+ });
+ display::write_json_to_stdout(&json_output).unwrap();
} else {
// The rules should still be printed even if `--quiet` option is enabled,
// so use `println!` here instead of `info!`.
diff --git a/cli/tools/lint/reporters.rs b/cli/tools/lint/reporters.rs
index cb00ad296..bf80be9f2 100644
--- a/cli/tools/lint/reporters.rs
+++ b/cli/tools/lint/reporters.rs
@@ -12,6 +12,8 @@ use crate::args::LintReporterKind;
use super::LintError;
+const JSON_SCHEMA_VERSION: u8 = 1;
+
pub fn create_reporter(kind: LintReporterKind) -> Box<dyn LintReporter + Send> {
match kind {
LintReporterKind::Pretty => Box::new(PrettyLintReporter::new()),
@@ -170,6 +172,7 @@ struct JsonLintDiagnostic {
#[derive(Serialize)]
struct JsonLintReporter {
+ version: u8,
diagnostics: Vec<JsonLintDiagnostic>,
errors: Vec<LintError>,
}
@@ -177,6 +180,7 @@ struct JsonLintReporter {
impl JsonLintReporter {
fn new() -> JsonLintReporter {
JsonLintReporter {
+ version: JSON_SCHEMA_VERSION,
diagnostics: Vec::new(),
errors: Vec::new(),
}
diff --git a/tests/specs/bench/json_output/pass.json.out b/tests/specs/bench/json_output/pass.json.out
index 53259e758..7276158ac 100644
--- a/tests/specs/bench/json_output/pass.json.out
+++ b/tests/specs/bench/json_output/pass.json.out
@@ -1,5 +1,6 @@
Check file:///[WILDCARD]/pass.ts
{
+ "version": 1,
"runtime": "Deno/[WILDCARD]",
"cpu": "[WILDCARD]",
"benches": [
diff --git a/tests/specs/doc/json/__test__.jsonc b/tests/specs/doc/json/__test__.jsonc
new file mode 100644
index 000000000..12005bc46
--- /dev/null
+++ b/tests/specs/doc/json/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "doc --json json.js",
+ "output": "json.out"
+}
diff --git a/tests/specs/doc/json/json.js b/tests/specs/doc/json/json.js
new file mode 100644
index 000000000..84d4ff4a0
--- /dev/null
+++ b/tests/specs/doc/json/json.js
@@ -0,0 +1,2 @@
+/// <reference types="./types.d.ts" />
+export const foo = "foo";
diff --git a/tests/specs/doc/json/json.out b/tests/specs/doc/json/json.out
new file mode 100644
index 000000000..ae1b02596
--- /dev/null
+++ b/tests/specs/doc/json/json.out
@@ -0,0 +1,28 @@
+{
+ "version": 1,
+ "nodes": [
+ {
+ "name": "foo",
+ "isDefault": false,
+ "location": {
+ "filename": "file:///[WILDCARD]/types.d.ts",
+ "line": 2,
+ "col": 13,
+ "byteIndex": 39
+ },
+ "declarationKind": "export",
+ "jsDoc": {
+ "doc": "An exported value."
+ },
+ "kind": "variable",
+ "variableDef": {
+ "tsType": {
+ "repr": "string",
+ "kind": "keyword",
+ "keyword": "string"
+ },
+ "kind": "const"
+ }
+ }
+ ]
+}
diff --git a/tests/specs/doc/json/types.d.ts b/tests/specs/doc/json/types.d.ts
new file mode 100644
index 000000000..ce39201e1
--- /dev/null
+++ b/tests/specs/doc/json/types.d.ts
@@ -0,0 +1,2 @@
+/** An exported value. */
+export const foo: string;
diff --git a/tests/specs/doc/lint_json_success/lint_success_json.out b/tests/specs/doc/lint_json_success/lint_success_json.out
index 19f04c6a8..1c82680f8 100644
--- a/tests/specs/doc/lint_json_success/lint_success_json.out
+++ b/tests/specs/doc/lint_json_success/lint_success_json.out
@@ -1,51 +1,54 @@
-[
- {
- "name": "Test",
- "isDefault": false,
- "location": {
- "filename": "file:///[WILDCARD]/lint_success.ts",
- "line": 2,
- "col": 0,
- "byteIndex": 22
- },
- "declarationKind": "export",
- "jsDoc": {
- "doc": "My test class."
- },
- "kind": "class",
- "classDef": {
- "isAbstract": false,
- "constructors": [],
- "properties": [
- {
- "jsDoc": {
- "doc": "My property."
- },
- "tsType": {
- "repr": "string",
- "kind": "keyword",
- "keyword": "string"
- },
- "readonly": false,
- "accessibility": null,
- "optional": false,
- "isAbstract": false,
- "isStatic": false,
- "name": "prop",
- "location": {
- "filename": "file:///[WILDCARD]/lint_success.ts",
- "line": 4,
- "col": 2,
- "byteIndex": 66
+{
+ "version": 1,
+ "nodes": [
+ {
+ "name": "Test",
+ "isDefault": false,
+ "location": {
+ "filename": "file:///[WILDCARD]/lint_success.ts",
+ "line": 2,
+ "col": 0,
+ "byteIndex": 22
+ },
+ "declarationKind": "export",
+ "jsDoc": {
+ "doc": "My test class."
+ },
+ "kind": "class",
+ "classDef": {
+ "isAbstract": false,
+ "constructors": [],
+ "properties": [
+ {
+ "jsDoc": {
+ "doc": "My property."
+ },
+ "tsType": {
+ "repr": "string",
+ "kind": "keyword",
+ "keyword": "string"
+ },
+ "readonly": false,
+ "accessibility": null,
+ "optional": false,
+ "isAbstract": false,
+ "isStatic": false,
+ "name": "prop",
+ "location": {
+ "filename": "file:///[WILDCARD]/lint_success.ts",
+ "line": 4,
+ "col": 2,
+ "byteIndex": 66
+ }
}
- }
- ],
- "indexSignatures": [],
- "methods": [],
- "extends": null,
- "implements": [],
- "typeParams": [],
- "superTypeParams": []
+ ],
+ "indexSignatures": [],
+ "methods": [],
+ "extends": null,
+ "implements": [],
+ "typeParams": [],
+ "superTypeParams": []
+ }
}
- }
-]
+ ]
+}
diff --git a/tests/specs/info/multiple_redirects/main.out b/tests/specs/info/multiple_redirects/main.out
index bd18c1728..31123be77 100644
--- a/tests/specs/info/multiple_redirects/main.out
+++ b/tests/specs/info/multiple_redirects/main.out
@@ -47,5 +47,6 @@ Download http://localhost:4545/subdir/redirects/redirect1.js
"http://localhost:4546/subdir/redirects/redirect1.js": "http://localhost:4545/subdir/redirects/redirect1.js",
"http://localhost:4548/subdir/redirects/redirect1.js": "http://localhost:4546/subdir/redirects/redirect1.js"
},
+ "version": 1,
"npmPackages": {}
}
diff --git a/tests/testdata/info/076_info_json_deps_order.out b/tests/testdata/info/076_info_json_deps_order.out
index a1b15e00c..33d58da16 100644
--- a/tests/testdata/info/076_info_json_deps_order.out
+++ b/tests/testdata/info/076_info_json_deps_order.out
@@ -160,5 +160,6 @@
}
],
"redirects": {},
+ "version": 1,
"npmPackages": {}
}
diff --git a/tests/testdata/info/info_json.out b/tests/testdata/info/info_json.out
index 3215af742..607489ca3 100644
--- a/tests/testdata/info/info_json.out
+++ b/tests/testdata/info/info_json.out
@@ -1,4 +1,5 @@
{
+ "version": 1,
"denoDir": "[WILDCARD]",
"modulesCache": "[WILDCARD]deps",
"npmCache": "[WILDCARD]npm",
diff --git a/tests/testdata/info/info_json_location.out b/tests/testdata/info/info_json_location.out
index 510fa7749..004bf03db 100644
--- a/tests/testdata/info/info_json_location.out
+++ b/tests/testdata/info/info_json_location.out
@@ -1,4 +1,5 @@
{
+ "version": 1,
"denoDir": "[WILDCARD]",
"modulesCache": "[WILDCARD]deps",
"npmCache": "[WILDCARD]npm",
diff --git a/tests/testdata/info/json_output/main.out b/tests/testdata/info/json_output/main.out
index 5a89d5cab..43c4f7398 100644
--- a/tests/testdata/info/json_output/main.out
+++ b/tests/testdata/info/json_output/main.out
@@ -87,5 +87,6 @@
}
],
"redirects": {},
+ "version": 1,
"npmPackages": {}
}
diff --git a/tests/testdata/lint/expected_from_stdin_json.out b/tests/testdata/lint/expected_from_stdin_json.out
index 9e1188bcd..27b215b43 100644
--- a/tests/testdata/lint/expected_from_stdin_json.out
+++ b/tests/testdata/lint/expected_from_stdin_json.out
@@ -1,4 +1,5 @@
{
+ "version": 1,
"diagnostics": [
{
"filename": "[WILDCARD]$deno$stdin.ts",
diff --git a/tests/testdata/lint/expected_json.out b/tests/testdata/lint/expected_json.out
index 95c3d30ba..6712c891a 100644
--- a/tests/testdata/lint/expected_json.out
+++ b/tests/testdata/lint/expected_json.out
@@ -1,4 +1,5 @@
{
+ "version": 1,
"diagnostics": [
{
"filename": "[WILDCARD]file1.js",
diff --git a/tests/testdata/lint/with_report_config_override.out b/tests/testdata/lint/with_report_config_override.out
index 7ca748158..ad32e3123 100644
--- a/tests/testdata/lint/with_report_config_override.out
+++ b/tests/testdata/lint/with_report_config_override.out
@@ -1,4 +1,5 @@
{
+ "version": 1,
"diagnostics": [
{
"filename": "[WILDCARD]a.ts",
diff --git a/tests/testdata/npm/cjs_with_deps/main_info_json.out b/tests/testdata/npm/cjs_with_deps/main_info_json.out
index fd850b8a1..4d8c1a5be 100644
--- a/tests/testdata/npm/cjs_with_deps/main_info_json.out
+++ b/tests/testdata/npm/cjs_with_deps/main_info_json.out
@@ -53,6 +53,7 @@
"npm:chai@4.3": "npm:/chai@4.3.6",
"npm:chalk@4": "npm:/chalk@4.1.2"
},
+ "version": 1,
"npmPackages": {
"ansi-styles@4.3.0": {
"name": "ansi-styles",
diff --git a/tests/testdata/npm/info/chalk_json.out b/tests/testdata/npm/info/chalk_json.out
index bffed4ad4..d54155270 100644
--- a/tests/testdata/npm/info/chalk_json.out
+++ b/tests/testdata/npm/info/chalk_json.out
@@ -12,6 +12,7 @@
"redirects": {
"npm:chalk@4": "npm:/chalk@4.1.2"
},
+ "version": 1,
"npmPackages": {
"ansi-styles@4.3.0": {
"name": "ansi-styles",
diff --git a/tests/testdata/npm/peer_deps_with_copied_folders/main_info_json.out b/tests/testdata/npm/peer_deps_with_copied_folders/main_info_json.out
index a4306a6d5..48cb1f992 100644
--- a/tests/testdata/npm/peer_deps_with_copied_folders/main_info_json.out
+++ b/tests/testdata/npm/peer_deps_with_copied_folders/main_info_json.out
@@ -53,6 +53,7 @@
"npm:@denotest/peer-dep-test-child@1": "npm:/@denotest/peer-dep-test-child@1.0.0",
"npm:@denotest/peer-dep-test-child@2": "npm:/@denotest/peer-dep-test-child@2.0.0"
},
+ "version": 1,
"npmPackages": {
"@denotest/peer-dep-test-child@1.0.0_@denotest+peer-dep-test-peer@1.0.0": {
"name": "@denotest/peer-dep-test-child",