diff options
author | Kitson Kelly <me@kitsonkelly.com> | 2020-11-07 15:04:22 +1100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-11-07 15:04:22 +1100 |
commit | 88c4d3145b1e964387be487090bb6ec0a572b90f (patch) | |
tree | 8da4c2d5bf6c36bbb9cb0b0359433708f48328c7 /cli/module_graph.rs | |
parent | 4f67f0cc6033983540ed51f1270fb420cac45487 (diff) |
fix(cli): allow remapping to locals for import map (#8262)
Fixes #7723
Diffstat (limited to 'cli/module_graph.rs')
-rw-r--r-- | cli/module_graph.rs | 34 |
1 files changed, 33 insertions, 1 deletions
diff --git a/cli/module_graph.rs b/cli/module_graph.rs index 9b3d79a94..4d0a4419f 100644 --- a/cli/module_graph.rs +++ b/cli/module_graph.rs @@ -441,7 +441,9 @@ impl Module { } else { None }; + let mut remapped_import = false; let specifier = if let Some(module_specifier) = maybe_resolve { + remapped_import = true; module_specifier } else { ModuleSpecifier::resolve_import(specifier, self.specifier.as_str())? @@ -462,9 +464,11 @@ impl Module { ); } - // Disallow a remote URL from trying to import a local URL + // Disallow a remote URL from trying to import a local URL, unless it is a + // remapped import via the import map if (referrer_scheme == "https" || referrer_scheme == "http") && !(specifier_scheme == "https" || specifier_scheme == "http") + && !remapped_import { return Err( GraphError::InvalidLocalImport(specifier.clone(), location).into(), @@ -2212,6 +2216,34 @@ pub mod tests { } #[tokio::test] + async fn test_graph_import_map_remote_to_local() { + let c = PathBuf::from(env::var_os("CARGO_MANIFEST_DIR").unwrap()); + let fixtures = c.join("tests/module_graph"); + let maybe_import_map = Some( + ImportMap::from_json( + "file:///tests/importmap.json", + r#"{ + "imports": { + "https://deno.land/x/b/mod.js": "./b/mod.js" + } + } + "#, + ) + .expect("could not parse import map"), + ); + let handler = Rc::new(RefCell::new(MockSpecifierHandler { + fixtures, + ..Default::default() + })); + let mut builder = GraphBuilder::new(handler, maybe_import_map, None); + let specifier = + ModuleSpecifier::resolve_url_or_path("file:///tests/importremap.ts") + .expect("could not resolve module"); + builder.add(&specifier, false).await.expect("could not add"); + builder.get_graph(); + } + + #[tokio::test] async fn test_graph_with_lockfile() { let c = PathBuf::from(env::var_os("CARGO_MANIFEST_DIR").unwrap()); let fixtures = c.join("tests/module_graph"); |