import {Container} from 'aurelia-dependency-injection';
export class RouteFilterContainer {
static inject() { return [Container]; }
constructor(container: Container) {
this.container = container;
this.lookup = { };
this.filters = { };
this.filterCache = { };
}
register(key: string, aliases: string[]) {
aliases.forEach((alias) => {
this.lookup[alias] = key;
});
}
addStep(name: string, step: any, index: number = -1): void {
let key = this.lookup[name];
let filter = this.filters[key];
if (!filter) {
filter = this.filters[key] = [];
}
Eif (index === -1) {
index = filter.length;
}
filter.splice(index, 0, step);
this.filterCache = {};
}
getFilterSteps(key: string) {
Iif (this.filterCache[key]) {
return this.filterCache[key];
}
let steps = [];
let filter = this.filters[key];
Iif (!filter) {
return steps;
}
for (let i = 0, l = filter.length; i < l; i++) {
Iif (typeof filter[i] === 'string') {
steps.push(...this.getFilterSteps(this.lookup[filter[i]]));
} else {
steps.push(this.container.get(filter[i]));
}
}
this.filterCache[key] = steps;
return steps;
}
}
export function createRouteFilterStep(name: string, options?: any = {}): Function {
options = Object.assign({}, { aliases: [] }, options);
function create(routeFilterContainer) {
let key = name;
routeFilterContainer.register(key, [name, ...options.aliases]);
return new RouteFilterStep(key, routeFilterContainer);
}
create.inject = function() {
return [RouteFilterContainer];
};
return create;
}
class RouteFilterStep {
isMultiStep: boolean = true;
constructor(key: string, routeFilterContainer: RouteFilterContainer) {
this.key = key;
this.routeFilterContainer = routeFilterContainer;
}
getSteps() {
return this.routeFilterContainer.getFilterSteps(this.key);
}
}
|