{"version":3,"file":"winarg-ngx-text-diff.mjs","sources":["../../../projects/ngx-text-diff/src/lib/ngx-text-diff.utils.ts","../../../projects/ngx-text-diff/src/lib/ngx-text-diff.service.ts","../../../projects/ngx-text-diff/src/lib/ngx-text-diff-container.directive.ts","../../../projects/ngx-text-diff/src/lib/loader-spinner/loader-spinner.component.ts","../../../projects/ngx-text-diff/src/lib/loader-spinner/loader-spinner.component.html","../../../projects/ngx-text-diff/src/lib/format-line.pipe.ts","../../../projects/ngx-text-diff/src/lib/ngx-text-diff.component.ts","../../../projects/ngx-text-diff/src/lib/ngx-text-diff.component.html","../../../projects/ngx-text-diff/src/lib/ngx-text-diff.module.ts","../../../projects/ngx-text-diff/src/public_api.ts","../../../projects/ngx-text-diff/src/winarg-ngx-text-diff.ts"],"sourcesContent":["export const isNil = val => val === undefined || val === null;\r\nexport const isEmpty = val => val == null || !(Object.keys(val) || val).length || (Object.keys(val) || val).length === 0;\r\n","import { Injectable } from '@angular/core';\r\nimport { Diff, DIFF_DELETE, DIFF_EQUAL, DIFF_INSERT, diff_match_patch } from 'diff-match-patch';\r\nimport { DiffLineResult, DiffPart, DiffTableRowResult } from './ngx-text-diff.model';\r\nimport { isEmpty, isNil } from './ngx-text-diff.utils';\r\n\r\n@Injectable({\r\n  providedIn: 'root'\r\n})\r\nexport class NgxTextDiffService {\r\n  diffParser: any; // diff_match_patch;\r\n\r\n  constructor() {\r\n    this.initParser();\r\n  }\r\n\r\n  private initParser() {\r\n    this.diffParser = new diff_match_patch();\r\n  }\r\n\r\n  getDiffsByLines(left: string, right: string): Promise<DiffTableRowResult[]> {\r\n    return new Promise<DiffTableRowResult[]>((resolve, reject) => {\r\n      const a = this.diffParser.diff_linesToChars_(left, right);\r\n      const lineText1 = a.chars1;\r\n      const lineText2 = a.chars2;\r\n      const linesArray = a.lineArray;\r\n      const diffs: Diff[] = this.diffParser.diff_main(lineText1, lineText2, true);\r\n      this.diffParser.diff_charsToLines_(diffs, linesArray);\r\n      const rows: DiffTableRowResult[] = this.formatOutput(diffs);\r\n      if (!rows) {\r\n        reject('Error');\r\n      }\r\n\r\n      resolve(rows);\r\n    });\r\n  }\r\n\r\n  private formatOutput(diffs: Diff[]): DiffTableRowResult[] {\r\n    let lineLeft = 1;\r\n    let lineRight = 1;\r\n    return diffs.reduce((rows: DiffTableRowResult[], diff: Diff) => {\r\n      if (!rows) {\r\n        rows = [];\r\n      }\r\n      const diffType: number = diff[0];\r\n      const diffValue: string = diff[1];\r\n      let leftDiffRow: DiffTableRowResult = null;\r\n      let rightDiffRow: DiffTableRowResult = null;\r\n      let leftContent: DiffLineResult = null;\r\n      let rightContent: DiffLineResult = null;\r\n      let rowTemp: DiffTableRowResult = null;\r\n      switch (diffType) {\r\n        case DIFF_EQUAL: // 0\r\n          diffValue\r\n            .split('\\n')\r\n            .filter((value, index, array) => {\r\n              if (index === array.length - 1) {\r\n                return !isEmpty(value);\r\n              }\r\n              return true;\r\n            })\r\n            .forEach(line => {\r\n              leftContent = {\r\n                lineNumber: lineLeft,\r\n                lineContent: line,\r\n                lineDiffs: [],\r\n                prefix: ''\r\n              };\r\n              rightContent = {\r\n                lineNumber: lineRight,\r\n                lineContent: line,\r\n                lineDiffs: [],\r\n                prefix: ''\r\n              };\r\n              rowTemp = {\r\n                leftContent,\r\n                rightContent,\r\n                belongTo: 'both',\r\n                hasDiffs: false,\r\n                numDiffs: 0,\r\n              };\r\n              rows.push(rowTemp);\r\n              lineRight = lineRight + 1;\r\n              lineLeft = lineLeft + 1;\r\n            });\r\n          break;\r\n        case DIFF_DELETE: // -1\r\n          diffValue\r\n            .split('\\n')\r\n            .filter((value, index, array) => {\r\n              if (index === array.length - 1) {\r\n                return !isEmpty(value);\r\n              }\r\n              return true;\r\n            })\r\n            .forEach(line => {\r\n              rightDiffRow = rows.find(\r\n                row => !row.leftContent && row.rightContent && row.rightContent.lineNumber === lineLeft && row.rightContent.prefix !== ''\r\n              );\r\n              leftContent = {\r\n                lineNumber: lineLeft,\r\n                lineContent: line,\r\n                lineDiffs: [{ content: line, isDiff: true }],\r\n                prefix: '-'\r\n              };\r\n              if (rightDiffRow) {\r\n                rightDiffRow.leftContent = leftContent;\r\n                rightDiffRow.leftContent.lineDiffs = this.getDiffParts(\r\n                  rightDiffRow.leftContent.lineContent,\r\n                  rightDiffRow.rightContent.lineContent\r\n                );\r\n                rightDiffRow.rightContent.lineDiffs = this.getDiffParts(\r\n                  rightDiffRow.rightContent.lineContent,\r\n                  rightDiffRow.leftContent.lineContent\r\n                );\r\n                rightDiffRow.belongTo = 'both';\r\n                rightDiffRow.numDiffs = this.countDiffs(rightDiffRow);\r\n              } else {\r\n                rows.push({\r\n                  leftContent,\r\n                  rightContent: null,\r\n                  hasDiffs: true,\r\n                  belongTo: 'left',\r\n                  numDiffs: 1,\r\n                });\r\n              }\r\n              lineLeft = lineLeft + 1;\r\n            });\r\n          break;\r\n        case DIFF_INSERT: // 1\r\n          diffValue\r\n            .split('\\n')\r\n            .filter((value, index, array) => {\r\n              if (index === array.length - 1) {\r\n                return !isEmpty(value);\r\n              }\r\n              return true;\r\n            })\r\n            .forEach(line => {\r\n              leftDiffRow = rows.find(\r\n                row => row.leftContent && !row.rightContent && row.leftContent.lineNumber === lineRight && row.leftContent.prefix !== ''\r\n              );\r\n              rightContent = {\r\n                lineNumber: lineRight,\r\n                lineContent: line,\r\n                lineDiffs: [{ content: line, isDiff: true }],\r\n                prefix: '+'\r\n              };\r\n              if (leftDiffRow) {\r\n                leftDiffRow.rightContent = rightContent;\r\n                leftDiffRow.leftContent.lineDiffs = this.getDiffParts(\r\n                  leftDiffRow.leftContent.lineContent,\r\n                  leftDiffRow.rightContent.lineContent\r\n                );\r\n                leftDiffRow.rightContent.lineDiffs = this.getDiffParts(\r\n                  leftDiffRow.rightContent.lineContent,\r\n                  leftDiffRow.leftContent.lineContent\r\n                );\r\n                leftDiffRow.belongTo = 'both';\r\n                leftDiffRow.numDiffs = this.countDiffs(leftDiffRow);\r\n              } else {\r\n                rows.push({\r\n                  leftContent: null,\r\n                  rightContent,\r\n                  hasDiffs: true,\r\n                  belongTo: 'right',\r\n                  numDiffs: 1,\r\n                });\r\n              }\r\n              lineRight = lineRight + 1;\r\n            });\r\n          break;\r\n      }\r\n      return rows;\r\n    }, []);\r\n  }\r\n\r\n  private countDiffs(result: DiffTableRowResult): number {\r\n    let diffCount = 0;\r\n    if (result.leftContent) {\r\n      diffCount += result.leftContent.lineDiffs.filter(diff => diff.isDiff).length;\r\n    }\r\n    if (result.leftContent) {\r\n      diffCount += result.rightContent.lineDiffs.filter(diff => diff.isDiff).length;\r\n    }\r\n    return diffCount;\r\n  }\r\n\r\n  private getDiffParts(value: string, compareValue: string): DiffPart[] {\r\n    const diffParts: DiffPart[] = [];\r\n    let i = 0;\r\n    let j = 0;\r\n    let shared = '';\r\n    let diff = '';\r\n\r\n    while (i < value.length) {\r\n      if (value[i] === compareValue[j] && j < compareValue.length) {\r\n        if (diff !== '') {\r\n          diffParts.push({ content: diff, isDiff: true });\r\n          diff = '';\r\n        }\r\n        shared += value[i];\r\n      } else {\r\n        if (shared !== '') {\r\n          diffParts.push({ content: shared, isDiff: false });\r\n          shared = '';\r\n        }\r\n        diff += value[i];\r\n      }\r\n      i++;\r\n      j++;\r\n    }\r\n\r\n    if (diff !== '') {\r\n      diffParts.push({ content: diff, isDiff: true });\r\n    } else if (shared !== '') {\r\n      diffParts.push({ content: shared, isDiff: false });\r\n    }\r\n\r\n    return diffParts;\r\n  }\r\n}\r\n","import { Directive, Input, ElementRef } from '@angular/core';\r\n\r\n@Directive({\n    selector: '[tdContainer]',\n    standalone: false\n})\r\nexport class ContainerDirective {\r\n  @Input() id: string;\r\n\r\n  element: HTMLTableHeaderCellElement;\r\n\r\n  constructor(private _el: ElementRef) {\r\n    this.element = _el.nativeElement;\r\n  }\r\n}\r\n","import { Component, Input, OnInit } from '@angular/core';\r\n\r\n@Component({\n    selector: 'td-loader-spinner',\n    templateUrl: './loader-spinner.component.html',\n    styleUrls: ['./loader-spinner.component.css'],\n    standalone: false\n})\r\nexport class LoaderSpinnerComponent implements OnInit {\r\n  @Input() active = false;\r\n\r\n  constructor() {}\r\n\r\n  ngOnInit() {}\r\n}\r\n","@if (active) {\n  <div class=\"td-loading-roller\">\n    <div></div>\n    <div></div>\n    <div></div>\n    <div></div>\n    <div></div>\n    <div></div>\n    <div></div>\n    <div></div>\n  </div>\n}\n","import { Pipe, PipeTransform } from '@angular/core';\r\n\r\n@Pipe({\n    name: 'formatLine',\n    standalone: false\n})\r\nexport class FormatLinePipe implements PipeTransform {\r\n  transform(line: string, diffs?: string[]): string {\r\n    if (!line) {\r\n      return ' ';\r\n    }\r\n    if (!!diffs && diffs.length > 0) {\r\n      /*diffs.forEach(diff => {\r\n        line = line.replace(diff, `<span class=\"highli\">${diff}</span>`);\r\n      });*/\r\n    }\r\n    return line\r\n      .replace(/&/g, '&amp;')\r\n      .replace(/</g, '&lt;')\r\n      .replace(/>/g, '&gt;')\r\n      .replace(/\"/g, '&quot;')\r\n      .replace(/ /g, '&nbsp;');\r\n  }\r\n}\r\n","import {\r\n  ChangeDetectorRef,\r\n  Component,\r\n  Input,\r\n  OnDestroy,\r\n  OnInit,\r\n  Output,\r\n  EventEmitter,\r\n  ViewChildren,\r\n  QueryList,\r\n  AfterViewInit\r\n} from '@angular/core';\r\nimport { DiffContent, DiffPart, DiffTableFormat, DiffTableFormatOption, DiffTableRowResult, DiffResults } from './ngx-text-diff.model';\r\nimport { NgxTextDiffService } from './ngx-text-diff.service';\r\nimport { Observable, Subscription } from 'rxjs';\r\nimport { ContainerDirective } from './ngx-text-diff-container.directive';\r\nimport { ScrollDispatcher, CdkScrollable } from '@angular/cdk/scrolling';\r\n\r\n@Component({\n    selector: 'td-ngx-text-diff',\n    templateUrl: './ngx-text-diff.component.html',\n    styleUrls: ['./ngx-text-diff.component.css'],\n    standalone: false\n})\r\nexport class NgxTextDiffComponent implements OnInit, AfterViewInit, OnDestroy {\r\n  private _hideMatchingLines = false;\r\n  @ViewChildren(ContainerDirective) containers: QueryList<ContainerDirective>;\r\n  @Input() format: DiffTableFormat = 'SideBySide';\r\n  @Input() left = '';\r\n  @Input() right = '';\r\n  @Input() diffContent: Observable<DiffContent>;\r\n  @Input() loading = false;\r\n  @Input() showToolbar = true;\r\n  @Input() showBtnToolbar = true;\r\n  @Input()\r\n  get hideMatchingLines() {\r\n    return this._hideMatchingLines;\r\n  }\r\n\r\n  set hideMatchingLines(hide: boolean) {\r\n    this.hideMatchingLinesChanged(hide);\r\n  }\r\n  @Input() outerContainerClass: string;\r\n  @Input() outerContainerStyle: any;\r\n  @Input() toolbarClass: string;\r\n  @Input() toolbarStyle: any;\r\n  @Input() compareRowsClass: string;\r\n  @Input() compareRowsStyle: any;\r\n  @Input() synchronizeScrolling = true;\r\n  @Output() compareResults = new EventEmitter<DiffResults>();\r\n  subscriptions: Subscription[] = [];\r\n  tableRows: DiffTableRowResult[] = [];\r\n  filteredTableRows: DiffTableRowResult[] = [];\r\n  tableRowsLineByLine: DiffTableRowResult[] = [];\r\n  filteredTableRowsLineByLine: DiffTableRowResult[] = [];\r\n  diffsCount = 0;\r\n\r\n  formatOptions: DiffTableFormatOption[] = [\r\n    {\r\n      id: 'side-by-side',\r\n      name: 'side-by-side',\r\n      label: 'Side by Side',\r\n      value: 'SideBySide',\r\n      icon: 'la-code',\r\n    },\r\n    {\r\n      id: 'line-by-line',\r\n      name: 'line-by-line',\r\n      label: 'Line by Line',\r\n      value: 'LineByLine',\r\n      icon: 'la-file-text',\r\n    },\r\n  ];\r\n\r\n  constructor(private scrollService: ScrollDispatcher, private diff: NgxTextDiffService, private cd: ChangeDetectorRef) {}\r\n\r\n  ngOnInit() {\r\n    this.loading = true;\r\n    if (this.diffContent) {\r\n      this.subscriptions.push(\r\n        this.diffContent.subscribe(content => {\r\n          this.loading = true;\r\n          this.left = content.leftContent;\r\n          this.right = content.rightContent;\r\n          this.renderDiffs()\r\n            .then(() => {\r\n              this.cd.detectChanges();\r\n              this.loading = false;\r\n            })\r\n            .catch(() => (this.loading = false));\r\n        })\r\n      );\r\n    }\r\n    this.renderDiffs()\r\n      .then(() => (this.loading = false))\r\n      .catch(e => (this.loading = false));\r\n  }\r\n\r\n  ngAfterViewInit() {\r\n    this.initScrollListener();\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    if (this.subscriptions) {\r\n      this.subscriptions.forEach(subscription => subscription.unsubscribe());\r\n    }\r\n  }\r\n\r\n  hideMatchingLinesChanged(value: boolean) {\r\n    this._hideMatchingLines = value;\r\n    if (this.hideMatchingLines) {\r\n      this.filteredTableRows = this.tableRows.filter(\r\n        row => (row.leftContent && row.leftContent.prefix === '-') || (row.rightContent && row.rightContent.prefix === '+')\r\n      );\r\n      this.filteredTableRowsLineByLine = this.tableRowsLineByLine.filter(\r\n        row => (row.leftContent && row.leftContent.prefix === '-') || (row.rightContent && row.rightContent.prefix === '+')\r\n      );\r\n    } else {\r\n      this.filteredTableRows = this.tableRows;\r\n      this.filteredTableRowsLineByLine = this.tableRowsLineByLine;\r\n    }\r\n  }\r\n\r\n  setDiffTableFormat(format: DiffTableFormat) {\r\n    this.format = format;\r\n  }\r\n\r\n  async renderDiffs() {\r\n    try {\r\n      this.diffsCount = 0;\r\n      this.tableRows = await this.diff.getDiffsByLines(this.left, this.right);\r\n      this.tableRowsLineByLine = this.tableRows.reduce((tableLineByLine: DiffTableRowResult[], row: DiffTableRowResult) => {\r\n        if (!tableLineByLine) {\r\n          tableLineByLine = [];\r\n        }\r\n        if (row.hasDiffs) {\r\n          if (row.leftContent) {\r\n            tableLineByLine.push({\r\n              leftContent: row.leftContent,\r\n              rightContent: null,\r\n              belongTo: row.belongTo,\r\n              hasDiffs: true,\r\n              numDiffs: row.numDiffs,\r\n            });\r\n          }\r\n          if (row.rightContent) {\r\n            tableLineByLine.push({\r\n              leftContent: null,\r\n              rightContent: row.rightContent,\r\n              belongTo: row.belongTo,\r\n              hasDiffs: true,\r\n              numDiffs: row.numDiffs,\r\n            });\r\n          }\r\n        } else {\r\n          tableLineByLine.push(row);\r\n        }\r\n\r\n        return tableLineByLine;\r\n      }, []);\r\n      this.diffsCount = this.tableRows.filter(row => row.hasDiffs).length;\r\n      this.filteredTableRows = this.tableRows;\r\n      this.filteredTableRowsLineByLine = this.tableRowsLineByLine;\r\n      this.emitCompareResultsEvent();\r\n    } catch (e) {\r\n      throw e;\r\n    }\r\n  }\r\n\r\n  emitCompareResultsEvent() {\r\n    const diffResults: DiffResults = {\r\n      hasDiff: this.diffsCount > 0,\r\n      diffsCount: this.diffsCount,\r\n      rowsWithDiff: this.tableRows\r\n        .filter(row => row.hasDiffs)\r\n        .map(row => ({\r\n          leftLineNumber: row.leftContent ? row.leftContent.lineNumber : null,\r\n          rightLineNumber: row.rightContent ? row.rightContent.lineNumber : null,\r\n          numDiffs: row.numDiffs,\r\n        })),\r\n    };\r\n\r\n    this.compareResults.next(diffResults);\r\n  }\r\n\r\n  trackTableRows(index, row: DiffTableRowResult) {\r\n    return row && row.leftContent ? row.leftContent.lineContent : row && row.rightContent ? row.rightContent.lineContent : undefined;\r\n  }\r\n\r\n  trackDiffs(index, diff: DiffPart) {\r\n    return diff && diff.content ? diff.content : undefined;\r\n  }\r\n\r\n  private initScrollListener() {\r\n    this.subscriptions.push(this.scrollService.scrolled().subscribe((scrollableEv: CdkScrollable) => {\r\n      if (scrollableEv && this.synchronizeScrolling) {\r\n        const scrollableId = scrollableEv.getElementRef().nativeElement.id;\r\n        const nonScrolledContainer: ContainerDirective = this.containers.find(container => container.id !== scrollableId);\r\n        if (nonScrolledContainer) {\r\n          nonScrolledContainer.element.scrollTo({\r\n            top: scrollableEv.measureScrollOffset('top'),\r\n            left: scrollableEv.measureScrollOffset('left'),\r\n          });\r\n        }\r\n      }\r\n    }));\r\n  }\r\n}\r\n","<td-loader-spinner [active]=\"loading\"></td-loader-spinner>\n@if (!loading) {\n  <div class=\"td-wrapper\" [ngClass]=\"outerContainerClass\" [ngStyle]=\"outerContainerStyle\">\n    @if (showToolbar) {\n      <div [ngClass]=\"toolbarClass\" [ngStyle]=\"toolbarStyle\">\n        <div class=\"td-toolbar-show-diff\">\n          <label class=\"td-checkbox-container\">\n            Only Show Lines with Differences ({{ diffsCount }})\n            <input type=\"checkbox\" id=\"showDiffs\" [ngModel]=\"hideMatchingLines\" (ngModelChange)=\"hideMatchingLinesChanged($event)\" />\n            <span class=\"checkmark\"></span>\n          </label>\n        </div>\n      </div>\n    }\n    @if (showToolbar && showBtnToolbar) {\n      <div class=\"td-toolbar-select-format\">\n        <div class=\"td-btn-group td-btn-group-toggle\" data-toggle=\"buttons\">\n          @for (option of formatOptions; track option) {\n            <button\n              [ngClass]=\"{ active: format === option.value, disabled: !!option.disabled }\"\n              [name]=\"option.name\"\n              [id]=\"option.id\"\n              [disabled]=\"!!option.disabled\"\n              (click)=\"setDiffTableFormat(option.value)\"\n              >\n              {{ option.label }}\n            </button>\n          }\n        </div>\n      </div>\n    }\n    <div class=\"td-table-wrapper\" [ngClass]=\"compareRowsClass\" [ngStyle]=\"compareRowsStyle\">\n      <!-- Right side-by-side -->\n      @if (format === 'SideBySide') {\n        <div class=\"td-table-container side-by-side\" id=\"td-left-compare-container\" tdContainer cdkScrollable>\n          <table class=\"td-table\">\n            <tbody>\n              @for (row of filteredTableRows; track trackTableRows($index, row)) {\n                <tr>\n                  <td\n                    scope=\"row\"\n                    class=\"fit-column line-number-col\"\n                    [ngClass]=\"{ 'delete-row': row.leftContent?.prefix === '-', 'empty-row': !row.leftContent?.lineContent }\"\n                    >\n                    {{ row.leftContent?.lineNumber !== -1 ? row.leftContent?.lineNumber : ' ' }}\n                  </td>\n                  <td\n                    class=\"fit-column prefix-col\"\n                    [ngClass]=\"{ 'delete-row': row.leftContent?.prefix === '-', 'empty-row': !row.leftContent?.lineContent }\"\n                    >\n                    <span>{{ row.leftContent?.prefix || ' ' }}</span>\n                  </td>\n                  @if (!row.hasDiffs) {\n                    <td\n                      class=\"content-col\"\n                      [ngClass]=\"{ 'delete-row': row.leftContent?.prefix === '-', 'empty-row': !row.leftContent?.lineContent }\"\n                      >\n                      <span [innerHTML]=\"row.leftContent?.lineContent | formatLine\"></span>\n                    </td>\n                  }\n                  @if (row.hasDiffs) {\n                    <td\n                      class=\"content-col\"\n                      [ngClass]=\"{ 'delete-row': row.leftContent?.prefix === '-', 'empty-row': !row.leftContent?.lineContent }\"\n                      >\n                      @for (diff of row.leftContent?.lineDiffs; track trackDiffs($index, diff)) {\n                        <span\n                          [innerHTML]=\"diff.content | formatLine\"\n                          [ngClass]=\"{ highlight: diff.isDiff }\"\n                        ></span>\n                      }\n                    </td>\n                  }\n                </tr>\n              }\n            </tbody>\n          </table>\n        </div>\n      }\n      <!-- Left side-by-side -->\n      @if (format === 'SideBySide') {\n        <div class=\"td-table-container side-by-side\" id=\"td-right-compare-container\" tdContainer cdkScrollable>\n          <table class=\"td-table\">\n            <tbody>\n              @for (row of filteredTableRows; track trackTableRows($index, row)) {\n                <tr>\n                  <td\n                    scope=\"row\"\n                    class=\"fit-column line-number-col\"\n                    [ngClass]=\"{ 'insert-row': row.rightContent?.prefix === '+', 'empty-row': !row.rightContent?.lineContent }\"\n                    >\n                    {{ row.rightContent?.lineNumber !== -1 ? row.rightContent?.lineNumber : ' ' }}\n                  </td>\n                  <td\n                    class=\"fit-column prefix-col\"\n                    [ngClass]=\"{ 'insert-row': row.rightContent?.prefix === '+', 'empty-row': !row.rightContent?.lineContent }\"\n                    >\n                    <span>{{ row.rightContent?.prefix || ' ' }}</span>\n                  </td>\n                  @if (!row.hasDiffs) {\n                    <td\n                      class=\"content-col\"\n                      [ngClass]=\"{ 'insert-row': row.rightContent?.prefix === '+', 'empty-row': !row.rightContent?.lineContent }\"\n                      >\n                      <span [innerHTML]=\"row.rightContent?.lineContent | formatLine\"></span>\n                    </td>\n                  }\n                  @if (row.hasDiffs) {\n                    <td\n                      class=\"content-col\"\n                      [ngClass]=\"{ 'insert-row': row.rightContent?.prefix === '+', 'empty-row': !row.rightContent?.lineContent }\"\n                      >\n                      @for (diff of row.rightContent?.lineDiffs; track trackDiffs($index, diff)) {\n                        <span\n                          [innerHTML]=\"diff.content | formatLine\"\n                          [ngClass]=\"{ highlight: diff.isDiff }\"\n                        ></span>\n                      }\n                    </td>\n                  }\n                </tr>\n              }\n            </tbody>\n          </table>\n        </div>\n      }\n      <!-- Line By Line - combined table -->\n      @if (format === 'LineByLine') {\n        <div class=\"td-table-container line-by-line\">\n          <table class=\"td-table\">\n            <tbody>\n              @for (row of filteredTableRowsLineByLine; track trackTableRows($index, row)) {\n                <tr>\n                  <td scope=\"row\" class=\"fit-column line-number-col-left\">{{ row.leftContent?.lineNumber }}</td>\n                  <td scope=\"row\" class=\"fit-column line-number-col\">{{ row.rightContent?.lineNumber }}</td>\n                  <td\n                    class=\"fit-column prefix-col\"\n                    [ngClass]=\"{ 'delete-row': row.leftContent?.prefix === '-', 'insert-row': row.rightContent?.prefix === '+' }\"\n                    >\n                    <span>{{ row.leftContent?.prefix || row.rightContent?.prefix || ' ' }}</span>\n                  </td>\n                  @if (!row.hasDiffs) {\n                    <td\n                      class=\"content-col\"\n                      [ngClass]=\"{ 'delete-row': row.leftContent?.prefix === '-', 'insert-row': row.rightContent?.prefix === '+' }\"\n                      >\n                      <span [innerHTML]=\"row.leftContent?.lineContent | formatLine\"></span>\n                    </td>\n                  }\n                  @if (row.hasDiffs && row.leftContent && row.leftContent?.lineDiffs.length !== 0) {\n                    <td\n                      class=\"content-col\"\n                      [ngClass]=\"{ 'delete-row': row.leftContent?.prefix === '-', 'insert-row': row.rightContent?.prefix === '+' }\"\n                      >\n                      @for (diff of row.leftContent?.lineDiffs; track trackDiffs($index, diff)) {\n                        <span\n                          [innerHTML]=\"diff.content | formatLine\"\n                          [ngClass]=\"{ highlight: diff.isDiff }\"\n                        ></span>\n                      }\n                    </td>\n                  }\n                  @if (row.hasDiffs && row.rightContent && row.rightContent?.lineDiffs.length !== 0) {\n                    <td\n                      class=\"content-col\"\n                      [ngClass]=\"{ 'delete-row': row.leftContent?.prefix === '-', 'insert-row': row.rightContent?.prefix === '+' }\"\n                      >\n                      @for (diff of row.rightContent?.lineDiffs; track trackDiffs($index, diff)) {\n                        <span\n                          [innerHTML]=\"diff.content | formatLine\"\n                          [ngClass]=\"{ highlight: diff.isDiff }\"\n                        ></span>\n                      }\n                    </td>\n                  }\n                </tr>\n              }\n            </tbody>\n          </table>\n        </div>\n      }\n    </div>\n  </div>\n}\n","import { NgModule } from '@angular/core';\r\nimport { NgxTextDiffComponent } from './ngx-text-diff.component';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { LoaderSpinnerComponent } from './loader-spinner/loader-spinner.component';\r\nimport { FormatLinePipe } from './format-line.pipe';\r\nimport { ContainerDirective } from './ngx-text-diff-container.directive';\r\nimport { ScrollingModule } from '@angular/cdk/scrolling';\r\n\r\n@NgModule({\r\n  imports: [CommonModule, FormsModule, ScrollingModule],\r\n  declarations: [NgxTextDiffComponent, LoaderSpinnerComponent, FormatLinePipe, ContainerDirective],\r\n  exports: [NgxTextDiffComponent],\r\n})\r\nexport class NgxTextDiffModule {}\r\n","/*\r\n * Public API Surface of ngx-text-diff\r\n */\r\n\r\nexport * from './lib/ngx-text-diff.service';\r\nexport * from './lib/ngx-text-diff.component';\r\nexport * from './lib/ngx-text-diff.module';\r\nexport * from './lib/ngx-text-diff.model';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["i2.NgxTextDiffService","i5.LoaderSpinnerComponent","i6.ContainerDirective","i7.FormatLinePipe"],"mappings":"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"}