projectAliasesGenerator top-level property

FigGenerator projectAliasesGenerator
final

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>[];
    }
  },
);