Skip to content

Commit 7e5905a

Browse files
authored
feat(cli): plugin add command (#7023)
1 parent 9770032 commit 7e5905a

File tree

8 files changed

+315
-102
lines changed

8 files changed

+315
-102
lines changed

.changes/add-command.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
"cli.rs": patch
3+
"cli.js": patch
4+
---
5+
6+
Added `tauri plugin add` command to add a plugin to the Tauri project.

tooling/cli/src/helpers/mod.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,15 @@ pub mod app_paths;
66
pub mod config;
77
pub mod flock;
88
pub mod framework;
9+
pub mod npm;
910
pub mod template;
1011
pub mod updater_signature;
1112
pub mod web_dev_server;
1213

1314
use std::{
1415
collections::HashMap,
1516
path::{Path, PathBuf},
17+
process::Command,
1618
};
1719

1820
pub fn command_env(debug: bool) -> HashMap<&'static str, String> {
@@ -38,3 +40,15 @@ pub fn resolve_tauri_path<P: AsRef<Path>>(path: P, crate_name: &str) -> PathBuf
3840
PathBuf::from("..").join(path).join(crate_name)
3941
}
4042
}
43+
44+
pub fn cross_command(bin: &str) -> Command {
45+
#[cfg(target_os = "windows")]
46+
let cmd = {
47+
let mut cmd = Command::new("cmd");
48+
cmd.arg("/c").arg(bin);
49+
cmd
50+
};
51+
#[cfg(not(target_os = "windows"))]
52+
let cmd = Command::new(bin);
53+
cmd
54+
}

tooling/cli/src/helpers/npm.rs

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
// Copyright 2019-2023 Tauri Programme within The Commons Conservancy
2+
// SPDX-License-Identifier: Apache-2.0
3+
// SPDX-License-Identifier: MIT
4+
5+
use std::{fmt::Display, path::Path};
6+
7+
#[derive(Debug, PartialEq, Eq, Clone, Copy)]
8+
pub enum PackageManager {
9+
Npm,
10+
Pnpm,
11+
Yarn,
12+
YarnBerry,
13+
}
14+
15+
impl Display for PackageManager {
16+
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
17+
write!(
18+
f,
19+
"{}",
20+
match self {
21+
PackageManager::Npm => "npm",
22+
PackageManager::Pnpm => "pnpm",
23+
PackageManager::Yarn => "yarn",
24+
PackageManager::YarnBerry => "yarn berry",
25+
}
26+
)
27+
}
28+
}
29+
30+
impl PackageManager {
31+
pub fn from_project<P: AsRef<Path>>(path: P) -> Vec<Self> {
32+
let mut use_npm = false;
33+
let mut use_pnpm = false;
34+
let mut use_yarn = false;
35+
36+
if let Ok(entries) = std::fs::read_dir(path) {
37+
for entry in entries.flatten() {
38+
let path = entry.path();
39+
let name = path.file_name().unwrap().to_string_lossy();
40+
if name.as_ref() == "package-lock.json" {
41+
use_npm = true;
42+
} else if name.as_ref() == "pnpm-lock.yaml" {
43+
use_pnpm = true;
44+
} else if name.as_ref() == "yarn.lock" {
45+
use_yarn = true;
46+
}
47+
}
48+
}
49+
50+
if !use_npm && !use_pnpm && !use_yarn {
51+
return Vec::new();
52+
}
53+
54+
let mut found = Vec::new();
55+
56+
if use_npm {
57+
found.push(PackageManager::Npm);
58+
}
59+
if use_pnpm {
60+
found.push(PackageManager::Pnpm);
61+
}
62+
if use_yarn {
63+
found.push(PackageManager::Yarn);
64+
}
65+
66+
found
67+
}
68+
}

tooling/cli/src/info/env_nodejs.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@
22
// SPDX-License-Identifier: Apache-2.0
33
// SPDX-License-Identifier: MIT
44

5-
use super::{cross_command, VersionMetadata};
5+
use super::VersionMetadata;
66
use super::{SectionItem, Status};
77
use colored::Colorize;
88

9+
use crate::helpers::cross_command;
10+
911
pub fn items(metadata: &VersionMetadata) -> (Vec<SectionItem>, Option<String>) {
1012
let yarn_version = cross_command("yarn")
1113
.arg("-v")

tooling/cli/src/info/mod.rs

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ use serde::Deserialize;
1010
use std::{
1111
fmt::{self, Display, Formatter},
1212
panic,
13-
process::Command,
1413
};
1514

1615
mod app;
@@ -73,18 +72,6 @@ pub(crate) fn cli_upstream_version() -> Result<String> {
7372
.map_err(|e| anyhow::Error::new(e))
7473
}
7574

76-
pub fn cross_command(bin: &str) -> Command {
77-
#[cfg(target_os = "windows")]
78-
let cmd = {
79-
let mut cmd = Command::new("cmd");
80-
cmd.arg("/c").arg(bin);
81-
cmd
82-
};
83-
#[cfg(not(target_os = "windows"))]
84-
let cmd = Command::new(bin);
85-
cmd
86-
}
87-
8875
#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Default)]
8976
pub enum Status {
9077
Neutral = 0,

tooling/cli/src/info/packages_nodejs.rs

Lines changed: 28 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -2,41 +2,19 @@
22
// SPDX-License-Identifier: Apache-2.0
33
// SPDX-License-Identifier: MIT
44

5-
use super::{cross_command, VersionMetadata};
5+
use super::VersionMetadata;
66
use super::{SectionItem, Status};
77
use colored::Colorize;
88
use serde::Deserialize;
9-
use std::fmt::Display;
109
use std::path::{Path, PathBuf};
1110

11+
use crate::helpers::{cross_command, npm::PackageManager};
12+
1213
#[derive(Deserialize)]
1314
struct YarnVersionInfo {
1415
data: Vec<String>,
1516
}
1617

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-
4018
fn npm_latest_version(pm: &PackageManager, name: &str) -> crate::Result<Option<String>> {
4119
match pm {
4220
PackageManager::Yarn => {
@@ -154,74 +132,36 @@ fn npm_package_version<P: AsRef<Path>>(
154132
}
155133
}
156134

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-
212135
pub fn items(
213136
app_dir: Option<&PathBuf>,
214137
metadata: &VersionMetadata,
215138
yarn_version: Option<String>,
216139
) -> 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+
};
225165

226166
if package_manager == PackageManager::Yarn
227167
&& yarn_version

tooling/cli/src/plugin.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ use clap::{Parser, Subcommand};
66

77
use crate::Result;
88

9+
mod add;
910
mod android;
1011
mod init;
1112
mod ios;
@@ -26,13 +27,15 @@ pub struct Cli {
2627
#[derive(Subcommand)]
2728
enum Commands {
2829
Init(init::Options),
30+
Add(add::Options),
2931
Android(android::Cli),
3032
Ios(ios::Cli),
3133
}
3234

3335
pub fn command(cli: Cli) -> Result<()> {
3436
match cli.command {
3537
Commands::Init(options) => init::command(options)?,
38+
Commands::Add(options) => add::command(options)?,
3639
Commands::Android(cli) => android::command(cli)?,
3740
Commands::Ios(cli) => ios::command(cli)?,
3841
}

0 commit comments

Comments
 (0)