@vaadin/hilla-lit-form 25.2.0-alpha2 → 25.2.0-alpha4

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
@@ -329,8 +329,7 @@ export class BinderNode extends EventTarget {
329
329
  value = createEmptyValue(this.model);
330
330
  __classPrivateFieldGet(this, _BinderNode_instances, "m", _BinderNode_setValueState).call(this, value, defaultValue === undefined ? value : defaultValue);
331
331
  }
332
- else if (this.parent.model instanceof BinderObjectModel &&
333
- !(key in (this.parent.value || {}))) {
332
+ else if (this.parent.model instanceof BinderObjectModel && !(key in Object(this.parent.value ?? {}))) {
334
333
  __classPrivateFieldGet(this, _BinderNode_instances, "m", _BinderNode_setValueState).call(this, undefined, defaultValue === undefined ? value : defaultValue);
335
334
  }
336
335
  }
package/BinderNode.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"BinderNode.js","sourceRoot":"","sources":["src/BinderNode.ts"],"names":[],"mappings":"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","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\nimport m, {\n $defaultValue,\n $key,\n $optional,\n $owner,\n NumberModel,\n $constraints,\n type Constraint,\n Null,\n NotNull,\n AssertTrue,\n AssertFalse,\n Min,\n Max,\n DecimalMin,\n Negative,\n NegativeOrZero,\n Positive,\n PositiveOrZero,\n Size,\n Digits,\n Past,\n // PastOrPresent, // not supported\n Future,\n // FutureOrPresent, // not supported\n Pattern,\n NotEmpty,\n NotBlank,\n Email,\n type NonAttributedConstraint,\n Model,\n ArrayModel,\n ObjectModel,\n $itemModel,\n} from '@vaadin/hilla-models';\nimport type { Constructor, EmptyObject } from 'type-fest';\nimport type { BinderRoot } from './BinderRoot.js';\nimport {\n _createEmptyItemValue,\n _validators,\n AbstractModel,\n type ArrayItemModel,\n ArrayModel as BinderArrayModel,\n getObjectModelOwnAndParentGetters,\n ObjectModel as BinderObjectModel,\n type Value,\n} from './Models.js';\nimport type { ProvisionalModel } from './ProvisionalModel.js';\nimport type { ClassStaticProperties } from './types.js';\nimport type { Validator, ValueError } from './Validation.js';\nimport * as Validators 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<ProvisionalModel, BinderNode>();\n\n/**\n * Given the model instance attached to the BinderNode, returns the corresponding BinderNode.\n *\n * @param model - The model instance\n * @returns The corresponding BinderNode\n */\nexport function getBinderNode<M extends ProvisionalModel>(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\n/**\n * Returns the corresponding validator for the given constraint.\n *\n * @param constraint - The constraint to get the validator for\n * @returns The corresponding validator\n */\nfunction getConstraintValidator<T>(constraint: Constraint<T>): Validator<T> {\n const constraintTypes = [\n Null,\n NotNull,\n AssertTrue,\n AssertFalse,\n Min,\n Max,\n DecimalMin,\n Negative,\n NegativeOrZero,\n Positive,\n PositiveOrZero,\n Size,\n Digits,\n Past,\n // PastOrPresent, // not supported\n Future,\n // FutureOrPresent, // not supported\n Pattern,\n NotEmpty,\n NotBlank,\n Email,\n ];\n for (const constraintType of constraintTypes) {\n if (m.isConstraint(constraint, constraintType as NonAttributedConstraint)) {\n // eslint-disable-next-line import/namespace\n const Validator = Validators[constraintType.name] as Constructor<\n Validator<T>,\n EmptyObject extends typeof constraint.attributes\n ? [typeof constraint.attributes | undefined]\n : [typeof constraint.attributes]\n >;\n return new Validator(constraint.attributes);\n }\n }\n throw new Error(`Unsupported constraint: ${constraint.name}`);\n}\n\n/**\n * Returns the array of validators for the given model.\n *\n * @param model - The model to get the validators for\n * @returns The array of validators\n */\nfunction getModelValidators<M extends ProvisionalModel>(model: M): ReadonlyArray<Validator<Value<M>>> {\n if (model instanceof AbstractModel) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n return model[_validators];\n }\n\n const validators: Array<Validator<Value<M>>> =\n model instanceof NumberModel ? [new Validators.IsNumber(model[$optional]) as Validator<Value<M>>] : [];\n\n for (const constraint of model[$constraints]) {\n const validator = getConstraintValidator<Value<M>>(constraint);\n validators.push(validator);\n }\n\n return validators;\n}\n\nfunction createEmptyValue<M extends ProvisionalModel>(model: M) {\n if (model instanceof AbstractModel) {\n return model.constructor.createEmptyValue();\n }\n\n return model[$defaultValue];\n}\n\nfunction createEmptyArrayItemValue<M extends ArrayModel | BinderArrayModel>(model: M): ArrayItemModel<M> {\n return (\n model instanceof BinderArrayModel ? model[_createEmptyItemValue]() : model[$itemModel][$defaultValue]\n ) as ArrayItemModel<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 ProvisionalModel>(\n model: M,\n value: Value<M>,\n key: keyof any,\n keyValue: unknown,\n): Value<M> {\n if (model instanceof BinderObjectModel || 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 BinderArrayModel || 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.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 ProvisionalModel> extends BinderNode<M> {\n // @ts-expect-error: re-defining the parent getter.\n declare readonly parent: BinderNode<BinderArrayModel<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 ProvisionalModel = ProvisionalModel> 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: Validators.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 Validators.ValidityStateValidator<Value<M>>();\n this.#validators = getModelValidators(model);\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<Partial<Record<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 = createEmptyValue(this.model);\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’s 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: ProvisionalModel } = this;\n let name = '';\n\n while (model[$owner] instanceof AbstractModel || model[$owner] instanceof Model) {\n name = `${String(model[$key])}${name ? `.${name}` : ''}`;\n model = model[$owner];\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[$owner];\n return modelParent instanceof AbstractModel || modelParent instanceof Model\n ? getBinderNode(modelParent)\n : 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 // Retrieve the value from the parent's value using the key from the model.\n const key = this.model[$key];\n\n // The value of parent in unknown, so we need to cast it.\n type ParentValue = Readonly<Record<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 const oldValue = this.value;\n if (value !== oldValue) {\n this.#setValueState(value, undefined);\n this[_updateValidation]().catch(() => {});\n }\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.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 ?? createEmptyArrayItemValue(this.model);\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 ProvisionalModel>(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 ?? createEmptyArrayItemValue(this.model);\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 // Removing item in a read-only array involves computing a new array with\n // the current item filtered out by numeric index obtained from `$key`.\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.invalid) {\n await this.validate();\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.model instanceof BinderObjectModel) {\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.model instanceof BinderArrayModel) {\n for (const childBinderNode of this.model) {\n yield childBinderNode;\n }\n } else if (this.model instanceof ObjectModel) {\n // eslint-disable-next-line @typescript-eslint/no-for-in-array,no-restricted-syntax\n for (const propName in 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 (propName in (this.defaultValue as Record<never, never>)) {\n yield getBinderNode((this.model as unknown as Record<string, Model>)[propName]);\n }\n }\n } else if (this.model instanceof ArrayModel) {\n for (const childModel of m.items(this.model)) {\n yield getBinderNode(childModel);\n }\n }\n }\n\n #isArray(): this is BinderNode<ArrayModel | BinderArrayModel> {\n return this.model instanceof ArrayModel || this.model instanceof BinderArrayModel;\n }\n\n #isArrayItem(): this is ArrayItemBinderNode<M> {\n return this.model[$owner] instanceof BinderArrayModel || this.model[$owner] instanceof ArrayModel;\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 Record<typeof key, Value<M>>)[this.model[$key]]\n : undefined;\n\n const defaultValue: Value<M> | undefined = this.parent\n ? (this.parent.defaultValue as Readonly<Record<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 = createEmptyValue(this.model) as Value<M>;\n this.#setValueState(value, defaultValue === undefined ? value : defaultValue);\n } else if (\n this.parent.model instanceof BinderObjectModel &&\n !(key in ((this.parent.value || {}) as Partial<Record<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"]}
1
+ {"version":3,"file":"BinderNode.js","sourceRoot":"","sources":["src/BinderNode.ts"],"names":[],"mappings":";;;;;;;;;;;;AAiBA,OAAO,CAAC,EAAE,EACR,aAAa,EACb,IAAI,EACJ,SAAS,EACT,MAAM,EACN,WAAW,EACX,YAAY,EAEZ,IAAI,EACJ,OAAO,EACP,UAAU,EACV,WAAW,EACX,GAAG,EACH,GAAG,EACH,UAAU,EACV,QAAQ,EACR,cAAc,EACd,QAAQ,EACR,cAAc,EACd,IAAI,EACJ,MAAM,EACN,IAAI,EAEJ,MAAM,EAEN,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,KAAK,EAEL,KAAK,EACL,UAAU,EACV,WAAW,EACX,UAAU,GACX,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EACL,qBAAqB,EACrB,WAAW,EACX,aAAa,EAEb,UAAU,IAAI,gBAAgB,EAC9B,iCAAiC,EACjC,WAAW,IAAI,iBAAiB,GAEjC,MAAM,aAAa,CAAC;AAIrB,OAAO,KAAK,UAAU,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE1C,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAC,kBAAkB,CAAC,CAAC;AAC5D,MAAM,CAAC,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;AACxC,MAAM,CAAC,MAAM,yBAAyB,GAAG,MAAM,CAAC,0BAA0B,CAAC,CAAC;AAC5E,MAAM,CAAC,MAAM,gBAAgB,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAC;AAE1D,MAAM,KAAK,GAAG,IAAI,OAAO,EAAgC,CAAC;AAQ1D,MAAM,UAAU,aAAa,CAA6B,KAAQ;IAChE,IAAI,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAE5B,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,IAAI,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC;QAC7B,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACzB,CAAC;IAED,OAAO,IAAqB,CAAC;AAC/B,CAAC;AAQD,SAAS,sBAAsB,CAAI,UAAyB;IAC1D,MAAM,eAAe,GAAG;QACtB,IAAI;QACJ,OAAO;QACP,UAAU;QACV,WAAW;QACX,GAAG;QACH,GAAG;QACH,UAAU;QACV,QAAQ;QACR,cAAc;QACd,QAAQ;QACR,cAAc;QACd,IAAI;QACJ,MAAM;QACN,IAAI;QAEJ,MAAM;QAEN,OAAO;QACP,QAAQ;QACR,QAAQ;QACR,KAAK;KACN,CAAC;IACF,KAAK,MAAM,cAAc,IAAI,eAAe,EAAE,CAAC;QAC7C,IAAI,CAAC,CAAC,YAAY,CAAC,UAAU,EAAE,cAAyC,CAAC,EAAE,CAAC;YAE1E,MAAM,SAAS,GAAG,UAAU,CAAC,cAAc,CAAC,IAAI,CAK/C,CAAC;YACF,OAAO,IAAI,SAAS,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,2BAA2B,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;AAChE,CAAC;AAQD,SAAS,kBAAkB,CAA6B,KAAQ;IAC9D,IAAI,KAAK,YAAY,aAAa,EAAE,CAAC;QAEnC,OAAO,KAAK,CAAC,WAAW,CAAC,CAAC;IAC5B,CAAC;IAED,MAAM,UAAU,GACd,KAAK,YAAY,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CAAwB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAEzG,KAAK,MAAM,UAAU,IAAI,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC;QAC7C,MAAM,SAAS,GAAG,sBAAsB,CAAW,UAAU,CAAC,CAAC;QAC/D,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC7B,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,SAAS,gBAAgB,CAA6B,KAAQ;IAC5D,IAAI,KAAK,YAAY,aAAa,EAAE,CAAC;QACnC,OAAO,KAAK,CAAC,WAAW,CAAC,gBAAgB,EAAE,CAAC;IAC9C,CAAC;IAED,OAAO,KAAK,CAAC,aAAa,CAAC,CAAC;AAC9B,CAAC;AAED,SAAS,yBAAyB,CAA0C,KAAQ;IAClF,OAAO,CACL,KAAK,YAAY,gBAAgB,CAAC,CAAC,CAAC,KAAK,CAAC,qBAAqB,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,aAAa,CAAC,CACjF,CAAC;AACzB,CAAC;AAED,SAAS,oBAAoB,CAAC,UAAsB;IAClD,OAAO,OAAO,UAAU,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC;AACjH,CAAC;AAED,SAAS,sBAAsB,CAC7B,KAAQ,EACR,KAAe,EACf,GAAc,EACd,QAAiB;IAEjB,IAAI,KAAK,YAAY,iBAAiB,IAAI,KAAK,YAAY,WAAW,EAAE,CAAC;QAEvE,OAAO;YACL,GAAI,KAAyC;YAC7C,CAAC,GAAG,CAAC,EAAE,QAAQ;SAChB,CAAC;IACJ,CAAC;IAED,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,MAAM,IAAI,SAAS,CAAC,4BAA4B,CAAC,CAAC;IACpD,CAAC;IAED,IAAI,KAAK,YAAY,gBAAgB,IAAI,KAAK,YAAY,UAAU,EAAE,CAAC;QAErE,MAAM,KAAK,GAAI,KAAmB,CAAC,KAAK,EAAE,CAAC;QAC3C,KAAK,CAAC,GAAa,CAAC,GAAG,QAAQ,CAAC;QAChC,OAAO,KAAiB,CAAC;IAC3B,CAAC;IAED,MAAM,IAAI,SAAS,CAAC,sBAAsB,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;AACtE,CAAC;AAED,MAAM,CAAC,MAAM,OAAO,GAAG,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;AAExD,MAAM,kBAAmB,SAAQ,KAAK;IACpC;QACE,KAAK,CAAC,oCAAoC,CAAC,CAAC;IAC9C,CAAC;CACF;AAED,MAAM,sBAAuB,SAAQ,KAAK;IACxC;QACE,KAAK,CAAC,yCAAyC,CAAC,CAAC;IACnD,CAAC;CACF;AAOD,MAAM,qBAAqB,GAAG,IAAI,OAAO,EAAuB,CAAC;AAUjE,MAAM,OAAO,UAA0D,SAAQ,WAAW;IAgBxF,YAAY,KAAQ;QAClB,KAAK,EAAE,CAAC;;QAfD;;;;;WAAS;QAQlB;;;;;WAA4B;QAC5B,wCAAiD;QACjD,yCAAgD;QACvC,qDAAqE;QAC9E,8BAAW,KAAK,EAAC;QAIf,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACvB,uBAAA,IAAI,sCAA2B,IAAI,UAAU,CAAC,sBAAsB,EAAY,MAAA,CAAC;QACjF,uBAAA,IAAI,0BAAe,kBAAkB,CAAC,KAAK,CAAC,MAAA,CAAC;QAG7C,IAAI,IAAI,CAAC,WAAW,KAAK,UAAU,EAAE,CAAC;YACpC,IAAI,CAAC,eAAe,EAAE,CAAC;QACzB,CAAC;IACH,CAAC;IAKD,IAAI,MAAM;QACR,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC;QAEnC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,SAAS,CAAC,wBAAwB,CAAC,CAAC;QAChD,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAKD,IAAI,YAAY;QACd,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7B,MAAM,kBAAkB,GAAG,IAAI,CAAC,MAAO,CAAC,YAA+D,CAAC;QAExG,IAAI,uBAAA,IAAI,sDAAa,MAAjB,IAAI,CAAe,IAAI,CAAC,CAAC,GAAG,IAAI,kBAAkB,CAAC,EAAE,CAAC;YACxD,IAAI,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC3C,OAAO,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAa,CAAC;YAC5D,CAAC;YAED,MAAM,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC3C,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAC9C,OAAO,KAAiB,CAAC;QAC3B,CAAC;QAED,OAAO,kBAAkB,CAAC,GAAG,CAAC,CAAC;IACjC,CAAC;IAKD,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,YAAY,CAAC;IAC1C,CAAC;IAMD,IAAI,MAAM;QACR,OAAO,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,uBAAA,IAAI,8DAAqB,MAAzB,IAAI,CAAuB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;IACvG,CAAC;IAKD,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;IAChC,CAAC;IAMD,IAAI,IAAI;QACN,IAAI,EAAE,KAAK,EAAE,GAAgC,IAAI,CAAC;QAClD,IAAI,IAAI,GAAG,EAAE,CAAC;QAEd,OAAO,KAAK,CAAC,MAAM,CAAC,YAAY,aAAa,IAAI,KAAK,CAAC,MAAM,CAAC,YAAY,KAAK,EAAE,CAAC;YAChF,IAAI,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YACzD,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;QACxB,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAKD,IAAI,SAAS;QACX,OAAO,uBAAA,IAAI,6BAAW,CAAC,CAAC,CAAC,uBAAA,IAAI,6BAAW,CAAC,CAAC,CAAC,EAAE,CAAC;IAChD,CAAC;IAMD,IAAI,MAAM;QACR,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACvC,OAAO,WAAW,YAAY,aAAa,IAAI,WAAW,YAAY,KAAK;YACzE,CAAC,CAAC,aAAa,CAAC,WAAW,CAAC;YAC5B,CAAC,CAAC,SAAS,CAAC;IAChB,CAAC;IAKD,IAAI,QAAQ;QACV,OAAO,uBAAA,IAAI,8BAAY,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;IACzE,CAAC;IAMD,IAAI,UAAU;QACZ,OAAO,uBAAA,IAAI,8BAAY,CAAC;IAC1B,CAAC;IAED,IAAI,UAAU,CAAC,UAA8C;QAC3D,uBAAA,IAAI,0BAAe,UAAU,MAAA,CAAC;QAC9B,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC;IAKD,IAAI,KAAK;QACP,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,IAAI,CAAC,eAAe,EAAE,CAAC;QAGvB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAI7B,OAAQ,IAAI,CAAC,MAAM,CAAC,KAAqB,CAAC,GAAG,CAAC,CAAC;IACjD,CAAC;IAED,IAAI,KAAK,CAAC,KAA2B;QACnC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAC3B,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC;QAC5B,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;YACvB,uBAAA,IAAI,wDAAe,MAAnB,IAAI,EAAgB,KAAK,EAAE,SAAS,CAAC,CAAC;YACtC,IAAI,CAAC,iBAAiB,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IAKD,IAAI,OAAO;QACT,OAAO,uBAAA,IAAI,2BAAS,CAAC;IACvB,CAAC;IAED,IAAI,OAAO,CAAC,CAAU;QACpB,IAAI,uBAAA,IAAI,2BAAS,KAAK,CAAC,EAAE,CAAC;YACxB,uBAAA,IAAI,uBAAY,CAAC,MAAA,CAAC;YAClB,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IAOD,YAAY,CAAC,SAA8B;QACzC,IAAI,CAAC,UAAU,GAAG,CAAC,GAAG,uBAAA,IAAI,8BAAY,EAAE,SAAS,CAAC,CAAC;QACnD,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC;IAUD,UAAU,CAAC,IAA+B;QACxC,IAAI,uBAAA,IAAI,kDAAS,MAAb,IAAI,CAAW,EAAE,CAAC;YACpB,MAAM,qBAAqB,GAAG,IAAI,IAAI,yBAAyB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC5E,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,qBAAqB,CAAC,CAAC;YAChE,MAAM,eAAe,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,IAAI,EAAE,CAAC,EAAE,qBAAqB,CAAC,CAAC;YAC9E,uBAAA,IAAI,wDAAe,MAAnB,IAAI,EAAgB,QAAQ,EAAE,eAAe,CAAC,CAAC;QACjD,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,kBAAkB,EAAE,CAAC;QACjC,CAAC;IACH,CAAC;IAOD,GAAG,CAA6B,KAAQ;QACtC,MAAM,UAAU,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;QACxC,IAAI,UAAU,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC;YACtC,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;QACpC,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,WAAW,CAAC,IAA+B;QACzC,IAAI,uBAAA,IAAI,kDAAS,MAAb,IAAI,CAAW,EAAE,CAAC;YACpB,MAAM,qBAAqB,GAAG,IAAI,IAAI,yBAAyB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC5E,MAAM,QAAQ,GAAG,CAAC,qBAAqB,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC;YAChE,MAAM,eAAe,GAAG,CAAC,qBAAqB,EAAE,GAAG,CAAC,IAAI,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,CAAC;YAC9E,uBAAA,IAAI,wDAAe,MAAnB,IAAI,EAAgB,QAAQ,EAAE,eAAe,CAAC,CAAC;QACjD,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,kBAAkB,EAAE,CAAC;QACjC,CAAC;IACH,CAAC;IAED,UAAU;;QACR,IAAI,uBAAA,IAAI,sDAAa,MAAjB,IAAI,CAAe,EAAE,CAAC;YAGxB,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YACpF,MAAM,eAAe,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YAClG,uBAAA,CAAA,KAAA,IAAI,CAAC,MAAM,CAAA,wDAAe,UAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;QACxD,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,sBAAsB,EAAE,CAAC;QACrC,CAAC;IACH,CAAC;IAOD,KAAK,CAAC,QAAQ;QACZ,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAC/B,GAAG,uBAAA,IAAI,yEAAgC,MAApC,IAAI,CAAkC;YACzC,GAAG,uBAAA,IAAI,yEAAgC,MAApC,IAAI,CAAkC;SAC1C,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QAC7B,IAAI,CAAC,yBAAyB,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QACpE,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAChB,OAAO,MAAM,CAAC;IAChB,CAAC;IAES,sNA1PT,SAAS,EA0PC,gBAAgB,EAAC;QAC1B,IAAI,uBAAA,IAAI,2BAAS,EAAE,CAAC;YAClB,uBAAA,IAAI,uBAAY,KAAK,MAAA,CAAC;YACtB,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAC9B,CAAC;QACD,IAAI,WAAW,GAAG,KAAK,CAAC;QACxB,IAAI,uBAAA,IAAI,6BAAW,EAAE,CAAC;YACpB,uBAAA,IAAI,yBAAc,SAAS,MAAA,CAAC;YAC5B,WAAW,GAAG,IAAI,CAAC;YACnB,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAC9B,CAAC;QACD,IAAI,CAAC,GAAG,uBAAA,IAAI,8DAAqB,MAAzB,IAAI,CAAuB,CAAC,CAAC,MAAM,CAAC,CAAC,eAAe,EAAE,EAAE,CAAC,eAAe,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACjH,WAAW,GAAG,IAAI,CAAC;QACrB,CAAC;QACD,OAAO,WAAW,CAAC;IACrB,CAAC;IAES,CAAC,yBAAyB,CAAC,CAAC,MAA8B;QAClE,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;QACtB,MAAM,SAAS,GAAG,MAAM;YACtB,CAAC,CAAE,MAAM,CAAC,MAAM,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,oBAAoB,CAAC,UAAU,CAAC,KAAK,IAAI,CAEtE;YACJ,CAAC,CAAC,SAAS,CAAC;QACd,MAAM,aAAa,GAAG,MAAM;YAC1B,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YAClF,CAAC,CAAC,SAAS,CAAC;QACd,uBAAA,IAAI,yBAAc,SAAS,MAAA,CAAC;QAC5B,KAAK,MAAM,eAAe,IAAI,uBAAA,IAAI,8DAAqB,MAAzB,IAAI,CAAuB,EAAE,CAAC;YAC1D,eAAe,CAAC,yBAAyB,CAAC,CAAC,aAAa,CAAC,CAAC;QAC5D,CAAC;QACD,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC;IAES,CAAC,OAAO,CAAC,CAAC,CAAY;QAC9B,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QACzB,CAAC;IACH,CAAC;IAES,KAAK,CAAC,CAAC,iBAAiB,CAAC;QACjC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;QACxB,CAAC;IACH,CAAC;IAsFD,eAAe,CAAC,eAAe,GAAG,KAAK;QAErC,IACE,IAAI,CAAC,MAAM;YACX,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,KAAK,SAAS,IAAK,IAAI,CAAC,MAAM,CAAC,YAAqC,KAAK,SAAS,CAAC,EACrG,CAAC;YACD,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QACpC,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,KAAK,GAAyB,IAAI,CAAC,MAAM;YAC3C,CAAC,CAAE,IAAI,CAAC,MAAM,CAAC,KAAsC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACvE,CAAC,CAAC,SAAS,CAAC;QAEd,MAAM,YAAY,GAAyB,IAAI,CAAC,MAAM;YACpD,CAAC,CAAE,IAAI,CAAC,MAAM,CAAC,YAAuD,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACxF,CAAC,CAAC,SAAS,CAAC;QAEd,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YAExB,IAAI,eAAe,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACpC,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAa,CAAC;gBACjD,uBAAA,IAAI,wDAAe,MAAnB,IAAI,EAAgB,KAAK,EAAE,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;YAChF,CAAC;iBAAM,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,YAAY,iBAAiB,IAAI,CAAC,CAAC,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;gBACvG,uBAAA,IAAI,wDAAe,MAAnB,IAAI,EAAgB,SAAS,EAAE,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;YACpF,CAAC;QACH,CAAC;IACH,CAAC;CA2BF;0CA1IC,CAAC;IACC,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;QAEhE,OAAO;IACT,CAAC;IAED,IAAI,IAAI,CAAC,KAAK,YAAY,iBAAiB,EAAE,CAAC;QAC5C,KAAK,MAAM,CAAC,EAAE,MAAM,CAAC,IAAI,iCAAiC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACvE,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAQ3C,IAAI,UAAU,CAAC,IAAI,CAAC,IAAK,IAAI,CAAC,YAAqC,EAAE,CAAC;gBACpE,MAAM,aAAa,CAAC,UAAU,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;IACH,CAAC;SAAM,IAAI,IAAI,CAAC,KAAK,YAAY,gBAAgB,EAAE,CAAC;QAClD,KAAK,MAAM,eAAe,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACzC,MAAM,eAAe,CAAC;QACxB,CAAC;IACH,CAAC;SAAM,IAAI,IAAI,CAAC,KAAK,YAAY,WAAW,EAAE,CAAC;QAE7C,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAQlC,IAAI,QAAQ,IAAK,IAAI,CAAC,YAAqC,EAAE,CAAC;gBAC5D,MAAM,aAAa,CAAE,IAAI,CAAC,KAA0C,CAAC,QAAQ,CAAC,CAAC,CAAC;YAClF,CAAC;QACH,CAAC;IACH,CAAC;SAAM,IAAI,IAAI,CAAC,KAAK,YAAY,UAAU,EAAE,CAAC;QAC5C,KAAK,MAAM,UAAU,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YAC7C,MAAM,aAAa,CAAC,UAAU,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;AACH,CAAC;IAGC,OAAO,IAAI,CAAC,KAAK,YAAY,UAAU,IAAI,IAAI,CAAC,KAAK,YAAY,gBAAgB,CAAC;AACpF,CAAC;IAGC,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,gBAAgB,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,UAAU,CAAC;AACpG,CAAC,uDAED,CAAC;IACC,KAAK,MAAM,IAAI,IAAI,uBAAA,IAAI,8DAAqB,MAAzB,IAAI,CAAuB,EAAE,CAAC;QAC/C,KAAK,CAAC,CAAC,uBAAA,IAAI,2DAAkB,MAAtB,IAAI,CAAoB,CAAC;QAChC,KAAK,CAAC,CAAC,uBAAA,IAAI,yEAAgC,MAApC,IAAI,CAAkC,CAAC;IAChD,CAAC;AACH,CAAC,uDAED,CAAC;;IACC,KAAK,CAAC,CAAC,uBAAA,IAAI,2DAAkB,MAAtB,IAAI,CAAoB,CAAC;IAEhC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,KAAK,CAAC,CAAC,uBAAA,CAAA,KAAA,IAAI,CAAC,MAAM,CAAA,yEAAgC,SAAE,CAAC;IACvD,CAAC;AACH,CAAC,yCAED,CAAC;IACC,MAAM,eAAe,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC;IAClE,MAAM,WAAW,GAAG,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,CAAC;IAGhD,IAAI,CAAC,eAAe,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;QAC1D,KAAK,MAAM,SAAS,IAAI,uBAAA,IAAI,8BAAY,EAAE,CAAC;YACzC,MAAM,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;IAED,IAAI,eAAe,EAAE,CAAC;QACpB,MAAM,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,EAAE,uBAAA,IAAI,0CAAwB,CAAC,CAAC;IAChF,CAAC;AACH,CAAC,iEA+Bc,KAA2B,EAAE,YAAkC;IAC5E,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACxB,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7B,MAAM,WAAW,GAAG,sBAAsB,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;QACnF,MAAM,YAAY,GAAG,KAAK,KAAK,YAAY,IAAI,MAAM,CAAC,KAAK,KAAK,MAAM,CAAC,YAAY,CAAC;QACpF,IAAI,YAAY,EAAE,CAAC;YAEjB,uBAAA,MAAM,wDAAe,MAArB,MAAM,EAAgB,WAAW,EAAE,WAAW,CAAC,CAAC;QAClD,CAAC;aAAM,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;YAEtC,MAAM,kBAAkB,GAAG,sBAAsB,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,YAAY,EAAE,GAAG,EAAE,YAAY,CAAC,CAAC;YACxG,uBAAA,MAAM,wDAAe,MAArB,MAAM,EAAgB,WAAW,EAAE,kBAAkB,CAAC,CAAC;QACzD,CAAC;aAAM,CAAC;YACN,uBAAA,MAAM,wDAAe,MAArB,MAAM,EAAgB,WAAW,EAAE,SAAS,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;SAAM,CAAC;QAEN,MAAM,MAAM,GAAG,IAAgC,CAAC;QAChD,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;YAC/B,MAAM,CAAC,YAAY,GAAG,YAAY,CAAC;QACrC,CAAC;QACD,MAAM,CAAC,KAAK,GAAG,KAAM,CAAC;IACxB,CAAC;AACH,CAAC","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\nimport m, {\n $defaultValue,\n $key,\n $optional,\n $owner,\n NumberModel,\n $constraints,\n type Constraint,\n Null,\n NotNull,\n AssertTrue,\n AssertFalse,\n Min,\n Max,\n DecimalMin,\n Negative,\n NegativeOrZero,\n Positive,\n PositiveOrZero,\n Size,\n Digits,\n Past,\n // PastOrPresent, // not supported\n Future,\n // FutureOrPresent, // not supported\n Pattern,\n NotEmpty,\n NotBlank,\n Email,\n type NonAttributedConstraint,\n Model,\n ArrayModel,\n ObjectModel,\n $itemModel,\n} from '@vaadin/hilla-models';\nimport type { Constructor, EmptyObject } from 'type-fest';\nimport type { BinderRoot } from './BinderRoot.js';\nimport {\n _createEmptyItemValue,\n _validators,\n AbstractModel,\n type ArrayItemModel,\n ArrayModel as BinderArrayModel,\n getObjectModelOwnAndParentGetters,\n ObjectModel as BinderObjectModel,\n type Value,\n} from './Models.js';\nimport type { ProvisionalModel } from './ProvisionalModel.js';\nimport type { ClassStaticProperties } from './types.js';\nimport type { Validator, ValueError } from './Validation.js';\nimport * as Validators 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<ProvisionalModel, BinderNode>();\n\n/**\n * Given the model instance attached to the BinderNode, returns the corresponding BinderNode.\n *\n * @param model - The model instance\n * @returns The corresponding BinderNode\n */\nexport function getBinderNode<M extends ProvisionalModel>(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\n/**\n * Returns the corresponding validator for the given constraint.\n *\n * @param constraint - The constraint to get the validator for\n * @returns The corresponding validator\n */\nfunction getConstraintValidator<T>(constraint: Constraint<T>): Validator<T> {\n const constraintTypes = [\n Null,\n NotNull,\n AssertTrue,\n AssertFalse,\n Min,\n Max,\n DecimalMin,\n Negative,\n NegativeOrZero,\n Positive,\n PositiveOrZero,\n Size,\n Digits,\n Past,\n // PastOrPresent, // not supported\n Future,\n // FutureOrPresent, // not supported\n Pattern,\n NotEmpty,\n NotBlank,\n Email,\n ];\n for (const constraintType of constraintTypes) {\n if (m.isConstraint(constraint, constraintType as NonAttributedConstraint)) {\n // eslint-disable-next-line import/namespace\n const Validator = Validators[constraintType.name] as Constructor<\n Validator<T>,\n EmptyObject extends typeof constraint.attributes\n ? [typeof constraint.attributes | undefined]\n : [typeof constraint.attributes]\n >;\n return new Validator(constraint.attributes);\n }\n }\n throw new Error(`Unsupported constraint: ${constraint.name}`);\n}\n\n/**\n * Returns the array of validators for the given model.\n *\n * @param model - The model to get the validators for\n * @returns The array of validators\n */\nfunction getModelValidators<M extends ProvisionalModel>(model: M): ReadonlyArray<Validator<Value<M>>> {\n if (model instanceof AbstractModel) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n return model[_validators];\n }\n\n const validators: Array<Validator<Value<M>>> =\n model instanceof NumberModel ? [new Validators.IsNumber(model[$optional]) as Validator<Value<M>>] : [];\n\n for (const constraint of model[$constraints]) {\n const validator = getConstraintValidator<Value<M>>(constraint);\n validators.push(validator);\n }\n\n return validators;\n}\n\nfunction createEmptyValue<M extends ProvisionalModel>(model: M) {\n if (model instanceof AbstractModel) {\n return model.constructor.createEmptyValue();\n }\n\n return model[$defaultValue];\n}\n\nfunction createEmptyArrayItemValue<M extends ArrayModel | BinderArrayModel>(model: M): ArrayItemModel<M> {\n return (\n model instanceof BinderArrayModel ? model[_createEmptyItemValue]() : model[$itemModel][$defaultValue]\n ) as ArrayItemModel<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 ProvisionalModel>(\n model: M,\n value: Value<M>,\n key: keyof any,\n keyValue: unknown,\n): Value<M> {\n if (model instanceof BinderObjectModel || 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 BinderArrayModel || 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.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 ProvisionalModel> extends BinderNode<M> {\n // @ts-expect-error: re-defining the parent getter.\n declare readonly parent: BinderNode<BinderArrayModel<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 ProvisionalModel = ProvisionalModel> 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: Validators.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 Validators.ValidityStateValidator<Value<M>>();\n this.#validators = getModelValidators(model);\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<Partial<Record<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 = createEmptyValue(this.model);\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’s 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: ProvisionalModel } = this;\n let name = '';\n\n while (model[$owner] instanceof AbstractModel || model[$owner] instanceof Model) {\n name = `${String(model[$key])}${name ? `.${name}` : ''}`;\n model = model[$owner];\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[$owner];\n return modelParent instanceof AbstractModel || modelParent instanceof Model\n ? getBinderNode(modelParent)\n : 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 // Retrieve the value from the parent's value using the key from the model.\n const key = this.model[$key];\n\n // The value of parent in unknown, so we need to cast it.\n type ParentValue = Readonly<Record<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 const oldValue = this.value;\n if (value !== oldValue) {\n this.#setValueState(value, undefined);\n this[_updateValidation]().catch(() => {});\n }\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.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 ?? createEmptyArrayItemValue(this.model);\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 ProvisionalModel>(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 ?? createEmptyArrayItemValue(this.model);\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 // Removing item in a read-only array involves computing a new array with\n // the current item filtered out by numeric index obtained from `$key`.\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.invalid) {\n await this.validate();\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.model instanceof BinderObjectModel) {\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.model instanceof BinderArrayModel) {\n for (const childBinderNode of this.model) {\n yield childBinderNode;\n }\n } else if (this.model instanceof ObjectModel) {\n // eslint-disable-next-line @typescript-eslint/no-for-in-array,no-restricted-syntax\n for (const propName in 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 (propName in (this.defaultValue as Record<never, never>)) {\n yield getBinderNode((this.model as unknown as Record<string, Model>)[propName]);\n }\n }\n } else if (this.model instanceof ArrayModel) {\n for (const childModel of m.items(this.model)) {\n yield getBinderNode(childModel);\n }\n }\n }\n\n #isArray(): this is BinderNode<ArrayModel | BinderArrayModel> {\n return this.model instanceof ArrayModel || this.model instanceof BinderArrayModel;\n }\n\n #isArrayItem(): this is ArrayItemBinderNode<M> {\n return this.model[$owner] instanceof BinderArrayModel || this.model[$owner] instanceof ArrayModel;\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 Record<typeof key, Value<M>>)[this.model[$key]]\n : undefined;\n\n const defaultValue: Value<M> | undefined = this.parent\n ? (this.parent.defaultValue as Readonly<Record<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 = createEmptyValue(this.model) as Value<M>;\n this.#setValueState(value, defaultValue === undefined ? value : defaultValue);\n } else if (this.parent.model instanceof BinderObjectModel && !(key in Object(this.parent.value ?? {}))) {\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"]}
package/BinderRoot.d.ts CHANGED
@@ -18,7 +18,7 @@ export declare class BinderRoot<M extends ProvisionalModel = ProvisionalModel> e
18
18
  constructor(modelClass: ProvisionalModelConstructor<M>, config?: BinderRootConfiguration<Value<M>>);
