@vaadin/hilla-lit-form 25.0.9 → 25.0.10
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 +1 -2
- package/BinderNode.js.map +1 -1
- package/BinderRoot.d.ts +1 -1
- package/BinderRoot.js.map +1 -1
- package/Field.js.map +1 -1
- package/Models.js.map +1 -1
- package/index.js +1 -1
- package/index.js.map +1 -1
- package/package.json +2 -2
package/BinderNode.js
CHANGED
|
@@ -276,8 +276,7 @@ export class BinderNode extends EventTarget {
|
|
|
276
276
|
value = this.model.constructor.createEmptyValue();
|
|
277
277
|
__classPrivateFieldGet(this, _BinderNode_instances, "m", _BinderNode_setValueState).call(this, value, defaultValue === undefined ? value : defaultValue);
|
|
278
278
|
}
|
|
279
|
-
else if (this.parent.model instanceof ObjectModel &&
|
|
280
|
-
!(key in (this.parent.value || {}))) {
|
|
279
|
+
else if (this.parent.model instanceof ObjectModel && !(key in Object(this.parent.value ?? {}))) {
|
|
281
280
|
__classPrivateFieldGet(this, _BinderNode_instances, "m", _BinderNode_setValueState).call(this, undefined, defaultValue === undefined ? value : defaultValue);
|
|
282
281
|
}
|
|
283
282
|
}
|
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\n\nimport type { BinderRoot } from './BinderRoot.js';\nimport {\n _createEmptyItemValue,\n _key,\n _parent,\n _validators,\n AbstractModel,\n type ArrayItemModel,\n ArrayModel,\n getObjectModelOwnAndParentGetters,\n ObjectModel,\n type Value,\n} from './Models.js';\nimport type { ClassStaticProperties } from './types.js';\nimport type { Validator, ValueError } from './Validation.js';\nimport { ValidityStateValidator } from './Validators.js';\nimport { _validity } from './Validity.js';\n\nexport const _updateValidation = Symbol('updateValidation');\nexport const _update = Symbol('update');\nexport const _setErrorsWithDescendants = Symbol('setErrorsWithDescendants');\nexport const _clearValidation = Symbol('clearValidation');\n\nconst nodes = new WeakMap<AbstractModel, BinderNode>();\n\nexport function getBinderNode<M extends AbstractModel>(model: M): BinderNode<M> {\n let node = nodes.get(model);\n\n if (!node) {\n node = new BinderNode(model);\n nodes.set(model, node);\n }\n\n return node as BinderNode<M>;\n}\n\nfunction getErrorPropertyName(valueError: ValueError): string {\n return typeof valueError.property === 'string' ? valueError.property : getBinderNode(valueError.property).name;\n}\n\nfunction updateObjectOrArrayKey<M extends AbstractModel>(\n model: M,\n value: Value<M>,\n key: keyof any,\n keyValue: unknown,\n): Value<M> {\n if (model instanceof ObjectModel) {\n // Value contained in object - replace object in parent\n return {\n ...(value as Record<never, never> & Value<M>),\n [key]: keyValue,\n };\n }\n\n if (keyValue === undefined) {\n throw new TypeError('Unexpected undefined value');\n }\n\n if (model instanceof ArrayModel) {\n // Value contained in array - replace array in parent\n const array = (value as unknown[]).slice();\n array[key as number] = keyValue;\n return array as Value<M>;\n }\n\n throw new TypeError(`Unknown model type ${(model as AbstractModel).constructor.name}`);\n}\n\nexport const CHANGED = new Event('binder-node-changed');\n\nclass NotArrayModelError extends Error {\n constructor() {\n super('The model does not represent array');\n }\n}\n\nclass NotArrayItemModelError extends Error {\n constructor() {\n super('The model does not represent array item');\n }\n}\n\ndeclare class ArrayItemBinderNode<M extends AbstractModel> extends BinderNode<M> {\n // @ts-expect-error: re-defining the parent getter.\n declare readonly parent: BinderNode<ArrayModel<M>>;\n}\n\nconst defaultArrayItemCache = new WeakMap<BinderNode, unknown>();\n\n/**\n * The BinderNode\\<M\\> class provides the form binding related APIs\n * with respect to a particular model instance.\n *\n * Structurally, model instances form a tree, in which the object\n * and array models have child nodes of field and array item model\n * instances.\n */\nexport class BinderNode<M extends AbstractModel = AbstractModel> extends EventTarget {\n declare readonly ['constructor']: ClassStaticProperties<typeof BinderNode<M>>;\n readonly model: M;\n /**\n * The validity state read from the bound element, if any. Represents the\n * HTML element internal validation.\n *\n * For elements with `validity.valid === false`, the value in the\n * bound element is considered as invalid.\n */\n [_validity]?: ValidityState;\n #ownErrors?: ReadonlyArray<ValueError<Value<M>>>;\n #validators: ReadonlyArray<Validator<Value<M>>>;\n readonly #validityStateValidator: ValidityStateValidator<Value<M>>;\n #visited = false;\n\n constructor(model: M) {\n super();\n this.model = model;\n nodes.set(model, this);\n this.#validityStateValidator = new ValidityStateValidator<Value<M>>();\n this.#validators = model[_validators];\n\n // Workaround for children initialization with private props\n if (this.constructor === BinderNode) {\n this.initializeValue();\n }\n }\n\n /**\n * The binder for the top-level model.\n */\n get binder(): BinderRoot {\n const binder = this.parent?.binder;\n\n if (!binder) {\n throw new TypeError('BinderNode is detached');\n }\n\n return binder;\n }\n\n /**\n * The default value related to the model\n */\n get defaultValue(): Value<M> | undefined {\n const key = this.model[_key];\n const parentDefaultValue = this.parent!.defaultValue as Readonly<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 = this.model.constructor.createEmptyValue();\n defaultArrayItemCache.set(this.parent, value);\n return value as Value<M>;\n }\n\n return parentDefaultValue[key];\n }\n\n /**\n * True if the current value is different from the defaultValue.\n */\n get dirty(): boolean {\n return this.value !== this.defaultValue;\n }\n\n /**\n * The combined array of all errors for this node’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: AbstractModel } = this;\n let name = '';\n\n while (model[_parent] instanceof AbstractModel) {\n name = `${String(model[_key])}${name ? `.${name}` : ''}`;\n model = model[_parent];\n }\n\n return name;\n }\n\n /**\n * The array of validation errors directly related with the model.\n */\n get ownErrors(): ReadonlyArray<ValueError<Value<M>>> {\n return this.#ownErrors ? this.#ownErrors : [];\n }\n\n /**\n * The parent node, if this binder node corresponds to a nested model,\n * otherwise undefined for the top-level binder.\n */\n get parent(): BinderNode | undefined {\n const modelParent = this.model[_parent];\n return modelParent instanceof AbstractModel ? getBinderNode(modelParent) : undefined;\n }\n\n /**\n * True if the value is required to be non-empty.\n */\n get required(): boolean {\n return this.#validators.some((validator) => validator.impliesRequired);\n }\n\n /**\n * The array of validators for the model. The default value is defined in the\n * model.\n */\n get validators(): ReadonlyArray<Validator<Value<M>>> {\n return this.#validators;\n }\n\n set validators(validators: ReadonlyArray<Validator<Value<M>>>) {\n this.#validators = validators;\n this.dispatchEvent(CHANGED);\n }\n\n /**\n * The current value related to the model\n */\n get value(): Value<M> | undefined {\n if (!this.parent) {\n return undefined;\n }\n\n this.initializeValue();\n\n const key = this.model[_key];\n\n // The value of parent in unknown, so we need to cast it.\n type ParentValue = Readonly<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 ?? this.model[_createEmptyItemValue]();\n const newValue = [...(this.value ?? []), itemValueOrEmptyValue];\n const newDefaultValue = [...(this.defaultValue ?? []), itemValueOrEmptyValue];\n this.#setValueState(newValue, newDefaultValue);\n } else {\n throw new NotArrayModelError();\n }\n }\n\n /**\n * Returns a binder node for the nested model instance.\n *\n * @param model - The nested model instance\n */\n for<N extends AbstractModel>(model: N): BinderNode<N> {\n const binderNode = getBinderNode(model);\n if (binderNode.binder !== this.binder) {\n throw new Error('Unknown binder');\n }\n\n return binderNode;\n }\n\n prependItem(item?: Value<ArrayItemModel<M>>): void {\n if (this.#isArray()) {\n const itemValueOrEmptyValue = item ?? this.model[_createEmptyItemValue]();\n const newValue = [itemValueOrEmptyValue, ...(this.value ?? [])];\n const newDefaultValue = [itemValueOrEmptyValue, ...(this.defaultValue ?? [])];\n this.#setValueState(newValue, newDefaultValue);\n } else {\n throw new NotArrayModelError();\n }\n }\n\n removeSelf(): void {\n if (this.#isArrayItem()) {\n const newValue = (this.parent.value ?? []).filter((_, i) => i !== this.model[_key]);\n const newDefaultValue = (this.parent.defaultValue ?? []).filter((_, i) => i !== this.model[_key]);\n this.parent.#setValueState(newValue, newDefaultValue);\n } else {\n throw new NotArrayItemModelError();\n }\n }\n\n /**\n * Runs all validation callbacks potentially affecting this\n * or any nested model. Returns the combined array of all\n * errors as in the errors property.\n */\n async validate(): Promise<readonly ValueError[]> {\n const errors = await Promise.all([\n ...this.#requestValidationOfDescendants(),\n ...this.#requestValidationWithAncestors(),\n ]).then((arr) => arr.flat());\n this[_setErrorsWithDescendants](errors.length ? errors : undefined);\n this[_update]();\n return errors;\n }\n\n protected [_clearValidation](): boolean {\n if (this.#visited) {\n this.#visited = false;\n this.dispatchEvent(CHANGED);\n }\n let needsUpdate = false;\n if (this.#ownErrors) {\n this.#ownErrors = undefined;\n needsUpdate = true;\n this.dispatchEvent(CHANGED);\n }\n if ([...this.#getChildBinderNodes()].filter((childBinderNode) => childBinderNode[_clearValidation]()).length > 0) {\n needsUpdate = true;\n }\n return needsUpdate;\n }\n\n protected [_setErrorsWithDescendants](errors?: readonly ValueError[]): void {\n const { name } = this;\n const ownErrors = errors\n ? (errors.filter((valueError) => getErrorPropertyName(valueError) === name) as ReadonlyArray<\n ValueError<Value<M>>\n >)\n : undefined;\n const relatedErrors = errors\n ? errors.filter((valueError) => getErrorPropertyName(valueError).startsWith(name))\n : undefined;\n this.#ownErrors = ownErrors;\n for (const childBinderNode of this.#getChildBinderNodes()) {\n childBinderNode[_setErrorsWithDescendants](relatedErrors);\n }\n this.dispatchEvent(CHANGED);\n }\n\n protected [_update](_?: Value<M>): void {\n if (this.parent) {\n this.parent[_update]();\n }\n }\n\n protected async [_updateValidation](): Promise<void> {\n if (this.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.#isObject()) {\n for (const [, getter] of getObjectModelOwnAndParentGetters(this.model)) {\n const childModel = getter.call(this.model);\n // We need to skip all non-initialised optional fields here in order\n // to prevent infinite recursion for circular references in the model.\n // Here we rely on presence of keys in `defaultValue` to detect all\n // initialised fields. The keys in `defaultValue` are defined for all\n // non-optional fields plus those optional fields whose values were\n // set from initial `binder.read()` or `binder.clear()` or by using a\n // binder node (e.g., form binding) for a nested field.\n if (childModel[_key] in (this.defaultValue as Record<never, never>)) {\n yield getBinderNode(childModel);\n }\n }\n } else if (this.#isArray()) {\n for (const childBinderNode of this.model) {\n yield childBinderNode;\n }\n }\n }\n\n #isArray(): this is BinderNode<ArrayModel> {\n return this.model instanceof ArrayModel;\n }\n\n #isArrayItem(): this is ArrayItemBinderNode<M> {\n return this.model[_parent] instanceof ArrayModel;\n }\n\n #isObject(): this is BinderNode<ObjectModel> {\n return this.model instanceof ObjectModel;\n }\n\n *#requestValidationOfDescendants(): Generator<Promise<readonly ValueError[]>, void, void> {\n for (const node of this.#getChildBinderNodes()) {\n yield* node.#runOwnValidators();\n yield* node.#requestValidationOfDescendants();\n }\n }\n\n *#requestValidationWithAncestors(): Generator<Promise<readonly ValueError[]>, void, void> {\n yield* this.#runOwnValidators();\n\n if (this.parent) {\n yield* this.parent.#requestValidationWithAncestors();\n }\n }\n\n *#runOwnValidators(): Generator<Promise<readonly ValueError[]>, void, void> {\n const hasInvalidState = this[_validity] && !this[_validity].valid;\n const hasBadInput = !!this[_validity]?.badInput;\n\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing\n if ((hasInvalidState && !hasBadInput) || !hasInvalidState) {\n for (const validator of this.#validators) {\n yield this.binder.requestValidation(this.model, validator);\n }\n }\n\n if (hasInvalidState) {\n yield this.binder.requestValidation(this.model, this.#validityStateValidator);\n }\n }\n\n initializeValue(forceInitialize = false): void {\n // First, make sure parents have value initialized\n if (\n this.parent &&\n (this.parent.value === undefined || (this.parent.defaultValue as Value<M> | undefined) === undefined)\n ) {\n this.parent.initializeValue(true);\n }\n\n const key = this.model[_key];\n let value: Value<M> | undefined = this.parent\n ? (this.parent.value as 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 = this.model.constructor.createEmptyValue() as Value<M>;\n this.#setValueState(value, defaultValue === undefined ? value : defaultValue);\n } else if (\n this.parent.model instanceof ObjectModel &&\n !(key in ((this.parent.value || {}) as 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":"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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\n\nimport type { BinderRoot } from './BinderRoot.js';\nimport {\n _createEmptyItemValue,\n _key,\n _parent,\n _validators,\n AbstractModel,\n type ArrayItemModel,\n ArrayModel,\n getObjectModelOwnAndParentGetters,\n ObjectModel,\n type Value,\n} from './Models.js';\nimport type { ClassStaticProperties } from './types.js';\nimport type { Validator, ValueError } from './Validation.js';\nimport { ValidityStateValidator } from './Validators.js';\nimport { _validity } from './Validity.js';\n\nexport const _updateValidation = Symbol('updateValidation');\nexport const _update = Symbol('update');\nexport const _setErrorsWithDescendants = Symbol('setErrorsWithDescendants');\nexport const _clearValidation = Symbol('clearValidation');\n\nconst nodes = new WeakMap<AbstractModel, BinderNode>();\n\nexport function getBinderNode<M extends AbstractModel>(model: M): BinderNode<M> {\n let node = nodes.get(model);\n\n if (!node) {\n node = new BinderNode(model);\n nodes.set(model, node);\n }\n\n return node as BinderNode<M>;\n}\n\nfunction getErrorPropertyName(valueError: ValueError): string {\n return typeof valueError.property === 'string' ? valueError.property : getBinderNode(valueError.property).name;\n}\n\nfunction updateObjectOrArrayKey<M extends AbstractModel>(\n model: M,\n value: Value<M>,\n key: keyof any,\n keyValue: unknown,\n): Value<M> {\n if (model instanceof ObjectModel) {\n // Value contained in object - replace object in parent\n return {\n ...(value as Record<never, never> & Value<M>),\n [key]: keyValue,\n };\n }\n\n if (keyValue === undefined) {\n throw new TypeError('Unexpected undefined value');\n }\n\n if (model instanceof ArrayModel) {\n // Value contained in array - replace array in parent\n const array = (value as unknown[]).slice();\n array[key as number] = keyValue;\n return array as Value<M>;\n }\n\n throw new TypeError(`Unknown model type ${(model as AbstractModel).constructor.name}`);\n}\n\nexport const CHANGED = new Event('binder-node-changed');\n\nclass NotArrayModelError extends Error {\n constructor() {\n super('The model does not represent array');\n }\n}\n\nclass NotArrayItemModelError extends Error {\n constructor() {\n super('The model does not represent array item');\n }\n}\n\ndeclare class ArrayItemBinderNode<M extends AbstractModel> extends BinderNode<M> {\n // @ts-expect-error: re-defining the parent getter.\n declare readonly parent: BinderNode<ArrayModel<M>>;\n}\n\nconst defaultArrayItemCache = new WeakMap<BinderNode, unknown>();\n\n/**\n * The BinderNode\\<M\\> class provides the form binding related APIs\n * with respect to a particular model instance.\n *\n * Structurally, model instances form a tree, in which the object\n * and array models have child nodes of field and array item model\n * instances.\n */\nexport class BinderNode<M extends AbstractModel = AbstractModel> extends EventTarget {\n declare readonly ['constructor']: ClassStaticProperties<typeof BinderNode<M>>;\n readonly model: M;\n /**\n * The validity state read from the bound element, if any. Represents the\n * HTML element internal validation.\n *\n * For elements with `validity.valid === false`, the value in the\n * bound element is considered as invalid.\n */\n [_validity]?: ValidityState;\n #ownErrors?: ReadonlyArray<ValueError<Value<M>>>;\n #validators: ReadonlyArray<Validator<Value<M>>>;\n readonly #validityStateValidator: ValidityStateValidator<Value<M>>;\n #visited = false;\n\n constructor(model: M) {\n super();\n this.model = model;\n nodes.set(model, this);\n this.#validityStateValidator = new ValidityStateValidator<Value<M>>();\n this.#validators = model[_validators];\n\n // Workaround for children initialization with private props\n if (this.constructor === BinderNode) {\n this.initializeValue();\n }\n }\n\n /**\n * The binder for the top-level model.\n */\n get binder(): BinderRoot {\n const binder = this.parent?.binder;\n\n if (!binder) {\n throw new TypeError('BinderNode is detached');\n }\n\n return binder;\n }\n\n /**\n * The default value related to the model\n */\n get defaultValue(): Value<M> | undefined {\n const key = this.model[_key];\n const parentDefaultValue = this.parent!.defaultValue as Readonly<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 = this.model.constructor.createEmptyValue();\n defaultArrayItemCache.set(this.parent, value);\n return value as Value<M>;\n }\n\n return parentDefaultValue[key];\n }\n\n /**\n * True if the current value is different from the defaultValue.\n */\n get dirty(): boolean {\n return this.value !== this.defaultValue;\n }\n\n /**\n * The combined array of all errors for this node’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: AbstractModel } = this;\n let name = '';\n\n while (model[_parent] instanceof AbstractModel) {\n name = `${String(model[_key])}${name ? `.${name}` : ''}`;\n model = model[_parent];\n }\n\n return name;\n }\n\n /**\n * The array of validation errors directly related with the model.\n */\n get ownErrors(): ReadonlyArray<ValueError<Value<M>>> {\n return this.#ownErrors ? this.#ownErrors : [];\n }\n\n /**\n * The parent node, if this binder node corresponds to a nested model,\n * otherwise undefined for the top-level binder.\n */\n get parent(): BinderNode | undefined {\n const modelParent = this.model[_parent];\n return modelParent instanceof AbstractModel ? getBinderNode(modelParent) : undefined;\n }\n\n /**\n * True if the value is required to be non-empty.\n */\n get required(): boolean {\n return this.#validators.some((validator) => validator.impliesRequired);\n }\n\n /**\n * The array of validators for the model. The default value is defined in the\n * model.\n */\n get validators(): ReadonlyArray<Validator<Value<M>>> {\n return this.#validators;\n }\n\n set validators(validators: ReadonlyArray<Validator<Value<M>>>) {\n this.#validators = validators;\n this.dispatchEvent(CHANGED);\n }\n\n /**\n * The current value related to the model\n */\n get value(): Value<M> | undefined {\n if (!this.parent) {\n return undefined;\n }\n\n this.initializeValue();\n\n const key = this.model[_key];\n\n // The value of parent in unknown, so we need to cast it.\n type ParentValue = Readonly<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 ?? this.model[_createEmptyItemValue]();\n const newValue = [...(this.value ?? []), itemValueOrEmptyValue];\n const newDefaultValue = [...(this.defaultValue ?? []), itemValueOrEmptyValue];\n this.#setValueState(newValue, newDefaultValue);\n } else {\n throw new NotArrayModelError();\n }\n }\n\n /**\n * Returns a binder node for the nested model instance.\n *\n * @param model - The nested model instance\n */\n for<N extends AbstractModel>(model: N): BinderNode<N> {\n const binderNode = getBinderNode(model);\n if (binderNode.binder !== this.binder) {\n throw new Error('Unknown binder');\n }\n\n return binderNode;\n }\n\n prependItem(item?: Value<ArrayItemModel<M>>): void {\n if (this.#isArray()) {\n const itemValueOrEmptyValue = item ?? this.model[_createEmptyItemValue]();\n const newValue = [itemValueOrEmptyValue, ...(this.value ?? [])];\n const newDefaultValue = [itemValueOrEmptyValue, ...(this.defaultValue ?? [])];\n this.#setValueState(newValue, newDefaultValue);\n } else {\n throw new NotArrayModelError();\n }\n }\n\n removeSelf(): void {\n if (this.#isArrayItem()) {\n const newValue = (this.parent.value ?? []).filter((_, i) => i !== this.model[_key]);\n const newDefaultValue = (this.parent.defaultValue ?? []).filter((_, i) => i !== this.model[_key]);\n this.parent.#setValueState(newValue, newDefaultValue);\n } else {\n throw new NotArrayItemModelError();\n }\n }\n\n /**\n * Runs all validation callbacks potentially affecting this\n * or any nested model. Returns the combined array of all\n * errors as in the errors property.\n */\n async validate(): Promise<readonly ValueError[]> {\n const errors = await Promise.all([\n ...this.#requestValidationOfDescendants(),\n ...this.#requestValidationWithAncestors(),\n ]).then((arr) => arr.flat());\n this[_setErrorsWithDescendants](errors.length ? errors : undefined);\n this[_update]();\n return errors;\n }\n\n protected [_clearValidation](): boolean {\n if (this.#visited) {\n this.#visited = false;\n this.dispatchEvent(CHANGED);\n }\n let needsUpdate = false;\n if (this.#ownErrors) {\n this.#ownErrors = undefined;\n needsUpdate = true;\n this.dispatchEvent(CHANGED);\n }\n if ([...this.#getChildBinderNodes()].filter((childBinderNode) => childBinderNode[_clearValidation]()).length > 0) {\n needsUpdate = true;\n }\n return needsUpdate;\n }\n\n protected [_setErrorsWithDescendants](errors?: readonly ValueError[]): void {\n const { name } = this;\n const ownErrors = errors\n ? (errors.filter((valueError) => getErrorPropertyName(valueError) === name) as ReadonlyArray<\n ValueError<Value<M>>\n >)\n : undefined;\n const relatedErrors = errors\n ? errors.filter((valueError) => getErrorPropertyName(valueError).startsWith(name))\n : undefined;\n this.#ownErrors = ownErrors;\n for (const childBinderNode of this.#getChildBinderNodes()) {\n childBinderNode[_setErrorsWithDescendants](relatedErrors);\n }\n this.dispatchEvent(CHANGED);\n }\n\n protected [_update](_?: Value<M>): void {\n if (this.parent) {\n this.parent[_update]();\n }\n }\n\n protected async [_updateValidation](): Promise<void> {\n if (this.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.#isObject()) {\n for (const [, getter] of getObjectModelOwnAndParentGetters(this.model)) {\n const childModel = getter.call(this.model);\n // We need to skip all non-initialised optional fields here in order\n // to prevent infinite recursion for circular references in the model.\n // Here we rely on presence of keys in `defaultValue` to detect all\n // initialised fields. The keys in `defaultValue` are defined for all\n // non-optional fields plus those optional fields whose values were\n // set from initial `binder.read()` or `binder.clear()` or by using a\n // binder node (e.g., form binding) for a nested field.\n if (childModel[_key] in (this.defaultValue as Record<never, never>)) {\n yield getBinderNode(childModel);\n }\n }\n } else if (this.#isArray()) {\n for (const childBinderNode of this.model) {\n yield childBinderNode;\n }\n }\n }\n\n #isArray(): this is BinderNode<ArrayModel> {\n return this.model instanceof ArrayModel;\n }\n\n #isArrayItem(): this is ArrayItemBinderNode<M> {\n return this.model[_parent] instanceof ArrayModel;\n }\n\n #isObject(): this is BinderNode<ObjectModel> {\n return this.model instanceof ObjectModel;\n }\n\n *#requestValidationOfDescendants(): Generator<Promise<readonly ValueError[]>, void, void> {\n for (const node of this.#getChildBinderNodes()) {\n yield* node.#runOwnValidators();\n yield* node.#requestValidationOfDescendants();\n }\n }\n\n *#requestValidationWithAncestors(): Generator<Promise<readonly ValueError[]>, void, void> {\n yield* this.#runOwnValidators();\n\n if (this.parent) {\n yield* this.parent.#requestValidationWithAncestors();\n }\n }\n\n *#runOwnValidators(): Generator<Promise<readonly ValueError[]>, void, void> {\n const hasInvalidState = this[_validity] && !this[_validity].valid;\n const hasBadInput = !!this[_validity]?.badInput;\n\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing\n if ((hasInvalidState && !hasBadInput) || !hasInvalidState) {\n for (const validator of this.#validators) {\n yield this.binder.requestValidation(this.model, validator);\n }\n }\n\n if (hasInvalidState) {\n yield this.binder.requestValidation(this.model, this.#validityStateValidator);\n }\n }\n\n initializeValue(forceInitialize = false): void {\n // First, make sure parents have value initialized\n if (\n this.parent &&\n (this.parent.value === undefined || (this.parent.defaultValue as Value<M> | undefined) === undefined)\n ) {\n this.parent.initializeValue(true);\n }\n\n const key = this.model[_key];\n let value: Value<M> | undefined = this.parent\n ? (this.parent.value as 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 = this.model.constructor.createEmptyValue() as Value<M>;\n this.#setValueState(value, defaultValue === undefined ? value : defaultValue);\n } else if (this.parent.model instanceof ObjectModel && !(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
|
@@ -17,7 +17,7 @@ export declare class BinderRoot<M extends AbstractModel = AbstractModel> extends
|
|
|
17
17
|
constructor(Model: DetachedModelConstructor<M>, config?: BinderRootConfiguration<Value<M>>);
|
|
18
18
|
get defaultValue(): Value<M>;
|
|
19
19
|
set defaultValue(newValue: Value<M>);
|
|
20
|
-
get binder():
|
|
20
|
+
get binder(): this;
|
|
21
21
|
get value(): Value<M>;
|
|
22
22
|
set value(newValue: Value<M>);
|
|
23
23
|
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 { _clearValidation, _setErrorsWithDescendants, _update, BinderNode, CHANGED } from './BinderNode.js';\nimport { type FieldElement, type FieldStrategy, getDefaultFieldStrategy } from './Field.js';\nimport {\n _parent,\n type AbstractModel,\n createDetachedModel,\n type DetachedModelConstructor,\n type Value,\n} from './Models.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 AbstractModel = AbstractModel> 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<AbstractModel, 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 Model - 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(Model: DetachedModelConstructor<M>, config?: BinderRootConfiguration<Value<M>>) {\n super(createDetachedModel(Model));\n // @ts-expect-error the model's parent is the binder\n this.model[_parent] = this;\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 AbstractModel>(\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?: AbstractModel<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 { _clearValidation, _setErrorsWithDescendants, _update, BinderNode, CHANGED } from './BinderNode.js';\nimport { type FieldElement, type FieldStrategy, getDefaultFieldStrategy } from './Field.js';\nimport {\n _parent,\n type AbstractModel,\n createDetachedModel,\n type DetachedModelConstructor,\n type Value,\n} from './Models.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 AbstractModel = AbstractModel> 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<AbstractModel, 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 Model - 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(Model: DetachedModelConstructor<M>, config?: BinderRootConfiguration<Value<M>>) {\n super(createDetachedModel(Model));\n // @ts-expect-error the model's parent is the binder\n this.model[_parent] = this;\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 AbstractModel>(\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?: AbstractModel<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 { 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 type AbstractModel,\n ArrayModel,\n BooleanModel,\n hasFromString,\n NumberModel,\n ObjectModel,\n} from './Models.js';\nimport { StringModel } from './Models.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?: AbstractModel<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?: AbstractModel<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?: AbstractModel<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 (this.model instanceof StringModel || this.model instanceof NumberModel) {\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?: AbstractModel<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 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 (this.model && (this.model instanceof ObjectModel || this.model instanceof ArrayModel)) {\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 (this.model instanceof ObjectModel || this.model instanceof ArrayModel) {\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>(elm: FieldElement<T>, model?: AbstractModel<T>): 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 AbstractModel<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 AbstractModel>(model: T, fieldValue: unknown) {\n return typeof fieldValue === 'string' && hasFromString(model) ? model[_fromString](fieldValue) : 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: AbstractModel<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 { 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 type AbstractModel,\n ArrayModel,\n BooleanModel,\n hasFromString,\n NumberModel,\n ObjectModel,\n} from './Models.js';\nimport { StringModel } from './Models.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?: AbstractModel<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?: AbstractModel<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?: AbstractModel<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 (this.model instanceof StringModel || this.model instanceof NumberModel) {\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?: AbstractModel<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 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 (this.model && (this.model instanceof ObjectModel || this.model instanceof ArrayModel)) {\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 (this.model instanceof ObjectModel || this.model instanceof ArrayModel) {\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>(elm: FieldElement<T>, model?: AbstractModel<T>): 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 AbstractModel<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 AbstractModel>(model: T, fieldValue: unknown) {\n return typeof fieldValue === 'string' && hasFromString(model) ? model[_fromString](fieldValue) : 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: AbstractModel<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 isNumeric from 'validator/es/lib/isNumeric.js';\nimport { type BinderNode, getBinderNode } from './BinderNode.js';\nimport type { Validator } from './Validation.js';\nimport { IsNumber } from './Validators.js';\n\nexport const _createEmptyItemValue = Symbol('createEmptyItemValue');\nexport const _parent = Symbol('parent');\nexport const _key = Symbol('key');\nexport const _fromString = Symbol('fromString');\nexport const _validators = Symbol('validators');\nexport const _meta = Symbol('meta');\nexport const _getPropertyModel = Symbol('getPropertyModel');\nexport const _enum = Symbol('enum');\nexport const _items = Symbol('items');\n\nconst _optional = Symbol('optional');\n\nexport interface HasFromString<T> {\n [_fromString](value: string): T;\n}\n\nexport function hasFromString<T>(model: AbstractModel<T>): model is AbstractModel<T> & HasFromString<T> {\n return _fromString in model;\n}\n\nexport type Value<M> = M extends AbstractModel<infer T> ? T : never;\n\nexport const modelDetachedParent = { $value$: undefined };\n\nexport type ModelParent = AbstractModel | 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 [_parent]?: 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[_parent] = 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> = M extends ArrayModel<infer MItem> ? MItem : 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 isNumeric from 'validator/es/lib/isNumeric.js';\nimport { type BinderNode, getBinderNode } from './BinderNode.js';\nimport type { Validator } from './Validation.js';\nimport { IsNumber } from './Validators.js';\n\nexport const _createEmptyItemValue = Symbol('createEmptyItemValue');\nexport const _parent = Symbol('parent');\nexport const _key = Symbol('key');\nexport const _fromString = Symbol('fromString');\nexport const _validators = Symbol('validators');\nexport const _meta = Symbol('meta');\nexport const _getPropertyModel = Symbol('getPropertyModel');\nexport const _enum = Symbol('enum');\nexport const _items = Symbol('items');\n\nconst _optional = Symbol('optional');\n\nexport interface HasFromString<T> {\n [_fromString](value: string): T;\n}\n\nexport function hasFromString<T>(model: AbstractModel<T>): model is AbstractModel<T> & HasFromString<T> {\n return _fromString in model;\n}\n\nexport type Value<M> = M extends AbstractModel<infer T> ? T : never;\n\nexport const modelDetachedParent = { $value$: undefined };\n\nexport type ModelParent = AbstractModel | 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 [_parent]?: 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[_parent] = 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> = M extends ArrayModel<infer MItem> ? MItem : 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
|
@@ -10,7 +10,7 @@ export * from './Validity.js';
|
|
|
10
10
|
vaadinObj.registrations ??= [];
|
|
11
11
|
vaadinObj.registrations.push({
|
|
12
12
|
is: feature ? `@vaadin/hilla-lit-form/${feature}` : '@vaadin/hilla-lit-form',
|
|
13
|
-
version: '25.0.
|
|
13
|
+
version: '25.0.10',
|
|
14
14
|
});
|
|
15
15
|
})();
|
|
16
16
|
//# 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;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAI9B,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,
|
|
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;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAI9B,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,SAAS;KACnB,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 * from './Validation.js';\nexport * from './Validators.js';\nexport * from './Validity.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.0.10',\n });\n})();\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vaadin/hilla-lit-form",
|
|
3
|
-
"version": "25.0.
|
|
3
|
+
"version": "25.0.10",
|
|
4
4
|
"description": "Hilla form utils",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"module": "index.js",
|
|
@@ -69,7 +69,7 @@
|
|
|
69
69
|
"access": "public"
|
|
70
70
|
},
|
|
71
71
|
"dependencies": {
|
|
72
|
-
"@vaadin/hilla-frontend": "25.0.
|
|
72
|
+
"@vaadin/hilla-frontend": "25.0.10",
|
|
73
73
|
"validator": "13.15.22"
|
|
74
74
|
},
|
|
75
75
|
"peerDependencies": {
|