From 32384bb3d876a39c8eab32f4c9e0a266731b27c5 Mon Sep 17 00:00:00 2001 From: Romain Lenzotti Date: Wed, 3 Jan 2024 09:31:11 +0100 Subject: [PATCH] refactor(common): refactoring PlatformBuilder fo Fastify --- .../src/utils/http/getHostInfoFromPort.ts | 2 + packages/platform/common/jest.config.js | 4 +- .../common/src/builder/PlatformBuilder.ts | 86 +++++---- .../common/src/services/PlatformAdapter.ts | 24 +-- .../common/src/utils/createHttpServer.spec.ts | 2 +- .../src/utils/createHttpsServer.spec.ts | 2 +- .../platform/common/src/utils/createServer.ts | 22 ++- .../platform/common/src/utils/listenServer.ts | 22 +-- .../platform/platform-express/jest.config.js | 4 +- .../src/components/PlatformExpress.ts | 2 - .../src/components/PlatformKoa.ts | 2 - tsdoc.config.js | 2 +- yarn.lock | 163 ------------------ 13 files changed, 91 insertions(+), 246 deletions(-) diff --git a/packages/core/src/utils/http/getHostInfoFromPort.ts b/packages/core/src/utils/http/getHostInfoFromPort.ts index 6797c9c6fed..32e6bb98fc8 100644 --- a/packages/core/src/utils/http/getHostInfoFromPort.ts +++ b/packages/core/src/utils/http/getHostInfoFromPort.ts @@ -16,3 +16,5 @@ export function getHostInfoFromPort(protocol: string, addressPort: any) { } }; } + +export type ReturnHostInfoFromPort = ReturnType; diff --git a/packages/platform/common/jest.config.js b/packages/platform/common/jest.config.js index fa5f9c90224..93ead14d678 100644 --- a/packages/platform/common/jest.config.js +++ b/packages/platform/common/jest.config.js @@ -10,8 +10,8 @@ module.exports = { coverageThreshold: { global: { statements: 98.3, - branches: 91.71, - functions: 95.8, + branches: 91.52, + functions: 95.78, lines: 98.3 } } diff --git a/packages/platform/common/src/builder/PlatformBuilder.ts b/packages/platform/common/src/builder/PlatformBuilder.ts index b136824871b..20b7796eed2 100644 --- a/packages/platform/common/src/builder/PlatformBuilder.ts +++ b/packages/platform/common/src/builder/PlatformBuilder.ts @@ -49,12 +49,12 @@ export class PlatformBuilder { settings: configuration }); + this.log(`Loading ${adapterKlass.NAME.toUpperCase()} platform adapter...`); + this.#adapter = this.#injector.get>(PlatformAdapter)!; this.createHttpServers(); - this.#adapter.onInit(); - this.log("Injector created..."); } @@ -178,15 +178,56 @@ export class PlatformBuilder { } public async runLifecycle() { + // init adapter (Express, Koa, etc...) + await this.#adapter.onInit(); + setLoggerConfiguration(this.injector); + // create the middleware mapping to be executed to the expected hook await this.mapTokenMiddlewares(); await this.loadInjector(); + // add the context middleware to the application + this.log("Mount app context"); this.#adapter.useContext(); - await this.loadRoutes(); + // init routes (controllers, middlewares, etc...) + this.log("Load routes"); + await this.#adapter.beforeLoadRoutes(); + + // istanbul ignore next + if (this.settings.get("logger.level") !== "off") { + const {PlatformLogMiddleware} = await import("@tsed/platform-log-middleware"); + this.app.use(PlatformLogMiddleware); + } + + if (this.rootModule.$beforeRoutesInit) { + await this.rootModule.$beforeRoutesInit(); + // remove method to avoid multiple call and preserve hook order + this.rootModule.$beforeRoutesInit = () => {}; + } + + // Hooks execution (adding middlewares, controllers, services, etc...) + await this.loadStatics("$beforeRoutesInit"); + await this.callHook("$beforeRoutesInit"); + + const routes = this.injector.settings.get("routes"); + + this.platform.addRoutes(routes); + + await this.callHook("$onRoutesInit"); + + await this.loadStatics("$afterRoutesInit"); + await this.callHook("$afterRoutesInit"); + + await this.#adapter.afterLoadRoutes(); + + // map routers are loaded after all hooks because it contains all added middlewares/controllers in the virtual Ts.ED layers + // This step will convert all Ts.ED layers to the platform layer (Express or Koa) + await this.mapRouters(); + + // Server is bootstrapped and ready to listen return this; } @@ -270,40 +311,6 @@ export class PlatformBuilder { return this.#promise; } - protected async loadRoutes() { - await this.#adapter.beforeLoadRoutes(); - - // istanbul ignore next - if (this.settings.get("logger.level") !== "off") { - const {PlatformLogMiddleware} = await import("@tsed/platform-log-middleware"); - this.app.use(PlatformLogMiddleware); - } - - this.log("Load routes"); - - if (this.rootModule.$beforeRoutesInit) { - await this.rootModule.$beforeRoutesInit(); - this.rootModule.$beforeRoutesInit = () => {}; - } - - await this.loadStatics("$beforeRoutesInit"); - await this.callHook("$beforeRoutesInit"); - - const routes = this.injector.settings.get("routes"); - - this.platform.addRoutes(routes); - - await this.callHook("$onRoutesInit"); - - await this.loadStatics("$afterRoutesInit"); - - await this.callHook("$afterRoutesInit"); - - await this.#adapter.afterLoadRoutes(); - - await this.mapRouters(); - } - protected mapRouters() { const layers = this.platform.getLayers(); @@ -412,6 +419,9 @@ export class PlatformBuilder { middlewares = await Promise.all(promises); - this.injector.settings.set("middlewares", middlewares); + this.injector.settings.set( + "middlewares", + middlewares.filter((middleware) => middleware.use) + ); } } diff --git a/packages/platform/common/src/services/PlatformAdapter.ts b/packages/platform/common/src/services/PlatformAdapter.ts index 647b97532fb..1379d95f322 100644 --- a/packages/platform/common/src/services/PlatformAdapter.ts +++ b/packages/platform/common/src/services/PlatformAdapter.ts @@ -23,16 +23,21 @@ export abstract class PlatformAdapter { return this.injector.get>("PlatformApplication")!; } - /** - * Called after the injector instantiation - */ - onInit(): any {} + getServers(): CreateServerReturn[] { + return [createHttpServer(this.injector, this.app.callback()), createHttpsServer(this.injector, this.app.callback())].filter( + Boolean + ) as any[]; + } + + onInit(): Promise | void { + return Promise.resolve(); + } - beforeLoadRoutes(): Promise { + beforeLoadRoutes(): Promise | void { return Promise.resolve(); } - afterLoadRoutes(): Promise { + afterLoadRoutes(): Promise | void { return Promise.resolve(); } @@ -51,12 +56,6 @@ export abstract class PlatformAdapter { */ abstract mapHandler(handler: Function, layer: PlatformHandlerMetadata): Function; - getServers(): CreateServerReturn[] { - return [createHttpServer(this.injector, this.app.callback()), createHttpsServer(this.injector, this.app.callback())].filter( - Boolean - ) as any[]; - } - /** * Return the app instance */ @@ -89,6 +88,7 @@ export interface PlatformBuilderSettings extends Partial export class FakeAdapter extends PlatformAdapter { providers: ProviderOpts[] = []; + static readonly NAME: string = "FAKE_ADAPTER"; static createFakeRawDriver() { // istanbul ignore next diff --git a/packages/platform/common/src/utils/createHttpServer.spec.ts b/packages/platform/common/src/utils/createHttpServer.spec.ts index 6fd71f3e5a9..d86cfb28916 100644 --- a/packages/platform/common/src/utils/createHttpServer.spec.ts +++ b/packages/platform/common/src/utils/createHttpServer.spec.ts @@ -21,7 +21,7 @@ describe("createHttpServer", () => { jest.spyOn(injector.logger, "info").mockReturnValue(undefined); jest.spyOn(injector.logger, "debug").mockReturnValue(undefined); jest.spyOn(server, "listen").mockReturnValue(undefined); - jest.spyOn(server, "address").mockReturnValue({port: 8089}); + jest.spyOn(server, "address").mockReturnValue({port: 8089, address: "0.0.0.0"}); jest.spyOn(server, "on").mockImplementation((event: string, cb: any) => { if (event === "listening") { cb(); diff --git a/packages/platform/common/src/utils/createHttpsServer.spec.ts b/packages/platform/common/src/utils/createHttpsServer.spec.ts index 6ea3bd12997..ee4dc44ea72 100644 --- a/packages/platform/common/src/utils/createHttpsServer.spec.ts +++ b/packages/platform/common/src/utils/createHttpsServer.spec.ts @@ -20,7 +20,7 @@ describe("createHttpsServer", () => { jest.spyOn(injector.logger, "info").mockReturnValue(undefined); jest.spyOn(injector.logger, "debug").mockReturnValue(undefined); jest.spyOn(server, "listen").mockReturnValue(undefined); - jest.spyOn(server, "address").mockReturnValue({port: 8089}); + jest.spyOn(server, "address").mockReturnValue({port: 8089, address: "0.0.0.0"}); jest.spyOn(server, "on").mockImplementation((event: string, cb: any) => { if (event === "listening") { cb(); diff --git a/packages/platform/common/src/utils/createServer.ts b/packages/platform/common/src/utils/createServer.ts index 8c807c51d6e..4349571306f 100644 --- a/packages/platform/common/src/utils/createServer.ts +++ b/packages/platform/common/src/utils/createServer.ts @@ -1,4 +1,4 @@ -import {getHostInfoFromPort} from "@tsed/core"; +import {getHostInfoFromPort, ReturnHostInfoFromPort} from "@tsed/core"; import {InjectorService, ProviderScope, TokenProvider} from "@tsed/di"; import Http from "http"; import Http2 from "http2"; @@ -9,6 +9,7 @@ export interface CreateServerOptions { token: TokenProvider; type: "http" | "https"; port: string | false; + listen?: (hostInfo: ReturnHostInfoFromPort) => Promise; server: () => Http.Server | Https.Server | Http2.Http2Server; } @@ -16,7 +17,7 @@ export type CreateServerReturn = () => Promise { - const resolvedHostInfo = await listenServer(injector, server, hostInfo); - settings.set(`${type}Port`, `${resolvedHostInfo.address}:${resolvedHostInfo.port}`); + const url = `${hostInfo.protocol}://${hostInfo.address}:${port}`; + injector.logger.debug(`Start server on ${url}`); + + await (listen ? listen(hostInfo) : listenServer(server, hostInfo)); + + const address = server.address(); + + if (address && typeof address !== "string") { + hostInfo.address = address.address; + hostInfo.port = address.port; + } + + injector.logger.info(`Listen server on ${hostInfo.toString()}`); + settings.set(`${type}Port`, `${hostInfo.address}:${hostInfo.port}`); + return server; }; } diff --git a/packages/platform/common/src/utils/listenServer.ts b/packages/platform/common/src/utils/listenServer.ts index 443b31d283a..41603e43710 100644 --- a/packages/platform/common/src/utils/listenServer.ts +++ b/packages/platform/common/src/utils/listenServer.ts @@ -1,28 +1,14 @@ +import {getHostInfoFromPort} from "@tsed/core"; import type Http from "http"; -import type Https from "https"; import type Http2 from "http2"; -import {InjectorService} from "@tsed/di"; -import {getHostInfoFromPort} from "@tsed/core"; +import type Https from "https"; -export function listenServer( - injector: InjectorService, - server: Http.Server | Https.Server | Http2.Http2Server, - hostInfo: ReturnType -): Promise> { - const {protocol, address, port} = hostInfo; - const url = `${protocol}://${address}:${port}`; - injector.logger.debug(`Start server on ${url}`); +export function listenServer(server: Http.Server | Https.Server | Http2.Http2Server, hostInfo: ReturnType) { + const {address, port} = hostInfo; const promise = new Promise((resolve, reject) => { server.on("listening", resolve); server.on("error", reject); - }).then(() => { - const port = (server.address() as any).port; - const info = {...hostInfo, port}; - - injector.logger.info(`Listen server on ${info.toString()}`); - - return info; }); server.listen(port, address as any); diff --git a/packages/platform/platform-express/jest.config.js b/packages/platform/platform-express/jest.config.js index d0f3f18668b..d881a036e27 100644 --- a/packages/platform/platform-express/jest.config.js +++ b/packages/platform/platform-express/jest.config.js @@ -9,10 +9,10 @@ module.exports = { }, coverageThreshold: { global: { - statements: 98.27, + statements: 98.26, branches: 92.45, functions: 100, - lines: 98.27 + lines: 98.26 } } }; diff --git a/packages/platform/platform-express/src/components/PlatformExpress.ts b/packages/platform/platform-express/src/components/PlatformExpress.ts index afc55aaaf9b..cc36713f19b 100644 --- a/packages/platform/platform-express/src/components/PlatformExpress.ts +++ b/packages/platform/platform-express/src/components/PlatformExpress.ts @@ -159,8 +159,6 @@ export class PlatformExpress extends PlatformAdapter { const {app} = this; const invoke = createContext(this.injector); - this.injector.logger.debug("Mount app context"); - app.use(async (request: any, response: any, next: any) => { const $ctx = invoke({request, response}); await $ctx.start(); diff --git a/packages/platform/platform-koa/src/components/PlatformKoa.ts b/packages/platform/platform-koa/src/components/PlatformKoa.ts index 09d9ba5b1f8..8d57393f361 100644 --- a/packages/platform/platform-koa/src/components/PlatformKoa.ts +++ b/packages/platform/platform-koa/src/components/PlatformKoa.ts @@ -138,8 +138,6 @@ export class PlatformKoa extends PlatformAdapter { const invoke = createContext(this.injector); const platformExceptions = this.injector.get(PlatformExceptions); - this.injector.logger.debug("Mount app context"); - app.use((koaContext: Context, next: Next) => { const $ctx = invoke({ request: koaContext.request as any, diff --git a/tsdoc.config.js b/tsdoc.config.js index 076ca41bf74..c57e4779ca1 100644 --- a/tsdoc.config.js +++ b/tsdoc.config.js @@ -43,7 +43,7 @@ module.exports = { "!/packages/platform/platform-test-sdk", "!**/node_modules" ], - outputDir: "/docs/api", + outputDir: "/docs-references/api", baseUrl: "/api", jsonOutputDir: "/docs/.vuepress/public", scope: "@tsed", diff --git a/yarn.lock b/yarn.lock index e6cce0e26a6..bb254df6a9c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5621,70 +5621,6 @@ resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.2.tgz#423c77877d0569db20e1fc80885ac4118314010e" integrity sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA== -"@tsed/common@7.54.0": - version "7.54.0" - resolved "https://registry.yarnpkg.com/@tsed/common/-/common-7.54.0.tgz#7a47aa6b0e723cc125a9b39240f1858f4f2ed1f5" - integrity sha512-omlMjJwYyRbP0D4FkIvEymtsf9Kd0x7QpOnP+q8gk045dV9l9t/Y+dNwPZjjUclpg3YWr72MA5V4XnDXlYqykg== - dependencies: - "@tsed/core" "7.54.0" - "@tsed/di" "7.54.0" - "@tsed/exceptions" "7.54.0" - "@tsed/json-mapper" "7.54.0" - "@tsed/logger" ">=6.2.2" - "@tsed/logger-file" ">=6.2.2" - "@tsed/platform-exceptions" "7.54.0" - "@tsed/platform-log-middleware" "7.54.0" - "@tsed/platform-middlewares" "7.54.0" - "@tsed/platform-params" "7.54.0" - "@tsed/platform-response-filter" "7.54.0" - "@tsed/platform-router" "7.54.0" - "@tsed/platform-views" "7.54.0" - "@tsed/schema" "7.54.0" - "@types/json-schema" "7.0.11" - accepts "^1.3.8" - tslib "2.5.0" - uuid "8.3.2" - -"@tsed/core@7.54.0": - version "7.54.0" - resolved "https://registry.yarnpkg.com/@tsed/core/-/core-7.54.0.tgz#fbca119a366770d883cf3bff5a20073f57ed03e8" - integrity sha512-xi1/i/5WKl+fPAa1msudpaL1VJZiOtxuPkGD110RDX+fa7a932hpHc5wDqqXJphE2sC2XaqpVhFHOrMdMmBuoA== - dependencies: - reflect-metadata "^0.1.13" - tslib "2.5.0" - -"@tsed/di@7.54.0": - version "7.54.0" - resolved "https://registry.yarnpkg.com/@tsed/di/-/di-7.54.0.tgz#14afc65c1f481afb399864ecf18b5e265f9a2200" - integrity sha512-9mqaiE4x2rF0hU6TDXozEgkoAndRehcmuIuM2fB9aDUH6F+B64PuCs16uSmJOTgUOt/1GaRVF43K2MVedh4Xlw== - dependencies: - tslib "2.5.0" - -"@tsed/engines@7.54.0": - version "7.54.0" - resolved "https://registry.yarnpkg.com/@tsed/engines/-/engines-7.54.0.tgz#f5f21bbbe288136fb10c0341867b80851d81d762" - integrity sha512-DKNQQicNcTG5tq1/axi8WTBDKEGhxQE59aV0UGKctWWlj0URspDB3mqw6kcmibLfVbCVU2CFnKzFW15kKyBwiQ== - dependencies: - filedirname "^2.7.0" - fs-extra "11.1.1" - tslib "2.5.0" - -"@tsed/exceptions@7.54.0": - version "7.54.0" - resolved "https://registry.yarnpkg.com/@tsed/exceptions/-/exceptions-7.54.0.tgz#d1e800595ebb941080a676a2716e4afbc02e030b" - integrity sha512-D912jZEe+l+7AdEsONpEYJTcWPShUhV5dC3R6ivjfByJ4SG/p6YUsdfAHaLOrGpT3XXqCKS4Td9Td+FpF407kw== - dependencies: - change-case "4.1.2" - statuses ">=2.0.1" - tslib "2.5.0" - -"@tsed/json-mapper@7.54.0": - version "7.54.0" - resolved "https://registry.yarnpkg.com/@tsed/json-mapper/-/json-mapper-7.54.0.tgz#aad683fbf6412fd3f3b8d627a9f5243a96d88f14" - integrity sha512-l1Y6jghpYNVcCEtVVysJ8LKDRsr2b/YAdg1G3u7S66hse8cTXwU7E3WfiWRZnv0qyCZ6gHSuCNWevlPT7D3ufQ== - dependencies: - tslib "2.5.0" - "@tsed/logger-file@>=6.2.2": version "6.2.2" resolved "https://registry.yarnpkg.com/@tsed/logger-file/-/logger-file-6.2.2.tgz#ffd1f9ab1a0e09160433676976c370a0800ba674" @@ -5724,105 +5660,6 @@ normalize-path "3.0.0" semver "7.3.7" -"@tsed/normalize-path@7.54.0": - version "7.54.0" - resolved "https://registry.yarnpkg.com/@tsed/normalize-path/-/normalize-path-7.54.0.tgz#c00684706d38859aaf910c3ed64f1461f373e689" - integrity sha512-ev9Gln7d/o/yWG2pJHthvNBnCp+GqOvwFnOqM8i/rbR4J0Xd/zzNHc2EJZjhpnLIxJverER4Hnuc1UC8vpwpYQ== - dependencies: - normalize-path "3.0.0" - tslib "2.5.0" - -"@tsed/openspec@7.54.0": - version "7.54.0" - resolved "https://registry.yarnpkg.com/@tsed/openspec/-/openspec-7.54.0.tgz#432d1ed3e629f49070836b7de82be8b6a5e4bcff" - integrity sha512-O83T4adfcGCy5mVro2ciX1Hjr+bvWgNsmTLmxWSfr4VXWOo6NlevH9bpS/vHhmR782lNJpCxM2+9tDARAVD9PQ== - -"@tsed/platform-exceptions@7.54.0": - version "7.54.0" - resolved "https://registry.yarnpkg.com/@tsed/platform-exceptions/-/platform-exceptions-7.54.0.tgz#704ede940b920cb726be47143ddcc0afb105d70b" - integrity sha512-V0lkBCzXxr2UalU6IzI/cVdOnSpCa5fQGlOfKkuOqZJAVmFHes47ipHVS3WQvdVljB+JjFqTJJLVb6DMINbYsg== - dependencies: - tslib "2.5.0" - -"@tsed/platform-express@7.54.0": - version "7.54.0" - resolved "https://registry.yarnpkg.com/@tsed/platform-express/-/platform-express-7.54.0.tgz#58cd5e973d259a54a97d9b44732a1b1e1893329b" - integrity sha512-JM8WP3WbKwiuW0PuzFzUV4j1Pf8p49CR2PRoea2XEQL5lPfeXrje5CZ8XS1UlXlXeSv2yLqUYpiqHqIuTZ1zBg== - dependencies: - express "^4.18.2" - multer "^1.4.5-lts.1" - tslib "2.5.0" - -"@tsed/platform-log-middleware@7.54.0": - version "7.54.0" - resolved "https://registry.yarnpkg.com/@tsed/platform-log-middleware/-/platform-log-middleware-7.54.0.tgz#de50056274bf6fb2ec81340dff9a3881a2238e4d" - integrity sha512-AMhTgUGT/YUKO+sF0e0OMP0D1NYM8tlQK3gAsmdw/PofdSAiO9tZ9gltG0xbRfx5cAyhVyWtB7InEfVKOqab6g== - dependencies: - tslib "2.5.0" - -"@tsed/platform-middlewares@7.54.0": - version "7.54.0" - resolved "https://registry.yarnpkg.com/@tsed/platform-middlewares/-/platform-middlewares-7.54.0.tgz#88e0cf793c3bdef7f3b9e877510c48cef65f5a98" - integrity sha512-bizVOZbZ23+JLyUGcihh/dgOLoss9RzwbAn0EtoVy6XIqIFrMc1Nn3OAdO8ZfUu3R8seMAWMVsLIkGmMHB3MQA== - dependencies: - tslib "2.5.0" - -"@tsed/platform-params@7.54.0": - version "7.54.0" - resolved "https://registry.yarnpkg.com/@tsed/platform-params/-/platform-params-7.54.0.tgz#60423585276d65431b321a690e3b915555d04d4c" - integrity sha512-O4Dea0L5VNCDXzdJjecWlAP/pL4c91hI+N06mbHZeqcVcuRuKYLGklGowzk7Gsr4FA29VJwc0jD/4Q4VMoXmkA== - dependencies: - tslib "2.5.0" - -"@tsed/platform-response-filter@7.54.0": - version "7.54.0" - resolved "https://registry.yarnpkg.com/@tsed/platform-response-filter/-/platform-response-filter-7.54.0.tgz#a65a8f73135391764a1391e7bca06dfcf58a685b" - integrity sha512-9PIrKvv/YQvDbNoiETePoJZ4ENmDnehnziU+LCErmfFq11QujAc3cy0hujF8ZCiLcagYv678OkzPSMmJzH1Y/A== - dependencies: - tslib "2.5.0" - -"@tsed/platform-router@7.54.0": - version "7.54.0" - resolved "https://registry.yarnpkg.com/@tsed/platform-router/-/platform-router-7.54.0.tgz#012db20c73f9f4427fc1280c73cb580a9ae2abc3" - integrity sha512-H85assft/GPLQ479CowbWSx97x6olVVb+PrYxR0DDc1VbdK/cmqmMjp09P43+/QHLOMpsoMA9rK2bE9VR9p/1Q== - dependencies: - tslib "2.5.0" - -"@tsed/platform-views@7.54.0": - version "7.54.0" - resolved "https://registry.yarnpkg.com/@tsed/platform-views/-/platform-views-7.54.0.tgz#fbf0a1416ab199df58600b6024f2ac5cd0c2d216" - integrity sha512-66nhht9HwkryKWft6LZZ2JVO8xhImsxF5IFlrcB+9LcU2ErHjNhlHE8V/1+hj8M4BiBC00bbifrNPaa79WpcUA== - dependencies: - "@tsed/engines" "7.54.0" - ejs "^3.1.5" - tslib "2.5.0" - -"@tsed/schema@7.54.0": - version "7.54.0" - resolved "https://registry.yarnpkg.com/@tsed/schema/-/schema-7.54.0.tgz#40d0623a0fccc6f86e2a590639e4179bc278b396" - integrity sha512-czOGFqPQYvro6cUpW+YTXxJ8UGnJ7jo28NHBS6b7r/dMX5hjRFncJN/SRRlI1xLWwHn9JzoWcac7dKRNuwfVuw== - dependencies: - "@tsed/openspec" "7.54.0" - change-case "^4.1.2" - fs-extra "^11.1.1" - json-schema "0.4.0" - picomatch "2.3.1" - statuses ">=2.0.1" - tslib "2.5.0" - -"@tsed/swagger@7.54.0": - version "7.54.0" - resolved "https://registry.yarnpkg.com/@tsed/swagger/-/swagger-7.54.0.tgz#d3dcc01c96de3cdf7d16b49b2c113714fad2851f" - integrity sha512-+nsYmVv+J6Ic2lEqoHzS8pfoikt1agpB+T3CHNljrSbLO1mYGpe2cX7UMmYKXvqxFXnnTglxgbnKNZZ9Gr1bJQ== - dependencies: - "@tsed/normalize-path" "7.54.0" - "@tsed/openspec" "7.54.0" - filedirname "^2.7.0" - fs-extra "11.1.1" - micromatch "4.0.5" - swagger-ui-dist "^4.5.2" - tslib "2.5.0" - "@tsed/ts-doc@4.0.14": version "4.0.14" resolved "https://registry.yarnpkg.com/@tsed/ts-doc/-/ts-doc-4.0.14.tgz#6f09a1b09962354c0a1e7847f475a3e35a191eed"