@tsed/platform-http
Version:
A TypeScript Framework on top of Express
61 lines (60 loc) • 2 kB
JavaScript
import { inject, injectable, injector, ProviderScope } from "@tsed/di";
import { PlatformRouters } from "@tsed/platform-router";
import { application } from "../fn/application.js";
/**
* `Platform` is used to provide all routes collected by annotation `@Controller`.
*
* @platform
*/
export class Platform {
#layers;
constructor() {
this.platformRouters = inject(PlatformRouters);
this.platformRouters.prebuild();
}
get app() {
return application();
}
addRoutes(routes) {
routes.forEach((routeSettings) => {
this.addRoute(routeSettings.route, routeSettings.token);
});
}
addRoute(route, token) {
const app = application();
const provider = injector().getProvider(token);
if (!provider || provider.hasParent()) {
return this;
}
const router = this.platformRouters.from(provider.token);
app.use(route, router);
return this;
}
getLayers() {
this.#layers = this.#layers || this.platformRouters.getLayers(application());
return this.#layers;
}
/**
* Get all controllers mounted on the application.
* @returns {RouteController[]}
*/
getMountedControllers() {
const controllers = this.getLayers().reduce((controllers, layer) => {
if (layer.isProvider()) {
const route = String(layer.getBasePath());
const key = `${layer.provider.toString()}:${route}`;
if (!controllers.has(key)) {
controllers.set(key, {
route,
routes: new Set(),
provider: layer.provider
});
}
controllers.get(key).routes.add(String(layer.path));
}
return controllers;
}, new Map());
return [...controllers.values()];
}
}
injectable(Platform).scope(ProviderScope.SINGLETON);