<!--
SPDX-FileCopyrightText: 2025 Torkild G. Kjevik
SPDX-FileCopyrightText: 2025 ash_typescript contributors <https://github.com/ash-project/ash_typescript/graphs.contributors>
SPDX-License-Identifier: MIT
-->
# Mix Tasks Reference
This document provides a comprehensive reference for all AshTypescript Mix tasks.
## Installation Commands
### `mix igniter.install ash_typescript`
**Automated installer** that sets up everything you need to get started with AshTypescript.
#### Usage
```bash
# Basic installation (RPC setup only)
mix igniter.install ash_typescript
# Full-stack React + TypeScript setup
mix igniter.install ash_typescript --framework react
```
#### What It Does
The installer performs the following tasks:
1. **Dependency Setup**
- Adds AshTypescript to your `mix.exs` dependencies
- Runs `mix deps.get` to install the package
2. **Configuration**
- Configures AshTypescript settings in `config/config.exs`
- Sets default output paths and RPC endpoints
3. **RPC Controller**
- Creates RPC controller at `lib/*_web/controllers/ash_typescript_rpc_controller.ex`
- Implements handlers for run and validate endpoints
4. **Phoenix Router**
- Adds RPC routes to your Phoenix router
- Configures `/rpc/run` and `/rpc/validate` endpoints
5. **React Setup** (with `--framework react`)
- Sets up complete React + TypeScript environment
- Configures esbuild or vite for frontend builds
- Creates welcome page with getting started guide
- Installs necessary npm packages
#### Options
| Option | Description |
|--------|-------------|
| `--framework react` | Set up React + TypeScript environment |
#### When to Use
- ✅ New projects starting with AshTypescript
- ✅ Adding AshTypescript to existing Phoenix projects
- ✅ Setting up frontend with React integration
- ❌ Projects that already have AshTypescript installed
**This is the recommended approach for initial setup.**
## Code Generation Commands
### `mix ash.codegen`
**Recommended approach** for most projects. This command runs code generation for all Ash extensions in your project, including AshTypescript.
```bash
# Generate types for all Ash extensions including AshTypescript
mix ash.codegen --dev
```
For detailed information about `mix ash.codegen`, see the [Ash documentation](https://hexdocs.pm/ash/Mix.Tasks.Ash.Codegen.html).
### `mix ash_typescript.codegen`
Generate TypeScript types, RPC clients, Zod schemas, and validation functions **only for AshTypescript**.
#### Usage
```bash
# Basic generation (AshTypescript only)
mix ash_typescript.codegen
# Custom output location
mix ash_typescript.codegen --output "frontend/src/api/ash.ts"
# Custom RPC endpoints
mix ash_typescript.codegen \
--run_endpoint "/api/rpc/run" \
--validate_endpoint "/api/rpc/validate"
# Check if generated code is up to date (CI usage)
mix ash_typescript.codegen --check
# Preview generated code without writing to file
mix ash_typescript.codegen --dry_run
```
#### Options
| Option | Type | Default | Description |
|--------|------|---------|-------------|
| `--output FILE` | `string` | `assets/js/ash_rpc.ts` | Output file path for generated TypeScript |
| `--run_endpoint PATH` | `string` | `/rpc/run` | RPC run endpoint path |
| `--validate_endpoint PATH` | `string` | `/rpc/validate` | RPC validate endpoint path |
| `--check` | `boolean` | `false` | Check if generated code is up to date (exit 1 if not) |
| `--dry_run` | `boolean` | `false` | Print generated code to stdout without writing file |
#### Generated Content
When run, this task generates:
1. **TypeScript Interfaces**
- Resource types with field metadata
- Schema types for field selection
- Result types for each action
2. **RPC Client Functions**
- HTTP-based RPC functions for each action
- Channel-based RPC functions (if enabled)
- Type-safe configuration objects
3. **Filter Input Types**
- Comprehensive filter operators
- Type-safe query building
- Nested relationship filtering
4. **Zod Validation Schemas** (if enabled)
- Runtime type validation
- Schema for each resource
- Nested validation support
5. **Form Validation Functions**
- Client-side validation helpers
- Error message handling
- Field-level validation
6. **Typed Query Constants**
- Pre-configured field selections
- SSR-optimized types
- Type-safe result extraction
7. **Custom Type Imports**
- Imports for custom types
- Integration with external types
- Type mapping support
#### Examples
**Basic Generation:**
```bash
mix ash_typescript.codegen
```
**Custom Output Location:**
```bash
mix ash_typescript.codegen --output "frontend/src/api/ash.ts"
```
**Custom RPC Endpoints:**
```bash
mix ash_typescript.codegen \
--run_endpoint "/api/rpc/run" \
--validate_endpoint "/api/rpc/validate"
```
**CI Check:**
```bash
# In CI pipeline - fails if generated code is out of date
mix ash_typescript.codegen --check
```
**Preview Without Writing:**
```bash
# See what would be generated
mix ash_typescript.codegen --dry_run | less
```
#### When to Use
- ✅ Want to run codegen specifically for AshTypescript
- ✅ Need custom output paths or endpoints
- ✅ Debugging generated TypeScript code
- ✅ CI/CD pipelines with `--check` flag
- ❌ Have other Ash extensions that need codegen (use `mix ash.codegen`)
## Test Environment Code Generation
For projects using test-only resources (common in library development), use the test environment:
```bash
# Generate types in test environment
MIX_ENV=test mix ash_typescript.codegen
# Or use the test.codegen alias (if defined)
mix test.codegen
```
### Setting Up Test Codegen Alias
Add to your `mix.exs`:
```elixir
defp aliases do
[
"test.codegen": ["cmd MIX_ENV=test mix ash_typescript.codegen"],
# ... other aliases
]
end
```
## Workflow Integration
### Development Workflow
```bash
# 1. Make changes to resources or domain configuration
vim lib/my_app/resources/todo.ex
# 2. Generate TypeScript types
mix ash.codegen --dev
# 3. Verify TypeScript compilation (in frontend directory)
cd assets && npm run typecheck
# 4. Run tests
mix test
```
### CI/CD Workflow
```bash
# In your CI pipeline (.github/workflows/ci.yml, etc.)
# Check generated code is up to date
mix ash_typescript.codegen --check
# If out of date, CI fails with:
# "Generated TypeScript code is out of date. Run: mix ash_typescript.codegen"
```
**Example GitHub Actions:**
```yaml
- name: Check TypeScript codegen
run: mix ash_typescript.codegen --check
- name: Type check generated code
run: |
cd assets
npm run typecheck
```
### Pre-commit Hook
Add to `.git/hooks/pre-commit`:
```bash
#!/bin/bash
# Regenerate TypeScript on commit
mix ash_typescript.codegen --check || {
echo "TypeScript code out of date. Regenerating..."
mix ash_typescript.codegen
git add assets/js/ash_rpc.ts
}
```
## Troubleshooting
### Common Issues
#### "No domains found"
**Problem:** Command runs but generates empty output or reports no domains.
**Solution:** Ensure you're in the correct MIX_ENV:
```bash
# Wrong - uses dev environment
mix ash_typescript.codegen
# Correct - uses test environment for test resources
MIX_ENV=test mix ash_typescript.codegen
```
#### Generated code doesn't compile
**Problem:** TypeScript compilation fails after generation.
**Solution:** Check for:
1. Invalid field names (use field name mapping)
2. Custom types not defined in imported modules
3. Missing type mapping overrides for dependency types
See [Configuration Reference](configuration.md) for field name mapping and type overrides.
#### Changes not reflected
**Problem:** Made changes to resources but generated TypeScript unchanged.
**Solution:**
1. Recompile Elixir code: `mix compile --force`
2. Regenerate TypeScript: `mix ash_typescript.codegen`
3. Verify output file path matches configuration
#### Permission errors
**Problem:** Cannot write to output file.
**Solution:** Check file permissions and directory structure:
```bash
# Ensure directory exists
mkdir -p assets/js
# Check permissions
ls -la assets/js
# Fix if needed
chmod 755 assets/js
```
## See Also
- [Configuration Reference](configuration.md) - Configure code generation
- [Getting Started Tutorial](../tutorials/getting-started.md) - Initial setup guide
- [Troubleshooting Reference](troubleshooting.md) - Common problems and solutions