simple_repository_generator 1.0.0
simple_repository_generator: ^1.0.0 copied to clipboard
A customizable code generator for repository patterns. Generates boilerplate-free repository implementations with configurable templates, presets, and build.yaml support.
Simple Repository Generator #
A customizable code generator for repository patterns in Dart/Flutter. Generates boilerplate-free repository implementations with configurable templates, presets, and build.yaml support.
Features #
- Zero Boilerplate - Annotate methods, get implementations generated
- Fully Customizable - Templates, variables, and presets via
build.yaml - Built-in Presets - Ready-to-use configurations for common patterns
- Per-Class Overrides - Fine-tune generation with
@GenerateRepository - Mustache Templates - Familiar syntax for custom templates
Installation #
Add to your pubspec.yaml:
dependencies:
simple_repository_generator: ^1.0.0
dev_dependencies:
build_runner: ^2.4.0
Quick Start #
1. Create your repository #
import 'package:simple_repository_generator/generate.dart';
import 'package:simple_network_handler/simple_network_handler.dart';
part 'user_repository.gen.dart';
abstract class UserRepository {
@Generate(apiClient: UserApi)
Future<Either<Failure, User>> getUser(String id);
@Generate(apiClient: UserApi, refreshes: [User])
Future<Either<Failure, User>> updateUser(User user);
}
2. Create the implementation #
import 'package:injectable/injectable.dart';
@Singleton(as: UserRepository)
class UserRepositoryImpl extends UserRepository with UserRepositoryGenerated {
@override
final UserApi apiClient;
UserRepositoryImpl(this.apiClient);
}
3. Run the generator #
dart run build_runner build
Generated Output #
mixin UserRepositoryGenerated on UserRepository {
UserApi get apiClient;
@override
Future<Either<Failure, User>> getUser(String id) {
return SimpleNetworkHandler.safeCall(
() => apiClient.getUser(id),
);
}
@override
Future<Either<Failure, User>> updateUser(User user) {
return SimpleNetworkHandler.safeCall(
() => apiClient.updateUser(user),
).then((result) {
result.fold((_) {}, (_) {
RefreshBus.instance.refresh<User>();
});
return result;
});
}
}
Configuration #
Built-in Presets #
| Preset | Wrapper | Refresh Bus | Use Case |
|---|---|---|---|
simple_network_handler (default) |
SimpleNetworkHandler.safeCall |
RefreshBus.instance.refresh |
Full error handling + refresh signals |
dio_raw |
None | RefreshBus.instance.refresh |
Direct API calls with refresh signals |
none |
None | None | Pure passthrough to API client |
Project-wide Configuration (build.yaml) #
targets:
$default:
builders:
simple_repository_generator|simple_repository_generator:
options:
# Use a preset
preset: "simple_network_handler"
# Or customize variables
vars:
wrapper: "MyNetworkHandler.call"
refresh: "MyRefreshBus.emit"
# Required imports for generated code
imports:
- "package:my_network_handler/my_network_handler.dart"
- "package:my_refresh_bus/my_refresh_bus.dart"
Per-Class Override #
@GenerateRepository(
vars: {'wrapper': 'SpecialHandler.call'},
imports: ['package:special/special.dart'],
)
abstract class SpecialRepository {
@Generate(apiClient: SpecialApi)
Future<Result<Data>> getData();
}
Custom Templates #
For full control, provide custom Mustache templates:
targets:
$default:
builders:
simple_repository_generator|simple_repository_generator:
options:
method_template: |
@override
{{{returnType}}} {{methodName}}({{{parameters}}}) {
return {{{vars.wrapper}}}(
() => apiClient.{{methodName}}({{{arguments}}}),
);
}
Available Template Variables
| Variable | Description | Example |
|---|---|---|
{{{returnType}}} |
Full return type | Future<Either<Failure, User>> |
{{methodName}} |
Method name | getUser |
{{{parameters}}} |
Parameter signature | {required String id} |
{{{arguments}}} |
Call-site arguments | id: id |
{{className}} |
Original class name | UserRepository |
{{mixinName}} |
Generated mixin name | UserRepositoryGenerated |
{{{apiClientType}}} |
API client type | UserApi |
{{#hasRefreshes}} |
Conditional block | Boolean |
{{#refreshTypes}} |
Loop over refresh types | List |
{{{vars.wrapper}}} |
Wrapper function | SimpleNetworkHandler.safeCall |
{{{vars.refresh}}} |
Refresh function | RefreshBus.instance.refresh |
Note: Use triple braces
{{{...}}}for values containing<or>to prevent HTML escaping.
Works Great With #
- simple_network_handler - Network error handling
- simple_refresh_bus - Cross-cubit state sync
- injectable - Dependency injection
- retrofit - Type-safe HTTP client
License #
MIT License - see LICENSE for details.