sanitizeGraphQLQuery static method

String sanitizeGraphQLQuery(
  1. String query,
  2. Map<String, List> customFieldsConfig
)

Implementation

static String sanitizeGraphQLQuery(
    String query, Map<String, List<dynamic>> customFieldsConfig) {
  final entityNames = customFieldsConfig.keys.map(RegExp.escape).join('|');
  final regex = RegExp(
      r'fragment\s+(\w+)\s+on\s+(' + entityNames + r')\b\s*\{([\s\S]*?)\}',
      multiLine: true);

  final buffer = StringBuffer();
  var lastIndex = 0;

  for (final match in regex.allMatches(query)) {
    final fragmentName = match.group(1)!;
    final entityName = match.group(2)!;
    final fragmentContent = match.group(3)!;

    buffer.write(query.substring(lastIndex, match.start));

    if (customFieldsConfig[entityName]!.isNotEmpty &&
        !fragmentContent.contains('customFields ') &&
        !fragmentContent.contains('customFields{')) {
      final customFields = customFieldsConfig[entityName]!;
      String customFieldsFragment;
      if (customFields.contains('SCALAR_CUSTOM_FIELDS')) {
        customFieldsFragment = '\n  customFields\n';
      } else {
        customFieldsFragment = '''

customFields {
${_generateFieldsRecursive(customFields, indent: '    ')}  }
''';
      }
      buffer.write(
          'fragment $fragmentName on $entityName {$fragmentContent$customFieldsFragment}');
    } else {
      buffer.write(match.group(0));
    }

    lastIndex = match.end;
  }

  buffer.write(query.substring(lastIndex));
  return buffer.toString();
}