Merge _configs/ into config/ for single configuration directory. Update all path references. Changes: - Move _configs/* to config/ - Update .gitignore for new patterns - No code references to _configs/ found Impact: -1 root directory (layout_conventions.md compliance)
363 lines
11 KiB
Plaintext
363 lines
11 KiB
Plaintext
#!/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
|
||
}
|
||
}
|