Repository navigation
Expand file tree
/
Copy pathnode.sh
More file actions
86 lines (75 loc) · 2.25 KB
/
Copy pathnode.sh
File metadata and controls
86 lines (75 loc) · 2.25 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
# 1. Clean removal of old file
sudo rm -f /usr/local/bin/node
# 2. Fresh write
sudo tee /usr/local/bin/node > /dev/null << 'EOF'
#!/bin/bash
# Setup paths
REAL_USER="${SUDO_USER:-$USER}"
USER_HOME=$(eval echo ~"$REAL_USER")
BUN_PATH="$USER_HOME/.bun/bin/bun"
CACHE_FILE="$USER_HOME/.node_version_cache"
# Function to fetch versions from internet
fetch_from_internet() {
local data=$(curl -s --connect-timeout 3 --max-time 10 https://nodejs.org/dist/index.json 2>/dev/null)
if [ -n "$data" ]; then
I_LATEST=$(echo "$data" | grep -m1 '"version"' | cut -d'"' -f4)
I_LTS=$(echo "$data" | grep -B1 '"lts"' | grep '"version"' | head -1 | cut -d'"' -f4)
fi
}
# Function to update cache file
update_cache() {
if [ -n "$I_LATEST" ] && [ -n "$I_LTS" ]; then
printf "%s\n%s\n" "$I_LATEST" "$I_LTS" > "$CACHE_FILE"
fi
}
# Logic to decide if update is needed
SHOULD_UPDATE=0
if [ ! -f "$CACHE_FILE" ]; then
SHOULD_UPDATE=1
else
NOW=$(date +%s)
MOD=$(stat -c %Y "$CACHE_FILE" 2>/dev/null || echo 0)
AGE=$(( NOW - MOD ))
if [ "$AGE" -gt 90000 ]; then SHOULD_UPDATE=1; fi
fi
# Try to get Internet versions
I_LATEST=""
I_LTS=""
if [ "$SHOULD_UPDATE" -eq 1 ]; then
fetch_from_internet
update_cache >/dev/null 2>&1 &
fi
# Read from cache
C_LATEST=""
C_LTS=""
if [ -f "$CACHE_FILE" ]; then
C_LATEST=$(sed -n '1p' "$CACHE_FILE" 2>/dev/null)
C_LTS=$(sed -n '2p' "$CACHE_FILE" 2>/dev/null)
fi
# --- NEW FALLBACK: Get Bun's internal Node version ---
BUN_INTERNAL_VER=$("$BUN_PATH" -e "console.log(process.version)" 2>/dev/null)
# --- THE PRIORITY FALLBACK CHAIN ---
# a. Internet Latest -> b. Internet LTS -> c. Cached Latest -> d. Cached LTS -> e. Bun process.version
RAW_VER="${I_LATEST:-${I_LTS:-${C_LATEST:-${C_LTS:-$BUN_INTERNAL_VER}}}}"
CLEAN_VER=$(echo "$RAW_VER" | tr -d '[:space:]' | sed 's/date//g')
# Handle arguments
case "$1" in
-v|--version)
echo "$CLEAN_VER"
exit 0
;;
--lts-version)
LTS_RAW="${I_LTS:-${C_LTS:-$BUN_INTERNAL_VER}}"
echo "$LTS_RAW" | tr -d '[:space:]' | sed 's/date//g'
exit 0
;;
"")
exec "$BUN_PATH"
;;
*)
exec "$BUN_PATH" "$@"
;;
esac
EOF
# 3. Restore permissions
sudo chmod +x /usr/local/bin/node