{"version":3,"file":"toolbox-logging.mjs","sources":["../../../projects/toolbox/logging/log-entry-type.ts","../../../projects/toolbox/logging/log-entry.ts","../../../projects/toolbox/logging/log-level.ts","../../../projects/toolbox/logging/publisher/log-publisher.ts","../../../projects/toolbox/logging/console/log-console.ts","../../../projects/toolbox/logging/localstorage/log-local-storage.ts","../../../projects/toolbox/logging/webapi/log-web-api.ts","../../../projects/toolbox/logging/publisher/log-publishers.service.ts","../../../projects/toolbox/logging/service/log.service.ts","../../../projects/toolbox/logging/publisher/log-publisher.config.ts","../../../projects/toolbox/logging/logging.module.ts","../../../projects/toolbox/logging/toolbox-logging.ts"],"sourcesContent":["/**\r\n * Enumerates the different types of log entries that can be added to the log.\r\n * These levels match that of the .NET ToolBox log service.\r\n */\r\nexport enum TbxLogEntryType\r\n{\r\n  /** Type indicates the entry is the start of a process, and it will be completed. */\r\n  pending,\r\n\r\n  /** Type indicates the entry is the completion of a process. */\r\n  completed,\r\n\r\n  /** Type indicates the entry is an error entry. */\r\n  error,\r\n\r\n  /** Type indicates the entry is just a regular entry. */\r\n  info,\r\n\r\n  /** Type indicates the entry is a warning entry. */\r\n  warning,\r\n\r\n  /** Type indicates the entry should not be logged. */\r\n  none\r\n}\r\n","import { TbxLogEntryType } from \"./log-entry-type\";\r\n\r\n/**\r\n * Entity to model records in the application's global log.\r\n */\r\nexport class TbxLogEntry\r\n{\r\n  /** Gets or sets a unique ID for the entry. */\r\n  public entryId = \"\";\r\n\r\n  /** Gets or sets the date of the entry. */\r\n  public entryDate: Date;\r\n\r\n  /** Gets or sets the entry's main content. */\r\n  public message = \"\";\r\n\r\n  /** Gets or sets the area where the entry originated from. */\r\n  public area = \"\";\r\n\r\n  /** Gets or sets the user who logged the entry. */\r\n  public userName = \"\";\r\n\r\n  /** Gets or sets a value indicating whether the entry is fatal. */\r\n  public isFatal = false;\r\n\r\n  /** Gets or sets the type of log entry this is. */\r\n  public entryType = TbxLogEntryType.none;\r\n\r\n  /**\r\n   * Initializes a new instance of the {@link TbxLogEntry} class.\r\n   * @param message The message to log.\r\n   * @returns Nothing.\r\n   */\r\n  public constructor( message?: string )\r\n  {\r\n    this.entryId = new Date().getMilliseconds().toString(); // TbxRandom.newGuid();\r\n    this.entryDate = new Date();\r\n\r\n    if( message !== undefined )\r\n    {\r\n      this.message = message;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Formats the data in a standard log line.\r\n   * @returns A line formatted as a standard entry for Lacera logs.\r\n   */\r\n  public toString(): string\r\n  {\r\n    const type = this.entryType as number;\r\n    const date =\r\n      `${this.entryDate.toLocaleString()} ${this.entryDate.toLocaleTimeString()}`;\r\n\r\n    return `${date}, ${this.userName}, ${this.area}, ${type}, ${this.message}`;\r\n  }\r\n}\r\n","/** Enumerates the different levels of logging. */\r\nexport enum TbxLogLevel\r\n{\r\n  /** Log only debug entries and up. */\r\n  debug       = 0,\r\n\r\n  /** log only information entries and up. */\r\n  information = 1,\r\n\r\n  /** Log only warning entries and up. */\r\n  warning     = 2,\r\n\r\n  /** Log only error entries and up. */\r\n  error       = 3,\r\n\r\n  /** Log only fatal entries and up. */\r\n  fatal       = 4,\r\n\r\n  /** Turn off all logging. */\r\n  off         = 5\r\n}\r\n","import { Observable  } from \"rxjs\";\r\nimport { TbxLogEntry } from \"../log-entry\";\r\nimport { TbxLogLevel } from \"../log-level\";\r\n\r\n/** Defines the available log publisher names. */\r\nexport type TbxLogPublisherName = \"console\" | \"webapi\" | \"localstorage\" | \"\";\r\n\r\n/** Provides functions to obtain application information such as name, version, etc. */\r\nexport abstract class TbxLogPublisher\r\n{\r\n  /** Gets or Sets the name of the logger. */\r\n  public logName!: TbxLogPublisherName;\r\n\r\n  /** Gets or Sets the log level for this publisher. */\r\n  public logLevel!: TbxLogLevel;\r\n\r\n  /** Gets or Sets the location of the log entries. */\r\n  public location!: string;\r\n\r\n  /**\r\n   * Logs the entry to the location.\r\n   * @param entry - The entry to log.\r\n   * @returns The action result.\r\n   */\r\n  public abstract log( entry: TbxLogEntry ): Observable<boolean> | boolean;\r\n\r\n  /**\r\n   * Clears all entries from the location.\r\n   * @returns The action result.\r\n   */\r\n  public abstract clear(): Observable<boolean> | boolean;\r\n}\r\n","import { TbxLogEntry } from \"../log-entry\";\r\nimport { TbxLogEntryType } from \"../log-entry-type\";\r\nimport { TbxLogPublisher } from \"../publisher/log-publisher\";\r\n\r\n/**\r\n * Provides functions to log entries to the console.\r\n */\r\nexport class TbxLogConsole extends TbxLogPublisher\r\n{\r\n  /**\r\n   * Converts the entry to a string for the console.\r\n   * @param entry The entry to stringify.\r\n   * @returns The entry converted to a string.\r\n   */\r\n  private static getString( entry: TbxLogEntry ): string\r\n  {\r\n    const date = entry.entryDate.toLocaleDateString();\r\n    const time = entry.entryDate.toLocaleTimeString();\r\n    const user = entry.userName.length > 0 ? ` - ${entry.userName}` : \"\";\r\n    const area = entry.area.length > 0 ? ` - ${entry.area}` : \"\";\r\n\r\n    return `[${date} ${time}${user}${area}]: ${entry.message}`;\r\n  }\r\n\r\n  /**\r\n   * Logs the entry to the location.\r\n   * @param entry - The entry to log.\r\n   * @returns The action result.\r\n   */\r\n  // eslint-disable-next-line class-methods-use-this\r\n  public log( entry: TbxLogEntry ): boolean\r\n  {\r\n    console.group( \"TbxLogger\" );\r\n\r\n    switch( entry.entryType )\r\n    {\r\n      case TbxLogEntryType.error:\r\n        console.error( TbxLogConsole.getString( entry ) );\r\n        break;\r\n      case TbxLogEntryType.info:\r\n        // eslint-disable-next-line no-console\r\n        console.info( TbxLogConsole.getString( entry ) );\r\n        break;\r\n      case TbxLogEntryType.pending:\r\n      case TbxLogEntryType.completed:\r\n        console.log( TbxLogConsole.getString( entry ) );\r\n        break;\r\n      case TbxLogEntryType.warning:\r\n        console.warn( TbxLogConsole.getString( entry ) );\r\n        break;\r\n      case TbxLogEntryType.none:\r\n        break;\r\n      default:\r\n    }\r\n\r\n    console.groupEnd();\r\n\r\n    return true;\r\n  }\r\n\r\n  /**\r\n   * Clears all entries from the location.\r\n   * @returns The action result.\r\n   */\r\n  // eslint-disable-next-line class-methods-use-this\r\n  public clear(): boolean\r\n  {\r\n    console.clear();\r\n\r\n    return true;\r\n  }\r\n}\r\n","import { TbxLogEntry     } from \"../log-entry\";\r\nimport { TbxLogPublisher } from \"../publisher/log-publisher\";\r\n\r\n/**\r\n * Provides functions to log entries to the local storage.\r\n */\r\nexport class TbxLogLocalStorage extends TbxLogPublisher\r\n{\r\n  /**\r\n   * Initializes a new instance of the {@link TbxLogLocalStorage} class.\r\n   */\r\n  public constructor()\r\n  {\r\n    super();\r\n\r\n    this.location = \"logging\";\r\n  }\r\n\r\n  /**\r\n   * Gets all log entries in local storage.\r\n   * @returns All log entries found in local storage.\r\n   */\r\n  public getAll(): TbxLogEntry[]\r\n  {\r\n    const location = localStorage.getItem( this.location );\r\n\r\n    return location !== null ? JSON.parse( location ) : [];\r\n  }\r\n\r\n  /**\r\n   * Logs the entry to the location.\r\n   * @param entry - The entry to log.\r\n   * @returns True if the entry was written, false otherwise.\r\n   */\r\n  public log( entry: TbxLogEntry ): boolean\r\n  {\r\n    try\r\n    {\r\n      const sessionValues = localStorage.getItem( this.location );\r\n      const values = sessionValues !== null ? JSON.parse( sessionValues ) : [];\r\n\r\n      values.push( entry );\r\n      localStorage.setItem( this.location, JSON.stringify( values ) );\r\n\r\n      return true;\r\n    }\r\n    catch( ex )\r\n    {\r\n      console.error( ex );\r\n\r\n      return false;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Clears all entries from the location.\r\n   * @returns The action result.\r\n   */\r\n  public clear(): boolean\r\n  {\r\n    localStorage.removeItem( this.location );\r\n\r\n    return true;\r\n  }\r\n}\r\n","import { HttpClient, HttpHeaders } from \"@angular/common/http\";\r\nimport { Observable, of } from \"rxjs\";\r\nimport { catchError } from \"rxjs/operators\";\r\n\r\nimport { TbxLogEntry } from \"../log-entry\";\r\nimport { TbxLogPublisher } from \"../publisher/log-publisher\";\r\n\r\n/**\r\n * Provides functions to log entries to the back-end server.\r\n */\r\nexport class TbxLogWebApi extends TbxLogPublisher\r\n{\r\n  /**\r\n   * Initializes a new instance of the {@link TbxLogWebApi} class.\r\n   * @param http - The Angular http client.\r\n   */\r\n  public constructor( private readonly http: HttpClient )\r\n  {\r\n    super();\r\n\r\n    this.location = \"/api/toolbox/log\";\r\n  }\r\n\r\n  /**\r\n   * Logs the entry to the location.\r\n   * @param entry - The entry to log.\r\n   * @returns The action result.\r\n   */\r\n  public log( entry: TbxLogEntry ): Observable<boolean> | boolean\r\n  {\r\n    // Just send it and forget it\r\n    return this.http\r\n               .post<boolean>(\r\n                 this.location,\r\n                 entry,\r\n                 {\r\n                   withCredentials: true,\r\n                   headers: new HttpHeaders( {\r\n                     \"content-Type\": \"application/json; charset=utf-8\",\r\n                     \"x-Requested-With\": \"XMLHttpRequest\"\r\n                   } )\r\n                 } )\r\n               .pipe(\r\n                 catchError( ( error: any ) =>\r\n                 {\r\n                   console.error( \"An error occurred logging to the server:\", error );\r\n\r\n                   return of( false );\r\n                 } )\r\n               );\r\n  }\r\n\r\n  /**\r\n   * Clears all entries from the location.\r\n   * @returns The action result.\r\n   */\r\n  // eslint-disable-next-line class-methods-use-this\r\n  public clear(): Observable<boolean> | boolean\r\n  {\r\n    return true;\r\n  }\r\n}\r\n","import { Injectable, isDevMode } from \"@angular/core\";\r\nimport { HttpClient } from \"@angular/common/http\";\r\nimport { Observable, of } from \"rxjs\";\r\nimport { catchError } from \"rxjs/operators\";\r\n\r\nimport { TbxLogConsole } from \"../console/log-console\";\r\nimport { TbxLogLocalStorage } from \"../localstorage/log-local-storage\";\r\nimport { TbxLogWebApi } from \"../webapi/log-web-api\";\r\n\r\nimport { TbxLogPublisherConfig } from \"./log-publisher.config\";\r\nimport { TbxLogPublisher } from \"./log-publisher\";\r\n\r\n/** Manages the available publishers. */\r\n@Injectable( { providedIn: \"root\" } )\r\nexport class TbxLogPublishersService\r\n{\r\n  private configuredPublishers: TbxLogPublisher[] = [];\r\n\r\n  public constructor( private readonly http: HttpClient )\r\n  {\r\n    this.buildPublishers();\r\n  }\r\n\r\n  /** Gets the configured publishers. */\r\n  public get publishers(): TbxLogPublisher[]\r\n  {\r\n    return this.configuredPublishers;\r\n  }\r\n\r\n  /** Sets the configured publishers. */\r\n  public set publishers( publishers: TbxLogPublisher[] )\r\n  {\r\n    this.configuredPublishers = [...publishers];\r\n  }\r\n\r\n  /**\r\n   * Handles an errors when publishing to the server.\r\n   * @returns The action result.\r\n   */\r\n  private static handleErrors(): Observable<TbxLogPublisherConfig[]>\r\n  {\r\n    if( isDevMode() )\r\n    {\r\n      console.warn(\r\n        \"The log-publishers.json configuration file was not found in \" +\r\n        \"this project. This file is needed to enable/disable log publishers. \" +\r\n        \"The ToolBox will default to the console publisher for now.\" );\r\n    }\r\n\r\n    return of( [\r\n      {\r\n        isActive: true,\r\n        loggerName: \"console\",\r\n        loggerLocation: \"console\"\r\n      },\r\n      {\r\n        isActive: false,\r\n        loggerName: \"webapi\",\r\n        loggerLocation: \"/api/toolbox/log\"\r\n      }\r\n    ] );\r\n  }\r\n\r\n  /** Builds the publishers to use based on the configuration. */\r\n  public buildPublishers(): void\r\n  {\r\n    this.getLoggers().subscribe( publishers =>\r\n    {\r\n      for( const pub of publishers.filter( p => p.isActive ) )\r\n      {\r\n        let logPub: TbxLogPublisher;\r\n\r\n        switch( pub.loggerName.toLowerCase() )\r\n        {\r\n          case \"console\":\r\n            logPub = new TbxLogConsole();\r\n            break;\r\n          case \"localstorage\":\r\n            logPub = new TbxLogLocalStorage();\r\n            break;\r\n          case \"webapi\":\r\n            logPub = new TbxLogWebApi( this.http );\r\n            break;\r\n          default:\r\n            throw new Error( \"Unknown log publisher.\" );\r\n        }\r\n\r\n        logPub.logName = pub.loggerName;\r\n        logPub.location = pub.loggerLocation;\r\n\r\n        this.configuredPublishers.push( logPub );\r\n      }\r\n\r\n      if( this.configuredPublishers.length === 0 )\r\n      {\r\n        console.warn( \"No loggers found that are active for this application.\" );\r\n      }\r\n    } );\r\n  }\r\n\r\n  /**\r\n   * Gets the loggers from the publisher configuration file.\r\n   * @returns The configured publishers.\r\n   */\r\n  private getLoggers(): Observable<TbxLogPublisherConfig[]>\r\n  {\r\n    return this.http\r\n               .get<TbxLogPublisherConfig[]>( \"/api/assets/log-publishers.json\" )\r\n               .pipe(\r\n                 catchError( () =>\r\n                   this.http\r\n                       .get<TbxLogPublisherConfig[]>( \"/api/log-publishers.json\" )\r\n                       .pipe(\r\n                         catchError( () => TbxLogPublishersService.handleErrors() )\r\n                       )\r\n                 )\r\n               );\r\n  }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\n\r\nimport { TbxLogLevel } from \"../log-level\";\r\nimport { TbxLogEntry } from \"../log-entry\";\r\nimport { TbxLogEntryType } from \"../log-entry-type\";\r\nimport { TbxILogWriter } from \"../log.interface\";\r\n\r\nimport { TbxLogPublishersService } from \"../publisher/log-publishers.service\";\r\nimport { TbxLogPublisher } from \"../publisher/log-publisher\";\r\n\r\n/** Provides functions to add log entries to various publishers. */\r\n@Injectable( { providedIn: \"root\" } )\r\nexport class TbxLogService implements TbxILogWriter\r\n{\r\n  /**\r\n   * Initializes a new instance of the {@link TbxLogService} class.\r\n   * @param publishersService The log publishers service.\r\n   */\r\n  public constructor( protected readonly publishersService: TbxLogPublishersService )\r\n  {\r\n  }\r\n\r\n  /** Gets the registered publishers. */\r\n  public get publishers(): TbxLogPublisher[]\r\n  {\r\n    return this.publishersService.publishers;\r\n  }\r\n\r\n  /**\r\n   * Logs a debug message.\r\n   * @param message The message to log.\r\n   * @param optionalParams Any optional parameters.\r\n   */\r\n  public debug( message: string, ...optionalParams: any[] ): void\r\n  {\r\n    this.writeToLog( message, TbxLogLevel.debug, optionalParams );\r\n  }\r\n\r\n  /**\r\n   * Logs an information message.\r\n   * @param message - The message to log.\r\n   * @param optionalParams - Any optional parameters.\r\n   */\r\n  public info( message: string, ...optionalParams: any[] ): void\r\n  {\r\n    this.writeToLog( message, TbxLogLevel.information, optionalParams );\r\n  }\r\n\r\n  /**\r\n   * Logs a warning message.\r\n   * @param message - The message to log.\r\n   * @param optionalParams - Any optional parameters.\r\n   */\r\n  public warn( message: string, ...optionalParams: any[] ): void\r\n  {\r\n    this.writeToLog( message, TbxLogLevel.warning, optionalParams );\r\n  }\r\n\r\n  /**\r\n   * Logs an error message.\r\n   * @param message - The message to log.\r\n   * @param optionalParams - Any optional parameters.\r\n   */\r\n  public error( message: string, ...optionalParams: any[] ): void\r\n  {\r\n    this.writeToLog( message, TbxLogLevel.error, optionalParams );\r\n  }\r\n\r\n  /**\r\n   * Logs a fatal message.\r\n   * @param message - The message to log.\r\n   * @param optionalParams - Any optional parameters.\r\n   */\r\n  public fatal( message: string, ...optionalParams: any[] ): void\r\n  {\r\n    this.writeToLog( message, TbxLogLevel.fatal, optionalParams );\r\n  }\r\n\r\n  /**\r\n   * Logs a general message.\r\n   * @param message - The message to log.\r\n   * @param optionalParams - Any optional parameters.\r\n   */\r\n  public log( message: string, ...optionalParams: any[] ): void\r\n  {\r\n    this.writeToLog( message, TbxLogLevel.debug, optionalParams );\r\n  }\r\n\r\n  /** Clears all entries from the publishers. */\r\n  public clear(): void\r\n  {\r\n    for( const logger of this.publishersService.publishers )\r\n    {\r\n      logger.clear();\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Determines if the entry should be logged based on settings.\r\n   * @param level The log level of the entry.\r\n   * @returns True if the entry should be logged, false otherwise.\r\n   */\r\n  // eslint-disable-next-line class-methods-use-this\r\n  public shouldLog( level: TbxLogLevel ): boolean\r\n  {\r\n    // Default to logging warnings and up\r\n    const logLevel = TbxLogLevel.warning;\r\n\r\n    // Check the environment for a logging level\r\n    // TODO: Need to get the settings from startup\r\n    /*\r\n    const setting = ( TbxAppService.environment.logLevel as string ) || \"\";\r\n    switch( setting.toLowerCase() )\r\n    {\r\n      case \"debug\": logLevel = TbxLogLevel.Debug; break;\r\n      case \"information\": logLevel = TbxLogLevel.Information; break;\r\n      case \"error\": logLevel = TbxLogLevel.Error; break;\r\n      case \"fatal\": logLevel = TbxLogLevel.Fatal; break;\r\n      default: logLevel = TbxLogLevel.Warning;\r\n    }\r\n    */\r\n\r\n    return level >= logLevel;\r\n  }\r\n\r\n  /**\r\n   * Determines the log entry type based on the log level.\r\n   * @param level - The log level.\r\n   * @returns The log entry type.\r\n   */\r\n  // eslint-disable-next-line @typescript-eslint/member-ordering\r\n  protected static getEntryType( level: TbxLogLevel ): TbxLogEntryType\r\n  {\r\n    switch( level )\r\n    {\r\n      case TbxLogLevel.error:\r\n      case TbxLogLevel.fatal:\r\n        return TbxLogEntryType.error;\r\n      case TbxLogLevel.warning:\r\n        return TbxLogEntryType.warning;\r\n      default:\r\n        return TbxLogEntryType.info;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Formats the optional parameters into a string.\r\n   * @param params - Any optional parameters.\r\n   * @returns The string with optional parameters\r\n   */\r\n  // eslint-disable-next-line @typescript-eslint/member-ordering\r\n  protected static formatParams( params: any[] ): string\r\n  {\r\n    if( params.length === 0 )\r\n    {\r\n      return \"\";\r\n    }\r\n\r\n    let temp = params.join( \",\" );\r\n\r\n    if( params.some( p => typeof p === \"object\" ) )\r\n    {\r\n      temp = \"\";\r\n      for( const item of params )\r\n      {\r\n        temp += `${JSON.stringify( item )},`;\r\n      }\r\n    }\r\n\r\n    return ` [${temp}]`;\r\n  }\r\n\r\n  /**\r\n   * Performs the actual write to the publishers.\r\n   * @param message - The message to log.\r\n   * @param level - The log level.\r\n   * @param params - Any optional parameters.\r\n   */\r\n  protected writeToLog( message: string, level: TbxLogLevel, params: any[] ): void\r\n  {\r\n    if( !this.shouldLog( level ) )\r\n    {\r\n      return;\r\n    }\r\n\r\n    const entry = new TbxLogEntry();\r\n    entry.message = message + TbxLogService.formatParams( params );\r\n    entry.entryType = TbxLogService.getEntryType( level );\r\n    entry.userName = \"\";\r\n\r\n    for( const logger of this.publishersService.publishers )\r\n    {\r\n      logger.log( entry );\r\n    }\r\n  }\r\n}\r\n","import { TbxLogPublisherName } from \"./log-publisher\";\r\n\r\n/**\r\n * The configuration for a log publisher.\r\n */\r\nexport class TbxLogPublisherConfig\r\n{\r\n  /** Gets or sets the name of the logger. */\r\n  public loggerName!: TbxLogPublisherName;\r\n\r\n  /** Gets or sets the location where the entries are logged. */\r\n  public loggerLocation!: string;\r\n\r\n  /** Gets or sets a value indicating whether the logger is active. */\r\n  public isActive!: boolean;\r\n}\r\n","import { NgModule } from \"@angular/core\";\r\nimport { HttpClientModule } from \"@angular/common/http\";\r\n\r\n@NgModule( {\r\n  imports: [HttpClientModule]\r\n} )\r\nexport class TbxLoggingModule\r\n{\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.TbxLogPublishersService"],"mappings":"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"}