Line-by-line text comparison with configurable whitespace and newline handling. Essential for code diffs, file comparisons, and text processing where line boundaries are significant.
Performs line-level diff between two strings, treating each line as a token.
/**
* Compare two strings at the line level
* @param oldStr - Original string with line breaks
* @param newStr - New string to compare against
* @param options - Configuration options
* @returns Array of change objects representing the diff
*/
function diffLines(oldStr, newStr, options);Options:
interface LineDiffOptions extends DiffOptions {
ignoreWhitespace?: boolean; // Ignore leading/trailing whitespace on lines
ignoreNewlineAtEof?: boolean; // Ignore missing newline at end of file
stripTrailingCr?: boolean; // Remove \r before \n for cross-platform compatibility
newlineIsToken?: boolean; // Treat newlines as separate tokens
}Usage Examples:
import { diffLines } from "diff";
// Basic line diff
const result = diffLines(
"line1\nline2\nline3",
"line1\nmodified line2\nline3"
);
console.log(result);
// [
// { value: "line1\n", count: 1 },
// { value: "line2\n", removed: true, count: 1 },
// { value: "modified line2\n", added: true, count: 1 },
// { value: "line3", count: 1 }
// ]
// Ignore whitespace differences
const whitespaceResult = diffLines(
" indented line \n",
"indented line\n",
{ ignoreWhitespace: true }
);
// No differences detected due to whitespace normalization
// Cross-platform line endings
const crossPlatform = diffLines(
"line1\r\nline2\r\n", // Windows endings
"line1\nline2\n", // Unix endings
{ stripTrailingCr: true }
);
// Treats both formats as equivalentConvenience function that performs line diff with whitespace ignored (deprecated wrapper).
/**
* Line diff with whitespace ignored (deprecated - use diffLines with ignoreWhitespace)
* @param oldStr - Original string
* @param newStr - New string to compare against
* @param callback - Optional callback for async operation
* @returns Array of change objects representing the diff
* @deprecated Use diffLines with { ignoreWhitespace: true } instead
*/
function diffTrimmedLines(oldStr, newStr, callback);Pre-configured Diff instance for line-level comparisons with custom tokenization.
/**
* Pre-configured line diff instance with line-aware tokenization
* Handles line breaks and line-based equality checking
*/
const lineDiff: Diff;import { diffLines } from "diff";
// Treat newlines as separate tokens
const newlineTokens = diffLines(
"line1\nline2",
"line1\n\nline2", // Added blank line
{ newlineIsToken: true }
);
// Newlines appear as separate change objects
// Ignore missing newline at end of file
const eofNewline = diffLines(
"last line\n", // Has trailing newline
"last line", // Missing trailing newline
{ ignoreNewlineAtEof: true }
);
// Treats both as equivalentimport { diffLines } from "diff";
// Handle Windows vs Unix line endings
const windowsText = "line1\r\nline2\r\n";
const unixText = "line1\nline2\n";
const compatible = diffLines(windowsText, unixText, {
stripTrailingCr: true
});
// No differences detected despite different line endingsimport { diffLines } from "diff";
function createCodeDiff(oldCode, newCode) {
return diffLines(oldCode, newCode, {
ignoreWhitespace: false, // Preserve code formatting
newlineIsToken: false, // Keep lines together
stripTrailingCr: true // Cross-platform compatibility
});
}
// Usage for code comparison
const oldCode = `function hello() {
console.log("old");
}`;
const newCode = `function hello() {
console.log("new");
return true;
}`;
const codeDiff = createCodeDiff(oldCode, newCode);import { diffLines } from "diff";
// Async processing for large files
function diffLargeFiles(oldContent, newContent, callback) {
diffLines(oldContent, newContent, {
callback: callback,
maxEditLength: 50000, // Limit computation
timeout: 30000 // 30 second timeout
});
}
diffLargeFiles(largeFile1, largeFile2, (result) => {
if (result) {
console.log(`Found ${result.length} change blocks`);
} else {
console.log("Files too different to compute diff efficiently");
}
});import { diffLines } from "diff";
const oldText = " line with spaces \n";
const newText = "line with spaces\n";
// Strict comparison (shows whitespace changes)
const strict = diffLines(oldText, newText);
// Ignore whitespace comparison
const relaxed = diffLines(oldText, newText, {
ignoreWhitespace: true
});
console.log("Strict changes:", strict.length);
console.log("Relaxed changes:", relaxed.length);import { lineDiff } from "diff";
// Using the pre-configured instance
const customDiff = lineDiff.diff("old\nlines", "new\nlines");
// Custom tokenization access
const tokens = lineDiff.tokenize("line1\nline2\nline3");
console.log("Line tokens:", tokens);
// Custom equality checking
const equal = lineDiff.equals(" trimmed ", "trimmed", {
ignoreWhitespace: true
});