Skip to content
This repository was archived by the owner on Sep 17, 2023. It is now read-only.

Commit 4423ba9

Browse files
authored
Merge pull request #141 from ocornoc/graysons-suggestions
Graysons suggestions
2 parents 88b3204 + 663f950 commit 4423ba9

File tree

3 files changed

+36
-40
lines changed

3 files changed

+36
-40
lines changed

src/lerna_manifest.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -90,11 +90,11 @@ impl LernaManifest {
9090
}
9191

9292
pub fn into_package_manifests_by_package_name(
93-
mut self,
93+
self,
9494
) -> Result<HashMap<String, PackageManifest>, Box<dyn Error>> {
9595
self.internal_package_manifests
96-
.drain(0..)
97-
.map(|manifest| Ok((manifest.contents.name.to_owned(), manifest)))
96+
.into_iter()
97+
.map(|manifest| Ok((manifest.contents.name.clone(), manifest)))
9898
.collect()
9999
}
100100
}

src/link.rs

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -40,11 +40,11 @@ fn create_project_references(children: &[String]) -> TypescriptParentProjectRefe
4040
let mut sorted_children = children.to_owned();
4141
sorted_children.sort_unstable();
4242
TypescriptParentProjectReference {
43-
files: [].to_vec(),
43+
files: Vec::new(),
4444
references: sorted_children
45-
.iter()
46-
.map(|child| TypescriptProjectReference {
47-
path: child.to_string(),
45+
.into_iter()
46+
.map(|path| TypescriptProjectReference {
47+
path,
4848
})
4949
.collect(),
5050
}
@@ -118,11 +118,10 @@ fn link_package_dependencies(
118118
let package_directory = package_manifest.directory();
119119
let mut tsconfig = TypescriptConfig::from_directory(&opts.root, &package_directory)?;
120120
let internal_dependencies =
121-
package_manifest.get_internal_dependencies(&package_manifest_by_package_name);
121+
package_manifest.internal_dependencies_iter(&package_manifest_by_package_name);
122122

123123
let desired_project_references: Vec<TypescriptProjectReference> = {
124124
let mut typescript_project_references: Vec<String> = internal_dependencies
125-
.iter()
126125
.map(|dependency| {
127126
diff_paths(dependency.directory(), package_manifest.directory())
128127
.expect(

src/package_manifest.rs

Lines changed: 28 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -88,58 +88,55 @@ impl AsRef<PackageManifest> for PackageManifest {
8888
}
8989

9090
impl PackageManifest {
91-
pub fn get_internal_dependencies<'a, T>(
91+
pub fn internal_dependencies_iter<'a, T>(
9292
&'a self,
93-
package_manifests_by_package_name: &HashMap<String, &'a T>,
94-
) -> Vec<&'a PackageManifest>
93+
package_manifests_by_package_name: &'a HashMap<String, &'a T>,
94+
) -> impl Iterator<Item = &'a PackageManifest>
9595
where
9696
T: AsRef<PackageManifest>,
9797
{
98-
let get_dependency_group = |dependency_group: &str| -> Vec<&'a String> {
99-
self.contents
100-
.extra_fields
101-
.get(dependency_group)
102-
.and_then(serde_json::Value::as_object)
103-
.map(|object| object.keys().collect())
104-
.unwrap_or_default()
105-
};
106-
107-
get_dependency_group("dependencies")
98+
static DEPENDENCY_GROUPS: &[&str] = &[
99+
"dependencies",
100+
"devDependencies",
101+
"optionalDependencies",
102+
"peerDependencies",
103+
];
104+
105+
DEPENDENCY_GROUPS
108106
.iter()
109-
.chain(get_dependency_group("devDependencies").iter())
110-
.chain(get_dependency_group("optionalDependencies").iter())
111-
.chain(get_dependency_group("peerDependencies").iter())
107+
// only iterate over the objects corresponding to each dependency group
108+
.filter_map(|dependency_group| {
109+
self.contents.extra_fields.get(dependency_group)?.as_object()
110+
})
111+
// get all dependency names from all groups
112+
.flat_map(|dependency_group_value| dependency_group_value.keys())
112113
// filter out external packages
113114
.filter_map(|package_name| {
114115
package_manifests_by_package_name
115-
.get(*package_name)
116-
.cloned()
117-
.map(|thing| thing.as_ref())
116+
.get(package_name)
117+
.map(|&thing| thing.as_ref())
118118
})
119-
.collect()
120119
}
121120

122121
pub fn transitive_internal_dependency_package_names<'a>(
123122
&self,
124123
package_manifest_by_package_name: &HashMap<String, &'a PackageManifest>,
125124
) -> Vec<&'a PackageManifest> {
126125
// Depth-first search all transitive internal dependencies of package
127-
let mut seen_package_names: HashSet<&str> = HashSet::new();
128-
let mut internal_dependencies: HashSet<String> = HashSet::new();
129-
let mut to_visit_package_manifests: VecDeque<&PackageManifest> = VecDeque::new();
126+
let mut seen_package_names = HashSet::new();
127+
let mut internal_dependencies = HashSet::new();
128+
let mut to_visit_package_manifests = VecDeque::new();
130129

131130
to_visit_package_manifests.push_back(self);
132131

133-
while !to_visit_package_manifests.is_empty() {
134-
let current_manifest = to_visit_package_manifests.pop_front().unwrap();
132+
while let Some(current_manifest) = to_visit_package_manifests.pop_front() {
135133
seen_package_names.insert(&current_manifest.contents.name);
136134

137135
for dependency in current_manifest
138-
.get_internal_dependencies(package_manifest_by_package_name)
139-
.iter()
136+
.internal_dependencies_iter(package_manifest_by_package_name)
140137
{
141138
internal_dependencies.insert(dependency.contents.name.to_owned());
142-
if !seen_package_names.contains(&dependency.contents.name.as_ref()) {
139+
if !seen_package_names.contains(&dependency.contents.name) {
143140
to_visit_package_manifests.push_back(dependency);
144141
}
145142
}
@@ -156,10 +153,10 @@ impl PackageManifest {
156153
.collect()
157154
}
158155

159-
pub fn get_dependency_group_mut<'a>(
160-
&'a mut self,
156+
pub fn get_dependency_group_mut(
157+
&mut self,
161158
group: &DependencyGroup,
162-
) -> Option<&'a mut serde_json::Map<String, serde_json::Value>> {
159+
) -> Option<&mut serde_json::Map<String, serde_json::Value>> {
163160
let group_index = match group {
164161
DependencyGroup::Dependencies => "dependencies",
165162
DependencyGroup::DevDependencies => "devDependencies",

0 commit comments

Comments
 (0)