simple_repository_generator 1.0.0 copy "simple_repository_generator: ^1.0.0" to clipboard
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 #

License #

MIT License - see LICENSE for details.

1
likes
130
points
85
downloads

Documentation

API reference

Publisher

verified publisherkeep-it-simple.dev

Weekly Downloads

A customizable code generator for repository patterns. Generates boilerplate-free repository implementations with configurable templates, presets, and build.yaml support.

Repository (GitHub)
View/report issues

Topics

#code-generation #repository-pattern #build-runner #source-gen

License

MIT (license)

Dependencies

analyzer, build, mustache_template, source_gen

More

Packages that depend on simple_repository_generator