72 lines
2.4 KiB
TypeScript
72 lines
2.4 KiB
TypeScript
|
import {Directive, OptionDefinition} from '../Directive'
|
||
|
import {Inject, Injectable} from '../../di'
|
||
|
import {Routing} from '../../service/Routing'
|
||
|
import Table = require('cli-table')
|
||
|
import {RouteHandler} from '../../http/routing/Route'
|
||
|
|
||
|
@Injectable()
|
||
|
export class RouteDirective extends Directive {
|
||
|
@Inject()
|
||
|
protected readonly routing!: Routing
|
||
|
|
||
|
getDescription(): string {
|
||
|
return 'Get information about a specific route'
|
||
|
}
|
||
|
|
||
|
getKeywords(): string | string[] {
|
||
|
return ['route']
|
||
|
}
|
||
|
|
||
|
getOptions(): OptionDefinition[] {
|
||
|
return [
|
||
|
'{route} | the path of the route',
|
||
|
'--method -m {value} | the HTTP method of the route',
|
||
|
]
|
||
|
}
|
||
|
|
||
|
async handle(): Promise<void> {
|
||
|
const method: string | undefined = this.option('method')
|
||
|
?.toLowerCase()
|
||
|
?.trim()
|
||
|
|
||
|
const route: string = this.option('route')
|
||
|
.toLowerCase()
|
||
|
.trim()
|
||
|
|
||
|
this.routing.getCompiled()
|
||
|
.filter(match => match.getRoute().trim() === route && (!method || match.getMethod() === method))
|
||
|
.tap(matches => {
|
||
|
if ( !matches.length ) {
|
||
|
this.error('No matching routes found. (Use `./ex routes` to list)')
|
||
|
process.exitCode = 1
|
||
|
}
|
||
|
})
|
||
|
.each(match => {
|
||
|
const pre = match.getMiddlewares()
|
||
|
.where('stage', '=', 'pre')
|
||
|
.map<[string, string]>(ware => [ware.stage, this.handlerToString(ware.handler)])
|
||
|
|
||
|
const post = match.getMiddlewares()
|
||
|
.where('stage', '=', 'post')
|
||
|
.map<[string, string]>(ware => [ware.stage, this.handlerToString(ware.handler)])
|
||
|
|
||
|
const maxLen = match.getMiddlewares().max(ware => this.handlerToString(ware.handler).length)
|
||
|
|
||
|
const table = new Table({
|
||
|
head: ['Stage', 'Handler'],
|
||
|
colWidths: [10, Math.max(maxLen, match.getDisplayableHandler().length) + 2],
|
||
|
})
|
||
|
|
||
|
table.push(...pre.toArray())
|
||
|
table.push(['handler', match.getDisplayableHandler()])
|
||
|
table.push(...post.toArray())
|
||
|
|
||
|
this.info(`\nRoute: ${match}\n\n${table}`)
|
||
|
})
|
||
|
}
|
||
|
|
||
|
protected handlerToString(handler: RouteHandler): string {
|
||
|
return typeof handler === 'string' ? handler : '(anonymous function)'
|
||
|
}
|
||
|
}
|