UNPKG

@contextjs/system

Version:
81 lines (80 loc) 3.46 kB
import readline from 'node:readline'; import { styleText } from 'node:util'; import { ObjectExtensions } from "../extensions/object.extensions.js"; import { ConsoleArgument } from "../models/console-argument.js"; export class Console { static output = console.log; static parseArguments(args) { const parsedArguments = []; if (args.length === 0) return parsedArguments; let currentArgument = null; for (const argument of args) { if (argument.startsWith("--") && argument.includes("=")) { const [name, ...rest] = argument.split("="); const value = rest.join("="); const existing = parsedArguments.find(a => a.name === name); if (existing) existing.values.push(value); else parsedArguments.push(new ConsoleArgument(name, [value])); currentArgument = null; continue; } if (argument.startsWith("-")) { if (!this.isValidArgument(argument)) { this.writeLineError(`Invalid argument: "${argument}".`); this.writeLineWarning("Arguments must start with a single or double dash and be followed by a name."); process.exit(1); } const existing = parsedArguments.find(a => a.name === argument); if (existing) currentArgument = existing; else { currentArgument = new ConsoleArgument(argument, []); parsedArguments.push(currentArgument); } } else { if (ObjectExtensions.isNullOrUndefined(currentArgument)) { currentArgument = new ConsoleArgument(argument, []); parsedArguments.push(currentArgument); } else currentArgument.values.push(argument); } } return parsedArguments; } static writeLineError(message, ...messages) { this.writeLineFormatted({ format: 'red', text: message }, ...messages.map(m => ({ format: 'red', text: m }))); } static writeLineWarning(message, ...messages) { this.writeLineFormatted({ format: 'yellow', text: message }, ...messages.map(m => ({ format: 'yellow', text: m }))); } static writeLineInfo(message, ...messages) { this.writeLineFormatted({ format: 'blue', text: message }, ...messages.map(m => ({ format: 'blue', text: m }))); } static writeLineSuccess(message, ...messages) { this.writeLineFormatted({ format: 'green', text: message }, ...messages.map(m => ({ format: 'green', text: m }))); } static writeLine(message, ...messages) { this.output(message, ...messages); } static writeLineFormatted(message, ...messages) { this.output(styleText(message.format, message.text), ...messages.map(m => styleText(m.format, m.text))); } static removeLastLine() { readline.moveCursor(process.stdout, 0, -1); readline.clearLine(process.stdout, 1); } static setOutput(writer) { this.output = writer; } static resetOutput() { this.output = console.log; } static isValidArgument(arg) { return (arg[1] === '-' && arg.length > 2) || (arg[1] !== '-' && arg.length === 2); } }