You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
48 lines
1.5 KiB
48 lines
1.5 KiB
import {Singleton, Inject} from "@extollo/di"
|
|
import {UniversalPath, Collection} from "@extollo/util"
|
|
import {Unit} from "../lifecycle/Unit"
|
|
import {Logging} from "./Logging"
|
|
import {Route} from "../http/routing/Route";
|
|
import {HTTPMethod} from "../http/lifecycle/Request";
|
|
import {ViewEngineFactory} from "../views/ViewEngineFactory";
|
|
|
|
@Singleton()
|
|
export class Routing extends Unit {
|
|
@Inject()
|
|
protected readonly logging!: Logging
|
|
|
|
protected compiledRoutes: Collection<Route> = new Collection<Route>()
|
|
|
|
public async up() {
|
|
this.app().registerFactory(new ViewEngineFactory());
|
|
|
|
for await ( const entry of this.path.walk() ) {
|
|
if ( !entry.endsWith('.routes.js') ) {
|
|
this.logging.debug(`Skipping routes file with invalid suffix: ${entry}`)
|
|
continue
|
|
}
|
|
|
|
this.logging.info(`Importing routes from: ${entry}`)
|
|
await import(entry)
|
|
}
|
|
|
|
this.logging.info('Compiling routes...')
|
|
this.compiledRoutes = new Collection<Route>(await Route.compile())
|
|
|
|
this.logging.info(`Compiled ${this.compiledRoutes.length} route(s).`)
|
|
this.compiledRoutes.each(route => {
|
|
this.logging.verbose(`${route}`)
|
|
})
|
|
}
|
|
|
|
public match(method: HTTPMethod, path: string): Route | undefined {
|
|
return this.compiledRoutes.firstWhere(route => {
|
|
return route.match(method, path)
|
|
})
|
|
}
|
|
|
|
public get path(): UniversalPath {
|
|
return this.app().appPath('http', 'routes')
|
|
}
|
|
}
|