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

Commit 66797d7

Browse files
committed
feat: add linking of child references
1 parent 4d771df commit 66797d7

File tree

8 files changed

+543
-127
lines changed

8 files changed

+543
-127
lines changed

.rustfmt.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
newline_style = "Unix"

Cargo.lock

Lines changed: 141 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,6 @@ edition = "2021"
77

88
[dependencies]
99
clap = "3.0.0-beta.5"
10-
glob = "0.2.11"
10+
globwalk = "0.8.1"
1111
serde = { version = "1.0", features = ["derive"] }
1212
serde_json = { version = "1.0", features = ["preserve_order"] }

src/io.rs

Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
use std::collections::HashMap;
2+
use std::error::Error;
3+
use std::fs::File;
4+
use std::io::{BufReader, BufWriter, Write};
5+
use std::path::{Path, PathBuf};
6+
7+
use globwalk::{FileType, GlobWalkerBuilder};
8+
9+
use serde::{Deserialize, Serialize};
10+
use serde_json;
11+
use serde_json::Value;
12+
13+
#[derive(Serialize, Deserialize, Debug)]
14+
pub struct LernaManifest {
15+
pub version: String,
16+
pub packages: Vec<String>,
17+
}
18+
19+
#[derive(Serialize, Deserialize, Debug)]
20+
#[serde(rename_all = "camelCase")]
21+
pub struct PackageManifest {
22+
pub name: String,
23+
pub version: String,
24+
#[serde(flatten)]
25+
pub extra_fields: Value,
26+
}
27+
28+
#[derive(Serialize)]
29+
pub struct TypeScriptProjectReference {
30+
pub path: String,
31+
}
32+
33+
#[derive(Serialize)]
34+
pub struct TypeScriptProjectReferences {
35+
pub files: Vec<String>,
36+
pub references: Vec<TypeScriptProjectReference>,
37+
}
38+
39+
pub fn read_lerna_manifest<P: AsRef<Path>>(root: P) -> Result<LernaManifest, Box<dyn Error>> {
40+
let file = File::open(root.as_ref().join("lerna.json"))?;
41+
let reader = BufReader::new(file);
42+
let u = serde_json::from_reader(reader)?;
43+
Ok(u)
44+
}
45+
46+
pub fn read_package_manifest<P: AsRef<Path>>(
47+
manifest: P,
48+
) -> Result<PackageManifest, Box<dyn Error>> {
49+
let file = File::open(manifest)?;
50+
let reader = BufReader::new(file);
51+
let u = serde_json::from_reader(reader)?;
52+
Ok(u)
53+
}
54+
55+
pub fn write_package_manifest<P: AsRef<Path>>(
56+
path: P,
57+
manifest: &PackageManifest,
58+
) -> Result<(), Box<dyn Error>> {
59+
let file = File::create(path)?;
60+
let mut writer = BufWriter::new(file);
61+
serde_json::to_writer_pretty(&mut writer, manifest)?;
62+
writer.write_all(b"\n")?;
63+
writer.flush()?;
64+
Ok(())
65+
}
66+
67+
pub fn write_project_references<P: AsRef<Path>>(
68+
path: P,
69+
references: &TypeScriptProjectReferences,
70+
) -> Result<(), Box<dyn Error>> {
71+
let file = File::create(&path)?;
72+
let mut writer = BufWriter::new(file);
73+
serde_json::to_writer_pretty(&mut writer, references)?;
74+
writer.write_all(b"\n")?;
75+
writer.flush()?;
76+
Ok(())
77+
}
78+
79+
pub fn get_internal_package_manifest_files<P: AsRef<Path>>(
80+
root: P,
81+
lerna_manifest: &LernaManifest,
82+
ignore_globs: &Vec<String>,
83+
) -> Result<Vec<PathBuf>, Box<dyn Error>> {
84+
// dawid's tip: use cargo's clippy with rust-analyzer for enlightenment
85+
// dawid's tip: consider rayon for parallel iterators
86+
87+
let mut package_manifests: Vec<String> = lerna_manifest
88+
.packages
89+
.iter()
90+
.map(|package_manifest_glob| {
91+
Path::new(package_manifest_glob)
92+
.join("package.json")
93+
.to_str()
94+
.expect("Path not valid UTF-8")
95+
.to_string()
96+
})
97+
// dawid's tip: return an iterator from this function, avoid collecting
98+
.collect();
99+
100+
// ignore paths to speed up file-system walk
101+
for glob in ignore_globs {
102+
package_manifests.push(glob.to_string());
103+
}
104+
package_manifests.push("!node_modules/".to_string());
105+
106+
let manifest_files = GlobWalkerBuilder::from_patterns(&root, &package_manifests)
107+
.file_type(FileType::FILE)
108+
.min_depth(1)
109+
.build()
110+
.expect("Unable to create glob")
111+
.into_iter()
112+
.filter_map(Result::ok)
113+
.map(|dir_entry| dir_entry.into_path())
114+
.collect();
115+
116+
Ok(manifest_files)
117+
}
118+
119+
pub fn read_internal_package_manifests<P: AsRef<Path>>(
120+
internal_package_manifest_files: &Vec<P>,
121+
) -> Result<HashMap<PathBuf, PackageManifest>, Box<dyn Error>> {
122+
let mut package_manifests = HashMap::new();
123+
124+
for manifest_file in internal_package_manifest_files {
125+
let package_manifest_contents = read_package_manifest(manifest_file)?;
126+
package_manifests.insert(
127+
manifest_file.as_ref().to_path_buf(),
128+
package_manifest_contents,
129+
);
130+
}
131+
132+
Ok(package_manifests)
133+
}

0 commit comments

Comments
 (0)