discoverCommands static method

Future<List<NyCommand>> discoverCommands(
  1. List commandConfigs, {
  2. String scriptDirectory = commandsFolder,
  3. String? package,
  4. String defaultCategory = 'app',
  5. String? workingDirectory,
})

Builds sorted, de-duplicated NyCommands from command configs. Scripts are relative to scriptDirectory; package commands run in workingDirectory.

Implementation

static Future<List<NyCommand>> discoverCommands(
  List<dynamic> commandConfigs, {
  String scriptDirectory = commandsFolder,
  String? package,
  String defaultCategory = 'app',
  String? workingDirectory,
}) async {
  // Remove any duplicate commands (same category and name) from commandConfigs
  final Set<String> commandNames = {};
  commandConfigs.removeWhere((config) {
    final key = '${config['category'] ?? defaultCategory}:${config['name']}';
    if (commandNames.contains(key)) {
      return true; // Remove duplicate
    } else {
      commandNames.add(key);
      return false; // Keep unique
    }
  });

  final String source = package == null
      ? 'commands.json'
      : packageCommandsManifest;

  // List of commands
  List<NyCommand> allCommands = commandConfigs.map<NyCommand>((config) {
    assert(config['name'] != null, 'Command "name" is required in $source');
    assert(
      config['script'] != null,
      'Command "script" is required in $source',
    );
    return NyCommand(
      name: config['name'],
      category: config['category'] ?? defaultCategory,
      package: package,
      description: config['description'] is String
          ? config['description']
          : null,
      action: (args) => package == null
          ? _executeCommandScript(
              config['script'],
              args,
              scriptDirectory: scriptDirectory,
            )
          : _executePackageCommand(
              package,
              config['script'],
              args,
              binDirectory: scriptDirectory,
              workingDirectory: workingDirectory,
            ),
    );
  }).toList();

  // Sort commands by category
  allCommands.sort((a, b) {
    if (a.category == b.category) {
      return (a.name ?? "").compareTo(b.name ?? "");
    }
    return (a.category ?? "").compareTo(b.category ?? "");
  });

  return allCommands;
}