syntaxis/scripts/core/build-dashboard.nu
Jesús Pérez 9cef9b8d57 refactor: consolidate configuration directories
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)
2025-12-26 18:36:23 +00:00

363 lines
11 KiB
Plaintext
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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
}
}