@foblex/ng-mediator
Version:
A mediator library for Angular facilitating a clean architecture with a better command-query separation.
1 lines • 13.5 kB
Source Map (JSON)
{"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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"}