19
19
  get defaultValue(): Value<M>;
20
20
  set defaultValue(newValue: Value<M>);
21
- get binder(): BinderRoot;
21
+ get binder(): this;
22
22
  get value(): Value<M>;
23
23
  set value(newValue: Value<M>);
24
24
  get submitting(): boolean;
package/BinderRoot.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"BinderRoot.js","sourceRoot":"","sources":["src/BinderRoot.ts"],"names":[],"mappings":"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","sourcesContent":["import { EndpointValidationError, type ValidationErrorData } from '@vaadin/hilla-frontend/EndpointErrors.js';\nimport { $owner, Model, type Target } from '@vaadin/hilla-models';\nimport m from '@vaadin/hilla-models';\nimport { _clearValidation, _setErrorsWithDescendants, _update, BinderNode, CHANGED } from './BinderNode.js';\nimport { type FieldElement, type FieldStrategy, getDefaultFieldStrategy } from './Field.js';\nimport { type AbstractModel, createDetachedModel, type DetachedModelConstructor, type Value } from './Models.js';\nimport type { ProvisionalModel, ProvisionalModelConstructor } from './ProvisionalModel.js';\nimport type { ClassStaticProperties } from './types.js';\nimport {\n type InterpolateMessageCallback,\n runValidator,\n ServerValidator,\n ValidationError,\n type Validator,\n type ValueError,\n} from './Validation.js';\n\nexport type BinderConfiguration<T> = Readonly<{\n onChange?(oldValue?: T): void;\n onSubmit?(value: T): Promise<T | void>;\n}>;\n\nexport type BinderRootConfiguration<T> = BinderConfiguration<T> &\n Readonly<{\n context?: unknown;\n }>;\n\n/**\n * A simplified Binder that does not require a context.\n * It can be used as root when there is no Element to use as context.\n *\n * @typeParam T - Type of the value that binds to a form\n * @typeParam M - Type of the model that describes the structure of the value\n */\nexport class BinderRoot<M extends ProvisionalModel = ProvisionalModel> extends BinderNode<M> {\n static interpolateMessageCallback?: InterpolateMessageCallback<any>;\n\n #defaultValue!: Value<M>; // Initialized in the `read()` method\n\n #value!: Value<M>; // Initialized in the `read()` method\n\n readonly #emptyValue: Value<M>;\n\n #submitting = false;\n\n #validating = false;\n\n #validationRequest?: Promise<void>;\n\n readonly #config?: BinderRootConfiguration<Value<M>>;\n\n readonly #validations = new Map<ProvisionalModel, Map<Validator, Promise<readonly ValueError[]>>>();\n\n readonly #context: unknown = this;\n\n declare readonly ['constructor']: ClassStaticProperties<typeof BinderRoot<M>>;\n\n /**\n *\n * @param modelClass - The constructor (the class reference) of the form model. The Binder instantiates the top-level model\n * @param config - The options object, which can be used to config the onChange and onSubmit callbacks.\n *\n * ```\n * binder = new BinderRoot(OrderModel);\n * or\n * binder = new BinderRoot(OrderModel, {onSubmit: async (order) => {endpoint.save(order)}});\n * ```\n */\n constructor(modelClass: ProvisionalModelConstructor<M>, config?: BinderRootConfiguration<Value<M>>) {\n super(\n (modelClass instanceof Model\n ? m.attach(modelClass as M & Model, () => this as Target<Value<M>>)\n : createDetachedModel(modelClass as DetachedModelConstructor<M & AbstractModel>)) as M,\n );\n if (!(modelClass instanceof Model)) {\n // @ts-expect-error the model's parent is the binder\n this.model[$owner] = this;\n }\n this.#context = config?.context ?? this;\n this.#config = config;\n // Initialize value instead of the parent.\n this.initializeValue(true);\n this.#emptyValue = this.value;\n }\n\n /**\n * The initial value of the form, before any fields are edited by the user.\n */\n override get defaultValue(): Value<M> {\n return this.#defaultValue;\n }\n\n override set defaultValue(newValue: Value<M>) {\n this.#defaultValue = newValue;\n this.dispatchEvent(CHANGED);\n }\n\n override get binder(): BinderRoot {\n return this as BinderRoot;\n }\n\n /**\n * The current value of the form.\n */\n override get value(): Value<M> {\n return this.#value;\n }\n\n override set value(newValue: Value<M>) {\n if (newValue === this.#value) {\n return;\n }\n\n const oldValue = this.#value;\n this.#value = newValue;\n this[_update](oldValue);\n }\n\n /**\n * Indicates the submitting status of the form.\n * True if the form was submitted, but the submit promise is not resolved yet.\n */\n get submitting(): boolean {\n return this.#submitting;\n }\n\n /**\n * Indicates the validating status of the form.\n * True when there is an ongoing validation.\n */\n get validating(): boolean {\n return this.#validating;\n }\n\n /**\n * Read the given value into the form and clear validation errors. Clears the form if the value is undefined.\n *\n * @param value - The value to read, or undefined to clear.\n */\n read(value: Value<M> | null | undefined): void {\n if (value === undefined || value === null) {\n this.clear();\n return;\n }\n this.defaultValue = value;\n if (\n // Skip when no value is set yet (e.g., invoked from constructor)\n this.value &&\n // Clear validation state, then proceed if update is needed\n this[_clearValidation]() &&\n // When value is dirty, another update is coming from invoking the value\n // setter below, so we skip this one to prevent duplicate updates\n this.value === value\n ) {\n this[_update](this.value);\n }\n\n this.value = this.defaultValue;\n }\n\n /**\n * Reset the form to the previous value\n */\n reset(): void {\n this.read(this.#defaultValue);\n }\n\n /**\n * Sets the form to empty value, as defined in the Model.\n */\n clear(): void {\n this.read(this.#emptyValue);\n }\n\n /**\n * Submit the current form value to a predefined\n * onSubmit callback.\n *\n * It's a no-op if the onSubmit callback is undefined.\n */\n async submit(): Promise<Value<M> | void> {\n const onSubmit = this.#config?.onSubmit;\n if (onSubmit) {\n return this.submitTo(onSubmit);\n }\n\n return undefined;\n }\n\n /**\n * Submit the current form value to callback\n *\n * @param endpointMethod - the callback function\n */\n async submitTo<V>(endpointMethod: (value: Value<M>) => Promise<V>): Promise<V> {\n const errors = await this.validate();\n if (errors.length) {\n throw new ValidationError(errors);\n }\n\n this.#submitting = true;\n this[_update](this.value);\n this.dispatchEvent(CHANGED);\n try {\n return await endpointMethod.call(this.#context, this.value);\n } catch (error: unknown) {\n if (error instanceof EndpointValidationError && error.validationErrorData.length) {\n const valueErrors: Array<ValueError<any>> = [];\n error.validationErrorData.forEach((data: ValidationErrorData) => {\n const res =\n /Object of type '(.+)' has invalid property '(.+)' with value '(.+)', validation error: '(.+)'/u.exec(\n data.message,\n );\n const [property, value, message] = res ? res.splice(2) : [data.parameterName ?? '', undefined, data.message];\n valueErrors.push({\n message,\n // Convert property from bracket notation to dot notation\n // Example: 'orders[0].description' becomes 'orders.0.description'\n property: property.replace(/\\[(\\d+)\\]/gu, '.$1'),\n validator: new ServerValidator(message),\n value,\n validatorMessage: data.validatorMessage,\n });\n });\n this[_setErrorsWithDescendants](valueErrors);\n throw new ValidationError(valueErrors);\n }\n\n throw error;\n } finally {\n this.#submitting = false;\n this.defaultValue = this.value;\n this[_update](this.value);\n }\n }\n\n async requestValidation<NM extends ProvisionalModel>(\n model: NM,\n validator: Validator<Value<NM>>,\n ): Promise<ReadonlyArray<ValueError<Value<NM>>>> {\n let modelValidations: Map<Validator<Value<NM>>, Promise<ReadonlyArray<ValueError<Value<NM>>>>>;\n\n if (this.#validations.has(model)) {\n modelValidations = this.#validations.get(model) as Map<\n Validator<Value<NM>>,\n Promise<ReadonlyArray<ValueError<Value<NM>>>>\n >;\n } else {\n modelValidations = new Map();\n this.#validations.set(model, modelValidations);\n }\n\n await this.performValidation();\n\n if (modelValidations.has(validator)) {\n return modelValidations.get(validator)!;\n }\n\n const promise = runValidator(model, validator, this.constructor.interpolateMessageCallback);\n modelValidations.set(validator, promise);\n const valueErrors = await promise;\n\n modelValidations.delete(validator);\n if (modelValidations.size === 0) {\n this.#validations.delete(model);\n }\n if (this.#validations.size === 0) {\n this.completeValidation();\n }\n\n return valueErrors;\n }\n\n /**\n * Determines and returns the field directive strategy for the bound element.\n * Override to customise the binding strategy for a component.\n * The Binder extends BinderNode, see the inherited properties and methods below.\n *\n * @param elm - the bound element\n * @param model - the bound model\n */\n // eslint ignored to allow overriding\n // eslint-disable-next-line @typescript-eslint/class-methods-use-this\n getFieldStrategy<TField>(elm: HTMLElement, model?: ProvisionalModel<TField>): FieldStrategy {\n return getDefaultFieldStrategy(elm as FieldElement, model);\n }\n\n protected performValidation(): Promise<void> | void {\n if (!this.#validationRequest) {\n this.#validating = true;\n this.dispatchEvent(CHANGED);\n this.#validationRequest = Promise.resolve().then(() => {\n this.#validationRequest = undefined;\n });\n }\n return this.#validationRequest;\n }\n\n protected completeValidation(): void {\n this.#validating = false;\n this.dispatchEvent(CHANGED);\n }\n\n protected override [_update](oldValue: Value<M>): void {\n this.#config?.onChange?.call(this.#context, oldValue);\n this.dispatchEvent(CHANGED);\n }\n}\n"]}
1
+ {"version":3,"file":"BinderRoot.js","sourceRoot":"","sources":["src/BinderRoot.ts"],"names":[],"mappings":"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","sourcesContent":["import { EndpointValidationError, type ValidationErrorData } from '@vaadin/hilla-frontend/EndpointErrors.js';\nimport { $owner, Model, type Target } from '@vaadin/hilla-models';\nimport m from '@vaadin/hilla-models';\nimport { _clearValidation, _setErrorsWithDescendants, _update, BinderNode, CHANGED } from './BinderNode.js';\nimport { type FieldElement, type FieldStrategy, getDefaultFieldStrategy } from './Field.js';\nimport { type AbstractModel, createDetachedModel, type DetachedModelConstructor, type Value } from './Models.js';\nimport type { ProvisionalModel, ProvisionalModelConstructor } from './ProvisionalModel.js';\nimport type { ClassStaticProperties } from './types.js';\nimport {\n type InterpolateMessageCallback,\n runValidator,\n ServerValidator,\n ValidationError,\n type Validator,\n type ValueError,\n} from './Validation.js';\n\nexport type BinderConfiguration<T> = Readonly<{\n onChange?(oldValue?: T): void;\n onSubmit?(value: T): Promise<T | void>;\n}>;\n\nexport type BinderRootConfiguration<T> = BinderConfiguration<T> &\n Readonly<{\n context?: unknown;\n }>;\n\n/**\n * A simplified Binder that does not require a context.\n * It can be used as root when there is no Element to use as context.\n *\n * @typeParam T - Type of the value that binds to a form\n * @typeParam M - Type of the model that describes the structure of the value\n */\nexport class BinderRoot<M extends ProvisionalModel = ProvisionalModel> extends BinderNode<M> {\n static interpolateMessageCallback?: InterpolateMessageCallback<any>;\n\n #defaultValue!: Value<M>; // Initialized in the `read()` method\n\n #value!: Value<M>; // Initialized in the `read()` method\n\n readonly #emptyValue: Value<M>;\n\n #submitting = false;\n\n #validating = false;\n\n #validationRequest?: Promise<void>;\n\n readonly #config?: BinderRootConfiguration<Value<M>>;\n\n readonly #validations = new Map<ProvisionalModel, Map<Validator, Promise<readonly ValueError[]>>>();\n\n readonly #context: unknown = this;\n\n declare readonly ['constructor']: ClassStaticProperties<typeof BinderRoot<M>>;\n\n /**\n *\n * @param modelClass - The constructor (the class reference) of the form model. The Binder instantiates the top-level model\n * @param config - The options object, which can be used to config the onChange and onSubmit callbacks.\n *\n * ```\n * binder = new BinderRoot(OrderModel);\n * or\n * binder = new BinderRoot(OrderModel, {onSubmit: async (order) => {endpoint.save(order)}});\n * ```\n */\n constructor(modelClass: ProvisionalModelConstructor<M>, config?: BinderRootConfiguration<Value<M>>) {\n /* eslint-disable @typescript-eslint/no-unnecessary-type-assertion -- narrows ternary union to M */\n super(\n (modelClass instanceof Model\n ? m.attach(modelClass as M & Model, () => this as Target<Value<M>>)\n : createDetachedModel(modelClass as DetachedModelConstructor<M & AbstractModel>)) as M,\n );\n /* eslint-enable @typescript-eslint/no-unnecessary-type-assertion */\n if (!(modelClass instanceof Model)) {\n // @ts-expect-error the model's parent is the binder\n this.model[$owner] = this;\n }\n this.#context = config?.context ?? this;\n this.#config = config;\n // Initialize value instead of the parent.\n this.initializeValue(true);\n this.#emptyValue = this.value;\n }\n\n /**\n * The initial value of the form, before any fields are edited by the user.\n */\n override get defaultValue(): Value<M> {\n return this.#defaultValue;\n }\n\n override set defaultValue(newValue: Value<M>) {\n this.#defaultValue = newValue;\n this.dispatchEvent(CHANGED);\n }\n\n override get binder(): this {\n return this;\n }\n\n /**\n * The current value of the form.\n */\n override get value(): Value<M> {\n return this.#value;\n }\n\n override set value(newValue: Value<M>) {\n if (newValue === this.#value) {\n return;\n }\n\n const oldValue = this.#value;\n this.#value = newValue;\n this[_update](oldValue);\n }\n\n /**\n * Indicates the submitting status of the form.\n * True if the form was submitted, but the submit promise is not resolved yet.\n */\n get submitting(): boolean {\n return this.#submitting;\n }\n\n /**\n * Indicates the validating status of the form.\n * True when there is an ongoing validation.\n */\n get validating(): boolean {\n return this.#validating;\n }\n\n /**\n * Read the given value into the form and clear validation errors. Clears the form if the value is undefined.\n *\n * @param value - The value to read, or undefined to clear.\n */\n read(value: Value<M> | null | undefined): void {\n if (value === undefined || value === null) {\n this.clear();\n return;\n }\n this.defaultValue = value;\n if (\n // Skip when no value is set yet (e.g., invoked from constructor)\n this.value &&\n // Clear validation state, then proceed if update is needed\n this[_clearValidation]() &&\n // When value is dirty, another update is coming from invoking the value\n // setter below, so we skip this one to prevent duplicate updates\n this.value === value\n ) {\n this[_update](this.value);\n }\n\n this.value = this.defaultValue;\n }\n\n /**\n * Reset the form to the previous value\n */\n reset(): void {\n this.read(this.#defaultValue);\n }\n\n /**\n * Sets the form to empty value, as defined in the Model.\n */\n clear(): void {\n this.read(this.#emptyValue);\n }\n\n /**\n * Submit the current form value to a predefined\n * onSubmit callback.\n *\n * It's a no-op if the onSubmit callback is undefined.\n */\n async submit(): Promise<Value<M> | void> {\n const onSubmit = this.#config?.onSubmit;\n if (onSubmit) {\n return this.submitTo(onSubmit);\n }\n\n return undefined;\n }\n\n /**\n * Submit the current form value to callback\n *\n * @param endpointMethod - the callback function\n */\n async submitTo<V>(endpointMethod: (value: Value<M>) => Promise<V>): Promise<V> {\n const errors = await this.validate();\n if (errors.length) {\n throw new ValidationError(errors);\n }\n\n this.#submitting = true;\n this[_update](this.value);\n this.dispatchEvent(CHANGED);\n try {\n return await endpointMethod.call(this.#context, this.value);\n } catch (error: unknown) {\n if (error instanceof EndpointValidationError && error.validationErrorData.length) {\n const valueErrors: Array<ValueError<any>> = [];\n error.validationErrorData.forEach((data: ValidationErrorData) => {\n const res =\n /Object of type '(.+)' has invalid property '(.+)' with value '(.+)', validation error: '(.+)'/u.exec(\n data.message,\n );\n const [property, value, message] = res ? res.splice(2) : [data.parameterName ?? '', undefined, data.message];\n valueErrors.push({\n message,\n // Convert property from bracket notation to dot notation\n // Example: 'orders[0].description' becomes 'orders.0.description'\n property: property.replace(/\\[(\\d+)\\]/gu, '.$1'),\n validator: new ServerValidator(message),\n value,\n validatorMessage: data.validatorMessage,\n });\n });\n this[_setErrorsWithDescendants](valueErrors);\n throw new ValidationError(valueErrors);\n }\n\n throw error;\n } finally {\n this.#submitting = false;\n this.defaultValue = this.value;\n this[_update](this.value);\n }\n }\n\n async requestValidation<NM extends ProvisionalModel>(\n model: NM,\n validator: Validator<Value<NM>>,\n ): Promise<ReadonlyArray<ValueError<Value<NM>>>> {\n let modelValidations: Map<Validator<Value<NM>>, Promise<ReadonlyArray<ValueError<Value<NM>>>>>;\n\n if (this.#validations.has(model)) {\n modelValidations = this.#validations.get(model) as Map<\n Validator<Value<NM>>,\n Promise<ReadonlyArray<ValueError<Value<NM>>>>\n >;\n } else {\n modelValidations = new Map();\n this.#validations.set(model, modelValidations);\n }\n\n await this.performValidation();\n\n if (modelValidations.has(validator)) {\n return modelValidations.get(validator)!;\n }\n\n const promise = runValidator(model, validator, this.constructor.interpolateMessageCallback);\n modelValidations.set(validator, promise);\n const valueErrors = await promise;\n\n modelValidations.delete(validator);\n if (modelValidations.size === 0) {\n this.#validations.delete(model);\n }\n if (this.#validations.size === 0) {\n this.completeValidation();\n }\n\n return valueErrors;\n }\n\n /**\n * Determines and returns the field directive strategy for the bound element.\n * Override to customise the binding strategy for a component.\n * The Binder extends BinderNode, see the inherited properties and methods below.\n *\n * @param elm - the bound element\n * @param model - the bound model\n */\n // eslint ignored to allow overriding\n // eslint-disable-next-line @typescript-eslint/class-methods-use-this\n getFieldStrategy<TField>(elm: HTMLElement, model?: ProvisionalModel<TField>): FieldStrategy {\n return getDefaultFieldStrategy(elm as FieldElement, model);\n }\n\n protected performValidation(): Promise<void> | void {\n if (!this.#validationRequest) {\n this.#validating = true;\n this.dispatchEvent(CHANGED);\n this.#validationRequest = Promise.resolve().then(() => {\n this.#validationRequest = undefined;\n });\n }\n return this.#validationRequest;\n }\n\n protected completeValidation(): void {\n this.#validating = false;\n this.dispatchEvent(CHANGED);\n }\n\n protected override [_update](oldValue: Value<M>): void {\n this.#config?.onChange?.call(this.#context, oldValue);\n this.dispatchEvent(CHANGED);\n }\n}\n"]}
package/Field.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"Field.js","sourceRoot":"","sources":["src/Field.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable accessor-pairs,no-void,sort-keys */\nimport { ArrayModel, BooleanModel, NumberModel, ObjectModel, StringModel } from '@vaadin/hilla-models';\nimport { type ElementPart, noChange, nothing, type PropertyPart } from 'lit';\nimport { directive, Directive, type DirectiveParameters, type PartInfo, PartType } from 'lit/directive.js';\nimport { getBinderNode } from './BinderNode.js';\nimport {\n _fromString,\n ArrayModel as BinderArrayModel,\n BooleanModel as BinderBooleanModel,\n hasFromString,\n NumberModel as BinderNumberModel,\n ObjectModel as BinderObjectModel,\n StringModel as BinderStringModel,\n} from './Models.js';\nimport type { ProvisionalModel } from './ProvisionalModel.js';\nimport { getStringConverter } from './stringConverters.js';\nimport type { ValueError } from './Validation.js';\nimport { _validity, defaultValidity } from './Validity.js';\n\nexport interface FieldBase<T> {\n required: boolean;\n invalid: boolean;\n errorMessage: string;\n value: T | undefined;\n}\n\n/**\n * Subset of the HTML constraint validation API with the `checkValidity()` method.\n */\nexport type FieldConstraintValidation = Readonly<{\n validity: ValidityState;\n checkValidity(): boolean;\n}>;\n\nexport type FieldElement<T = unknown> = FieldBase<T> & HTMLElement & Partial<FieldConstraintValidation>;\n\nconst props = ['required', 'invalid', 'errorMessage', 'value', 'validity', 'checkValidity'];\n\nexport function isFieldElement<T>(element: HTMLElement): element is FieldElement<T> {\n return props.some((prop) => prop in element);\n}\n\ninterface FieldElementHolder<T> {\n get element(): FieldElement<T>;\n\n /**\n * @param element - the new element value\n * @deprecated will be read-only in future\n */\n set element(element: FieldElement<T>);\n}\n\ninterface Field<T> extends FieldBase<T> {\n readonly model?: ProvisionalModel<T>;\n}\n\ninterface FieldState<T> extends Field<T>, FieldElementHolder<T> {\n name: string;\n validity: ValidityState;\n strategy: FieldStrategy<T>;\n}\n\ntype EventHandler = (event: Event) => void;\n\nexport type FieldStrategy<T = any> = Field<T> &\n FieldConstraintValidation & {\n onChange?: EventHandler;\n onInput?: EventHandler;\n removeEventListeners(): void;\n };\n\nexport abstract class AbstractFieldStrategy<T = any, E extends FieldElement<T> = FieldElement<T>>\n implements FieldStrategy<T>\n{\n abstract required: boolean;\n\n abstract invalid: boolean;\n\n readonly model?: ProvisionalModel<T>;\n\n #element: E;\n\n /**\n * @privateRemarks\n * Fallback for missing .validity property API in Vaadin components.\n */\n #validityFallback: ValidityState = defaultValidity;\n\n readonly #eventHandlers = new Map<string, EventHandler>();\n\n constructor(element: E, model?: ProvisionalModel<T>) {\n this.#element = element;\n this.model = model;\n }\n\n get element(): E {\n return this.#element;\n }\n\n /**\n * @param element - the new element value\n * @deprecated will be read-only in future\n */\n set element(element: E) {\n this.#element = element;\n }\n\n get value(): T | undefined {\n return this.#element.value;\n }\n\n set value(value: T | undefined) {\n if (\n this.model instanceof BinderStringModel ||\n this.model instanceof StringModel ||\n this.model instanceof BinderNumberModel ||\n this.model instanceof NumberModel\n ) {\n this.#element.value = value ?? ('' as T);\n return;\n }\n this.#element.value = value;\n }\n\n set errorMessage(_: string) {}\n\n get validity(): ValidityState {\n return this.#element.validity ?? this.#validityFallback;\n }\n\n get onChange(): EventHandler | undefined {\n return this.#eventHandlers.get('change');\n }\n\n set onChange(onChange: EventHandler | undefined) {\n this.#setEventHandler('change', onChange);\n }\n\n get onInput(): EventHandler | undefined {\n return this.#getEventHandler('input');\n }\n\n set onInput(onInput: EventHandler | undefined) {\n this.#setEventHandler('input', onInput);\n }\n\n checkValidity(): boolean {\n if (!this.#element.checkValidity) {\n return true;\n }\n\n const valid = this.#element.checkValidity();\n this.#validityFallback = {\n ...defaultValidity,\n valid,\n ...(valid ? {} : this.#detectValidityError()),\n };\n return valid;\n }\n\n setAttribute(key: string, val: any): void {\n if (val) {\n this.#element.setAttribute(key, '');\n } else {\n this.#element.removeAttribute(key);\n }\n }\n\n removeEventListeners(): void {\n for (const [type, handler] of this.#eventHandlers) {\n this.element.removeEventListener(type, handler);\n this.#eventHandlers.delete(type);\n }\n }\n\n #getEventHandler(type: string): EventHandler | undefined {\n return this.#eventHandlers.get(type);\n }\n\n #setEventHandler(type: string, handler?: EventHandler) {\n if (this.#eventHandlers.has(type)) {\n this.element.removeEventListener(type, this.#eventHandlers.get(type)!);\n }\n\n if (handler) {\n this.element.addEventListener(type, handler);\n this.#eventHandlers.set(type, handler);\n } else {\n this.#eventHandlers.delete(type);\n }\n }\n\n #detectValidityError(): Readonly<Partial<ValidityState>> {\n if (!('inputElement' in this.#element)) {\n // Not a Vaadin component field\n return { customError: true };\n }\n\n const inputElement = this.#element.inputElement as FieldElement<string>;\n\n if (this.#element.value === '') {\n if (inputElement.value === '') {\n return { valueMissing: true };\n }\n // Some value is entered, but not meaningful to the\n // web component — assume parse error.\n return { badInput: true };\n }\n // Unknown constraint violation\n return { customError: true };\n }\n}\n\nexport class VaadinFieldStrategy<T = any, E extends FieldElement<T> = FieldElement<T>> extends AbstractFieldStrategy<\n T,\n E\n> {\n #invalid = false;\n readonly #boundOnValidated = this.#onValidated.bind(this);\n readonly #boundOnUnparsableChange = this.#onUnparsableChange.bind(this);\n\n constructor(element: E, model?: ProvisionalModel<T>) {\n super(element, model);\n element.addEventListener('validated', this.#boundOnValidated);\n element.addEventListener('unparsable-change', this.#boundOnUnparsableChange);\n }\n\n set required(value: boolean) {\n this.element.required = value;\n }\n\n set invalid(value: boolean) {\n this.#invalid = value;\n this.element.invalid = value;\n }\n\n override set errorMessage(value: string) {\n this.element.errorMessage = value;\n }\n\n override removeEventListeners(): void {\n this.element.removeEventListener('validated', this.#boundOnValidated);\n this.element.removeEventListener('unparsable-change', this.#boundOnUnparsableChange);\n }\n\n #onValidated(e: Event): void {\n if (!(e instanceof CustomEvent) || typeof e.detail !== 'object') {\n return;\n }\n\n // Override built-in changes of the `invalid` flag in Vaadin components\n // to keep the `invalid` property state of the web component in sync.\n const invalid = !((e.detail ?? {}) as Partial<ValidityState>).valid;\n if (this.#invalid !== invalid) {\n this.element.invalid = this.#invalid;\n }\n\n // Some user interactions in Vaadin components do not dispatch `input`\n // event, such as validation upon closing the overlay, pressing Enter key.\n // One notable example is <vaadin-date-picker>. Use `validated` event in\n // addition to standard input events to handle those.\n this.onInput?.call(this.element, e);\n }\n\n #onUnparsableChange(e: Event) {\n this.onChange?.call(this.element, e);\n }\n\n override checkValidity(): boolean {\n // Ignore the `invalid` property of the Vaadin component to avoid\n // reading the component's internal old validation state and validate\n // the element based on the current state.\n const isElementInvalid = this.element.invalid;\n this.element.invalid = false;\n const valid = super.checkValidity();\n this.element.invalid = isElementInvalid;\n return valid;\n }\n}\n\nexport class GenericFieldStrategy<T = any, E extends FieldElement<T> = FieldElement<T>> extends AbstractFieldStrategy<\n T,\n E\n> {\n set required(value: boolean) {\n this.setAttribute('required', value);\n }\n\n set invalid(value: boolean) {\n this.setAttribute('invalid', value);\n }\n}\n\ntype CheckedFieldElement<T> = FieldElement<T> & {\n checked: boolean;\n};\n\nexport class CheckedFieldStrategy<\n T = any,\n E extends CheckedFieldElement<T> = CheckedFieldElement<T>,\n> extends GenericFieldStrategy<T, E> {\n override get value(): T | undefined {\n if (this.model instanceof BinderBooleanModel || this.model instanceof BooleanModel) {\n return this.element.checked as T;\n }\n\n return this.element.checked ? this.element.value : undefined;\n }\n\n override set value(val: T | undefined) {\n (this.element as { checked: boolean }).checked = /^(true|on)$/iu.test(String(val));\n }\n}\n\nexport class CheckedGroupFieldStrategy<\n T = any,\n E extends FieldElement<T> = FieldElement<T>,\n> extends GenericFieldStrategy<T, E> {\n override get value(): T | undefined {\n return super.value;\n }\n\n override set value(val: T | undefined) {\n super.value = val ?? ([] as T);\n }\n}\n\ntype ComboBoxFieldElement<T> = FieldElement<T> & {\n value: string;\n selectedItem: T | null;\n};\n\nexport class ComboBoxFieldStrategy<\n T,\n E extends ComboBoxFieldElement<T> = ComboBoxFieldElement<T>,\n> extends VaadinFieldStrategy<T, E> {\n override get value(): T | undefined {\n if (\n this.model &&\n (this.model instanceof BinderObjectModel ||\n this.model instanceof ObjectModel ||\n this.model instanceof BinderArrayModel ||\n this.model instanceof ArrayModel)\n ) {\n const { selectedItem } = this.element;\n return selectedItem ?? undefined;\n }\n\n return super.value;\n }\n\n override set value(val: T | undefined) {\n if (\n this.model instanceof BinderObjectModel ||\n this.model instanceof ObjectModel ||\n this.model instanceof BinderArrayModel ||\n this.model instanceof ArrayModel\n ) {\n this.element.selectedItem = val ?? null;\n } else {\n super.value = val;\n }\n }\n}\n\nexport class VaadinStringFieldStrategy extends VaadinFieldStrategy<string> {\n override get value(): string | undefined {\n return super.value;\n }\n\n override set value(val: string | undefined) {\n // Some Vaadin components (e.g. vaadin-time-picker) do not support setting\n // the value to `null` or `undefined`. Instead, set it to an empty string.\n super.value = val ?? '';\n }\n}\nfunction isEmptyObject(val: any): boolean {\n return val && typeof val === 'object' && !Array.isArray(val) && Object.keys(val).length === 0;\n}\n\nexport class VaadinDateTimeFieldStrategy<\n T = string,\n E extends FieldElement<T> = FieldElement<T>,\n> extends VaadinFieldStrategy<T, E> {\n override get value(): T | undefined {\n return super.value;\n }\n\n override set value(val: T | undefined) {\n const timestamp = Date.parse(val as string);\n\n if (!val || isEmptyObject(val) || Number.isNaN(timestamp)) {\n super.value = '' as T;\n return;\n }\n\n const date = new Date(timestamp);\n // Convert to ISO 8601 local combined date and time representation\n const tzOffsetMs = 60 * 1000 * date.getTimezoneOffset();\n super.value = new Date(timestamp - tzOffsetMs).toISOString().slice(0, 19) as T;\n }\n}\n\ntype MultiSelectComboBoxFieldElement<T> = FieldElement<T> & {\n value: never;\n selectedItems: T;\n};\n\nexport class MultiSelectComboBoxFieldStrategy<\n T,\n E extends MultiSelectComboBoxFieldElement<T> = MultiSelectComboBoxFieldElement<T>,\n> extends VaadinFieldStrategy<T, E> {\n override get value(): T {\n return this.element.selectedItems;\n }\n\n override set value(val: any) {\n this.element.selectedItems = val;\n }\n}\n\ntype SelectedFieldElement<T> = FieldElement<T> & {\n value: never;\n selected: T;\n};\n\nexport class SelectedFieldStrategy<\n T,\n E extends SelectedFieldElement<T> = SelectedFieldElement<T>,\n> extends GenericFieldStrategy<T, E> {\n override get value(): T {\n return this.element.selected;\n }\n\n override set value(val: T) {\n this.element.selected = val;\n }\n}\n\ntype MaybeVaadinElementConstructor = {\n readonly version?: string;\n};\n\nexport function getDefaultFieldStrategy<T>(\n elm: FieldElement<T>,\n model?: ProvisionalModel<T>,\n): AbstractFieldStrategy<T> {\n switch (elm.localName) {\n case 'vaadin-checkbox':\n case 'vaadin-radio-button':\n return new CheckedFieldStrategy(elm as CheckedFieldElement<T>, model);\n case 'vaadin-checkbox-group':\n return new CheckedGroupFieldStrategy(elm, model);\n case 'vaadin-combo-box':\n return new ComboBoxFieldStrategy(elm as ComboBoxFieldElement<T>, model);\n case 'vaadin-list-box':\n return new SelectedFieldStrategy(elm as SelectedFieldElement<T>, model);\n case 'vaadin-multi-select-combo-box':\n return new MultiSelectComboBoxFieldStrategy(elm as MultiSelectComboBoxFieldElement<T>, model);\n case 'vaadin-rich-text-editor':\n return new GenericFieldStrategy(elm, model);\n case 'vaadin-time-picker':\n return new VaadinStringFieldStrategy(\n elm as FieldElement<string>,\n model as ProvisionalModel<string>,\n ) as AbstractFieldStrategy<T>;\n case 'vaadin-date-time-picker':\n return new VaadinDateTimeFieldStrategy(elm, model) as AbstractFieldStrategy<T>;\n default:\n if (elm.localName === 'input' && /^(checkbox|radio)$/u.test((elm as unknown as HTMLInputElement).type)) {\n return new CheckedFieldStrategy(elm as CheckedFieldElement<T>, model);\n }\n if ((elm.constructor as unknown as MaybeVaadinElementConstructor).version) {\n return new VaadinFieldStrategy(elm, model);\n }\n return new GenericFieldStrategy(elm, model);\n }\n}\n\nfunction convertFieldValue<T extends ProvisionalModel>(model: T, fieldValue: unknown) {\n if (typeof fieldValue !== 'string') {\n return fieldValue;\n }\n\n const stringConverter = getStringConverter(model);\n if (stringConverter) {\n return stringConverter.fromString(fieldValue);\n }\n\n if (hasFromString(model)) {\n return model[_fromString](fieldValue);\n }\n\n return fieldValue;\n}\n\n/**\n * Binds a form field component into a model.\n *\n * Example usage:\n *\n * ```\n * <vaadin-text-field ...=\"${field(model.name)}\">\n * </vaadin-text-field>\n * ```\n */\nexport const field = directive(\n class extends Directive {\n fieldState?: FieldState<any>;\n\n constructor(partInfo: PartInfo) {\n super(partInfo);\n if (partInfo.type !== PartType.PROPERTY && partInfo.type !== PartType.ELEMENT) {\n throw new Error('Use as \"<element {field(...)}\" or <element ...={field(...)}\"');\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n override render(_model: ProvisionalModel<any>, _effect?: (element: Element) => void) {\n return nothing;\n }\n\n override update(part: ElementPart | PropertyPart, [model, effect]: DirectiveParameters<this>) {\n const element = part.element as FieldElement & HTMLInputElement;\n\n const binderNode = getBinderNode(model);\n\n if (!this.fieldState) {\n const fieldState = {\n errorMessage: '',\n name: '',\n value: '',\n required: false,\n invalid: false,\n model,\n validity: defaultValidity,\n element,\n strategy: binderNode.binder.getFieldStrategy(element, model),\n };\n\n this.fieldState = fieldState;\n\n const inputHandler = () => {\n fieldState.strategy.checkValidity();\n // When bad input is detected, skip reading new value in binder state\n if (!fieldState.strategy.validity.badInput) {\n fieldState.value = fieldState.strategy.value;\n }\n fieldState.validity = fieldState.strategy.validity;\n binderNode[_validity] = fieldState.validity;\n binderNode.value = convertFieldValue(model, fieldState.value);\n if (effect !== undefined) {\n effect.call(element, element);\n }\n };\n\n fieldState.strategy.onInput = inputHandler;\n fieldState.strategy.onChange = () => {\n inputHandler();\n void binderNode.validate();\n };\n\n const blurHandler = () => {\n inputHandler();\n void binderNode.validate();\n binderNode.visited = true;\n };\n\n element.addEventListener('blur', blurHandler);\n }\n\n const { fieldState } = this;\n\n if (fieldState.element !== element || fieldState.model !== model) {\n const { onInput } = fieldState.strategy;\n fieldState.strategy = binderNode.binder.getFieldStrategy(element, model);\n fieldState.strategy.onInput = onInput;\n }\n\n const { name } = binderNode;\n if (name !== fieldState.name) {\n fieldState.name = name;\n element.setAttribute('name', name);\n }\n\n const { value } = binderNode;\n const valueFromField = convertFieldValue(model, fieldState.value);\n if (value !== valueFromField && !(Number.isNaN(value) && Number.isNaN(valueFromField))) {\n const nonNanValue = Number.isNaN(value) ? '' : value;\n fieldState.value = nonNanValue;\n fieldState.strategy.value = nonNanValue;\n }\n\n const { required } = binderNode;\n if (required !== fieldState.required) {\n fieldState.required = required;\n fieldState.strategy.required = required;\n }\n\n const firstError: ValueError<any> | undefined = binderNode.ownErrors[0];\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n const errorMessage = firstError?.message || '';\n if (errorMessage !== fieldState.errorMessage) {\n fieldState.errorMessage = errorMessage;\n fieldState.strategy.errorMessage = errorMessage;\n }\n\n const { invalid } = binderNode;\n if (invalid !== fieldState.invalid) {\n fieldState.invalid = invalid;\n fieldState.strategy.invalid = invalid;\n }\n\n return noChange;\n }\n },\n);\n"]}
1
+ {"version":3,"file":"Field.js","sourceRoot":"","sources":["src/Field.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable accessor-pairs,no-void,sort-keys */\nimport { ArrayModel, BooleanModel, NumberModel, ObjectModel, StringModel } from '@vaadin/hilla-models';\nimport { type ElementPart, noChange, nothing, type PropertyPart } from 'lit';\nimport { directive, Directive, type DirectiveParameters, type PartInfo, PartType } from 'lit/directive.js';\nimport { getBinderNode } from './BinderNode.js';\nimport {\n _fromString,\n ArrayModel as BinderArrayModel,\n BooleanModel as BinderBooleanModel,\n hasFromString,\n NumberModel as BinderNumberModel,\n ObjectModel as BinderObjectModel,\n StringModel as BinderStringModel,\n} from './Models.js';\nimport type { ProvisionalModel } from './ProvisionalModel.js';\nimport { getStringConverter } from './stringConverters.js';\nimport type { ValueError } from './Validation.js';\nimport { _validity, defaultValidity } from './Validity.js';\n\nexport interface FieldBase<T> {\n required: boolean;\n invalid: boolean;\n errorMessage: string;\n value: T | undefined;\n}\n\n/**\n * Subset of the HTML constraint validation API with the `checkValidity()` method.\n */\nexport type FieldConstraintValidation = Readonly<{\n validity: ValidityState;\n checkValidity(): boolean;\n}>;\n\nexport type FieldElement<T = unknown> = FieldBase<T> & HTMLElement & Partial<FieldConstraintValidation>;\n\nconst props = ['required', 'invalid', 'errorMessage', 'value', 'validity', 'checkValidity'];\n\nexport function isFieldElement<T>(element: HTMLElement): element is FieldElement<T> {\n return props.some((prop) => prop in element);\n}\n\ninterface FieldElementHolder<T> {\n get element(): FieldElement<T>;\n\n /**\n * @param element - the new element value\n * @deprecated will be read-only in future\n */\n set element(element: FieldElement<T>);\n}\n\ninterface Field<T> extends FieldBase<T> {\n readonly model?: ProvisionalModel<T>;\n}\n\ninterface FieldState<T> extends Field<T>, FieldElementHolder<T> {\n name: string;\n validity: ValidityState;\n strategy: FieldStrategy<T>;\n}\n\ntype EventHandler = (event: Event) => void;\n\nexport type FieldStrategy<T = any> = Field<T> &\n FieldConstraintValidation & {\n onChange?: EventHandler;\n onInput?: EventHandler;\n removeEventListeners(): void;\n };\n\nexport abstract class AbstractFieldStrategy<T = any, E extends FieldElement<T> = FieldElement<T>>\n implements FieldStrategy<T>\n{\n abstract required: boolean;\n\n abstract invalid: boolean;\n\n readonly model?: ProvisionalModel<T>;\n\n #element: E;\n\n /**\n * @privateRemarks\n * Fallback for missing .validity property API in Vaadin components.\n */\n #validityFallback: ValidityState = defaultValidity;\n\n readonly #eventHandlers = new Map<string, EventHandler>();\n\n constructor(element: E, model?: ProvisionalModel<T>) {\n this.#element = element;\n this.model = model;\n }\n\n get element(): E {\n return this.#element;\n }\n\n /**\n * @param element - the new element value\n * @deprecated will be read-only in future\n */\n set element(element: E) {\n this.#element = element;\n }\n\n get value(): T | undefined {\n return this.#element.value;\n }\n\n set value(value: T | undefined) {\n if (\n this.model instanceof BinderStringModel ||\n this.model instanceof StringModel ||\n this.model instanceof BinderNumberModel ||\n this.model instanceof NumberModel\n ) {\n this.#element.value = value ?? ('' as T);\n return;\n }\n this.#element.value = value;\n }\n\n set errorMessage(_: string) {}\n\n get validity(): ValidityState {\n return this.#element.validity ?? this.#validityFallback;\n }\n\n get onChange(): EventHandler | undefined {\n return this.#eventHandlers.get('change');\n }\n\n set onChange(onChange: EventHandler | undefined) {\n this.#setEventHandler('change', onChange);\n }\n\n get onInput(): EventHandler | undefined {\n return this.#getEventHandler('input');\n }\n\n set onInput(onInput: EventHandler | undefined) {\n this.#setEventHandler('input', onInput);\n }\n\n checkValidity(): boolean {\n if (!this.#element.checkValidity) {\n return true;\n }\n\n const valid = this.#element.checkValidity();\n this.#validityFallback = {\n ...defaultValidity,\n valid,\n ...(valid ? {} : this.#detectValidityError()),\n };\n return valid;\n }\n\n setAttribute(key: string, val: any): void {\n if (val) {\n this.#element.setAttribute(key, '');\n } else {\n this.#element.removeAttribute(key);\n }\n }\n\n removeEventListeners(): void {\n for (const [type, handler] of this.#eventHandlers) {\n this.element.removeEventListener(type, handler);\n this.#eventHandlers.delete(type);\n }\n }\n\n #getEventHandler(type: string): EventHandler | undefined {\n return this.#eventHandlers.get(type);\n }\n\n #setEventHandler(type: string, handler?: EventHandler) {\n if (this.#eventHandlers.has(type)) {\n this.element.removeEventListener(type, this.#eventHandlers.get(type)!);\n }\n\n if (handler) {\n this.element.addEventListener(type, handler);\n this.#eventHandlers.set(type, handler);\n } else {\n this.#eventHandlers.delete(type);\n }\n }\n\n #detectValidityError(): Readonly<Partial<ValidityState>> {\n if (!('inputElement' in this.#element)) {\n // Not a Vaadin component field\n return { customError: true };\n }\n\n const inputElement = this.#element.inputElement as FieldElement<string>;\n\n if (this.#element.value === '') {\n if (inputElement.value === '') {\n return { valueMissing: true };\n }\n // Some value is entered, but not meaningful to the\n // web component — assume parse error.\n return { badInput: true };\n }\n // Unknown constraint violation\n return { customError: true };\n }\n}\n\nexport class VaadinFieldStrategy<T = any, E extends FieldElement<T> = FieldElement<T>> extends AbstractFieldStrategy<\n T,\n E\n> {\n #invalid = false;\n readonly #boundOnValidated = this.#onValidated.bind(this);\n readonly #boundOnUnparsableChange = this.#onUnparsableChange.bind(this);\n\n constructor(element: E, model?: ProvisionalModel<T>) {\n super(element, model);\n element.addEventListener('validated', this.#boundOnValidated);\n element.addEventListener('unparsable-change', this.#boundOnUnparsableChange);\n }\n\n set required(value: boolean) {\n this.element.required = value;\n }\n\n set invalid(value: boolean) {\n this.#invalid = value;\n this.element.invalid = value;\n }\n\n override set errorMessage(value: string) {\n this.element.errorMessage = value;\n }\n\n override removeEventListeners(): void {\n this.element.removeEventListener('validated', this.#boundOnValidated);\n this.element.removeEventListener('unparsable-change', this.#boundOnUnparsableChange);\n }\n\n #onValidated(e: Event): void {\n if (!(e instanceof CustomEvent) || typeof e.detail !== 'object') {\n return;\n }\n\n // Override built-in changes of the `invalid` flag in Vaadin components\n // to keep the `invalid` property state of the web component in sync.\n const invalid = !((e.detail ?? {}) as Partial<ValidityState>).valid;\n if (this.#invalid !== invalid) {\n this.element.invalid = this.#invalid;\n }\n\n // Some user interactions in Vaadin components do not dispatch `input`\n // event, such as validation upon closing the overlay, pressing Enter key.\n // One notable example is <vaadin-date-picker>. Use `validated` event in\n // addition to standard input events to handle those.\n this.onInput?.call(this.element, e);\n }\n\n #onUnparsableChange(e: Event) {\n this.onChange?.call(this.element, e);\n }\n\n override checkValidity(): boolean {\n // Ignore the `invalid` property of the Vaadin component to avoid\n // reading the component's internal old validation state and validate\n // the element based on the current state.\n const isElementInvalid = this.element.invalid;\n this.element.invalid = false;\n const valid = super.checkValidity();\n this.element.invalid = isElementInvalid;\n return valid;\n }\n}\n\nexport class GenericFieldStrategy<T = any, E extends FieldElement<T> = FieldElement<T>> extends AbstractFieldStrategy<\n T,\n E\n> {\n set required(value: boolean) {\n this.setAttribute('required', value);\n }\n\n set invalid(value: boolean) {\n this.setAttribute('invalid', value);\n }\n}\n\ntype CheckedFieldElement<T> = FieldElement<T> & {\n checked: boolean;\n};\n\nexport class CheckedFieldStrategy<\n T = any,\n E extends CheckedFieldElement<T> = CheckedFieldElement<T>,\n> extends GenericFieldStrategy<T, E> {\n override get value(): T | undefined {\n if (this.model instanceof BinderBooleanModel || this.model instanceof BooleanModel) {\n return this.element.checked as T;\n }\n\n return this.element.checked ? this.element.value : undefined;\n }\n\n override set value(val: T | undefined) {\n (this.element as { checked: boolean }).checked = /^(true|on)$/iu.test(String(val));\n }\n}\n\nexport class CheckedGroupFieldStrategy<\n T = any,\n E extends FieldElement<T> = FieldElement<T>,\n> extends GenericFieldStrategy<T, E> {\n override get value(): T | undefined {\n return super.value;\n }\n\n override set value(val: T | undefined) {\n super.value = val ?? ([] as T);\n }\n}\n\ntype ComboBoxFieldElement<T> = FieldElement<T> & {\n value: string;\n selectedItem: T | null;\n};\n\nexport class ComboBoxFieldStrategy<\n T,\n E extends ComboBoxFieldElement<T> = ComboBoxFieldElement<T>,\n> extends VaadinFieldStrategy<T, E> {\n override get value(): T | undefined {\n if (\n this.model &&\n (this.model instanceof BinderObjectModel ||\n this.model instanceof ObjectModel ||\n this.model instanceof BinderArrayModel ||\n this.model instanceof ArrayModel)\n ) {\n const { selectedItem } = this.element;\n return selectedItem ?? undefined;\n }\n\n return super.value;\n }\n\n override set value(val: T | undefined) {\n if (\n this.model instanceof BinderObjectModel ||\n this.model instanceof ObjectModel ||\n this.model instanceof BinderArrayModel ||\n this.model instanceof ArrayModel\n ) {\n this.element.selectedItem = val ?? null;\n } else {\n super.value = val;\n }\n }\n}\n\nexport class VaadinStringFieldStrategy extends VaadinFieldStrategy<string> {\n override get value(): string | undefined {\n return super.value;\n }\n\n override set value(val: string | undefined) {\n // Some Vaadin components (e.g. vaadin-time-picker) do not support setting\n // the value to `null` or `undefined`. Instead, set it to an empty string.\n super.value = val ?? '';\n }\n}\nfunction isEmptyObject(val: any): boolean {\n return val && typeof val === 'object' && !Array.isArray(val) && Object.keys(val).length === 0;\n}\n\nexport class VaadinDateTimeFieldStrategy<\n T = string,\n E extends FieldElement<T> = FieldElement<T>,\n> extends VaadinFieldStrategy<T, E> {\n override get value(): T | undefined {\n return super.value;\n }\n\n override set value(val: T | undefined) {\n const timestamp = Date.parse(val as string);\n\n if (!val || isEmptyObject(val) || Number.isNaN(timestamp)) {\n super.value = '' as T;\n return;\n }\n\n const date = new Date(timestamp);\n // Convert to ISO 8601 local combined date and time representation\n const tzOffsetMs = 60 * 1000 * date.getTimezoneOffset();\n super.value = new Date(timestamp - tzOffsetMs).toISOString().slice(0, 19) as T;\n }\n}\n\ntype MultiSelectComboBoxFieldElement<T> = FieldElement<T> & {\n value: never;\n selectedItems: T;\n};\n\nexport class MultiSelectComboBoxFieldStrategy<\n T,\n E extends MultiSelectComboBoxFieldElement<T> = MultiSelectComboBoxFieldElement<T>,\n> extends VaadinFieldStrategy<T, E> {\n override get value(): T {\n return this.element.selectedItems;\n }\n\n override set value(val: any) {\n this.element.selectedItems = val;\n }\n}\n\ntype SelectedFieldElement<T> = FieldElement<T> & {\n value: never;\n selected: T;\n};\n\nexport class SelectedFieldStrategy<\n T,\n E extends SelectedFieldElement<T> = SelectedFieldElement<T>,\n> extends GenericFieldStrategy<T, E> {\n override get value(): T {\n return this.element.selected;\n }\n\n override set value(val: T) {\n this.element.selected = val;\n }\n}\n\ntype MaybeVaadinElementConstructor = {\n readonly version?: string;\n};\n\nexport function getDefaultFieldStrategy<T>(\n elm: FieldElement<T>,\n model?: ProvisionalModel<T>,\n): AbstractFieldStrategy<T> {\n switch (elm.localName) {\n case 'vaadin-checkbox':\n case 'vaadin-radio-button':\n return new CheckedFieldStrategy(elm as CheckedFieldElement<T>, model);\n case 'vaadin-checkbox-group':\n return new CheckedGroupFieldStrategy(elm, model);\n case 'vaadin-combo-box':\n return new ComboBoxFieldStrategy(elm as ComboBoxFieldElement<T>, model);\n case 'vaadin-list-box':\n return new SelectedFieldStrategy(elm as SelectedFieldElement<T>, model);\n case 'vaadin-multi-select-combo-box':\n return new MultiSelectComboBoxFieldStrategy(elm as MultiSelectComboBoxFieldElement<T>, model);\n case 'vaadin-rich-text-editor':\n return new GenericFieldStrategy(elm, model);\n case 'vaadin-time-picker':\n return new VaadinStringFieldStrategy(\n elm as FieldElement<string>,\n model as ProvisionalModel<string>,\n ) as AbstractFieldStrategy<T>;\n case 'vaadin-date-time-picker':\n return new VaadinDateTimeFieldStrategy(elm, model);\n default:\n if (elm.localName === 'input' && /^(checkbox|radio)$/u.test((elm as unknown as HTMLInputElement).type)) {\n return new CheckedFieldStrategy(elm as CheckedFieldElement<T>, model);\n }\n if ((elm.constructor as unknown as MaybeVaadinElementConstructor).version) {\n return new VaadinFieldStrategy(elm, model);\n }\n return new GenericFieldStrategy(elm, model);\n }\n}\n\nfunction convertFieldValue<T extends ProvisionalModel>(model: T, fieldValue: unknown) {\n if (typeof fieldValue !== 'string') {\n return fieldValue;\n }\n\n const stringConverter = getStringConverter(model);\n if (stringConverter) {\n return stringConverter.fromString(fieldValue);\n }\n\n if (hasFromString(model)) {\n return model[_fromString](fieldValue);\n }\n\n return fieldValue;\n}\n\n/**\n * Binds a form field component into a model.\n *\n * Example usage:\n *\n * ```\n * <vaadin-text-field ...=\"${field(model.name)}\">\n * </vaadin-text-field>\n * ```\n */\nexport const field = directive(\n class extends Directive {\n fieldState?: FieldState<any>;\n\n constructor(partInfo: PartInfo) {\n super(partInfo);\n if (partInfo.type !== PartType.PROPERTY && partInfo.type !== PartType.ELEMENT) {\n throw new Error('Use as \"<element {field(...)}\" or <element ...={field(...)}\"');\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n override render(_model: ProvisionalModel<any>, _effect?: (element: Element) => void) {\n return nothing;\n }\n\n override update(part: ElementPart | PropertyPart, [model, effect]: DirectiveParameters<this>) {\n const element = part.element as FieldElement & HTMLInputElement;\n\n const binderNode = getBinderNode(model);\n\n if (!this.fieldState) {\n const fieldState = {\n errorMessage: '',\n name: '',\n value: '',\n required: false,\n invalid: false,\n model,\n validity: defaultValidity,\n element,\n strategy: binderNode.binder.getFieldStrategy(element, model),\n };\n\n this.fieldState = fieldState;\n\n const inputHandler = () => {\n fieldState.strategy.checkValidity();\n // When bad input is detected, skip reading new value in binder state\n if (!fieldState.strategy.validity.badInput) {\n fieldState.value = fieldState.strategy.value;\n }\n fieldState.validity = fieldState.strategy.validity;\n binderNode[_validity] = fieldState.validity;\n binderNode.value = convertFieldValue(model, fieldState.value);\n if (effect !== undefined) {\n effect.call(element, element);\n }\n };\n\n fieldState.strategy.onInput = inputHandler;\n fieldState.strategy.onChange = () => {\n inputHandler();\n void binderNode.validate();\n };\n\n const blurHandler = () => {\n inputHandler();\n void binderNode.validate();\n binderNode.visited = true;\n };\n\n element.addEventListener('blur', blurHandler);\n }\n\n const { fieldState } = this;\n\n if (fieldState.element !== element || fieldState.model !== model) {\n const { onInput } = fieldState.strategy;\n fieldState.strategy = binderNode.binder.getFieldStrategy(element, model);\n fieldState.strategy.onInput = onInput;\n }\n\n const { name } = binderNode;\n if (name !== fieldState.name) {\n fieldState.name = name;\n element.setAttribute('name', name);\n }\n\n const { value } = binderNode;\n const valueFromField = convertFieldValue(model, fieldState.value);\n if (value !== valueFromField && !(Number.isNaN(value) && Number.isNaN(valueFromField))) {\n const nonNanValue = Number.isNaN(value) ? '' : value;\n fieldState.value = nonNanValue;\n fieldState.strategy.value = nonNanValue;\n }\n\n const { required } = binderNode;\n if (required !== fieldState.required) {\n fieldState.required = required;\n fieldState.strategy.required = required;\n }\n\n const firstError: ValueError<any> | undefined = binderNode.ownErrors[0];\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n const errorMessage = firstError?.message || '';\n if (errorMessage !== fieldState.errorMessage) {\n fieldState.errorMessage = errorMessage;\n fieldState.strategy.errorMessage = errorMessage;\n }\n\n const { invalid } = binderNode;\n if (invalid !== fieldState.invalid) {\n fieldState.invalid = invalid;\n fieldState.strategy.invalid = invalid;\n }\n\n return noChange;\n }\n },\n);\n"]}
package/Models.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"Models.js","sourceRoot":"","sources":["src/Models.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n $enum,\n $key,\n $meta,\n $optional,\n $owner,\n type ArrayModel as LibraryArrayModel,\n type $itemModel,\n} from '@vaadin/hilla-models';\nimport isNumeric from 'validator/es/lib/isNumeric.js';\nimport { type BinderNode, getBinderNode } from './BinderNode.js';\nimport type { ProvisionalModel } from './ProvisionalModel.js';\nimport type { Validator } from './Validation.js';\nimport { IsNumber } from './Validators.js';\n\nexport const _createEmptyItemValue = Symbol('createEmptyItemValue');\n\n/** @deprecated use `$key` from the '\\@vaadin/hilla-models' package. */\nexport const _key: typeof $key = $key;\n\n/** @deprecated use `$optional` from the '\\@vaadin/hilla-models' package. */\nexport const _optional: typeof $optional = $optional;\n\n/** @deprecated use `$owner` from the '\\@vaadin/hilla-models' package. */\nexport const _parent: typeof $owner = $owner;\n\n/** @deprecated use `$meta` from the '\\@vaadin/hilla-models' package. */\nexport const _meta: typeof $meta = $meta;\n\n/** @deprecated use `$enum` from the '\\@vaadin/hilla-models' package. */\nexport const _enum: typeof $enum = $enum;\n\nexport const _fromString = Symbol('fromString');\nexport const _validators = Symbol('validators');\nexport const _getPropertyModel = Symbol('getPropertyModel');\nexport const _items = Symbol('items');\n\nexport interface HasFromString<T> {\n [_fromString](value: string): T;\n}\n\nexport function hasFromString<T>(model: ProvisionalModel<T>): model is ProvisionalModel<T> & HasFromString<T> {\n return _fromString in model;\n}\n\nexport type Value<M> = M extends ProvisionalModel<infer T> ? T : never;\n\nexport const modelDetachedParent = { $value$: undefined };\n\nexport type ModelParent = ProvisionalModel | BinderNode | typeof modelDetachedParent;\n\nexport interface Annotation {\n name: string;\n attributes?: Record<string, unknown>;\n}\n\nexport interface ModelMetadata {\n javaType?: string;\n annotations?: Annotation[];\n}\n\nexport interface ModelOptions<T> {\n validators?: ReadonlyArray<Validator<T>>;\n meta?: ModelMetadata;\n}\n\nexport type DetachedModelConstructor<M> = {\n prototype: object;\n new (parent: typeof modelDetachedParent, key: '$value$', optional: boolean): M;\n};\n\nexport function createDetachedModel<M extends AbstractModel>(type: DetachedModelConstructor<M>): M {\n return new type(modelDetachedParent, '$value$', false);\n}\n\nexport abstract class AbstractModel<T = unknown> {\n static createEmptyValue(): unknown {\n return undefined;\n }\n\n declare readonly ['constructor']: typeof AbstractModel<T>;\n\n readonly [$owner]?: ModelParent;\n\n readonly [_validators]: ReadonlyArray<Validator<T>>;\n\n readonly [$meta]: ModelMetadata;\n\n readonly [$optional]: boolean;\n\n [$key]: keyof any;\n\n constructor(parent: ModelParent, key: keyof any, optional: boolean, options?: ModelOptions<T>) {\n this[$owner] = parent;\n this[$key] = key;\n this[$optional] = optional;\n this[_validators] = options?.validators ?? [];\n this[$meta] = options?.meta ?? {};\n }\n\n /**\n * @deprecated Use {@link BinderNode.value} with string conversion instead\n *\n * @example\n * ```ts\n * const result = String(binder.for(model).value);\n * ```\n */\n toString(): string {\n return String(this.valueOf());\n }\n\n /**\n * @deprecated Use {@link BinderNode.value} instead\n *\n * @example\n * ```ts\n * const result = binder.for(model).value;\n * ```\n */\n valueOf(): T {\n const { value } = getBinderNode(this);\n\n if (value === undefined) {\n throw new TypeError('Value is undefined');\n }\n\n return value! as T;\n }\n}\n\nexport abstract class PrimitiveModel<T> extends AbstractModel<T> {}\n\nexport class BooleanModel extends PrimitiveModel<boolean> implements HasFromString<boolean> {\n static override createEmptyValue = Boolean;\n\n [_fromString](str: string): boolean {\n // This implementation matches the values accepted by validator.js and converts all other values to false\n // See https://github.com/validatorjs/validator.js/blob/master/src/lib/isBoolean.js\n return ['true', '1', 'yes'].includes(str.toLowerCase());\n }\n}\n\nexport class NumberModel extends PrimitiveModel<number> implements HasFromString<number | undefined> {\n static override createEmptyValue(): number {\n return NaN;\n }\n\n constructor(parent: ModelParent, key: keyof any, optional: boolean, options?: ModelOptions<number>) {\n // Prepend a built-in validator to indicate NaN input\n const validators = [new IsNumber(optional), ...(options?.validators ?? [])];\n super(parent, key, optional, { ...options, validators });\n }\n\n [_fromString](str: string): number | undefined {\n // Returning undefined is needed to support passing the validation when the value of an optional number field is\n // an empty string\n if (str === '') {\n return undefined;\n }\n return isNumeric(str) ? Number.parseFloat(str) : NaN;\n }\n}\n\nexport class StringModel extends PrimitiveModel<string> implements HasFromString<string> {\n static override createEmptyValue = String;\n [_fromString] = String;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\ndeclare enum Enum {}\n\nexport function makeEnumEmptyValueCreator<M extends EnumModel>(type: DetachedModelConstructor<M>): () => Value<M> {\n const { [$enum]: enumObject } = createDetachedModel(type);\n const defaultValue = Object.values(enumObject)[0] as Value<M>;\n\n return () => defaultValue;\n}\n\nexport abstract class EnumModel<E extends typeof Enum = typeof Enum>\n extends AbstractModel<E[keyof E]>\n implements HasFromString<E[keyof E] | undefined>\n{\n abstract readonly [$enum]: E;\n\n [_fromString](value: string): E[keyof E] | undefined {\n return value in this[$enum] ? (value as E[keyof E]) : undefined;\n }\n}\n\nexport function* getObjectModelOwnAndParentGetters<M extends ObjectModel>(\n model: M,\n): Generator<readonly [key: keyof Value<M>, getter: () => AbstractModel]> {\n for (\n let proto = Object.getPrototypeOf(model);\n proto !== ObjectModel.prototype;\n proto = Object.getPrototypeOf(proto)\n ) {\n const descriptors = Object.getOwnPropertyDescriptors(proto);\n // eslint-disable-next-line @typescript-eslint/unbound-method\n for (const [name, { get }] of Object.entries(descriptors)) {\n if (get) {\n yield [name as keyof Value<M>, get];\n }\n }\n }\n}\n\nexport function makeObjectEmptyValueCreator<M extends ObjectModel>(type: DetachedModelConstructor<M>): () => Value<M> {\n const model = createDetachedModel(type);\n\n return () => {\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n const obj: Partial<Value<M>> = {};\n\n // Iterate the model class hierarchy up to the ObjectModel, and extract\n // the property getter names from every prototypes\n for (const [key, getter] of getObjectModelOwnAndParentGetters(model)) {\n const propertyModel = getter.call(model);\n obj[key] = (\n propertyModel[$optional] ? undefined : propertyModel.constructor.createEmptyValue()\n ) as Value<M>[keyof Value<M>];\n }\n\n return obj as Value<M>;\n };\n}\n\ntype ChildModel<T extends Record<never, never>, K extends keyof T> = AbstractModel<NonNullable<T[K]>>;\n\nexport class ObjectModel<T extends Record<never, never> = Record<never, never>> extends AbstractModel<T> {\n static override createEmptyValue = makeObjectEmptyValueCreator(ObjectModel);\n\n #properties: { [K in keyof T]?: ChildModel<T, K> } = {};\n\n protected [_getPropertyModel]<K extends keyof T, M extends ChildModel<T, K>>(\n key: K,\n init: (parent: this, key: K) => M,\n ): M {\n if (!this.#properties[key]) {\n this.#properties[key] = init(this, key);\n }\n\n return this.#properties[key] as M;\n }\n}\n\nexport type ArrayItemModel<M extends ProvisionalModel> =\n M extends ArrayModel<infer MItem> ? MItem : M extends LibraryArrayModel ? M[typeof $itemModel] : never;\n\nexport class ArrayModel<MItem extends AbstractModel = AbstractModel> extends AbstractModel<Array<Value<MItem>>> {\n static override createEmptyValue(): [] {\n return [];\n }\n\n [_createEmptyItemValue]: () => Value<MItem>;\n\n // The `parent` parameter is AbstractModel here for purpose; for some reason, setting it to `ArrayModel<MItem>` or\n // `this` breaks the type inference in TS (v5.3.2).\n readonly #createItem: (parent: AbstractModel, index: number) => MItem;\n #items: Array<MItem | undefined> = [];\n\n // eslint-disable-next-line @typescript-eslint/max-params\n constructor(\n parent: ModelParent,\n key: keyof any,\n optional: boolean,\n createItem: (parent: AbstractModel, key: number) => MItem,\n options?: ModelOptions<Array<Value<MItem>>>,\n ) {\n super(parent, key, optional, options);\n this.#createItem = createItem;\n this[_createEmptyItemValue] = createItem(this, 0).constructor.createEmptyValue as () => Value<MItem>;\n }\n\n *[_items](): Generator<MItem, void, void> {\n const values = getBinderNode(this).value ?? [];\n\n if (values.length !== this.#items.length) {\n this.#items.length = values.length;\n }\n\n for (let i = 0; i < values.length; i++) {\n let item: MItem | undefined = this.#items[i];\n\n if (!item) {\n item = this.#createItem(this, i);\n this.#items[i] = item;\n }\n\n yield item;\n }\n }\n\n /**\n * Iterates over the current model and yields a binder node for every item\n * model.\n *\n * @deprecated Use the {@link m.items} function instead. For example, in React:\n * ```tsx\n * const {model, field} = useForm(GroupModel);\n * return Array.from(m.items(model.people), (personModel) =>\n * <TextField label=\"Full name\" {...field(personModel.fullName)} />\n * );\n * ```\n * In Lit:\n * ```ts\n * return html`${repeat(\n * m.items(this.binder.model.people),\n * (personModel) => html`<vaadin-text-field label=\"Full name\" ${field(personModel.fullName)}></vaadin-text-field>`,\n * )}`;\n * ```\n */\n *[Symbol.iterator](): IterableIterator<BinderNode<MItem>> {\n for (const item of this[_items]()) {\n yield getBinderNode(item);\n }\n }\n}\n\nexport const m = {\n /**\n * Returns an iterator over item models in the array model.\n *\n * @param model - The array model to iterate over.\n * @returns An iterator over item models.\n */\n items<M extends ArrayModel>(model: M): Generator<ArrayItemModel<M>, void, void> {\n return model[_items]() as Generator<ArrayItemModel<M>, void, void>;\n },\n};\n"]}
1
+ {"version":3,"file":"Models.js","sourceRoot":"","sources":["src/Models.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n $enum,\n $key,\n $meta,\n $optional,\n $owner,\n type ArrayModel as LibraryArrayModel,\n type $itemModel,\n} from '@vaadin/hilla-models';\nimport isNumeric from 'validator/es/lib/isNumeric.js';\nimport { type BinderNode, getBinderNode } from './BinderNode.js';\nimport type { ProvisionalModel } from './ProvisionalModel.js';\nimport type { Validator } from './Validation.js';\nimport { IsNumber } from './Validators.js';\n\nexport const _createEmptyItemValue = Symbol('createEmptyItemValue');\n\n/** @deprecated use `$key` from the '\\@vaadin/hilla-models' package. */\nexport const _key: typeof $key = $key;\n\n/** @deprecated use `$optional` from the '\\@vaadin/hilla-models' package. */\nexport const _optional: typeof $optional = $optional;\n\n/** @deprecated use `$owner` from the '\\@vaadin/hilla-models' package. */\nexport const _parent: typeof $owner = $owner;\n\n/** @deprecated use `$meta` from the '\\@vaadin/hilla-models' package. */\nexport const _meta: typeof $meta = $meta;\n\n/** @deprecated use `$enum` from the '\\@vaadin/hilla-models' package. */\nexport const _enum: typeof $enum = $enum;\n\nexport const _fromString = Symbol('fromString');\nexport const _validators = Symbol('validators');\nexport const _getPropertyModel = Symbol('getPropertyModel');\nexport const _items = Symbol('items');\n\nexport interface HasFromString<T> {\n [_fromString](value: string): T;\n}\n\nexport function hasFromString<T>(model: ProvisionalModel<T>): model is ProvisionalModel<T> & HasFromString<T> {\n return _fromString in model;\n}\n\nexport type Value<M> = M extends ProvisionalModel<infer T> ? T : never;\n\nexport const modelDetachedParent = { $value$: undefined };\n\nexport type ModelParent = ProvisionalModel | BinderNode | typeof modelDetachedParent;\n\nexport interface Annotation {\n name: string;\n attributes?: Record<string, unknown>;\n}\n\nexport interface ModelMetadata {\n javaType?: string;\n annotations?: Annotation[];\n}\n\nexport interface ModelOptions<T> {\n validators?: ReadonlyArray<Validator<T>>;\n meta?: ModelMetadata;\n}\n\nexport type DetachedModelConstructor<M> = {\n prototype: object;\n new (parent: typeof modelDetachedParent, key: '$value$', optional: boolean): M;\n};\n\nexport function createDetachedModel<M extends AbstractModel>(type: DetachedModelConstructor<M>): M {\n return new type(modelDetachedParent, '$value$', false);\n}\n\nexport abstract class AbstractModel<T = unknown> {\n static createEmptyValue(): unknown {\n return undefined;\n }\n\n declare readonly ['constructor']: typeof AbstractModel<T>;\n\n readonly [$owner]?: ModelParent;\n\n readonly [_validators]: ReadonlyArray<Validator<T>>;\n\n readonly [$meta]: ModelMetadata;\n\n readonly [$optional]: boolean;\n\n [$key]: keyof any;\n\n constructor(parent: ModelParent, key: keyof any, optional: boolean, options?: ModelOptions<T>) {\n this[$owner] = parent;\n this[$key] = key;\n this[$optional] = optional;\n this[_validators] = options?.validators ?? [];\n this[$meta] = options?.meta ?? {};\n }\n\n /**\n * @deprecated Use {@link BinderNode.value} with string conversion instead\n *\n * @example\n * ```ts\n * const result = String(binder.for(model).value);\n * ```\n */\n toString(): string {\n return String(this.valueOf());\n }\n\n /**\n * @deprecated Use {@link BinderNode.value} instead\n *\n * @example\n * ```ts\n * const result = binder.for(model).value;\n * ```\n */\n valueOf(): T {\n const { value } = getBinderNode(this);\n\n if (value === undefined) {\n throw new TypeError('Value is undefined');\n }\n\n return value!;\n }\n}\n\nexport abstract class PrimitiveModel<T> extends AbstractModel<T> {}\n\nexport class BooleanModel extends PrimitiveModel<boolean> implements HasFromString<boolean> {\n static override createEmptyValue = Boolean;\n\n [_fromString](str: string): boolean {\n // This implementation matches the values accepted by validator.js and converts all other values to false\n // See https://github.com/validatorjs/validator.js/blob/master/src/lib/isBoolean.js\n return ['true', '1', 'yes'].includes(str.toLowerCase());\n }\n}\n\nexport class NumberModel extends PrimitiveModel<number> implements HasFromString<number | undefined> {\n static override createEmptyValue(): number {\n return NaN;\n }\n\n constructor(parent: ModelParent, key: keyof any, optional: boolean, options?: ModelOptions<number>) {\n // Prepend a built-in validator to indicate NaN input\n const validators = [new IsNumber(optional), ...(options?.validators ?? [])];\n super(parent, key, optional, { ...options, validators });\n }\n\n [_fromString](str: string): number | undefined {\n // Returning undefined is needed to support passing the validation when the value of an optional number field is\n // an empty string\n if (str === '') {\n return undefined;\n }\n return isNumeric(str) ? Number.parseFloat(str) : NaN;\n }\n}\n\nexport class StringModel extends PrimitiveModel<string> implements HasFromString<string> {\n static override createEmptyValue = String;\n [_fromString] = String;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\ndeclare enum Enum {}\n\nexport function makeEnumEmptyValueCreator<M extends EnumModel>(type: DetachedModelConstructor<M>): () => Value<M> {\n const { [$enum]: enumObject } = createDetachedModel(type);\n const defaultValue = Object.values(enumObject)[0] as Value<M>;\n\n return () => defaultValue;\n}\n\nexport abstract class EnumModel<E extends typeof Enum = typeof Enum>\n extends AbstractModel<E[keyof E]>\n implements HasFromString<E[keyof E] | undefined>\n{\n abstract readonly [$enum]: E;\n\n [_fromString](value: string): E[keyof E] | undefined {\n return value in this[$enum] ? (value as E[keyof E]) : undefined;\n }\n}\n\nexport function* getObjectModelOwnAndParentGetters<M extends ObjectModel>(\n model: M,\n): Generator<readonly [key: keyof Value<M>, getter: () => AbstractModel]> {\n for (\n let proto = Object.getPrototypeOf(model);\n proto !== ObjectModel.prototype;\n proto = Object.getPrototypeOf(proto)\n ) {\n const descriptors = Object.getOwnPropertyDescriptors(proto);\n // eslint-disable-next-line @typescript-eslint/unbound-method\n for (const [name, { get }] of Object.entries(descriptors)) {\n if (get) {\n yield [name as keyof Value<M>, get];\n }\n }\n }\n}\n\nexport function makeObjectEmptyValueCreator<M extends ObjectModel>(type: DetachedModelConstructor<M>): () => Value<M> {\n const model = createDetachedModel(type);\n\n return () => {\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n const obj: Partial<Value<M>> = {};\n\n // Iterate the model class hierarchy up to the ObjectModel, and extract\n // the property getter names from every prototypes\n for (const [key, getter] of getObjectModelOwnAndParentGetters(model)) {\n const propertyModel = getter.call(model);\n obj[key] = (\n propertyModel[$optional] ? undefined : propertyModel.constructor.createEmptyValue()\n ) as Value<M>[keyof Value<M>];\n }\n\n return obj as Value<M>;\n };\n}\n\ntype ChildModel<T extends Record<never, never>, K extends keyof T> = AbstractModel<NonNullable<T[K]>>;\n\nexport class ObjectModel<T extends Record<never, never> = Record<never, never>> extends AbstractModel<T> {\n static override createEmptyValue = makeObjectEmptyValueCreator(ObjectModel);\n\n #properties: { [K in keyof T]?: ChildModel<T, K> } = {};\n\n protected [_getPropertyModel]<K extends keyof T, M extends ChildModel<T, K>>(\n key: K,\n init: (parent: this, key: K) => M,\n ): M {\n if (!this.#properties[key]) {\n this.#properties[key] = init(this, key);\n }\n\n return this.#properties[key] as M;\n }\n}\n\nexport type ArrayItemModel<M extends ProvisionalModel> =\n M extends ArrayModel<infer MItem> ? MItem : M extends LibraryArrayModel ? M[typeof $itemModel] : never;\n\nexport class ArrayModel<MItem extends AbstractModel = AbstractModel> extends AbstractModel<Array<Value<MItem>>> {\n static override createEmptyValue(): [] {\n return [];\n }\n\n [_createEmptyItemValue]: () => Value<MItem>;\n\n // The `parent` parameter is AbstractModel here for purpose; for some reason, setting it to `ArrayModel<MItem>` or\n // `this` breaks the type inference in TS (v5.3.2).\n readonly #createItem: (parent: AbstractModel, index: number) => MItem;\n #items: Array<MItem | undefined> = [];\n\n // eslint-disable-next-line @typescript-eslint/max-params\n constructor(\n parent: ModelParent,\n key: keyof any,\n optional: boolean,\n createItem: (parent: AbstractModel, key: number) => MItem,\n options?: ModelOptions<Array<Value<MItem>>>,\n ) {\n super(parent, key, optional, options);\n this.#createItem = createItem;\n this[_createEmptyItemValue] = createItem(this, 0).constructor.createEmptyValue as () => Value<MItem>;\n }\n\n *[_items](): Generator<MItem, void, void> {\n const values = getBinderNode(this).value ?? [];\n\n if (values.length !== this.#items.length) {\n this.#items.length = values.length;\n }\n\n for (let i = 0; i < values.length; i++) {\n let item: MItem | undefined = this.#items[i];\n\n if (!item) {\n item = this.#createItem(this, i);\n this.#items[i] = item;\n }\n\n yield item;\n }\n }\n\n /**\n * Iterates over the current model and yields a binder node for every item\n * model.\n *\n * @deprecated Use the {@link m.items} function instead. For example, in React:\n * ```tsx\n * const {model, field} = useForm(GroupModel);\n * return Array.from(m.items(model.people), (personModel) =>\n * <TextField label=\"Full name\" {...field(personModel.fullName)} />\n * );\n * ```\n * In Lit:\n * ```ts\n * return html`${repeat(\n * m.items(this.binder.model.people),\n * (personModel) => html`<vaadin-text-field label=\"Full name\" ${field(personModel.fullName)}></vaadin-text-field>`,\n * )}`;\n * ```\n */\n *[Symbol.iterator](): IterableIterator<BinderNode<MItem>> {\n for (const item of this[_items]()) {\n yield getBinderNode(item);\n }\n }\n}\n\nexport const m = {\n /**\n * Returns an iterator over item models in the array model.\n *\n * @param model - The array model to iterate over.\n * @returns An iterator over item models.\n */\n items<M extends ArrayModel>(model: M): Generator<ArrayItemModel<M>, void, void> {\n return model[_items]() as Generator<ArrayItemModel<M>, void, void>;\n },\n};\n"]}
package/index.js CHANGED
@@ -11,7 +11,7 @@ export * from './stringConverters.js';
11
11
  vaadinObj.registrations ??= [];
