{"version":3,"file":"foblex-ng-mediator.mjs","sources":["../../../projects/ng-mediator/src/lib/cqrs/f-command-base.ts","../../../projects/ng-mediator/src/lib/cqrs/f-query-base.ts","../../../projects/ng-mediator/src/lib/mediator/validator/validation-failed.ts","../../../projects/ng-mediator/src/lib/mediator/validator/validation-success.ts","../../../projects/ng-mediator/src/lib/mediator/validator/f-validator-base.ts","../../../projects/ng-mediator/src/lib/mediator/validator/f-empty-validator.ts","../../../projects/ng-mediator/src/lib/mediator/f-mediator.ts","../../../projects/ng-mediator/src/lib/mediator/pipeline.ts","../../../projects/ng-mediator/src/lib/mediator/f-mediator.module.ts","../../../projects/ng-mediator/src/lib/mediator/f-mediator.service.spec.ts","../../../projects/ng-mediator/src/foblex-ng-mediator.ts"],"sourcesContent":["import { ICommand } from \"./i-command\";\nimport { Observable } from 'rxjs';\nimport { IRequestHandler } from './i-request-handler';\n\nexport abstract class FCommandBase<TRequest extends ICommand<TResponse>, TResponse>\n  implements IRequestHandler<TRequest, TResponse> {\n\n  public handle(request: TRequest): Observable<TResponse> {\n    const result = this.execute(request);\n    return result;\n  }\n\n  protected abstract execute(request: TRequest): Observable<TResponse>;\n}\n","import { IQuery } from \"./i-query\";\nimport { Observable } from 'rxjs';\nimport { IRequestHandler } from './i-request-handler';\n\nexport abstract class FQueryBase<TRequest extends IQuery<TResponse>, TResponse>\n  implements IRequestHandler<TRequest, TResponse> {\n\n  public handle(request: TRequest): Observable<TResponse> {\n    const result = this.execute(request);\n    return result;\n  }\n\n  protected abstract execute(request: TRequest): Observable<TResponse>;\n}\n","import { IValidationResult } from './i-validation-result';\n\nexport class ValidationFailed<TError extends Error>\n  implements IValidationResult<TError> {\n\n  public readonly isValid: boolean = false;\n\n  constructor(\n    public readonly errors: TError[]\n  ) {\n  }\n}\n","import { IValidationResult } from './i-validation-result';\n\nexport class ValidationSuccess<TError extends Error>\n  implements IValidationResult<TError> {\n\n  public readonly isValid: boolean = true;\n}\n","import { IRequest } from '../../cqrs';\nimport { Observable, of, switchMap } from 'rxjs';\nimport { IValidationResult } from './i-validation-result';\nimport { ValidationFailed } from './validation-failed';\nimport { ValidationSuccess } from './validation-success';\n\nexport abstract class FValidatorBase<TRequest extends IRequest<TResponse>, TResponse, TError extends Error = Error> {\n\n  public handle(request: TRequest): Observable<IValidationResult<TError>> {\n    return this.validate(request).pipe(\n      switchMap((errors) => {\n        if (errors && errors.length > 0) {\n          return of(new ValidationFailed(errors))\n        }\n        return of(new ValidationSuccess());\n      })\n    );\n  }\n\n  protected abstract validate(request: TRequest): Observable<TError[]>;\n}\n","import { Observable, of } from 'rxjs';\nimport { Injectable } from '@angular/core';\nimport { IRequest } from '../../cqrs';\nimport { FValidatorBase } from './f-validator-base';\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class FEmptyValidator<TRequest extends IRequest<TResponse>, TResponse>\n  extends FValidatorBase<TRequest, TResponse>{\n\n  public override validate(request: TRequest): Observable<Error[]> {\n    return of([]);\n  }\n}\n","import { Injectable, Inject, InjectionToken, Type } from '@angular/core';\nimport { Observable, throwError } from 'rxjs';\nimport { Pipeline } from './pipeline';\nimport { IRequest } from '../cqrs';\n\nexport const F_FEATURE_TOKEN = new InjectionToken('F_FEATURE_TOKEN');\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class FMediator {\n\n  private features = new Map<string, Pipeline<any, any>>();\n\n  constructor(@Inject(F_FEATURE_TOKEN) featureProviders: Pipeline<any, any>[]) {\n    for (const feature of featureProviders) {\n      this.features.set(feature.requestType, feature);\n    }\n  }\n\n  public send<TRequest extends IRequest<TResponse>, TResponse>(requestType: Type<TRequest>, request: TRequest): Observable<TResponse> {\n    const feature = this.features.get(requestType.name);\n    if (!feature) {\n      return throwError(() => Error('Pipeline not registered for request type.'));\n    }\n    return feature.execute(request);\n  }\n}\n","import { Observable, throwError } from 'rxjs';\nimport { catchError, switchMap } from 'rxjs/operators';\nimport { FValidatorBase } from './validator';\nimport { IRequest, IRequestHandler } from '../cqrs';\n\nexport class Pipeline<TRequest extends IRequest<TResponse>, TResponse> {\n\n  constructor(\n    public requestType: string,\n    private validator: FValidatorBase<TRequest, TResponse>,\n    private requestHandler: IRequestHandler<TRequest, TResponse>\n  ) {\n  }\n\n  public execute(request: TRequest): Observable<TResponse> {\n    return this.validator.handle(request).pipe(\n      switchMap((result) => {\n        if (!result.isValid) {\n          return throwError(() => result.errors);\n        }\n        return this.requestHandler.handle(request).pipe(catchError((error) => throwError(() => [error])));\n      })\n    );\n  }\n}\n","import { ModuleWithProviders, NgModule, Type } from '@angular/core';\nimport { F_FEATURE_TOKEN, FMediator } from './f-mediator';\nimport { Pipeline } from './pipeline';\nimport { IRequest, IRequestHandler } from '../cqrs';\nimport { FValidatorBase } from './validator';\n\n@NgModule()\nexport class FMediatorModule {\n\n  public static forRoot(): ModuleWithProviders<FMediatorModule> {\n    return {\n      ngModule: FMediatorModule,\n      providers: [ FMediator ]\n    };\n  }\n\n  public static forFeature<TRequest extends IRequest<TResponse>, TResponse>(\n    requestType: Type<TRequest>,\n    validatorType: Type<FValidatorBase<TRequest, TResponse>>,\n    handlerType: Type<IRequestHandler<TRequest, TResponse>>\n  ): ModuleWithProviders<FMediatorModule> {\n    return {\n      ngModule: FMediatorModule,\n      providers: [\n        validatorType,\n        handlerType,\n        {\n          provide: F_FEATURE_TOKEN,\n          useFactory: (validator: FValidatorBase<TRequest, TResponse>, handler: IRequestHandler<TRequest, TResponse>) => {\n            return new Pipeline(requestType.name, validator, handler);\n          },\n          deps: [ validatorType, handlerType ],\n          multi: true\n        }\n      ]\n    };\n  }\n}\n","import { TestBed, fakeAsync, tick } from '@angular/core/testing';\nimport { Observable, of, throwError } from 'rxjs';\nimport { Type } from '@angular/core';\nimport { catchError } from 'rxjs/operators';\nimport { FCommandBase, FQueryBase, IRequest, IRequestHandler } from '../cqrs';\nimport { FValidatorBase } from './validator';\nimport { FMediator } from './f-mediator';\nimport { FMediatorModule } from './f-mediator.module';\n\nclass MockRequest implements IRequest<string> {\n}\n\n// Validators\nclass SuccessValidator extends FValidatorBase<MockRequest, string> {\n  override validate(request: MockRequest): Observable<Error[]> {\n    return of([]);\n  }\n}\n\nclass FailureValidator extends FValidatorBase<MockRequest, string> {\n  validate(request: MockRequest): Observable<Error[]> {\n    return of([ new Error('Validation Error') ]);\n  }\n}\n\n// Handlers\nclass SuccessHandler extends FCommandBase<MockRequest, string> {\n  execute(request: MockRequest): Observable<string> {\n    return of('Success');\n  }\n}\n\nclass FailureHandler extends FQueryBase<MockRequest, string> {\n  execute(request: MockRequest): Observable<string> {\n    return throwError(() => new Error('Handler Error'));\n  }\n}\n\n\n// describe('FMediator', () => {\n//   let mediator: FMediator;\n//\n//   function setupModule(validator: Type<FValidatorBase<MockRequest, string>>, handler: Type<IRequestHandler<MockRequest, string>>) {\n//     TestBed.configureTestingModule({\n//       imports: [ FMediatorModule.forRoot(), FMediatorModule.forFeature(MockRequest, validator, handler) ]\n//     });\n//     mediator = TestBed.inject(FMediator);\n//   }\n//\n//   it('should return success when there are no errors', fakeAsync(() => {\n//     setupModule(SuccessValidator, SuccessHandler);\n//     mediator.send(MockRequest, new MockRequest()).subscribe(response => {\n//       expect(response).toEqual('Success');\n//     });\n//     tick();\n//   }));\n//\n//   it('should return validation error when validator fails', fakeAsync(() => {\n//     setupModule(FailureValidator, SuccessHandler);\n//     mediator.send(MockRequest, new MockRequest()).pipe(catchError((err, o) => {\n//       expect(err).toEqual([ new Error('Validation Error') ]);\n//       return o;\n//     })).subscribe();\n//     tick();\n//   }));\n// });\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["switchMap"],"mappings":"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"}