This repository was archived by the owner on Feb 20, 2026. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathjavascript.rs
More file actions
122 lines (108 loc) · 3.14 KB
/
javascript.rs
File metadata and controls
122 lines (108 loc) · 3.14 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
use crate::Package;
use anyhow::Result;
use serde::Deserialize;
use std::collections::BTreeMap;
#[derive(Deserialize, Debug, PartialEq, Eq)]
struct NpmPackage {
version: Option<String>,
}
impl NpmPackage {
fn try_package(self, name: String) -> Option<Package> {
let name = name.replace("node_modules/", "");
self.version.map(|v| Package {name, version: v})
}
}
#[derive(Deserialize, Debug, PartialEq, Eq)]
struct NpmLock {
packages: BTreeMap<String, NpmPackage>,
name: String,
version: String,
}
impl NpmLock {
pub(crate) fn packages(self) -> Vec<Package> {
let mut dependencies : Vec<_>= self
.packages
.into_iter()
.filter(|(name, _)| !name.is_empty())
.filter_map(|(name, npm_package)| {npm_package.try_package(name)})
.collect();
dependencies.insert(0, Package { name: self.name, version: self.version});
dependencies
}
}
pub(crate) fn parse_npm_lock(contents: &str) -> Result<Vec<Package>> {
let npm_lock: NpmLock = serde_json::from_str(contents)?;
Ok(npm_lock.packages())
}
pub(crate) fn parse_yarn_lock(contents: &str) -> Result<Vec<Package>> {
let lock = yarn_lock_parser::parse_str(contents)?;
Ok(lock
.entries
.iter()
.map(|entry| Package::new(entry.name, entry.version))
.collect())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_npm_lock() {
let contents = r#"
{
"name": "my-proj",
"version": "0.0.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "my-proj",
"version": "0.0.0",
"dependencies": {
"@eslint": "^2.1.2"
}
},
"node_modules/@eslint/eslintrc": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz"
},
"node_module/local-package": {
"resolved": "some/local-package",
"link": true
}
}
}
"#;
let packages = parse_npm_lock(contents).unwrap();
assert_eq!(
&packages,
&[
Package::new("my-proj", "0.0.0"),
Package::new("@eslint/eslintrc", "2.1.2")
]
);
}
#[test]
fn test_yarn_lock() {
let contents = r#"
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1
leftpad@^0.0.1:
version "0.0.1"
resolved "https://registry.yarnpkg.com/leftpad/-/leftpad-0.0.1.tgz#86b1a4de4face180ac545a83f1503523d8fed115"
integrity sha512-kBAuxBQJlJ85LDc+SnGSX6gWJnJR9Qk4lbgXmz/qPfCOCieCk7BgoN3YvzoNr5BUjqxQDOQxawJJvXXd6c+6Mg==
typescript@^4.9.5:
version "4.9.5"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a"
integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==
"#;
let contents = contents.trim();
let packages = parse_yarn_lock(contents).unwrap();
assert_eq!(
packages,
&[
Package::new("leftpad", "0.0.1"),
Package::new("typescript", "4.9.5"),
]
);
}
}