diff --git a/package-lock.json b/package-lock.json index 6cfcb7f..a8181f3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,15 +1,15 @@ { "name": "api-machine", - "version": "1.0.0", + "version": "1.0.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "api-machine", - "version": "1.0.0", + "version": "1.0.1", "license": "MIT", "dependencies": { - "auto-oas": "^1.2.0", + "auto-oas": "^1.2.1", "cors": "^2.8.5", "express": "^5.1.0", "swagger-ui-express": "^5.0.1", @@ -1649,9 +1649,9 @@ } }, "node_modules/auto-oas": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/auto-oas/-/auto-oas-1.2.0.tgz", - "integrity": "sha512-WWn5Zv2Ebo9NJTlKnExnBF7O/bK2jhZTnp4VnMnZ4E4o7Wyv7uhvbuWDhbbkeo9h456pkfWkeRrG5D2x6Xk/ig==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/auto-oas/-/auto-oas-1.2.1.tgz", + "integrity": "sha512-eqfKTC60L4UHebdpX8uF5zDjVkrblpUGX01O8PW7IjUSdtFRvnZ354bBW/9dE7SAKeYzj/cOZlJCN+Emea8siw==", "license": "MIT", "dependencies": { "valsan": "^2.1.0" diff --git a/package.json b/package.json index dfe6e0a..7002941 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "api-machine", - "version": "1.0.0", + "version": "1.0.1", "description": "api-machine", "private": "true", "typescript-template": { @@ -22,7 +22,7 @@ "publish": "npm run script -- publish" }, "dependencies": { - "auto-oas": "^1.2.0", + "auto-oas": "^1.2.1", "cors": "^2.8.5", "express": "^5.1.0", "swagger-ui-express": "^5.0.1", diff --git a/src/error/http-errors/http-error.ts b/src/error/http-errors/http-error.ts index efe7703..7d5cdcb 100644 --- a/src/error/http-errors/http-error.ts +++ b/src/error/http-errors/http-error.ts @@ -5,6 +5,7 @@ import { HttpErrorOptions } from '../error-options'; * All HTTP errors extend from this class */ export abstract class HTTPError extends Error { + public isApiMachineError = true; public readonly options: HttpErrorOptions = {}; public readonly timestamp = new Date().toISOString(); diff --git a/src/oas/oas-rest-server-converter.ts b/src/oas/oas-rest-server-converter.ts index edac932..2d282b4 100644 --- a/src/oas/oas-rest-server-converter.ts +++ b/src/oas/oas-rest-server-converter.ts @@ -59,11 +59,11 @@ export class OasRestServerConverter { public async convertRouter(router: BaseApiRouter) { for (const route of router.registeredRoutes) { - if (route instanceof BaseApiEndpoint) { - await this.convertEndpoint(route); + if (route.routeType === 'endpoint') { + await this.convertEndpoint(route as BaseApiEndpoint); } - else if (route instanceof BaseApiRouter) { - await this.convertRouter(route); + else if (route.routeType === 'router') { + await this.convertRouter(route as BaseApiRouter); } } } diff --git a/src/router/base.ts b/src/router/base.ts index bf37b81..3d04d04 100644 --- a/src/router/base.ts +++ b/src/router/base.ts @@ -6,6 +6,7 @@ export abstract class BaseApiRoute { public fullPath: string; public name: string; public description?: string; + public routeType: 'router' | 'endpoint'; /** * Optional array of Express middleware to apply diff --git a/src/router/endpoint.ts b/src/router/endpoint.ts index 1c14627..400925e 100644 --- a/src/router/endpoint.ts +++ b/src/router/endpoint.ts @@ -27,6 +27,7 @@ export enum EndpointMethod { } export abstract class BaseApiEndpoint extends BaseApiRoute { + override routeType = 'endpoint' as const; override path = ''; public tag?: string; public method: EndpointMethod = EndpointMethod.GET; diff --git a/src/router/router.ts b/src/router/router.ts index 8a398ae..ef9bfdd 100644 --- a/src/router/router.ts +++ b/src/router/router.ts @@ -3,6 +3,7 @@ import { ApiRoute, BaseApiRoute } from './base'; import { BaseApiEndpoint, EndpointMethod } from './endpoint'; export abstract class BaseApiRouter extends BaseApiRoute { + override routeType = 'router' as const; protected router: ExpressRouter; public registeredRoutes: BaseApiRoute[] = []; @@ -45,8 +46,8 @@ export abstract class BaseApiRouter extends BaseApiRoute { // Set parent relationship for authentication cascading instance.parentRoute = this; - if (instance instanceof BaseApiEndpoint) { - instance.tag = tag; + if (instance.routeType === 'endpoint') { + (instance as BaseApiEndpoint).tag = tag; } await instance.register(this.router, this.fullPath); @@ -54,14 +55,16 @@ export abstract class BaseApiRouter extends BaseApiRoute { this.registeredRoutes.push(instance); // Track endpoint methods for 405 handling - if (instance instanceof BaseApiEndpoint) { + if (instance.routeType === 'endpoint') { const path = instance.path; if (!pathMethods.has(path)) { pathMethods.set(path, new Set()); } - pathMethods.get(path)!.add(instance.method); + pathMethods + .get(path)! + .add((instance as BaseApiEndpoint).method); } } diff --git a/src/server/server.ts b/src/server/server.ts index ff8dc49..c591592 100644 --- a/src/server/server.ts +++ b/src/server/server.ts @@ -174,15 +174,17 @@ export abstract class RestServer { next: express.NextFunction ) => { // Handle HTTPError instances - if (error instanceof HTTPError) { + if ((error as HTTPError).isApiMachineError) { // Set custom headers if provided - Object.entries(error.headers).forEach(([key, value]) => { - response.setHeader(key, value); - }); + Object.entries((error as HTTPError).headers).forEach( + ([key, value]) => { + response.setHeader(key, value); + } + ); return response - .status(error.getStatusCode()) - .json(error.getResponseJson()); + .status((error as HTTPError).getStatusCode()) + .json((error as HTTPError).getResponseJson()); } if (