dependenciesGeneratorRevised top-level property

FigGenerator dependenciesGeneratorRevised
final

Implementation

final FigGenerator dependenciesGeneratorRevised = FigGenerator(
  trigger: (String newToken, String oldToken) =>
      newToken == '-g' || newToken == '--global',
  script: (List<String> tokens) {
    if (!tokens.contains('-g') && !tokens.contains('--global')) {
      return ['bash', '-c', 'cat "\$(npm prefix)/package.json" 2>/dev/null'];
    } else {
      return ['bash', '-c', 'ls -1 `npm root -g`'];
    }
  },
  postProcess: (String out, [List<String>? tokens]) {
    if (tokens != null &&
        (tokens.contains('-g') || tokens.contains('--global'))) {
      return out.split('\n').where((line) => line.isNotEmpty).map((name) {
        return FigSuggestion(
          name: name,
          icon: '📦',
          description: 'global dependency',
        );
      }).toList();
    }

    if (out.trim().isEmpty) return [];

    try {
      final packageContent = jsonDecode(out);
      final dependencies = packageContent['dependencies'] ?? {};
      final devDependencies = packageContent['devDependencies'] ?? {};
      final optionalDependencies = packageContent['optionalDependencies'] ?? {};

      final allDeps = {};
      allDeps.addAll(dependencies);
      allDeps.addAll(devDependencies);
      allDeps.addAll(optionalDependencies);

      return allDeps.keys.map((key) {
        final pkgName = key as String;
        // Filtering is usually handled by the client, but we can do it here if needed.
        // The TS spec filters out already listed tokens. We can skip that for simplicity or implement it.
        // Let's implement basic suggestion.
        String desc = 'dependency';
        if (optionalDependencies.containsKey(pkgName)) {
          desc = 'optionalDependency';
        } else if (devDependencies.containsKey(pkgName)) {
          desc = 'devDependency';
        }

        return FigSuggestion(
          name: pkgName,
          icon: '📦',
          description: desc,
        );
      }).toList();
    } catch (e) {
      return [];
    }
  },
);