diff --git a/cli/tools/bench/reporters.rs b/cli/tools/bench/reporters.rs index 250655be73..9aabd760b3 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); } +const JSON_SCHEMA_VERSION: u8 = 1; + #[derive(Debug, Serialize)] struct JsonReporterOutput { + version: u8, runtime: String, cpu: String, benches: Vec, @@ -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 ce31c80684..0ba3b84fbb 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::>(); 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 a32f9dc453..6aa044a924 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, 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 5b51b2b40c..d5d174bf75 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>) { .rules; if json { - let json_rules: Vec = 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::>(), + }); + 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 cb00ad2962..bf80be9f20 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 { match kind { LintReporterKind::Pretty => Box::new(PrettyLintReporter::new()), @@ -170,6 +172,7 @@ struct JsonLintDiagnostic { #[derive(Serialize)] struct JsonLintReporter { + version: u8, diagnostics: Vec, errors: Vec, } @@ -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 53259e7585..7276158ac3 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 0000000000..12005bc46d --- /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 0000000000..84d4ff4a08 --- /dev/null +++ b/tests/specs/doc/json/json.js @@ -0,0 +1,2 @@ +/// +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 0000000000..ae1b02596e --- /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 0000000000..ce39201e1b --- /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 19f04c6a86..1c82680f8a 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 bd18c17288..31123be778 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 a1b15e00c0..33d58da16a 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 3215af742b..607489ca39 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 510fa77494..004bf03db1 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 5a89d5cab0..43c4f7398d 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 9e1188bcdb..27b215b43d 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 95c3d30ba4..6712c891a5 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 7ca7481583..ad32e31236 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 fd850b8a1c..4d8c1a5bea 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 bffed4ad44..d54155270b 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 a4306a6d5f..48cb1f9920 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",