Feature Folder CLI Plus πŸ“

A powerful Dart CLI tool that generates clean, scalable folder structures following the feature-first architecture pattern. Stop wasting time creating repetitive boilerplate - generate complete feature modules in seconds!

Pub Version License: MIT


πŸš€ Quick Start

1. Install

dart pub global activate feature_folder_cli_plus

2. Generate a feature

ff generate -n auth -t bloc

That's it! Your complete auth feature folder is ready. βœ…


✨ What's New in V2.0

Before (v1.x) Now (v2.0)
❌ Required Mason dependency βœ… Zero external dependencies
❌ Network calls to fetch templates βœ… Instant offline generation
❌ Breaks when Mason updates βœ… Self-contained & stable

πŸ“¦ Installation

dart pub global activate feature_folder_cli_plus

Note: Make sure Dart's bin directory is in your PATH.
Usually: ~/.pub-cache/bin (macOS/Linux) or %LOCALAPPDATA%\Pub\Cache\bin (Windows)


πŸ› οΈ Usage

ff generate -n <name> -t <type> [-p <path>]
Flag Description Required
-n Feature name (e.g., auth, home, profile) βœ…
-t State management type βœ…
-p Custom path inside lib/ folder ❌

Supported State Management Types

Type Flag Package Required
BLoC -t bloc flutter_bloc
Cubit -t cubit flutter_bloc
Provider -t provider provider
GetX -t getx get

πŸ“‹ Examples

Basic Usage

# Generate a BLoC feature in lib/
ff generate -n auth -t bloc

# Generate a Cubit feature in lib/
ff generate -n home -t cubit

# Generate a Provider feature in lib/
ff generate -n profile -t provider

# Generate a GetX feature in lib/
ff generate -n settings -t getx

With Custom Path

# Generate inside lib/features/
ff generate -n auth -t bloc -p features

# Generate inside lib/modules/
ff generate -n payment -t cubit -p modules

πŸ“‚ Generated Structure

BLoC / Cubit

lib/
└── auth/
    β”œβ”€β”€ index.dart
    β”œβ”€β”€ domain/
    β”‚   β”œβ”€β”€ index.dart
    β”‚   β”œβ”€β”€ models/
    β”‚   β”‚   β”œβ”€β”€ auth_model.dart
    β”‚   β”‚   └── index.dart
    β”‚   β”œβ”€β”€ repository/
    β”‚   β”‚   β”œβ”€β”€ auth_repository.dart    ← Abstract class
    β”‚   β”‚   └── index.dart
    β”‚   └── services/
    β”‚       β”œβ”€β”€ auth_service.dart       ← Implements repository
    β”‚       └── index.dart
    β”œβ”€β”€ logic/
    β”‚   β”œβ”€β”€ index.dart
    β”‚   └── auth_bloc/
    β”‚       β”œβ”€β”€ auth_bloc.dart
    β”‚       β”œβ”€β”€ auth_event.dart
    β”‚       └── auth_state.dart
    β”œβ”€β”€ screens/
    β”‚   β”œβ”€β”€ auth_screen.dart
    β”‚   └── index.dart
    └── widgets/
        β”œβ”€β”€ auth_component.dart
        └── index.dart

Provider / GetX

lib/
└── auth/
    β”œβ”€β”€ index.dart
    β”œβ”€β”€ domain/
    β”‚   β”œβ”€β”€ index.dart
    β”‚   β”œβ”€β”€ models/
    β”‚   β”œβ”€β”€ repository/              ← Abstract class
    β”‚   └── services/                ← Implements repository
    β”œβ”€β”€ providers/
    β”‚   β”œβ”€β”€ auth_provider.dart       (Provider)
    β”‚   β”œβ”€β”€ auth_controller.dart     (GetX)
    β”‚   β”œβ”€β”€ auth_binding.dart        (GetX only)
    β”‚   └── index.dart
    β”œβ”€β”€ screens/
    β”‚   └── auth_screen.dart
    └── widgets/
        └── auth_component.dart

πŸ—οΈ Architecture Pattern

This CLI follows the Repository Pattern with clean separation:

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                      UI Layer                        β”‚
β”‚              (screens/ & widgets/)                   β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                      β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                  Logic Layer                         β”‚
β”‚     (bloc/ cubit/ provider/ controller/)            β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                      β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                 Domain Layer                         β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
β”‚  β”‚   Models    β”‚  β”‚ Repository  β”‚  β”‚  Services   β”‚  β”‚
β”‚  β”‚  (data)     β”‚  β”‚ (abstract)  │◄─│ (implement) β”‚  β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
  • Repository: Abstract class defining the contract
  • Service: Concrete implementation of the repository
  • This enables easy testing and dependency injection!

πŸ’‘ Pro Tips

  1. Use barrel files: Each folder has an index.dart for clean imports

    // Instead of this:
    import 'package:app/auth/domain/models/auth_model.dart';
    import 'package:app/auth/domain/repository/auth_repository.dart';
       
    // Just do this:
    import 'package:app/auth/index.dart';
    
  2. Consistent naming: The CLI automatically converts your feature name to lowercase

    ff generate -n UserProfile -t bloc  # Creates "userprofile" folder
    ff generate -n user_profile -t bloc # Creates "user_profile" folder βœ…
    
  3. Organize by feature: Use the -p flag to group related features

    ff generate -n login -t bloc -p auth
    ff generate -n register -t bloc -p auth
    ff generate -n forgot_password -t bloc -p auth
    

🀝 Contributing

Contributions are welcome! Feel free to open issues or submit PRs.


πŸ“„ License

This project is licensed under the MIT License - see the LICENSE file for details.


Made with ❀️ by bazl-E