/**
 * Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 */ import { DIFF_EQUAL , Diff , cleanupSemantic } from './cleanupSemantic' ; import { diffLinesUnified , printDiffLines } from './diffLines' ; import diffStrings from './diffStrings' ; import getAlignedDiffs from './getAlignedDiffs' ; import { normalizeDiffOptions } from './normalizeDiffOptions' ; import type { DiffOptions } from './types' ; const hasCommonDiff = ( diffs , isMultiline ) : boolean => { if ( isMultiline ) { const iLast = diffs . length - 1 ; return diffs . some ( ( diff , i ) => diff [ 0 ] === DIFF_EQUAL && ( i !== iLast || diff [ 1 ] !== '\n' ) ) ; } return diffs . some ( ( diff ) => diff [ 0 ] === DIFF_EQUAL ) ; } ; export const diffStringsUnified = ( a , b , options ? ) : string => { if ( a !== b && a . length !== 0 && b . length !== 0 ) { const isMultiline = a . includes ( '\n' ) || b . includes ( '\n' ) ; const diffs = diffStringsRaw ( isMultiline ? a + '\n' : a , isMultiline ? b + '\n' : b , true ) ; if ( hasCommonDiff ( diffs , isMultiline ) ) { const optionsNormalized = normalizeDiffOptions ( options ) ; const lines = getAlignedDiffs ( diffs , optionsNormalized . changeColor ) ; return printDiffLines ( lines , optionsNormalized ) ; } } return diffLinesUnified ( a . split ( '\n' ) , b . split ( '\n' ) , options ) ; } ; export const diffStringsRaw = ( a , b , cleanup ) : Array < Diff > => { const diffs = diffStrings ( a , b ) ; if ( cleanup ) { cleanupSemantic ( diffs ) ; } return diffs ; } ;