|
2 | 2 | // SPDX-License-Identifier: Apache-2.0 |
3 | 3 | // SPDX-License-Identifier: MIT |
4 | 4 |
|
5 | | -use super::{cross_command, VersionMetadata}; |
| 5 | +use super::VersionMetadata; |
6 | 6 | use super::{SectionItem, Status}; |
7 | 7 | use colored::Colorize; |
8 | 8 | use serde::Deserialize; |
9 | | -use std::fmt::Display; |
10 | 9 | use std::path::{Path, PathBuf}; |
11 | 10 |
|
| 11 | +use crate::helpers::{cross_command, npm::PackageManager}; |
| 12 | + |
12 | 13 | #[derive(Deserialize)] |
13 | 14 | struct YarnVersionInfo { |
14 | 15 | data: Vec<String>, |
15 | 16 | } |
16 | 17 |
|
17 | | -#[derive(Debug, PartialEq, Eq, Clone, Copy)] |
18 | | -enum PackageManager { |
19 | | - Npm, |
20 | | - Pnpm, |
21 | | - Yarn, |
22 | | - YarnBerry, |
23 | | -} |
24 | | - |
25 | | -impl Display for PackageManager { |
26 | | - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { |
27 | | - write!( |
28 | | - f, |
29 | | - "{}", |
30 | | - match self { |
31 | | - PackageManager::Npm => "npm", |
32 | | - PackageManager::Pnpm => "pnpm", |
33 | | - PackageManager::Yarn => "yarn", |
34 | | - PackageManager::YarnBerry => "yarn berry", |
35 | | - } |
36 | | - ) |
37 | | - } |
38 | | -} |
39 | | - |
40 | 18 | fn npm_latest_version(pm: &PackageManager, name: &str) -> crate::Result<Option<String>> { |
41 | 19 | match pm { |
42 | 20 | PackageManager::Yarn => { |
@@ -154,74 +132,36 @@ fn npm_package_version<P: AsRef<Path>>( |
154 | 132 | } |
155 | 133 | } |
156 | 134 |
|
157 | | -fn get_package_manager<T: AsRef<str>>(app_dir_entries: &[T]) -> PackageManager { |
158 | | - let mut use_npm = false; |
159 | | - let mut use_pnpm = false; |
160 | | - let mut use_yarn = false; |
161 | | - |
162 | | - for name in app_dir_entries { |
163 | | - if name.as_ref() == "package-lock.json" { |
164 | | - use_npm = true; |
165 | | - } else if name.as_ref() == "pnpm-lock.yaml" { |
166 | | - use_pnpm = true; |
167 | | - } else if name.as_ref() == "yarn.lock" { |
168 | | - use_yarn = true; |
169 | | - } |
170 | | - } |
171 | | - |
172 | | - if !use_npm && !use_pnpm && !use_yarn { |
173 | | - println!( |
174 | | - "{}: no lock files found, defaulting to npm", |
175 | | - "WARNING".yellow() |
176 | | - ); |
177 | | - return PackageManager::Npm; |
178 | | - } |
179 | | - |
180 | | - let mut found = Vec::new(); |
181 | | - |
182 | | - if use_npm { |
183 | | - found.push(PackageManager::Npm); |
184 | | - } |
185 | | - if use_pnpm { |
186 | | - found.push(PackageManager::Pnpm); |
187 | | - } |
188 | | - if use_yarn { |
189 | | - found.push(PackageManager::Yarn); |
190 | | - } |
191 | | - |
192 | | - if found.len() > 1 { |
193 | | - let pkg_manger = found[0]; |
194 | | - println!( |
195 | | - "{}: Only one package manager should be used, but found {}.\n Please remove unused package manager lock files, will use {} for now!", |
196 | | - "WARNING".yellow(), |
197 | | - found.iter().map(ToString::to_string).collect::<Vec<_>>().join(" and "), |
198 | | - pkg_manger |
199 | | - ); |
200 | | - return pkg_manger; |
201 | | - } |
202 | | - |
203 | | - if use_npm { |
204 | | - PackageManager::Npm |
205 | | - } else if use_pnpm { |
206 | | - PackageManager::Pnpm |
207 | | - } else { |
208 | | - PackageManager::Yarn |
209 | | - } |
210 | | -} |
211 | | - |
212 | 135 | pub fn items( |
213 | 136 | app_dir: Option<&PathBuf>, |
214 | 137 | metadata: &VersionMetadata, |
215 | 138 | yarn_version: Option<String>, |
216 | 139 | ) -> Vec<SectionItem> { |
217 | | - let mut package_manager = PackageManager::Npm; |
218 | | - if let Some(app_dir) = &app_dir { |
219 | | - let app_dir_entries = std::fs::read_dir(app_dir) |
220 | | - .unwrap() |
221 | | - .map(|e| e.unwrap().file_name().to_string_lossy().into_owned()) |
222 | | - .collect::<Vec<String>>(); |
223 | | - package_manager = get_package_manager(&app_dir_entries); |
224 | | - } |
| 140 | + let package_managers = app_dir |
| 141 | + .map(PackageManager::from_project) |
| 142 | + .unwrap_or_else(|| { |
| 143 | + println!( |
| 144 | + "{}: no lock files found, defaulting to npm", |
| 145 | + "WARNING".yellow() |
| 146 | + ); |
| 147 | + vec![PackageManager::Npm] |
| 148 | + }); |
| 149 | + |
| 150 | + let mut package_manager = if package_managers.len() > 1 { |
| 151 | + let pkg_manager = package_managers[0]; |
| 152 | + println!( |
| 153 | + "{}: Only one package manager should be used, but found {}.\n Please remove unused package manager lock files, will use {} for now!", |
| 154 | + "WARNING".yellow(), |
| 155 | + package_managers.iter().map(ToString::to_string).collect::<Vec<_>>().join(" and "), |
| 156 | + pkg_manager |
| 157 | + ); |
| 158 | + pkg_manager |
| 159 | + } else { |
| 160 | + package_managers |
| 161 | + .into_iter() |
| 162 | + .next() |
| 163 | + .unwrap_or(PackageManager::Npm) |
| 164 | + }; |
225 | 165 |
|
226 | 166 | if package_manager == PackageManager::Yarn |
227 | 167 | && yarn_version |
|
0 commit comments