Mountain/ProcessManagement/NodeResolver/TryShipped.rs
1
2//! Bundled Node lookup. Production: Tauri ships Node under
3//! `Resources/Node/bin/node` (`Resources/Node/node.exe` on Windows). Dev:
4//! same layout next to the executable so the dev build dogfoods the same
5//! resolution path.
6
7use tauri::{AppHandle, Manager, Runtime, path::BaseDirectory};
8
9use crate::ProcessManagement::NodeResolver::{NodeSource, ResolvedNode};
10
11pub fn Fn<R:Runtime>(ApplicationHandle:&AppHandle<R>) -> Option<ResolvedNode::Struct> {
12 let RelativeToResource = if cfg!(target_os = "windows") { "Node/node.exe" } else { "Node/bin/node" };
13
14 if let Ok(Resolved) = ApplicationHandle.path().resolve(RelativeToResource, BaseDirectory::Resource) {
15 if Resolved.exists() {
16 return Some(ResolvedNode::Struct { Path:Resolved, Source:NodeSource::Enum::Shipped });
17 }
18 }
19
20 let ExecutablePath = std::env::current_exe().ok()?;
21
22 let ExecutableDirectory = ExecutablePath.parent()?;
23
24 let SiblingNode = ExecutableDirectory.join(RelativeToResource);
25
26 if SiblingNode.exists() {
27 return Some(ResolvedNode::Struct { Path:SiblingNode, Source:NodeSource::Enum::Shipped });
28 }
29
30 // Tauri externalBin sidecar layout: the binary is placed directly next to
31 // the main executable as `node` (not in a `Node/bin/` subdirectory).
32 // Matches `externalBin: ["Binary/node"]` in tauri.conf.json.
33 let SidecarName = if cfg!(target_os = "windows") { "node.exe" } else { "node" };
34
35 let SidecarNode = ExecutableDirectory.join(SidecarName);
36
37 if SidecarNode.exists() {
38 return Some(ResolvedNode::Struct { Path:SidecarNode, Source:NodeSource::Enum::Shipped });
39 }
40
41 None
42}