2022-01-04 17:00:25 +08:00
|
|
|
import { codeFrameColumns } from "@babel/code-frame";
|
2025-04-09 08:12:22 +08:00
|
|
|
import indexToPosition from "index-to-position";
|
2020-12-21 17:09:20 +08:00
|
|
|
const codeFrameColumnsOptions = {
|
|
|
|
|
linesAbove: Number.POSITIVE_INFINITY,
|
|
|
|
|
linesBelow: Number.POSITIVE_INFINITY,
|
|
|
|
|
};
|
2020-05-28 01:16:52 +08:00
|
|
|
|
2025-09-26 18:06:14 +08:00
|
|
|
const locationForRange = (text, range) => {
|
|
|
|
|
const [start, end] = [...range]
|
|
|
|
|
.sort((indexA, indexB) => indexA - indexB)
|
|
|
|
|
.map((index) => indexToPosition(text, index, { oneBased: true }));
|
2020-05-28 01:16:52 +08:00
|
|
|
|
2025-04-09 08:12:22 +08:00
|
|
|
if (start.line !== end.line) {
|
|
|
|
|
end.column -= 1;
|
2020-05-28 01:16:52 +08:00
|
|
|
}
|
|
|
|
|
|
2025-09-26 18:06:14 +08:00
|
|
|
return { start, end };
|
2020-05-28 01:16:52 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const visualizeRange = (text, { rangeStart = 0, rangeEnd = text.length }) =>
|
|
|
|
|
codeFrameColumns(
|
|
|
|
|
text,
|
2025-09-26 18:06:14 +08:00
|
|
|
locationForRange(text, [rangeStart, rangeEnd]),
|
2020-11-30 12:29:48 +08:00
|
|
|
rangeStart > rangeEnd
|
|
|
|
|
? { ...codeFrameColumnsOptions, message: "[Reversed range]" }
|
|
|
|
|
: codeFrameColumnsOptions,
|
2020-05-28 01:16:52 +08:00
|
|
|
);
|
|
|
|
|
|
2022-01-04 17:00:25 +08:00
|
|
|
export default visualizeRange;
|