diff --git a/package.json b/package.json index 0ebddbc5..de1de200 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,7 @@ "pnpm": ">=7.5.1" }, "main": "dist/index.js", - "types": "dist/index.d.ts", + "types": "src/index.ts", "scripts": { "build": "turbo run build", "build:clean": "turbo run clean:build", diff --git a/packages/authorization/jest.config.js b/packages/authorization/jest.config.js index ef8af537..84f52636 100644 --- a/packages/authorization/jest.config.js +++ b/packages/authorization/jest.config.js @@ -1,4 +1,3 @@ -/** @type {import('jest').Config} */ module.exports = { transform: { "^.+\\.(t|j)sx?$": "@swc/jest", diff --git a/packages/authorization/package.json b/packages/authorization/package.json index 1121cf4c..dae4eb9e 100644 --- a/packages/authorization/package.json +++ b/packages/authorization/package.json @@ -15,8 +15,8 @@ "publishConfig": { "access": "public" }, - "main": "dist/index.js", - "types": "dist/index.d.ts", + "main": "src/index.js", + "types": "src/index.ts", "scripts": { "build": "tsc -p tsconfig.build.json", "clean:build": "rimraf ./dist", diff --git a/packages/authorization/src/decorator/EnableAuthorization.ts b/packages/authorization/src/decorator/EnableAuthorization.ts index a0d6d868..6335ff6c 100644 --- a/packages/authorization/src/decorator/EnableAuthorization.ts +++ b/packages/authorization/src/decorator/EnableAuthorization.ts @@ -10,7 +10,7 @@ export function EnableAuthorization( CurrentUserCheckerClass?: new () => CurrentUserChecker, AuthorizationCheckerClass?: new () => AuthorizationChecker, ): Function { - return function (object: Function) { + return function () { if (AuthorizationCheckerClass) { ApplicationContext.get().authorizationChecker = new AuthorizationCheckerClass(); } diff --git a/packages/config/jest.config.js b/packages/config/jest.config.js index ef8af537..84f52636 100644 --- a/packages/config/jest.config.js +++ b/packages/config/jest.config.js @@ -1,4 +1,3 @@ -/** @type {import('jest').Config} */ module.exports = { transform: { "^.+\\.(t|j)sx?$": "@swc/jest", diff --git a/packages/config/package.json b/packages/config/package.json index 25e5d960..e0ccc147 100644 --- a/packages/config/package.json +++ b/packages/config/package.json @@ -16,7 +16,7 @@ "access": "public" }, "main": "dist/index.js", - "types": "dist/index.d.ts", + "types": "src/index.ts", "scripts": { "build": "tsc -p tsconfig.build.json", "clean:build": "rimraf ./dist", diff --git a/packages/context/jest.config.js b/packages/context/jest.config.js index ef8af537..84f52636 100644 --- a/packages/context/jest.config.js +++ b/packages/context/jest.config.js @@ -1,4 +1,3 @@ -/** @type {import('jest').Config} */ module.exports = { transform: { "^.+\\.(t|j)sx?$": "@swc/jest", diff --git a/packages/context/package.json b/packages/context/package.json index 95d74aee..8fc87b0b 100644 --- a/packages/context/package.json +++ b/packages/context/package.json @@ -16,7 +16,7 @@ "access": "public" }, "main": "dist/index.js", - "types": "dist/index.d.ts", + "types": "src/index.ts", "scripts": { "build": "tsc -p tsconfig.build.json", "clean:build": "rimraf ./dist", diff --git a/packages/core/jest.config.js b/packages/core/jest.config.js index ef8af537..84f52636 100644 --- a/packages/core/jest.config.js +++ b/packages/core/jest.config.js @@ -1,4 +1,3 @@ -/** @type {import('jest').Config} */ module.exports = { transform: { "^.+\\.(t|j)sx?$": "@swc/jest", diff --git a/packages/core/package.json b/packages/core/package.json index 077e2b25..23a26a23 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -16,7 +16,7 @@ "access": "public" }, "main": "dist/index.js", - "types": "dist/index.d.ts", + "types": "src/index.ts", "scripts": { "build": "tsc -p tsconfig.build.json", "clean:build": "rimraf ./dist", diff --git a/packages/core/src/decorators/Configurations.ts b/packages/core/src/decorators/Configurations.ts index 99d02747..e8e34337 100644 --- a/packages/core/src/decorators/Configurations.ts +++ b/packages/core/src/decorators/Configurations.ts @@ -1,5 +1,5 @@ export function Configurations(configurationClasses: (new (...args: any[]) => any)[]): Function { - return function (target: any) { + return function () { configurationClasses.map(ClassConstructor => new ClassConstructor()); }; } diff --git a/packages/core/src/decorators/Controllers.ts b/packages/core/src/decorators/Controllers.ts index be1d5fec..cef0d739 100644 --- a/packages/core/src/decorators/Controllers.ts +++ b/packages/core/src/decorators/Controllers.ts @@ -1,7 +1,7 @@ import {ApplicationContext} from "@node-boot/context"; export function Controllers(controllers: Function[]): Function { - return function (target: any) { + return function () { ApplicationContext.get().controllerClasses = controllers; }; } diff --git a/packages/core/src/decorators/EnableAutoConfiguration.ts b/packages/core/src/decorators/EnableAutoConfiguration.ts deleted file mode 100644 index 8e994fc7..00000000 --- a/packages/core/src/decorators/EnableAutoConfiguration.ts +++ /dev/null @@ -1,37 +0,0 @@ -import * as path from "path"; -import * as fs from "fs"; - -function getProjectRootDirectory(): string { - let currentDir = __dirname; - while (!fs.existsSync(path.join(currentDir, "package.json"))) { - // Navigate up one directory level - currentDir = path.dirname(currentDir); - } - return currentDir; -} - -async function instantiateClasses(rootDir, classes) { - for (const classData of classes) { - const {class: className, path: classPath, arguments: classArguments} = classData; - - // Use dynamic import to handle the class asynchronously. - const module = require(path.join(rootDir, classPath)); - const Class = module[className]; - - const argumentsMetadata = Reflect.getMetadata("design:paramtypes", Class); - - // Check if the class has any constructor arguments (dependencies). - if (argumentsMetadata && argumentsMetadata.length > 0) { - const dependencies = argumentsMetadata.map((argType, index) => { - const argValue = classArguments ? classArguments[index] : undefined; - return typeof argValue !== "undefined" ? argValue : new argType(); - }); - - const instance = new Class(...dependencies); - // Optionally, you can store the instances in a container for later use if needed. - } else { - const instance = new Class(); - // Optionally, you can store the instances in a container for later use if needed. - } - } -} diff --git a/packages/core/src/decorators/EnableClassTransformer.ts b/packages/core/src/decorators/EnableClassTransformer.ts index a03f5d4c..372059f2 100644 --- a/packages/core/src/decorators/EnableClassTransformer.ts +++ b/packages/core/src/decorators/EnableClassTransformer.ts @@ -2,19 +2,19 @@ import {ApplicationContext, TransformerOptions} from "@node-boot/context"; import {ClassTransformOptions} from "class-transformer"; export function ClassToPlainTransform(options: ClassTransformOptions): Function { - return function (target: Function) { + return function () { ApplicationContext.get().classToPlainTransformOptions = options; }; } export function PlainToClassTransform(options: ClassTransformOptions): Function { - return function (target: Function) { + return function () { ApplicationContext.get().plainToClassTransformOptions = options; }; } export function EnableClassTransformer(options?: TransformerOptions): Function { - return function (target: Function) { + return function () { ApplicationContext.get().classTransformer = options?.enabled ?? true; ApplicationContext.get().classToPlainTransformOptions = options?.classToPlain; diff --git a/packages/core/src/decorators/EnableComponentScan.ts b/packages/core/src/decorators/EnableComponentScan.ts index 11502f05..64f1be1f 100644 --- a/packages/core/src/decorators/EnableComponentScan.ts +++ b/packages/core/src/decorators/EnableComponentScan.ts @@ -2,7 +2,7 @@ import {ApplicationContext, ComponentScanOptions} from "@node-boot/context"; import path from "path"; export function EnableComponentScan(options?: ComponentScanOptions): Function { - return function (object: Function) { + return function () { options = options ?? { controllerPaths: ["/controllers"], middlewarePaths: ["/middlewares"], diff --git a/packages/core/src/decorators/GlobalMiddlewares.ts b/packages/core/src/decorators/GlobalMiddlewares.ts index 19f49f6f..dd78e799 100644 --- a/packages/core/src/decorators/GlobalMiddlewares.ts +++ b/packages/core/src/decorators/GlobalMiddlewares.ts @@ -1,7 +1,7 @@ import {ApplicationContext} from "@node-boot/context"; export function GlobalMiddlewares(middlewares: Function[]): Function { - return function (target: any) { + return function () { ApplicationContext.get().globalMiddlewares = middlewares; }; } diff --git a/packages/core/src/decorators/Interceptors.ts b/packages/core/src/decorators/Interceptors.ts index 414c5355..2144de18 100644 --- a/packages/core/src/decorators/Interceptors.ts +++ b/packages/core/src/decorators/Interceptors.ts @@ -1,7 +1,7 @@ import {ApplicationContext} from "@node-boot/context"; export function Interceptors(interceptors: Function[]): Function { - return function (target: any) { + return function () { ApplicationContext.get().interceptorClasses = interceptors; }; } diff --git a/packages/core/src/decorators/index.ts b/packages/core/src/decorators/index.ts index 863e77ed..b61d3d58 100644 --- a/packages/core/src/decorators/index.ts +++ b/packages/core/src/decorators/index.ts @@ -12,7 +12,6 @@ export * from "./CookieParam"; export * from "./CookieParams"; export * from "./Ctx"; export * from "./Delete"; -export * from "./EnableAutoConfiguration"; export * from "./EnableClassTransformer"; export * from "./EnableComponentScan"; export * from "./ErrorHandler"; diff --git a/packages/di/jest.config.js b/packages/di/jest.config.js index ef8af537..84f52636 100644 --- a/packages/di/jest.config.js +++ b/packages/di/jest.config.js @@ -1,4 +1,3 @@ -/** @type {import('jest').Config} */ module.exports = { transform: { "^.+\\.(t|j)sx?$": "@swc/jest", diff --git a/packages/di/package.json b/packages/di/package.json index 08c357ef..5474e47b 100644 --- a/packages/di/package.json +++ b/packages/di/package.json @@ -16,7 +16,7 @@ "access": "public" }, "main": "dist/index.js", - "types": "dist/index.d.ts", + "types": "src/index.ts", "scripts": { "build": "tsc -p tsconfig.build.json", "clean:build": "rimraf ./dist", diff --git a/packages/di/src/decorators/EnableDI.ts b/packages/di/src/decorators/EnableDI.ts index d288d783..d72d427d 100644 --- a/packages/di/src/decorators/EnableDI.ts +++ b/packages/di/src/decorators/EnableDI.ts @@ -7,7 +7,7 @@ import {ApplicationContext, IocContainer, UseContainerOptions} from "@node-boot/ * @param options Extra options for the IOC container */ export function EnableDI(iocContainer: IocContainer, options?: UseContainerOptions): Function { - return function (object: Function) { + return function () { ApplicationContext.get().diOptions = { iocContainer, options, diff --git a/packages/di/src/decorators/Inject.ts b/packages/di/src/decorators/Inject.ts index 9af7dc02..1813f88e 100644 --- a/packages/di/src/decorators/Inject.ts +++ b/packages/di/src/decorators/Inject.ts @@ -16,12 +16,10 @@ export function Inject(options?: InjectionOptions): Function { return (target: Object, propertyName: string | Symbol, index?: number) => { // Registering metadata for custom filed injection (used for example in the Persistence Event Subscribers) if (propertyName && typeof propertyName === "string") { - const propertyType = Reflect.getMetadata("design:type", target, propertyName); const injectProperties: string[] = Reflect.getMetadata(REQUIRES_FIELD_INJECTION_KEY, target) || []; injectProperties.push(propertyName); Reflect.defineMetadata(REQUIRES_FIELD_INJECTION_KEY, injectProperties, target); } - // Normal injection decorateInjection(target, propertyName, index, options); }; diff --git a/packages/engine/jest.config.js b/packages/engine/jest.config.js index ef8af537..84f52636 100644 --- a/packages/engine/jest.config.js +++ b/packages/engine/jest.config.js @@ -1,4 +1,3 @@ -/** @type {import('jest').Config} */ module.exports = { transform: { "^.+\\.(t|j)sx?$": "@swc/jest", diff --git a/packages/engine/package.json b/packages/engine/package.json index 74fb8b76..a0faafde 100644 --- a/packages/engine/package.json +++ b/packages/engine/package.json @@ -16,8 +16,8 @@ "publishConfig": { "access": "public" }, - "main": "dist/index.js", - "types": "dist/index.d.ts", + "main": "src/index.js", + "types": "src/index.ts", "scripts": { "build": "tsc -p tsconfig.build.json", "clean:build": "rimraf ./dist", diff --git a/packages/engine/src/core/NodeBootDriver.ts b/packages/engine/src/core/NodeBootDriver.ts index 865eea4d..6d5bb72e 100644 --- a/packages/engine/src/core/NodeBootDriver.ts +++ b/packages/engine/src/core/NodeBootDriver.ts @@ -79,7 +79,7 @@ export abstract class NodeBootDriver { */ currentUserChecker?: CurrentUserChecker; - protected transformResult(result: any, actionMetadata: ActionMetadata, action: TAction): any { + protected transformResult(result: any, actionMetadata: ActionMetadata): T { // check if we need to transform result const shouldTransform = this.useClassTransformer && // transform only if class-transformer is enabled diff --git a/packages/error/jest.config.js b/packages/error/jest.config.js index ef8af537..84f52636 100644 --- a/packages/error/jest.config.js +++ b/packages/error/jest.config.js @@ -1,4 +1,3 @@ -/** @type {import('jest').Config} */ module.exports = { transform: { "^.+\\.(t|j)sx?$": "@swc/jest", diff --git a/packages/error/package.json b/packages/error/package.json index 196b9b69..f289150a 100644 --- a/packages/error/package.json +++ b/packages/error/package.json @@ -15,8 +15,8 @@ "publishConfig": { "access": "public" }, - "main": "dist/index.js", - "types": "dist/index.d.ts", + "main": "src/index.js", + "types": "src/index.ts", "scripts": { "build": "tsc -p tsconfig.build.json", "clean:build": "rimraf ./dist", diff --git a/packages/extension/jest.config.js b/packages/extension/jest.config.js index ef8af537..84f52636 100644 --- a/packages/extension/jest.config.js +++ b/packages/extension/jest.config.js @@ -1,4 +1,3 @@ -/** @type {import('jest').Config} */ module.exports = { transform: { "^.+\\.(t|j)sx?$": "@swc/jest", diff --git a/packages/extension/package.json b/packages/extension/package.json index 79c8aa3a..6de12a7e 100644 --- a/packages/extension/package.json +++ b/packages/extension/package.json @@ -16,7 +16,7 @@ "access": "public" }, "main": "dist/index.js", - "types": "dist/index.d.ts", + "types": "src/index.ts", "scripts": { "build": "tsc -p tsconfig.build.json", "clean:build": "rimraf ./dist", diff --git a/packages/extension/src/Optional.ts b/packages/extension/src/Optional.ts index 522fac6d..66266962 100644 --- a/packages/extension/src/Optional.ts +++ b/packages/extension/src/Optional.ts @@ -196,11 +196,11 @@ export class Optional { return Optional.of(this.value.filter(predicate) as T); } else if (this.value instanceof Map || this.value instanceof Set) { // Filter map or set - const filteredEntries = Array.from(this.value.entries()).filter(([key, value]) => predicate(value)); + const filteredEntries = Array.from(this.value.entries()).filter(([, value]) => predicate(value)); if (this.value instanceof Map) { return Optional.of(new Map(filteredEntries) as T); } else { - return Optional.of(new Set(filteredEntries.map(([key, value]) => value)) as T); + return Optional.of(new Set(filteredEntries.map(([, value]) => value)) as T); } } else { // Filter single value diff --git a/packages/openapi/jest.config.js b/packages/openapi/jest.config.js index ef8af537..84f52636 100644 --- a/packages/openapi/jest.config.js +++ b/packages/openapi/jest.config.js @@ -1,4 +1,3 @@ -/** @type {import('jest').Config} */ module.exports = { transform: { "^.+\\.(t|j)sx?$": "@swc/jest", diff --git a/packages/openapi/package.json b/packages/openapi/package.json index f14b2761..b229c836 100644 --- a/packages/openapi/package.json +++ b/packages/openapi/package.json @@ -16,7 +16,7 @@ "access": "public" }, "main": "dist/index.js", - "types": "dist/index.d.ts", + "types": "src/index.ts", "scripts": { "build": "tsc -p tsconfig.build.json", "clean:build": "rimraf ./dist", diff --git a/packages/openapi/src/adapter/ExpressOpenApi.ts b/packages/openapi/src/adapter/ExpressOpenApi.ts index 9f1800ab..1ac29c94 100644 --- a/packages/openapi/src/adapter/ExpressOpenApi.ts +++ b/packages/openapi/src/adapter/ExpressOpenApi.ts @@ -1,13 +1,14 @@ import {OpenApiAdapter, OpenApiOptions} from "@node-boot/context"; import swaggerUi from "swagger-ui-express"; import {OpenApiSpecAdapter} from "./OpenApiSpecAdapter"; +import {Response} from "express"; export class ExpressOpenApi implements OpenApiAdapter { bind(openApiOptions: OpenApiOptions, server: any, router: any): void { if (swaggerUi?.serve) { const {spec, options} = OpenApiSpecAdapter.adapt(openApiOptions); - router.get(options.swaggerOptions.url, (req, res) => res.json(spec)); + router.get(options.swaggerOptions.url, (_: never, res: Response) => res.json(spec)); server.use("/api-docs", swaggerUi.serve, swaggerUi.setup(spec, options)); } else { throw new Error( diff --git a/packages/openapi/src/adapter/FastifyOpenApi.ts b/packages/openapi/src/adapter/FastifyOpenApi.ts index 9a1f2001..23855965 100644 --- a/packages/openapi/src/adapter/FastifyOpenApi.ts +++ b/packages/openapi/src/adapter/FastifyOpenApi.ts @@ -6,7 +6,7 @@ export class FastifyOpenApi implements OpenApiAdapter { bind(openApiOptions: OpenApiOptions, server: FastifyInstance, router: FastifyInstance): void { const {spec, options} = OpenApiSpecAdapter.adapt(openApiOptions); - router.get(options.swaggerOptions.url, async (request, reply) => { + router.get(options.swaggerOptions.url, async (_, reply) => { reply.send(spec); }); server.register(require("@fastify/swagger"), { diff --git a/packages/openapi/src/decorator/EnableOpenApi.ts b/packages/openapi/src/decorator/EnableOpenApi.ts index ee88a2f6..65ccca1a 100644 --- a/packages/openapi/src/decorator/EnableOpenApi.ts +++ b/packages/openapi/src/decorator/EnableOpenApi.ts @@ -7,10 +7,10 @@ import {FastifyOpenApi} from "../adapter/FastifyOpenApi"; /** * Defines the configurations to enable Swagger Open API * - * @param openApi The OpenAPI definitions and base config + * @param _ The OpenAPI definitions and base config */ -export function EnableOpenApi(openApi: Partial = {}): Function { - return function (object: Function) { +export function EnableOpenApi(_: Partial = {}): Function { + return function () { ApplicationContext.get().openApi = new (class implements OpenApiBridgeAdapter { bind(serverType: string): OpenApiAdapter { switch (serverType) { diff --git a/packages/openapi/src/decorator/OpenAPI.ts b/packages/openapi/src/decorator/OpenAPI.ts index c4d3744d..297223bd 100644 --- a/packages/openapi/src/decorator/OpenAPI.ts +++ b/packages/openapi/src/decorator/OpenAPI.ts @@ -11,7 +11,7 @@ import {OpenAPI as InnerOpenAPI} from "routing-controllers-openapi"; * returning an updated Operation. */ export function OpenAPI(...args: Parameters) { - return (...innerArgs: [Function] | [object, string, PropertyDescriptor]) => { + return (...innerArgs: [Function] | [object, string, PropertyDescriptor]) => { InnerOpenAPI(...args)(...innerArgs); }; } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 09b1f56f..3a7832e1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -724,6 +724,9 @@ importers: specifier: '>=2.14.2' version: 2.14.2 devDependencies: + '@types/express': + specifier: ^4.17.21 + version: 4.17.21 '@types/koa': specifier: ^2.13.11 version: 2.13.11 @@ -1981,7 +1984,7 @@ packages: resolution: {integrity: sha512-h7BcvPUogWbKCzBR2lY4oqaZbO3jXZksexYJVFvkrFeLgbZjQkU4x8pRq6eg2MHXQhY0McQdqmmsxRWlVAHooA==} dependencies: '@types/connect': 3.4.35 - '@types/express': 4.17.17 + '@types/express': 4.17.21 '@types/keygrip': 1.0.2 '@types/node': 18.15.3 @@ -2018,6 +2021,15 @@ packages: '@types/express-serve-static-core': 4.17.35 '@types/qs': 6.9.7 '@types/serve-static': 1.15.2 + dev: true + + /@types/express@4.17.21: + resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} + dependencies: + '@types/body-parser': 1.19.2 + '@types/express-serve-static-core': 4.17.35 + '@types/qs': 6.9.7 + '@types/serve-static': 1.15.2 /@types/graceful-fs@4.1.6: resolution: {integrity: sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==} diff --git a/samples/sample-express/jest.config.js b/samples/sample-express/jest.config.js index ef8af537..84f52636 100644 --- a/samples/sample-express/jest.config.js +++ b/samples/sample-express/jest.config.js @@ -1,4 +1,3 @@ -/** @type {import('jest').Config} */ module.exports = { transform: { "^.+\\.(t|j)sx?$": "@swc/jest", diff --git a/samples/sample-express/package.json b/samples/sample-express/package.json index f64bef75..d7937d21 100644 --- a/samples/sample-express/package.json +++ b/samples/sample-express/package.json @@ -16,7 +16,7 @@ "access": "public" }, "main": "dist/index.js", - "types": "dist/index.d.ts", + "types": "src/index.ts", "scripts": { "create:migration": "typeorm migration:create ./src/persistence/migrations/migration", "start": "pnpm run build && node dist/server.js", diff --git a/samples/sample-express/src/auth/DefaultAuthorizationResolver.ts b/samples/sample-express/src/auth/DefaultAuthorizationResolver.ts index fdb595a0..bc3cf5ef 100644 --- a/samples/sample-express/src/auth/DefaultAuthorizationResolver.ts +++ b/samples/sample-express/src/auth/DefaultAuthorizationResolver.ts @@ -9,7 +9,7 @@ export class DefaultAuthorizationResolver implements AuthorizationChecker, roles: string[]): Promise { + async check(_: Action, roles: string[]): Promise { // here you can use request/response objects from action // also if decorator defines roles it needs to access the action // you can use them to provide granular access check @@ -18,8 +18,6 @@ export class DefaultAuthorizationResolver implements AuthorizationChecker) { + public security({application}: BeansContext) { application.use(hpp()); application.use(helmet()); application.disable("x-powered-by"); diff --git a/samples/sample-express/src/middlewares/ErrorMiddleware.ts b/samples/sample-express/src/middlewares/ErrorMiddleware.ts index c46490dd..5fd02e08 100644 --- a/samples/sample-express/src/middlewares/ErrorMiddleware.ts +++ b/samples/sample-express/src/middlewares/ErrorMiddleware.ts @@ -11,7 +11,7 @@ export class ErrorMiddleware implements ErrorHandlerInterface): any { - const {request, response, next} = action; + const {request, next} = action; try { const status: number = error.httpCode || 500; const message: string = error.message || "Something went wrong"; diff --git a/samples/sample-express/src/middlewares/LoggingMiddleware.ts b/samples/sample-express/src/middlewares/LoggingMiddleware.ts index 372b7ead..166e405e 100644 --- a/samples/sample-express/src/middlewares/LoggingMiddleware.ts +++ b/samples/sample-express/src/middlewares/LoggingMiddleware.ts @@ -10,7 +10,7 @@ export class LoggingMiddleware implements MiddlewareInterface private logger: Logger; use(action: Action): any { - const {request, response, next} = action; + const {next} = action; this.logger.info(`Logging Middleware: Incoming request`); next?.(); } diff --git a/samples/sample-express/src/middlewares/validation.middleware.ts b/samples/sample-express/src/middlewares/validation.middleware.ts index f7957759..6173fd3e 100644 --- a/samples/sample-express/src/middlewares/validation.middleware.ts +++ b/samples/sample-express/src/middlewares/validation.middleware.ts @@ -17,7 +17,7 @@ export const ValidationMiddleware = ( whitelist = false, forbidNonWhitelisted = false, ) => { - return (req: Request, res: Response, next: NextFunction) => { + return (req: Request, _: Response, next: NextFunction) => { const dto = plainToInstance(type, req.body); validateOrReject(dto, { skipMissingProperties, diff --git a/samples/sample-express/src/persistence/listeners/GlobalEntityEventListener.ts b/samples/sample-express/src/persistence/listeners/GlobalEntityEventListener.ts index 71a478c8..d52c5d3f 100644 --- a/samples/sample-express/src/persistence/listeners/GlobalEntityEventListener.ts +++ b/samples/sample-express/src/persistence/listeners/GlobalEntityEventListener.ts @@ -98,42 +98,42 @@ export class GlobalEntityEventListener implements EntitySubscriberInterface { /** * Called before transaction start. */ - beforeTransactionStart(event: TransactionStartEvent) { + beforeTransactionStart(_: TransactionStartEvent) { this.logger.info(`BEFORE TRANSACTION STARTED`); } /** * Called after transaction start. */ - afterTransactionStart(event: TransactionStartEvent) { + afterTransactionStart(_: TransactionStartEvent) { this.logger.info(`AFTER TRANSACTION STARTED`); } /** * Called before transaction commit. */ - beforeTransactionCommit(event: TransactionCommitEvent) { + beforeTransactionCommit(_: TransactionCommitEvent) { this.logger.info(`BEFORE TRANSACTION COMMITTED`); } /** * Called after transaction commit. */ - afterTransactionCommit(event: TransactionCommitEvent) { + afterTransactionCommit(_: TransactionCommitEvent) { this.logger.info(`AFTER TRANSACTION COMMITTED`); } /** * Called before transaction rollback. */ - beforeTransactionRollback(event: TransactionRollbackEvent) { + beforeTransactionRollback(_: TransactionRollbackEvent) { this.logger.info(`BEFORE TRANSACTION ROLLBACK`); } /** * Called after transaction rollback. */ - afterTransactionRollback(event: TransactionRollbackEvent) { + afterTransactionRollback(_: TransactionRollbackEvent) { this.logger.info(`AFTER TRANSACTION ROLLBACK`); } } diff --git a/samples/sample-express/src/services/users.service.ts b/samples/sample-express/src/services/users.service.ts index a41f690e..6e02c56f 100644 --- a/samples/sample-express/src/services/users.service.ts +++ b/samples/sample-express/src/services/users.service.ts @@ -84,7 +84,7 @@ export class UserService { await Optional.of(user) .orElseThrow(() => new HttpError(409, "User doesn't exist")) - .runAsync(user => this.userRepository.delete({id: userId})); + .runAsync(() => this.userRepository.delete({id: userId})); throw new Error("Error after deleting that should rollback transaction"); } diff --git a/samples/sample-fastify/jest.config.js b/samples/sample-fastify/jest.config.js index ef8af537..84f52636 100644 --- a/samples/sample-fastify/jest.config.js +++ b/samples/sample-fastify/jest.config.js @@ -1,4 +1,3 @@ -/** @type {import('jest').Config} */ module.exports = { transform: { "^.+\\.(t|j)sx?$": "@swc/jest", diff --git a/samples/sample-fastify/package.json b/samples/sample-fastify/package.json index 1cc88ddf..a2fdbb29 100644 --- a/samples/sample-fastify/package.json +++ b/samples/sample-fastify/package.json @@ -16,7 +16,7 @@ "access": "public" }, "main": "dist/index.js", - "types": "dist/index.d.ts", + "types": "src/index.ts", "scripts": { "start": "pnpm run build && node dist/server.js", "start:prod": "pnpm run build && NODE_ENV=production node dist/server.js", diff --git a/samples/sample-fastify/src/auth/DefaultAuthorizationResolver.ts b/samples/sample-fastify/src/auth/DefaultAuthorizationResolver.ts index 2b22a17e..28e37e92 100644 --- a/samples/sample-fastify/src/auth/DefaultAuthorizationResolver.ts +++ b/samples/sample-fastify/src/auth/DefaultAuthorizationResolver.ts @@ -10,7 +10,7 @@ export class DefaultAuthorizationResolver implements AuthorizationChecker, roles: string[]): Promise { + async check(_: Action, roles: string[]): Promise { // here you can use request/response objects from action // also if decorator defines roles it needs to access the action // you can use them to provide granular access check @@ -18,9 +18,6 @@ export class DefaultAuthorizationResolver implements AuthorizationChecker, payload?: any): void { + use(_: Action): void { this.logger.info(`Logging Middleware: Incoming request`); //done(); } diff --git a/samples/sample-fastify/src/persistence/listeners/GlobalEntityEventListener.ts b/samples/sample-fastify/src/persistence/listeners/GlobalEntityEventListener.ts index 71a478c8..d52c5d3f 100644 --- a/samples/sample-fastify/src/persistence/listeners/GlobalEntityEventListener.ts +++ b/samples/sample-fastify/src/persistence/listeners/GlobalEntityEventListener.ts @@ -98,42 +98,42 @@ export class GlobalEntityEventListener implements EntitySubscriberInterface { /** * Called before transaction start. */ - beforeTransactionStart(event: TransactionStartEvent) { + beforeTransactionStart(_: TransactionStartEvent) { this.logger.info(`BEFORE TRANSACTION STARTED`); } /** * Called after transaction start. */ - afterTransactionStart(event: TransactionStartEvent) { + afterTransactionStart(_: TransactionStartEvent) { this.logger.info(`AFTER TRANSACTION STARTED`); } /** * Called before transaction commit. */ - beforeTransactionCommit(event: TransactionCommitEvent) { + beforeTransactionCommit(_: TransactionCommitEvent) { this.logger.info(`BEFORE TRANSACTION COMMITTED`); } /** * Called after transaction commit. */ - afterTransactionCommit(event: TransactionCommitEvent) { + afterTransactionCommit(_: TransactionCommitEvent) { this.logger.info(`AFTER TRANSACTION COMMITTED`); } /** * Called before transaction rollback. */ - beforeTransactionRollback(event: TransactionRollbackEvent) { + beforeTransactionRollback(_: TransactionRollbackEvent) { this.logger.info(`BEFORE TRANSACTION ROLLBACK`); } /** * Called after transaction rollback. */ - afterTransactionRollback(event: TransactionRollbackEvent) { + afterTransactionRollback(_: TransactionRollbackEvent) { this.logger.info(`AFTER TRANSACTION ROLLBACK`); } } diff --git a/samples/sample-fastify/src/services/users.service.ts b/samples/sample-fastify/src/services/users.service.ts index bc546b63..666f291d 100644 --- a/samples/sample-fastify/src/services/users.service.ts +++ b/samples/sample-fastify/src/services/users.service.ts @@ -83,7 +83,7 @@ export class UserService { await Optional.of(user) .orElseThrow(() => new HttpError(409, "User doesn't exist")) - .runAsync(user => this.userRepository.delete({id: userId})); + .runAsync(() => this.userRepository.delete({id: userId})); throw new Error("Error after deleting that should rollback transaction"); } diff --git a/samples/sample-koa/jest.config.js b/samples/sample-koa/jest.config.js index ef8af537..84f52636 100644 --- a/samples/sample-koa/jest.config.js +++ b/samples/sample-koa/jest.config.js @@ -1,4 +1,3 @@ -/** @type {import('jest').Config} */ module.exports = { transform: { "^.+\\.(t|j)sx?$": "@swc/jest", diff --git a/samples/sample-koa/package.json b/samples/sample-koa/package.json index daccd877..1c866414 100644 --- a/samples/sample-koa/package.json +++ b/samples/sample-koa/package.json @@ -16,7 +16,7 @@ "access": "public" }, "main": "dist/index.js", - "types": "dist/index.d.ts", + "types": "src/index.ts", "scripts": { "start": "pnpm run build && node dist/server.js", "start:prod": "pnpm run build && NODE_ENV=production node dist/server.js", diff --git a/samples/sample-koa/src/auth/DefaultAuthorizationChecker.ts b/samples/sample-koa/src/auth/DefaultAuthorizationChecker.ts index ac1dab01..aeb7cc22 100644 --- a/samples/sample-koa/src/auth/DefaultAuthorizationChecker.ts +++ b/samples/sample-koa/src/auth/DefaultAuthorizationChecker.ts @@ -9,7 +9,7 @@ export class DefaultAuthorizationChecker implements AuthorizationChecker, roles: string[]): Promise { + async check(_: Action, roles: string[]): Promise { // here you can use request/response objects from action // also if decorator defines roles it needs to access the action // you can use them to provide granular access check @@ -18,14 +18,10 @@ export class DefaultAuthorizationChecker implements AuthorizationChecker user.roles.indexOf(role) !== -1)) return true; - return false; + return !!(user && roles.find(role => user.roles.indexOf(role) !== -1)); } } diff --git a/samples/sample-koa/src/config/BackendConfigProperties.ts b/samples/sample-koa/src/config/BackendConfigProperties.ts new file mode 100644 index 00000000..61df9bab --- /dev/null +++ b/samples/sample-koa/src/config/BackendConfigProperties.ts @@ -0,0 +1,10 @@ +import {ConfigurationProperties} from "@node-boot/config"; + +@ConfigurationProperties({ + configPath: "backend", + configName: "backend-config", +}) +export class BackendConfigProperties { + baseUrl!: string; + allowInsecureCookie!: boolean; +} diff --git a/samples/sample-koa/src/config/SecurityConfiguration.ts b/samples/sample-koa/src/config/SecurityConfiguration.ts index 932a386f..938f943a 100644 --- a/samples/sample-koa/src/config/SecurityConfiguration.ts +++ b/samples/sample-koa/src/config/SecurityConfiguration.ts @@ -7,7 +7,7 @@ import cors from "@koa/cors"; @Configuration() export class SecurityConfiguration { @Bean() - public security({application, iocContainer}: BeansContext) { + public security({application}: BeansContext) { application.use( helmet({ // FIXME - Disabling contentSecurityPolicy if @EnableOpenApi is applied diff --git a/samples/sample-koa/src/dtos/users.dto.ts b/samples/sample-koa/src/dtos/users.dto.ts index 72edaaeb..b19e57d4 100644 --- a/samples/sample-koa/src/dtos/users.dto.ts +++ b/samples/sample-koa/src/dtos/users.dto.ts @@ -2,13 +2,13 @@ import {IsEmail, IsString, IsNotEmpty, MinLength, MaxLength} from "class-validat export class CreateUserDto { @IsEmail() - public email: string; + public email!: string; @IsString() @IsNotEmpty() @MinLength(9) @MaxLength(32) - public password: string; + public password!: string; } export class UpdateUserDto { @@ -16,5 +16,5 @@ export class UpdateUserDto { @IsNotEmpty() @MinLength(9) @MaxLength(32) - public password: string; + public password!: string; } diff --git a/samples/sample-koa/src/middlewares/CustomErrorHandler.ts b/samples/sample-koa/src/middlewares/CustomErrorHandler.ts index df82dddc..bb41256f 100644 --- a/samples/sample-koa/src/middlewares/CustomErrorHandler.ts +++ b/samples/sample-koa/src/middlewares/CustomErrorHandler.ts @@ -11,7 +11,7 @@ export class CustomErrorHandler implements ErrorHandlerInterface): void { - const {request, response, next} = action; + const {request, next} = action; try { const status: number = error.httpCode || 500; const message: string = error.message || "Something went wrong"; diff --git a/samples/sample-koa/src/middlewares/LoggingMiddleware.ts b/samples/sample-koa/src/middlewares/LoggingMiddleware.ts index 709d1309..7a288960 100644 --- a/samples/sample-koa/src/middlewares/LoggingMiddleware.ts +++ b/samples/sample-koa/src/middlewares/LoggingMiddleware.ts @@ -9,7 +9,7 @@ export class LoggingMiddleware implements MiddlewareInterface @Inject() private logger: Logger; - async use(action: Action, payload?: unknown): Promise { + async use(action: Action): Promise { this.logger.info(`Logging Middleware: Incoming request`); action.context; return action @@ -18,7 +18,7 @@ export class LoggingMiddleware implements MiddlewareInterface console.log("do something after execution"); }) .catch(error => { - console.log("error handling is also here"); + console.log("error handling is also here", error); }); } } diff --git a/samples/sample-koa/src/middlewares/validation.middleware.ts b/samples/sample-koa/src/middlewares/validation.middleware.ts index 824ca6ab..623f7471 100644 --- a/samples/sample-koa/src/middlewares/validation.middleware.ts +++ b/samples/sample-koa/src/middlewares/validation.middleware.ts @@ -1,6 +1,9 @@ import {plainToInstance} from "class-transformer"; import {validateOrReject, ValidationError} from "class-validator"; import {HttpException} from "../exceptions/httpException"; +import {Next, Request} from "koa"; + +type ReqWithBody = Request & {body?: unknown}; /** * @name ValidationMiddleware @@ -16,8 +19,8 @@ export const ValidationMiddleware = ( whitelist = false, forbidNonWhitelisted = false, ) => { - return (req: any, res: any, next: any) => { - const dto = plainToInstance(type, req.body); + return (req: ReqWithBody, _res: never, next: Next) => { + const dto: object = plainToInstance(type, req.body); validateOrReject(dto, { skipMissingProperties, whitelist, @@ -25,13 +28,14 @@ export const ValidationMiddleware = ( }) .then(() => { req.body = dto; - next(); + return next(); }) .catch((errors: ValidationError[]) => { const message = errors .map((error: ValidationError) => Object.values(error.constraints ?? {})) .join(", "); - next(new HttpException(400, message)); + // void next(new HttpException(400, message)); + throw new HttpException(400, message); }); }; }; diff --git a/samples/sample-koa/src/persistence/listeners/GlobalEntityEventListener.ts b/samples/sample-koa/src/persistence/listeners/GlobalEntityEventListener.ts index 71a478c8..6f2e3a1f 100644 --- a/samples/sample-koa/src/persistence/listeners/GlobalEntityEventListener.ts +++ b/samples/sample-koa/src/persistence/listeners/GlobalEntityEventListener.ts @@ -16,124 +16,124 @@ import {Inject} from "@node-boot/di"; @EntityEventSubscriber() export class GlobalEntityEventListener implements EntitySubscriberInterface { @Inject() - private logger: Logger; + private logger?: Logger; /** * Called after entity is loaded. */ afterLoad(entity: any) { - this.logger.info(`AFTER ENTITY LOADED: `, entity); + this.logger?.info(`AFTER ENTITY LOADED: `, entity); } /** * Called before entity insertion. */ beforeInsert(event: InsertEvent) { - this.logger.info(`BEFORE ENTITY INSERTED: `, event.entity); + this.logger?.info(`BEFORE ENTITY INSERTED: `, event.entity); } /** * Called after entity insertion. */ afterInsert(event: InsertEvent) { - this.logger.info(`AFTER ENTITY INSERTED: `, event.entity); + this.logger?.info(`AFTER ENTITY INSERTED: `, event.entity); } /** * Called before entity update. */ beforeUpdate(event: UpdateEvent) { - this.logger.info(`BEFORE ENTITY UPDATED: `, event.entity); + this.logger?.info(`BEFORE ENTITY UPDATED: `, event.entity); } /** * Called after entity update. */ afterUpdate(event: UpdateEvent) { - this.logger.info(`AFTER ENTITY UPDATED: `, event.entity); + this.logger?.info(`AFTER ENTITY UPDATED: `, event.entity); } /** * Called before entity removal. */ beforeRemove(event: RemoveEvent) { - this.logger.info(`BEFORE ENTITY WITH ID ${event.entityId} REMOVED: `, event.entity); + this.logger?.info(`BEFORE ENTITY WITH ID ${event.entityId} REMOVED: `, event.entity); } /** * Called after entity removal. */ afterRemove(event: RemoveEvent) { - this.logger.info(`AFTER ENTITY WITH ID ${event.entityId} REMOVED: `, event.entity); + this.logger?.info(`AFTER ENTITY WITH ID ${event.entityId} REMOVED: `, event.entity); } /** * Called before entity removal. */ beforeSoftRemove(event: SoftRemoveEvent) { - this.logger.info(`BEFORE ENTITY WITH ID ${event.entityId} SOFT REMOVED: `, event.entity); + this.logger?.info(`BEFORE ENTITY WITH ID ${event.entityId} SOFT REMOVED: `, event.entity); } /** * Called after entity removal. */ afterSoftRemove(event: SoftRemoveEvent) { - this.logger.info(`AFTER ENTITY WITH ID ${event.entityId} SOFT REMOVED: `, event.entity); + this.logger?.info(`AFTER ENTITY WITH ID ${event.entityId} SOFT REMOVED: `, event.entity); } /** * Called before entity recovery. */ beforeRecover(event: RecoverEvent) { - this.logger.info(`BEFORE ENTITY WITH ID ${event.entityId} RECOVERED: `, event.entity); + this.logger?.info(`BEFORE ENTITY WITH ID ${event.entityId} RECOVERED: `, event.entity); } /** * Called after entity recovery. */ afterRecover(event: RecoverEvent) { - this.logger.info(`AFTER ENTITY WITH ID ${event.entityId} RECOVERED: `, event.entity); + this.logger?.info(`AFTER ENTITY WITH ID ${event.entityId} RECOVERED: `, event.entity); } /** * Called before transaction start. */ - beforeTransactionStart(event: TransactionStartEvent) { - this.logger.info(`BEFORE TRANSACTION STARTED`); + beforeTransactionStart(_: TransactionStartEvent) { + this.logger?.info(`BEFORE TRANSACTION STARTED`); } /** * Called after transaction start. */ - afterTransactionStart(event: TransactionStartEvent) { - this.logger.info(`AFTER TRANSACTION STARTED`); + afterTransactionStart(_: TransactionStartEvent) { + this.logger?.info(`AFTER TRANSACTION STARTED`); } /** * Called before transaction commit. */ - beforeTransactionCommit(event: TransactionCommitEvent) { - this.logger.info(`BEFORE TRANSACTION COMMITTED`); + beforeTransactionCommit(_: TransactionCommitEvent) { + this.logger?.info(`BEFORE TRANSACTION COMMITTED`); } /** * Called after transaction commit. */ - afterTransactionCommit(event: TransactionCommitEvent) { - this.logger.info(`AFTER TRANSACTION COMMITTED`); + afterTransactionCommit(_: TransactionCommitEvent) { + this.logger?.info(`AFTER TRANSACTION COMMITTED`); } /** * Called before transaction rollback. */ - beforeTransactionRollback(event: TransactionRollbackEvent) { - this.logger.info(`BEFORE TRANSACTION ROLLBACK`); + beforeTransactionRollback(_: TransactionRollbackEvent) { + this.logger?.info(`BEFORE TRANSACTION ROLLBACK`); } /** * Called after transaction rollback. */ - afterTransactionRollback(event: TransactionRollbackEvent) { - this.logger.info(`AFTER TRANSACTION ROLLBACK`); + afterTransactionRollback(_: TransactionRollbackEvent) { + this.logger?.info(`AFTER TRANSACTION ROLLBACK`); } } diff --git a/samples/sample-koa/src/persistence/listeners/UserEntityEventListener.ts b/samples/sample-koa/src/persistence/listeners/UserEntityEventListener.ts index 434e3488..777e9de2 100644 --- a/samples/sample-koa/src/persistence/listeners/UserEntityEventListener.ts +++ b/samples/sample-koa/src/persistence/listeners/UserEntityEventListener.ts @@ -14,10 +14,10 @@ import {GreetingService} from "../../services/greeting.service"; @EntityEventSubscriber() export class UserEntityEventListener implements EntitySubscriberInterface { @Inject() - private logger: Logger; + private logger?: Logger; @Inject() - private greetingService: GreetingService; + private greetingService?: GreetingService; /** * Indicates that this subscriber only listen to User events. @@ -30,11 +30,11 @@ export class UserEntityEventListener implements EntitySubscriberInterface * Called before user insertion. */ beforeInsert(event: InsertEvent) { - this.logger.info(`BEFORE USER INSERTED: `, event.entity); + this.logger?.info(`BEFORE USER INSERTED: `, event.entity); } afterInsert(event: InsertEvent): Promise | void { - this.logger.info(`AFTER USER INSERTED: `, event.entity); - this.greetingService.sayHello(event.entity); + this.logger?.info(`AFTER USER INSERTED: `, event.entity); + this.greetingService?.sayHello(event.entity); } } diff --git a/samples/sample-koa/src/services/users.service.ts b/samples/sample-koa/src/services/users.service.ts index bc546b63..666f291d 100644 --- a/samples/sample-koa/src/services/users.service.ts +++ b/samples/sample-koa/src/services/users.service.ts @@ -83,7 +83,7 @@ export class UserService { await Optional.of(user) .orElseThrow(() => new HttpError(409, "User doesn't exist")) - .runAsync(user => this.userRepository.delete({id: userId})); + .runAsync(() => this.userRepository.delete({id: userId})); throw new Error("Error after deleting that should rollback transaction"); } diff --git a/servers/express-server/jest.config.js b/servers/express-server/jest.config.js index ef8af537..84f52636 100644 --- a/servers/express-server/jest.config.js +++ b/servers/express-server/jest.config.js @@ -1,4 +1,3 @@ -/** @type {import('jest').Config} */ module.exports = { transform: { "^.+\\.(t|j)sx?$": "@swc/jest", diff --git a/servers/express-server/package.json b/servers/express-server/package.json index f9a47015..664a9b49 100644 --- a/servers/express-server/package.json +++ b/servers/express-server/package.json @@ -17,7 +17,7 @@ "access": "public" }, "main": "dist/index.js", - "types": "dist/index.d.ts", + "types": "src/index.ts", "scripts": { "build": "tsc -p tsconfig.build.json", "clean:build": "rimraf ./dist", diff --git a/servers/express-server/src/driver/ExpressDriver.ts b/servers/express-server/src/driver/ExpressDriver.ts index e42d19d6..f0bdef25 100644 --- a/servers/express-server/src/driver/ExpressDriver.ts +++ b/servers/express-server/src/driver/ExpressDriver.ts @@ -39,12 +39,6 @@ type ExpressServerOptions = { configs?: ExpressServerConfigs; express?: Application; }; - -type CookieOptions = { - secret?: string | string[]; - options?: CookieParseOptions; -}; - /** * Integration with express framework. */ @@ -196,7 +190,11 @@ export class ExpressDriver extends NodeBootDriver { // This causes a double execution on our side. // * Multiple routes match the request (e.g. GET /users/me matches both @All(/users/me) and @Get(/users/:id)). // The following middleware only starts an action processing if the request has not been processed before. - const routeGuard = function routeGuard(request: any, response: any, next: Function) { + const routeGuard = function routeGuard( + request: Request & {routingControllersStarted?: boolean}, + _: unknown, + next: Function, + ) { if (!request.routingControllersStarted) { request.routingControllersStarted = true; return next(); @@ -280,7 +278,7 @@ export class ExpressDriver extends NodeBootDriver { } // transform result if needed - result = this.transformResult(result, actionMetadata, action); + result = this.transformResult(result, actionMetadata); // set http status code if (result === undefined && actionMetadata.undefinedResultCode) { diff --git a/servers/fastify-server/jest.config.js b/servers/fastify-server/jest.config.js index ef8af537..84f52636 100644 --- a/servers/fastify-server/jest.config.js +++ b/servers/fastify-server/jest.config.js @@ -1,4 +1,3 @@ -/** @type {import('jest').Config} */ module.exports = { transform: { "^.+\\.(t|j)sx?$": "@swc/jest", diff --git a/servers/fastify-server/package.json b/servers/fastify-server/package.json index 66e016ce..08159ec7 100644 --- a/servers/fastify-server/package.json +++ b/servers/fastify-server/package.json @@ -16,7 +16,7 @@ "access": "public" }, "main": "dist/index.js", - "types": "dist/index.d.ts", + "types": "src/index.ts", "scripts": { "build": "tsc -p tsconfig.build.json", "clean:build": "rimraf ./dist", diff --git a/servers/fastify-server/src/driver/FastifyDriver.ts b/servers/fastify-server/src/driver/FastifyDriver.ts index 98412570..60c43029 100644 --- a/servers/fastify-server/src/driver/FastifyDriver.ts +++ b/servers/fastify-server/src/driver/FastifyDriver.ts @@ -165,7 +165,7 @@ export class FastifyDriver extends NodeBootDriver done()) + .then(() => done()) .catch((error: any) => { this.handleError(error, undefined, { request, diff --git a/servers/koa-server/jest.config.js b/servers/koa-server/jest.config.js index ef8af537..84f52636 100644 --- a/servers/koa-server/jest.config.js +++ b/servers/koa-server/jest.config.js @@ -1,4 +1,3 @@ -/** @type {import('jest').Config} */ module.exports = { transform: { "^.+\\.(t|j)sx?$": "@swc/jest", diff --git a/servers/koa-server/package.json b/servers/koa-server/package.json index 61f516ab..b66fe71a 100644 --- a/servers/koa-server/package.json +++ b/servers/koa-server/package.json @@ -16,7 +16,7 @@ "access": "public" }, "main": "dist/index.js", - "types": "dist/index.d.ts", + "types": "src/index.ts", "scripts": { "build": "tsc -p tsconfig.build.json", "clean:build": "rimraf ./dist", diff --git a/servers/koa-server/src/driver/KoaDriver.ts b/servers/koa-server/src/driver/KoaDriver.ts index 38b63307..4b800ff8 100644 --- a/servers/koa-server/src/driver/KoaDriver.ts +++ b/servers/koa-server/src/driver/KoaDriver.ts @@ -65,7 +65,7 @@ export class KoaDriver extends NodeBootDriver { () => this.logger.warn(`CORS is not configured`), ) .ifCookies( - options => this.app.use(parseCookie()), // always add all cookies to ctx.cookies + () => this.app.use(parseCookie()), // always add all cookies to ctx.cookies () => this.logger.warn(`Cookies is not configured`), ) .ifSession( @@ -265,7 +265,7 @@ export class KoaDriver extends NodeBootDriver { } // transform result if needed - result = this.transformResult(result, action, options); + result = this.transformResult(result, action); if (action.redirect) { // if redirect is set then do it diff --git a/starters/actuator/jest.config.js b/starters/actuator/jest.config.js index ef8af537..84f52636 100644 --- a/starters/actuator/jest.config.js +++ b/starters/actuator/jest.config.js @@ -1,4 +1,3 @@ -/** @type {import('jest').Config} */ module.exports = { transform: { "^.+\\.(t|j)sx?$": "@swc/jest", diff --git a/starters/actuator/package.json b/starters/actuator/package.json index 3b337ff2..43549eb2 100644 --- a/starters/actuator/package.json +++ b/starters/actuator/package.json @@ -16,7 +16,7 @@ "access": "public" }, "main": "dist/index.js", - "types": "dist/index.d.ts", + "types": "src/index.ts", "scripts": { "build": "tsc -p tsconfig.build.json", "clean:build": "rimraf ./dist", @@ -29,22 +29,23 @@ "typecheck": "tsc" }, "dependencies": { - "@node-boot/context": "1.0.0", "@node-boot/config": "1.0.0", + "@node-boot/context": "1.0.0", + "dayjs": "^1.11.9", "prom-client": "^14.2.0", - "properties-reader": "^2.3.0", - "dayjs": "^1.11.9" + "properties-reader": "^2.3.0" }, "peerDependencies": { "routing-controllers": ">=0.10.4" }, "optionalDependencies": { - "koa": ">=2.14.2", "@koa/router": ">=12.0.0", "express": ">=4.18.2", - "fastify": ">=4.21.0" + "fastify": ">=4.21.0", + "koa": ">=2.14.2" }, "devDependencies": { + "@types/express": "^4.17.21", "@types/koa": "^2.13.11", "@types/koa__router": "^12.0.4" } diff --git a/starters/actuator/src/adapter/DefaultActuatorAdapter.ts b/starters/actuator/src/adapter/DefaultActuatorAdapter.ts index 315042c0..2161753e 100644 --- a/starters/actuator/src/adapter/DefaultActuatorAdapter.ts +++ b/starters/actuator/src/adapter/DefaultActuatorAdapter.ts @@ -9,8 +9,6 @@ import {ConfigService} from "@node-boot/config"; import {KoaActuatorAdapter} from "./KoaActuatorAdapter"; export class DefaultActuatorAdapter implements ActuatorAdapter { - private metricsContext: MetricsContext; - constructor( private readonly register = new Prometheus.Registry(), private readonly infoService: InfoService = new InfoService(), @@ -43,7 +41,6 @@ export class DefaultActuatorAdapter implements ActuatorAdapter { http_request_duration_milliseconds, http_request_counter, }; - this.metricsContext = context; return context; } diff --git a/starters/actuator/src/adapter/ExpressActuatorAdapter.ts b/starters/actuator/src/adapter/ExpressActuatorAdapter.ts index 66ed3000..0dc4d617 100644 --- a/starters/actuator/src/adapter/ExpressActuatorAdapter.ts +++ b/starters/actuator/src/adapter/ExpressActuatorAdapter.ts @@ -1,10 +1,12 @@ import {ActuatorAdapter, ActuatorOptions} from "@node-boot/context"; -import express from "express"; +import {Router, Application, Response} from "express"; import {InfoService} from "../service/InfoService"; import {MetricsContext} from "../types"; import {MetadataService} from "../service/MetadataService"; import {ConfigService} from "@node-boot/config"; +type ResWithEpoch = Response & {locals: {startEpoch: number}}; + export class ExpressActuatorAdapter implements ActuatorAdapter { constructor( private readonly context: MetricsContext, @@ -13,8 +15,8 @@ export class ExpressActuatorAdapter implements ActuatorAdapter { private readonly configService?: ConfigService, ) {} - bind(options: ActuatorOptions, server: express.Application, router: express.Application): void { - router.use((req, res, next) => { + bind(_options: ActuatorOptions, _server: Application, router: Router): void { + router.use((req, res: ResWithEpoch, next) => { // Start a timer for every request made res.locals.startEpoch = Date.now(); @@ -22,7 +24,7 @@ export class ExpressActuatorAdapter implements ActuatorAdapter { const responseTimeInMilliseconds = Date.now() - res.locals.startEpoch; this.context.http_request_duration_milliseconds - .labels(req.method, req.path, res.statusCode) + .labels(req.method, req.path, res.statusCode.toString()) .observe(responseTimeInMilliseconds); }); @@ -37,40 +39,40 @@ export class ExpressActuatorAdapter implements ActuatorAdapter { next(); }); - router.get("/actuator", (req, res) => { + router.get("/actuator", (_, res) => { res.status(200).json(this.metadataService.getActuatorEndpoints()); }); - router.get("/actuator/info", (req, res) => { + router.get("/actuator/info", (_, res) => { this.infoService.getInfo().then(data => res.status(200).json(data)); }); - router.get("/actuator/config", (req, res) => { + router.get("/actuator/config", (_, res) => { res.status(200).json(this.configService?.get() ?? {}); }); - router.get("/actuator/memory", (req, res) => { + router.get("/actuator/memory", (_, res) => { this.infoService.getMemory().then(data => res.status(200).json(data)); }); - router.get("/actuator/metrics", (req, res) => { + router.get("/actuator/metrics", (_, res) => { this.context.register.getMetricsAsJSON().then(data => res.status(200).json(data)); }); - router.get("/actuator/prometheus", (req, res) => { + router.get("/actuator/prometheus", (_, res) => { res.setHeader("Content-Type", this.context.register.contentType); this.context.register.metrics().then(data => res.status(200).send(data)); }); - router.get("/actuator/controllers", (req, res) => { + router.get("/actuator/controllers", (_, res) => { res.status(200).json(this.metadataService.getControllers()); }); - router.get("/actuator/interceptors", (req, res) => { + router.get("/actuator/interceptors", (_, res) => { res.status(200).json(this.metadataService.getInterceptors()); }); - router.get("/actuator/middlewares", (req, res) => { + router.get("/actuator/middlewares", (_, res) => { res.status(200).json(this.metadataService.getMiddlewares()); }); } diff --git a/starters/actuator/src/adapter/FastifyActuatorAdapter.ts b/starters/actuator/src/adapter/FastifyActuatorAdapter.ts index bad5d903..3e317905 100644 --- a/starters/actuator/src/adapter/FastifyActuatorAdapter.ts +++ b/starters/actuator/src/adapter/FastifyActuatorAdapter.ts @@ -13,8 +13,8 @@ export class FastifyActuatorAdapter implements ActuatorAdapter { private readonly configService?: ConfigService, ) {} - bind(options: ActuatorOptions, server: FastifyInstance, router: FastifyInstance): void { - router.addHook("onRequest", (request, reply, done) => { + bind(_: ActuatorOptions, _instance: FastifyInstance, router: FastifyInstance): void { + router.addHook("onRequest", (request, _reply, done) => { // Start a timer for every request made request.log.info({event: "onRequest"}, "Request received"); request["locals"].startEpoch = Date.now(); @@ -46,38 +46,38 @@ export class FastifyActuatorAdapter implements ActuatorAdapter { done(); }); - router.get("/actuator", (req, res) => { + router.get("/actuator", (_, res) => { res.status(200); res.send(this.metadataService.getActuatorEndpoints()); }); - router.get("/actuator/info", (req, res) => { + router.get("/actuator/info", (_, res) => { this.infoService.getInfo().then(data => { res.status(200); res.send(data); }); }); - router.get("/actuator/config", (req, res) => { + router.get("/actuator/config", (_, res) => { res.status(200); res.send(this.configService?.get() ?? {}); }); - router.get("/actuator/memory", (req, res) => { + router.get("/actuator/memory", (_, res) => { this.infoService.getMemory().then(data => { res.status(200); res.send(data); }); }); - router.get("/actuator/metrics", (req, res) => { + router.get("/actuator/metrics", (_, res) => { this.context.register.getMetricsAsJSON().then(data => { res.status(200); res.send(data); }); }); - router.get("/actuator/prometheus", (req, res) => { + router.get("/actuator/prometheus", (_, res) => { res.type(this.context.register.contentType); this.context.register.metrics().then(data => { res.status(200); @@ -85,17 +85,17 @@ export class FastifyActuatorAdapter implements ActuatorAdapter { }); }); - router.get("/actuator/controllers", (req, res) => { + router.get("/actuator/controllers", (_, res) => { res.status(200); res.send(this.metadataService.getControllers()); }); - router.get("/actuator/interceptors", (req, res) => { + router.get("/actuator/interceptors", (_, res) => { res.status(200); res.send(this.metadataService.getInterceptors()); }); - router.get("/actuator/middlewares", (req, res) => { + router.get("/actuator/middlewares", (_, res) => { res.status(200); res.send(this.metadataService.getMiddlewares()); }); diff --git a/starters/actuator/src/adapter/KoaActuatorAdapter.ts b/starters/actuator/src/adapter/KoaActuatorAdapter.ts index 45d4ffb5..8ff0817a 100644 --- a/starters/actuator/src/adapter/KoaActuatorAdapter.ts +++ b/starters/actuator/src/adapter/KoaActuatorAdapter.ts @@ -14,7 +14,7 @@ export class KoaActuatorAdapter implements ActuatorAdapter { private readonly configService?: ConfigService, ) {} - bind(options: ActuatorOptions, server: Koa, router: Router): void { + bind(_options: ActuatorOptions, _server: Koa, router: Router): void { router.use(async (ctx, next) => { // Start a timer for every request made // Start a timer for every request made diff --git a/starters/actuator/src/decorator/EnableActuator.ts b/starters/actuator/src/decorator/EnableActuator.ts index 1abf8f36..d2c70567 100644 --- a/starters/actuator/src/decorator/EnableActuator.ts +++ b/starters/actuator/src/decorator/EnableActuator.ts @@ -2,7 +2,7 @@ import {ApplicationContext} from "@node-boot/context"; import {DefaultActuatorAdapter} from "../adapter"; export function EnableActuator(): Function { - return function (object: Function) { + return function () { ApplicationContext.get().actuatorAdapter = new DefaultActuatorAdapter(); }; } diff --git a/starters/persistence/jest.config.js b/starters/persistence/jest.config.js index ef8af537..84f52636 100644 --- a/starters/persistence/jest.config.js +++ b/starters/persistence/jest.config.js @@ -1,4 +1,3 @@ -/** @type {import('jest').Config} */ module.exports = { transform: { "^.+\\.(t|j)sx?$": "@swc/jest", diff --git a/starters/persistence/package.json b/starters/persistence/package.json index 5d0b3576..a5ca40c1 100644 --- a/starters/persistence/package.json +++ b/starters/persistence/package.json @@ -16,7 +16,7 @@ "access": "public" }, "main": "dist/index.js", - "types": "dist/index.d.ts", + "types": "src/index.ts", "scripts": { "build": "tsc -p tsconfig.build.json", "clean:build": "rimraf ./dist", diff --git a/starters/persistence/src/adapter/PersistenceLogger.ts b/starters/persistence/src/adapter/PersistenceLogger.ts index f819da26..e1cb390d 100644 --- a/starters/persistence/src/adapter/PersistenceLogger.ts +++ b/starters/persistence/src/adapter/PersistenceLogger.ts @@ -1,5 +1,4 @@ import {AbstractLogger, LogLevel, LogMessage} from "typeorm"; -import {QueryRunner} from "typeorm/query-runner/QueryRunner"; import {Logger} from "winston"; export class PersistenceLogger extends AbstractLogger { @@ -10,7 +9,7 @@ export class PersistenceLogger extends AbstractLogger { /** * Write log to specific output. */ - protected writeLog(level: LogLevel, logMessage: LogMessage | LogMessage[], queryRunner?: QueryRunner) { + protected writeLog(level: LogLevel, logMessage: LogMessage | LogMessage[]) { const messages = this.prepareLogMessages(logMessage, { highlightSql: false, }); diff --git a/starters/persistence/src/config/PersistenceConfiguration.ts b/starters/persistence/src/config/PersistenceConfiguration.ts index 89e00f73..11b05e17 100644 --- a/starters/persistence/src/config/PersistenceConfiguration.ts +++ b/starters/persistence/src/config/PersistenceConfiguration.ts @@ -33,7 +33,7 @@ export class PersistenceConfiguration { * @return dataSource (DataSource): The configured and initialized DataSource object for the persistence layer. * */ @Bean() - public dataSource({iocContainer, logger, config}: BeansContext): DataSource { + public dataSource({iocContainer, logger}: BeansContext): DataSource { logger.info("Configuring persistence DataSource"); const datasourceConfig = iocContainer.get("datasource-config") as DataSourceOptions; @@ -112,7 +112,7 @@ export class PersistenceConfiguration { for (const fieldToInject of Reflect.getMetadata(REQUIRES_FIELD_INJECTION_KEY, subscriber) || []) { // Extract type metadata for field injection. This is useful for custom injection in some modules const propertyType = Reflect.getMetadata("design:type", subscriber, fieldToInject); - subscriber[fieldToInject] = iocContainer.get(propertyType); + subscriber[fieldToInject as never] = iocContainer.get(propertyType) as never; } } logger.info(`${subscribers.length} persistence event subscribers successfully injected`); diff --git a/starters/persistence/src/decorator/DatasourceConfiguration.ts b/starters/persistence/src/decorator/DatasourceConfiguration.ts index 800de320..84029f4b 100644 --- a/starters/persistence/src/decorator/DatasourceConfiguration.ts +++ b/starters/persistence/src/decorator/DatasourceConfiguration.ts @@ -2,7 +2,7 @@ import {PersistenceContext} from "../PersistenceContext"; import {NodeBootDataSourceOptions} from "../property/NodeBootDataSourceOptions"; export function DatasourceConfiguration(options: NodeBootDataSourceOptions): ClassDecorator { - return (target: Function) => { + return () => { PersistenceContext.get().databaseConnectionOverrides = options; }; } diff --git a/starters/persistence/src/decorator/EnableRepositories.ts b/starters/persistence/src/decorator/EnableRepositories.ts index fabc96a2..f7dceee8 100644 --- a/starters/persistence/src/decorator/EnableRepositories.ts +++ b/starters/persistence/src/decorator/EnableRepositories.ts @@ -5,7 +5,7 @@ import {TransactionConfiguration} from "../config/TransactionConfiguration"; import {QueryCacheConfiguration} from "../config/QueryCacheConfiguration"; export const EnableRepositories = (): ClassDecorator => { - return (target: Function) => { + return () => { // Register repositories adapter ApplicationContext.get().repositoriesAdapter = new DefaultRepositoriesAdapter(); diff --git a/tsconfig.base.json b/tsconfig.base.json index cf501e54..24b3def6 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -1,32 +1,26 @@ { - "extends": "@tsconfig/node-lts-strictest/tsconfig.json", - "compilerOptions": { - /* Basic Options */ - "incremental": true, - "declaration": true, - "allowJs": true, - "noEmit": true, - "strict": true, + "extends": "@tsconfig/node-lts-strictest/tsconfig.json", + "compilerOptions": { + /* Basic Options */ + "incremental": true, + "declaration": true, + "allowJs": true, + "noEmit": true, + "strict": true, - /* Strict Type-Checking Options */ - "noImplicitAny": false, - "strictNullChecks": true, - "strictFunctionTypes": true, - "strictBindCallApply": true, - "strictPropertyInitialization": false, - "noImplicitThis": true, - "alwaysStrict": true, - "resolveJsonModule": true, - "preserveValueImports": false, - "importsNotUsedAsValues": "remove", - "skipLibCheck": true, - "exactOptionalPropertyTypes": false, - "noUnusedParameters": false, - "noUnusedLocals": false, - "esModuleInterop": true, - - /* Experimental Options */ - "experimentalDecorators": true, - "emitDecoratorMetadata": true - } + "strictPropertyInitialization": false, + /* Strict Type-Checking Options */ + "noImplicitThis": true, + "alwaysStrict": true, + "resolveJsonModule": true, + "preserveValueImports": false, + "importsNotUsedAsValues": "remove", + "skipLibCheck": true, + "exactOptionalPropertyTypes": false, + "esModuleInterop": true, + "noImplicitAny": false, + /* Experimental Options */ + "experimentalDecorators": true, + "emitDecoratorMetadata": true + } }