@vaadin/hilla-lit-form 24.7.0-alpha3 → 24.7.0-alpha5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/BinderNode.js CHANGED
@@ -180,7 +180,7 @@ class BinderNode extends EventTarget {
180
180
  return this.parent.value[key];
181
181
  }
182
182
  set value(value) {
183
- this.initializeValue();
183
+ this.initializeValue(true);
184
184
  this.#setValueState(value, void 0);
185
185
  }
186
186
  /**
package/BinderNode.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["src/BinderNode.ts"],
4
- "sourcesContent": ["/* eslint-disable @typescript-eslint/prefer-nullish-coalescing */\n/*\n * Copyright 2000-2020 Vaadin Ltd.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n// TODO: Fix dependency cycle\n\nimport type { BinderRoot } from './BinderRoot.js';\nimport {\n _createEmptyItemValue,\n _key,\n _parent,\n _validators,\n AbstractModel,\n type ArrayItemModel,\n ArrayModel,\n getObjectModelOwnAndParentGetters,\n ObjectModel,\n type Value,\n} from './Models.js';\nimport type { ClassStaticProperties } from './types.js';\nimport type { Validator, ValueError } from './Validation.js';\nimport { ValidityStateValidator } from './Validators.js';\nimport { _validity } from './Validity.js';\n\nexport const _updateValidation = Symbol('updateValidation');\nexport const _update = Symbol('update');\nexport const _setErrorsWithDescendants = Symbol('setErrorsWithDescendants');\nexport const _clearValidation = Symbol('clearValidation');\n\nconst nodes = new WeakMap<AbstractModel, BinderNode>();\n\nexport function getBinderNode<M extends AbstractModel>(model: M): BinderNode<M> {\n let node = nodes.get(model);\n\n if (!node) {\n node = new BinderNode(model);\n nodes.set(model, node);\n }\n\n return node as BinderNode<M>;\n}\n\nfunction getErrorPropertyName(valueError: ValueError): string {\n return typeof valueError.property === 'string' ? valueError.property : getBinderNode(valueError.property).name;\n}\n\nfunction updateObjectOrArrayKey<M extends AbstractModel>(\n model: M,\n value: Value<M>,\n key: keyof any,\n keyValue: unknown,\n): Value<M> {\n if (model instanceof ObjectModel) {\n // Value contained in object - replace object in parent\n return {\n ...(value as Record<never, never> & Value<M>),\n [key]: keyValue,\n };\n }\n\n if (keyValue === undefined) {\n throw new TypeError('Unexpected undefined value');\n }\n\n if (model instanceof ArrayModel) {\n // Value contained in array - replace array in parent\n const array = (value as unknown[]).slice();\n array[key as number] = keyValue;\n return array as Value<M>;\n }\n\n throw new TypeError(`Unknown model type ${(model as AbstractModel).constructor.name}`);\n}\n\nexport const CHANGED = new Event('binder-node-changed');\n\nclass NotArrayModelError extends Error {\n constructor() {\n super('The model does not represent array');\n }\n}\n\nclass NotArrayItemModelError extends Error {\n constructor() {\n super('The model does not represent array item');\n }\n}\n\ndeclare class ArrayItemBinderNode<M extends AbstractModel> extends BinderNode<M> {\n // @ts-expect-error: re-defining the parent getter.\n declare readonly parent: BinderNode<ArrayModel<M>>;\n}\n\nconst defaultArrayItemCache = new WeakMap<BinderNode, unknown>();\n\n/**\n * The BinderNode\\<M\\> class provides the form binding related APIs\n * with respect to a particular model instance.\n *\n * Structurally, model instances form a tree, in which the object\n * and array models have child nodes of field and array item model\n * instances.\n */\nexport class BinderNode<M extends AbstractModel = AbstractModel> extends EventTarget {\n declare readonly ['constructor']: ClassStaticProperties<typeof BinderNode<M>>;\n readonly model: M;\n /**\n * The validity state read from the bound element, if any. Represents the\n * HTML element internal validation.\n *\n * For elements with `validity.valid === false`, the value in the\n * bound element is considered as invalid.\n */\n [_validity]?: ValidityState;\n #ownErrors?: ReadonlyArray<ValueError<Value<M>>>;\n #validators: ReadonlyArray<Validator<Value<M>>>;\n readonly #validityStateValidator: ValidityStateValidator<Value<M>>;\n #visited = false;\n\n constructor(model: M) {\n super();\n this.model = model;\n nodes.set(model, this);\n this.#validityStateValidator = new ValidityStateValidator<Value<M>>();\n this.#validators = model[_validators];\n\n // Workaround for children initialization with private props\n if (this.constructor === BinderNode) {\n this.initializeValue();\n }\n }\n\n /**\n * The binder for the top-level model.\n */\n get binder(): BinderRoot {\n const binder = this.parent?.binder;\n\n if (!binder) {\n throw new TypeError('BinderNode is detached');\n }\n\n return binder;\n }\n\n /**\n * The default value related to the model\n */\n get defaultValue(): Value<M> | undefined {\n const key = this.model[_key];\n const parentDefaultValue = this.parent!.defaultValue as { readonly [key in typeof key]?: Value<M> };\n\n if (this.#isArrayItem() && !(key in parentDefaultValue)) {\n if (defaultArrayItemCache.has(this.parent)) {\n return defaultArrayItemCache.get(this.parent) as Value<M>;\n }\n\n const value = this.model.constructor.createEmptyValue();\n defaultArrayItemCache.set(this.parent, value);\n return value as Value<M>;\n }\n\n return parentDefaultValue[key];\n }\n\n /**\n * True if the current value is different from the defaultValue.\n */\n get dirty(): boolean {\n return this.value !== this.defaultValue;\n }\n\n /**\n * The combined array of all errors for this node\u2019s model and all its nested\n * models\n */\n get errors(): readonly ValueError[] {\n return [...Array.from(this.#getChildBinderNodes(), (node) => node.errors).flat(), ...this.ownErrors];\n }\n\n /**\n * Indicates if there is any error for the node's model.\n */\n get invalid(): boolean {\n return this.errors.length > 0;\n }\n\n /**\n * The name generated from the model structure, used to set the name\n * attribute on the field components.\n */\n get name(): string {\n let { model }: { model: AbstractModel } = this;\n let name = '';\n\n while (model[_parent] instanceof AbstractModel) {\n name = `${String(model[_key])}${name ? `.${name}` : ''}`;\n model = model[_parent];\n }\n\n return name;\n }\n\n /**\n * The array of validation errors directly related with the model.\n */\n get ownErrors(): ReadonlyArray<ValueError<Value<M>>> {\n return this.#ownErrors ? this.#ownErrors : [];\n }\n\n /**\n * The parent node, if this binder node corresponds to a nested model,\n * otherwise undefined for the top-level binder.\n */\n get parent(): BinderNode | undefined {\n const modelParent = this.model[_parent];\n return modelParent instanceof AbstractModel ? getBinderNode(modelParent) : undefined;\n }\n\n /**\n * True if the value is required to be non-empty.\n */\n get required(): boolean {\n return this.#validators.some((validator) => validator.impliesRequired);\n }\n\n /**\n * The array of validators for the model. The default value is defined in the\n * model.\n */\n get validators(): ReadonlyArray<Validator<Value<M>>> {\n return this.#validators;\n }\n\n set validators(validators: ReadonlyArray<Validator<Value<M>>>) {\n this.#validators = validators;\n this.dispatchEvent(CHANGED);\n }\n\n /**\n * The current value related to the model\n */\n get value(): Value<M> | undefined {\n if (!this.parent) {\n return undefined;\n }\n\n this.initializeValue();\n\n const key = this.model[_key];\n\n // The value of parent in unknown, so we need to cast it.\n type ParentValue = { readonly [K in typeof key]: Value<M> };\n return (this.parent.value as ParentValue)[key];\n }\n\n set value(value: Value<M> | undefined) {\n this.initializeValue();\n this.#setValueState(value, undefined);\n }\n\n /**\n * True if the bound field was ever focused and blurred by the user.\n */\n get visited(): boolean {\n return this.#visited;\n }\n\n set visited(v: boolean) {\n if (this.#visited !== v) {\n this.#visited = v;\n this[_updateValidation]().catch(() => {});\n this.dispatchEvent(CHANGED);\n }\n }\n\n /**\n * A helper method to add a validator\n *\n * @param validator - a validator\n */\n addValidator(validator: Validator<Value<M>>): void {\n this.validators = [...this.#validators, validator];\n this.dispatchEvent(CHANGED);\n }\n\n /**\n * Append an item to the array value.\n *\n * Requires the context model to be an array reference.\n *\n * @param item - optional new item value, an empty item is\n * appended if the argument is omitted\n */\n appendItem(item?: Value<ArrayItemModel<M>>): void {\n if (this.#isArray()) {\n const itemValueOrEmptyValue = item ?? this.model[_createEmptyItemValue]();\n const newValue = [...(this.value ?? []), itemValueOrEmptyValue];\n const newDefaultValue = [...(this.defaultValue ?? []), itemValueOrEmptyValue];\n this.#setValueState(newValue, newDefaultValue);\n } else {\n throw new NotArrayModelError();\n }\n }\n\n /**\n * Returns a binder node for the nested model instance.\n *\n * @param model - The nested model instance\n */\n for<N extends AbstractModel>(model: N): BinderNode<N> {\n const binderNode = getBinderNode(model);\n if (binderNode.binder !== this.binder) {\n throw new Error('Unknown binder');\n }\n\n return binderNode;\n }\n\n prependItem(item?: Value<ArrayItemModel<M>>): void {\n if (this.#isArray()) {\n const itemValueOrEmptyValue = item ?? this.model[_createEmptyItemValue]();\n const newValue = [itemValueOrEmptyValue, ...(this.value ?? [])];\n const newDefaultValue = [itemValueOrEmptyValue, ...(this.defaultValue ?? [])];\n this.#setValueState(newValue, newDefaultValue);\n } else {\n throw new NotArrayModelError();\n }\n }\n\n removeSelf(): void {\n if (this.#isArrayItem()) {\n const newValue = (this.parent.value ?? []).filter((_, i) => i !== this.model[_key]);\n const newDefaultValue = (this.parent.defaultValue ?? []).filter((_, i) => i !== this.model[_key]);\n this.parent.#setValueState(newValue, newDefaultValue);\n } else {\n throw new NotArrayItemModelError();\n }\n }\n\n /**\n * Runs all validation callbacks potentially affecting this\n * or any nested model. Returns the combined array of all\n * errors as in the errors property.\n */\n async validate(): Promise<readonly ValueError[]> {\n const errors = await Promise.all([\n ...this.#requestValidationOfDescendants(),\n ...this.#requestValidationWithAncestors(),\n ]).then((arr) => arr.flat());\n this[_setErrorsWithDescendants](errors.length ? errors : undefined);\n this[_update]();\n return errors;\n }\n\n protected [_clearValidation](): boolean {\n if (this.#visited) {\n this.#visited = false;\n this.dispatchEvent(CHANGED);\n }\n let needsUpdate = false;\n if (this.#ownErrors) {\n this.#ownErrors = undefined;\n needsUpdate = true;\n this.dispatchEvent(CHANGED);\n }\n if ([...this.#getChildBinderNodes()].filter((childBinderNode) => childBinderNode[_clearValidation]()).length > 0) {\n needsUpdate = true;\n }\n return needsUpdate;\n }\n\n protected [_setErrorsWithDescendants](errors?: readonly ValueError[]): void {\n const { name } = this;\n const ownErrors = errors\n ? (errors.filter((valueError) => getErrorPropertyName(valueError) === name) as ReadonlyArray<\n ValueError<Value<M>>\n >)\n : undefined;\n const relatedErrors = errors\n ? errors.filter((valueError) => getErrorPropertyName(valueError).startsWith(name))\n : undefined;\n this.#ownErrors = ownErrors;\n for (const childBinderNode of this.#getChildBinderNodes()) {\n childBinderNode[_setErrorsWithDescendants](relatedErrors);\n }\n this.dispatchEvent(CHANGED);\n }\n\n protected [_update](_?: Value<M>): void {\n if (this.parent) {\n this.parent[_update]();\n }\n }\n\n protected async [_updateValidation](): Promise<void> {\n if (this.#visited) {\n await this.validate();\n } else if (this.dirty || this.invalid) {\n await Promise.all(\n [...this.#getChildBinderNodes()].map(async (childBinderNode) => childBinderNode[_updateValidation]()),\n );\n }\n }\n\n *#getChildBinderNodes(): Generator<BinderNode, void, void> {\n if (this.value === undefined || this.defaultValue === undefined) {\n // Undefined value cannot have child properties and items.\n return;\n }\n\n if (this.#isObject()) {\n for (const [, getter] of getObjectModelOwnAndParentGetters(this.model)) {\n const childModel = getter.call(this.model);\n // We need to skip all non-initialised optional fields here in order\n // to prevent infinite recursion for circular references in the model.\n // Here we rely on presence of keys in `defaultValue` to detect all\n // initialised fields. The keys in `defaultValue` are defined for all\n // non-optional fields plus those optional fields whose values were\n // set from initial `binder.read()` or `binder.clear()` or by using a\n // binder node (e.g., form binding) for a nested field.\n if (childModel[_key] in (this.defaultValue as Record<never, never>)) {\n yield getBinderNode(childModel);\n }\n }\n } else if (this.#isArray()) {\n for (const childBinderNode of this.model) {\n yield childBinderNode;\n }\n }\n }\n\n #isArray(): this is BinderNode<ArrayModel> {\n return this.model instanceof ArrayModel;\n }\n\n #isArrayItem(): this is ArrayItemBinderNode<M> {\n return this.model[_parent] instanceof ArrayModel;\n }\n\n #isObject(): this is BinderNode<ObjectModel> {\n return this.model instanceof ObjectModel;\n }\n\n *#requestValidationOfDescendants(): Generator<Promise<readonly ValueError[]>, void, void> {\n for (const node of this.#getChildBinderNodes()) {\n yield* node.#runOwnValidators();\n yield* node.#requestValidationOfDescendants();\n }\n }\n\n *#requestValidationWithAncestors(): Generator<Promise<readonly ValueError[]>, void, void> {\n yield* this.#runOwnValidators();\n\n if (this.parent) {\n yield* this.parent.#requestValidationWithAncestors();\n }\n }\n\n *#runOwnValidators(): Generator<Promise<readonly ValueError[]>, void, void> {\n const hasInvalidState = this[_validity] && !this[_validity].valid;\n const hasBadInput = !!this[_validity]?.badInput;\n\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing\n if ((hasInvalidState && !hasBadInput) || !hasInvalidState) {\n for (const validator of this.#validators) {\n yield this.binder.requestValidation(this.model, validator);\n }\n }\n\n if (hasInvalidState) {\n yield this.binder.requestValidation(this.model, this.#validityStateValidator);\n }\n }\n\n initializeValue(forceInitialize = false): void {\n // First, make sure parents have value initialized\n if (\n this.parent &&\n (this.parent.value === undefined || (this.parent.defaultValue as Value<M> | undefined) === undefined)\n ) {\n this.parent.initializeValue(true);\n }\n\n const key = this.model[_key];\n let value: Value<M> | undefined = this.parent\n ? (this.parent.value as { [key in typeof key]: Value<M> })[this.model[_key]]\n : undefined;\n\n const defaultValue: Value<M> | undefined = this.parent\n ? (this.parent.defaultValue as { readonly [key in typeof key]: Value<M> })[this.model[_key]]\n : undefined;\n\n if (value === undefined) {\n // Initialize value if this is the root level node, or it is enforced\n if (forceInitialize || !this.parent) {\n value = this.model.constructor.createEmptyValue() as Value<M>;\n this.#setValueState(value, defaultValue === undefined ? value : defaultValue);\n } else if (\n this.parent.model instanceof ObjectModel &&\n !(key in ((this.parent.value || {}) as { [key in typeof key]?: Value<M> }))\n ) {\n this.#setValueState(undefined, defaultValue === undefined ? value : defaultValue);\n }\n }\n }\n\n #setValueState(value: Value<M> | undefined, defaultValue: Value<M> | undefined): void {\n const { parent } = this;\n if (parent) {\n const key = this.model[_key];\n const parentValue = updateObjectOrArrayKey(parent.model, parent.value, key, value);\n const keepPristine = value === defaultValue && parent.value === parent.defaultValue;\n if (keepPristine) {\n // Keep value and defaultValue equal, so that `dirty` stays false\n parent.#setValueState(parentValue, parentValue);\n } else if (defaultValue !== undefined) {\n // Update value and defaultValue at the same time with different content\n const parentDefaultValue = updateObjectOrArrayKey(parent.model, parent.defaultValue, key, defaultValue);\n parent.#setValueState(parentValue, parentDefaultValue);\n } else {\n parent.#setValueState(parentValue, undefined);\n }\n } else {\n // Root level model - update the binder root\n const binder = this as unknown as BinderRoot<M>;\n if (defaultValue !== undefined) {\n binder.defaultValue = defaultValue;\n }\n binder.value = value!;\n }\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/* eslint-disable @typescript-eslint/prefer-nullish-coalescing */\n/*\n * Copyright 2000-2020 Vaadin Ltd.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy of\n * the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n// TODO: Fix dependency cycle\n\nimport type { BinderRoot } from './BinderRoot.js';\nimport {\n _createEmptyItemValue,\n _key,\n _parent,\n _validators,\n AbstractModel,\n type ArrayItemModel,\n ArrayModel,\n getObjectModelOwnAndParentGetters,\n ObjectModel,\n type Value,\n} from './Models.js';\nimport type { ClassStaticProperties } from './types.js';\nimport type { Validator, ValueError } from './Validation.js';\nimport { ValidityStateValidator } from './Validators.js';\nimport { _validity } from './Validity.js';\n\nexport const _updateValidation = Symbol('updateValidation');\nexport const _update = Symbol('update');\nexport const _setErrorsWithDescendants = Symbol('setErrorsWithDescendants');\nexport const _clearValidation = Symbol('clearValidation');\n\nconst nodes = new WeakMap<AbstractModel, BinderNode>();\n\nexport function getBinderNode<M extends AbstractModel>(model: M): BinderNode<M> {\n let node = nodes.get(model);\n\n if (!node) {\n node = new BinderNode(model);\n nodes.set(model, node);\n }\n\n return node as BinderNode<M>;\n}\n\nfunction getErrorPropertyName(valueError: ValueError): string {\n return typeof valueError.property === 'string' ? valueError.property : getBinderNode(valueError.property).name;\n}\n\nfunction updateObjectOrArrayKey<M extends AbstractModel>(\n model: M,\n value: Value<M>,\n key: keyof any,\n keyValue: unknown,\n): Value<M> {\n if (model instanceof ObjectModel) {\n // Value contained in object - replace object in parent\n return {\n ...(value as Record<never, never> & Value<M>),\n [key]: keyValue,\n };\n }\n\n if (keyValue === undefined) {\n throw new TypeError('Unexpected undefined value');\n }\n\n if (model instanceof ArrayModel) {\n // Value contained in array - replace array in parent\n const array = (value as unknown[]).slice();\n array[key as number] = keyValue;\n return array as Value<M>;\n }\n\n throw new TypeError(`Unknown model type ${(model as AbstractModel).constructor.name}`);\n}\n\nexport const CHANGED = new Event('binder-node-changed');\n\nclass NotArrayModelError extends Error {\n constructor() {\n super('The model does not represent array');\n }\n}\n\nclass NotArrayItemModelError extends Error {\n constructor() {\n super('The model does not represent array item');\n }\n}\n\ndeclare class ArrayItemBinderNode<M extends AbstractModel> extends BinderNode<M> {\n // @ts-expect-error: re-defining the parent getter.\n declare readonly parent: BinderNode<ArrayModel<M>>;\n}\n\nconst defaultArrayItemCache = new WeakMap<BinderNode, unknown>();\n\n/**\n * The BinderNode\\<M\\> class provides the form binding related APIs\n * with respect to a particular model instance.\n *\n * Structurally, model instances form a tree, in which the object\n * and array models have child nodes of field and array item model\n * instances.\n */\nexport class BinderNode<M extends AbstractModel = AbstractModel> extends EventTarget {\n declare readonly ['constructor']: ClassStaticProperties<typeof BinderNode<M>>;\n readonly model: M;\n /**\n * The validity state read from the bound element, if any. Represents the\n * HTML element internal validation.\n *\n * For elements with `validity.valid === false`, the value in the\n * bound element is considered as invalid.\n */\n [_validity]?: ValidityState;\n #ownErrors?: ReadonlyArray<ValueError<Value<M>>>;\n #validators: ReadonlyArray<Validator<Value<M>>>;\n readonly #validityStateValidator: ValidityStateValidator<Value<M>>;\n #visited = false;\n\n constructor(model: M) {\n super();\n this.model = model;\n nodes.set(model, this);\n this.#validityStateValidator = new ValidityStateValidator<Value<M>>();\n this.#validators = model[_validators];\n\n // Workaround for children initialization with private props\n if (this.constructor === BinderNode) {\n this.initializeValue();\n }\n }\n\n /**\n * The binder for the top-level model.\n */\n get binder(): BinderRoot {\n const binder = this.parent?.binder;\n\n if (!binder) {\n throw new TypeError('BinderNode is detached');\n }\n\n return binder;\n }\n\n /**\n * The default value related to the model\n */\n get defaultValue(): Value<M> | undefined {\n const key = this.model[_key];\n const parentDefaultValue = this.parent!.defaultValue as { readonly [key in typeof key]?: Value<M> };\n\n if (this.#isArrayItem() && !(key in parentDefaultValue)) {\n if (defaultArrayItemCache.has(this.parent)) {\n return defaultArrayItemCache.get(this.parent) as Value<M>;\n }\n\n const value = this.model.constructor.createEmptyValue();\n defaultArrayItemCache.set(this.parent, value);\n return value as Value<M>;\n }\n\n return parentDefaultValue[key];\n }\n\n /**\n * True if the current value is different from the defaultValue.\n */\n get dirty(): boolean {\n return this.value !== this.defaultValue;\n }\n\n /**\n * The combined array of all errors for this node\u2019s model and all its nested\n * models\n */\n get errors(): readonly ValueError[] {\n return [...Array.from(this.#getChildBinderNodes(), (node) => node.errors).flat(), ...this.ownErrors];\n }\n\n /**\n * Indicates if there is any error for the node's model.\n */\n get invalid(): boolean {\n return this.errors.length > 0;\n }\n\n /**\n * The name generated from the model structure, used to set the name\n * attribute on the field components.\n */\n get name(): string {\n let { model }: { model: AbstractModel } = this;\n let name = '';\n\n while (model[_parent] instanceof AbstractModel) {\n name = `${String(model[_key])}${name ? `.${name}` : ''}`;\n model = model[_parent];\n }\n\n return name;\n }\n\n /**\n * The array of validation errors directly related with the model.\n */\n get ownErrors(): ReadonlyArray<ValueError<Value<M>>> {\n return this.#ownErrors ? this.#ownErrors : [];\n }\n\n /**\n * The parent node, if this binder node corresponds to a nested model,\n * otherwise undefined for the top-level binder.\n */\n get parent(): BinderNode | undefined {\n const modelParent = this.model[_parent];\n return modelParent instanceof AbstractModel ? getBinderNode(modelParent) : undefined;\n }\n\n /**\n * True if the value is required to be non-empty.\n */\n get required(): boolean {\n return this.#validators.some((validator) => validator.impliesRequired);\n }\n\n /**\n * The array of validators for the model. The default value is defined in the\n * model.\n */\n get validators(): ReadonlyArray<Validator<Value<M>>> {\n return this.#validators;\n }\n\n set validators(validators: ReadonlyArray<Validator<Value<M>>>) {\n this.#validators = validators;\n this.dispatchEvent(CHANGED);\n }\n\n /**\n * The current value related to the model\n */\n get value(): Value<M> | undefined {\n if (!this.parent) {\n return undefined;\n }\n\n this.initializeValue();\n\n const key = this.model[_key];\n\n // The value of parent in unknown, so we need to cast it.\n type ParentValue = { readonly [K in typeof key]: Value<M> };\n return (this.parent.value as ParentValue)[key];\n }\n\n set value(value: Value<M> | undefined) {\n this.initializeValue(true);\n this.#setValueState(value, undefined);\n }\n\n /**\n * True if the bound field was ever focused and blurred by the user.\n */\n get visited(): boolean {\n return this.#visited;\n }\n\n set visited(v: boolean) {\n if (this.#visited !== v) {\n this.#visited = v;\n this[_updateValidation]().catch(() => {});\n this.dispatchEvent(CHANGED);\n }\n }\n\n /**\n * A helper method to add a validator\n *\n * @param validator - a validator\n */\n addValidator(validator: Validator<Value<M>>): void {\n this.validators = [...this.#validators, validator];\n this.dispatchEvent(CHANGED);\n }\n\n /**\n * Append an item to the array value.\n *\n * Requires the context model to be an array reference.\n *\n * @param item - optional new item value, an empty item is\n * appended if the argument is omitted\n */\n appendItem(item?: Value<ArrayItemModel<M>>): void {\n if (this.#isArray()) {\n const itemValueOrEmptyValue = item ?? this.model[_createEmptyItemValue]();\n const newValue = [...(this.value ?? []), itemValueOrEmptyValue];\n const newDefaultValue = [...(this.defaultValue ?? []), itemValueOrEmptyValue];\n this.#setValueState(newValue, newDefaultValue);\n } else {\n throw new NotArrayModelError();\n }\n }\n\n /**\n * Returns a binder node for the nested model instance.\n *\n * @param model - The nested model instance\n */\n for<N extends AbstractModel>(model: N): BinderNode<N> {\n const binderNode = getBinderNode(model);\n if (binderNode.binder !== this.binder) {\n throw new Error('Unknown binder');\n }\n\n return binderNode;\n }\n\n prependItem(item?: Value<ArrayItemModel<M>>): void {\n if (this.#isArray()) {\n const itemValueOrEmptyValue = item ?? this.model[_createEmptyItemValue]();\n const newValue = [itemValueOrEmptyValue, ...(this.value ?? [])];\n const newDefaultValue = [itemValueOrEmptyValue, ...(this.defaultValue ?? [])];\n this.#setValueState(newValue, newDefaultValue);\n } else {\n throw new NotArrayModelError();\n }\n }\n\n removeSelf(): void {\n if (this.#isArrayItem()) {\n const newValue = (this.parent.value ?? []).filter((_, i) => i !== this.model[_key]);\n const newDefaultValue = (this.parent.defaultValue ?? []).filter((_, i) => i !== this.model[_key]);\n this.parent.#setValueState(newValue, newDefaultValue);\n } else {\n throw new NotArrayItemModelError();\n }\n }\n\n /**\n * Runs all validation callbacks potentially affecting this\n * or any nested model. Returns the combined array of all\n * errors as in the errors property.\n */\n async validate(): Promise<readonly ValueError[]> {\n const errors = await Promise.all([\n ...this.#requestValidationOfDescendants(),\n ...this.#requestValidationWithAncestors(),\n ]).then((arr) => arr.flat());\n this[_setErrorsWithDescendants](errors.length ? errors : undefined);\n this[_update]();\n return errors;\n }\n\n protected [_clearValidation](): boolean {\n if (this.#visited) {\n this.#visited = false;\n this.dispatchEvent(CHANGED);\n }\n let needsUpdate = false;\n if (this.#ownErrors) {\n this.#ownErrors = undefined;\n needsUpdate = true;\n this.dispatchEvent(CHANGED);\n }\n if ([...this.#getChildBinderNodes()].filter((childBinderNode) => childBinderNode[_clearValidation]()).length > 0) {\n needsUpdate = true;\n }\n return needsUpdate;\n }\n\n protected [_setErrorsWithDescendants](errors?: readonly ValueError[]): void {\n const { name } = this;\n const ownErrors = errors\n ? (errors.filter((valueError) => getErrorPropertyName(valueError) === name) as ReadonlyArray<\n ValueError<Value<M>>\n >)\n : undefined;\n const relatedErrors = errors\n ? errors.filter((valueError) => getErrorPropertyName(valueError).startsWith(name))\n : undefined;\n this.#ownErrors = ownErrors;\n for (const childBinderNode of this.#getChildBinderNodes()) {\n childBinderNode[_setErrorsWithDescendants](relatedErrors);\n }\n this.dispatchEvent(CHANGED);\n }\n\n protected [_update](_?: Value<M>): void {\n if (this.parent) {\n this.parent[_update]();\n }\n }\n\n protected async [_updateValidation](): Promise<void> {\n if (this.#visited) {\n await this.validate();\n } else if (this.dirty || this.invalid) {\n await Promise.all(\n [...this.#getChildBinderNodes()].map(async (childBinderNode) => childBinderNode[_updateValidation]()),\n );\n }\n }\n\n *#getChildBinderNodes(): Generator<BinderNode, void, void> {\n if (this.value === undefined || this.defaultValue === undefined) {\n // Undefined value cannot have child properties and items.\n return;\n }\n\n if (this.#isObject()) {\n for (const [, getter] of getObjectModelOwnAndParentGetters(this.model)) {\n const childModel = getter.call(this.model);\n // We need to skip all non-initialised optional fields here in order\n // to prevent infinite recursion for circular references in the model.\n // Here we rely on presence of keys in `defaultValue` to detect all\n // initialised fields. The keys in `defaultValue` are defined for all\n // non-optional fields plus those optional fields whose values were\n // set from initial `binder.read()` or `binder.clear()` or by using a\n // binder node (e.g., form binding) for a nested field.\n if (childModel[_key] in (this.defaultValue as Record<never, never>)) {\n yield getBinderNode(childModel);\n }\n }\n } else if (this.#isArray()) {\n for (const childBinderNode of this.model) {\n yield childBinderNode;\n }\n }\n }\n\n #isArray(): this is BinderNode<ArrayModel> {\n return this.model instanceof ArrayModel;\n }\n\n #isArrayItem(): this is ArrayItemBinderNode<M> {\n return this.model[_parent] instanceof ArrayModel;\n }\n\n #isObject(): this is BinderNode<ObjectModel> {\n return this.model instanceof ObjectModel;\n }\n\n *#requestValidationOfDescendants(): Generator<Promise<readonly ValueError[]>, void, void> {\n for (const node of this.#getChildBinderNodes()) {\n yield* node.#runOwnValidators();\n yield* node.#requestValidationOfDescendants();\n }\n }\n\n *#requestValidationWithAncestors(): Generator<Promise<readonly ValueError[]>, void, void> {\n yield* this.#runOwnValidators();\n\n if (this.parent) {\n yield* this.parent.#requestValidationWithAncestors();\n }\n }\n\n *#runOwnValidators(): Generator<Promise<readonly ValueError[]>, void, void> {\n const hasInvalidState = this[_validity] && !this[_validity].valid;\n const hasBadInput = !!this[_validity]?.badInput;\n\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing\n if ((hasInvalidState && !hasBadInput) || !hasInvalidState) {\n for (const validator of this.#validators) {\n yield this.binder.requestValidation(this.model, validator);\n }\n }\n\n if (hasInvalidState) {\n yield this.binder.requestValidation(this.model, this.#validityStateValidator);\n }\n }\n\n initializeValue(forceInitialize = false): void {\n // First, make sure parents have value initialized\n if (\n this.parent &&\n (this.parent.value === undefined || (this.parent.defaultValue as Value<M> | undefined) === undefined)\n ) {\n this.parent.initializeValue(true);\n }\n\n const key = this.model[_key];\n let value: Value<M> | undefined = this.parent\n ? (this.parent.value as { [key in typeof key]: Value<M> })[this.model[_key]]\n : undefined;\n\n const defaultValue: Value<M> | undefined = this.parent\n ? (this.parent.defaultValue as { readonly [key in typeof key]: Value<M> })[this.model[_key]]\n : undefined;\n\n if (value === undefined) {\n // Initialize value if this is the root level node, or it is enforced\n if (forceInitialize || !this.parent) {\n value = this.model.constructor.createEmptyValue() as Value<M>;\n this.#setValueState(value, defaultValue === undefined ? value : defaultValue);\n } else if (\n this.parent.model instanceof ObjectModel &&\n !(key in ((this.parent.value || {}) as { [key in typeof key]?: Value<M> }))\n ) {\n this.#setValueState(undefined, defaultValue === undefined ? value : defaultValue);\n }\n }\n }\n\n #setValueState(value: Value<M> | undefined, defaultValue: Value<M> | undefined): void {\n const { parent } = this;\n if (parent) {\n const key = this.model[_key];\n const parentValue = updateObjectOrArrayKey(parent.model, parent.value, key, value);\n const keepPristine = value === defaultValue && parent.value === parent.defaultValue;\n if (keepPristine) {\n // Keep value and defaultValue equal, so that `dirty` stays false\n parent.#setValueState(parentValue, parentValue);\n } else if (defaultValue !== undefined) {\n // Update value and defaultValue at the same time with different content\n const parentDefaultValue = updateObjectOrArrayKey(parent.model, parent.defaultValue, key, defaultValue);\n parent.#setValueState(parentValue, parentDefaultValue);\n } else {\n parent.#setValueState(parentValue, undefined);\n }\n } else {\n // Root level model - update the binder root\n const binder = this as unknown as BinderRoot<M>;\n if (defaultValue !== undefined) {\n binder.defaultValue = defaultValue;\n }\n binder.value = value!;\n }\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
package/index.js CHANGED
@@ -2,7 +2,7 @@ function __REGISTER__(feature, vaadinObj = window.Vaadin ??= {}) {
2
2
  vaadinObj.registrations ??= [];
3
3
  vaadinObj.registrations.push({
4
4
  is: feature ? `${"@vaadin/hilla-lit-form"}/${feature}` : "@vaadin/hilla-lit-form",
5
- version: "24.7.0-alpha3"
5
+ version: "24.7.0-alpha5"
6
6
  });
7
7
  }
8
8
  export * from "./Binder.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vaadin/hilla-lit-form",
3
- "version": "24.7.0-alpha3",
3
+ "version": "24.7.0-alpha5",
4
4
  "description": "Hilla form utils",
5
5
  "main": "index.js",
6
6
  "module": "index.js",
@@ -71,7 +71,7 @@
71
71
  "access": "public"
72
72
  },
73
73
  "dependencies": {
74
- "@vaadin/hilla-frontend": "24.7.0-alpha3",
74
+ "@vaadin/hilla-frontend": "24.7.0-alpha5",
75
75
  "validator": "^13.12.0"
76
76
  },
77
77
  "peerDependencies": {