xtablo-source/DEVELOPMENT.md

330 lines
6.9 KiB
Markdown
Raw Normal View History

2025-10-23 19:05:49 +00:00
# Development Guide
This monorepo uses [Turborepo](https://turbo.build/) to manage builds, development, and testing across multiple packages and applications.
## Repository Structure
```
xtablo-source/
├── apps/
│ ├── main/ # Main application (@xtablo/main)
│ └── external/ # External application (@xtablo/external)
├── packages/
│ ├── shared/ # Shared utilities and logic (@xtablo/shared)
│ └── ui/ # UI component library (@xtablo/ui)
```
## Prerequisites
- Node.js >= 18
- pnpm >= 10.19.0
## Getting Started
```bash
# Install dependencies
pnpm install
# Start development (packages are source-only, no build needed)
pnpm dev
```
## Available Commands
### Building
```bash
# Build all apps (packages are source-only, consumed directly by bundlers)
pnpm build
# Build only apps (main, external)
pnpm build:apps
2025-10-23 19:36:21 +00:00
# Build main app for specific environments
pnpm build:staging # Build for staging
pnpm build:prod # Build for production
2025-10-23 19:05:49 +00:00
```
**Note:** The `@xtablo/shared` and `@xtablo/ui` packages are source-only packages. They export TypeScript source files directly and are consumed by app bundlers (Vite) without a separate build step. This is faster and simpler for development.
2025-10-23 19:36:21 +00:00
**Environment Builds:** The main app supports environment-specific builds (`staging`, `production`) that are properly cached by Turborepo based on environment-specific inputs (`.env.staging`, `.env.production`, etc.).
2025-10-23 19:05:49 +00:00
### Development
```bash
# Run all apps in development mode
pnpm dev
# Run specific app
pnpm dev:main # Main app only
pnpm dev:external # External app only
```
**Note:** Since packages are source-only, there's no need to run them in watch mode. Changes to package files are instantly picked up by the app's bundler (Vite) through hot module replacement.
### Testing
```bash
# Run all tests
pnpm test
# Run tests in watch mode
pnpm test:watch
# Run tests for specific package
cd apps/main && pnpm test
cd apps/main && pnpm test:watch
cd apps/main && pnpm test:coverage
```
### Linting & Formatting
```bash
# Check all packages
pnpm lint
# Fix linting issues
pnpm lint:fix
# Format code
pnpm format
# Type checking
pnpm typecheck
```
### Cleaning
```bash
# Clean all build artifacts
pnpm clean
# Clean specific app
cd apps/main && pnpm clean
```
## Turborepo Features
### Smart Caching
Turborepo caches build outputs and skips unnecessary work:
- Build outputs are cached based on input files
- If nothing changed, builds are instant
- Cache is shared across the team (when configured)
### Parallel Execution
Tasks run in parallel when possible:
```bash
# Runs lint on all packages simultaneously
pnpm lint
```
### Task Dependencies
Turborepo automatically handles task dependencies:
- `build` depends on `^build` (builds dependencies first, though packages are source-only)
- Tasks run in topological order based on package dependencies
### Filtering
Run commands for specific packages:
```bash
# Build only main app and its dependencies
turbo build --filter=@xtablo/main
# Build only packages
turbo build --filter='./packages/*'
# Build everything except external
turbo build --filter='!@xtablo/external'
```
2025-10-23 19:36:21 +00:00
### Package-Level Configuration
Packages can have their own `turbo.json` file to define custom tasks or override root configuration:
**Example:** `apps/main/turbo.json` defines environment-specific builds:
- `build:staging` - Builds for staging with `.env.staging`
- `build:prod` - Builds for production with `.env.production`
Each task:
- Extends the root config with `"extends": ["//"]`
- Defines specific inputs (including environment files)
- Configures caching with appropriate outputs
- Can pass environment variables to the build process
2025-10-23 19:05:49 +00:00
## Package Development Workflow
### 1. Working on Packages
Since packages are source-only, just run your app and edit package files directly:
```bash
# Just run your app - changes to packages are instantly reflected
pnpm dev:main
# Or run all apps
pnpm dev
```
The app's bundler (Vite) will automatically detect changes in `packages/shared` and `packages/ui` and hot-reload them.
### 2. Adding a New Package
1. Create the package in `packages/`
2. For source-only packages (like shared/ui), add these scripts to `package.json`:
```json
{
"scripts": {
"lint": "biome check .",
"lint:fix": "biome check --write .",
"format": "biome format --write .",
"typecheck": "tsc --noEmit"
}
}
```
3. Set up exports in `package.json`:
```json
{
"main": "./src/index.ts",
"types": "./src/index.ts",
"exports": {
".": "./src/index.ts"
}
}
```
4. Add to workspace in `pnpm-workspace.yaml` (if not already included by glob)
5. Run `pnpm install` to link the package
### 3. Testing Changes Across Packages
When making changes that affect multiple packages:
```bash
# Type check everything
pnpm typecheck
# Run all tests
pnpm test
# Lint everything
pnpm lint
```
## Performance Tips
1. **Source-Only Packages**: Packages consume TypeScript directly for instant feedback
2. **Selective Builds**: Use filters to build only the apps you need
3. **Clean When Stuck**: Run `pnpm clean` if you encounter weird caching issues
4. **Hot Module Replacement**: Vite provides instant updates when editing package files
## Troubleshooting
### Build Errors
If you encounter build errors:
```bash
# Clean everything and rebuild
pnpm clean
pnpm install
pnpm build
```
### Type Errors in Apps
If apps show type errors for packages:
```bash
# Check TypeScript configuration in packages
cd packages/shared && pnpm typecheck
cd packages/ui && pnpm typecheck
# Restart your IDE's TypeScript server
# In VS Code: Cmd+Shift+P > "TypeScript: Restart TS Server"
```
### Cache Issues
If builds seem stale:
```bash
# Clear Turbo cache
rm -rf node_modules/.cache/turbo
# Clean and rebuild
pnpm clean
pnpm build
```
## CI/CD Considerations
2025-10-23 19:36:21 +00:00
### Basic Pipeline
2025-10-23 19:05:49 +00:00
For CI/CD pipelines:
```bash
# Install dependencies
pnpm install --frozen-lockfile
# Build everything
pnpm build
# Run all checks
pnpm lint
pnpm typecheck
pnpm test
```
2025-10-23 19:36:21 +00:00
### Environment-Specific Deployments
**Staging Pipeline:**
```bash
# Install dependencies
pnpm install --frozen-lockfile
# Build for staging
pnpm build:staging
# Deploy (example with wrangler)
cd apps/main && pnpm deploy:staging
```
**Production Pipeline:**
```bash
# Install dependencies
pnpm install --frozen-lockfile
# Run all checks
pnpm lint
pnpm typecheck
pnpm test
# Build for production
pnpm build:prod
# Deploy (example with wrangler)
cd apps/main && pnpm deploy:prod
```
**Benefits:**
- Turborepo caches builds per environment
- Environment-specific `.env` files are tracked as inputs
- Builds are only re-run when relevant files change
2025-10-23 19:05:49 +00:00
## Additional Resources
- [Turborepo Documentation](https://turbo.build/repo/docs)
- [pnpm Workspaces](https://pnpm.io/workspaces)
- [TypeScript Project References](https://www.typescriptlang.org/docs/handbook/project-references.html)