12
12
  vaadinObj.registrations.push({
13
13
  is: feature ? `@vaadin/hilla-lit-form/${feature}` : '@vaadin/hilla-lit-form',
14
- version: '25.2.0-alpha2',
14
+ version: '25.2.0-alpha4',
15
15
  });
16
16
  })();
17
17
  //# sourceMappingURL=index.js.map
package/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAE5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,uBAAuB,CAAC;AAItC,CAAC,CAAC,OAAO,EAAE,SAAS,GAAG,CAAC,UAAU,CAAC,MAAM,KAAK,EAAE,CAAC,EAAE,EAAE;IACnD,SAAS,CAAC,aAAa,KAAK,EAAE,CAAC;IAC/B,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC;QAC3B,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,0BAA0B,OAAO,EAAE,CAAC,CAAC,CAAC,wBAAwB;QAC5E,OAAO,EAAE,eAAe;KACzB,CAAC,CAAC;AACL,CAAC,CAAC,EAAE,CAAC","sourcesContent":["export * from './Binder.js';\nexport * from './BinderRoot.js';\nexport * from './BinderNode.js';\nexport * from './Field.js';\nexport * from './Models.js';\nexport type * from './ProvisionalModel.js';\nexport * from './Validation.js';\nexport * from './Validators.js';\nexport * from './Validity.js';\nexport * from './stringConverters.js';\n\n// @ts-expect-error: esbuild injection\n// eslint-disable-next-line @typescript-eslint/no-unsafe-call\n((feature, vaadinObj = (globalThis.Vaadin ??= {})) => {\n vaadinObj.registrations ??= [];\n vaadinObj.registrations.push({\n is: feature ? `@vaadin/hilla-lit-form/${feature}` : '@vaadin/hilla-lit-form',\n version: '25.2.0-alpha2',\n });\n})();\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAE5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,uBAAuB,CAAC;AAItC,CAAC,CAAC,OAAO,EAAE,SAAS,GAAG,CAAC,UAAU,CAAC,MAAM,KAAK,EAAE,CAAC,EAAE,EAAE;IACnD,SAAS,CAAC,aAAa,KAAK,EAAE,CAAC;IAC/B,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC;QAC3B,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,0BAA0B,OAAO,EAAE,CAAC,CAAC,CAAC,wBAAwB;QAC5E,OAAO,EAAE,eAAe;KACzB,CAAC,CAAC;AACL,CAAC,CAAC,EAAE,CAAC","sourcesContent":["export * from './Binder.js';\nexport * from './BinderRoot.js';\nexport * from './BinderNode.js';\nexport * from './Field.js';\nexport * from './Models.js';\nexport type * from './ProvisionalModel.js';\nexport * from './Validation.js';\nexport * from './Validators.js';\nexport * from './Validity.js';\nexport * from './stringConverters.js';\n\n// @ts-expect-error: esbuild injection\n// eslint-disable-next-line @typescript-eslint/no-unsafe-call\n((feature, vaadinObj = (globalThis.Vaadin ??= {})) => {\n vaadinObj.registrations ??= [];\n vaadinObj.registrations.push({\n is: feature ? `@vaadin/hilla-lit-form/${feature}` : '@vaadin/hilla-lit-form',\n version: '25.2.0-alpha4',\n });\n})();\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vaadin/hilla-lit-form",
3
- "version": "25.2.0-alpha2",
3
+ "version": "25.2.0-alpha4",
4
4
  "description": "Hilla form utils",
5
5
  "main": "index.js",
6
6
  "module": "index.js",
@@ -69,8 +69,8 @@
69
69
  "access": "public"
70
70
  },
71
71
  "dependencies": {
72
- "@vaadin/hilla-frontend": "25.2.0-alpha2",
73
- "@vaadin/hilla-models": "25.2.0-alpha2",
72
+ "@vaadin/hilla-frontend": "25.2.0-alpha4",
73
+ "@vaadin/hilla-models": "25.2.0-alpha4",
74
74
  "validator": "13.15.22"
75
75
  },
76
76
  "peerDependencies": {