# Contribution Guide
- [Introduction](#introduction)
- [Development Setup](#development-setup)
- [Project Structure](#project-structure)
- [Coding Style](#coding-style)
- [Testing](#testing)
- [Pull Requests](#pull-requests)
- [Documentation](#documentation)
## Introduction
Thank you for considering contributing to Magic! This guide will help you get started with contributing to the framework.
## Development Setup
### Prerequisites
- Dart SDK 3.4.0 or higher
- Flutter 3.22.0 or higher
- Git
### Clone the Repository
```bash
git clone https://github.com/fluttersdk/magic.git
cd magic
```
### Install Dependencies
```bash
flutter pub get
```
### Run Tests
```bash
flutter test
```
## Project Structure
```
lib/
├── src/
│ ├── auth/ # Authentication system
│ ├── cache/ # Caching
│ ├── database/ # Database & Eloquent
│ ├── events/ # Event system
│ ├── facades/ # Facade classes
│ ├── foundation/ # Core Magic class
│ ├── http/ # HTTP client & controllers
│ ├── localization/ # i18n
│ ├── providers/ # Service providers
│ ├── routing/ # Router
│ ├── support/ # Helpers & utilities
│ ├── ui/ # View system
│ └── validation/ # Validation rules
└── magic.dart # Barrel export
```
### Key Files
| File | Purpose |
|------|---------|
| `lib/src/foundation/magic.dart` | Core Magic facade |
| `lib/src/facades/*.dart` | Public API facades |
| `lib/src/providers/*.dart` | Service providers |
| `lib/magic.dart` | Public exports |
## Coding Style
### Dart Style
Follow the [Dart Style Guide](https://dart.dev/guides/language/effective-dart/style):
```dart
// Use camelCase for variables and functions
final userName = 'John';
void loadUsers() {}
// Use PascalCase for classes
class UserController {}
// Use snake_case for file names
// user_controller.dart
```
### Documentation
Document all public APIs using DartDoc:
```dart
/// Retrieves a configuration value using dot notation.
///
/// ```dart
/// final name = Config.get('app.name', 'Default');
/// ```
///
/// Returns [defaultValue] if the key doesn't exist.
static T? get(String key, [T? defaultValue]) {
// ...
}
```
### Laravel-Style APIs
When designing APIs, follow Laravel's patterns:
```dart
// ✅ Good - Laravel-like fluent API
MagicRoute.page('/users', () => UserController.instance.index())
.name('users.index')
.middleware(['auth']);
// ❌ Bad - Non-fluent API
registerRoute('/users', 'users.index', UserController, 'index', ['auth']);
```
## Testing
### Test Structure
```
test/
├── unit/ # Unit tests for individual classes
├── feature/ # Integration tests
└── test_helper.dart
```
### Writing Tests
```dart
import 'package:flutter_test/flutter_test.dart';
void main() {
group('ClassName', () {
test('method does something', () {
// Arrange
final instance = ClassName();
// Act
final result = instance.method();
// Assert
expect(result, equals(expected));
});
});
}
```
### Test Coverage
Aim for high test coverage on new code:
```bash
flutter test --coverage
```
## Pull Requests
### Before Submitting
1. **Fork** the repository
2. **Create a branch** for your feature/fix
3. **Write tests** for new functionality
4. **Run all tests** to ensure nothing is broken
5. **Update documentation** if needed
6. **Follow the coding style**
### PR Template
```markdown
## Description
Brief description of changes.
## Type of Change
- [ ] Bug fix
- [ ] New feature
- [ ] Breaking change
- [ ] Documentation update
## Checklist
- [ ] Tests pass locally
- [ ] New tests added for new features
- [ ] Documentation updated
- [ ] No breaking changes (or documented if any)
```
### Commit Messages
Use clear, descriptive commit messages:
```
feat(auth): add token refresh functionality
- Add refreshToken() method to Guard contract
- Implement auto-refresh in AuthInterceptor
- Update documentation
```
Prefixes:
- `feat:` - New feature
- `fix:` - Bug fix
- `docs:` - Documentation only
- `refactor:` - Code refactoring
- `test:` - Adding tests
- `chore:` - Maintenance
## Documentation
### Updating Docs
Documentation lives in the `docs/` directory:
```
docs/
├── getting-started/
├── basics/
├── security/
├── digging-deeper/
├── eloquent/
├── database/
├── testing/
└── packages/
```
### Documentation Style
Follow Laravel's documentation style:
1. Start with a table of contents
2. Use anchor links for sections
3. Include code examples
4. Use GitHub-style alerts for important notes
5. Keep explanations concise
### Building Docs
Preview documentation locally:
```bash
# If using a docs site generator
npm run docs:dev
```
---
## Questions?
If you have questions about contributing, feel free to:
1. Open a GitHub issue
2. Join our Discord community
3. Email the maintainers
We appreciate all contributions, from bug reports to documentation improvements to new features. Thank you for helping make Magic better!