(&mut self, name: &str, start_dir: &str)
| 49 | |
| 50 | impl WasmHostResolver { |
| 51 | fn resolve_bare(&mut self, name: &str, start_dir: &str) -> Result<Resolved, String> { |
| 52 | let mut visited: FxHashSet<String> = FxHashSet::default(); |
| 53 | let mut search_dir = start_dir.to_string(); |
| 54 | let mut hops: u32 = 0; |
| 55 | loop { |
| 56 | if hops > MAX_PACKAGES_HOPS { |
| 57 | return Err(s!( |
| 58 | "packages.json walk-up exceeded ", |
| 59 | int MAX_PACKAGES_HOPS as i64, |
| 60 | " hops resolving '", str name, "'")); |
| 61 | } |
| 62 | hops += 1; |
| 63 | |
| 64 | let mut hit: Option<(String, Option<String>, Option<String>)> = None; |
| 65 | for dir in walk_up_dirs(&search_dir) { |
| 66 | let m_spec = s!(str &dir, "packages.json"); |
| 67 | if let Some((target, ext)) = self.lookup_in_manifest(&m_spec, name)? { |
| 68 | hit = Some((dir, target, ext)); |
| 69 | break; |
| 70 | } |
| 71 | } |
| 72 | let Some((dir, target, ext)) = hit else { |
| 73 | return Err(s!("no packages.json above '", str start_dir, "' declares '", str name, "'")); |
| 74 | }; |
| 75 | if let Some(target) = target { |
| 76 | let canonical = join_relative(&dir, &target); |
| 77 | return self.resolve_canonical(&canonical); |
| 78 | } |
| 79 | let m_spec = s!(str &dir, "packages.json"); |
| 80 | if let Some(ext) = ext { |
| 81 | if !visited.insert(m_spec) { |
| 82 | return Err(s!("circular extends chain in packages.json")); |
| 83 | } |
| 84 | let mut next = join_relative(&dir, &ext); |
| 85 | if !next.ends_with('/') { next.push('/'); } |
| 86 | search_dir = next; |
| 87 | continue; |
| 88 | } |
| 89 | return Err(s!("alias '", str name, "' not declared in '", str &m_spec, "'\n", "help: declare it, add \"extends\": \"..\" to inherit, or use a quoted path", |
| 90 | )); |
| 91 | } |
| 92 | } |
| 93 | |
| 94 | #[allow(clippy::type_complexity)] |
| 95 | fn lookup_in_manifest(&mut self, m_spec: &str, name: &str) -> Result<Option<(Option<String>, Option<String>)>, String> { |
no test coverage detected