Compile Command
The utah compile command transpiles Utah (.shx) source files into bash (.sh) scripts. This is the core functionality of Utah, converting TypeScript-like syntax into clean, executable bash code.
Basic Usage
utah compile <file.shx> [-o, --output <output.sh>]
Examples
Simple Compilation
utah compile script.shx
This creates script.sh in the same directory.
Custom Output File
utah compile script.shx -o /path/to/custom.sh
utah compile script.shx --output /path/to/custom.sh
Both commands create the specified output file. You can use either -o or --output.
Batch Compilation
# Compile all .shx files in current directory
for file in *.shx; do
  utah compile "$file"
done
How It Works
1. Import Resolution
Utah automatically resolves and includes imported files:
main.shx:
import "utils/helpers.shx";
import "config/database.shx";
let connectionString: string = getDatabaseUrl();
utils/helpers.shx:
function getDatabaseUrl(): string {
  return "localhost:5432";
}
When compiling main.shx, Utah:
- Reads the main file
 - Finds import statements
 - Recursively loads imported files
 - Combines everything into a single AST
 - Compiles to bash
 
2. AST Generation
Utah parses the source into an Abstract Syntax Tree:
- Variable declarations become bash variable assignments
 - Function declarations become bash functions
 - Control structures become bash equivalents
 - Type information is used for validation but not output
 
3. Bash Code Generation
The compiler generates clean, readable bash:
Input (.shx):
let name: string = "Utah";
let count: number = 42;
function greet(user: string): void {
  console.log("Hello, ${user}!");
}
greet(name);
Output (.sh):
#!/bin/bash
name="Utah"
count=42
greet() {
  local user="$1"
  echo "Hello, ${user}!"
}
greet "${name}"
Error Handling
Syntax Errors
Utah provides detailed error messages with line numbers:
utah compile broken.shx
❌ Compilation failed: Syntax error at line 5: Expected ';' after variable declaration
Import Errors
utah compile main.shx
❌ Compilation failed: Import file not found: utils/missing.shx
Type Errors
utah compile typed.shx
❌ Compilation failed: Type mismatch at line 8: Cannot assign number to string variable
Advanced Features
Circular Import Detection
Utah detects and prevents circular imports:
file1.shx:
import "file2.shx";
file2.shx:
import "file1.shx";  // Circular import
utah compile file1.shx
❌ Compilation failed: Circular import detected: file1.shx -> file2.shx -> file1.shx
Relative Import Paths
Import paths are resolved relative to the importing file:
project/
├── main.shx
├── utils/
│   ├── helpers.shx
│   └── math/
│       └── calculator.shx
main.shx:
import "utils/helpers.shx";
utils/helpers.shx:
import "math/calculator.shx";  // Relative to utils/
Generated Code Structure
The compiled bash always includes:
- Shebang: 
#!/bin/bash - Error handling: 
set -ewhen try/catch is used - Variable declarations: With proper scoping
 - Function definitions: Before their usage
 - Main execution: Script logic
 
Performance
Compilation Speed
| File Size | Typical Time | Imports | Memory Usage | 
|---|---|---|---|
| < 100 lines | < 100ms | 0-5 | 10MB | 
| 100-500 lines | < 300ms | 5-20 | 25MB | 
| 500-1000 lines | < 500ms | 20-50 | 50MB | 
| 1000+ lines | < 2s | 50+ | 100MB | 
Optimization Tips
- Minimize imports: Only import what you need
 - Avoid deep nesting: Keep import chains shallow
 - Use specific paths: Absolute paths are faster than relative
 - Cache results: Only recompile when source changes
 
Integration Examples
Makefile Integration
# Makefile
SOURCES := $(wildcard src/*.shx)
TARGETS := $(SOURCES:src/%.shx=dist/%.sh)
all: $(TARGETS)
dist/%.sh: src/%.shx
  utah compile $< -o $@
clean:
  rm -f dist/*.sh
.PHONY: all clean
Build Script
#!/bin/bash
# build.sh - Build all Utah scripts
set -e
echo "Building Utah scripts..."
# Create output directory
mkdir -p dist
# Compile all source files
for file in src/*.shx; do
  if [ -f "$file" ]; then
    basename=$(basename "$file" .shx)
    echo "Compiling $file..."
    if utah compile "$file" -o "dist/$basename.sh"; then
      echo "✅ $basename.sh"
      chmod +x "dist/$basename.sh"
    else
      echo "❌ Failed to compile $file"
      exit 1
    fi
  fi
done
echo "Build completed successfully!"
echo "Compiled scripts are in the dist/ directory"
Watch Script
#!/bin/bash
# watch.sh - Auto-compile on file changes
if ! command -v inotifywait >/dev/null; then
  echo "Please install inotify-tools: sudo apt install inotify-tools"
  exit 1
fi
echo "Watching for changes in src/*.shx..."
while inotifywait -e modify,create src/*.shx; do
  echo "Changes detected, recompiling..."
  ./build.sh
done
Troubleshooting
Common Issues
- 
Issue: Compilation hangs Cause: Circular imports or very large files Solution: Check import structure, break cycles
 - 
Issue: Generated bash has syntax errors Cause: Utah compiler bug or unsupported syntax Solution: Report issue with minimal reproduction case
 - 
Issue: Import not found Cause: Incorrect path or missing file Solution: Verify paths are relative to importing file
 
Validation
Verify compiled output:
# Compile and check syntax
utah compile script.shx
bash -n script.sh  # Check syntax without running
# Compile and test
utah compile script.shx
bash script.sh     # Run the compiled script
Best Practices
1. Organize Imports
// Good: Group imports logically
import "config/database.shx";
import "config/logging.shx";
import "utils/string-helpers.shx";
import "utils/file-helpers.shx";
// Avoid: Mixed imports
import "database.shx";
import "string-helpers.shx";
import "logging.shx";
2. Use Descriptive Output Names
# Good: Descriptive names
utah compile backup-script.shx -o bin/backup-database.sh
utah compile deploy.shx --output scripts/deploy-production.sh
# Avoid: Generic names
utah compile backup-script.shx -o script.sh
utah compile deploy.shx --output output.sh
3. Validate After Compilation
utah compile script.shx
bash -n script.sh  # Syntax check
shellcheck script.sh  # Static analysis (if available)
4. Handle Errors Gracefully
if utah compile script.shx; then
  echo "Compilation successful"
  chmod +x script.sh
else
  echo "Compilation failed"
  exit 1
fi
The compile command is the foundation of Utah's functionality, providing robust transpilation from TypeScript-like syntax to efficient bash scripts.