mirror of
https://github.com/ivuorinen/nvm-auto-use.fish.git
synced 2026-02-23 22:54:04 +00:00
feat: refactor plugin architecture, enhance linting, CI & tooling
- Major refactor of core Fish functions for modularity, caching, and error handling - Improved `.editorconfig` and Makefile for stricter formatting and linting standards - Expanded linting support: added EditorConfig checks, auto-install for missing tools, and Makefile targets - Enhanced CI workflow with clearer permissions and job steps in GitHub Actions - Updated documentation in `README.md` and `CLAUDE.md` to reflect new features, advanced developer tools, and contribution guidelines - Improved Node.js version manager detection, switching, and installation logic - Added/updated utility functions for configuration, silent mode, notifications, and version extraction - Various bug fixes, code quality improvements, and expanded test coverage
This commit is contained in:
168
functions/nvm_error_recovery.fish
Normal file
168
functions/nvm_error_recovery.fish
Normal file
@@ -0,0 +1,168 @@
|
||||
function nvm_error_recovery -d "Error recovery and graceful degradation"
|
||||
set -l operation $argv[1]
|
||||
set -l error_context $argv[2]
|
||||
|
||||
switch $operation
|
||||
case manager_failure
|
||||
set -l manager $argv[2]
|
||||
set -l target_version $argv[3]
|
||||
|
||||
echo "⚠️ $manager failed to switch to version $target_version" >&2
|
||||
|
||||
# Try fallback managers
|
||||
set -l fallback_managers (nvm_compat_detect | string split ' ')
|
||||
for fallback in $fallback_managers
|
||||
if test "$fallback" != "$manager"
|
||||
echo "🔄 Trying fallback manager: $fallback" >&2
|
||||
if _nvm_error_recovery_try_manager "$fallback" "$target_version"
|
||||
echo "✅ Successfully switched using $fallback" >&2
|
||||
return 0
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
echo "❌ All managers failed. Staying on current version." >&2
|
||||
return 1
|
||||
|
||||
case version_not_found
|
||||
set -l manager $argv[2]
|
||||
set -l requested_version $argv[3]
|
||||
|
||||
echo "⚠️ Version $requested_version not found" >&2
|
||||
|
||||
# Try to find similar versions
|
||||
set -l suggestions (_nvm_error_recovery_suggest_versions "$manager" "$requested_version")
|
||||
if test -n "$suggestions"
|
||||
echo "💡 Available similar versions: $suggestions" >&2
|
||||
|
||||
# Auto-select best match if auto_install is disabled
|
||||
if set -q _nvm_auto_use_no_install
|
||||
set -l best_match (echo "$suggestions" | string split ' ' | head -n 1)
|
||||
echo "🔄 Trying closest match: $best_match" >&2
|
||||
if _nvm_error_recovery_try_manager "$manager" "$best_match"
|
||||
return 0
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return 1
|
||||
|
||||
case network_failure
|
||||
echo "⚠️ Network failure during version operation" >&2
|
||||
|
||||
# Check if we have a cached version list
|
||||
set -l cache_key "versions_$(echo $argv[2] | shasum | cut -d' ' -f1)"
|
||||
if set -l cached_versions (nvm_cache get "$cache_key" 86400) # 24 hour TTL
|
||||
echo "📦 Using cached version information" >&2
|
||||
echo "$cached_versions"
|
||||
return 0
|
||||
end
|
||||
|
||||
echo "❌ No cached version information available" >&2
|
||||
return 1
|
||||
|
||||
case permission_denied
|
||||
set -l operation_type $argv[2]
|
||||
echo "⚠️ Permission denied for $operation_type" >&2
|
||||
|
||||
switch $operation_type
|
||||
case install
|
||||
echo "💡 Try running with appropriate permissions or check manager configuration" >&2
|
||||
case switch
|
||||
echo "💡 Check if the version is already installed or try with sudo" >&2
|
||||
end
|
||||
|
||||
return 1
|
||||
|
||||
case timeout
|
||||
set -l operation_type $argv[2]
|
||||
set -l timeout_duration $argv[3]
|
||||
|
||||
echo "⏱️ Operation '$operation_type' timed out after $timeout_duration seconds" >&2
|
||||
echo "💡 Consider checking network connection or increasing timeout" >&2
|
||||
|
||||
# Kill any hanging processes
|
||||
nvm_async cleanup
|
||||
return 1
|
||||
|
||||
case corruption
|
||||
set -l file_path $argv[2]
|
||||
echo "⚠️ Corrupted file detected: $file_path" >&2
|
||||
|
||||
# Try to recover from backup or regenerate
|
||||
if test -f "$file_path.backup"
|
||||
echo "🔄 Restoring from backup" >&2
|
||||
cp "$file_path.backup" "$file_path"
|
||||
return 0
|
||||
end
|
||||
|
||||
echo "❌ No backup available, manual intervention required" >&2
|
||||
return 1
|
||||
|
||||
case '*'
|
||||
echo "Unknown error recovery operation: $operation" >&2
|
||||
return 1
|
||||
end
|
||||
end
|
||||
|
||||
function _nvm_error_recovery_try_manager -d "Try using a specific manager"
|
||||
set -l manager $argv[1]
|
||||
set -l version $argv[2]
|
||||
|
||||
if not command -q "$manager"
|
||||
return 1
|
||||
end
|
||||
|
||||
switch $manager
|
||||
case nvm
|
||||
nvm use "$version" 2>/dev/null
|
||||
case fnm
|
||||
fnm use "$version" 2>/dev/null
|
||||
case volta
|
||||
volta pin "node@$version" 2>/dev/null
|
||||
case asdf
|
||||
asdf local nodejs "$version" 2>/dev/null
|
||||
case '*'
|
||||
return 1
|
||||
end
|
||||
end
|
||||
|
||||
function _nvm_error_recovery_suggest_versions -d "Suggest similar available versions"
|
||||
set -l manager $argv[1]
|
||||
set -l requested $argv[2]
|
||||
|
||||
# Extract major version for suggestions
|
||||
set -l major (echo "$requested" | string replace -r '^v?([0-9]+).*' '$1')
|
||||
|
||||
# Try to get available versions (with error handling)
|
||||
set -l available_versions
|
||||
switch $manager
|
||||
case nvm
|
||||
set available_versions (nvm list-remote 2>/dev/null | grep "^v$major\." | head -n 5)
|
||||
case fnm
|
||||
set available_versions (fnm list-remote 2>/dev/null | grep "^v$major\." | head -n 5)
|
||||
case asdf
|
||||
set available_versions (asdf list-all nodejs 2>/dev/null | grep "^$major\." | head -n 5)
|
||||
end
|
||||
|
||||
echo "$available_versions" | string join ' '
|
||||
end
|
||||
|
||||
function _nvm_error_recovery_log -d "Log error for debugging"
|
||||
set -l error_type $argv[1]
|
||||
set -l details $argv[2]
|
||||
|
||||
# Log to XDG cache directory
|
||||
set -l log_dir
|
||||
if set -q XDG_CACHE_HOME
|
||||
set log_dir "$XDG_CACHE_HOME/nvm-auto-use"
|
||||
else
|
||||
set log_dir "$HOME/.cache/nvm-auto-use"
|
||||
end
|
||||
|
||||
mkdir -p "$log_dir" 2>/dev/null
|
||||
set -l log_file "$log_dir/error.log"
|
||||
|
||||
set -l timestamp (date '+%Y-%m-%d %H:%M:%S')
|
||||
echo "[$timestamp] $error_type: $details" >>"$log_file"
|
||||
end
|
||||
Reference in New Issue
Block a user