summaryrefslogtreecommitdiff
path: root/node_modules/sucrase/dist/esm/util/formatTokens.js
diff options
context:
space:
mode:
authorPhilipp Tanlak <philipp.tanlak@gmail.com>2025-11-24 20:54:57 +0100
committerPhilipp Tanlak <philipp.tanlak@gmail.com>2025-11-24 20:57:48 +0100
commitb1e2c8fd5cb5dfa46bc440a12eafaf56cd844b1c (patch)
tree49d360fd6cbc6a2754efe93524ac47ff0fbe0f7d /node_modules/sucrase/dist/esm/util/formatTokens.js
Docs
Diffstat (limited to 'node_modules/sucrase/dist/esm/util/formatTokens.js')
-rw-r--r--node_modules/sucrase/dist/esm/util/formatTokens.js74
1 files changed, 74 insertions, 0 deletions
diff --git a/node_modules/sucrase/dist/esm/util/formatTokens.js b/node_modules/sucrase/dist/esm/util/formatTokens.js
new file mode 100644
index 0000000..eea07d2
--- /dev/null
+++ b/node_modules/sucrase/dist/esm/util/formatTokens.js
@@ -0,0 +1,74 @@
+import LinesAndColumns from "lines-and-columns";
+
+
+import {formatTokenType} from "../parser/tokenizer/types";
+
+export default function formatTokens(code, tokens) {
+ if (tokens.length === 0) {
+ return "";
+ }
+
+ const tokenKeys = Object.keys(tokens[0]).filter(
+ (k) => k !== "type" && k !== "value" && k !== "start" && k !== "end" && k !== "loc",
+ );
+ const typeKeys = Object.keys(tokens[0].type).filter((k) => k !== "label" && k !== "keyword");
+
+ const headings = ["Location", "Label", "Raw", ...tokenKeys, ...typeKeys];
+
+ const lines = new LinesAndColumns(code);
+ const rows = [headings, ...tokens.map(getTokenComponents)];
+ const padding = headings.map(() => 0);
+ for (const components of rows) {
+ for (let i = 0; i < components.length; i++) {
+ padding[i] = Math.max(padding[i], components[i].length);
+ }
+ }
+ return rows
+ .map((components) => components.map((component, i) => component.padEnd(padding[i])).join(" "))
+ .join("\n");
+
+ function getTokenComponents(token) {
+ const raw = code.slice(token.start, token.end);
+ return [
+ formatRange(token.start, token.end),
+ formatTokenType(token.type),
+ truncate(String(raw), 14),
+ // @ts-ignore: Intentional dynamic access by key.
+ ...tokenKeys.map((key) => formatValue(token[key], key)),
+ // @ts-ignore: Intentional dynamic access by key.
+ ...typeKeys.map((key) => formatValue(token.type[key], key)),
+ ];
+ }
+
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
+ function formatValue(value, key) {
+ if (value === true) {
+ return key;
+ } else if (value === false || value === null) {
+ return "";
+ } else {
+ return String(value);
+ }
+ }
+
+ function formatRange(start, end) {
+ return `${formatPos(start)}-${formatPos(end)}`;
+ }
+
+ function formatPos(pos) {
+ const location = lines.locationForIndex(pos);
+ if (!location) {
+ return "Unknown";
+ } else {
+ return `${location.line + 1}:${location.column + 1}`;
+ }
+ }
+}
+
+function truncate(s, length) {
+ if (s.length > length) {
+ return `${s.slice(0, length - 3)}...`;
+ } else {
+ return s;
+ }
+}