discoverCommands static method
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;
}