UNPKG

@material/web

Version:
73 lines 2.66 kB
/** * @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