feat: complete proxy to fastify patch
This commit is contained in:
parent
0c722ae9d7
commit
9951c75549
@ -1,10 +1,4 @@
|
||||
export {
|
||||
LoggedRoute,
|
||||
LoggedFunction,
|
||||
LoggedController,
|
||||
LoggedInjectable,
|
||||
LoggedGuard,
|
||||
LoggedInterceptor,
|
||||
ScopedLogger,
|
||||
InjectLogger,
|
||||
LoggedParam,
|
||||
@ -14,4 +8,13 @@ export {
|
||||
Logged,
|
||||
Returns,
|
||||
getRequestLogger
|
||||
} from 'nestlogged';
|
||||
} from 'nestlogged';
|
||||
export {
|
||||
LoggedRoute,
|
||||
LoggedFunction,
|
||||
LoggedController,
|
||||
LoggedInjectable,
|
||||
LoggedGuard,
|
||||
LoggedInterceptor,
|
||||
LoggedMiddleware,
|
||||
} from './logged'
|
81
packages/nestlogged-fastify/src/logged/class.ts
Normal file
81
packages/nestlogged-fastify/src/logged/class.ts
Normal file
@ -0,0 +1,81 @@
|
||||
import {
|
||||
Injectable,
|
||||
Controller,
|
||||
ControllerOptions,
|
||||
ScopeOptions,
|
||||
} from '@nestjs/common';
|
||||
import { loggerInit, RevRequestMethod } from 'nestlogged/lib/logged/utils';
|
||||
import { LoggedRoute, LoggedFunction } from './methods';
|
||||
|
||||
export function LoggedInjectable(
|
||||
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'
|
||||
) {
|
||||
if (options && options.verbose)
|
||||
logger.log(`LoggedFunction applied to ${method}`);
|
||||
LoggedFunction()(target.prototype, method, {
|
||||
value: target.prototype[method],
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
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],
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
Controller(param)(target);
|
||||
};
|
||||
}
|
2
packages/nestlogged-fastify/src/logged/index.ts
Normal file
2
packages/nestlogged-fastify/src/logged/index.ts
Normal file
@ -0,0 +1,2 @@
|
||||
export * from './methods';
|
||||
export { LoggedController, LoggedInjectable } from './class';
|
90
packages/nestlogged-fastify/src/logged/methods/function.ts
Normal file
90
packages/nestlogged-fastify/src/logged/methods/function.ts
Normal file
@ -0,0 +1,90 @@
|
||||
import { Logger } from '@nestjs/common';
|
||||
import { OverrideBuildOptions, loggerInit } from 'nestlogged/lib/logged/utils';
|
||||
import { LoggedMetadata, nestLoggedMetadata } from 'nestlogged/lib/logged/metadata';
|
||||
import {
|
||||
loggedParam,
|
||||
scopedLogger,
|
||||
returns,
|
||||
ReturnsReflectData,
|
||||
LoggedParamReflectData,
|
||||
} from 'nestlogged/lib/reflected';
|
||||
import { overrideBuild } from '../override';
|
||||
|
||||
export function LoggedFunction<F extends Array<any>, R>(
|
||||
options?: Partial<OverrideBuildOptions>,
|
||||
) {
|
||||
return (
|
||||
_target: any,
|
||||
key: string,
|
||||
descriptor: TypedPropertyDescriptor<(...args: F) => R | Promise<R>>,
|
||||
) => {
|
||||
loggerInit(_target);
|
||||
|
||||
const logger: Logger = _target.logger;
|
||||
|
||||
const fn = descriptor.value;
|
||||
|
||||
if (!fn || typeof fn !== 'function') {
|
||||
logger.warn(
|
||||
`LoggedFunction decorator applied to non-function property: ${key}`,
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
const logMetadata: LoggedMetadata | undefined = Reflect.getOwnMetadata(
|
||||
nestLoggedMetadata,
|
||||
_target,
|
||||
key,
|
||||
);
|
||||
if (logMetadata) {
|
||||
// already applied, override instead
|
||||
logMetadata.updateOption(options);
|
||||
return;
|
||||
}
|
||||
const newMetadata = new LoggedMetadata(options);
|
||||
|
||||
const all = Reflect.getMetadataKeys(fn).map((k) => [
|
||||
k,
|
||||
Reflect.getMetadata(k, fn),
|
||||
]);
|
||||
|
||||
const scopedLoggerInjectableParam: number = Reflect.getOwnMetadata(
|
||||
scopedLogger,
|
||||
_target,
|
||||
key,
|
||||
);
|
||||
|
||||
const loggedParams: LoggedParamReflectData[] = Reflect.getOwnMetadata(
|
||||
loggedParam,
|
||||
_target,
|
||||
key,
|
||||
);
|
||||
|
||||
const returnsData: ReturnsReflectData[] | true = Reflect.getOwnMetadata(
|
||||
returns,
|
||||
fn,
|
||||
);
|
||||
|
||||
const overrideFunction = overrideBuild(
|
||||
'function',
|
||||
fn,
|
||||
logger,
|
||||
{
|
||||
scopedLoggerInjectableParam,
|
||||
loggedParams,
|
||||
},
|
||||
key,
|
||||
returnsData,
|
||||
newMetadata,
|
||||
);
|
||||
|
||||
_target[key] = overrideFunction;
|
||||
descriptor.value = overrideFunction;
|
||||
|
||||
Reflect.defineMetadata(nestLoggedMetadata, newMetadata, _target, key);
|
||||
all.forEach(([k, v]) => {
|
||||
Reflect.defineMetadata(k, v, _target[key]);
|
||||
Reflect.defineMetadata(k, v, descriptor.value);
|
||||
});
|
||||
};
|
||||
}
|
80
packages/nestlogged-fastify/src/logged/methods/guard.ts
Normal file
80
packages/nestlogged-fastify/src/logged/methods/guard.ts
Normal file
@ -0,0 +1,80 @@
|
||||
import { ExecutionContext, Logger } from '@nestjs/common';
|
||||
import { OverrideBuildOptions, loggerInit } from 'nestlogged/lib/logged/utils';
|
||||
import { LoggedMetadata, nestLoggedMetadata } from 'nestlogged/lib/logged/metadata';
|
||||
import { scopedLogger, returns, ReturnsReflectData } from 'nestlogged/lib/reflected';
|
||||
import { overrideBuild } from '../override';
|
||||
|
||||
export function LoggedGuard<F extends Array<any>, R>(
|
||||
options?: Partial<OverrideBuildOptions>,
|
||||
) {
|
||||
return (
|
||||
_target: any,
|
||||
key: string,
|
||||
descriptor: TypedPropertyDescriptor<
|
||||
(context: ExecutionContext, ...args: F) => R
|
||||
>,
|
||||
) => {
|
||||
loggerInit(_target);
|
||||
|
||||
const logger: Logger = _target.logger;
|
||||
|
||||
const fn = descriptor.value;
|
||||
|
||||
if (!fn || typeof fn !== 'function') {
|
||||
logger.warn(
|
||||
`LoggedGuard decorator applied to non-function property: ${key}`,
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
const logMetadata: LoggedMetadata | undefined = Reflect.getOwnMetadata(
|
||||
nestLoggedMetadata,
|
||||
_target,
|
||||
key,
|
||||
);
|
||||
if (logMetadata) {
|
||||
// already applied, override instead
|
||||
logMetadata.updateOption(options);
|
||||
return;
|
||||
}
|
||||
const newMetadata = new LoggedMetadata(options);
|
||||
|
||||
const all = Reflect.getMetadataKeys(fn).map((k) => [
|
||||
k,
|
||||
Reflect.getMetadata(k, fn),
|
||||
]);
|
||||
|
||||
const scopedLoggerInjectableParam: number = Reflect.getOwnMetadata(
|
||||
scopedLogger,
|
||||
_target,
|
||||
key,
|
||||
);
|
||||
|
||||
const returnsData: ReturnsReflectData[] | true = Reflect.getOwnMetadata(
|
||||
returns,
|
||||
fn,
|
||||
);
|
||||
|
||||
const overrideFunction = overrideBuild(
|
||||
'guard',
|
||||
fn,
|
||||
logger,
|
||||
{
|
||||
scopedLoggerInjectableParam,
|
||||
loggedParams: [],
|
||||
},
|
||||
_target.constructor.name,
|
||||
returnsData,
|
||||
newMetadata,
|
||||
);
|
||||
|
||||
_target[key] = overrideFunction;
|
||||
descriptor.value = overrideFunction;
|
||||
|
||||
Reflect.defineMetadata(nestLoggedMetadata, newMetadata, _target, key);
|
||||
all.forEach(([k, v]) => {
|
||||
Reflect.defineMetadata(k, v, _target[key]);
|
||||
Reflect.defineMetadata(k, v, descriptor.value);
|
||||
});
|
||||
};
|
||||
}
|
5
packages/nestlogged-fastify/src/logged/methods/index.ts
Normal file
5
packages/nestlogged-fastify/src/logged/methods/index.ts
Normal file
@ -0,0 +1,5 @@
|
||||
export { LoggedFunction } from './function';
|
||||
export { LoggedRoute } from './route';
|
||||
export { LoggedGuard } from './guard';
|
||||
export { LoggedInterceptor } from './interceptor';
|
||||
export { LoggedMiddleware } from './middleware';
|
@ -0,0 +1,81 @@
|
||||
import { OverrideBuildOptions } from 'nestlogged/lib/logged/utils';
|
||||
import { ExecutionContext, Logger } from '@nestjs/common';
|
||||
import { loggerInit } from 'nestlogged/lib/logged/utils';
|
||||
import { LoggedMetadata, nestLoggedMetadata } from 'nestlogged/lib/logged/metadata';
|
||||
import { scopedLogger, returns, ReturnsReflectData } from 'nestlogged/lib/reflected';
|
||||
import { overrideBuild } from '../override';
|
||||
|
||||
export function LoggedInterceptor<F extends Array<any>, R>(
|
||||
options?: Partial<OverrideBuildOptions>,
|
||||
) {
|
||||
return (
|
||||
_target: any,
|
||||
key: string,
|
||||
descriptor: TypedPropertyDescriptor<
|
||||
(context: ExecutionContext, ...args: F) => R
|
||||
>,
|
||||
) => {
|
||||
loggerInit(_target);
|
||||
|
||||
const logger: Logger = _target.logger;
|
||||
|
||||
const fn = descriptor.value;
|
||||
|
||||
if (!fn || typeof fn !== 'function') {
|
||||
logger.warn(
|
||||
`LoggedInterceptor decorator applied to non-function property: ${key}`,
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
const logMetadata: LoggedMetadata | undefined = Reflect.getOwnMetadata(
|
||||
nestLoggedMetadata,
|
||||
_target,
|
||||
key,
|
||||
);
|
||||
if (logMetadata) {
|
||||
// already applied, override instead
|
||||
logMetadata.updateOption(options);
|
||||
return;
|
||||
}
|
||||
const newMetadata = new LoggedMetadata(options);
|
||||
|
||||
const all = Reflect.getMetadataKeys(fn).map((k) => [
|
||||
k,
|
||||
Reflect.getMetadata(k, fn),
|
||||
]);
|
||||
|
||||
const scopedLoggerInjectableParam: number = Reflect.getOwnMetadata(
|
||||
scopedLogger,
|
||||
_target,
|
||||
key,
|
||||
);
|
||||
|
||||
const returnsData: ReturnsReflectData[] | true = Reflect.getOwnMetadata(
|
||||
returns,
|
||||
fn,
|
||||
);
|
||||
|
||||
const overrideFunction = overrideBuild(
|
||||
'interceptor',
|
||||
fn,
|
||||
logger,
|
||||
{
|
||||
scopedLoggerInjectableParam,
|
||||
loggedParams: [],
|
||||
},
|
||||
_target.constructor.name,
|
||||
returnsData,
|
||||
newMetadata,
|
||||
);
|
||||
|
||||
_target[key] = overrideFunction;
|
||||
descriptor.value = overrideFunction;
|
||||
|
||||
Reflect.defineMetadata(nestLoggedMetadata, newMetadata, _target, key);
|
||||
all.forEach(([k, v]) => {
|
||||
Reflect.defineMetadata(k, v, _target[key]);
|
||||
Reflect.defineMetadata(k, v, descriptor.value);
|
||||
});
|
||||
};
|
||||
}
|
81
packages/nestlogged-fastify/src/logged/methods/middleware.ts
Normal file
81
packages/nestlogged-fastify/src/logged/methods/middleware.ts
Normal file
@ -0,0 +1,81 @@
|
||||
import { OverrideBuildOptions } from 'nestlogged/lib/logged/utils';
|
||||
import { Logger } from '@nestjs/common';
|
||||
import { loggerInit } from 'nestlogged/lib/logged/utils';
|
||||
import { LoggedMetadata, nestLoggedMetadata } from 'nestlogged/lib/logged/metadata';
|
||||
import { scopedLogger, returns, ReturnsReflectData } from 'nestlogged/lib/reflected';
|
||||
import { overrideBuild } from '../override';
|
||||
|
||||
export function LoggedMiddleware<F extends Array<any>, R>(
|
||||
options?: Partial<OverrideBuildOptions>,
|
||||
) {
|
||||
return (
|
||||
_target: any,
|
||||
key: string,
|
||||
descriptor: TypedPropertyDescriptor<
|
||||
(...args: F) => R
|
||||
>,
|
||||
) => {
|
||||
loggerInit(_target);
|
||||
|
||||
const logger: Logger = _target.logger;
|
||||
|
||||
const fn = descriptor.value;
|
||||
|
||||
if (!fn || typeof fn !== 'function') {
|
||||
logger.warn(
|
||||
`LoggedMiddleware decorator applied to non-function property: ${key}`,
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
const logMetadata: LoggedMetadata | undefined = Reflect.getOwnMetadata(
|
||||
nestLoggedMetadata,
|
||||
_target,
|
||||
key,
|
||||
);
|
||||
if (logMetadata) {
|
||||
// already applied, override instead
|
||||
logMetadata.updateOption(options);
|
||||
return;
|
||||
}
|
||||
const newMetadata = new LoggedMetadata(options);
|
||||
|
||||
const all = Reflect.getMetadataKeys(fn).map((k) => [
|
||||
k,
|
||||
Reflect.getMetadata(k, fn),
|
||||
]);
|
||||
|
||||
const scopedLoggerInjectableParam: number = Reflect.getOwnMetadata(
|
||||
scopedLogger,
|
||||
_target,
|
||||
key,
|
||||
);
|
||||
|
||||
const returnsData: ReturnsReflectData[] | true = Reflect.getOwnMetadata(
|
||||
returns,
|
||||
fn,
|
||||
);
|
||||
|
||||
const overrideFunction = overrideBuild(
|
||||
'middleware',
|
||||
fn,
|
||||
logger,
|
||||
{
|
||||
scopedLoggerInjectableParam,
|
||||
loggedParams: [],
|
||||
},
|
||||
_target.constructor.name,
|
||||
returnsData,
|
||||
newMetadata,
|
||||
);
|
||||
|
||||
_target[key] = overrideFunction;
|
||||
descriptor.value = overrideFunction;
|
||||
|
||||
Reflect.defineMetadata(nestLoggedMetadata, newMetadata, _target, key);
|
||||
all.forEach(([k, v]) => {
|
||||
Reflect.defineMetadata(k, v, _target[key]);
|
||||
Reflect.defineMetadata(k, v, descriptor.value);
|
||||
});
|
||||
};
|
||||
}
|
104
packages/nestlogged-fastify/src/logged/methods/route.ts
Normal file
104
packages/nestlogged-fastify/src/logged/methods/route.ts
Normal file
@ -0,0 +1,104 @@
|
||||
import { RequestMethod } from '@nestjs/common';
|
||||
import { OverrideBuildOptions, loggerInit, RevRequestMethod } from 'nestlogged/lib/logged/utils';
|
||||
import { LoggedMetadata, nestLoggedMetadata } from 'nestlogged/lib/logged/metadata';
|
||||
import {
|
||||
loggedParam,
|
||||
scopedLogger,
|
||||
returns,
|
||||
ReturnsReflectData,
|
||||
LoggedParamReflectData,
|
||||
} from 'nestlogged/lib/reflected';
|
||||
import { overrideBuild } from '../override';
|
||||
import { createRouteParamDecorator } from 'nestlogged/lib/internals/nest';
|
||||
|
||||
export function LoggedRoute<F extends Array<any>, R>(
|
||||
route?: string,
|
||||
options?: Partial<OverrideBuildOptions>,
|
||||
) {
|
||||
return (
|
||||
_target: any,
|
||||
key: string,
|
||||
descriptor: TypedPropertyDescriptor<(...args: F) => R>,
|
||||
) => {
|
||||
loggerInit(_target);
|
||||
|
||||
const logger = _target.logger;
|
||||
|
||||
const fn = descriptor.value;
|
||||
|
||||
if (!fn || typeof fn !== 'function') {
|
||||
logger.warn(
|
||||
`LoggedRoute decorator applied to non-function property: ${key}`,
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
const logMetadata: LoggedMetadata | undefined = Reflect.getOwnMetadata(
|
||||
nestLoggedMetadata,
|
||||
_target,
|
||||
key,
|
||||
);
|
||||
if (logMetadata) {
|
||||
// already applied, override instead
|
||||
logMetadata.updateOption(options);
|
||||
return;
|
||||
}
|
||||
const newMetadata = new LoggedMetadata(options);
|
||||
|
||||
const all = Reflect.getMetadataKeys(fn).map((k) => [
|
||||
k,
|
||||
Reflect.getMetadata(k, 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 scopedLoggerInjectableParam: number = Reflect.getOwnMetadata(
|
||||
scopedLogger,
|
||||
_target,
|
||||
key,
|
||||
);
|
||||
// if @InjectLogger exists, fake nestjs as it is @Req()
|
||||
if (scopedLoggerInjectableParam !== undefined) {
|
||||
createRouteParamDecorator(0)()(_target, key, scopedLoggerInjectableParam);
|
||||
}
|
||||
|
||||
const loggedParams: LoggedParamReflectData[] = Reflect.getOwnMetadata(
|
||||
loggedParam,
|
||||
_target,
|
||||
key,
|
||||
);
|
||||
|
||||
const returnsData: ReturnsReflectData[] | true = Reflect.getOwnMetadata(
|
||||
returns,
|
||||
fn,
|
||||
);
|
||||
|
||||
const overrideFunction = overrideBuild(
|
||||
'route',
|
||||
fn,
|
||||
logger,
|
||||
{
|
||||
scopedLoggerInjectableParam,
|
||||
loggedParams,
|
||||
},
|
||||
key,
|
||||
returnsData,
|
||||
newMetadata,
|
||||
fullRoute,
|
||||
);
|
||||
|
||||
_target[key] = overrideFunction;
|
||||
descriptor.value = overrideFunction;
|
||||
|
||||
Reflect.defineMetadata(nestLoggedMetadata, newMetadata, _target, key);
|
||||
all.forEach(([k, v]) => {
|
||||
Reflect.defineMetadata(k, v, _target[key]);
|
||||
Reflect.defineMetadata(k, v, descriptor.value);
|
||||
});
|
||||
};
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user