diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..b446905 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,11 @@ +{ + "tabWidth": 2, + "useTabs": false, + "semi": true, + "singleQuote": true, + "quoteProps": "as-needed", + "trailingComma": "all", + "bracketSpacing": true, + "objectWrap": "preserve", + "arrowParens": "always" +} \ No newline at end of file diff --git a/.yarn/install-state.gz b/.yarn/install-state.gz index 63b4182..1fcbde9 100644 Binary files a/.yarn/install-state.gz and b/.yarn/install-state.gz differ diff --git a/package.json b/package.json index 0265c83..add8c81 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,7 @@ }, "devDependencies": { "@types/node": "^20.9.1", + "prettier": "^3.5.3", "rimraf": "^5.0.5", "ts-node": "^10.9.1", "typescript": "^5.2.2" @@ -24,7 +25,8 @@ "build": "rimraf ./dist/lib && tsc --project tsconfig.build.json", "up": "yarn docs && yarn build && yarn npm publish dist", "up:beta": "yarn docs && yarn build && yarn npm publish dist --tag beta", - "test": "ts-node ./src/test/index.ts" + "test": "ts-node ./src/test/index.ts", + "format": "prettier --write \"./src/**/*.ts\"" }, "packageManager": "yarn@4.7.0+sha512.5a0afa1d4c1d844b3447ee3319633797bcd6385d9a44be07993ae52ff4facabccafb4af5dcd1c2f9a94ac113e5e9ff56f6130431905884414229e284e37bb7c9" } diff --git a/src/index.ts b/src/index.ts index a4f5c5a..cec08a5 100644 --- a/src/index.ts +++ b/src/index.ts @@ -5,8 +5,8 @@ export { LoggedInjectable, LoggedGuard, LoggedInterceptor, -} from "./logged"; -export { ScopedLogger } from "./logger"; +} from './logged'; +export { ScopedLogger } from './logger'; export { InjectLogger, LoggedParam, @@ -14,8 +14,6 @@ export { LoggedBody, LoggedQuery, Logged, - Returns -} from "./reflected"; -export { - getRequestLogger -} from './utils' \ No newline at end of file + Returns, +} from './reflected'; +export { getRequestLogger } from './utils'; diff --git a/src/internals/nest.ts b/src/internals/nest.ts index 80f8591..059d19c 100644 --- a/src/internals/nest.ts +++ b/src/internals/nest.ts @@ -1,44 +1,52 @@ -import {RouteParamtypes} from '@nestjs/common/enums/route-paramtypes.enum'; -import {assignMetadata, ParamData, PipeTransform, RouteParamMetadata, Type} from "@nestjs/common"; -import {ROUTE_ARGS_METADATA} from '@nestjs/common/constants'; -import {isNil, isString} from "@nestjs/common/utils/shared.utils"; +import { RouteParamtypes } from '@nestjs/common/enums/route-paramtypes.enum'; +import { + assignMetadata, + ParamData, + PipeTransform, + RouteParamMetadata, + Type, +} from '@nestjs/common'; +import { ROUTE_ARGS_METADATA } from '@nestjs/common/constants'; +import { isNil, isString } from '@nestjs/common/utils/shared.utils'; export { RouteParamtypes, PipeTransform, Type, ROUTE_ARGS_METADATA }; export function createRouteParamDecorator(paramtype: RouteParamtypes) { return (data?: ParamData): ParameterDecorator => (target, key, index) => { - const args = Reflect.getMetadata(ROUTE_ARGS_METADATA, target.constructor, key) || {}; + const args = + Reflect.getMetadata(ROUTE_ARGS_METADATA, target.constructor, key) || {}; Reflect.defineMetadata( ROUTE_ARGS_METADATA, assignMetadata>( - args, - paramtype, - index, - data, + args, + paramtype, + index, + data, ), target.constructor, key, ); }; -}; - +} + export const createPipesRouteParamDecorator = (paramtype: RouteParamtypes) => - ( - data?: any, - ...pipes: (Type | PipeTransform)[] - ): ParameterDecorator => - (target, key, index) => { - const args = Reflect.getMetadata(ROUTE_ARGS_METADATA, target.constructor, key) || {}; - const hasParamData = isNil(data) || isString(data); - const paramData = hasParamData ? data : undefined; - const paramPipes = hasParamData ? pipes : [data, ...pipes]; - - Reflect.defineMetadata( - ROUTE_ARGS_METADATA, - assignMetadata(args, paramtype, index, paramData, ...paramPipes), - target.constructor, - key, - ); - }; \ No newline at end of file + ( + data?: any, + ...pipes: (Type | PipeTransform)[] + ): ParameterDecorator => + (target, key, index) => { + const args = + Reflect.getMetadata(ROUTE_ARGS_METADATA, target.constructor, key) || {}; + const hasParamData = isNil(data) || isString(data); + const paramData = hasParamData ? data : undefined; + const paramPipes = hasParamData ? pipes : [data, ...pipes]; + + Reflect.defineMetadata( + ROUTE_ARGS_METADATA, + assignMetadata(args, paramtype, index, paramData, ...paramPipes), + target.constructor, + key, + ); + }; diff --git a/src/internals/utils.ts b/src/internals/utils.ts index f76fc1f..a78179c 100644 --- a/src/internals/utils.ts +++ b/src/internals/utils.ts @@ -1,48 +1,53 @@ -export const notIncludedSymbol = Symbol("notIncluded"); +export const notIncludedSymbol = Symbol('notIncluded'); export function includeObjectSync( ocv: any, opt: { - paths: string[], - } + paths: string[]; + }, ) { - let current = Array.isArray(ocv) ? [] : typeof ocv === 'object' ? {} : ocv + let current = Array.isArray(ocv) ? [] : typeof ocv === 'object' ? {} : ocv; opt.paths.forEach((dotpath) => { let query = ocv; let objRef = current; const path = dotpath.split('.'); for (const [index, key] of Object.entries(path)) { - query = query[key] + query = query[key]; if (query !== undefined && objRef[key] === undefined) { if (typeof query === 'object') { if (Array.isArray(query)) { - objRef[key] = [] + objRef[key] = []; } else { - objRef[key] = {} + objRef[key] = {}; } } } if (typeof query !== 'object' || index === (path.length - 1).toString()) { objRef[key] = query; - break + break; } - objRef = objRef[key] + objRef = objRef[key]; } - }) + }); return current; } export function excludeObjectSync( ocv: any, opt: { - paths: string[] - } + paths: string[]; + }, ) { - const copied = typeof ocv === 'object' ? Array.isArray(ocv) ? [...ocv] : { ...ocv } : ocv; + const copied = + typeof ocv === 'object' + ? Array.isArray(ocv) + ? [...ocv] + : { ...ocv } + : ocv; opt.paths.forEach((dotpath) => { let objRef = copied; - const path = dotpath.split('.') - const lastIndex = (path.length - 1).toString() + const path = dotpath.split('.'); + const lastIndex = (path.length - 1).toString(); for (const [index, key] of Object.entries(path)) { if (index === lastIndex) { delete objRef[key]; @@ -53,9 +58,9 @@ export function excludeObjectSync( break; } } - }) + }); - return copied + return copied; } export function objectContainedLogSync( @@ -63,34 +68,30 @@ export function objectContainedLogSync( options?: { include?: string[]; exclude?: string[]; - } + }, ): string { if (options && typeof ocv === 'object' && ocv !== null) { if (options.include && options.include.length > 0) { - return JSON.stringify( - includeObjectSync(ocv, { paths: options.include }) - ); + return JSON.stringify(includeObjectSync(ocv, { paths: options.include })); } if (options.exclude && options.exclude.length > 0) { - return JSON.stringify( - excludeObjectSync(ocv, { paths: options.exclude }) - ) + return JSON.stringify(excludeObjectSync(ocv, { paths: options.exclude })); } } - if (typeof ocv === "object" && ocv !== null) { + if (typeof ocv === 'object' && ocv !== null) { return JSON.stringify(ocv); } else { - return `${ocv}` + return `${ocv}`; } } export function getItemByPathSync(obj: object, path: string | string[]) { - const paths = Array.isArray(path) ? path : path.split("."); + const paths = Array.isArray(path) ? path : path.split('.'); return Object.keys(obj).includes(paths[0]) - ? typeof obj[paths[0]] === "object" + ? typeof obj[paths[0]] === 'object' ? getItemByPathSync(obj[paths[0]], paths.slice(1)) : obj[paths[0]] : undefined; -} \ No newline at end of file +} diff --git a/src/logged/class.ts b/src/logged/class.ts index b8b47dc..1b1561e 100644 --- a/src/logged/class.ts +++ b/src/logged/class.ts @@ -3,30 +3,24 @@ import { Controller, ControllerOptions, ScopeOptions, -} from "@nestjs/common"; -import { - loggerInit, - RevRequestMethod -} from './utils'; -import { - LoggedRoute, - LoggedFunction -} from "./methods"; +} from '@nestjs/common'; +import { loggerInit, RevRequestMethod } from './utils'; +import { LoggedRoute, LoggedFunction } from './methods'; export function LoggedInjectable( - options?: ScopeOptions & { verbose?: boolean } + options?: ScopeOptions & { verbose?: boolean }, ) { return (target: any) => { loggerInit(target.prototype); - + const logger = target.prototype.logger; - + const methods = Object.getOwnPropertyNames(target.prototype); - + methods.forEach((method) => { if ( - method !== "constructor" && - typeof target.prototype[method] === "function" + method !== 'constructor' && + typeof target.prototype[method] === 'function' ) { if (options && options.verbose) logger.log(`LoggedFunction applied to ${method}`); @@ -39,49 +33,49 @@ export function LoggedInjectable( Injectable(options)(target); }; } - - export function LoggedController(): (target: any) => void; - export function LoggedController( - prefix: string | string[] - ): (target: any) => void; - export function LoggedController( - options: ControllerOptions & { verbose?: boolean } - ): (target: any) => void; - - export function LoggedController(param?: any): (target: any) => void { - return (target: any) => { - loggerInit(target.prototype); - - const logger = target.prototype.logger; - - const methods = Object.getOwnPropertyNames(target.prototype); - - let verbose = - typeof param === "object" && Object.keys(param).includes("verbose") - ? param.verbose - : false; - - methods.forEach((method) => { - if ( - method !== "constructor" && - typeof target.prototype[method] === "function" - ) { - if (verbose) { - const path = Reflect.getMetadata("path", target.prototype[method]); - const httpMethod = Reflect.getMetadata( - "method", - target.prototype[method] - ); - logger.log( - `LoggedRoute applied to ${method} (${RevRequestMethod[httpMethod]} ${path})` - ); - } - LoggedRoute()(target.prototype, method, { - value: target.prototype[method], - }); + +export function LoggedController(): (target: any) => void; +export function LoggedController( + prefix: string | string[], +): (target: any) => void; +export function LoggedController( + options: ControllerOptions & { verbose?: boolean }, +): (target: any) => void; + +export function LoggedController(param?: any): (target: any) => void { + return (target: any) => { + loggerInit(target.prototype); + + const logger = target.prototype.logger; + + const methods = Object.getOwnPropertyNames(target.prototype); + + let verbose = + typeof param === 'object' && Object.keys(param).includes('verbose') + ? param.verbose + : false; + + methods.forEach((method) => { + if ( + method !== 'constructor' && + typeof target.prototype[method] === 'function' + ) { + if (verbose) { + const path = Reflect.getMetadata('path', target.prototype[method]); + const httpMethod = Reflect.getMetadata( + 'method', + target.prototype[method], + ); + logger.log( + `LoggedRoute applied to ${method} (${RevRequestMethod[httpMethod]} ${path})`, + ); } - }); - - Controller(param)(target); - }; - } \ No newline at end of file + LoggedRoute()(target.prototype, method, { + value: target.prototype[method], + }); + } + }); + + Controller(param)(target); + }; +} diff --git a/src/logged/index.ts b/src/logged/index.ts index d6e5803..67b66e2 100644 --- a/src/logged/index.ts +++ b/src/logged/index.ts @@ -1,2 +1,2 @@ -export * from "./methods"; -export { LoggedController, LoggedInjectable } from "./class" \ No newline at end of file +export * from './methods'; +export { LoggedController, LoggedInjectable } from './class'; diff --git a/src/logged/metadata.ts b/src/logged/metadata.ts index a48d753..6715a23 100644 --- a/src/logged/metadata.ts +++ b/src/logged/metadata.ts @@ -1,21 +1,21 @@ import { OverrideBuildOptions, defaultOverrideBuildOptions } from './utils'; -export const nestLoggedMetadata = Symbol("nlogdec-metadata"); +export const nestLoggedMetadata = Symbol('nlogdec-metadata'); export class LoggedMetadata { - options: OverrideBuildOptions + options: OverrideBuildOptions; constructor(options?: Partial) { this.options = { ...defaultOverrideBuildOptions, ...(options ?? {}), - } + }; } updateOption(options: Partial) { this.options = { ...this.options, - ...options - } + ...options, + }; } -} \ No newline at end of file +} diff --git a/src/logged/methods/function.ts b/src/logged/methods/function.ts index 75110e1..3805302 100644 --- a/src/logged/methods/function.ts +++ b/src/logged/methods/function.ts @@ -1,16 +1,22 @@ -import { Logger } from "@nestjs/common"; -import { OverrideBuildOptions, loggerInit } from "../utils"; -import { LoggedMetadata, nestLoggedMetadata } from "../metadata"; -import { loggedParam, scopedLogger, returns, ReturnsReflectData, LoggedParamReflectData } from "../../reflected"; -import { overrideBuild } from "../override"; +import { Logger } from '@nestjs/common'; +import { OverrideBuildOptions, loggerInit } from '../utils'; +import { LoggedMetadata, nestLoggedMetadata } from '../metadata'; +import { + loggedParam, + scopedLogger, + returns, + ReturnsReflectData, + LoggedParamReflectData, +} from '../../reflected'; +import { overrideBuild } from '../override'; export function LoggedFunction, R>( - options?: Partial + options?: Partial, ) { return ( _target: any, key: string, - descriptor: TypedPropertyDescriptor<(...args: F) => R | Promise> + descriptor: TypedPropertyDescriptor<(...args: F) => R | Promise>, ) => { loggerInit(_target); @@ -18,9 +24,9 @@ export function LoggedFunction, R>( const fn = descriptor.value; - if (!fn || typeof fn !== "function") { + if (!fn || typeof fn !== 'function') { logger.warn( - `LoggedFunction decorator applied to non-function property: ${key}` + `LoggedFunction decorator applied to non-function property: ${key}`, ); return; } @@ -28,12 +34,12 @@ export function LoggedFunction, R>( const logMetadata: LoggedMetadata | undefined = Reflect.getOwnMetadata( nestLoggedMetadata, _target, - key - ) + key, + ); if (logMetadata) { // already applied, override instead - logMetadata.updateOption(options) - return + logMetadata.updateOption(options); + return; } const newMetadata = new LoggedMetadata(options); @@ -45,18 +51,18 @@ export function LoggedFunction, R>( const scopedLoggerInjectableParam: number = Reflect.getOwnMetadata( scopedLogger, _target, - key + key, ); const loggedParams: LoggedParamReflectData[] = Reflect.getOwnMetadata( loggedParam, _target, - key + key, ); const returnsData: ReturnsReflectData[] | true = Reflect.getOwnMetadata( returns, - fn + fn, ); const overrideFunction = overrideBuild( @@ -75,15 +81,10 @@ export function LoggedFunction, R>( _target[key] = overrideFunction; descriptor.value = overrideFunction; - Reflect.defineMetadata( - nestLoggedMetadata, - newMetadata, - _target, - key - ) + Reflect.defineMetadata(nestLoggedMetadata, newMetadata, _target, key); all.forEach(([k, v]) => { Reflect.defineMetadata(k, v, _target[key]); Reflect.defineMetadata(k, v, descriptor.value); }); - } -} \ No newline at end of file + }; +} diff --git a/src/logged/methods/guard.ts b/src/logged/methods/guard.ts index 8f8d0e6..0cb592b 100644 --- a/src/logged/methods/guard.ts +++ b/src/logged/methods/guard.ts @@ -1,14 +1,18 @@ -import { ExecutionContext, Logger } from "@nestjs/common"; -import { OverrideBuildOptions, loggerInit } from "../utils"; -import { LoggedMetadata, nestLoggedMetadata } from "../metadata"; -import { scopedLogger, returns, ReturnsReflectData } from "../../reflected"; -import { overrideBuild } from "../override"; +import { ExecutionContext, Logger } from '@nestjs/common'; +import { OverrideBuildOptions, loggerInit } from '../utils'; +import { LoggedMetadata, nestLoggedMetadata } from '../metadata'; +import { scopedLogger, returns, ReturnsReflectData } from '../../reflected'; +import { overrideBuild } from '../override'; -export function LoggedGuard, R>(options?: Partial) { +export function LoggedGuard, R>( + options?: Partial, +) { return ( _target: any, key: string, - descriptor: TypedPropertyDescriptor<(context: ExecutionContext, ...args: F) => R> + descriptor: TypedPropertyDescriptor< + (context: ExecutionContext, ...args: F) => R + >, ) => { loggerInit(_target); @@ -16,9 +20,9 @@ export function LoggedGuard, R>(options?: Partial, R>(options?: Partial, R>(options?: Partial, R>(options?: Partial { Reflect.defineMetadata(k, v, _target[key]); Reflect.defineMetadata(k, v, descriptor.value); }); - } -} \ No newline at end of file + }; +} diff --git a/src/logged/methods/index.ts b/src/logged/methods/index.ts index 48548ea..9aeedf1 100644 --- a/src/logged/methods/index.ts +++ b/src/logged/methods/index.ts @@ -1,5 +1,5 @@ -export { LoggedFunction } from "./function"; -export { LoggedRoute } from "./route"; -export { LoggedGuard } from "./guard"; -export { LoggedInterceptor } from "./interceptor"; -export { LoggedMiddleware } from "./middleware"; \ No newline at end of file +export { LoggedFunction } from './function'; +export { LoggedRoute } from './route'; +export { LoggedGuard } from './guard'; +export { LoggedInterceptor } from './interceptor'; +export { LoggedMiddleware } from './middleware'; diff --git a/src/logged/methods/interceptor.ts b/src/logged/methods/interceptor.ts index b3e29af..2a1bf72 100644 --- a/src/logged/methods/interceptor.ts +++ b/src/logged/methods/interceptor.ts @@ -1,15 +1,19 @@ -import { OverrideBuildOptions } from "../utils"; -import { ExecutionContext, Logger } from "@nestjs/common"; -import { loggerInit } from "../utils"; +import { OverrideBuildOptions } from '../utils'; +import { ExecutionContext, Logger } from '@nestjs/common'; +import { loggerInit } from '../utils'; import { LoggedMetadata, nestLoggedMetadata } from '../metadata'; -import { scopedLogger, returns, ReturnsReflectData } from "../../reflected"; -import { overrideBuild } from "../override"; +import { scopedLogger, returns, ReturnsReflectData } from '../../reflected'; +import { overrideBuild } from '../override'; -export function LoggedInterceptor, R>(options?: Partial) { +export function LoggedInterceptor, R>( + options?: Partial, +) { return ( _target: any, key: string, - descriptor: TypedPropertyDescriptor<(context: ExecutionContext, ...args: F) => R> + descriptor: TypedPropertyDescriptor< + (context: ExecutionContext, ...args: F) => R + >, ) => { loggerInit(_target); @@ -17,9 +21,9 @@ export function LoggedInterceptor, R>(options?: Partial, R>(options?: Partial, R>(options?: Partial, R>(options?: Partial { Reflect.defineMetadata(k, v, _target[key]); Reflect.defineMetadata(k, v, descriptor.value); }); - } -} \ No newline at end of file + }; +} diff --git a/src/logged/methods/middleware.ts b/src/logged/methods/middleware.ts index 613cbd5..0c33318 100644 --- a/src/logged/methods/middleware.ts +++ b/src/logged/methods/middleware.ts @@ -1,15 +1,19 @@ -import { OverrideBuildOptions } from "../utils"; -import { ExecutionContext, Logger } from "@nestjs/common"; -import { loggerInit } from "../utils"; +import { OverrideBuildOptions } from '../utils'; +import { ExecutionContext, Logger } from '@nestjs/common'; +import { loggerInit } from '../utils'; import { LoggedMetadata, nestLoggedMetadata } from '../metadata'; -import { scopedLogger, returns, ReturnsReflectData } from "../../reflected"; -import { overrideBuild } from "../override"; +import { scopedLogger, returns, ReturnsReflectData } from '../../reflected'; +import { overrideBuild } from '../override'; -export function LoggedMiddleware, R>(options?: Partial) { +export function LoggedMiddleware, R>( + options?: Partial, +) { return ( _target: any, key: string, - descriptor: TypedPropertyDescriptor<(context: ExecutionContext, ...args: F) => R> + descriptor: TypedPropertyDescriptor< + (context: ExecutionContext, ...args: F) => R + >, ) => { loggerInit(_target); @@ -17,9 +21,9 @@ export function LoggedMiddleware, R>(options?: Partial, R>(options?: Partial, R>(options?: Partial, R>(options?: Partial { Reflect.defineMetadata(k, v, _target[key]); Reflect.defineMetadata(k, v, descriptor.value); }); - } -} \ No newline at end of file + }; +} diff --git a/src/logged/methods/route.ts b/src/logged/methods/route.ts index 164fea9..952b20f 100644 --- a/src/logged/methods/route.ts +++ b/src/logged/methods/route.ts @@ -1,15 +1,24 @@ -import { RequestMethod } from "@nestjs/common"; -import { OverrideBuildOptions, loggerInit, RevRequestMethod } from "../utils"; -import { LoggedMetadata, nestLoggedMetadata } from "../metadata"; -import { loggedParam, scopedLogger, returns, ReturnsReflectData, LoggedParamReflectData } from "../../reflected"; -import { overrideBuild } from "../override"; -import { createRouteParamDecorator } from "../../internals/nest"; +import { RequestMethod } from '@nestjs/common'; +import { OverrideBuildOptions, loggerInit, RevRequestMethod } from '../utils'; +import { LoggedMetadata, nestLoggedMetadata } from '../metadata'; +import { + loggedParam, + scopedLogger, + returns, + ReturnsReflectData, + LoggedParamReflectData, +} from '../../reflected'; +import { overrideBuild } from '../override'; +import { createRouteParamDecorator } from '../../internals/nest'; -export function LoggedRoute, R>(route?: string, options?: Partial) { +export function LoggedRoute, R>( + route?: string, + options?: Partial, +) { return ( _target: any, key: string, - descriptor: TypedPropertyDescriptor<(...args: F) => R> + descriptor: TypedPropertyDescriptor<(...args: F) => R>, ) => { loggerInit(_target); @@ -17,9 +26,9 @@ export function LoggedRoute, R>(route?: string, options?: P const fn = descriptor.value; - if (!fn || typeof fn !== "function") { + if (!fn || typeof fn !== 'function') { logger.warn( - `LoggedRoute decorator applied to non-function property: ${key}` + `LoggedRoute decorator applied to non-function property: ${key}`, ); return; } @@ -27,12 +36,12 @@ export function LoggedRoute, R>(route?: string, options?: P const logMetadata: LoggedMetadata | undefined = Reflect.getOwnMetadata( nestLoggedMetadata, _target, - key - ) + key, + ); if (logMetadata) { // already applied, override instead - logMetadata.updateOption(options) - return + logMetadata.updateOption(options); + return; } const newMetadata = new LoggedMetadata(options); @@ -41,16 +50,17 @@ export function LoggedRoute, R>(route?: string, options?: P Reflect.getMetadata(k, fn), ]); - const httpPath: string = Reflect.getMetadata("path", fn); - const httpMethod: RequestMethod = Reflect.getMetadata("method", fn); + const httpPath: string = Reflect.getMetadata('path', fn); + const httpMethod: RequestMethod = Reflect.getMetadata('method', fn); - const fullRoute = `${_target.constructor.name}::${route ?? httpPath}[${RevRequestMethod[httpMethod] - }]`; + const fullRoute = `${_target.constructor.name}::${route ?? httpPath}[${ + RevRequestMethod[httpMethod] + }]`; const scopedLoggerInjectableParam: number = Reflect.getOwnMetadata( scopedLogger, _target, - key + key, ); // if @InjectLogger exists, fake nestjs as it is @Req() if (scopedLoggerInjectableParam !== undefined) { @@ -60,12 +70,12 @@ export function LoggedRoute, R>(route?: string, options?: P const loggedParams: LoggedParamReflectData[] = Reflect.getOwnMetadata( loggedParam, _target, - key + key, ); const returnsData: ReturnsReflectData[] | true = Reflect.getOwnMetadata( returns, - fn + fn, ); const overrideFunction = overrideBuild( @@ -85,15 +95,10 @@ export function LoggedRoute, R>(route?: string, options?: P _target[key] = overrideFunction; descriptor.value = overrideFunction; - Reflect.defineMetadata( - nestLoggedMetadata, - newMetadata, - _target, - key - ) + Reflect.defineMetadata(nestLoggedMetadata, newMetadata, _target, key); all.forEach(([k, v]) => { Reflect.defineMetadata(k, v, _target[key]); Reflect.defineMetadata(k, v, descriptor.value); }); }; -} \ No newline at end of file +} diff --git a/src/logged/override.ts b/src/logged/override.ts index 922bfcf..5c02b01 100644 --- a/src/logged/override.ts +++ b/src/logged/override.ts @@ -1,9 +1,13 @@ -import { Logger, ExecutionContext } from "@nestjs/common"; -import { LoggedParamReflectData, ReturnsReflectData } from "../reflected"; +import { Logger, ExecutionContext } from '@nestjs/common'; +import { LoggedParamReflectData, ReturnsReflectData } from '../reflected'; import { LoggedMetadata } from './metadata'; -import { BuildType, REQUEST_LOG_ID, createCallLogIdentifyMessage } from "./utils"; -import { objectContainedLogSync, getItemByPathSync } from "../internals/utils"; -import { ScopedLogger } from "../logger"; +import { + BuildType, + REQUEST_LOG_ID, + createCallLogIdentifyMessage, +} from './utils'; +import { objectContainedLogSync, getItemByPathSync } from '../internals/utils'; +import { ScopedLogger } from '../logger'; interface FunctionMetadata { scopedLoggerInjectableParam?: number; @@ -42,43 +46,64 @@ export function overrideBuild, R>( return function (...args: F): R { // Creating ScopedLogger let injectedLogger: Logger = baseLogger; - if (typeof metadatas.scopedLoggerInjectableParam !== "undefined") { + if (typeof metadatas.scopedLoggerInjectableParam !== 'undefined') { if (type === 'function') { if ( args.length <= metadatas.scopedLoggerInjectableParam || !(args[metadatas.scopedLoggerInjectableParam] instanceof ScopedLogger) ) { - args[metadatas.scopedLoggerInjectableParam] = ScopedLogger.fromRoot(baseLogger, key); + args[metadatas.scopedLoggerInjectableParam] = ScopedLogger.fromRoot( + baseLogger, + key, + ); } else { - args[metadatas.scopedLoggerInjectableParam] = ScopedLogger.fromSuper(baseLogger, args[metadatas.scopedLoggerInjectableParam], key); + args[metadatas.scopedLoggerInjectableParam] = ScopedLogger.fromSuper( + baseLogger, + args[metadatas.scopedLoggerInjectableParam], + key, + ); } } else { // special, can access to request object if (type === 'guard' || type === 'interceptor') { // args[0] == ExecutionContext - const ctx = (args[0] as ExecutionContext); + const ctx = args[0] as ExecutionContext; if (ctx.getType() !== 'http') { - injectedLogger.error('Cannot inject logger: Request type is not http'); + injectedLogger.error( + 'Cannot inject logger: Request type is not http', + ); } else { let req = ctx.switchToHttp().getRequest(); if (req[REQUEST_LOG_ID] === undefined) { req[REQUEST_LOG_ID] = ScopedLogger.createScopeId(); } - args[metadatas.scopedLoggerInjectableParam] = ScopedLogger.fromRoot(baseLogger, key, req[REQUEST_LOG_ID]); + args[metadatas.scopedLoggerInjectableParam] = ScopedLogger.fromRoot( + baseLogger, + key, + req[REQUEST_LOG_ID], + ); } } else if (type === 'middleware') { let req = args[0]; if (req[REQUEST_LOG_ID] === undefined) { req[REQUEST_LOG_ID] = ScopedLogger.createScopeId(); } - args[metadatas.scopedLoggerInjectableParam] = ScopedLogger.fromRoot(baseLogger, key, req[REQUEST_LOG_ID]); + args[metadatas.scopedLoggerInjectableParam] = ScopedLogger.fromRoot( + baseLogger, + key, + req[REQUEST_LOG_ID], + ); } else if (type === 'route') { // args[metadatas.scopedLoggerInjectableParam] is now Request object, thanks to code in @LoggedRoute!!!! let req = args[metadatas.scopedLoggerInjectableParam]; if (req[REQUEST_LOG_ID] === undefined) { req[REQUEST_LOG_ID] = ScopedLogger.createScopeId(); } - args[metadatas.scopedLoggerInjectableParam] = ScopedLogger.fromRoot(baseLogger, key, req[REQUEST_LOG_ID]); + args[metadatas.scopedLoggerInjectableParam] = ScopedLogger.fromRoot( + baseLogger, + key, + req[REQUEST_LOG_ID], + ); } } @@ -96,24 +121,30 @@ export function overrideBuild, R>( // Start Log if (logged.options.callLogLevel !== 'skip') { - const callLogIdentifyMessage = - type === 'middleware' || type === 'guard' || type === 'interceptor' || type === 'route' + const callLogIdentifyMessage = + type === 'middleware' || + type === 'guard' || + type === 'interceptor' || + type === 'route' ? createCallLogIdentifyMessage('HIT', type, key, route) : createCallLogIdentifyMessage('HIT', type, key); injectedLogger[logged.options.callLogLevel]( - `${callLogIdentifyMessage} ${metadatas.loggedParams && metadatas.loggedParams.length > 0 - ? "WITH " + - metadatas.loggedParams.map( - ({ name, index, include, exclude }) => - name + - "=" + - objectContainedLogSync(args[index], { - include, - exclude, - }) - ).join(", ") - : "" - }` + `${callLogIdentifyMessage} ${ + metadatas.loggedParams && metadatas.loggedParams.length > 0 + ? 'WITH ' + + metadatas.loggedParams + .map( + ({ name, index, include, exclude }) => + name + + '=' + + objectContainedLogSync(args[index], { + include, + exclude, + }), + ) + .join(', ') + : '' + }`, ); } @@ -128,48 +159,58 @@ export function overrideBuild, R>( ) { return r['then']((r: any) => { const resultLogged = Array.isArray(returnsData) - ? typeof r === "object" && r !== null - ? "WITH " + - returnsData.map(({ name, path }) => { - const value = getItemByPathSync(r, path); + ? typeof r === 'object' && r !== null + ? 'WITH ' + + returnsData + .map(({ name, path }) => { + const value = getItemByPathSync(r, path); - return value !== undefined ? `${name}=${value}` : ""; - }) - .filter((v) => v.length > 0) - .join(", ") - : "" + return value !== undefined ? `${name}=${value}` : ''; + }) + .filter((v) => v.length > 0) + .join(', ') + : '' : typeof returnsData === 'string' - ? "WITH " + returnsData + "=" + typeof r === "object" ? JSON.stringify(r) : r + ? 'WITH ' + returnsData + '=' + typeof r === 'object' + ? JSON.stringify(r) + : r : returnsData - ? typeof r === "object" - ? "WITH " + JSON.stringify(r) - : "WITH " + r - : ""; + ? typeof r === 'object' + ? 'WITH ' + JSON.stringify(r) + : 'WITH ' + r + : ''; - injectedLogger[logged.options.returnLogLevel](`${createCallLogIdentifyMessage('RETURNED', type, key, route)} ${resultLogged}`); + injectedLogger[logged.options.returnLogLevel]( + `${createCallLogIdentifyMessage('RETURNED', type, key, route)} ${resultLogged}`, + ); return r; - }) + }); } else { const resultLogged = Array.isArray(returnsData) - ? typeof r === "object" && r !== null - ? "WITH " + - returnsData.map(({ name, path }) => { - const value = getItemByPathSync(r, path); + ? typeof r === 'object' && r !== null + ? 'WITH ' + + returnsData + .map(({ name, path }) => { + const value = getItemByPathSync(r, path); - return value !== undefined ? `${name}=${value}` : ""; - }) - .filter((v) => v.length > 0) - .join(", ") - : "" + return value !== undefined ? `${name}=${value}` : ''; + }) + .filter((v) => v.length > 0) + .join(', ') + : '' : typeof returnsData === 'string' - ? "WITH " + returnsData + "=" + typeof r === "object" ? JSON.stringify(r) : r + ? 'WITH ' + returnsData + '=' + typeof r === 'object' + ? JSON.stringify(r) + : r : returnsData - ? typeof r === "object" - ? "WITH " + JSON.stringify(r) - : "WITH " + r - : ""; + ? typeof r === 'object' + ? 'WITH ' + JSON.stringify(r) + : 'WITH ' + r + : ''; - injectedLogger[logged.options.returnLogLevel](`${createCallLogIdentifyMessage('RETURNED', type, key, route)} ${resultLogged}`); + injectedLogger[logged.options.returnLogLevel]( + `${createCallLogIdentifyMessage('RETURNED', type, key, route)} ${resultLogged}`, + ); return r; } } else { @@ -178,9 +219,11 @@ export function overrideBuild, R>( } catch (e) { // Error Log if (logged.options.errorLogLevel !== 'skip') { - injectedLogger[logged.options.errorLogLevel](`${createCallLogIdentifyMessage('ERROR', type, key, route)} ${e}`); + injectedLogger[logged.options.errorLogLevel]( + `${createCallLogIdentifyMessage('ERROR', type, key, route)} ${e}`, + ); } throw e; } - } -} \ No newline at end of file + }; +} diff --git a/src/logged/utils.ts b/src/logged/utils.ts index 2545ea2..01098f2 100644 --- a/src/logged/utils.ts +++ b/src/logged/utils.ts @@ -1,22 +1,22 @@ -import { Logger, LogLevel } from "@nestjs/common"; +import { Logger, LogLevel } from '@nestjs/common'; export const RevRequestMethod = [ - "GET", - "POST", - "PUT", - "DELETE", - "PATCH", - "ALL", - "OPTIONS", - "HEAD", - "SEARCH", + 'GET', + 'POST', + 'PUT', + 'DELETE', + 'PATCH', + 'ALL', + 'OPTIONS', + 'HEAD', + 'SEARCH', ]; export function loggerInit(_target: any) { - if (!Object.getOwnPropertyNames(_target).includes("logger")) { + if (!Object.getOwnPropertyNames(_target).includes('logger')) { const newTargetLogger = new Logger(_target.constructor.name); - newTargetLogger.log("Logger Initialized."); - Object.defineProperty(_target, "logger", { + newTargetLogger.log('Logger Initialized.'); + Object.defineProperty(_target, 'logger', { writable: false, enumerable: false, configurable: false, @@ -25,7 +25,12 @@ export function loggerInit(_target: any) { } } -export type BuildType = 'route' | 'function' | 'guard' | 'interceptor' | 'middleware'; +export type BuildType = + | 'route' + | 'function' + | 'guard' + | 'interceptor' + | 'middleware'; const callLogIdentifyMessageDictionary: Record = { route: 'ENDPOINT', @@ -33,14 +38,24 @@ const callLogIdentifyMessageDictionary: Record = { guard: 'GUARD', interceptor: 'INTERCEPTOR', middleware: 'MIDDLEWARE', -} +}; -export function createCallLogIdentifyMessage(message: 'HIT' | 'RETURNED' | 'ERROR', type: BuildType, key?: string, route?: string) { +export function createCallLogIdentifyMessage( + message: 'HIT' | 'RETURNED' | 'ERROR', + type: BuildType, + key?: string, + route?: string, +) { if (message === 'ERROR') return `ERROR WHILE ${callLogIdentifyMessageDictionary[type]} ${key} (${route}): `; - if (type === 'guard' || type === 'interceptor' || type === 'middleware' || type === 'route') - return `${message} ${callLogIdentifyMessageDictionary[type]} ${key} (${route})` + if ( + type === 'guard' || + type === 'interceptor' || + type === 'middleware' || + type === 'route' + ) + return `${message} ${callLogIdentifyMessageDictionary[type]} ${key} (${route})`; if (type === 'function') return `${message} ${callLogIdentifyMessageDictionary[type]} ${key}`; @@ -68,4 +83,4 @@ export const defaultOverrideBuildOptions: OverrideBuildOptions = { skipCallLog: false, skipReturnLog: false, skipErrorLog: false, -} \ No newline at end of file +}; diff --git a/src/logger.ts b/src/logger.ts index 9854f0c..5d20d48 100644 --- a/src/logger.ts +++ b/src/logger.ts @@ -1,7 +1,7 @@ -import { Logger, LogLevel } from "@nestjs/common"; +import { Logger, LogLevel } from '@nestjs/common'; import * as hyperid from 'hyperid'; -const createId = hyperid({ fixedLength: true }) +const createId = hyperid({ fixedLength: true }); export class ScopedLogger extends Logger { constructor( @@ -15,30 +15,39 @@ export class ScopedLogger extends Logger { private scopedLog(method: LogLevel) { return (message: string) => { this.logger[method]( - `${this.scopeId ? `(ID ${this.scopeId}) | ` : "" - }${this.scope.join(" -> ")}: ${message}` + `${ + this.scopeId ? `(ID ${this.scopeId}) | ` : '' + }${this.scope.join(' -> ')}: ${message}`, ); }; } - debug = this.scopedLog("debug"); - log = this.scopedLog("log"); - warn = this.scopedLog("warn"); - verbose = this.scopedLog("verbose"); - error = this.scopedLog("error"); - fatal = this.scopedLog("fatal"); + debug = this.scopedLog('debug'); + log = this.scopedLog('log'); + warn = this.scopedLog('warn'); + verbose = this.scopedLog('verbose'); + error = this.scopedLog('error'); + fatal = this.scopedLog('fatal'); - static fromSuper(baseLogger: Logger, logger: ScopedLogger, scope: string): ScopedLogger { + static fromSuper( + baseLogger: Logger, + logger: ScopedLogger, + scope: string, + ): ScopedLogger { return new ScopedLogger( - baseLogger, [...logger.scope, scope], logger.scopeId - ) - }; - static fromRoot(logger: Logger, scope: string, scopeId?: string): ScopedLogger { - return new ScopedLogger( - logger, [scope], scopeId - ) - }; + baseLogger, + [...logger.scope, scope], + logger.scopeId, + ); + } + static fromRoot( + logger: Logger, + scope: string, + scopeId?: string, + ): ScopedLogger { + return new ScopedLogger(logger, [scope], scopeId); + } static createScopeId(): string { return createId(); } -} \ No newline at end of file +} diff --git a/src/reflected.ts b/src/reflected.ts index 7ab6047..1e001d2 100644 --- a/src/reflected.ts +++ b/src/reflected.ts @@ -1,4 +1,10 @@ -import { RouteParamtypes, Type, PipeTransform, createPipesRouteParamDecorator, createRouteParamDecorator } from "./internals/nest"; +import { + RouteParamtypes, + Type, + PipeTransform, + createPipesRouteParamDecorator, + createRouteParamDecorator, +} from './internals/nest'; export type Path = string | string[]; export type Paths = Path[]; @@ -27,28 +33,32 @@ export interface ReturnsReflectData { path: string; } -export const scopedLogger = Symbol("nlogdec-scopedLogger"); -export const loggedParam = Symbol("nlogdec-loggedParam"); -export const returns = Symbol("nlogdec-returns"); +export const scopedLogger = Symbol('nlogdec-scopedLogger'); +export const loggedParam = Symbol('nlogdec-loggedParam'); +export const returns = Symbol('nlogdec-returns'); export function InjectLogger( target: any, propertyKey: string | symbol, - parameterIndex: number + parameterIndex: number, ) { Reflect.defineMetadata(scopedLogger, parameterIndex, target, propertyKey); } -type ParameterDecoratorType = (target: any, propertyKey: string | symbol, parameterIndex: number) => void +type ParameterDecoratorType = ( + target: any, + propertyKey: string | symbol, + parameterIndex: number, +) => void; function createLoggedFunctionParam( name: string, - options?: IncludeExcludePath + options?: IncludeExcludePath, ): ParameterDecoratorType { return ( target: any, propertyKey: string | symbol, - parameterIndex: number + parameterIndex: number, ) => { const existingLoggedParams: LoggedParamReflectData[] = Reflect.getOwnMetadata(loggedParam, target, propertyKey) || []; @@ -60,33 +70,34 @@ function createLoggedFunctionParam( include: options && options.includePath && - options.includePath.map((v) => (Array.isArray(v) ? v.join(".") : v)), + options.includePath.map((v) => (Array.isArray(v) ? v.join('.') : v)), exclude: options && options.excludePath && - options.excludePath.map((v) => (Array.isArray(v) ? v.join(".") : v)), + options.excludePath.map((v) => (Array.isArray(v) ? v.join('.') : v)), }); Reflect.defineMetadata( loggedParam, existingLoggedParams, target, - propertyKey + propertyKey, ); }; } -type LoggedParamReturns = (name: string, options?: IncludeExcludePath) => ParameterDecoratorType; +type LoggedParamReturns = ( + name: string, + options?: IncludeExcludePath, +) => ParameterDecoratorType; export const Logged: LoggedParamReturns = (name, options) => - createLoggedFunctionParam(name, options) + createLoggedFunctionParam(name, options); -type Pipe = Type | PipeTransform +type Pipe = Type | PipeTransform; export function LoggedParam(): LoggedParamReturns; -export function LoggedParam( - ...pipes: Pipe[] -): LoggedParamReturns; +export function LoggedParam(...pipes: Pipe[]): LoggedParamReturns; export function LoggedParam( property: string, ...pipes: Pipe[] @@ -97,10 +108,7 @@ export function LoggedParam( ): LoggedParamReturns { return (name, options) => { return (target, propertyKey, parameterIndex) => { - createPipesRouteParamDecorator(RouteParamtypes.PARAM)( - property, - ...pipes, - )( + createPipesRouteParamDecorator(RouteParamtypes.PARAM)(property, ...pipes)( target, propertyKey, parameterIndex, @@ -109,15 +117,13 @@ export function LoggedParam( target, propertyKey, parameterIndex, - ) - } - } + ); + }; + }; } export function LoggedQuery(): LoggedParamReturns; -export function LoggedQuery( - ...pipes: Pipe[] -): LoggedParamReturns; +export function LoggedQuery(...pipes: Pipe[]): LoggedParamReturns; export function LoggedQuery( property: string, ...pipes: Pipe[] @@ -128,23 +134,23 @@ export function LoggedQuery( ): LoggedParamReturns { return (name, options) => { return (target, propertyKey, parameterIndex) => { - createPipesRouteParamDecorator(RouteParamtypes.QUERY)( - property, ...pipes - )( - target, propertyKey, parameterIndex, + createPipesRouteParamDecorator(RouteParamtypes.QUERY)(property, ...pipes)( + target, + propertyKey, + parameterIndex, ); createLoggedFunctionParam(name, options)( - target, propertyKey, parameterIndex, + target, + propertyKey, + parameterIndex, ); - } - } + }; + }; } export function LoggedBody(): LoggedParamReturns; -export function LoggedBody( - ...pipes: Pipe[] -): LoggedParamReturns; +export function LoggedBody(...pipes: Pipe[]): LoggedParamReturns; export function LoggedBody( property: string, ...pipes: Pipe[] @@ -155,41 +161,50 @@ export function LoggedBody( ): LoggedParamReturns { return (name, options) => { return (target, propertyKey, parameterIndex) => { - createPipesRouteParamDecorator(RouteParamtypes.BODY)( - property, - ...pipes, - )( - target, propertyKey, parameterIndex + createPipesRouteParamDecorator(RouteParamtypes.BODY)(property, ...pipes)( + target, + propertyKey, + parameterIndex, ); createLoggedFunctionParam(name, options)( - target, propertyKey, parameterIndex, + target, + propertyKey, + parameterIndex, ); - } - } + }; + }; } export function LoggedHeaders(property?: string): LoggedParamReturns { return (name, options) => { return (target, propertyKey, parameterIndex) => { createRouteParamDecorator(RouteParamtypes.HEADERS)(property)( - target, propertyKey, parameterIndex, + target, + propertyKey, + parameterIndex, ); createLoggedFunctionParam(name, options)( - target, propertyKey, parameterIndex, - ) - } - } + target, + propertyKey, + parameterIndex, + ); + }; + }; } -export function Returns, R>(namePaths?: { - [name: string]: string; -} | string) { +export function Returns, R>( + namePaths?: + | { + [name: string]: string; + } + | string, +) { return ( _target: any, _key: string | symbol, - descriptor: TypedPropertyDescriptor<(...args: F) => Promise | R> + descriptor: TypedPropertyDescriptor<(...args: F) => Promise | R>, ) => { Reflect.defineMetadata( returns, @@ -198,10 +213,10 @@ export function Returns, R>(namePaths?: { ? namePaths : Object.entries(namePaths).reduce( (prev, curr) => [...prev, { name: curr[0], path: curr[1] }], - [] + [], ) : true, - descriptor.value + descriptor.value, ); }; } diff --git a/src/test/index.ts b/src/test/index.ts index c40c65d..0faa556 100644 --- a/src/test/index.ts +++ b/src/test/index.ts @@ -1,10 +1,6 @@ -import { LoggedFunction, LoggedInjectable } from "../logged"; -import { ScopedLogger } from "../logger"; -import { - InjectLogger, - Logged, - Returns, -} from "../reflected"; +import { LoggedFunction, LoggedInjectable } from '../logged'; +import { ScopedLogger } from '../logger'; +import { InjectLogger, Logged, Returns } from '../reflected'; type TestObject = { a: string; @@ -17,151 +13,149 @@ type TestObject = { class TestService { public async service(paramA: string, @InjectLogger logger: ScopedLogger) { logger.log(`received paramA ${paramA}`); - return paramA + return paramA; } } @LoggedInjectable() class LoggedClass { - constructor( - private service: TestService - ) { } + constructor(private service: TestService) {} - async testParameterLoggingWithoutInjection(@Logged("key") key: number) { + async testParameterLoggingWithoutInjection(@Logged('key') key: number) { console.log(key); } async testMultiParameterLoggingWithoutInjection( - @Logged("key") key: number, - @Logged("key2") key2: string + @Logged('key') key: number, + @Logged('key2') key2: string, ) { console.log(key, key2); } async testParameterLoggingWithInjection( - @Logged("key") key: number, - @InjectLogger logger?: ScopedLogger + @Logged('key') key: number, + @InjectLogger logger?: ScopedLogger, ) { logger.log(key.toString()); } async testMultiParameterLoggingWithInjection( - @Logged("key") key: number, - @Logged("key2") key2: string, - @InjectLogger logger?: ScopedLogger + @Logged('key') key: number, + @Logged('key2') key2: string, + @InjectLogger logger?: ScopedLogger, ) { logger.log(key.toString() + key2); } async testObjectParameterLogging( - @Logged("key") key: TestObject, - @InjectLogger logger?: ScopedLogger + @Logged('key') key: TestObject, + @InjectLogger logger?: ScopedLogger, ) { logger.log(JSON.stringify(key)); } async testObjectParameterDotIncludeLogging( - @Logged("key", { includePath: ["a", "b.c", "d.0", "e"] }) + @Logged('key', { includePath: ['a', 'b.c', 'd.0', 'e'] }) key: TestObject, - @InjectLogger logger?: ScopedLogger + @InjectLogger logger?: ScopedLogger, ) { logger.log(JSON.stringify(key)); } async testObjectParameterArrayIncludeLogging( - @Logged("key", { includePath: [["a"], ["b", "c"], ["d", "0"], ["e"]] }) + @Logged('key', { includePath: [['a'], ['b', 'c'], ['d', '0'], ['e']] }) key: TestObject, - @InjectLogger logger?: ScopedLogger + @InjectLogger logger?: ScopedLogger, ) { logger.log(JSON.stringify(key)); } async testObjectParameterDotExcludeLogging( - @Logged("key", { excludePath: ["a", "b.c", "d.0", "e"] }) + @Logged('key', { excludePath: ['a', 'b.c', 'd.0', 'e'] }) key: TestObject, - @InjectLogger logger?: ScopedLogger + @InjectLogger logger?: ScopedLogger, ) { logger.log(JSON.stringify(key)); } async testObjectParameterArrayExcludeLogging( - @Logged("key", { excludePath: [["a"], ["b", "c"], ["d", "0"], ["e"]] }) + @Logged('key', { excludePath: [['a'], ['b', 'c'], ['d', '0'], ['e']] }) key: TestObject, - @InjectLogger logger?: ScopedLogger + @InjectLogger logger?: ScopedLogger, ) { logger.log(JSON.stringify(key)); } - @Returns({ result: "http.result", userId: "body.user.id" }) + @Returns({ result: 'http.result', userId: 'body.user.id' }) async testReturnLogging( - @Logged("userId") + @Logged('userId') userId: string, - @InjectLogger logger?: ScopedLogger + @InjectLogger logger?: ScopedLogger, ) { logger.log(userId); return { http: { - result: "success", + result: 'success', code: 200, }, body: { user: { id: userId, - name: "tester", + name: 'tester', }, - secret: "supersecret", + secret: 'supersecret', }, }; } - @Returns({ result: "http.result", userId: "body.user.id" }) + @Returns({ result: 'http.result', userId: 'body.user.id' }) async testMissingReturnLogging( - @Logged("userId") + @Logged('userId') userId: string, - @InjectLogger logger?: ScopedLogger + @InjectLogger logger?: ScopedLogger, ) { logger.log(userId); return { body: { user: { id: userId, - name: "tester", + name: 'tester', }, - secret: "supersecret", + secret: 'supersecret', }, }; } @Returns() async testRawObjectReturnLogging( - @Logged("userId") + @Logged('userId') userId: string, - @InjectLogger logger?: ScopedLogger + @InjectLogger logger?: ScopedLogger, ) { logger.log(userId); return { body: { user: { id: userId, - name: "tester", + name: 'tester', }, - secret: "supersecret", + secret: 'supersecret', }, }; } @Returns() async testRawValueReturnLogging( - @Logged("userId") + @Logged('userId') userId: string, - @InjectLogger logger?: ScopedLogger + @InjectLogger logger?: ScopedLogger, ) { logger.log(userId); return true; } async testLoggerRootLogging2(@InjectLogger logger?: ScopedLogger) { - logger.log("2"); + logger.log('2'); } async testLoggerRootLogging(@InjectLogger logger?: ScopedLogger) { @@ -169,16 +163,16 @@ class LoggedClass { } testSyncLoggerRootLogging2(@InjectLogger logger?: ScopedLogger) { - logger.log('2') - return 2 + logger.log('2'); + return 2; } testSyncLoggerRootLogging(@InjectLogger logger?: ScopedLogger) { - logger.log(this.testSyncLoggerRootLogging2(logger).toString()) + logger.log(this.testSyncLoggerRootLogging2(logger).toString()); } testSyncLogging(@InjectLogger logger?: ScopedLogger) { - logger.log("synced yay"); + logger.log('synced yay'); } async testService(@InjectLogger logger?: ScopedLogger) { @@ -187,128 +181,126 @@ class LoggedClass { @LoggedFunction({ skipCallLog: true, skipReturnLog: true }) testOptionOverriding(@InjectLogger logger?: ScopedLogger) { - logger.log("testOptionOverriding"); + logger.log('testOptionOverriding'); } } class LoggedMethodsClass { - constructor( - private service: TestService - ) { } + constructor(private service: TestService) {} @LoggedFunction() - async testParameterLoggingWithoutInjection(@Logged("key") key: number) { + async testParameterLoggingWithoutInjection(@Logged('key') key: number) { console.log(key); } @LoggedFunction() async testMultiParameterLoggingWithoutInjection( - @Logged("key") key: number, - @Logged("key2") key2: string + @Logged('key') key: number, + @Logged('key2') key2: string, ) { console.log(key, key2); } @LoggedFunction() async testParameterLoggingWithInjection( - @Logged("key") key: number, - @InjectLogger logger?: ScopedLogger + @Logged('key') key: number, + @InjectLogger logger?: ScopedLogger, ) { logger.log(key.toString()); } @LoggedFunction() async testMultiParameterLoggingWithInjection( - @Logged("key") key: number, - @Logged("key2") key2: string, - @InjectLogger logger?: ScopedLogger + @Logged('key') key: number, + @Logged('key2') key2: string, + @InjectLogger logger?: ScopedLogger, ) { logger.log(key.toString() + key2); } @LoggedFunction() async testObjectParameterLogging( - @Logged("key") key: TestObject, - @InjectLogger logger?: ScopedLogger + @Logged('key') key: TestObject, + @InjectLogger logger?: ScopedLogger, ) { logger.log(JSON.stringify(key)); } @LoggedFunction() async testObjectParameterDotIncludeLogging( - @Logged("key", { includePath: ["a", "b.c", "d.0", "e"] }) + @Logged('key', { includePath: ['a', 'b.c', 'd.0', 'e'] }) key: TestObject, - @InjectLogger logger?: ScopedLogger + @InjectLogger logger?: ScopedLogger, ) { logger.log(JSON.stringify(key)); } @LoggedFunction() async testObjectParameterArrayIncludeLogging( - @Logged("key", { includePath: [["a"], ["b", "c"], ["d", "0"], ["e"]] }) + @Logged('key', { includePath: [['a'], ['b', 'c'], ['d', '0'], ['e']] }) key: TestObject, - @InjectLogger logger?: ScopedLogger + @InjectLogger logger?: ScopedLogger, ) { logger.log(JSON.stringify(key)); } @LoggedFunction() async testObjectParameterDotExcludeLogging( - @Logged("key", { excludePath: ["a", "b.c", "d.0", "e"] }) + @Logged('key', { excludePath: ['a', 'b.c', 'd.0', 'e'] }) key: TestObject, - @InjectLogger logger?: ScopedLogger + @InjectLogger logger?: ScopedLogger, ) { logger.log(JSON.stringify(key)); } @LoggedFunction() async testObjectParameterArrayExcludeLogging( - @Logged("key", { excludePath: [["a"], ["b", "c"], ["d", "0"], ["e"]] }) + @Logged('key', { excludePath: [['a'], ['b', 'c'], ['d', '0'], ['e']] }) key: TestObject, - @InjectLogger logger?: ScopedLogger + @InjectLogger logger?: ScopedLogger, ) { logger.log(JSON.stringify(key)); } @LoggedFunction() - @Returns({ result: "http.result", userId: "body.user.id" }) + @Returns({ result: 'http.result', userId: 'body.user.id' }) async testReturnLogging( - @Logged("userId") + @Logged('userId') userId: string, - @InjectLogger logger?: ScopedLogger + @InjectLogger logger?: ScopedLogger, ) { logger.log(userId); return { http: { - result: "success", + result: 'success', code: 200, }, body: { user: { id: userId, - name: "tester", + name: 'tester', }, - secret: "supersecret", + secret: 'supersecret', }, }; } @LoggedFunction() - @Returns({ result: "http.result", userId: "body.user.id" }) + @Returns({ result: 'http.result', userId: 'body.user.id' }) async testMissingReturnLogging( - @Logged("userId") + @Logged('userId') userId: string, - @InjectLogger logger?: ScopedLogger + @InjectLogger logger?: ScopedLogger, ) { logger.log(userId); return { body: { user: { id: userId, - name: "tester", + name: 'tester', }, - secret: "supersecret", + secret: 'supersecret', }, }; } @@ -316,18 +308,18 @@ class LoggedMethodsClass { @LoggedFunction() @Returns() async testRawObjectReturnLogging( - @Logged("userId") + @Logged('userId') userId: string, - @InjectLogger logger?: ScopedLogger + @InjectLogger logger?: ScopedLogger, ) { logger.log(userId); return { body: { user: { id: userId, - name: "tester", + name: 'tester', }, - secret: "supersecret", + secret: 'supersecret', }, }; } @@ -335,9 +327,9 @@ class LoggedMethodsClass { @LoggedFunction() @Returns() async testRawValueReturnLogging( - @Logged("userId") + @Logged('userId') userId: string, - @InjectLogger logger?: ScopedLogger + @InjectLogger logger?: ScopedLogger, ) { logger.log(userId); return true; @@ -345,7 +337,7 @@ class LoggedMethodsClass { @LoggedFunction() async testLoggerRootLogging2(@InjectLogger logger?: ScopedLogger) { - logger.log("2"); + logger.log('2'); } @LoggedFunction() @@ -355,18 +347,18 @@ class LoggedMethodsClass { @LoggedFunction() testSyncLoggerRootLogging2(@InjectLogger logger?: ScopedLogger) { - logger.log('2') - return 2 + logger.log('2'); + return 2; } @LoggedFunction() testSyncLoggerRootLogging(@InjectLogger logger?: ScopedLogger) { - logger.log(this.testSyncLoggerRootLogging2(logger).toString()) + logger.log(this.testSyncLoggerRootLogging2(logger).toString()); } @LoggedFunction() testSyncLogging(@InjectLogger logger?: ScopedLogger) { - logger.log("synced yay"); + logger.log('synced yay'); } @LoggedFunction() @@ -375,8 +367,6 @@ class LoggedMethodsClass { } } - - // const service = new TestService(); /** diff --git a/src/utils.ts b/src/utils.ts index 7908b99..cb05120 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -1,9 +1,9 @@ -import { Logger } from "@nestjs/common"; -import { ScopedLogger } from "./logger"; -import { REQUEST_LOG_ID } from "./logged/utils"; +import { Logger } from '@nestjs/common'; +import { ScopedLogger } from './logger'; +import { REQUEST_LOG_ID } from './logged/utils'; const logger = new Logger(); export function getRequestLogger(functionName: string, req: any): ScopedLogger { - return new ScopedLogger(logger, [functionName], req[REQUEST_LOG_ID]) -} \ No newline at end of file + return new ScopedLogger(logger, [functionName], req[REQUEST_LOG_ID]); +} diff --git a/yarn.lock b/yarn.lock index 129a855..143fe3a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -372,6 +372,7 @@ __metadata: "@nestjs/common": "npm:^10.2.8" "@types/node": "npm:^20.9.1" hyperid: "npm:^3.1.1" + prettier: "npm:^3.5.3" reflect-metadata: "npm:^0.1.13" rimraf: "npm:^5.0.5" rxjs: "npm:^7.8.1" @@ -397,6 +398,15 @@ __metadata: languageName: node linkType: hard +"prettier@npm:^3.5.3": + version: 3.5.3 + resolution: "prettier@npm:3.5.3" + bin: + prettier: bin/prettier.cjs + checksum: 10c0/3880cb90b9dc0635819ab52ff571518c35bd7f15a6e80a2054c05dbc8a3aa6e74f135519e91197de63705bcb38388ded7e7230e2178432a1468005406238b877 + languageName: node + linkType: hard + "reflect-metadata@npm:^0.1.13": version: 0.1.13 resolution: "reflect-metadata@npm:0.1.13"