npmSearchGenerator top-level property

FigGenerator npmSearchGenerator
final

Implementation

final FigGenerator npmSearchGenerator = FigGenerator(
  trigger: (String token) {
    if (token.startsWith('@') && token.indexOf('@', 1) != -1) return true;
    if (!token.startsWith('@') && token.contains('@')) return true;
    return false;
  },
  script: (tokens) {
    final searchTerm = tokens.last;
    if (searchTerm.contains('@')) {
      final name = searchTerm.substring(0, searchTerm.lastIndexOf('@'));
      return ['npm', 'view', name, 'dist-tags', '--json'];
    } else {
      return [
        'curl',
        '-s',
        '-H',
        'Accept: application/json',
        'https://api.npms.io/v2/search/suggestions?q=$searchTerm&size=20'
      ];
    }
  },
  postProcess: (out, [tokens]) {
    if (out.trim().isEmpty) return [];
    try {
      final searchTerm = tokens?.last ?? '';
      final json = jsonDecode(out);

      if (searchTerm.contains('@')) {
        if (json is Map) {
          return json.entries.map((e) {
            return FigSuggestion(
              name: e.value is String ? e.value as String : e.value.toString(),
              description: 'Tag: ${e.key}',
              icon: 'fig://icon?type=version',
            );
          }).toList();
        }
      } else {
        if (json is List) {
          return json.map((item) {
            final pkg = item['package'];
            return FigSuggestion(
              name: pkg['name'] as String,
              description: pkg['description'] as String?,
              icon: '📦',
            );
          }).toList();
        }
      }
    } catch (e) {
      return [];
    }
    return [];
  },
  cache: const FigCache(ttl: 172800000),
);