|
|
import { TextWriterBase } from "../text/TextWriterBase";
|
|
|
import { isNull, isNullOrEmptyString, isPrimitive } from "../safe";
|
|
|
import { NullConsole } from "./NullConsole";
|
|
|
|
|
|
interface LogConsole {
|
|
|
debug(...args: any[]): void;
|
|
|
log(...args: any[]): void;
|
|
|
warn(...args: any[]): void;
|
|
|
error(...args: any[]): void;
|
|
|
}
|
|
|
|
|
|
function hasConsole() {
|
|
|
try {
|
|
|
// tslint:disable-next-line:no-console
|
|
|
return (typeof console !== "undefined" && typeof console.log === "function");
|
|
|
} catch {
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
function getConsole() {
|
|
|
return hasConsole() ? console : NullConsole.instance;
|
|
|
}
|
|
|
|
|
|
export class ConsoleWriter extends TextWriterBase {
|
|
|
static readonly default = new ConsoleWriter(getConsole());
|
|
|
|
|
|
private _buffer: any[];
|
|
|
|
|
|
private _out: LogConsole;
|
|
|
private _level: keyof LogConsole;
|
|
|
|
|
|
constructor(out?: LogConsole) {
|
|
|
super();
|
|
|
this._out = out || NullConsole.instance;
|
|
|
this._buffer = [];
|
|
|
this._level = "log";
|
|
|
}
|
|
|
|
|
|
getLogLevel() {
|
|
|
return this._level;
|
|
|
}
|
|
|
|
|
|
setLogLevel(level: keyof LogConsole) {
|
|
|
this._level = level;
|
|
|
}
|
|
|
|
|
|
/** Flushes the buffer to the console
|
|
|
*/
|
|
|
writeNewLine() {
|
|
|
// group text chunks together, and let objects as is
|
|
|
// ['a', 'b', {foo: 'bar'}, 'c', 'd'] -> ['ab', {foo: 'bar'}, 'cd']
|
|
|
// this will prevent from additional spaces to occur in the console
|
|
|
// ['a', 'b'] will be printed as 'a b' rather then 'ab'.
|
|
|
|
|
|
// console.log("writeLine", this._buffer);
|
|
|
|
|
|
let offset = 0;
|
|
|
const args = [];
|
|
|
this._buffer.forEach((v, i) => {
|
|
|
if (!isPrimitive(v)) {
|
|
|
if (offset < i)
|
|
|
args.push(i - offset > 1 ? this._buffer.slice(offset, i).join("") : this._buffer[offset]);
|
|
|
args.push(v);
|
|
|
offset = i + 1;
|
|
|
}
|
|
|
});
|
|
|
if (offset < this._buffer.length)
|
|
|
args.push(this._buffer.slice(offset).join(""));
|
|
|
|
|
|
// console.log("WriteLine", args);
|
|
|
|
|
|
this._out[this._level].apply(this._out, args);
|
|
|
|
|
|
this._buffer = [];
|
|
|
}
|
|
|
|
|
|
/** Adds a text chunk to the buffer. Buffer contents will be flushed when
|
|
|
* the end of line will be printed.
|
|
|
*
|
|
|
* @param text The text to be added to the buffer.
|
|
|
*/
|
|
|
writeText(text: string) {
|
|
|
this._buffer.push(text);
|
|
|
}
|
|
|
|
|
|
/** Wrotes the specified value to the buffer.
|
|
|
*
|
|
|
* @param value The value to be added to the buffer
|
|
|
* @param spec The instructions how to format the value, is this parameter
|
|
|
* is ommited the raw value will be added to the buffer and
|
|
|
* passed directly to the console out.
|
|
|
*/
|
|
|
writeValue(value: any, spec?: string) {
|
|
|
if (isNullOrEmptyString(spec))
|
|
|
this._buffer.push(value);
|
|
|
else
|
|
|
super.writeValue(value, spec);
|
|
|
}
|
|
|
}
|
|
|
|