Files
2026-02-13 22:02:30 +01:00

442 lines
15 KiB
JavaScript

import {
Parser,
wordWrap
} from "../../chunk-26HALFTP.js";
// formatters/console/themes.ts
import useColors from "@poppinss/colors";
import supportsColor from "supports-color";
var colors = supportsColor.stdout ? useColors.ansi() : useColors.silent();
var themes = {
default: {
braces: (value) => colors.yellow(value),
brackets: (value) => colors.yellow(value),
number: (value) => colors.yellow(value),
bigInt: (value) => colors.yellow().bold(value),
boolean: (value) => colors.yellow().italic(value),
string: (value) => colors.green(value),
null: (value) => colors.dim(value),
undefined: (value) => colors.dim(value),
prototypeLabel: (value) => colors.dim(value),
symbol: (value) => colors.magenta(value),
regex: (value) => colors.red(value),
date: (value) => colors.magenta(value),
buffer: (value) => colors.magenta(value),
functionLabel: (value) => colors.cyan().italic(value),
arrayLabel: (value) => colors.cyan(value),
objectLabel: (value) => colors.cyan(value),
mapLabel: (value) => colors.cyan(value),
setLabel: (value) => colors.cyan(value),
objectKey: (value) => colors.blue(value),
objectKeyPrefix: (value) => colors.dim(value),
classLabel: (value) => colors.cyan(value),
weakSetLabel: (value) => colors.cyan(value),
weakRefLabel: (value) => colors.cyan(value),
collapseLabel: (value) => colors.dim(value),
circularLabel: (value) => colors.cyan(value),
getterLabel: (value) => colors.cyan(value),
weakMapLabel: (value) => colors.cyan(value),
observableLabel: (value) => colors.cyan(value),
promiseLabel: (value) => colors.blue(value),
generatorLabel: (value) => colors.cyan(value),
blobLabel: (value) => colors.magenta(value),
unknownLabel: (value) => colors.magenta(value)
}
};
// formatters/console/printers/main.ts
function openingBrace(formatter) {
return formatter.styles.braces("{");
}
function closingBrace(formatter) {
return formatter.styles.braces("}");
}
function openingBrackets(formatter) {
return formatter.styles.brackets("[");
}
function closingBrackets(formatter) {
return formatter.styles.brackets("]");
}
var ConsolePrinters = {
"collapse": (token, formatter) => {
const styles = token.token.type === "object-start" ? formatter.styles.objectLabel : formatter.styles.arrayLabel;
const collpaseStyles = formatter.styles.collapseLabel;
return `${styles(token.name)} ` + (token.token.type === "object-start" ? openingBrace(formatter) : openingBrackets(formatter)) + ` ${collpaseStyles("collpased")} ` + (token.token.type === "object-start" ? closingBrace(formatter) : closingBrackets(formatter));
},
"object-start": (token, formatter) => {
formatter.indentation.increment();
const styles = formatter.styles.objectLabel;
const label = formatter.context.isStaticMember && formatter.context.staticDepth === 0 || token.constructorName === "Object" ? "" : styles(`${token.constructorName || "Object [null]"}`) + " ";
return label + openingBrace(formatter);
},
"object-end": (_, formatter) => {
formatter.indentation.decrement();
const indent = `${formatter.newLine}${formatter.indentation.getSpaces()}`;
return indent + closingBrace(formatter);
},
"object-key": (token, formatter) => {
formatter.context.isStack = token.value === "stack";
const styles = formatter.styles.objectKey;
const indent = `${formatter.newLine}${formatter.indentation.getSpaces()}`;
let value = token.value;
if (token.isSymbol) {
value = `[${value}]`;
}
let prefix = "";
if (formatter.context.isStaticMember) {
formatter.context.staticDepth++;
if (formatter.context.staticDepth === 1) {
const prefixStyles = formatter.styles.objectKeyPrefix;
prefix = `${prefixStyles("static")} `;
}
}
return indent + prefix + styles(value) + ": ";
},
"object-circular-ref": (_, formatter) => {
const styles = formatter.styles.circularLabel;
return styles("[*Circular]");
},
"object-max-depth-ref": (_, formatter) => {
const styles = formatter.styles.objectLabel;
return styles("[Object]");
},
"object-value-getter": (_, formatter) => {
const styles = formatter.styles.getterLabel;
return styles("[Getter]");
},
"object-value-start": () => {
return "";
},
"object-value-end": (_, formatter) => {
if (formatter.context.isStaticMember) {
formatter.context.staticDepth--;
}
return `,`;
},
"array-start": (token, formatter) => {
formatter.indentation.increment();
const styles = formatter.styles.arrayLabel;
const label = token.name !== "Array" ? styles(`${token.name}`) + " " : "";
return label + openingBrackets(formatter);
},
"array-end": (_, formatter) => {
formatter.indentation.decrement();
const indent = `${formatter.newLine}${formatter.indentation.getSpaces()}`;
return indent + closingBrackets(formatter);
},
"array-value-start": (_, formatter) => {
const indent = `${formatter.newLine}${formatter.indentation.getSpaces()}`;
return indent;
},
"array-value-hole": (_, formatter) => {
const indent = `${formatter.newLine}${formatter.indentation.getSpaces()}`;
const styles = formatter.styles.undefined;
return indent + styles("<hole>") + ",";
},
"array-value-end": () => {
return `,`;
},
"array-circular-ref": (_, formatter) => {
const styles = formatter.styles.circularLabel;
return styles("[*Circular]");
},
"array-max-depth-ref": (_, formatter) => {
const styles = formatter.styles.arrayLabel;
return styles("[Array]");
},
"array-max-length-ref": (token, formatter) => {
const indent = `${formatter.newLine}${formatter.indentation.getSpaces()}`;
const styles = formatter.styles.arrayLabel;
const itemsLeft = token.size - token.limit;
if (itemsLeft <= 0) {
return "";
}
const label = itemsLeft === 1 ? `1 more item` : `${itemsLeft} more items`;
return indent + styles(`[...${label}]`);
},
"prototype-start": (_, formatter) => {
const indent = `${formatter.newLine}${formatter.indentation.getSpaces()}`;
formatter.indentation.increment();
const styles = formatter.styles.prototypeLabel;
const label = "[[Prototype]] ";
return indent + styles(label) + openingBrace(formatter);
},
"prototype-end": (_, formatter) => {
formatter.indentation.decrement();
const indent = `${formatter.newLine}${formatter.indentation.getSpaces()}`;
return indent + closingBrace(formatter);
},
"map-start": (token, formatter) => {
formatter.indentation.increment();
const styles = formatter.styles.mapLabel;
const label = `Map(${token.size}) `;
return styles(label) + openingBrace(formatter);
},
"map-end": (_, formatter) => {
formatter.indentation.decrement();
const indent = `${formatter.newLine}${formatter.indentation.getSpaces()}`;
return indent + closingBrace(formatter);
},
"map-row-start": (_, formatter) => {
const indent = `${formatter.newLine}${formatter.indentation.getSpaces()}`;
formatter.indentation.increment();
return indent + openingBrackets(formatter);
},
"map-row-end": (_, formatter) => {
formatter.indentation.decrement();
const indent = `${formatter.newLine}${formatter.indentation.getSpaces()}`;
return indent + closingBrackets(formatter) + `,`;
},
"map-key-start": (_, formatter) => {
const styles = formatter.styles.objectKey;
const indent = `${formatter.newLine}${formatter.indentation.getSpaces()}`;
return indent + styles("key") + ": ";
},
"map-key-end": function() {
return ",";
},
"map-value-start": (_, formatter) => {
const styles = formatter.styles.objectKey;
const indent = `${formatter.newLine}${formatter.indentation.getSpaces()}`;
return indent + styles("value") + ": ";
},
"map-value-end": function() {
return ",";
},
"map-circular-ref": (_, formatter) => {
const styles = formatter.styles.circularLabel;
return styles("[*Circular]");
},
"map-max-depth-ref": (_, formatter) => {
const styles = formatter.styles.mapLabel;
return styles("[Map]");
},
"map-max-length-ref": (token, formatter) => {
const styles = formatter.styles.mapLabel;
const itemsLeft = token.size - token.limit;
if (itemsLeft <= 0) {
return "";
}
const label = itemsLeft === 1 ? `1 more item` : `${itemsLeft} more items`;
return styles(`[...${label}]`);
},
"set-start": (token, formatter) => {
formatter.indentation.increment();
const styles = formatter.styles.setLabel;
const label = `Set(${token.size}) `;
return styles(label) + openingBrackets(formatter);
},
"set-end": (_, formatter) => {
formatter.indentation.decrement();
const indent = `${formatter.newLine}${formatter.indentation.getSpaces()}`;
return indent + closingBrackets(formatter);
},
"set-value-start": (_, formatter) => {
const indent = `${formatter.newLine}${formatter.indentation.getSpaces()}`;
return indent;
},
"set-value-end": () => {
return `,`;
},
"set-circular-ref": (_, formatter) => {
const styles = formatter.styles.circularLabel;
return styles("[*Circular]");
},
"set-max-depth-ref": (_, formatter) => {
const styles = formatter.styles.setLabel;
return styles("[Set]");
},
"set-max-length-ref": (token, formatter) => {
const indent = `${formatter.newLine}${formatter.indentation.getSpaces()}`;
const styles = formatter.styles.setLabel;
const itemsLeft = token.size - token.limit;
if (itemsLeft <= 0) {
return "";
}
const label = itemsLeft === 1 ? `1 more item` : `${itemsLeft} more items`;
return indent + styles(`[...${label}]`);
},
"string": (token, formatter) => {
let value = token.value;
const indent = formatter.indentation.getSpaces();
if (formatter.context.isStack) {
value = token.value.split("\n").map((row, index) => {
let rowValue = row.trim();
if (index > 0) {
rowValue = `${indent}${rowValue}`;
}
return rowValue;
}).join("\n");
} else {
value = wordWrap(token.value, {
newLine: formatter.newLine,
indent: formatter.indentation.getSpaces(),
width: 70,
escape: (line) => line
});
}
const styles = formatter.styles.string;
return styles(value);
},
"boolean": (token, formatter) => {
const styles = formatter.styles.boolean;
return styles(String(token.value));
},
"number": (token, formatter) => {
const styles = formatter.styles.number;
return styles(String(token.value));
},
"bigInt": (token, formatter) => {
const styles = formatter.styles.bigInt;
return styles(token.value);
},
"undefined": (_, formatter) => {
const styles = formatter.styles.undefined;
return styles("undefined");
},
"null": (_, formatter) => {
const styles = formatter.styles.null;
return styles("null");
},
"symbol": (token, formatter) => {
const styles = formatter.styles.symbol;
return styles(token.value);
},
"function": (token, formatter) => {
const styles = token.isClass ? formatter.styles.classLabel : formatter.styles.functionLabel;
const async = token.isAsync ? `async ` : "";
const generator = token.isGenerator ? `*` : "";
const label = token.isClass ? `[class ${token.name}]` : `[${async}${generator}function ${token.name}]`;
return styles(label);
},
"date": function(token, formatter) {
const styles = formatter.styles.date;
return styles(token.value);
},
"buffer": function(token, formatter) {
const styles = formatter.styles.buffer;
return styles(token.value);
},
"regexp": function(token, formatter) {
const styles = formatter.styles.regex;
return styles(token.value);
},
"unknown": function(token, formatter) {
const styles = formatter.styles.unknownLabel;
return styles(String(token.value));
},
"weak-set": function(_, formatter) {
const styles = formatter.styles.weakSetLabel;
return styles("[WeakSet]");
},
"weak-ref": function(_, formatter) {
const styles = formatter.styles.weakRefLabel;
return styles("[WeakRef]");
},
"weak-map": function(_, formatter) {
const styles = formatter.styles.weakMapLabel;
return styles("[WeakMap]");
},
"observable": function(_, formatter) {
const styles = formatter.styles.observableLabel;
return styles("[Observable]");
},
"blob": function(token, formatter) {
const styles = formatter.styles.objectLabel;
const sizeProp = formatter.styles.objectKey("size: ");
const sizeValue = formatter.styles.number(`${token.size}`);
const typeProp = token.contentType ? `, ${formatter.styles.objectKey("type: ")}` : "";
const typeValue = token.contentType ? formatter.styles.string(`${token.contentType}`) : "";
return styles("[Blob]") + " " + openingBrace(formatter) + `${sizeProp}${sizeValue}${typeProp}${typeValue}` + closingBrace(formatter);
},
"promise": function(token, formatter) {
const styles = formatter.styles.promiseLabel;
const label = token.isFulfilled ? "resolved" : "pending";
return styles(`[Promise${`<${label}>`}]`);
},
"generator": function(token, formatter) {
const styles = formatter.styles.generatorLabel;
const label = token.isAsync ? "[AsyncGenerator] {}" : "[Generator] {}";
return styles(label);
},
"static-members-start": function(_, formatter) {
formatter.context.isStaticMember = true;
formatter.context.staticDepth = 0;
return " ";
},
"static-members-end": function(_, formatter) {
formatter.context.isStaticMember = false;
formatter.context.staticDepth = 0;
return "";
}
};
// formatters/console/formatter.ts
var ConsoleFormatter = class {
/**
* Styles for output elements
*/
styles;
/**
* Context maintained through out the printing
* phase. Each instance has its own context
* that gets mutated internally.
*/
context;
/**
* Value for the newline character
*/
newLine = "\n";
/**
* Utility to manage indentation
*/
indentation = {
counter: 0,
/**
* Increment the identation by 1 step
*/
increment() {
this.counter++;
},
/**
* Decrement the identation by 1 step
*/
decrement() {
this.counter--;
},
/**
* Get the identation spaces as per the current
* identation level
*/
getSpaces() {
return new Array(this.counter * 2 + 1).join(" ");
}
};
constructor(config, context) {
this.context = context || {};
this.styles = Object.freeze({ ...themes.default, ...config?.styles });
}
/**
* Format a collection of tokens to ANSI output
*/
format(tokens) {
return tokens.map((token) => {
const formatter = ConsolePrinters[token.type];
return formatter(token, this) || "";
}).join("");
}
};
// formatters/console/main.ts
function dump(value, config) {
const parser = new Parser(config);
parser.parse(value);
return new ConsoleFormatter(config).format(parser.flush());
}
export {
ConsoleFormatter,
ConsolePrinters,
dump,
themes
};