runWithFlags method

Future<void> runWithFlags({
  1. String? projectName,
  2. String? organization,
  3. String? outputDir,
  4. bool noGit = false,
  5. bool quickMode = false,
})

Implementation

Future<void> runWithFlags({
  String? projectName,
  String? organization,
  String? outputDir,
  bool noGit = false,
  bool quickMode = false,
}) async {
  _printWelcomeMessage();

  // Get or validate project name
  String finalProjectName;
  if (projectName != null && projectName.isNotEmpty) {
    if (!RegExp(r'^[a-z][a-z0-9_]*$').hasMatch(projectName)) {
      print('$_red  Invalid project name: $projectName$_reset');
      print('$_dim  Must be lowercase with underscores only.$_reset');
      return;
    }
    finalProjectName = projectName;
  } else if (quickMode) {
    // In quick mode without name, ask for it
    finalProjectName = _getProjectName();
  } else {
    print('$_red  Project name is required.$_reset');
    print('$_dim  Use: vgv -n <name>$_reset');
    return;
  }

  // Get or use default organization based on project name
  String finalOrganization;
  if (organization != null && organization.isNotEmpty) {
    if (!RegExp(r'^[a-z][a-z0-9._]*[a-z0-9]$').hasMatch(organization)) {
      print('$_red  Invalid organization: $organization$_reset');
      print('$_dim  Must be lowercase with dots (e.g., com.example)$_reset');
      return;
    }
    finalOrganization = organization;
  } else {
    finalOrganization = 'com.$finalProjectName';
  }

  // Default platforms for quick/flag mode
  final platforms = [PlatformType.mobile, PlatformType.web];
  _selectedMobilePlatform = MobilePlatform.both;
  _selectedDesktopPlatforms = null;

  final config = ProjectConfig(
    projectName: finalProjectName,
    organizationName: finalOrganization,
    platforms: platforms,
    stateManagement: StateManagementType.bloc,
    architecture: ArchitectureType.cleanArchitecture,
    includeGoRouter: true,
    includeLinterRules: false,
    includeFreezed: true,
    mobilePlatform: _selectedMobilePlatform,
    desktopPlatform: DesktopPlatform.all,
    customDesktopPlatforms: null,
    outputDirectory: outputDir,
    skipGitInit: noGit,
  );

  _printConfigurationSummary(config);

  if (quickMode) {
    // In quick mode, proceed without confirmation
    await _createProject(config);
  } else if (_confirmConfiguration()) {
    await _createProject(config);
  } else {
    _printCancelledMessage();
  }
}