Asper Header  1.0.14
The header injector extension
Loading...
Searching...
No Matches
logger.ts
Go to the documentation of this file.
1
79import * as vscode from 'vscode';
80import { CodeConfig } from "./processConfiguration";
81import { moduleName } from '../constants';
82
116
144 getCorrectPrefix(info: boolean, warning: boolean, error: boolean, debug: boolean): string {
145 if (info) {
146 return "INFO: ";
147 } else if (warning) {
148 return "WARNING: ";
149 } else if (error) {
150 return "ERROR: ";
151 } else if (debug) {
152 return "DEBUG: ";
153 } else {
154 return "";
155 }
156 }
157
185 getDatetime(): string {
186 let date: Date = new Date();
187 let finalString: string = "[";
188 finalString += date.getDate() + "-";
189 finalString += (date.getMonth() + 1) + "-";
190 finalString += date.getFullYear() + " ";
191 finalString += date.getHours() + ":";
192 finalString += date.getMinutes() + ":";
193 finalString += date.getSeconds() + ".";
194 finalString += date.getMilliseconds();
195 finalString += "]";
196 return finalString;
197 }
198
234 getParentCaller(searchDepth: number = 2): string | undefined {
235 const stack = new Error().stack;
236 if (!stack) {
237 return undefined;
238 }
239
240 const lines = stack.split("\n").map(line => line.trim());
241
242 // Ensure the requested search depth exists in the stack
243 if (lines.length > searchDepth) {
244 const match = lines[searchDepth].match(/at (\w+)/);
245 if (match) {
246 return match[1];
247 }
248 }
249
250 return undefined;
251 }
252
276 debugEnabled(): boolean {
277 return CodeConfig.get("enableDebug");
278 }
279
311 checkIfExtensionInstalled(context: vscode.ExtensionContext | undefined): boolean {
312 if (context === undefined) {
313 return process.env.VSCODE_DEBUG_MODE?.toLocaleLowerCase() === 'true';
314 }
315 if (context.extensionMode === vscode.ExtensionMode.Development) {
316 console.log("Running in debug/development mode");
317 return false;
318 } else if (context.extensionMode === vscode.ExtensionMode.Test) {
319 console.log("Running in test mode");
320 return false;
321 } else {
322 console.log("Running in production (installed) mode");
323 return true;
324 }
325 }
326
327 packageForUnsafe(message: string, info: boolean, warning: boolean, error: boolean, debug: boolean): string {
328 const datetime: string = this.getDatetime();
329 const correctPrefix: string = this.getCorrectPrefix(info, warning, error, debug);
330 return `${datetime} ${moduleName}:initialising ${correctPrefix} '${message}'`;
331 }
332}
333
373class Gui {
375 private LI: LoggerInternals;
376 private fullyLoaded: boolean = false;
377
386 constructor(loggerInternals: LoggerInternals, fullyLoaded: boolean = false) {
387 this.LI = loggerInternals;
388 this.fullyLoaded = fullyLoaded;
389 }
390
409 updateLoadStatus(fullyLoaded: boolean = true): void {
410 this.fullyLoaded = fullyLoaded;
411 }
422 info<T extends string>(message: string, ...items: T[]): Thenable<T | undefined> {
423 if (!this.fullyLoaded) {
424 console.log(this.LI.packageForUnsafe(message, true, false, false, false));
425 return Promise.resolve(undefined);
426 }
427 let final: string = "";
428 final += CodeConfig.get("extensionName") + " ";
429 final += this.LI.getCorrectPrefix(true, false, false, false);
430 final += " '" + message + "'";
431 return vscode.window.showInformationMessage<T>(message, ...items);
432 }
433
444 warning<T extends string>(message: string, ...items: T[]): Thenable<T | undefined> {
445 if (!this.fullyLoaded) {
446 console.warn(this.LI.packageForUnsafe(message, false, true, false, false));
447 return Promise.resolve(undefined);
448 }
449 let final: string = "";
450 final += this.LI.getDatetime() + " ";
451 final += CodeConfig.get("extensionName") + " ";
452 final += this.LI.getCorrectPrefix(false, true, false, false);
453 final += " '" + message + "'";
454 return vscode.window.showWarningMessage<T>(message, ...items);
455 }
456
467 error<T extends string>(message: string, ...items: T[]): Thenable<T | undefined> {
468 if (!this.fullyLoaded) {
469 console.error(this.LI.packageForUnsafe(message, false, false, true, false));
470 return Promise.resolve(undefined);
471 }
472 let final: string = "";
473 final += this.LI.getDatetime() + " ";
474 final += CodeConfig.get("extensionName") + " ";
475 final += this.LI.getCorrectPrefix(false, false, true, false);
476 final += " '" + message + "'";
477 return vscode.window.showErrorMessage<T>(message, ...items);
478 }
479
491 debug<T extends string>(message: string, ...items: T[]): Thenable<T | undefined> {
492 if (!this.fullyLoaded) {
493 return Promise.resolve(undefined);
494 }
495 if (!this.LI.debugEnabled()) {
496 console.log(this.LI.packageForUnsafe(message, false, false, false, true));
497 return Promise.resolve(undefined);
498 }
499 let final: string = "";
500 final += this.LI.getDatetime() + " ";
501 final += CodeConfig.get("extensionName") + " ";
502 final += this.LI.getCorrectPrefix(false, false, false, true);
503 final += " '" + message + "'";
504 return vscode.window.showInformationMessage<T>(final, ...items);
505 }
506}
507
555class Log {
557 private depthSearch: number = 3;
559 private LI: LoggerInternals = new LoggerInternals();
561 public Gui: Gui = new Gui(this.LI);
563 private extensionInstalled: boolean = false;
565 private fullyLoaded: boolean = false;
567 private output: vscode.OutputChannel | undefined = undefined;
568
588 constructor(context: vscode.ExtensionContext | undefined = undefined, fullyLoaded: boolean = false) {
589 this.extensionInstalled = this.LI.checkIfExtensionInstalled(context);
590 this.updateInitialisationStatus(fullyLoaded);
591 }
592
622 updateInitialisationStatus(extensionLoaded: boolean = true): void {
623 if (extensionLoaded) {
624 this.fullyLoaded = extensionLoaded;
625 this.Gui.updateLoadStatus(this.fullyLoaded);
626 this.output = vscode.window.createOutputChannel(CodeConfig.get("moduleName"));
627 if (!this.extensionInstalled) {
628 this.output.show();
629 }
630 } else {
631 this.fullyLoaded = false;
632 this.Gui.updateLoadStatus(this.fullyLoaded);
633 if (this.output) {
634 this.output.dispose();
635 this.output = undefined;
636 }
637 }
638 }
639
661 updateInstallationState(context: vscode.ExtensionContext | undefined) {
662 this.info(`In updateInstallationState`);
663 this.extensionInstalled = this.LI.checkIfExtensionInstalled(context);
664 this.info(`extensionInstalled = ${this.extensionInstalled}`);
665 this.info("Out of updateInstallationState");
666 }
694 info(message: string, searchDepth: number | undefined = undefined) {
695 if (!this.output) {
696 console.log(this.LI.packageForUnsafe(message, true, false, false, false));
697 return;
698 }
699 let final: string = "";
700 final += this.LI.getDatetime() + " ";
701 final += CodeConfig.get("extensionName") + " ";
702 final += this.LI.getCorrectPrefix(true, false, false, false);
703 final += " <" + this.LI.getParentCaller(searchDepth || this.depthSearch) + ">";
704 final += " '" + message + "'";
705 this.output.appendLine(final);
706 if (!this.extensionInstalled) {
707 console.log(final);
708 }
709 }
710
740 warning(message: string, searchDepth: number | undefined = undefined) {
741 if (!this.output) {
742 console.warn(this.LI.packageForUnsafe(message, false, true, false, false));
743 return;
744 }
745 let final: string = "";
746 final += this.LI.getDatetime() + " ";
747 final += CodeConfig.get("extensionName") + " ";
748 final += this.LI.getCorrectPrefix(false, true, false, false);
749 final += " <" + this.LI.getParentCaller(searchDepth || this.depthSearch) + ">";
750 final += " '" + message + "'";
751 this.output.appendLine(final);
752 if (!this.extensionInstalled) {
753 console.warn(final);
754 }
755 }
756
792 error(message: string, searchDepth: number | undefined = undefined) {
793 if (!this.output) {
794 console.error(this.LI.packageForUnsafe(message, false, false, true, false));
795 return;
796 }
797 let final: string = "";
798 final += this.LI.getDatetime() + " ";
799 final += CodeConfig.get("extensionName") + " ";
800 final += this.LI.getCorrectPrefix(false, false, true, false);
801 final += " <" + this.LI.getParentCaller(searchDepth || this.depthSearch) + ">";
802 final += " '" + message + "'";
803 this.output.appendLine(final);
804 if (!this.extensionInstalled) {
805 console.error(final);
806 }
807 }
808
848 debug(message: string, searchDepth: number | undefined = undefined) {
849 if (this.LI.debugEnabled() === false) {
850 return;
851 }
852 if (!this.output) {
853 console.log(this.LI.packageForUnsafe(message, false, false, false, true));
854 return;
855 }
856 let final: string = "";
857 final += this.LI.getDatetime() + " ";
858 final += CodeConfig.get("extensionName") + " ";
859 final += this.LI.getCorrectPrefix(false, false, false, true);
860 final += " <" + this.LI.getParentCaller(searchDepth || this.depthSearch) + ">";
861 final += " '" + message + "'";
862 this.output.appendLine(final);
863 if (!this.extensionInstalled) {
864 console.debug(final);
865 }
866 }
867}
868
870const instance = new Log();
871
910export const logger: Log = instance;
911
940export type LogType = Log;
User-facing notification system for VS Code extension GUI integration.
Definition logger.ts:373
constructor(loggerInternals:LoggerInternals, fullyLoaded:boolean=false)
Constructor for Gui logging class.
Definition logger.ts:386
Primary logging controller with dual-channel output and caller identification.
Definition logger.ts:555
info(message:string, searchDepth:number|undefined=undefined)
Logs informational messages with automatic caller identification.
Definition logger.ts:694
constructor(context:vscode.ExtensionContext|undefined=undefined, fullyLoaded:boolean=false)
Initializes the logging system with environment detection and auto-display.
Definition logger.ts:588
debug(message:string, searchDepth:number|undefined=undefined)
Generates detailed debugging information when debug mode is enabled.
Definition logger.ts:848
error(message:string, searchDepth:number|undefined=undefined)
Records critical errors requiring immediate attention or investigation.
Definition logger.ts:792
updateInitialisationStatus(extensionLoaded:boolean=true)
Updates the initialization status and manages output channel lifecycle.
Definition logger.ts:622
warning(message:string, searchDepth:number|undefined=undefined)
Records warning conditions requiring attention but not blocking execution.
Definition logger.ts:740
Core utility infrastructure for logging operations and formatting.
Definition logger.ts:109
constructor()
Constructor for LoggerInternals.
Definition logger.ts:115
export const moduleName
Module identifier used in package.json and extension marketplace.
Definition constants.ts:59
import type
import *as vscode from vscode
Definition logger.ts:79
export const logger
Singleton logger instance providing unified logging interface for the entire extension.
Definition logger.ts:910
export type LogType
Type alias for Log class enabling dependency injection and testing.
Definition logger.ts:940
const instance
Singleton logger instance for application-wide use.
Definition logger.ts:870
export const Record< string,(...args:any[])=> string
export const CodeConfig
Exported configuration singleton for extension-wide access @export Primary configuration interface us...