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}