run method

  1. @override
Future<void> run(
  1. List<String> args, {
  2. required Logger logger,
})
override

The execution body of the command.

Implementation

@override
Future<void> run(List<String> args, {required Logger logger}) async {
  if (args.isEmpty) {
    logger.error('Usage: deeplink remove-scheme <scheme-name>');
    return;
  }

  final targetScheme = args.first.trim().toLowerCase();
  if (targetScheme.isEmpty) {
    logger.error('Scheme name cannot be empty.');
    return;
  }

  final finder = ProjectFinder();
  final projectRoot = finder.findProjectRoot();
  final project = FlutterProject(projectRoot);

  final configManager = ConfigManager(projectRoot);
  if (!configManager.configExists()) {
    logger.error('No configuration found. Please run "deeplink init" first.');
    return;
  }

  final config = configManager.load();
  if (!config.schemes.contains(targetScheme)) {
    logger.error('Scheme "$targetScheme" is not configured in ${Constants.configFile}.');
    return;
  }

  if (config.schemes.length <= 1) {
    logger.warning('You are removing the only configured scheme. Deep links will no longer resolve.');
  }

  final spinner = Spinner('Removing scheme "$targetScheme"...');
  spinner.start();

  try {
    // 1. Remove from AndroidManifest.xml
    if (FileUtils.exists(project.androidManifestPath)) {
      var manifestContent = FileUtils.readAsString(project.androidManifestPath);
      manifestContent = AndroidManifestEditor().removeScheme(manifestContent, targetScheme);
      FileUtils.writeString(project.androidManifestPath, manifestContent);
    }

    // 2. Remove from Info.plist
    if (FileUtils.exists(project.iosPlistPath)) {
      var plistContent = FileUtils.readAsString(project.iosPlistPath);
      plistContent = PlistEditor().removeScheme(plistContent, targetScheme);
      FileUtils.writeString(project.iosPlistPath, plistContent);
    }

    // 3. Update Configuration and regenerate Flutter constants
    final updatedSchemes = List<String>.from(config.schemes)..remove(targetScheme);
    final updatedConfig = DeepLinkConfig(
      schemes: updatedSchemes,
      generateSampleRoutes: config.generateSampleRoutes,
      generateDeepLinkManager: config.generateDeepLinkManager,
      androidAppLinks: config.androidAppLinks,
      iosUniversalLinks: config.iosUniversalLinks,
      domains: config.domains,
    );

    configManager.save(updatedConfig);

    final generator = FlutterGenerator(projectRoot, logger);
    generator.generate(updatedConfig);

    spinner.stop(success: true, finalMessage: 'Scheme "$targetScheme" removed and configuration updated.');
  } catch (e) {
    spinner.stop(success: false, finalMessage: 'Failed to remove scheme.');
    logger.error('Failed to remove scheme: ${e.toString()}');
  }
}