import { Constructable } from '../../types'; import { Graph } from '../Graph'; import DefaultGraphMiddleware from './DefaultGraphResolver'; import { Middleware } from './Middleware'; export default class GraphMiddlewareChain { private middlewares: Middleware[]; constructor(defaultMiddleware: Middleware = new DefaultGraphMiddleware()) { this.middlewares = [defaultMiddleware]; } resolve(Graph: Constructable, props?: any): T { return this.middlewares[0].resolve(this.middlewares[0].resolveChain, Graph, props); } add(middleware: Middleware) { this.middlewares.unshift(middleware); this.updateResolveChain(); } private updateResolveChain() { if (this.middlewares.length > 1) { this.middlewares[0].setNext(this.middlewares[1]); } } clear() { this.middlewares = [new DefaultGraphMiddleware()]; } }