normalizeFileEditInput function

NormalizedEditInput normalizeFileEditInput(
  1. String filePath,
  2. List<FileEdit> edits
)

Implementation

NormalizedEditInput normalizeFileEditInput(
  String filePath,
  List<FileEdit> edits,
) {
  if (edits.isEmpty) {
    return NormalizedEditInput(filePath: filePath, edits: edits);
  }

  // Markdown uses two trailing spaces as a hard line break
  final isMarkdown = RegExp(
    r'\.(md|mdx)$',
    caseSensitive: false,
  ).hasMatch(filePath);

  try {
    final file = File(filePath);
    if (!file.existsSync()) {
      return NormalizedEditInput(filePath: filePath, edits: edits);
    }
    final fileContent = file.readAsStringSync();

    final normalizedEdits = edits.map((edit) {
      final normalizedNewString = isMarkdown
          ? edit.newString
          : stripTrailingWhitespace(edit.newString);

      // If exact string match works, keep it as is
      if (fileContent.contains(edit.oldString)) {
        return FileEdit(
          oldString: edit.oldString,
          newString: normalizedNewString,
          replaceAll: edit.replaceAll,
        );
      }

      // Try de-sanitize string if exact match fails
      final desanitized = desanitizeMatchString(edit.oldString);
      if (fileContent.contains(desanitized.result)) {
        var desanitizedNewString = normalizedNewString;
        for (final replacement in desanitized.appliedReplacements) {
          desanitizedNewString = desanitizedNewString.replaceAll(
            replacement.key,
            replacement.value,
          );
        }
        return FileEdit(
          oldString: desanitized.result,
          newString: desanitizedNewString,
          replaceAll: edit.replaceAll,
        );
      }

      return FileEdit(
        oldString: edit.oldString,
        newString: normalizedNewString,
        replaceAll: edit.replaceAll,
      );
    }).toList();

    return NormalizedEditInput(filePath: filePath, edits: normalizedEdits);
  } catch (_) {
    return NormalizedEditInput(filePath: filePath, edits: edits);
  }
}