Skip to main content

DevelopmentNodeEnvironment_MicrosoftVSCodeDependency_22NodeVersion_Bundle_Clean_Debug_ElectronProfile_EsbuildCompiler_Mountain/ProcessManagement/NodeResolver/
TryShipped.rs

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