@hapiness/core
Version:
Project to have a HapiJS (https://hapijs.com/) based framework to create easier NodeJS back-end with some awesome features
101 lines • 3.44 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const rxjs_1 = require("rxjs");
const decorators_1 = require("../../core/decorators");
const metadata_1 = require("../../core/metadata");
const di_1 = require("../../core/di");
class HttpRequestInfo {
}
exports.HttpRequestInfo = HttpRequestInfo;
exports.requestKey = new decorators_1.InjectionToken('request_key');
class RouteBuilder {
/**
* Entrypoint to build a CoreRoute
* Get the metadata and build the
* route instance
*
* @param {CoreModule} module
* @returns CoreRoute
*/
static buildRoutes(module) {
return rxjs_1.Observable
.of(module)
.filter(_ => !!_)
.flatMap(_ => this.metadataFromDeclarations(_.declarations))
.flatMap(_ => this.coreRouteFromMetadata(_.route, _.token, module));
}
/**
* Instantiate a new Route
* with its own DI/request
*
* @param {CoreRoute} route
* @param {Request} request
* @returns Observable
*/
static instantiateRouteAndDI(route, request) {
return rxjs_1.Observable
.of(request)
.map(_ => ({
query: Object.assign({}, request.query),
params: Object.assign({}, request.params),
headers: Object.assign({}, request.headers),
payload: Object.assign({}, request.payload),
credentials: Object.assign({}, request.auth.credentials),
id: request.id
}))
.map(_ => ({ provide: HttpRequestInfo, useValue: _ }))
.map(_ => []
.concat(route.providers)
.concat(_)
.concat({ provide: exports.requestKey, useValue: request }))
.flatMap(_ => di_1.DependencyInjection.createAndResolve(_, route.module.di))
.flatMap(_ => di_1.DependencyInjection.instantiateComponent(route.token, _));
}
/**
* Transform metadata to instance CoreRoute
*
* @param {Route} data
* @returns CoreRoute
*/
static coreRouteFromMetadata(data, token, module) {
return rxjs_1.Observable
.of(data)
.flatMap(_ => rxjs_1.Observable
.from([].concat(_.method))
.map(__ => __.toLowerCase())
.toArray()
.map(__ => ({ data: _, methods: __ })))
.map(_ => ({
token,
module,
config: _.data.config,
path: _.data.path,
method: _.methods,
labels: _.data.labels,
providers: []
.concat(_.data.providers)
.filter(p => !!p)
.map(p => p.provide ? p : { provide: p, useClass: p })
}));
}
/**
* Extract metadata filtered by route
* from the declarations provided
*
* @param {Type<any>} declarations
* @returns Route
*/
static metadataFromDeclarations(declarations) {
return rxjs_1.Observable
.from([].concat(declarations))
.filter(_ => !!_ && !!metadata_1.extractMetadataByDecorator(_, this.decoratorName))
.map(_ => ({ token: _, route: metadata_1.extractMetadataByDecorator(_, this.decoratorName) }));
}
}
/**
* Helper to extract metadata
* @property {string} decoratorName
*/
RouteBuilder.decoratorName = 'Route';
exports.RouteBuilder = RouteBuilder;
//# sourceMappingURL=route.js.map