Skip to main content

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}