@cowwoc/requirements
Version:
A fluent API for enforcing design contracts with automatic message generation.
93 lines • 3.83 kB
JavaScript
/*
* 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