Skip to content

Commit

Permalink
fix(cli): avoid deno add and deno vendor errors when deno.json is…
Browse files Browse the repository at this point in the history
… empty (#23439)
  • Loading branch information
nokazn authored Apr 18, 2024
1 parent c6d44db commit 3d841ac
Show file tree
Hide file tree
Showing 4 changed files with 62 additions and 2 deletions.
10 changes: 8 additions & 2 deletions cli/tools/registry/pm.rs
Original file line number Diff line number Diff line change
Expand Up @@ -109,8 +109,14 @@ pub async fn add(flags: Flags, add_flags: AddFlags) -> Result<(), AnyError> {
}
}

let config_file_contents =
tokio::fs::read_to_string(&config_file_path).await.unwrap();
let config_file_contents = {
let contents = tokio::fs::read_to_string(&config_file_path).await.unwrap();
if contents.trim().is_empty() {
"{}\n".into()
} else {
contents
}
};
let ast = jsonc_parser::parse_to_ast(
&config_file_contents,
&Default::default(),
Expand Down
1 change: 1 addition & 0 deletions cli/tools/vendor/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -310,6 +310,7 @@ fn update_config_text(
) -> Result<ModifiedResult, AnyError> {
use jsonc_parser::ast::ObjectProp;
use jsonc_parser::ast::Value;
let text = if text.trim().is_empty() { "{}\n" } else { text };
let ast =
jsonc_parser::parse_to_ast(text, &Default::default(), &Default::default())?;
let obj = match ast.value {
Expand Down
20 changes: 20 additions & 0 deletions tests/integration/pm_tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,26 @@ fn add_basic_no_deno_json() {
temp_dir.join("deno.json").assert_matches_text(expected);
}

#[test]
fn add_basic_with_empty_deno_json() {
let context = pm_context_builder().build();
let temp_dir = context.temp_dir();
temp_dir.write("deno.json", "");

let output = context.new_command().args("add @denotest/add").run();
output.assert_exit_code(0);
let output = output.combined_output();
assert_contains!(output, "Add @denotest/add");
temp_dir
.path()
.join("deno.json")
.assert_matches_json(json!({
"imports": {
"@denotest/add": "jsr:@denotest/add@^1.0.0"
}
}));
}

#[test]
fn add_version_contraint() {
let context = pm_context_builder().build();
Expand Down
33 changes: 33 additions & 0 deletions tests/integration/vendor_tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -528,6 +528,39 @@ fn update_existing_config_test() {
assert!(output.status.success());
}

#[test]
fn update_existing_empty_config_test() {
let _server = http_server();
let t = TempDir::new();
t.write(
"my_app.ts",
"import {Logger} from 'http://localhost:4545/vendor/logger.ts'; new Logger().log('outputted');",
);
t.write("deno.json", "");

let deno = util::deno_cmd()
.current_dir(t.path())
.arg("vendor")
.arg("my_app.ts")
.arg("--output")
.arg("vendor2")
.env("NO_COLOR", "1")
.piped_output()
.spawn()
.unwrap();
let output = deno.wait_with_output().unwrap();
assert_eq!(
String::from_utf8_lossy(&output.stderr).trim(),
format!(
"Download http://localhost:4545/vendor/logger.ts\n{}\n\n{}",
vendored_text("1 module", "vendor2"),
success_text_updated_deno_json("vendor2",)
)
);
assert_eq!(String::from_utf8_lossy(&output.stdout).trim(), "");
assert!(output.status.success());
}

#[test]
fn vendor_npm_node_specifiers() {
let context = TestContextBuilder::for_npm().use_temp_cwd().build();
Expand Down

0 comments on commit 3d841ac

Please sign in to comment.