UNPKG

@cowwoc/requirements

Version:

A fluent API for enforcing design contracts with automatic message generation.

93 lines 3.83 kB
/* * Copyright (c) 2016 Gili Tzabari * Licensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0 */ import { AbstractDiffWriter, IllegalStateError, DIFF_EQUAL, DIFF_DELETE, DIFF_INSERT, appendToValue, sortByKeys } from "../../internal.mjs"; /** * A diff writer that does not use ANSI escape codes. */ class TextOnly extends AbstractDiffWriter { /** * A padding character used to align values vertically. */ static DIFF_PADDING = " "; lineToDiffLine = new Map(); diffLines = []; constructor() { super(TextOnly.DIFF_PADDING); this.addActualLine(0); this.addExpectedLine(0); } addActualLine(number) { super.addActualLine(number); this.addDiffLine(number); } addExpectedLine(number) { super.addExpectedLine(number); this.addDiffLine(number); } addDiffLine(number) { if (this.lineToDiffLine.get(number) === undefined) this.lineToDiffLine.set(number, ""); } writeEqual(text) { if (this.flushed) throw new IllegalStateError("Writer was already flushed"); if (text.length === 0) return; this.splitLines(text, (line) => { appendToValue(this.lineToActualLine, this.actualLineNumber, line); const length = line.length; if (this.expectedLineNumber === this.actualLineNumber) appendToValue(this.lineToDiffLine, this.actualLineNumber, DIFF_EQUAL.repeat(length)); else { const paddingMarker = this.getPaddingMarker(); appendToValue(this.lineToExpectedLine, this.actualLineNumber, paddingMarker.repeat(length)); appendToValue(this.lineToDiffLine, this.actualLineNumber, DIFF_EQUAL.repeat(length)); appendToValue(this.lineToActualLine, this.expectedLineNumber, paddingMarker.repeat(length)); appendToValue(this.lineToDiffLine, this.expectedLineNumber, DIFF_EQUAL.repeat(length)); } appendToValue(this.lineToExpectedLine, this.expectedLineNumber, line); }); } writeDeleted(text) { if (this.flushed) throw new IllegalStateError("Writer was already flushed"); if (text.length === 0) return; this.splitLines(text, (line) => { appendToValue(this.lineToActualLine, this.actualLineNumber, line); const length = line.length; appendToValue(this.lineToDiffLine, this.actualLineNumber, DIFF_DELETE.repeat(length)); appendToValue(this.lineToExpectedLine, this.actualLineNumber, this.getPaddingMarker().repeat(length)); this.lineToEqualLine.set(this.actualLineNumber, false); }); } writeInserted(text) { if (this.flushed) throw new IllegalStateError("Writer was already flushed"); if (text.length === 0) return; this.splitLines(text, (line) => { const length = line.length; appendToValue(this.lineToActualLine, this.expectedLineNumber, this.getPaddingMarker().repeat(length)); appendToValue(this.lineToDiffLine, this.expectedLineNumber, DIFF_INSERT.repeat(length)); appendToValue(this.lineToExpectedLine, this.expectedLineNumber, line); this.lineToEqualLine.set(this.expectedLineNumber, false); }); } beforeFlush() { } afterFlush() { for (const diffLine of sortByKeys(this.lineToDiffLine).values()) this.diffLines.push(diffLine); Object.freeze(this.diffLines); } getDiffLines() { if (!this.flushed) throw new RangeError("Writer must be flushed"); return this.diffLines; } } export { TextOnly }; //# sourceMappingURL=TextOnly.mjs.map