website-htmx-rustelo-code/scripts/build/validate-environment.nu
2026-07-10 03:44:13 +01:00

179 lines
No EOL
4.9 KiB
Text

#!/usr/bin/env nu
# Environment Validation Script for Rustelo Project
# Validates .env loading, required variables, and development prerequisites
use ../content/lib/env.nu *
def main [
--strict # Fail on warnings (not just errors)
--path: string = "." # Path to project root
] {
print "🔍 Validating development environment..."
mut issues = []
# Validate .env file and loading
let issues = ($issues | append (check_env_file $path))
# Validate required environment variables
let issues = ($issues | append (check_required_env_vars))
# Validate development tools
let issues = ($issues | append (check_dev_tools))
# Validate project structure
let issues = ($issues | append (check_project_structure $path))
# Display results
if ($issues | is-empty) {
print "✅ Environment validation passed!"
return 0
} else {
print "❌ Environment validation issues found:"
for $issue in $issues {
print $" ($issue.severity): ($issue.message)"
if ($issue.fix?) {
print $" Fix: ($issue.fix)"
}
}
let errors = ($issues | where severity == "ERROR")
if not ($errors | is-empty) {
return 1
} else if $strict {
return 1
} else {
return 0
}
}
}
# Check .env file exists and can be loaded
def check_env_file [path: string] {
mut issues = []
let env_file = $"($path)/.env"
if not ($env_file | path exists) {
$issues = ($issues | append {
severity: "ERROR"
message: ".env file not found"
fix: "Create .env file from .env.example"
})
return $issues
}
# Try to load .env file
let load_result = try {
load_env_from_file
"success"
} catch {
"failed"
}
if $load_result == "success" {
print $"(ansi green)✅ .env file loaded successfully(ansi reset)"
} else {
$issues = ($issues | append {
severity: "ERROR"
message: ".env file exists but cannot be loaded"
fix: "Check .env file syntax"
})
}
$issues
}
# Check required environment variables
def check_required_env_vars [] {
mut issues = []
let required_vars = [
"SITE_CONTENT_PATH"
"SITE_SERVER_CONTENT_URL"
]
for $var in $required_vars {
if not ($var in $env) {
$issues = ($issues | append {
severity: "WARNING"
message: $"Required environment variable ($var) not set"
fix: $"Set ($var) in .env file"
})
} else {
print $"(ansi green)✅ ($var) = ($env | get $var)(ansi reset)"
}
}
$issues
}
# Check development tools availability
def check_dev_tools [] {
mut issues = []
let required_tools = [
{name: "cargo", command: "cargo", required: true}
{name: "npm", command: "npm", required: true}
{name: "nu", command: "nu", required: true}
{name: "just", command: "just", required: true}
{name: "rg", command: "rg", required: false}
]
for $tool in $required_tools {
if (which $tool.command | is-empty) {
let severity = if $tool.required { "ERROR" } else { "WARNING" }
$issues = ($issues | append {
severity: $severity
message: $"Tool ($tool.name) not found in PATH"
fix: $"Install ($tool.name)"
})
} else {
print $"(ansi green)✅ ($tool.name) available(ansi reset)"
}
}
$issues
}
# Check project structure
def check_project_structure [path: string] {
mut issues = []
let required_dirs = [
"crates"
"scripts"
"just"
"site/public"
]
for $dir in $required_dirs {
let dir_path = $"($path)/($dir)"
if not ($dir_path | path exists) {
$issues = ($issues | append {
severity: "ERROR"
message: $"Required directory ($dir) not found"
fix: $"Ensure project structure is correct"
})
} else {
print $"(ansi green)✅ Directory ($dir) exists(ansi reset)"
}
}
# Check content path
let content_path = get_env_var "SITE_CONTENT_PATH" "site/content"
let full_content_path = $"($path)/($content_path)"
if not ($full_content_path | path exists) {
$issues = ($issues | append {
severity: "WARNING"
message: $"Content directory ($content_path) not found"
fix: $"Create content directory or update SITE_CONTENT_PATH"
})
} else {
print $"(ansi green)✅ Content directory ($content_path) exists(ansi reset)"
}
$issues
}