prettylint
Version:
Run Prettier as a linter
52 lines (51 loc) • 1.97 kB
JavaScript
import { LinesAndColumns } from "lines-and-columns";
import * as utils from "prettier-linter-helpers";
export var Operation;
(function (Operation) {
Operation[Operation["Delete"] = 0] = "Delete";
Operation[Operation["Insert"] = 1] = "Insert";
Operation[Operation["Replace"] = 2] = "Replace";
})(Operation || (Operation = {}));
export function diagnose(input, output) {
return utils
.generateDifferences(input, output)
.map((difference) => {
const { offset: startOffset, deleteText = "", insertText = "", } = difference;
const endOffset = startOffset + deleteText.length;
const insertCode = utils.showInvisibles(insertText);
const deleteCode = utils.showInvisibles(deleteText);
let message;
let operation;
switch (difference.operation) {
case "delete":
operation = Operation.Delete;
message = `Delete \`${deleteCode}\``;
break;
case "insert":
operation = Operation.Insert;
message = `Insert \`${insertCode}\``;
break;
case "replace":
operation = Operation.Replace;
message = `Replace \`${deleteCode}\` with \`${insertCode}\``;
break;
/* c8 ignore start */
default:
throw new Error(`Unexpected operation '${difference.operation}'`);
/* c8 ignore stop */
}
const locator = new LinesAndColumns(input);
const getLocation = (offset) => {
const { line, column } = locator.locationForIndex(offset);
return { line: line + 1, column: column + 1, offset };
};
return {
start: getLocation(startOffset),
end: getLocation(endOffset),
message,
operation,
insertText: insertText,
deleteText: deleteText,
};
});
}