/**
* @license
* Copyright 2023 Google LLC
* SPDX-License-Identifier: Apache-2.0
*/
/**
* A class that computes and caches `ValidityStateFlags` for a component with
* a given `State` interface.
*
* Cached performance before computing validity is important since constraint
* validation must be checked frequently and synchronously when properties
* change.
*
* @template State The expected interface of properties relevant to constraint
* validation.
*/
export class Validator {
/**
* Creates a new validator.
*
* @param getCurrentState A callback that returns the current state of
* constraint validation-related properties.
*/
constructor(getCurrentState) {
this.getCurrentState = getCurrentState;
/**
* The current validity state and message. This is cached and returns if
* constraint validation state does not change.
*/
this.currentValidity = {
validity: {},
validationMessage: '',
};
}
/**
* Returns the current `ValidityStateFlags` and validation message for the
* validator.
*
* If the constraint validation state has not changed, this will return a
* cached result. This is important since `getValidity()` can be called
* frequently in response to synchronous property changes.
*
* @return The current validity and validation message.
*/
getValidity() {
const state = this.getCurrentState();
const hasStateChanged = !this.prevState || !this.equals(this.prevState, state);
if (!hasStateChanged) {
return this.currentValidity;
}
const { validity, validationMessage } = this.computeValidity(state);
this.prevState = this.copy(state);
this.currentValidity = {
validationMessage,
validity: {
// Change any `ValidityState` instances into `ValidityStateFlags` since
// `ValidityState` cannot be easily `{...spread}`.
badInput: validity.badInput,
customError: validity.customError,
patternMismatch: validity.patternMismatch,
rangeOverflow: validity.rangeOverflow,
rangeUnderflow: validity.rangeUnderflow,
stepMismatch: validity.stepMismatch,
tooLong: validity.tooLong,
tooShort: validity.tooShort,
typeMismatch: validity.typeMismatch,
valueMissing: validity.valueMissing,
},
};
return this.currentValidity;
}
}
//# sourceMappingURL=validator.js.map