diff options
Diffstat (limited to 'cli/tests/integration/vendor_tests.rs')
-rw-r--r-- | cli/tests/integration/vendor_tests.rs | 184 |
1 files changed, 158 insertions, 26 deletions
diff --git a/cli/tests/integration/vendor_tests.rs b/cli/tests/integration/vendor_tests.rs index 1f159fe80..94ab2ad5a 100644 --- a/cli/tests/integration/vendor_tests.rs +++ b/cli/tests/integration/vendor_tests.rs @@ -10,6 +10,7 @@ use test_util as util; use test_util::TempDir; use util::http_server; use util::new_deno_dir; +use util::TestContextBuilder; #[test] fn output_dir_exists() { @@ -186,15 +187,13 @@ fn import_map_output_dir() { String::from_utf8_lossy(&output.stderr).trim(), format!( concat!( - "Ignoring import map. Specifying an import map file ({}) in the deno ", - "vendor output directory is not supported. If you wish to use an ", - "import map while vendoring, please specify one located outside this ", - "directory.\n", + "{}\n", "Download http://localhost:4545/vendor/logger.ts\n", - "{}", + "{}\n\n{}", ), - PathBuf::from("vendor").join("import_map.json").display(), - success_text_updated_deno_json("1 module", "vendor/"), + ignoring_import_map_text(), + vendored_text("1 module", "vendor/"), + success_text_updated_deno_json("vendor/"), ) ); assert!(output.status.success()); @@ -511,8 +510,9 @@ fn update_existing_config_test() { assert_eq!( String::from_utf8_lossy(&output.stderr).trim(), format!( - "Download http://localhost:4545/vendor/logger.ts\n{}", - success_text_updated_deno_json("1 module", "vendor2",) + "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(), ""); @@ -537,38 +537,158 @@ fn update_existing_config_test() { assert!(output.status.success()); } +#[test] +fn vendor_npm_node_specifiers() { + let context = TestContextBuilder::for_npm().use_temp_cwd().build(); + let temp_dir = context.temp_dir(); + temp_dir.write( + "my_app.ts", + concat!( + "import { path, getValue, setValue } from 'http://localhost:4545/vendor/npm_and_node_specifier.ts';\n", + "setValue(5);\n", + "console.log(path.isAbsolute(Deno.cwd()), getValue());", + ), + ); + temp_dir.write("deno.json", "{}"); + + let output = context.new_command().args("vendor my_app.ts").run(); + output.assert_matches_text( + format!( + concat!( + "Download http://localhost:4545/vendor/npm_and_node_specifier.ts\n", + "Download http://localhost:4545/npm/registry/@denotest/esm-basic\n", + "Download http://localhost:4545/npm/registry/@denotest/esm-basic/1.0.0.tgz\n", + "{}\n", + "Initialize @denotest/esm-basic@1.0.0\n", + "{}\n\n", + "{}\n", + ), + vendored_text("1 module", "vendor/"), + vendored_npm_package_text("1 npm package"), + success_text_updated_deno_json("vendor/") + ) + ); + let output = context.new_command().args("run -A my_app.ts").run(); + output.assert_matches_text("true 5\n"); + assert!(temp_dir.path().join("node_modules").exists()); + assert!(temp_dir.path().join("deno.lock").exists()); + + // now try re-vendoring with a lockfile + let output = context.new_command().args("vendor --force my_app.ts").run(); + output.assert_matches_text(format!( + "{}\n{}\n\n{}\n", + ignoring_import_map_text(), + vendored_text("1 module", "vendor/"), + success_text_updated_deno_json("vendor/"), + )); + + // delete the node_modules folder + temp_dir.remove_dir_all("node_modules"); + + // vendor with --node-modules-dir=false + let output = context + .new_command() + .args("vendor --node-modules-dir=false --force my_app.ts") + .run(); + output.assert_matches_text(format!( + "{}\n{}\n\n{}\n", + ignoring_import_map_text(), + vendored_text("1 module", "vendor/"), + success_text_updated_deno_json("vendor/") + )); + assert!(!temp_dir.path().join("node_modules").exists()); + + // delete the deno.json + temp_dir.remove_file("deno.json"); + + // vendor with --node-modules-dir + let output = context + .new_command() + .args("vendor --node-modules-dir --force my_app.ts") + .run(); + output.assert_matches_text(format!( + "Initialize @denotest/esm-basic@1.0.0\n{}\n\n{}\n", + vendored_text("1 module", "vendor/"), + use_import_map_text("vendor/") + )); +} + +#[test] +fn vendor_only_npm_specifiers() { + let context = TestContextBuilder::for_npm().use_temp_cwd().build(); + let temp_dir = context.temp_dir(); + temp_dir.write( + "my_app.ts", + concat!( + "import { getValue, setValue } from 'npm:@denotest/esm-basic';\n", + "setValue(5);\n", + "console.log(path.isAbsolute(Deno.cwd()), getValue());", + ), + ); + temp_dir.write("deno.json", "{}"); + + let output = context.new_command().args("vendor my_app.ts").run(); + output.assert_matches_text( + format!( + concat!( + "Download http://localhost:4545/npm/registry/@denotest/esm-basic\n", + "Download http://localhost:4545/npm/registry/@denotest/esm-basic/1.0.0.tgz\n", + "{}\n", + "Initialize @denotest/esm-basic@1.0.0\n", + "{}\n", + ), + vendored_text("0 modules", "vendor/"), + vendored_npm_package_text("1 npm package"), + ) + ); +} + fn success_text(module_count: &str, dir: &str, has_import_map: bool) -> String { let mut text = format!("Vendored {module_count} into {dir} directory."); if has_import_map { - let f = format!( - concat!( - "\n\nTo use vendored modules, specify the `--import-map {}import_map.json` flag when ", - r#"invoking Deno subcommands or add an `"importMap": "<path_to_vendored_import_map>"` "#, - "entry to a deno.json file.", - ), - if dir != "vendor/" { - format!("{}{}", dir.trim_end_matches('/'), if cfg!(windows) { '\\' } else {'/'}) - } else { - dir.to_string() - } - ); - write!(text, "{f}").unwrap(); + write!(text, "\n\n{}", use_import_map_text(dir)).unwrap(); } text } -fn success_text_updated_deno_json(module_count: &str, dir: &str) -> String { +fn use_import_map_text(dir: &str) -> String { + format!( + concat!( + "To use vendored modules, specify the `--import-map {}import_map.json` flag when ", + r#"invoking Deno subcommands or add an `"importMap": "<path_to_vendored_import_map>"` "#, + "entry to a deno.json file.", + ), + if dir != "vendor/" { + format!("{}{}", dir.trim_end_matches('/'), if cfg!(windows) { '\\' } else {'/'}) + } else { + dir.to_string() + } + ) +} + +fn vendored_text(module_count: &str, dir: &str) -> String { + format!("Vendored {} into {} directory.", module_count, dir) +} + +fn vendored_npm_package_text(package_count: &str) -> String { + format!( + concat!( + "Vendored {} into node_modules directory. Set `nodeModulesDir: false` ", + "in the Deno configuration file to disable vendoring npm packages in the future.", + ), + package_count + ) +} + +fn success_text_updated_deno_json(dir: &str) -> String { format!( concat!( - "Vendored {} into {} directory.\n\n", "Updated your local Deno configuration file with a reference to the ", "new vendored import map at {}import_map.json. Invoking Deno subcommands will ", "now automatically resolve using the vendored modules. You may override ", "this by providing the `--import-map <other-import-map>` flag or by ", "manually editing your Deno configuration file.", ), - module_count, - dir, if dir != "vendor/" { format!( "{}{}", @@ -580,3 +700,15 @@ fn success_text_updated_deno_json(module_count: &str, dir: &str) -> String { } ) } + +fn ignoring_import_map_text() -> String { + format!( + concat!( + "Ignoring import map. Specifying an import map file ({}) in the deno ", + "vendor output directory is not supported. If you wish to use an ", + "import map while vendoring, please specify one located outside this ", + "directory.", + ), + PathBuf::from("vendor").join("import_map.json").display(), + ) +} |