syntaxis/scripts/core/build-dashboard.nu

363 lines
11 KiB
Plaintext
Raw Normal View History

#!/usr/bin/env nu
# Build script for syntaxis Leptos WASM dashboard
#
# USAGE:
# build-dashboard.nu check-install # Check if prerequisites are installed
# build-dashboard.nu install # Install missing prerequisites
# build-dashboard.nu build # Build dashboard release
# build-dashboard.nu build --dev # Build dashboard (dev/debug mode)
#
# This script handles:
# 1. Checking prerequisites (wasm32 target, wasm-bindgen-cli, trunk, pnpm)
# 2. Installing missing tools if requested
# 3. Building WASM artifacts with Trunk
# 4. Ensuring output structure is correct (pkg/, styles/, index.html)
use std log
def check_command [cmd: string] {
# Check if a command is available in PATH
try {
which $cmd | is-not-empty
true
} catch {
false
}
}
def check_rustup_target [target: string] {
# Check if a rustup target is installed
try {
rustup target list | grep -q $target
true
} catch {
false
}
}
def print_header [title: string] {
print ""
print "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
print $"🎨 ($title)"
print "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
print ""
}
def print_section [title: string] {
print $" 📌 ($title)"
}
def print_success [msg: string] {
print $" ✅ ($msg)"
}
def print_info [msg: string] {
print $" ($msg)"
}
def print_warning [msg: string] {
print $" ⚠️ ($msg)"
}
def print_error [msg: string] {
print $" ❌ ($msg)"
}
def check_prerequisites [] {
# Check if all required tools are installed
print_header "Checking Prerequisites"
mut all_ok = true
# Check wasm32 target
print_section "Rust WASM Target (wasm32-unknown-unknown)"
if (check_rustup_target "wasm32-unknown-unknown") {
print_success "wasm32-unknown-unknown target installed"
} else {
print_warning "wasm32-unknown-unknown target NOT installed"
all_ok = false
}
# Check wasm-bindgen-cli
print_section "wasm-bindgen-cli"
if (check_command "wasm-bindgen") {
let version = (wasm-bindgen --version | str trim)
print_success $"($version) found"
} else {
print_warning "wasm-bindgen-cli NOT installed"
all_ok = false
}
# Check trunk
print_section "trunk (Leptos build tool)"
if (check_command "trunk") {
let version = (trunk --version | str trim)
print_success $"($version) found"
} else {
print_warning "trunk NOT installed"
all_ok = false
}
# Check pnpm
print_section "pnpm (Package manager for UnoCSS)"
if (check_command "pnpm") {
let version = (pnpm --version | str trim)
print_success $"pnpm ($version) found"
} else {
print_warning "pnpm NOT installed"
all_ok = false
}
# Check current directory
print_section "Project structure"
if ("Trunk.toml" | path exists) {
print_success "Trunk.toml found"
} else {
print_warning "Trunk.toml NOT found (should be in core/)"
all_ok = false
}
if ("index.html" | path exists) {
print_success "index.html found"
} else {
print_warning "index.html NOT found (should be in core/)"
all_ok = false
}
if ("package.json" | path exists) {
print_success "package.json found"
} else {
print_warning "package.json NOT found (should be in core/)"
all_ok = false
}
print ""
if $all_ok {
print "✅ All prerequisites are installed and ready!"
print ""
return 0
} else {
print "❌ Some prerequisites are missing."
print " Run: build-dashboard.nu install"
print ""
return 1
}
}
def install_prerequisites [] {
# Install missing prerequisites
print_header "Installing Prerequisites"
# Install wasm32 target if missing
if not (check_rustup_target "wasm32-unknown-unknown") {
print_section "Installing wasm32-unknown-unknown target..."
try {
rustup target add wasm32-unknown-unknown
print_success "wasm32-unknown-unknown target installed"
} catch { |err|
print_error $"Failed to install wasm32 target: ($err)"
return 1
}
}
# Install wasm-bindgen-cli if missing
if not (check_command "wasm-bindgen") {
print_section "Installing wasm-bindgen-cli..."
try {
cargo install wasm-bindgen-cli
print_success "wasm-bindgen-cli installed"
} catch { |err|
print_error $"Failed to install wasm-bindgen-cli: ($err)"
return 1
}
}
# Install trunk if missing
if not (check_command "trunk") {
print_section "Installing trunk..."
try {
cargo install trunk
print_success "trunk installed"
} catch { |err|
print_error $"Failed to install trunk: ($err)"
return 1
}
}
# Install pnpm if missing
if not (check_command "pnpm") {
print_section "Installing pnpm..."
try {
npm install -g pnpm
print_success "pnpm installed"
} catch { |err|
print_warning $"Failed to install pnpm globally: ($err)"
print_info "Trying to install via cargo..."
try {
cargo install pnpm
print_success "pnpm installed via cargo"
} catch { |err2|
print_error $"Failed to install pnpm: ($err2)"
return 1
}
}
}
print ""
print "✅ Prerequisites installation complete!"
print ""
return 0
}
def build_dashboard [dev_mode: bool] {
# Build Leptos WASM dashboard with Trunk
print_header "Building Dashboard WASM"
# Check prerequisites first
if (check_prerequisites) != 0 {
print_error "Prerequisites check failed"
return 1
}
# pnpm install in core directory
print_section "Installing pnpm dependencies..."
try {
if ("node_modules" | path exists) == false {
pnpm install
print_success "Dependencies installed"
} else {
print_info "Dependencies already installed"
}
} catch { |err|
print_warning $"Failed to run pnpm install: ($err)"
# Continue anyway - pnpm might not be needed if node_modules exists
}
# Build UnoCSS (generates app.css from Rust/HTML)
print_section "Building CSS with UnoCSS..."
try {
pnpm css:build
print_success "CSS generated"
} catch { |err|
print_error $"CSS build failed: ($err)"
return 1
}
# Build WASM with Trunk
print_section "Building WASM with Trunk..."
try {
if $dev_mode {
print_info "Building in dev mode (unoptimized)"
trunk build
} else {
print_info "Building in release mode (optimized)"
trunk build --release
}
print_success "WASM build completed"
} catch { |err|
print_error $"WASM build failed: ($err)"
print_info "Make sure you're running this from the core/ directory"
return 1
}
# Verify build output
print_section "Verifying build artifacts..."
mut all_ok = true
if ("target/site/index.html" | path exists) {
print_success "index.html exists"
} else {
print_error "index.html NOT found in target/site/"
all_ok = false
}
if ("target/site/pkg" | path exists) {
let files = (glob "target/site/pkg/**/*" | length)
print_success $"WASM artifacts generated ($files files)"
} else {
print_error "pkg/ directory NOT found in target/site/"
all_ok = false
}
if ("target/site/styles/app.css" | path exists) {
let size = (stat "target/site/styles/app.css" | get size)
print_success $"CSS generated ($(($size | math) / 1024 | math round --precision 2)KB)"
} else {
print_error "app.css NOT found in target/site/styles/"
all_ok = false
}
print ""
if $all_ok {
print "✅ Dashboard build successful!"
print ""
print "📂 Build output: core/target/site/"
print " - index.html: Dashboard entry point"
print " - pkg/: WASM artifacts (*.wasm, *.js)"
print " - styles/app.css: Generated styles"
print ""
print "🚀 Next steps:"
print " - Run: just dev-dashboard (starts Trunk dev server on port 8080)"
print " - Or: just run-api-with-dashboard (serves dashboard from API on port 3000)"
print ""
return 0
} else {
print_error "Build verification failed"
return 1
}
}
def show_help [] {
print ""
print "🎨 syntaxis Dashboard Build Script"
print ""
print "USAGE:"
print " build-dashboard.nu check-install # Check if prerequisites installed"
print " build-dashboard.nu install # Install missing prerequisites"
print " build-dashboard.nu build # Build dashboard (release mode)"
print " build-dashboard.nu build --dev # Build dashboard (dev mode)"
print " build-dashboard.nu help # Show this help"
print ""
print "PREREQUISITES:"
print " - Rust toolchain with wasm32-unknown-unknown target"
print " - wasm-bindgen-cli (for WASM JS bindings)"
print " - trunk (Leptos build system)"
print " - pnpm (for UnoCSS CSS generation)"
print ""
print "EXAMPLES:"
print " # Check if ready to build"
print " cd core && build-dashboard.nu check-install"
print ""
print " # Install any missing tools"
print " cd core && build-dashboard.nu install"
print ""
print " # Build release version"
print " cd core && build-dashboard.nu build"
print ""
print " # Build debug version"
print " cd core && build-dashboard.nu build --dev"
print ""
}
def main [
action?: string # Action: "check-install", "install", "build", "help"
--dev # Dev mode for build (unoptimized)
] {
let action = ($action | default "help")
if $action == "check-install" or $action == "check" {
exit (check_prerequisites)
} else if $action == "install" {
exit (install_prerequisites)
} else if $action == "build" {
exit (build_dashboard $dev)
} else if $action == "help" {
show_help
} else {
print_error $"Unknown action: ($action)"
show_help
exit 1
}
}