npmSearchGenerator top-level property

FigGenerator npmSearchGenerator
final

Implementation

final FigGenerator npmSearchGenerator = FigGenerator(
  trigger: {
    'on': 'change',
  },
  getQueryTerm: '@',
  cache: FigCache(ttl: 1000 * 60 * 60 * 24 * 2),
  script: (List<String> tokens) {
    final searchTerm = tokens.isNotEmpty ? tokens.last : '';
    if (searchTerm.isEmpty) return <String>[];
    final shouldGetVersion = searchTerm.startsWith('@')
        ? atsInStr(searchTerm) > 1
        : searchTerm.contains('@');
    if (shouldGetVersion) {
      final pkg = searchTerm.endsWith('@')
          ? searchTerm.substring(0, searchTerm.length - 1)
          : searchTerm;
      return [
        'curl',
        '-s',
        '-H',
        'Accept: application/vnd.npm.install-v1+json',
        'https://registry.npmjs.org/$pkg',
      ];
    }
    final encoded = Uri.encodeComponent(searchTerm);
    return [
      'curl',
      '-s',
      '-H',
      'Accept: application/json',
      'https://api.npms.io/v2/search/suggestions?q=$encoded&size=20',
    ];
  },
  postProcess: (String out, [List<String>? tokens]) {
    final searchTerm = (tokens != null && tokens.isNotEmpty) ? tokens.last : '';
    if (searchTerm.isEmpty) return <FigSuggestion>[];
    final shouldGetVersion = searchTerm.startsWith('@')
        ? atsInStr(searchTerm) > 1
        : searchTerm.contains('@');
    try {
      final data = jsonDecode(out) as Map<String, dynamic>;
      if (shouldGetVersion) {
        final versions = <FigSuggestion>[];
        final distTags = data['dist-tags'] as Map<String, dynamic>?;
        if (distTags != null) {
          for (final e in distTags.entries) {
            versions.add(FigSuggestion(
              name: e.key,
              description: e.value?.toString(),
            ));
          }
        }
        final vers = data['versions'] as Map<String, dynamic>?;
        if (vers != null) {
          final list = vers.keys.toList()..sort((a, b) => b.compareTo(a));
          versions.addAll(list.map((v) => FigSuggestion(name: v)));
        }
        return versions;
      }
      final results = data is List
          ? data as List
          : (data['results'] as List? ?? <dynamic>[]);
      return results.map<FigSuggestion>((item) {
        final p = item is Map ? item['package'] as Map? : null;
        final name = p?['name']?.toString() ?? '';
        final desc = p?['description']?.toString();
        return FigSuggestion(name: name, description: desc);
      }).toList();
    } catch (_) {
      return <FigSuggestion>[];
    }
  },
);