Skip to main content

morph_cli/core/detection/
package_json.rs

1use std::collections::HashMap;
2use std::path::Path;
3
4use serde::{Deserialize, Serialize};
5use serde_json::Value;
6
7#[derive(Debug, Clone, Default, Serialize, Deserialize)]
8pub struct PackageJson {
9    #[serde(default)]
10    pub name: String,
11    #[serde(default)]
12    pub version: String,
13    #[serde(default)]
14    pub dependencies: HashMap<String, String>,
15    #[serde(rename = "devDependencies", default)]
16    pub dev_dependencies: HashMap<String, String>,
17    #[serde(default)]
18    pub scripts: HashMap<String, String>,
19    #[serde(default)]
20    pub typ: Option<String>,
21    #[serde(default)]
22    pub workspaces: Option<Value>,
23}
24
25impl PackageJson {
26    pub fn load(path: &Path) -> Option<Self> {
27        let content = std::fs::read_to_string(path).ok()?;
28        serde_json::from_str::<PackageJson>(&content).ok()
29    }
30}
31
32#[cfg(test)]
33mod tests {
34    use super::*;
35
36    #[test]
37    fn test_parse_basic() {
38        let json = r#"{"name":"test","version":"1.0.0"}"#;
39        let pkg: PackageJson = serde_json::from_str(json).unwrap();
40        assert_eq!(pkg.name, "test");
41        assert_eq!(pkg.version, "1.0.0");
42    }
43
44    #[test]
45    fn test_parse_deps() {
46        let json = r#"{"name":"test","dependencies":{"express":"^4.0"}}"#;
47        let pkg: PackageJson = serde_json::from_str(json).unwrap();
48        assert_eq!(pkg.dependencies.get("express").unwrap(), "^4.0");
49    }
50}