Skip to content

Commit b3563e3

Browse files
feat(cli): add deno support (#11304)
* feat(cli): add deno support ref: denoland/deno#20738 * Update packages_nodejs.rs * typo --------- Co-authored-by: Lucas Nogueira <[email protected]>
1 parent d609bef commit b3563e3

File tree

9 files changed

+56
-118
lines changed

9 files changed

+56
-118
lines changed

.changes/deno.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
"tauri-cli": "patch:feat"
3+
"@tauri-apps/cli": "patch:feat"
4+
---
5+
6+
Add Deno support in tauri-cli operations.

crates/tauri-cli/src/add.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -93,9 +93,10 @@ pub fn run(options: Options) -> Result<()> {
9393
}));
9494

9595
let npm_spec = match (npm_version_req, options.tag, options.rev, options.branch) {
96-
(Some(version), _, _, _) => {
97-
format!("{npm_name}@{version}")
98-
}
96+
(Some(version_req), _, _, _) => match manager {
97+
PackageManager::Deno => format!("npm:{npm_name}@{version_req}"),
98+
_ => format!("{npm_name}@{version_req}"),
99+
},
99100
(None, Some(tag), None, None) => {
100101
format!("tauri-apps/tauri-plugin-{plugin}#{tag}")
101102
}

crates/tauri-cli/src/completions.rs

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use clap_complete::{generate, Shell};
99

1010
use std::{fs::write, path::PathBuf};
1111

12-
const PKG_MANAGERS: &[&str] = &["cargo", "pnpm", "npm", "yarn", "bun"];
12+
const PKG_MANAGERS: &[&str] = &["cargo", "pnpm", "npm", "yarn", "bun", "deno"];
1313

1414
#[derive(Debug, Clone, Parser)]
1515
#[clap(about = "Generate Tauri CLI shell completions for Bash, Zsh, PowerShell or Fish")]
@@ -28,6 +28,10 @@ fn completions_for(shell: Shell, manager: &'static str, cmd: Command) -> Vec<u8>
2828
Command::new(manager)
2929
.bin_name(manager)
3030
.subcommand(Command::new("run").subcommand(tauri))
31+
} else if manager == "deno" {
32+
Command::new(manager)
33+
.bin_name(manager)
34+
.subcommand(Command::new("task").subcommand(tauri))
3135
} else {
3236
Command::new(manager).bin_name(manager).subcommand(tauri)
3337
};
@@ -41,13 +45,15 @@ fn get_completions(shell: Shell, cmd: Command) -> Result<String> {
4145
let completions = if shell == Shell::Bash {
4246
let mut completions =
4347
String::from_utf8_lossy(&completions_for(shell, "cargo", cmd)).into_owned();
44-
for manager in PKG_MANAGERS {
48+
for &manager in PKG_MANAGERS {
4549
completions.push_str(&format!(
4650
"complete -F _cargo -o bashdefault -o default {} tauri\n",
47-
if manager == &"npm" {
51+
if manager == "npm" {
4852
"npm run"
49-
} else if manager == &"bun" {
53+
} else if manager == "bun" {
5054
"bun run"
55+
} else if manager == "deno" {
56+
"deno task"
5157
} else {
5258
manager
5359
}

crates/tauri-cli/src/helpers/npm.rs

Lines changed: 12 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ pub enum PackageManager {
1414
Yarn,
1515
YarnBerry,
1616
Bun,
17+
Deno,
1718
}
1819

1920
impl Display for PackageManager {
@@ -27,53 +28,34 @@ impl Display for PackageManager {
2728
PackageManager::Yarn => "yarn",
2829
PackageManager::YarnBerry => "yarn berry",
2930
PackageManager::Bun => "bun",
31+
PackageManager::Deno => "deno",
3032
}
3133
)
3234
}
3335
}
3436

3537
impl PackageManager {
3638
pub fn from_project<P: AsRef<Path>>(path: P) -> Vec<Self> {
37-
let mut use_npm = false;
38-
let mut use_pnpm = false;
39-
let mut use_yarn = false;
40-
let mut use_bun = false;
39+
let mut found = Vec::new();
4140

4241
if let Ok(entries) = std::fs::read_dir(path) {
4342
for entry in entries.flatten() {
4443
let path = entry.path();
4544
let name = path.file_name().unwrap().to_string_lossy();
4645
if name.as_ref() == "package-lock.json" {
47-
use_npm = true;
46+
found.push(PackageManager::Npm);
4847
} else if name.as_ref() == "pnpm-lock.yaml" {
49-
use_pnpm = true;
48+
found.push(PackageManager::Pnpm);
5049
} else if name.as_ref() == "yarn.lock" {
51-
use_yarn = true;
50+
found.push(PackageManager::Yarn);
5251
} else if name.as_ref() == "bun.lockb" {
53-
use_bun = true;
52+
found.push(PackageManager::Bun);
53+
} else if name.as_ref() == "deno.lock" {
54+
found.push(PackageManager::Deno);
5455
}
5556
}
5657
}
5758

58-
if !use_npm && !use_pnpm && !use_yarn && !use_bun {
59-
return Vec::new();
60-
}
61-
62-
let mut found = Vec::new();
63-
64-
if use_npm {
65-
found.push(PackageManager::Npm);
66-
}
67-
if use_pnpm {
68-
found.push(PackageManager::Pnpm);
69-
}
70-
if use_yarn {
71-
found.push(PackageManager::Yarn);
72-
}
73-
if use_bun {
74-
found.push(PackageManager::Bun);
75-
}
76-
7759
found
7860
}
7961

@@ -84,6 +66,7 @@ impl PackageManager {
8466
PackageManager::Npm => cross_command("npm"),
8567
PackageManager::Pnpm => cross_command("pnpm"),
8668
PackageManager::Bun => cross_command("bun"),
69+
PackageManager::Deno => cross_command("deno"),
8770
}
8871
}
8972

@@ -175,15 +158,6 @@ impl PackageManager {
175158
.output()?,
176159
Some(regex::Regex::new("\"Version\":\"([\\da-zA-Z\\-\\.]+)\"").unwrap()),
177160
),
178-
PackageManager::Npm => (
179-
cross_command("npm")
180-
.arg("list")
181-
.arg(name)
182-
.args(["version", "--depth", "0"])
183-
.current_dir(app_dir)
184-
.output()?,
185-
None,
186-
),
187161
PackageManager::Pnpm => (
188162
cross_command("pnpm")
189163
.arg("list")
@@ -193,8 +167,8 @@ impl PackageManager {
193167
.output()?,
194168
None,
195169
),
196-
// Bun doesn't support `list` command
197-
PackageManager::Bun => (
170+
// Bun and Deno don't support `list` command
171+
PackageManager::Npm | PackageManager::Bun | PackageManager::Deno => (
198172
cross_command("npm")
199173
.arg("list")
200174
.arg(name)

crates/tauri-cli/src/info/env_nodejs.rs

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -62,17 +62,10 @@ pub fn items(metadata: &VersionMetadata) -> Vec<SectionItem> {
6262
.ok()
6363
.unwrap_or_default()
6464
}),
65-
SectionItem::new().action(|| {
66-
manager_version("pnpm")
67-
.map(|v| format!("pnpm: {}", v))
68-
.into()
69-
}),
70-
SectionItem::new().action(|| {
71-
manager_version("yarn")
72-
.map(|v| format!("yarn: {}", v))
73-
.into()
74-
}),
75-
SectionItem::new().action(|| manager_version("npm").map(|v| format!("npm: {}", v)).into()),
76-
SectionItem::new().action(|| manager_version("bun").map(|v| format!("bun: {}", v)).into()),
65+
SectionItem::new().action(|| manager_version("pnpm").map(|v| format!("pnpm: {v}")).into()),
66+
SectionItem::new().action(|| manager_version("yarn").map(|v| format!("yarn: {v}")).into()),
67+
SectionItem::new().action(|| manager_version("npm").map(|v| format!("npm: {v}")).into()),
68+
SectionItem::new().action(|| manager_version("bun").map(|v| format!("bun: {v}")).into()),
69+
SectionItem::new().action(|| manager_version("deno").map(|v| format!("deno: {v}")).into()),
7770
]
7871
}

crates/tauri-cli/src/info/packages_nodejs.rs

Lines changed: 11 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,8 @@ pub fn npm_latest_version(pm: &PackageManager, name: &str) -> crate::Result<Opti
5050
Ok(None)
5151
}
5252
}
53-
PackageManager::Npm => {
53+
// Bun and Deno don't support show command
54+
PackageManager::Npm | PackageManager::Deno | PackageManager::Bun => {
5455
let mut cmd = cross_command("npm");
5556

5657
let output = cmd.arg("show").arg(name).arg("version").output()?;
@@ -72,87 +73,39 @@ pub fn npm_latest_version(pm: &PackageManager, name: &str) -> crate::Result<Opti
7273
Ok(None)
7374
}
7475
}
75-
// Bun doesn't support `info` command
76-
PackageManager::Bun => {
77-
let mut cmd = cross_command("npm");
78-
79-
let output = cmd.arg("show").arg(name).arg("version").output()?;
80-
if output.status.success() {
81-
let stdout = String::from_utf8_lossy(&output.stdout);
82-
Ok(Some(stdout.replace('\n', "")))
83-
} else {
84-
Ok(None)
85-
}
86-
}
8776
}
8877
}
8978

9079
pub fn package_manager(app_dir: &PathBuf) -> PackageManager {
91-
let mut use_npm = false;
92-
let mut use_pnpm = false;
93-
let mut use_yarn = false;
94-
let mut use_bun = false;
95-
96-
for entry in std::fs::read_dir(app_dir)
97-
.unwrap()
98-
.map(|e| e.unwrap().file_name().to_string_lossy().into_owned())
99-
{
100-
match entry.as_str() {
101-
"pnpm-lock.yaml" => use_pnpm = true,
102-
"package-lock.json" => use_npm = true,
103-
"yarn.lock" => use_yarn = true,
104-
"bun.lockb" => use_bun = true,
105-
_ => {}
106-
}
107-
}
80+
let found = PackageManager::from_project(app_dir);
10881

109-
if !use_npm && !use_pnpm && !use_yarn && !use_bun {
82+
if found.is_empty() {
11083
println!(
11184
"{}: no lock files found, defaulting to npm",
11285
"WARNING".yellow()
11386
);
11487
return PackageManager::Npm;
11588
}
11689

117-
let mut found = Vec::new();
118-
119-
if use_npm {
120-
found.push(PackageManager::Npm);
121-
}
122-
if use_pnpm {
123-
found.push(PackageManager::Pnpm);
124-
}
125-
if use_yarn {
126-
found.push(PackageManager::Yarn);
127-
}
128-
if use_bun {
129-
found.push(PackageManager::Bun);
130-
}
90+
let pkg_manager = found[0];
13191

13292
if found.len() > 1 {
133-
let pkg_manger = found[0];
13493
println!(
13594
"{}: Only one package manager should be used, but found {}.\n Please remove unused package manager lock files, will use {} for now!",
13695
"WARNING".yellow(),
13796
found.iter().map(ToString::to_string).collect::<Vec<_>>().join(" and "),
138-
pkg_manger
97+
pkg_manager
13998
);
140-
return pkg_manger;
14199
}
142100

143-
if use_npm {
144-
PackageManager::Npm
145-
} else if use_pnpm {
146-
PackageManager::Pnpm
147-
} else if use_bun {
148-
PackageManager::Bun
149-
} else if manager_version("yarn")
150-
.map(|v| v.chars().next().map(|c| c > '1').unwrap_or_default())
151-
.unwrap_or(false)
101+
if pkg_manager == PackageManager::Yarn
102+
&& manager_version("yarn")
103+
.map(|v| v.chars().next().map(|c| c > '1').unwrap_or_default())
104+
.unwrap_or(false)
152105
{
153106
PackageManager::YarnBerry
154107
} else {
155-
PackageManager::Yarn
108+
pkg_manager
156109
}
157110
}
158111

crates/tauri-cli/src/init.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,7 @@ fn default_dev_command(pm: PackageManager) -> &'static str {
171171
PackageManager::Npm => "npm run dev",
172172
PackageManager::Pnpm => "pnpm dev",
173173
PackageManager::Bun => "bun dev",
174+
PackageManager::Deno => "deno task dev",
174175
}
175176
}
176177

@@ -181,6 +182,7 @@ fn default_build_command(pm: PackageManager) -> &'static str {
181182
PackageManager::Npm => "npm run build",
182183
PackageManager::Pnpm => "pnpm build",
183184
PackageManager::Bun => "bun build",
185+
PackageManager::Deno => "deno task build",
184186
}
185187
}
186188

crates/tauri-cli/src/mobile/init.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,9 @@ pub fn exec(
9090

9191
return (binary, build_args);
9292
}
93+
} else if bin_stem == "deno" {
94+
build_args.insert(0, "task");
95+
return (std::ffi::OsString::from("deno"), build_args);
9396
} else if !cfg!(debug_assertions) && bin_stem == "cargo-tauri" {
9497
return (std::ffi::OsString::from("cargo"), build_args);
9598
}

packages/cli/tauri.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@ const binStem = path.parse(bin).name.toLowerCase()
1414
// can successfully detect what command likely started the execution.
1515
let binName
1616

17-
// deno run -A --unstable --node-modules-dir npm:@tauri-apps/cli
18-
if (bin === '@tauri-apps/cli') {
19-
binName = '@tauri-apps/cli'
17+
// deno run -A npm:@tauri-apps/cli or deno task tauri
18+
if (globalThis.navigator?.userAgent?.includes('Deno')) {
19+
binName = bin
2020
}
2121
// Even if started by a package manager, the binary will be NodeJS.
2222
// Some distribution still use "nodejs" as the binary name.

0 commit comments

Comments
 (0)