Skip to content

Commit

Permalink
chore(logger): new mechanism for InjectLogger
Browse files Browse the repository at this point in the history
  • Loading branch information
Avivbens committed May 10, 2024
1 parent 5fcc950 commit 7bc50e4
Show file tree
Hide file tree
Showing 20 changed files with 93 additions and 35 deletions.
5 changes: 3 additions & 2 deletions src/app.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,9 @@ import { ShellCommand } from '@commands/shell/shell.command'
import { UpdateCommand } from '@commands/update/update.command'
import { HttpModule } from '@nestjs/axios'
import { Module } from '@nestjs/common'
import { LoggerModule } from '@services/logger/logger.module'
import { CheckUpdateService } from './services/check-update.service'
import { LoggerService } from './services/logger.service'
import { LoggerService } from './services/logger/logger.service'

const COMMANDS = [
InitCommand,
Expand All @@ -21,7 +22,7 @@ const COMMANDS = [
]

@Module({
imports: [HttpModule],
imports: [HttpModule, LoggerModule.register()],
providers: [LoggerService, CheckUpdateService, ...COMMANDS],
})
export class AppModule {}
5 changes: 2 additions & 3 deletions src/commands/assets/assets.command.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { Command, CommandRunner } from 'nest-commander'
import { mkdir, readdir, writeFile } from 'node:fs/promises'
import { execPromise } from '@common/utils'
import { CheckUpdateService } from '@services/check-update.service'
import { LoggerService } from '@services/logger.service'
import { InjectLogger, LoggerService } from '@services/logger'
import type { AvailableActionIds } from './config/ constants.config'
import { GIT_PROFILES_TARGET, HELP_BOX_MESSAGE, NPM_PROFILES_TARGET } from './config/ constants.config'
import {
Expand All @@ -25,11 +25,10 @@ import { replaceInTemplate } from './template-handle/replace-in-template'
})
export class AssetsCommand extends CommandRunner {
constructor(
private readonly logger: LoggerService,
@InjectLogger(AssetsCommand.name) private readonly logger: LoggerService,
private readonly checkUpdateService: CheckUpdateService,
) {
super()
this.logger.setContext(AssetsCommand.name)
}

async run(inputs: string[], options: unknown): Promise<void> {
Expand Down
5 changes: 2 additions & 3 deletions src/commands/external/sub-commands/delete.sub-command.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { CommandRunner, SubCommand } from 'nest-commander'
import { readdir, rm } from 'node:fs/promises'
import { CheckUpdateService } from '@services/check-update.service'
import { LoggerService } from '@services/logger.service'
import { InjectLogger, LoggerService } from '@services/logger'
import { EXTERNAL_REGISTRY_DIR_PATH } from '../config/constants'

@SubCommand({
Expand All @@ -11,11 +11,10 @@ import { EXTERNAL_REGISTRY_DIR_PATH } from '../config/constants'
})
export class DeleteSubCommand extends CommandRunner {
constructor(
private readonly logger: LoggerService,
@InjectLogger(DeleteSubCommand.name) private readonly logger: LoggerService,
private readonly checkUpdateService: CheckUpdateService,
) {
super()
this.logger.setContext(DeleteSubCommand.name)
}

async run(inputs: string[], options: Record<string, unknown>): Promise<void> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
import type { TestingModule } from '@nestjs/testing'
import { Test } from '@nestjs/testing'
import { CheckUpdateService } from '@services/check-update.service'
import { LoggerService } from '@services/logger.service'
import { loggerMockCreator } from '@services/logger/testing/logger.mock'
import { InstallSubCommand } from './install.sub-command'

describe('InstallSubCommand', () => {
Expand All @@ -12,10 +12,7 @@ describe('InstallSubCommand', () => {
const module: TestingModule = await Test.createTestingModule({
providers: [
InstallSubCommand,
{
provide: LoggerService,
useValue: { setContext: jest.fn() },
},
loggerMockCreator(InstallSubCommand.name),
{
provide: CheckUpdateService,
useValue: { checkUpdate: jest.fn() },
Expand Down
4 changes: 2 additions & 2 deletions src/commands/external/sub-commands/install.sub-command.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { CommandRunner, SubCommand } from 'nest-commander'
import { existsSync } from 'node:fs'
import { copyFile, readdir } from 'node:fs/promises'
import { CheckUpdateService } from '@services/check-update.service'
import { LoggerService } from '@services/logger.service'
import { InjectLogger, LoggerService } from '@services/logger'
import { EXTERNAL_REGISTRY_DIR_PATH } from '../config/constants'

@SubCommand({
Expand All @@ -17,7 +17,7 @@ import { EXTERNAL_REGISTRY_DIR_PATH } from '../config/constants'
})
export class InstallSubCommand extends CommandRunner {
constructor(
private readonly logger: LoggerService,
@InjectLogger(InstallSubCommand.name) private readonly logger: LoggerService,
private readonly checkUpdateService: CheckUpdateService,
) {
super()
Expand Down
4 changes: 2 additions & 2 deletions src/commands/external/sub-commands/list.sub-command.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { CommandRunner, SubCommand } from 'nest-commander'
import { readdir } from 'node:fs/promises'
import { CheckUpdateService } from '@services/check-update.service'
import { LoggerService } from '@services/logger.service'
import { InjectLogger, LoggerService } from '@services/logger'
import { EXTERNAL_REGISTRY_DIR_PATH } from '../config/constants'

@SubCommand({
Expand All @@ -11,7 +11,7 @@ import { EXTERNAL_REGISTRY_DIR_PATH } from '../config/constants'
})
export class ListSubCommand extends CommandRunner {
constructor(
private readonly logger: LoggerService,
@InjectLogger(ListSubCommand.name) private readonly logger: LoggerService,
private readonly checkUpdateService: CheckUpdateService,
) {
super()
Expand Down
4 changes: 2 additions & 2 deletions src/commands/init/init.command.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import ora from 'ora'
import { BASE_PATH } from '@common/constants'
import { copyBundledAsset, execPromise, resolveBundledAsset } from '@common/utils'
import { CheckUpdateService } from '@services/check-update.service'
import { LoggerService } from '@services/logger.service'
import { InjectLogger, LoggerService } from '@services/logger'
import {
BREW_DIRECTORY,
BREW_INSTALLATION_COMMAND,
Expand All @@ -25,7 +25,7 @@ import { LINK_SHELL_COMMAND, LINK_SHELL_COMMAND_EXISTS } from './config/link-com
})
export class InitCommand extends CommandRunner {
constructor(
private readonly logger: LoggerService,
@InjectLogger(InitCommand.name) private readonly logger: LoggerService,
private readonly checkUpdateService: CheckUpdateService,
) {
super()
Expand Down
4 changes: 2 additions & 2 deletions src/commands/install/install.command.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import { execPromise } from '@common/utils'
import type { IAppSetup } from '@models/app-setup.model'
import { ITag, TAGS_DEPS } from '@models/tag.model'
import { CheckUpdateService } from '@services/check-update.service'
import { LoggerService } from '@services/logger.service'
import { InjectLogger, LoggerService } from '@services/logger'
import { APPS_CONFIG_MAP } from './config/apps.config'
import { MULTI_SELECT_APPS_PROMPT_V2 } from './config/multi-select-apps.config'
import { HELP_BOX_MESSAGE, TASKS_CONFIG } from './config/parallel.config'
Expand All @@ -24,7 +24,7 @@ export class InstallCommand extends CommandRunner {
private readonly installMap = new Map<string, boolean>()

constructor(
private readonly logger: LoggerService,
@InjectLogger(InstallCommand.name) private readonly logger: LoggerService,
private readonly checkUpdateService: CheckUpdateService,
) {
super()
Expand Down
4 changes: 2 additions & 2 deletions src/commands/shell/shell.command.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { resolve } from 'node:path'
import { BASE_PATH } from '@common/constants'
import type { IShellModule } from '@models/shell-module.model'
import { CheckUpdateService } from '@services/check-update.service'
import { LoggerService } from '@services/logger.service'
import { InjectLogger, LoggerService } from '@services/logger'
import { MULTI_SELECT_MODULES_PROMPT } from './config/multi-select-modules.config'
import { EXTENDS_MODULES_DIR_PATH, LOCAL_MODULES_DIR_PATH, MODULES_MAP } from './config/shell-modules.config'

Expand All @@ -15,7 +15,7 @@ import { EXTENDS_MODULES_DIR_PATH, LOCAL_MODULES_DIR_PATH, MODULES_MAP } from '.
})
export class ShellCommand extends CommandRunner {
constructor(
private readonly logger: LoggerService,
@InjectLogger(ShellCommand.name) private readonly logger: LoggerService,
private readonly checkUpdateService: CheckUpdateService,
) {
super()
Expand Down
7 changes: 2 additions & 5 deletions src/commands/update/update.command.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
import type { TestingModule } from '@nestjs/testing'
import { Test } from '@nestjs/testing'
import { CheckUpdateService } from '@services/check-update.service'
import { LoggerService } from '@services/logger.service'
import { loggerMockCreator } from '@services/logger/testing/logger.mock'
import { UpdateCommand } from './update.command'

describe('UpdateCommand', () => {
Expand All @@ -12,10 +12,7 @@ describe('UpdateCommand', () => {
const module: TestingModule = await Test.createTestingModule({
providers: [
UpdateCommand,
{
provide: LoggerService,
useValue: { setContext: jest.fn() },
},
loggerMockCreator(UpdateCommand.name),
{
provide: CheckUpdateService,
useValue: {},
Expand Down
4 changes: 2 additions & 2 deletions src/commands/update/update.command.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { env } from 'node:process'
import ora from 'ora'
import { execPromise } from '@common/utils'
import { CheckUpdateService } from '@services/check-update.service'
import { LoggerService } from '@services/logger.service'
import { InjectLogger, LoggerService } from '@services/logger'
import {
DOWNLOAD_FILE_PATH,
DOWNLOAD_SCRIPT_CUSTOM,
Expand All @@ -23,7 +23,7 @@ import type { IUpdateCommandOptions } from './models/update-command.options'
})
export class UpdateCommand extends CommandRunner {
constructor(
private readonly logger: LoggerService,
@InjectLogger(UpdateCommand.name) private readonly logger: LoggerService,
private readonly checkUpdateService: CheckUpdateService,
) {
super()
Expand Down
2 changes: 1 addition & 1 deletion src/common/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { exec } from 'node:child_process'
import { mkdir, readFile, readdir, stat, writeFile } from 'node:fs/promises'
import { resolve } from 'node:path'
import { promisify } from 'node:util'
import type { LoggerService } from '../services/logger.service'
import type { LoggerService } from '@services/logger/logger.service'

/**
* @param currentDirectory - __dirname
Expand Down
2 changes: 1 addition & 1 deletion src/services/check-update.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import type { IReleasesAPIRes } from '@models/releases-api.model'
import { HttpService } from '@nestjs/axios'
import { Injectable } from '@nestjs/common'
import packageJson from '../../package.json'
import { LoggerService } from './logger.service'
import { LoggerService } from './logger/logger.service'

@Injectable()
export class CheckUpdateService {
Expand Down
1 change: 1 addition & 0 deletions src/services/logger/decorators/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from './logger.decorator'
28 changes: 28 additions & 0 deletions src/services/logger/decorators/logger.decorator.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import type { Provider } from '@nestjs/common'
import { Inject } from '@nestjs/common'
import { LoggerService } from '../logger.service'

export const LOGGER_PROVIDER_PREFIX = (name: string) => `[injectLogger]${name}`

const LOGGERS: string[] = []

function loggerProvider(loggerName: string): Provider<LoggerService> {
return {
provide: LOGGER_PROVIDER_PREFIX(loggerName),
useFactory: () => {
const logger = new LoggerService()
logger.setContext(loggerName)
return logger
},
}
}

export function createLoggersProviders(): Provider<LoggerService>[] {
const providers = LOGGERS.map((loggerName) => loggerProvider(loggerName))
return providers
}

export const InjectLogger = (loggerName: string): ParameterDecorator => {
!LOGGERS.includes(loggerName) && LOGGERS.push(loggerName)
return Inject(LOGGER_PROVIDER_PREFIX(loggerName))
}
2 changes: 2 additions & 0 deletions src/services/logger/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
export * from './decorators'
export * from './logger.service'
File renamed without changes.
16 changes: 16 additions & 0 deletions src/services/logger/logger.module.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import { DynamicModule, Module } from '@nestjs/common'
import { createLoggersProviders } from './decorators'
import { LoggerService } from './logger.service'

@Module({})
export class LoggerModule {
static register(): DynamicModule {
const LOGGERS_PROVIDERS = createLoggersProviders()

return {
module: LoggerModule,
providers: [LoggerService, ...LOGGERS_PROVIDERS],
exports: [LoggerService, ...LOGGERS_PROVIDERS],
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,7 @@ export class LoggerService {
}
public warn(message: string) {
const generatedMessage = this.generateMessage(message)
// set color to yellow
console.warn(`\x1b[33m${message}\x1b[0m`)
console.warn(this.coloredMessage(message, 'yellow'))
appendFile(this.logPath, `WARN | ${generatedMessage}\n`, { mode: 0o770 })
}
public debug(message: string) {
Expand All @@ -46,7 +45,7 @@ export class LoggerService {
return coloredMessage
}

private generateMessage(message: string, color?: Color): string {
private generateMessage(message: string): string {
return `INSTANCE: ${BOOTSTRAP_UUID} | ${new Date().toLocaleString()} |${this.context}${message}`
}

Expand Down
19 changes: 19 additions & 0 deletions src/services/logger/testing/logger.mock.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import type { Provider } from '@nestjs/common'
import { LOGGER_PROVIDER_PREFIX } from '../decorators'
import type { LoggerService } from '../logger.service'

const loggerMock: Partial<Record<keyof LoggerService, any>> = {
debug: jest.fn(),
error: jest.fn(),
log: jest.fn(),
setContext: jest.fn(),
warn: jest.fn(),
}

export const loggerMockCreator = (loggerName: string): Provider => {
const provide = LOGGER_PROVIDER_PREFIX(loggerName)
return {
provide,
useValue: loggerMock,
}
}

0 comments on commit 7bc50e4

Please sign in to comment.