npmSearchGenerator top-level property
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>[];
}
},
);