-
Notifications
You must be signed in to change notification settings - Fork 1
/
index.ts
66 lines (50 loc) · 1.89 KB
/
index.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
/// <reference types="knockout" />
/* tslint:disable:interface-name callable-types max-line-length array-type */
import {
validate as newOrbitValidate,
ValidationFunction,
ValidateFunction
} from "not-valid";
import { BehaviorSubject, Observable } from "rxjs";
import { debounceTime, switchMap } from "rxjs/operators";
const DEBOUNCE_WAIT_PERIOD = process.env.NOT_VALID_KNOCKOUT_DEBOUNCE !== undefined
? +process.env.NOT_VALID_KNOCKOUT_DEBOUNCE
: 350;
const createKnockoutWrapper = (validationSystem?: ValidateFunction) => {
const validate = validationSystem || newOrbitValidate;
const bindValidation = <T>(
validators: ValidationFunction<T>[],
valueObservable: KnockoutObservable<T>,
errorObservable: KnockoutObservable<string[]>,
dependentObservables?: KnockoutObservable<any>[]
): Observable<string[]> => {
const triggerValidation = () => {
const value = valueObservable();
subject.next(value);
};
const subscribeValidationToKnockoutObservable =
(observable: KnockoutObservable<any>) => {
observable.subscribe(triggerValidation);
};
const initialValue = valueObservable();
const subject = new BehaviorSubject<T>(initialValue);
const resultObservable = subject
.pipe(
debounceTime(DEBOUNCE_WAIT_PERIOD),
switchMap(async value => await validate(validators, value))
);
resultObservable.subscribe(errors => errorObservable(errors));
subscribeValidationToKnockoutObservable(valueObservable);
if (dependentObservables) {
dependentObservables.forEach(o => subscribeValidationToKnockoutObservable(o));
}
return resultObservable;
};
return {
bindValidation
};
};
export {
ValidateFunction,
createKnockoutWrapper
};