generate method

Future<void> generate(
  1. String featureName,
  2. String providerName, {
  3. bool force = false,
  4. bool dryRun = false,
  5. bool withTests = true,
  6. String? stateManagement,
})

Implementation

Future<void> generate(
  String featureName,
  String providerName, {
  bool force = false,
  bool dryRun = false,
  bool withTests = true,
  String? stateManagement,
}) async {
  if (featureName.isEmpty || providerName.isEmpty) {
    throw Exception('Feature name and provider name are required.');
  }
  if (!isSnakeCase(featureName) || !isSnakeCase(providerName)) {
    throw Exception('Names must be in snake_case.');
  }

  final sm = stateManagement ?? detectStateManagement();
  final useBloc = sm == 'bloc';

  final featureDir = getFeatureDir(featureName);
  final providersDir = p.join(featureDir, 'presentation', 'providers');
  final targetPath = p.join(
    providersDir,
    useBloc ? '${providerName}_cubit.dart' : '${providerName}_provider.dart',
  );
  checkFileExists(
    targetPath,
    useBloc ? 'Cubit "$providerName"' : 'Provider "$providerName"',
    force: force,
  );

  final testDir = p.join(
    projectDir,
    'test',
    'features',
    featureName,
    'presentation',
    'providers',
  );
  final testPath = p.join(
    testDir,
    useBloc
        ? '${providerName}_cubit_test.dart'
        : '${providerName}_provider_test.dart',
  );

  if (dryRun) {
    logDryRun(
      useBloc
          ? 'create cubit "$providerName"'
          : 'create provider "$providerName"',
      targetPath,
    );
    if (withTests) {
      logDryRun(
        useBloc
            ? 'create cubit test "$providerName"'
            : 'create provider test "$providerName"',
        testPath,
      );
    }
    return;
  }

  ensureDirectory(providersDir);

  final className = toPascalCase(providerName);
  await copyTemplate(
    templateSubPath: useBloc ? 'cubit' : 'provider',
    targetDir: providersDir,
    variables: {'provider_name': providerName, 'class_name': className},
  );

  if (withTests) {
    await generateTest(
      testTemplateSubPath: useBloc ? 'cubit' : 'provider',
      testDir: testDir,
      variables: {
        'project_name': getProjectName(),
        'feature_name': featureName,
        'provider_name': providerName,
        'class_name': className,
      },
    );
  }

  logger.success(
    useBloc
        ? 'Cubit "$providerName" created in feature "$featureName".'
        : 'Provider "$providerName" created in feature "$featureName".',
  );
}