createFeature function

void createFeature(
  1. String featureName, {
  2. bool useFreezed = false,
})

Implementation

void createFeature(String featureName, {bool useFreezed = false}) {
  final featurePath = path.join('lib', 'features', featureName.toLowerCase());
  final featureNameCapitalized = toPascalCase(featureName.toLowerCase());

  // Create directory structure
  Directory(path.join(featurePath, 'domain', 'models'))
      .createSync(recursive: true);
  Directory(path.join(featurePath, 'domain', 'repository'))
      .createSync(recursive: true);
  Directory(path.join(featurePath, 'domain', 'services'))
      .createSync(recursive: true);
  Directory(path.join(featurePath, 'logic', featureName.toLowerCase()))
      .createSync(recursive: true);
  Directory(path.join(featurePath, 'screens')).createSync(recursive: true);
  Directory(path.join(featurePath, 'widgets')).createSync(recursive: true);

  // Create files with content
  createFileWithContent(
    path.join(featurePath, 'domain', 'models',
        '${featureName.toLowerCase()}_model.dart'),
    '// TODO: Implement $featureNameCapitalized model',
  );

  createFileWithContent(
    path.join(featurePath, 'domain', 'repository',
        '${featureName.toLowerCase()}_repository.dart'),
    '''abstract class ${featureNameCapitalized}Repository {
  const ${featureNameCapitalized}Repository();

  Future<int?> someFunctionName({required String s});
}''',
  );

  createFileWithContent(
    path.join(featurePath, 'domain', 'services',
        '${featureName.toLowerCase()}_service.dart'),
    '''import '../repository/${featureName.toLowerCase()}_repository.dart';

class ${featureNameCapitalized}Service implements ${featureNameCapitalized}Repository {

  @override
  Future<int?> someFunctionName({required String s}) async {
    // TODO: implement function
    throw UnimplementedError();
  }
}''',
  );

  if (useFreezed) {
    _createFreezedCubitFiles(featurePath, featureName, featureNameCapitalized);
  } else {
    _createRegularCubitFiles(featurePath, featureName, featureNameCapitalized);
  }

  createFileWithContent(
    path.join(
        featurePath, 'screens', '${featureName.toLowerCase()}_screen.dart'),
    '''import 'package:flutter/material.dart';

class ${featureNameCapitalized}Screen extends StatelessWidget {
  const ${featureNameCapitalized}Screen({super.key});

  @override
  Widget build(BuildContext context) {
    return const Scaffold(
      body: Center(
        child: Text('${featureNameCapitalized}Screen'),
      ),
    );
  }
}''',
  );

  createFileWithContent(
    path.join(
        featurePath, 'widgets', '${featureName.toLowerCase()}_widget.dart'),
    '// TODO: Implement $featureNameCapitalized widget',
  );

  createFileWithContent(
      path.join(featurePath, '${featureName.toLowerCase()}_config.json'), '''{
  "model1": {
    "model_class_relative_path": "<your folder_path>/${featureName.toLowerCase()}.json",
    "end_point": "/sample",
    "method": "get",
    "function_name": "sample",
    "parameters": {
      "parameter_name": "parameter_type"
    }
  }
}''');

  print(
      "Feature folder structure and files created for $featureNameCapitalized${useFreezed ? ' (with Freezed)' : ''}!");
}