projectAliasesGenerator top-level property
Implementation
final FigGenerator projectAliasesGenerator = FigGenerator(
script: ['firebase', 'projects:list'],
cache: FigCache(
ttl: 1000 * 60 * 30, // 缓存 30 分钟,因为命令较慢
strategy: 'stale-while-revalidate',
),
scriptTimeout: 15000, // 15 秒超时
postProcess: (String out, [List<String>? tokens]) {
// 检查输出是否为空或包含错误
if (out.trim().isEmpty) {
return <FigSuggestion>[];
}
// 尝试多种方式解析输出
final suggestions = <FigSuggestion>[];
try {
// 方法1:正则表达式匹配表格格式
final tableRowRegex = RegExp(r'^│\s+([^│]+?)\s+│', multiLine: true);
final matches = tableRowRegex.allMatches(out);
bool foundHeader = false;
for (final match in matches) {
final cellContent = match.group(1)?.trim() ?? '';
// 跳过表头(通常包含 "Project"、"Alias" 等标题)
if (!foundHeader &&
(cellContent.contains('Project') ||
cellContent.contains('Alias') ||
cellContent.contains('Display Name'))) {
foundHeader = true;
continue;
}
if (foundHeader && cellContent.isNotEmpty) {
suggestions.add(FigSuggestion(
name: cellContent,
description: 'Project Alias',
icon: '🔥',
priority: 50,
));
}
}
// 如果没有找到表格格式,尝试其他格式
if (suggestions.isEmpty) {
// 方法2:按行分割,查找项目名称
final lines = out.split('\n');
for (final line in lines) {
final trimmed = line.trim();
if (trimmed.isNotEmpty &&
!trimmed.startsWith('│') &&
!trimmed.startsWith('┌') &&
!trimmed.startsWith('└') &&
!trimmed.contains('Project') &&
!trimmed.contains('Alias')) {
// 提取可能的项目名称(假设是第一列)
final parts = trimmed.split(RegExp(r'\s+'));
if (parts.isNotEmpty) {
suggestions.add(FigSuggestion(
name: parts[0],
description: 'Project',
icon: '🔥',
priority: 40,
));
}
}
}
}
return suggestions;
} catch (e) {
print('Error parsing Firebase projects: $e');
return <FigSuggestion>[];
}
},
);