diff options
author | David Sherret <dsherret@users.noreply.github.com> | 2022-05-23 12:49:28 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-05-23 12:49:28 -0400 |
commit | d93b7627f0451355027d4fc0f2dd1c63c58ecc3d (patch) | |
tree | 7141b243b19234d8d5c222ed430b32e0a48f4641 /cli/tools/vendor/import_map.rs | |
parent | b65d5024ef5e61301a6c8c4380bc20f4949ac60d (diff) |
fix(vendor): handle relative imports when mapped local folder name differs from remote's (#14465)
Diffstat (limited to 'cli/tools/vendor/import_map.rs')
-rw-r--r-- | cli/tools/vendor/import_map.rs | 52 |
1 files changed, 39 insertions, 13 deletions
diff --git a/cli/tools/vendor/import_map.rs b/cli/tools/vendor/import_map.rs index 4bbdbd1ae..1b2a2e263 100644 --- a/cli/tools/vendor/import_map.rs +++ b/cli/tools/vendor/import_map.rs @@ -86,12 +86,14 @@ impl<'a> ImportsBuilder<'a> { } pub fn add(&mut self, key: String, specifier: &ModuleSpecifier) { - self.imports.insert( - key, - self - .mappings - .relative_specifier_text(self.mappings.output_dir(), specifier), - ); + let value = self + .mappings + .relative_specifier_text(self.mappings.output_dir(), specifier); + + // skip creating identity entries + if key != value { + self.imports.insert(key, value); + } } } @@ -221,7 +223,8 @@ fn handle_dep_specifier( return; } - let key = if text.starts_with("./") || text.starts_with("../") { + let imports = import_map.scope(base_specifier); + if text.starts_with("./") || text.starts_with("../") { // resolve relative specifier key let mut local_base_specifier = mappings.local_uri(base_specifier); local_base_specifier.set_query(unresolved_specifier.query()); @@ -236,14 +239,37 @@ fn handle_dep_specifier( ) }); local_base_specifier.set_query(unresolved_specifier.query()); - mappings - .relative_specifier_text(mappings.output_dir(), &local_base_specifier) + + imports.add( + mappings.relative_specifier_text( + mappings.output_dir(), + &local_base_specifier, + ), + &specifier, + ); + + // add a mapping that uses the local directory name and the remote + // filename in order to support files importing this relatively + imports.add( + { + let local_path = mappings.local_path(&specifier); + let mut value = + ModuleSpecifier::from_directory_path(local_path.parent().unwrap()) + .unwrap(); + value.set_query(specifier.query()); + value.set_path(&format!( + "{}{}", + value.path(), + specifier.path_segments().unwrap().last().unwrap(), + )); + mappings.relative_specifier_text(mappings.output_dir(), &value) + }, + &specifier, + ); } else { // absolute (`/`) or bare specifier should be left as-is - text.to_string() - }; - let imports = import_map.scope(base_specifier); - imports.add(key, &specifier); + imports.add(text.to_string(), &specifier); + } } } |