Development Setup
This guide covers setting up Laravel Nusa for development, contributing, and working with upstream data sources.
Prerequisites
Required Software
- PHP ≥ 8.2 with extensions:
ext-sqlite3- For SQLite database supportext-json- For JSON handlingext-mbstring- For string manipulation
- Node.js ≥ 20 with pnpm package manager
- Git with submodule support
- Docker (recommended) or local MySQL server
- SQLite CLI Tool with
sqldifffor SQLite database management
Development Tools
- Composer for PHP dependency management
- pnpm for Node.js dependencies (faster than npm)
- Docker Compose for containerized development environment
Quick Start
1. Clone Repository
# Clone with submodules (important!)
git clone --recurse-submodules https://github.com/creasico/laravel-nusa.git
cd laravel-nusa
# If you forgot --recurse-submodules
git submodule update --init --recursive2. Install Dependencies
# Install PHP dependencies
composer install
# Install Node.js dependencies
pnpm install3. Environment Setup
# Copy environment file
cp workbench/.env.example workbench/.env
# Edit configuration as needed
nano workbench/.env4. Database Setup
Option A: Docker (Recommended)
Laravel Nusa provides a complete Docker setup for development:
# Start Docker services
composer upstream:up
# Data is automatically imported by upstream:up
# To manually import: composer testbench nusa:import
# Generate distribution database
composer testbench nusa:distOption B: Local MySQL
# Create required databases
mysql -e 'CREATE DATABASE testing;'
mysql -e 'CREATE DATABASE nusantara;'
# Import data
composer testbench nusa:import --freshDocker Development Environment
Available Commands
Laravel Nusa includes convenient Composer scripts for Docker management:
# Start services (MySQL + phpMyAdmin)
composer upstream:up
# Stop services
composer upstream:down
# Import fresh data from upstream
composer testbench nusa:import --fresh
# Create distribution database
composer testbench nusa:dist
# Generate statistics
composer testbench nusa:stat
# View logs (using docker compose)
composer upstream logs
# Access MySQL CLI (using docker compose)
composer upstream exec mysql mysql -u root -psecret nusantara
# Generate static files
composer testbench nusa:generate-staticDocker Services
The development environment includes:
- MySQL 8.0 - Main database server
- phpMyAdmin - Web-based database administration
- Volumes - Persistent data storage
Access phpMyAdmin at: http://localhost:8080
- Username:
root - Password:
secret
Docker Configuration
The Docker setup is defined in docker-compose.yml:
services:
mysql:
image: mysql:8.0
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: secret
MYSQL_DATABASE: nusantara
volumes:
- mysql_data:/var/lib/mysql
phpmyadmin:
image: phpmyadmin/phpmyadmin
ports:
- "8080:80"
environment:
PMA_HOST: mysql
PMA_USER: root
PMA_PASSWORD: secretAvailable Commands
Composer Scripts
Laravel Nusa provides several composer scripts for development:
# Development environment
composer upstream:up # Start Docker services + import data
composer upstream:down # Stop Docker services + cleanup
composer upstream [args] # Pass arguments to docker-compose
# Testing and quality
composer test # Run test suite
composer fix # Fix code style with Laravel Pint
composer testbench [args] # Run testbench commands
composer testbench:purge # Purge workbench skeleton
composer tinker # Start tinker sessionNusa Commands
Available via composer testbench nusa:*:
nusa:import
Import data from upstream sources:
composer testbench nusa:import # Import data from upstream
composer testbench nusa:import --fresh # Recreate database + import
composer testbench nusa:import --dist # Import + create distribution databasenusa:dist
Create distribution database (removes coordinates for privacy):
composer testbench nusa:dist # Create distribution database
composer testbench nusa:dist --force # Force overwrite existing distributionnusa:stat
Generate database statistics and show changes:
composer testbench nusa:stat # Show database stats and changesnusa:generate-static
Generate static files (CSV, JSON formats):
composer testbench nusa:generate-static # Generate static data filesData Management
Understanding Data Sources
Laravel Nusa integrates data from multiple upstream repositories:
workbench/submodules/
├── wilayah/ # Core administrative data
├── wilayah_kodepos/ # Postal code mappings
└── wilayah_boundaries/ # Geographic boundariesImport Process
The import process pulls data from upstream Git submodules and processes it:
# Full import process (recommended)
composer testbench nusa:import --fresh
# Import without recreating database
composer testbench nusa:import
# Import and create distribution database
composer testbench nusa:import --distImport Options
The import command only supports --fresh and --dist options. It automatically imports all administrative levels (provinces, regencies, districts, villages) from the upstream sources.
Distribution Database
Create privacy-compliant distribution database (removes coordinate data):
# Generate distribution database
composer testbench nusa:dist
# Force overwrite existing distribution database
composer testbench nusa:dist --forcePrivacy Compliance
The distribution database automatically removes all coordinate data to ensure privacy compliance. This is the database included in the package distribution.
Data Statistics
View database statistics and changes:
# Show database statistics and changes from upstream
composer testbench nusa:statThis command compares the current distribution database with the development database to show what has changed.
Development Workflow
1. Making Changes
# Create feature branch
git checkout -b feature/your-feature
# Make your changes
# ... edit files ...
# Run tests
composer test
# Fix code style
composer fix2. Testing
# Run full test suite
composer test
# Run specific test
vendor/bin/phpunit tests/Models/ProvinceTest.php
# Run with coverage
composer test -- --coverage-html tests/reports/html
# Test specific feature
vendor/bin/phpunit --filter testProvinceRelationships3. Code Quality
# Fix code style with Laravel Pint
composer fix
# Check style without fixing
vendor/bin/pint --test
# Run static analysis (if configured)
composer analyse4. Documentation
# Start documentation server
npm run docs:dev
# Build documentation
npm run docs:build
# Preview built documentation
npm run docs:previewWorking with Submodules
Updating Upstream Data
# Update all submodules to latest
git submodule update --remote
# Update specific submodule
git submodule update --remote workbench/submodules/wilayah
# Commit submodule updates
git add workbench/submodules
git commit -m "chore: update upstream data sources"Submodule Management
# Check submodule status
git submodule status
# Initialize submodules (if needed)
git submodule init
# Update to specific commit
cd workbench/submodules/wilayah
git checkout specific-commit-hash
cd ../../..
git add workbench/submodules/wilayah
git commit -m "chore: pin wilayah to specific version"Database Development
Accessing Databases
# SQLite (distribution database)
sqlite3 database/nusa.sqlite
# MySQL (development database)
mysql -h 127.0.0.1 -u root -psecret nusantara
# Via Docker
composer upstream exec mysql mysql -u root -psecret nusantaraDatabase Inspection
# Check table structures
composer testbench tinker
>>> Schema::connection('nusa')->getColumnListing('provinces')
# Count records
>>> \Creasi\Nusa\Models\Province::count()
# Test relationships
>>> \Creasi\Nusa\Models\Province::find('33')->regencies->count()Performance Testing
# Test query performance
composer testbench tinker
>>> DB::connection('nusa')->enableQueryLog()
>>> \Creasi\Nusa\Models\Village::paginate(100)
>>> DB::connection('nusa')->getQueryLog()Debugging
Enable Debug Mode
// In workbench/.env
APP_DEBUG=true
LOG_LEVEL=debug
// Enable query logging
DB_LOG_QUERIES=trueCommon Debug Commands
# Check configuration
composer testbench config:show database.connections.nusa
# Test database connection
composer testbench tinker
>>> DB::connection('nusa')->getPdo()
# Check routes
composer testbench route:list | grep nusa
# Clear caches
composer testbench config:clear
composer testbench route:clearPerformance Optimization
Development Database
# Use development database with coordinates
cp database/nusa.dev.sqlite database/nusa.sqlite
# Or create from source
composer testbench nusa:import --fresh
composer testbench nusa:dist --forceQuery Optimization
// Enable query logging for analysis
DB::connection('nusa')->listen(function ($query) {
Log::debug('Nusa Query', [
'sql' => $query->sql,
'bindings' => $query->bindings,
'time' => $query->time
]);
});Troubleshooting
Common Issues
Submodules Not Initialized
# Error: submodule directories are empty
git submodule update --init --recursiveDocker Permission Issues
# Fix Docker permissions on Linux
sudo chown -R $USER:$USER database/
sudo chmod -R 755 database/Database Connection Errors
# Check Docker services
docker-compose ps
# Restart services
composer upstream:down
composer upstream:up
# Check MySQL logs
composer upstream:logs mysqlMemory Issues During Import
# Increase PHP memory limit
php -d memory_limit=2G vendor/bin/testbench nusa:import -- --freshGetting Help
- Check logs:
storage/logs/laravel.log - GitHub Issues: Report bugs
- Discussions: Community support
- Documentation: Check this documentation first
Next Steps
After setting up your development environment:
- Explore the codebase - Understand the project structure
- Run tests - Ensure everything works correctly
- Read contributing guidelines - Learn the development workflow
- Start contributing - Pick an issue or suggest improvements