diff --git a/package.json b/package.json index 37192da01..bf2929cb4 100644 --- a/package.json +++ b/package.json @@ -35,6 +35,7 @@ "sequelize": "^6.37.3", "sqlite3": "^5.1.7", "uuid": "^10.0.0", + "winston": "^3.15.0", "zod": "^3.23.8" }, "devDependencies": { diff --git a/src/app.ts b/src/app.ts index aaa78f98d..4640c91fe 100644 --- a/src/app.ts +++ b/src/app.ts @@ -4,6 +4,7 @@ import appConfig from '@src/config/app'; import CommandNotFoundException from '@src/core/domains/console/exceptions/CommandNotFoundException'; import CommandBootService from '@src/core/domains/console/service/CommandBootService'; import Kernel, { KernelOptions } from '@src/core/Kernel'; +import { App } from '@src/core/services/App'; (async () => { try { @@ -16,14 +17,14 @@ import Kernel, { KernelOptions } from '@src/core/Kernel'; */ await Kernel.boot(appConfig, options); - console.log('[App]: Started'); + App.container('logger').info('[App]: Started'); /** * Execute commands */ await cmdBoot.boot(args); - } + } catch (err) { // We can safetly ignore CommandNotFoundExceptions @@ -31,7 +32,7 @@ import Kernel, { KernelOptions } from '@src/core/Kernel'; return; } - console.error('[App]: Failed to start', err); + App.container('logger').error('[App]: Failed to start', err); throw err; } })(); \ No newline at end of file diff --git a/src/app/commands/ExampleCommand.ts b/src/app/commands/ExampleCommand.ts index bd66de7bd..286794b58 100644 --- a/src/app/commands/ExampleCommand.ts +++ b/src/app/commands/ExampleCommand.ts @@ -5,7 +5,7 @@ export default class ExampleCommand extends BaseCommand { signature: string = 'app:example'; async execute() { - console.log('Hello world!') + // Handle the logic } } \ No newline at end of file diff --git a/src/app/events/listeners/ExampleListener.ts b/src/app/events/listeners/ExampleListener.ts index 170aebee1..5f166aa43 100644 --- a/src/app/events/listeners/ExampleListener.ts +++ b/src/app/events/listeners/ExampleListener.ts @@ -2,8 +2,9 @@ import EventListener from "@src/core/domains/events/services/EventListener"; export class ExampleListener extends EventListener<{userId: string}> { + // eslint-disable-next-line no-unused-vars handle = async (payload: { userId: string}) => { - console.log('[ExampleListener]', payload.userId) + // Handle the logic } - + } \ No newline at end of file diff --git a/src/core/actions/health.ts b/src/core/actions/health.ts index 306b6308a..23f1e3af1 100644 --- a/src/core/actions/health.ts +++ b/src/core/actions/health.ts @@ -33,7 +33,6 @@ export default async (req: Request, res: Response) => { } } catch (error) { - console.error(error) // If there is an error, send the error response responseError(req, res, error as Error) return; diff --git a/src/core/base/Provider.ts b/src/core/base/Provider.ts index 0043a73f2..d2ea88320 100644 --- a/src/core/base/Provider.ts +++ b/src/core/base/Provider.ts @@ -1,4 +1,5 @@ import { IProvider } from "@src/core/interfaces/IProvider"; +import { App } from "@src/core/services/App"; /** * Base class for providers @@ -45,12 +46,7 @@ export default abstract class BaseProvider implements IProvider { * @param {...any[]} args - Additional arguments to log */ protected log(message: string, ...args: any[]): void { - const str = `[Provider] ${message}`; - if(args.length > 0) { - console.log(str, ...args); - return; - } - console.log(`[Provider] ${message}`); + App.container('logger').info(message, ...args); } /** diff --git a/src/core/domains/console/commands/WorkerCommand.ts b/src/core/domains/console/commands/WorkerCommand.ts index 992832b23..febf1b1d7 100644 --- a/src/core/domains/console/commands/WorkerCommand.ts +++ b/src/core/domains/console/commands/WorkerCommand.ts @@ -25,7 +25,7 @@ export default class WorkerCommand extends BaseCommand { const worker = Worker.getInstance() worker.setDriver(driver) - console.log('Running worker...', worker.options) + App.container('logger').console('Running worker...', worker.options) await worker.work(); @@ -35,7 +35,7 @@ export default class WorkerCommand extends BaseCommand { setInterval(async () => { await worker.work() - console.log('Running worker again in ' + worker.options.runAfterSeconds.toString() + ' seconds') + App.container('logger').console('Running worker again in ' + worker.options.runAfterSeconds.toString() + ' seconds') }, worker.options.runAfterSeconds * 1000) } diff --git a/src/core/domains/database/base/BaseDocumentManager.ts b/src/core/domains/database/base/BaseDocumentManager.ts index 9ddda0f00..68f4a66c1 100644 --- a/src/core/domains/database/base/BaseDocumentManager.ts +++ b/src/core/domains/database/base/BaseDocumentManager.ts @@ -10,6 +10,7 @@ import { IHasManyOptions } from "@src/core/domains/database/interfaces/relations import BelongsTo from "@src/core/domains/database/relationships/BelongsTo"; import HasMany from "@src/core/domains/database/relationships/HasMany"; import DocumentValidator from "@src/core/domains/database/validator/DocumentValidator"; +import { App } from "@src/core/services/App"; /** * Abstract base class for document management operations @@ -131,7 +132,7 @@ abstract class BaseDocumentManager(event: IEvent) { - console.log(`[EventDispatcher:dispatch] Event '${event.name}' with driver '${event.driver}'`) + App.container('logger').info(`[EventDispatcher:dispatch] Event '${event.name}' with driver '${event.driver}'`) const driverOptions = this.getDriverOptionsFromEvent(event) const driverCtor = driverOptions.driver @@ -36,5 +36,5 @@ export default class EventDispatcher extends Singleton implements IEventDispatch return driver } - + } \ No newline at end of file diff --git a/src/core/domains/events/services/Worker.ts b/src/core/domains/events/services/Worker.ts index 017244a0e..0d792ae8c 100644 --- a/src/core/domains/events/services/Worker.ts +++ b/src/core/domains/events/services/Worker.ts @@ -33,7 +33,7 @@ export default class Worker extends Singleton { */ setDriver(driver: string) { this.options = this.getOptions(driver) - this.log(`Driver set to '${driver}'`,) + this.logToConsole(`Driver set to '${driver}'`,) } /** @@ -57,8 +57,8 @@ export default class Worker extends Singleton { // Fetch the current list of queued results const workerResults: WorkerModel[] = await worker.getWorkerResults(this.options.queueName) - this.log('collection: ' + new this.options.workerModelCtor().table) - this.log(`${workerResults.length} queued items with queue name '${this.options.queueName}'`) + this.logToConsole('collection: ' + new this.options.workerModelCtor().table) + this.logToConsole(`${workerResults.length} queued items with queue name '${this.options.queueName}'`) for(const workerModel of workerResults) { // We set the model here to pass it to the failedWorkerModel method, @@ -66,12 +66,12 @@ export default class Worker extends Singleton { model = workerModel try { - console.log('Worker processing model', model.getId()?.toString()) + App.container('logger').console('Worker processing model', model.getId()?.toString()) await worker.processWorkerModel(model) } catch (err) { if(!(err instanceof Error)) { - console.error(err) + App.container('logger').error(err) return; } @@ -124,7 +124,7 @@ export default class Worker extends Singleton { // Delete record as it was a success await model.delete(); - this.log(`Processed: ${eventName}`) + this.logToConsole(`Processed: ${eventName}`) } /** @@ -141,7 +141,7 @@ export default class Worker extends Singleton { const currentAttempt = (model.getAttribute('attempt') ?? 0) const nextCurrentAttempt = currentAttempt + 1 - this.log(`Failed ${model.getAttribute('eventName')} attempts ${currentAttempt + 1} out of ${retries}, ID: ${model.getId()?.toString()}`) + this.logToConsole(`Failed ${model.getAttribute('eventName')} attempts ${currentAttempt + 1} out of ${retries}, ID: ${model.getId()?.toString()}`) // If reached max, move to failed collection if(nextCurrentAttempt >= retries) { @@ -160,7 +160,7 @@ export default class Worker extends Singleton { * @param err */ async moveFailedWorkerModel(model: WorkerModel, err: Error) { - this.log('Moved to failed') + this.logToConsole('Moved to failed') const failedWorkerModel = (new FailedWorkerModelFactory).create( this.options.failedCollection, @@ -183,8 +183,8 @@ export default class Worker extends Singleton { * Logs a message to the console * @param message The message to log */ - protected log(message: string) { - console.log('[Worker]: ', message) + protected logToConsole(message: string) { + App.container('logger').console('[Worker]: ', message) } } diff --git a/src/core/domains/express/middleware/basicLoggerMiddleware.ts b/src/core/domains/express/middleware/basicLoggerMiddleware.ts index 38d21c00f..a3ce78f5b 100644 --- a/src/core/domains/express/middleware/basicLoggerMiddleware.ts +++ b/src/core/domains/express/middleware/basicLoggerMiddleware.ts @@ -1,8 +1,9 @@ import { BaseRequest } from '@src/core/domains/express/types/BaseRequest.t'; +import { App } from '@src/core/services/App'; import { NextFunction, Response } from 'express'; export const basicLoggerMiddleware = () => async (req: BaseRequest, res: Response, next: NextFunction): Promise => { - console.log('New request: ', `${req.method} ${req.url}`, 'Headers: ', req.headers); + App.container('logger').info('New request: ', `${req.method} ${req.url}`, 'Headers: ', req.headers); next(); }; diff --git a/src/core/domains/express/middleware/requestContextLoggerMiddleware.ts b/src/core/domains/express/middleware/requestContextLoggerMiddleware.ts index dc4342c87..e13c8de4d 100644 --- a/src/core/domains/express/middleware/requestContextLoggerMiddleware.ts +++ b/src/core/domains/express/middleware/requestContextLoggerMiddleware.ts @@ -14,8 +14,8 @@ const requestContextLoggerMiddleware = () => (req: BaseRequest, res: Response, n } res.once('finish', () => { - console.log('requestContext: ', App.container('requestContext').getRequestContext()) - console.log('ipContext: ', App.container('requestContext').getIpContext()) + App.container('logger').info('requestContext: ', App.container('requestContext').getRequestContext()) + App.container('logger').info('ipContext: ', App.container('requestContext').getIpContext()) }) next() diff --git a/src/core/domains/express/requests/responseError.ts b/src/core/domains/express/requests/responseError.ts index dd0822886..ae7fc41c4 100644 --- a/src/core/domains/express/requests/responseError.ts +++ b/src/core/domains/express/requests/responseError.ts @@ -17,6 +17,7 @@ export default (req: Request , res: Response, err: Error, code: number = 500) => return; } - console.error(err) + App.container('logger').error(err) + res.status(code).send({ error: `${err.message}` }) } \ No newline at end of file diff --git a/src/core/domains/express/services/ExpressService.ts b/src/core/domains/express/services/ExpressService.ts index 332088b89..cf40544c4 100644 --- a/src/core/domains/express/services/ExpressService.ts +++ b/src/core/domains/express/services/ExpressService.ts @@ -252,7 +252,7 @@ export default class ExpressService extends Service implements I } } - console.log(str) + App.container('logger').info(str) } } diff --git a/src/core/domains/express/services/QueryFilters.ts b/src/core/domains/express/services/QueryFilters.ts index 54cd07aa1..ae9bd2f0b 100644 --- a/src/core/domains/express/services/QueryFilters.ts +++ b/src/core/domains/express/services/QueryFilters.ts @@ -1,5 +1,6 @@ import Singleton from "@src/core/base/Singleton"; import { SearchOptions } from "@src/core/domains/express/interfaces/IRouteResourceOptions"; +import { App } from "@src/core/services/App"; import { Request } from "express"; class QueryFilters extends Singleton { @@ -33,7 +34,7 @@ class QueryFilters extends Singleton { } catch (err) { - console.error(err) + App.container('logger').error(err) } return this; diff --git a/src/core/domains/express/services/RequestContextCleaner.ts b/src/core/domains/express/services/RequestContextCleaner.ts index 529e2323a..fe255a744 100644 --- a/src/core/domains/express/services/RequestContextCleaner.ts +++ b/src/core/domains/express/services/RequestContextCleaner.ts @@ -80,7 +80,6 @@ class RequestContextCleaner extends Singleton { // If the context is empty, remove it from the store if(context.size === 0) { - console.log('Removed ipContext', ip) context.delete(ip) } } diff --git a/src/core/domains/logger/interfaces/ILoggerService.ts b/src/core/domains/logger/interfaces/ILoggerService.ts new file mode 100644 index 000000000..5ccb2ff88 --- /dev/null +++ b/src/core/domains/logger/interfaces/ILoggerService.ts @@ -0,0 +1,14 @@ +/* eslint-disable no-unused-vars */ +import winston from "winston"; + +export interface ILoggerService +{ + getLogger(): winston.Logger; + + info(...args: any[]): void; + warn(...args: any[]): void; + error(...args: any[]): void; + debug(...args: any[]): void; + verbose(...args: any[]): void; + console(...args: any[]): void; +} \ No newline at end of file diff --git a/src/core/domains/logger/providers/LoggerProvider.ts b/src/core/domains/logger/providers/LoggerProvider.ts new file mode 100644 index 000000000..dfb656805 --- /dev/null +++ b/src/core/domains/logger/providers/LoggerProvider.ts @@ -0,0 +1,22 @@ +import BaseProvider from "@src/core/base/Provider"; +import LoggerService from "@src/core/domains/logger/services/LoggerService"; +import { App } from "@src/core/services/App"; + +class LoggerProvider extends BaseProvider { + + async register(): Promise { + + const loggerService = new LoggerService(); + + // We will boot the logger here to provide it early for other providers + loggerService.boot(); + + App.setContainer('logger', loggerService); + + } + + async boot(): Promise {} + +} + +export default LoggerProvider \ No newline at end of file diff --git a/src/core/domains/logger/services/LoggerService.ts b/src/core/domains/logger/services/LoggerService.ts new file mode 100644 index 000000000..380b0afe3 --- /dev/null +++ b/src/core/domains/logger/services/LoggerService.ts @@ -0,0 +1,120 @@ +import { EnvironmentProduction } from "@src/core/consts/Environment"; +import { ILoggerService } from "@src/core/domains/logger/interfaces/ILoggerService"; +import { App } from "@src/core/services/App"; +import path from "path"; +import winston from "winston"; + +class LoggerService implements ILoggerService { + + /** + * Winston logger instance + */ + protected logger!: winston.Logger + + /** + * Bootstraps the winston logger instance. + * @returns {Promise} + */ + boot() { + if(this.logger) { + return; + } + + const logger = winston.createLogger({ + level:'info', + format: winston.format.json(), + transports: [ + new winston.transports.File({ filename: path.resolve('@src/../', 'storage/logs/larascript.log') }) + ] + }) + + if(App.env() !== EnvironmentProduction) { + logger.add(new winston.transports.Console({ format: winston.format.simple() })); + } + + this.logger = logger + } + + /** + * Returns the underlying winston logger instance. + * @returns {winston.Logger} + */ + getLogger() { + return this.logger + } + + /** + * Logs the given arguments to the console with the 'error' log level. + * @param {...any[]} args The arguments to log to the console. + */ + error(...args: any[]) { + this.logger.error([...args]) + } + + /** + * Logs the given arguments to the console with the 'help' log level. + * @param {...any[]} args The arguments to log to the console. + */ + help(...args: any[]) { + this.logger.help([...args]) + } + + /** + * Logs the given arguments to the console with the 'data' log level. + * @param {...any[]} args The arguments to log to the console. + */ + data(...args: any[]) { + this.logger.data([...args]) + } + + /** + * Logs the given arguments to the console with the 'info' log level. + * @param {...any[]} args The arguments to log to the console. + */ + info(...args: any[]) { + this.logger.info([...args]) + } + + /** + * Logs the given arguments to the console with the 'warn' log level. + * @param {...any[]} args The arguments to log to the console. + */ + warn(...args: any[]) { + this.logger.warn([...args]) + } + + /** + * Logs the given arguments to the console with the 'debug' log level. + * @param {...any[]} args The arguments to log to the console. + */ + debug(...args: any[]) { + this.logger.debug([...args]) + } + + /** + * Logs the given arguments to the console with the 'verbose' log level. + * @param {...any[]} args The arguments to log to the console. + */ + verbose(...args: any[]) { + this.logger.verbose([...args]) + } + + /** + * Outputs the given arguments directly to the console using the console transport. + * @param {...any[]} args The arguments to output to the console. + */ + console(...args: any[]) { + const logger = winston.createLogger({ + level:'info', + format: winston.format.json(), + transports: [ + new winston.transports.Console({ format: winston.format.simple() }) + ] + }) + + logger.info([...args]) + } + +} + +export default LoggerService \ No newline at end of file diff --git a/src/core/domains/make/base/BaseMakeFileCommand.ts b/src/core/domains/make/base/BaseMakeFileCommand.ts index c79252acf..88947b5b1 100644 --- a/src/core/domains/make/base/BaseMakeFileCommand.ts +++ b/src/core/domains/make/base/BaseMakeFileCommand.ts @@ -4,6 +4,7 @@ import { IMakeFileArguments } from "@src/core/domains/make/interfaces/IMakeFileA import { IMakeOptions } from "@src/core/domains/make/interfaces/IMakeOptions"; import ArgumentObserver from "@src/core/domains/make/observers/ArgumentObserver"; import MakeFileService from "@src/core/domains/make/services/MakeFileService"; +import { App } from "@src/core/services/App"; import Str from "@src/core/util/str/Str"; const DefaultOptions: Partial = { @@ -108,7 +109,7 @@ export default class BaseMakeFileCommand extends BaseCommand { // Write the new file this.makeFileService.writeContent(template); - console.log(`Created ${this.options.makeType}: ` + this.makeFileService.getTargetDirFullPath()); + App.container('logger').info(`Created ${this.options.makeType}: ` + this.makeFileService.getTargetDirFullPath()); } /** diff --git a/src/core/domains/make/providers/MakeProvider.ts b/src/core/domains/make/providers/MakeProvider.ts index 1c074c7b4..b130041f3 100644 --- a/src/core/domains/make/providers/MakeProvider.ts +++ b/src/core/domains/make/providers/MakeProvider.ts @@ -18,7 +18,7 @@ import { App } from "@src/core/services/App"; export default class MakeProvider extends BaseProvider { async register(): Promise { - console.log('[Provider] Registering MakeProvider') + this.log('Registering MakeProvider') App.container('console').register().registerAll([ MakeCmdCommand, diff --git a/src/core/domains/make/templates/Listener.ts.template b/src/core/domains/make/templates/Listener.ts.template index 2f8d81525..3bc95d8e7 100644 --- a/src/core/domains/make/templates/Listener.ts.template +++ b/src/core/domains/make/templates/Listener.ts.template @@ -16,7 +16,7 @@ export class #name# extends EventListener { */ handle = async (payload: I#name#Data) => { - console.log('[TestListener]', payload); + // Handle the logic } diff --git a/src/core/domains/migrations/services/MigrationService.ts b/src/core/domains/migrations/services/MigrationService.ts index d0217463b..afc8e96a0 100644 --- a/src/core/domains/migrations/services/MigrationService.ts +++ b/src/core/domains/migrations/services/MigrationService.ts @@ -102,12 +102,12 @@ class MigrationService implements IMigrationService { const newBatchCount = (await this.getCurrentBatchCount()) + 1; if (!migrationsDetails.length) { - console.log('[Migration] No migrations to run'); + App.container('logger').info('[Migration] No migrations to run'); } // Run the migrations for every file for (const migrationDetail of migrationsDetails) { - console.log('[Migration] up -> ' + migrationDetail.fileName); + App.container('logger').info('[Migration] up -> ' + migrationDetail.fileName); await this.handleFileUp(migrationDetail, newBatchCount); } @@ -139,7 +139,7 @@ class MigrationService implements IMigrationService { }); if (!results.length) { - console.log('[Migration] No migrations to run'); + App.container('logger').info('[Migration] No migrations to run'); } // Run the migrations @@ -149,7 +149,7 @@ class MigrationService implements IMigrationService { const migration = await this.fileService.getImportMigrationClass(fileName); // Run the down method - console.log(`[Migration] down -> ${fileName}`); + App.container('logger').info(`[Migration] down -> ${fileName}`); await migration.down(); // Delete the migration document @@ -180,16 +180,16 @@ class MigrationService implements IMigrationService { }); if (migrationDocument) { - console.log(`[Migration] ${fileName} already applied`); + App.container('logger').info(`[Migration] ${fileName} already applied`); return; } if (!migration.shouldUp()) { - console.log(`[Migration] Skipping (Provider mismatch) -> ${fileName}`); + App.container('logger').info(`[Migration] Skipping (Provider mismatch) -> ${fileName}`); return; } - console.log(`[Migration] up -> ${fileName}`); + App.container('logger').info(`[Migration] up -> ${fileName}`); await migration.up(); const model = (new MigrationFactory).create({ @@ -252,10 +252,10 @@ class MigrationService implements IMigrationService { } } catch (err) { - console.log('[Migration] createSchema', err) + App.container('logger').info('[Migration] createSchema', err) if (err instanceof Error) { - console.error(err) + App.container('logger').error(err) } } } diff --git a/src/core/domains/setup/utils/defaultCredentials.ts b/src/core/domains/setup/utils/defaultCredentials.ts index b25b9d6fa..01cb96882 100644 --- a/src/core/domains/setup/utils/defaultCredentials.ts +++ b/src/core/domains/setup/utils/defaultCredentials.ts @@ -1,3 +1,4 @@ +import { App } from "@src/core/services/App" import fs from "fs" import path from "path" @@ -17,7 +18,7 @@ const extractDefaultMongoDBCredentials = () => { } } catch (err) { - console.error(err) + App.container('logger').error(err) } return null; @@ -40,7 +41,7 @@ const extractDefaultPostgresCredentials = () => { } } catch (err) { - console.error(err) + App.container('logger').error(err) } return null; diff --git a/src/core/interfaces/ICoreContainers.ts b/src/core/interfaces/ICoreContainers.ts index f7d691fd4..140c65179 100644 --- a/src/core/interfaces/ICoreContainers.ts +++ b/src/core/interfaces/ICoreContainers.ts @@ -4,6 +4,7 @@ import { IDatabaseService } from '@src/core/domains/database/interfaces/IDatabas import { IEventService } from '@src/core/domains/events/interfaces/IEventService'; import { IRequestContext } from '@src/core/domains/express/interfaces/ICurrentRequest'; import IExpressService from '@src/core/domains/express/interfaces/IExpressService'; +import { ILoggerService } from '@src/core/domains/logger/interfaces/ILoggerService'; import IValidatorService from '@src/core/domains/validator/interfaces/IValidatorService'; import readline from 'node:readline'; @@ -57,4 +58,10 @@ export interface ICoreContainers { * Provided by '@src/core/domains/validator/providers/ValidatorProvider' */ validate: IValidatorService; + + /** + * Logger service + * Provided by '@src/core/domains/logger/providers/LoggerProvider' + */ + logger: ILoggerService; } diff --git a/src/core/providers/CoreProviders.ts b/src/core/providers/CoreProviders.ts index 56926e1ea..269636de3 100644 --- a/src/core/providers/CoreProviders.ts +++ b/src/core/providers/CoreProviders.ts @@ -3,6 +3,7 @@ import ConsoleProvider from "@src/core/domains/console/providers/ConsoleProvider import DatabaseProvider from "@src/core/domains/database/providers/DatabaseProvider"; import EventProvider from "@src/core/domains/events/providers/EventProvider"; import ExpressProvider from "@src/core/domains/express/providers/ExpressProvider"; +import LoggerProvider from "@src/core/domains/logger/providers/LoggerProvider"; import MakeProvider from "@src/core/domains/make/providers/MakeProvider"; import MigrationProvider from "@src/core/domains/migrations/providers/MigrationProvider"; import SetupProvider from "@src/core/domains/setup/providers/SetupProvider"; @@ -18,6 +19,13 @@ import { IProvider } from "@src/core/interfaces/IProvider"; */ const CoreProviders: IProvider[] = [ + /** + * Logger provider + * + * Provides logging services by utilising winston + */ + new LoggerProvider(), + /** * Console provider * @@ -80,6 +88,8 @@ const CoreProviders: IProvider[] = [ * Provides setup commands and helpers */ new SetupProvider(), + + ]; export default CoreProviders \ No newline at end of file diff --git a/src/core/services/PackageJsonService.ts b/src/core/services/PackageJsonService.ts index 87fbb8b42..1f31c266d 100644 --- a/src/core/services/PackageJsonService.ts +++ b/src/core/services/PackageJsonService.ts @@ -1,4 +1,5 @@ import { IPackageJson, IPackageJsonService } from "@src/core/interfaces/IPackageJsonService"; +import { App } from "@src/core/services/App"; import { exec } from "child_process"; import fs from "fs"; import path from "path"; @@ -27,7 +28,7 @@ export default class PackageJsonService implements IPackageJsonService { */ async installPackage(name: string) { const cmd = `yarn add ${name}` - console.log('Running command: ', cmd) + App.container('logger').info('Running command: ', cmd) await execPromise(cmd); } @@ -45,7 +46,7 @@ export default class PackageJsonService implements IPackageJsonService { } const cmd = `yarn remove ${name}` - console.log('Running command: ', cmd) + App.container('logger').info('Running command: ', cmd) await execPromise(cmd); } diff --git a/src/tests/auth/auth.test.ts b/src/tests/auth/auth.test.ts index 4b7599b88..2e36c608d 100644 --- a/src/tests/auth/auth.test.ts +++ b/src/tests/auth/auth.test.ts @@ -78,7 +78,7 @@ describe('attempt to run app with normal appConfig', () => { }); if(!result.success) { - console.error(result.joi.error); + App.container('logger').error(result.joi.error); } expect(result.success).toBeTruthy(); @@ -94,7 +94,7 @@ describe('attempt to run app with normal appConfig', () => { }); if(!result.success) { - console.error(result.joi.error); + App.container('logger').error(result.joi.error); } expect(result.success).toBeTruthy(); diff --git a/src/tests/database/dbPartialSearch.test.ts b/src/tests/database/dbPartialSearch.test.ts index 8605d267c..a60a1b5d8 100644 --- a/src/tests/database/dbPartialSearch.test.ts +++ b/src/tests/database/dbPartialSearch.test.ts @@ -51,7 +51,7 @@ describe('test partial search', () => { for(const connectionName of connections) { const documentManager = App.container('db').documentManager(connectionName).table('tests') as IDocumentManager - console.log('connectionName', connectionName) + App.container('logger').info('connectionName', connectionName) const recordOneData = { name: 'Test One', @@ -70,7 +70,7 @@ describe('test partial search', () => { const recordOne = await documentManager.findOne({ filter: { name: 'Test One'} }) const recordTwo = await documentManager.findOne({ filter: { name: 'Test Two'} }) - console.log('Created two records', recordOne, recordTwo) + App.container('logger').info('Created two records', recordOne, recordTwo) expect(recordOne.id).toBeTruthy() expect(recordTwo.id).toBeTruthy() @@ -78,17 +78,17 @@ describe('test partial search', () => { const recordBothPartial = await documentManager.findMany({ filter: { name: '%Test%' }, allowPartialSearch: true }) expect(recordBothPartial.length).toEqual(2) - console.log('recordBothPartial', recordBothPartial) + App.container('logger').info('recordBothPartial', recordBothPartial) const recordOnePartial = await documentManager.findOne({ filter: { name: '%One' }, allowPartialSearch: true }) expect(recordOnePartial?.id === recordOne.id).toBeTruthy() - console.log('recordOnePartial', recordOnePartial) + App.container('logger').info('recordOnePartial', recordOnePartial) const recordTwoPartial = await documentManager.findOne({ filter: { name: '%Two' }, allowPartialSearch: true }) expect(recordTwoPartial?.id === recordTwo.id).toBeTruthy() - console.log('recordTwoPartial', recordTwoPartial) + App.container('logger').info('recordTwoPartial', recordTwoPartial) } diff --git a/src/tests/database/dbProviders.test.ts b/src/tests/database/dbProviders.test.ts index 22aec099d..fd98ca0ff 100644 --- a/src/tests/database/dbProviders.test.ts +++ b/src/tests/database/dbProviders.test.ts @@ -63,13 +63,13 @@ describe('Combined DocumentManager Interface Test', () => { test('All DocumentManager operations', async () => { for (const connectionName of connections) { - console.log('[Connection]', connectionName); + App.container('logger').info('[Connection]', connectionName); const documentManager = App.container('db').documentManager(connectionName).table(tableName); await documentManager.truncate(); // Test insertOne and findById - console.log('--- Testing insertOne and findById ---'); + App.container('logger').info('--- Testing insertOne and findById ---'); await documentManager.truncate() const data = createDocument(); const insertedDoc = await documentManager.insertOne(data); @@ -84,7 +84,7 @@ describe('Combined DocumentManager Interface Test', () => { expect(nonExistentDoc).toBeNull(); // Test findOne - console.log('--- Testing findOne ---'); + App.container('logger').info('--- Testing findOne ---'); await documentManager.truncate() const findOneData = createDocument() await documentManager.insertOne(findOneData) @@ -97,7 +97,7 @@ describe('Combined DocumentManager Interface Test', () => { expect(nonExistentOneDoc).toBeNull(); // Test insertMany and findMany - console.log('--- Testing insertMany and findMany ---'); + App.container('logger').info('--- Testing insertMany and findMany ---'); await documentManager.truncate() const data1 = createDocument(); const data2 = createDocument(); @@ -113,7 +113,7 @@ describe('Combined DocumentManager Interface Test', () => { expect(noResults.length).toBe(0); // Test updateOne - console.log('--- Testing updateOne ---'); + App.container('logger').info('--- Testing updateOne ---'); await documentManager.truncate() const updateOneData = createDocument() const updateOneInsertedDocument = await documentManager.insertOne(updateOneData); @@ -124,7 +124,7 @@ describe('Combined DocumentManager Interface Test', () => { expect(updatedDoc?.age).toEqual(updateOneData.age); // Test updateMany - console.log('--- Testing updateMany ---'); + App.container('logger').info('--- Testing updateMany ---'); await documentManager.truncate() await documentManager.insertMany([createDocument(), createDocument(), createDocument()]); const allDocs = await documentManager.findMany({}); @@ -135,7 +135,7 @@ describe('Combined DocumentManager Interface Test', () => { expect(updatedDocs.length).toBeGreaterThanOrEqual(3); // Test belongsTo - console.log('--- Testing belongsTo ---'); + App.container('logger').info('--- Testing belongsTo ---'); const parentDoc = await documentManager.insertOne({ name: 'Parent', age: 50 @@ -156,7 +156,7 @@ describe('Combined DocumentManager Interface Test', () => { expect(relatedChildDoc?.age).toEqual(childDoc.age); // Test deleteOne - console.log('--- Testing deleteOne ---'); + App.container('logger').info('--- Testing deleteOne ---'); await documentManager.truncate() const docToDelete = await documentManager.insertOne(createDocument()); await documentManager.deleteOne(docToDelete); @@ -167,7 +167,7 @@ describe('Combined DocumentManager Interface Test', () => { expect(deletedDoc).toBeNull(); // Test deleteMany - console.log('--- Testing deleteMany ---'); + App.container('logger').info('--- Testing deleteMany ---'); await documentManager.truncate() await documentManager.insertMany([createDocument(), createDocument(), createDocument()]); const docsBeforeDelete = await documentManager.findMany({}); @@ -177,7 +177,7 @@ describe('Combined DocumentManager Interface Test', () => { expect(remainingDocs.length).toBe(0); // Test truncate - console.log('--- Testing truncate ---'); + App.container('logger').info('--- Testing truncate ---'); await documentManager.insertMany([createDocument(), createDocument()]); await documentManager.truncate(); await documentManager.findMany({}); diff --git a/src/tests/events/listeners/TestListener.ts b/src/tests/events/listeners/TestListener.ts index f2d3b5165..44694bda9 100644 --- a/src/tests/events/listeners/TestListener.ts +++ b/src/tests/events/listeners/TestListener.ts @@ -1,9 +1,10 @@ import EventListener from "@src/core/domains/events/services/EventListener"; +import { App } from "@src/core/services/App"; export class TestListener extends EventListener { handle = async (payload: any) => { - console.log('[TestListener]', payload) + App.container('logger').info('[TestListener]', payload) } } \ No newline at end of file diff --git a/src/tests/events/listeners/TestQueueListener.ts b/src/tests/events/listeners/TestQueueListener.ts index f4de063b5..719d278c1 100644 --- a/src/tests/events/listeners/TestQueueListener.ts +++ b/src/tests/events/listeners/TestQueueListener.ts @@ -1,10 +1,11 @@ import EventListener from "@src/core/domains/events/services/EventListener"; +import { App } from "@src/core/services/App"; import { TestMovieModel } from "@src/tests/models/models/TestMovie"; export class TestQueueListener extends EventListener<{name: string}> { handle = async (payload: {name: string}) => { - console.log('[TestQueueListener]', { name: payload }) + App.container('logger').info('[TestQueueListener]', { name: payload }) const movie = new TestMovieModel({ name: payload.name diff --git a/src/tests/models/modelBelongsTo.test.ts b/src/tests/models/modelBelongsTo.test.ts index e9736d028..1483360db 100644 --- a/src/tests/models/modelBelongsTo.test.ts +++ b/src/tests/models/modelBelongsTo.test.ts @@ -11,7 +11,6 @@ import { DataTypes } from 'sequelize'; const tableName = 'tests'; const connections = getTestConnectionNames() -console.log('modelBelongsTo', connections) const createTable = async (connectionName: string) => { const schema = App.container('db').schema(connectionName); @@ -54,7 +53,7 @@ describe('test belongsTo by fetching an author from a movie', () => { test('belongsTo', async () => { for(const connectionName of connections) { - console.log('[Connection]', connectionName) + App.container('logger').info('[Connection]', connectionName) await dropTable(connectionName) await createTable(connectionName) diff --git a/src/tests/models/modelCrud.test.ts b/src/tests/models/modelCrud.test.ts index b63e16838..9d7e8fc64 100644 --- a/src/tests/models/modelCrud.test.ts +++ b/src/tests/models/modelCrud.test.ts @@ -50,7 +50,7 @@ describe('test model crud', () => { test('CRUD', async () => { for(const connectionName of connections) { - console.log('[Connection]', connectionName) + App.container('logger').info('[Connection]', connectionName) App.container('db').setDefaultConnectionName(connectionName); const documentManager = App.container('db').documentManager(connectionName).table('tests'); diff --git a/src/tests/models/modelHasMany.test.ts b/src/tests/models/modelHasMany.test.ts index 0a3b16391..136f966b1 100644 --- a/src/tests/models/modelHasMany.test.ts +++ b/src/tests/models/modelHasMany.test.ts @@ -56,7 +56,7 @@ describe('test hasMany', () => { test('hasMany', async () => { for(const connectionName of connections) { - console.log('[Connection]', connectionName) + App.container('logger').info('[Connection]', connectionName) App.container('db').setDefaultConnectionName(connectionName); await truncate(connectionName); diff --git a/src/tests/validator/validator.test.ts b/src/tests/validator/validator.test.ts index c689932cd..a2f0fb794 100644 --- a/src/tests/validator/validator.test.ts +++ b/src/tests/validator/validator.test.ts @@ -46,6 +46,6 @@ describe('test validation', () => { expect(result.success).toBeFalsy(); expect(result.joi.error).toBeTruthy(); - console.log('failed validation', result.joi.error) + App.container('logger').warn('failed validation', result.joi.error) }) }); \ No newline at end of file diff --git a/src/tinker.ts b/src/tinker.ts index 19ae28a39..5680915ea 100644 --- a/src/tinker.ts +++ b/src/tinker.ts @@ -3,6 +3,7 @@ import 'tsconfig-paths/register'; import appConfig from '@src/config/app'; import Kernel from "@src/core/Kernel"; +import { App } from '@src/core/services/App'; (async () => { @@ -17,5 +18,5 @@ import Kernel from "@src/core/Kernel"; // Add your tinkers below - + App.container('logger').info('Tinkers are ready!') })(); \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 42c86d7d8..1e5dfdb37 100644 --- a/yarn.lock +++ b/yarn.lock @@ -296,6 +296,11 @@ resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== +"@colors/colors@1.6.0", "@colors/colors@^1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.6.0.tgz#ec6cd237440700bc23ca23087f513c75508958b0" + integrity sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA== + "@cspotcode/source-map-support@^0.8.0": version "0.8.1" resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" @@ -303,6 +308,15 @@ dependencies: "@jridgewell/trace-mapping" "0.3.9" +"@dabh/diagnostics@^2.0.2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@dabh/diagnostics/-/diagnostics-2.0.3.tgz#7f7e97ee9a725dffc7808d93668cc984e1dc477a" + integrity sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA== + dependencies: + colorspace "1.1.x" + enabled "2.0.x" + kuler "^2.0.0" + "@discoveryjs/json-ext@^0.5.0": version "0.5.7" resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" @@ -982,6 +996,11 @@ resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.3.tgz#6209321eb2c1712a7e7466422b8cb1fc0d9dd5d8" integrity sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw== +"@types/triple-beam@^1.3.2": + version "1.3.5" + resolved "https://registry.yarnpkg.com/@types/triple-beam/-/triple-beam-1.3.5.tgz#74fef9ffbaa198eb8b588be029f38b00299caa2c" + integrity sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw== + "@types/validator@^13.7.17": version "13.12.1" resolved "https://registry.yarnpkg.com/@types/validator/-/validator-13.12.1.tgz#8835d22f7e25b261e624d02a42fe4ade2c689a3c" @@ -1243,6 +1262,13 @@ abbrev@1: resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== +abort-controller@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" + integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== + dependencies: + event-target-shim "^5.0.0" + accepts@~1.3.8: version "1.3.8" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" @@ -1658,6 +1684,14 @@ buffer@^5.5.0: base64-js "^1.3.1" ieee754 "^1.1.13" +buffer@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" + integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.2.1" + bytes@3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" @@ -1822,7 +1856,7 @@ collect-v8-coverage@^1.0.0: resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz#c0b29bcd33bcd0779a1344c2136051e6afd3d9e9" integrity sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q== -color-convert@^1.9.0: +color-convert@^1.9.0, color-convert@^1.9.3: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== @@ -1841,21 +1875,45 @@ color-name@1.1.3: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== -color-name@~1.1.4: +color-name@^1.0.0, color-name@~1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +color-string@^1.6.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4" + integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + color-support@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== +color@^3.1.3: + version "3.2.1" + resolved "https://registry.yarnpkg.com/color/-/color-3.2.1.tgz#3544dc198caf4490c3ecc9a790b54fe9ff45e164" + integrity sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA== + dependencies: + color-convert "^1.9.3" + color-string "^1.6.0" + colorette@^2.0.14: version "2.0.20" resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== +colorspace@1.1.x: + version "1.1.4" + resolved "https://registry.yarnpkg.com/colorspace/-/colorspace-1.1.4.tgz#8d442d1186152f60453bf8070cd66eb364e59243" + integrity sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w== + dependencies: + color "^3.1.3" + text-hex "1.0.x" + commander@^10.0.1: version "10.0.1" resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" @@ -2124,6 +2182,11 @@ emoji-regex@^9.2.2: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== +enabled@2.0.x: + version "2.0.0" + resolved "https://registry.yarnpkg.com/enabled/-/enabled-2.0.0.tgz#f9dd92ec2d6f4bbc0d5d1e64e21d61cd4665e7c2" + integrity sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ== + encodeurl@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" @@ -2458,7 +2521,12 @@ etag@~1.8.1: resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== -events@^3.2.0: +event-target-shim@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" + integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== + +events@^3.2.0, events@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== @@ -2581,6 +2649,11 @@ fb-watchman@^2.0.0: dependencies: bser "2.1.1" +fecha@^4.2.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/fecha/-/fecha-4.2.3.tgz#4d9ccdbc61e8629b259fdca67e65891448d569fd" + integrity sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw== + file-entry-cache@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz#7787bddcf1131bffb92636c69457bbc0edd6d81f" @@ -2654,6 +2727,11 @@ flatted@^3.2.9: resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== +fn.name@1.x.x: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fn.name/-/fn.name-1.1.0.tgz#26cad8017967aea8731bc42961d04a3d5988accc" + integrity sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw== + for-each@^0.3.3: version "0.3.3" resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" @@ -2973,7 +3051,7 @@ iconv-lite@^0.6.2: dependencies: safer-buffer ">= 2.1.2 < 3.0.0" -ieee754@^1.1.13: +ieee754@^1.1.13, ieee754@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== @@ -3082,6 +3160,11 @@ is-arrayish@^0.2.1: resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== +is-arrayish@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== + is-bigint@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" @@ -3811,6 +3894,11 @@ kleur@^3.0.3: resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== +kuler@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/kuler/-/kuler-2.0.0.tgz#e2c570a3800388fb44407e851531c1d670b061b3" + integrity sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A== + leven@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" @@ -3898,6 +3986,18 @@ lodash@^4.17.21: resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== +logform@^2.6.0, logform@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/logform/-/logform-2.6.1.tgz#71403a7d8cae04b2b734147963236205db9b3df0" + integrity sha512-CdaO738xRapbKIMVn2m4F6KTj4j7ooJ8POVnebSgKo3KBz5axNXRAL7ZdRjIV6NOr2Uf4vjtRkxrFETOioCqSA== + dependencies: + "@colors/colors" "1.6.0" + "@types/triple-beam" "^1.3.2" + fecha "^4.2.0" + ms "^2.1.1" + safe-stable-stringify "^2.3.1" + triple-beam "^1.3.0" + lru-cache@^11.0.0: version "11.0.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-11.0.1.tgz#3a732fbfedb82c5ba7bca6564ad3f42afcb6e147" @@ -4339,6 +4439,13 @@ once@^1.3.0, once@^1.3.1, once@^1.4.0: dependencies: wrappy "1" +one-time@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/one-time/-/one-time-1.0.0.tgz#e06bc174aed214ed58edede573b433bbf827cb45" + integrity sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g== + dependencies: + fn.name "1.x.x" + onetime@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" @@ -4640,6 +4747,11 @@ pretty-format@^29.0.0, pretty-format@^29.7.0: ansi-styles "^5.0.0" react-is "^18.0.0" +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== + promise-inflight@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" @@ -4750,6 +4862,17 @@ readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: string_decoder "^1.1.1" util-deprecate "^1.0.1" +readable-stream@^4.5.2: + version "4.5.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-4.5.2.tgz#9e7fc4c45099baeed934bff6eb97ba6cf2729e09" + integrity sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g== + dependencies: + abort-controller "^3.0.0" + buffer "^6.0.3" + events "^3.3.0" + process "^0.11.10" + string_decoder "^1.3.0" + readdirp@~3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" @@ -4868,6 +4991,11 @@ safe-regex-test@^1.0.3: es-errors "^1.3.0" is-regex "^1.1.4" +safe-stable-stringify@^2.3.1: + version "2.5.0" + resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz#4ca2f8e385f2831c432a719b108a3bf7af42a1dd" + integrity sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA== + "safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" @@ -5040,6 +5168,13 @@ simple-get@^4.0.0: once "^1.3.1" simple-concat "^1.0.0" +simple-swizzle@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + integrity sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg== + dependencies: + is-arrayish "^0.3.1" + simple-update-notifier@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz#d70b92bdab7d6d90dfd73931195a30b6e3d7cebb" @@ -5146,6 +5281,11 @@ ssri@^8.0.0, ssri@^8.0.1: dependencies: minipass "^3.1.1" +stack-trace@0.0.x: + version "0.0.10" + resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" + integrity sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg== + stack-utils@^2.0.3: version "2.0.6" resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" @@ -5221,7 +5361,7 @@ string.prototype.trimstart@^1.0.8: define-properties "^1.2.1" es-object-atoms "^1.0.0" -string_decoder@^1.1.1: +string_decoder@^1.1.1, string_decoder@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== @@ -5368,6 +5508,11 @@ test-exclude@^6.0.0: glob "^7.1.4" minimatch "^3.0.4" +text-hex@1.0.x: + version "1.0.0" + resolved "https://registry.yarnpkg.com/text-hex/-/text-hex-1.0.0.tgz#69dc9c1b17446ee79a92bf5b884bb4b9127506f5" + integrity sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg== + text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" @@ -5412,6 +5557,11 @@ tr46@^4.1.1: dependencies: punycode "^2.3.0" +triple-beam@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/triple-beam/-/triple-beam-1.4.1.tgz#6fde70271dc6e5d73ca0c3b24e2d92afb7441984" + integrity sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg== + ts-api-utils@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1" @@ -5811,6 +5961,32 @@ wildcard@^2.0.0: resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.1.tgz#5ab10d02487198954836b6349f74fff961e10f67" integrity sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ== +winston-transport@^4.7.0: + version "4.8.0" + resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.8.0.tgz#a15080deaeb80338455ac52c863418c74fcf38ea" + integrity sha512-qxSTKswC6llEMZKgCQdaWgDuMJQnhuvF5f2Nk3SNXc4byfQ+voo2mX1Px9dkNOuR8p0KAjfPG29PuYUSIb+vSA== + dependencies: + logform "^2.6.1" + readable-stream "^4.5.2" + triple-beam "^1.3.0" + +winston@^3.15.0: + version "3.15.0" + resolved "https://registry.yarnpkg.com/winston/-/winston-3.15.0.tgz#4df7b70be091bc1a38a4f45b969fa79589b73ff5" + integrity sha512-RhruH2Cj0bV0WgNL+lOfoUBI4DVfdUNjVnJGVovWZmrcKtrFTTRzgXYK2O9cymSGjrERCtaAeHwMNnUWXlwZow== + dependencies: + "@colors/colors" "^1.6.0" + "@dabh/diagnostics" "^2.0.2" + async "^3.2.3" + is-stream "^2.0.0" + logform "^2.6.0" + one-time "^1.0.0" + readable-stream "^3.4.0" + safe-stable-stringify "^2.3.1" + stack-trace "0.0.x" + triple-beam "^1.3.0" + winston-transport "^4.7.0" + wkx@^0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/wkx/-/wkx-0.5.0.tgz#c6c37019acf40e517cc6b94657a25a3d4aa33e8c"