@ngspot/ngx-errors
Version:
<p align="center"> <img width="20%" height="20%" src="https://github.com/DmitryEfimenko/ngspot/blob/main/packages/ngx-errors/package/assets/logo.png?raw=true"> </p>
84 lines • 13.1 kB
JavaScript
import { Injectable, signal } from '@angular/core';
import { NEVER, ReplaySubject, asapScheduler, auditTime, filter, merge, of, share, switchMap, take, timer, } from 'rxjs';
import { extractTouchedChanges, extractDirtyChanges, } from './extract-control-changes';
import { InvalidShowWhenError } from './ngx-errors';
import * as i0 from "@angular/core";
export class AllErrorsStateService {
constructor() {
this.state = signal(new Map());
}
registerControl(control, parentForm) {
const alreadyRegisteredControl = this.state().get(control);
if (alreadyRegisteredControl) {
alreadyRegisteredControl.registeredInstancesCount++;
return;
}
const watchedEvents$ = eventsTriggeringVisibilityChange$(control, parentForm);
this.state.update((map) => {
map.set(control, {
control,
parentForm,
watchedEvents$,
registeredInstancesCount: 1,
errors: signal({}),
});
return new Map(map);
});
}
unregisterControl(control) {
const alreadyRegisteredControl = this.state().get(control);
if (!alreadyRegisteredControl) {
return;
}
alreadyRegisteredControl.registeredInstancesCount--;
if (alreadyRegisteredControl.registeredInstancesCount === 0) {
this.state.update((map) => {
map.delete(control);
return new Map(map);
});
}
}
getControlState(control) {
return this.state().get(control);
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.7", ngImport: i0, type: AllErrorsStateService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.7", ngImport: i0, type: AllErrorsStateService, providedIn: 'root' }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.7", ngImport: i0, type: AllErrorsStateService, decorators: [{
type: Injectable,
args: [{ providedIn: 'root' }]
}] });
export function getErrorStateMatcher(errorStateMatchers, showWhen) {
const errorStateMatcher = errorStateMatchers.get(showWhen);
if (!errorStateMatcher) {
throw new InvalidShowWhenError(showWhen, errorStateMatchers.validKeys());
}
return errorStateMatcher;
}
function eventsTriggeringVisibilityChange$(control, form) {
const ngSubmit$ = form ? form.ngSubmit.asObservable() : NEVER;
const $ = merge(control.valueChanges, control.statusChanges, ngSubmit$, extractTouchedChanges(control), extractDirtyChanges(control), asyncBugWorkaround$(control), of(null)).pipe(
// using auditTime due to the fact that even though touch event
// might fire, the control.touched won't be updated at the time
// when ErrorStateMatcher check it
auditTime(0, asapScheduler), share({
connector: () => new ReplaySubject(1),
resetOnComplete: true,
resetOnError: true,
resetOnRefCountZero: true,
}));
return $;
}
/**
* control.statusChanges do not emit when there's async validator
* https://github.com/angular/angular/issues/41519
* ugly workaround:
*/
function asyncBugWorkaround$(control) {
let $ = NEVER;
if (control.asyncValidator && control.status === 'PENDING') {
$ = timer(0, 50).pipe(switchMap(() => of(control.status)), filter((x) => x !== 'PENDING'), take(1));
}
return $;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxsLWVycm9ycy1zdGF0ZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvbmd4LWVycm9ycy9wYWNrYWdlL3NyYy9saWIvYWxsLWVycm9ycy1zdGF0ZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQWtCLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQVFuRSxPQUFPLEVBQ0wsS0FBSyxFQUVMLGFBQWEsRUFDYixhQUFhLEVBQ2IsU0FBUyxFQUNULE1BQU0sRUFDTixLQUFLLEVBQ0wsRUFBRSxFQUNGLEtBQUssRUFDTCxTQUFTLEVBQ1QsSUFBSSxFQUNKLEtBQUssR0FDTixNQUFNLE1BQU0sQ0FBQztBQUdkLE9BQU8sRUFDTCxxQkFBcUIsRUFDckIsbUJBQW1CLEdBQ3BCLE1BQU0sMkJBQTJCLENBQUM7QUFFbkMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sY0FBYyxDQUFDOztBQWlCcEQsTUFBTSxPQUFPLHFCQUFxQjtJQURsQztRQUVVLFVBQUssR0FBRyxNQUFNLENBQWEsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0tBZ0QvQztJQTlDQyxlQUFlLENBQUMsT0FBd0IsRUFBRSxVQUEyQjtRQUNuRSxNQUFNLHdCQUF3QixHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFM0QsSUFBSSx3QkFBd0IsRUFBRSxDQUFDO1lBQzdCLHdCQUF3QixDQUFDLHdCQUF3QixFQUFFLENBQUM7WUFDcEQsT0FBTztRQUNULENBQUM7UUFFRCxNQUFNLGNBQWMsR0FBRyxpQ0FBaUMsQ0FDdEQsT0FBTyxFQUNQLFVBQVUsQ0FDWCxDQUFDO1FBRUYsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUN4QixHQUFHLENBQUMsR0FBRyxDQUFDLE9BQU8s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LEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUNuQixTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUNuQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsRUFDOUIsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUNSLENBQUM7SUFDSixDQUFDO0lBQ0QsT0FBTyxDQUFDLENBQUM7QUFDWCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgV3JpdGFibGVTaWduYWwsIHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1xyXG4gIEFic3RyYWN0Q29udHJvbCxcclxuICBGb3JtQ29udHJvbFN0YXR1cyxcclxuICBGb3JtR3JvdXBEaXJlY3RpdmUsXHJcbiAgTmdGb3JtLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuXHJcbmltcG9ydCB7XHJcbiAgTkVWRVIsXHJcbiAgT2JzZXJ2YWJsZSxcclxuICBSZXBsYXlTdWJqZWN0LFxyXG4gIGFzYXBTY2hlZHVsZXIsXHJcbiAgYXVkaXRUaW1lLFxyXG4gIGZpbHRlcixcclxuICBtZXJnZSxcclxuICBvZixcclxuICBzaGFyZSxcclxuICBzd2l0Y2hNYXAsXHJcbiAgdGFrZSxcclxuICB0aW1lcixcclxufSBmcm9tICdyeGpzJztcclxuXHJcbmltcG9ydCB7IEVycm9yU3RhdGVNYXRjaGVycyB9IGZyb20gJy4vZXJyb3Itc3RhdGUtbWF0Y2hlcnMuc2VydmljZSc7XHJcbmltcG9ydCB7XHJcbiAgZXh0cmFjdFRvdWNoZWRDaGFuZ2VzLFxyXG4gIGV4dHJhY3REaXJ0eUNoYW5nZXMsXHJcbn0gZnJvbSAnLi9leHRyYWN0LWNvbnRyb2wtY2hhbmdlcyc7XHJcbmltcG9ydCB7IE1heWJlUGFyZW50Rm9ybSB9IGZyb20gJy4vZm9ybS5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBJbnZhbGlkU2hvd1doZW5FcnJvciB9IGZyb20gJy4vbmd4LWVycm9ycyc7XHJcblxyXG50eXBlIEhhc0Vycm9yID0gYm9vbGVhbjtcclxudHlwZSBEaXJlY3RpdmVJZCA9IG51bWJlcjtcclxuXHJcbnR5cGUgRXJyb3JTdGF0ZSA9IE1hcDxcclxuICBBYnN0cmFjdENvbnRyb2wsXHJcbiAge1xyXG4gICAgY29udHJvbDogQWJzdHJhY3RDb250cm9sO1xyXG4gICAgcGFyZW50Rm9ybTogRm9ybUdyb3VwRGlyZWN0aXZlIHwgTmdGb3JtIHwgbnVsbDtcclxuICAgIHdhdGNoZWRFdmVudHMkOiBPYnNlcnZhYmxlPGFueT47XHJcbiAgICByZWdpc3RlcmVkSW5zdGFuY2VzQ291bnQ6IG51bWJlcjtcclxuICAgIGVycm9yczogV3JpdGFibGVTaWduYWw8UmVjb3JkPERpcmVjdGl2ZUlkLCBIYXNFcnJvcj4+O1xyXG4gIH1cclxuPjtcclxuXHJcbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXHJcbmV4cG9ydCBjbGFzcyBBbGxFcnJvcnNTdGF0ZVNlcnZpY2Uge1xyXG4gIHByaXZhdGUgc3RhdGUgPSBzaWduYWw8RXJyb3JTdGF0ZT4obmV3IE1hcCgpKTtcclxuXHJcbiAgcmVnaXN0ZXJDb250cm9sKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCwgcGFyZW50Rm9ybTogTWF5YmVQYXJlbnRGb3JtKSB7XHJcbiAgICBjb25zdCBhbHJlYWR5UmVnaXN0ZXJlZENvbnRyb2wgPSB0aGlzLnN0YXRlKCkuZ2V0KGNvbnRyb2wpO1xyXG5cclxuICAgIGlmIChhbHJlYWR5UmVnaXN0ZXJlZENvbnRyb2wpIHtcclxuICAgICAgYWxyZWFkeVJlZ2lzdGVyZWRDb250cm9sLnJlZ2lzdGVyZWRJbnN0YW5jZXNDb3VudCsrO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgd2F0Y2hlZEV2ZW50cyQgPSBldmVudHNUcmlnZ2VyaW5nVmlzaWJpbGl0eUNoYW5nZSQoXHJcbiAgICAgIGNvbnRyb2wsXHJcbiAgICAgIHBhcmVudEZvcm0sXHJcbiAgICApO1xyXG5cclxuICAgIHRoaXMuc3RhdGUudXBkYXRlKChtYXApID0+IHtcclxuICAgICAgbWFwLnNldChjb250cm9sLCB7XHJcbiAgICAgICAgY29udHJvbCxcclxuICAgICAgICBwYXJlbnRGb3JtLFxyXG4gICAgICAgIHdhdGNoZWRFdmVudHMkLFxyXG4gICAgICAgIHJlZ2lzdGVyZWRJbnN0YW5jZXNDb3VudDogMSxcclxuICAgICAgICBlcnJvcnM6IHNpZ25hbCh7fSksXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgcmV0dXJuIG5ldyBNYXAobWFwKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgdW5yZWdpc3RlckNvbnRyb2woY29udHJvbDogQWJzdHJhY3RDb250cm9sKSB7XHJcbiAgICBjb25zdCBhbHJlYWR5UmVnaXN0ZXJlZENvbnRyb2wgPSB0aGlzLnN0YXRlKCkuZ2V0KGNvbnRyb2wpO1xyXG5cclxuICAgIGlmICghYWxyZWFkeVJlZ2lzdGVyZWRDb250cm9sKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBhbHJlYWR5UmVnaXN0ZXJlZENvbnRyb2wucmVnaXN0ZXJlZEluc3RhbmNlc0NvdW50LS07XHJcblxyXG4gICAgaWYgKGFscmVhZHlSZWdpc3RlcmVkQ29udHJvbC5yZWdpc3RlcmVkSW5zdGFuY2VzQ291bnQgPT09IDApIHtcclxuICAgICAgdGhpcy5zdGF0ZS51cGRhdGUoKG1hcCkgPT4ge1xyXG4gICAgICAgIG1hcC5kZWxldGUoY29udHJvbCk7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBNYXAobWFwKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRDb250cm9sU3RhdGUoY29udHJvbDogQWJzdHJhY3RDb250cm9sKSB7XHJcbiAgICByZXR1cm4gdGhpcy5zdGF0ZSgpLmdldChjb250cm9sKTtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRFcnJvclN0YXRlTWF0Y2hlcihcclxuICBlcnJvclN0YXRlTWF0Y2hlcnM6IEVycm9yU3RhdGVNYXRjaGVycyxcclxuICBzaG93V2hlbjogc3RyaW5nLFxyXG4pIHtcclxuICBjb25zdCBlcnJvclN0YXRlTWF0Y2hlciA9IGVycm9yU3RhdGVNYXRjaGVycy5nZXQoc2hvd1doZW4pO1xyXG5cclxuICBpZiAoIWVycm9yU3RhdGVNYXRjaGVyKSB7XHJcbiAgICB0aHJvdyBuZXcgSW52YWxpZFNob3dXaGVuRXJyb3Ioc2hvd1doZW4sIGVycm9yU3RhdGVNYXRjaGVycy52YWxpZEtleXMoKSk7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gZXJyb3JTdGF0ZU1hdGNoZXI7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGV2ZW50c1RyaWdnZXJpbmdWaXNpYmlsaXR5Q2hhbmdlJChcclxuICBjb250cm9sOiBBYnN0cmFjdENvbnRyb2wsXHJcbiAgZm9ybTogRm9ybUdyb3VwRGlyZWN0aXZlIHwgTmdGb3JtIHwgbnVsbCxcclxuKSB7XHJcbiAgY29uc3QgbmdTdWJtaXQkID0gZm9ybSA/IGZvcm0ubmdTdWJtaXQuYXNPYnNlcnZhYmxlKCkgOiBORVZFUjtcclxuXHJcbiAgY29uc3QgJCA9IG1lcmdlKFxyXG4gICAgY29udHJvbC52YWx1ZUNoYW5nZXMsXHJcbiAgICBjb250cm9sLnN0YXR1c0NoYW5nZXMsXHJcbiAgICBuZ1N1Ym1pdCQsXHJcbiAgICBleHRyYWN0VG91Y2hlZENoYW5nZXMoY29udHJvbCksXHJcbiAgICBleHRyYWN0RGlydHlDaGFuZ2VzKGNvbnRyb2wpLFxyXG4gICAgYXN5bmNCdWdXb3JrYXJvdW5kJChjb250cm9sKSxcclxuICAgIG9mKG51bGwpLFxyXG4gICkucGlwZShcclxuICAgIC8vIHVzaW5nIGF1ZGl0VGltZSBkdWUgdG8gdGhlIGZhY3QgdGhhdCBldmVuIHRob3VnaCB0b3VjaCBldmVudFxyXG4gICAgLy8gbWlnaHQgZmlyZSwgdGhlIGNvbnRyb2wudG91Y2hlZCB3b24ndCBiZSB1cGRhdGVkIGF0IHRoZSB0aW1lXHJcbiAgICAvLyB3aGVuIEVycm9yU3RhdGVNYXRjaGVyIGNoZWNrIGl0XHJcbiAgICBhdWRpdFRpbWUoMCwgYXNhcFNjaGVkdWxlciksXHJcbiAgICBzaGFyZSh7XHJcbiAgICAgIGNvbm5lY3RvcjogKCkgPT4gbmV3IFJlcGxheVN1YmplY3QoMSksXHJcbiAgICAgIHJlc2V0T25Db21wbGV0ZTogdHJ1ZSxcclxuICAgICAgcmVzZXRPbkVycm9yOiB0cnVlLFxyXG4gICAgICByZXNldE9uUmVmQ291bnRaZXJvOiB0cnVlLFxyXG4gICAgfSksXHJcbiAgKTtcclxuXHJcbiAgcmV0dXJuICQ7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBjb250cm9sLnN0YXR1c0NoYW5nZXMgZG8gbm90IGVtaXQgd2hlbiB0aGVyZSdzIGFzeW5jIHZhbGlkYXRvclxyXG4gKiBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2lzc3Vlcy80MTUxOVxyXG4gKiB1Z2x5IHdvcmthcm91bmQ6XHJcbiAqL1xyXG5mdW5jdGlvbiBhc3luY0J1Z1dvcmthcm91bmQkKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkge1xyXG4gIGxldCAkOiBPYnNlcnZhYmxlPEZvcm1Db250cm9sU3RhdHVzIHwgbmV2ZXI+ID0gTkVWRVI7XHJcbiAgaWYgKGNvbnRyb2wuYXN5bmNWYWxpZGF0b3IgJiYgY29udHJvbC5zdGF0dXMgPT09ICdQRU5ESU5HJykge1xyXG4gICAgJCA9IHRpbWVyKDAsIDUwKS5waXBlKFxyXG4gICAgICBzd2l0Y2hNYXAoKCkgPT4gb2YoY29udHJvbC5zdGF0dXMpKSxcclxuICAgICAgZmlsdGVyKCh4KSA9PiB4ICE9PSAnUEVORElORycpLFxyXG4gICAgICB0YWtlKDEpLFxyXG4gICAgKTtcclxuICB9XHJcbiAgcmV0dXJuICQ7XHJcbn1cclxuIl19