@vaadin/hilla-lit-form 24.4.0-alpha2 → 24.4.0-alpha4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/BinderRoot.js +1 -1
- package/BinderRoot.js.map +1 -1
- package/Field.d.ts.map +1 -1
- package/Field.js +3 -2
- package/Field.js.map +2 -2
- package/Models.d.ts +1 -1
- package/Models.d.ts.map +1 -1
- package/Models.js +3 -1
- package/Models.js.map +2 -2
- package/index.js +1 -1
- package/package.json +2 -2
package/BinderRoot.js
CHANGED
package/BinderRoot.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["src/BinderRoot.ts"],
|
|
4
|
-
"sourcesContent": ["import { EndpointValidationError, type ValidationErrorData } from '@vaadin/hilla-
|
|
4
|
+
"sourcesContent": ["import { EndpointValidationError, type ValidationErrorData } from '@vaadin/hilla-frontend/EndpointErrors.js';\nimport {\n _clearValidation,\n _setErrorsWithDescendants,\n _update,\n _updateValidation,\n BinderNode,\n CHANGED,\n} 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 | undefined | 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 this[_updateValidation]().catch(() => {});\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> | undefined | 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 property,\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"],
|
|
5
5
|
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/Field.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Field.d.ts","sourceRoot":"","sources":["src/Field.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"Field.d.ts","sourceRoot":"","sources":["src/Field.ts"],"names":[],"mappings":"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"}
|
package/Field.js
CHANGED
|
@@ -254,8 +254,9 @@ const field = directive(
|
|
|
254
254
|
const { value } = binderNode;
|
|
255
255
|
const valueFromField = convertFieldValue(model, fieldState.value);
|
|
256
256
|
if (value !== valueFromField && !(Number.isNaN(value) && Number.isNaN(valueFromField))) {
|
|
257
|
-
|
|
258
|
-
fieldState.
|
|
257
|
+
const nonNanValue = Number.isNaN(value) ? "" : value;
|
|
258
|
+
fieldState.value = nonNanValue;
|
|
259
|
+
fieldState.strategy.value = nonNanValue;
|
|
259
260
|
}
|
|
260
261
|
const { required } = binderNode;
|
|
261
262
|
if (required !== fieldState.required) {
|
package/Field.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["src/Field.ts"],
|
|
4
|
-
"sourcesContent": ["/* eslint-disable accessor-pairs,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 { _fromString, type AbstractModel, ArrayModel, BooleanModel, hasFromString, ObjectModel } 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\nexport type FieldStrategy<T = any> = Field<T> &\n FieldConstraintValidation & {\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 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 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 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\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 \u2014 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\n constructor(element: E, model?: AbstractModel<T>) {\n super(element, model);\n element.addEventListener('validated', this.#boundOnValidated);\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 }\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 satisfies Partial<ValidityState> as Partial<ValidityState>).valid;\n if (this.#invalid !== invalid) {\n this.element.invalid = this.#invalid;\n }\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\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}\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-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 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 return (elm.constructor as unknown as MaybeVaadinElementConstructor).version\n ? new VaadinFieldStrategy(elm, model)\n : 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 updateValueFromElement = () => {\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 element.addEventListener('input', updateValueFromElement);\n\n const changeBlurHandler = () => {\n updateValueFromElement();\n binderNode.visited = true;\n };\n\n element.addEventListener('blur', changeBlurHandler);\n element.addEventListener('change', changeBlurHandler);\n }\n\n const { fieldState } = this;\n\n if (fieldState.element !== element || fieldState.model !== model) {\n fieldState.strategy = binderNode.binder.getFieldStrategy(element, model);\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 fieldState.value = value;\n fieldState.strategy.value = value;\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"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["/* eslint-disable accessor-pairs,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 { _fromString, type AbstractModel, ArrayModel, BooleanModel, hasFromString, ObjectModel } 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\nexport type FieldStrategy<T = any> = Field<T> &\n FieldConstraintValidation & {\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 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 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 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\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 \u2014 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\n constructor(element: E, model?: AbstractModel<T>) {\n super(element, model);\n element.addEventListener('validated', this.#boundOnValidated);\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 }\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 satisfies Partial<ValidityState> as Partial<ValidityState>).valid;\n if (this.#invalid !== invalid) {\n this.element.invalid = this.#invalid;\n }\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\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}\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-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 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 return (elm.constructor as unknown as MaybeVaadinElementConstructor).version\n ? new VaadinFieldStrategy(elm, model)\n : 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 updateValueFromElement = () => {\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 element.addEventListener('input', updateValueFromElement);\n\n const changeBlurHandler = () => {\n updateValueFromElement();\n binderNode.visited = true;\n };\n\n element.addEventListener('blur', changeBlurHandler);\n element.addEventListener('change', changeBlurHandler);\n }\n\n const { fieldState } = this;\n\n if (fieldState.element !== element || fieldState.model !== model) {\n fieldState.strategy = binderNode.binder.getFieldStrategy(element, model);\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"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["fieldState"]
|
|
7
7
|
}
|
package/Models.d.ts
CHANGED
|
@@ -54,7 +54,7 @@ export declare class BooleanModel extends PrimitiveModel<boolean> implements Has
|
|
|
54
54
|
[_fromString](str: string): boolean;
|
|
55
55
|
}
|
|
56
56
|
export declare class NumberModel extends PrimitiveModel<number> implements HasFromString<number | undefined> {
|
|
57
|
-
static createEmptyValue:
|
|
57
|
+
static createEmptyValue(): number;
|
|
58
58
|
constructor(parent: ModelParent, key: keyof any, optional: boolean, options?: ModelOptions<number>);
|
|
59
59
|
[_fromString](str: string): number | undefined;
|
|
60
60
|
}
|
package/Models.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Models.d.ts","sourceRoot":"","sources":["src/Models.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"Models.d.ts","sourceRoot":"","sources":["src/Models.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,UAAU,EAAiB,MAAM,iBAAiB,CAAC;AACjE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAGjD,eAAO,MAAM,qBAAqB,eAAsB,CAAC;AACzD,eAAO,MAAM,OAAO,eAAmB,CAAC;AACxC,eAAO,MAAM,IAAI,eAAgB,CAAC;AAClC,eAAO,MAAM,WAAW,eAAuB,CAAC;AAChD,eAAO,MAAM,WAAW,eAAuB,CAAC;AAChD,eAAO,MAAM,KAAK,eAAiB,CAAC;AACpC,eAAO,MAAM,iBAAiB,eAA6B,CAAC;AAC5D,eAAO,MAAM,KAAK,eAAiB,CAAC;AAEpC,QAAA,MAAM,SAAS,eAAqB,CAAC;AAErC,MAAM,WAAW,aAAa,CAAC,CAAC;IAC9B,CAAC,WAAW,CAAC,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,CAAC;CACjC;AAED,wBAAgB,aAAa,CAAC,CAAC,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,aAAa,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAEtG;AAED,MAAM,MAAM,KAAK,CAAC,CAAC,IAAI,CAAC,SAAS,aAAa,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;AAEpE,eAAO,MAAM,mBAAmB;;CAAyB,CAAC;AAE1D,MAAM,MAAM,WAAW,GAAG,aAAa,GAAG,UAAU,GAAG,OAAO,mBAAmB,CAAC;AAElF,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,YAAY,CAAC,CAAC;IAC7B,UAAU,CAAC,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IACzC,IAAI,CAAC,EAAE,aAAa,CAAC;CACtB;AAED,MAAM,MAAM,wBAAwB,CAAC,CAAC,IAAI;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,MAAM,EAAE,OAAO,mBAAmB,EAAE,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,GAAG,CAAC,CAAC;CAChF,CAAC;AAEF,wBAAgB,mBAAmB,CAAC,CAAC,SAAS,aAAa,EAAE,IAAI,EAAE,wBAAwB,CAAC,CAAC,CAAC,GAAG,CAAC,CAEjG;AAED,8BAAsB,aAAa,CAAC,CAAC,GAAG,OAAO;IAC7C,MAAM,CAAC,gBAAgB,IAAI,OAAO;IAIlC,SAAiB,CAAC,aAAa,CAAC,EAAE,OAAO,aAAa,CAAC,CAAC,CAAC,CAAC;IAE1D,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,WAAW,CAAC;IAEjC,QAAQ,CAAC,CAAC,WAAW,CAAC,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IAEpD,QAAQ,CAAC,CAAC,KAAK,CAAC,EAAE,aAAa,CAAC;IAEhC,QAAQ,CAAC,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAE9B,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,CAAC;gBAEN,MAAM,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC;IAQ7F,QAAQ,IAAI,MAAM;IAIlB,OAAO,IAAI,CAAC;CASb;AAED,8BAAsB,cAAc,CAAC,CAAC,CAAE,SAAQ,aAAa,CAAC,CAAC,CAAC;CAAG;AAEnE,qBAAa,YAAa,SAAQ,cAAc,CAAC,OAAO,CAAE,YAAW,aAAa,CAAC,OAAO,CAAC;IACzF,OAAgB,gBAAgB,qBAAW;IAE3C,CAAC,WAAW,CAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;CAKpC;AAED,qBAAa,WAAY,SAAQ,cAAc,CAAC,MAAM,CAAE,YAAW,aAAa,CAAC,MAAM,GAAG,SAAS,CAAC;WAClF,gBAAgB,IAAI,MAAM;gBAI9B,MAAM,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,YAAY,CAAC,MAAM,CAAC;IAMlG,CAAC,WAAW,CAAC,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;CAM/C;AAED,qBAAa,WAAY,SAAQ,cAAc,CAAC,MAAM,CAAE,YAAW,aAAa,CAAC,MAAM,CAAC;IACtF,OAAgB,gBAAgB,oBAAU;IAC1C,CAAC,WAAW,CAAC,oBAAU;CACxB;AAED,OAAO,MAAM,IAAI;CAAG;AAEpB,wBAAgB,yBAAyB,CAAC,CAAC,SAAS,SAAS,EAAE,IAAI,EAAE,wBAAwB,CAAC,CAAC,CAAC,GAAG,MAAM,KAAK,CAAC,CAAC,CAAC,CAKhH;AAED,8BAAsB,SAAS,CAAC,CAAC,SAAS,OAAO,IAAI,GAAG,OAAO,IAAI,CACjE,SAAQ,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAChC,YAAW,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,SAAS,CAAC;IAEhD,QAAQ,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAE7B,CAAC,WAAW,CAAC,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,SAAS;CAGrD;AAED,wBAAiB,iCAAiC,CAAC,CAAC,SAAS,WAAW,EACtE,KAAK,EAAE,CAAC,GACP,SAAS,CAAC,SAAS,CAAC,GAAG,EAAE,MAAM,KAAK,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC,CAAC,CAaxE;AAED,wBAAgB,2BAA2B,CAAC,CAAC,SAAS,WAAW,EAAE,IAAI,EAAE,wBAAwB,CAAC,CAAC,CAAC,GAAG,MAAM,KAAK,CAAC,CAAC,CAAC,CAkBpH;AAED,KAAK,UAAU,CAAC,CAAC,SAAS,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,SAAS,MAAM,CAAC,IAAI,aAAa,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAEtG,qBAAa,WAAW,CAAC,CAAC,SAAS,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAE,SAAQ,aAAa,CAAC,CAAC,CAAC;;IACtG,OAAgB,gBAAgB,6BAA4C;IAI5E,SAAS,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,SAAS,MAAM,CAAC,EAAE,CAAC,SAAS,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,EACzE,GAAG,EAAE,CAAC,EACN,IAAI,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,GAChC,CAAC;CAOL;AAED,MAAM,MAAM,cAAc,CAAC,CAAC,IAAI,CAAC,SAAS,UAAU,CAAC,MAAM,KAAK,CAAC,GAAG,KAAK,GAAG,KAAK,CAAC;AAElF,qBAAa,UAAU,CAAC,KAAK,SAAS,aAAa,GAAG,aAAa,CAAE,SAAQ,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;;WAC7F,gBAAgB,IAAI,EAAE;IAItC,CAAC,qBAAqB,CAAC,EAAE,MAAM,KAAK,CAAC,KAAK,CAAC,CAAC;gBAM1C,MAAM,EAAE,WAAW,EACnB,GAAG,EAAE,MAAM,GAAG,EACd,QAAQ,EAAE,OAAO,EACjB,UAAU,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,MAAM,KAAK,KAAK,EAC7D,OAAO,CAAC,EAAE,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IAO7C;;OAEG;IACF,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,gBAAgB,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;CAkB1D"}
|
package/Models.js
CHANGED
|
@@ -53,7 +53,9 @@ class BooleanModel extends PrimitiveModel {
|
|
|
53
53
|
}
|
|
54
54
|
}
|
|
55
55
|
class NumberModel extends PrimitiveModel {
|
|
56
|
-
static createEmptyValue
|
|
56
|
+
static createEmptyValue() {
|
|
57
|
+
return NaN;
|
|
58
|
+
}
|
|
57
59
|
constructor(parent, key, optional, options) {
|
|
58
60
|
const validators = [new IsNumber(optional), ...options?.validators ?? []];
|
|
59
61
|
super(parent, key, optional, { ...options, validators });
|
package/Models.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["src/Models.ts"],
|
|
4
|
-
"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('itemModel');\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');\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 toString(): string {\n return String(this.valueOf());\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
|
|
5
|
-
"mappings": "AAAA,OAAO,eAAe;AACtB,SAA0B,qBAAqB;AAE/C,SAAS,gBAAgB;AAElB,MAAM,wBAAwB,OAAO,WAAW;AAChD,MAAM,UAAU,OAAO,QAAQ;AAC/B,MAAM,OAAO,OAAO,KAAK;AACzB,MAAM,cAAc,OAAO,YAAY;AACvC,MAAM,cAAc,OAAO,YAAY;AACvC,MAAM,QAAQ,OAAO,MAAM;AAC3B,MAAM,oBAAoB,OAAO,kBAAkB;AACnD,MAAM,QAAQ,OAAO,MAAM;AAElC,MAAM,YAAY,OAAO,UAAU;AAM5B,SAAS,cAAiB,OAAuE;AACtG,SAAO,eAAe;AACxB;AAIO,MAAM,sBAAsB,EAAE,SAAS,OAAU;AAwBjD,SAAS,oBAA6C,MAAsC;AACjG,SAAO,IAAI,KAAK,qBAAqB,WAAW,KAAK;AACvD;AAEO,MAAe,cAA2B;AAAA,EAC/C,OAAO,mBAA4B;AACjC,WAAO;AAAA,EACT;AAAA,EAIA,CAAU,OAAO;AAAA,EAEjB,CAAU,WAAW;AAAA,EAErB,CAAU,KAAK;AAAA,EAEf,CAAU,SAAS;AAAA,EAEnB,CAAC,IAAI;AAAA,EAEL,YAAY,QAAqB,KAAgB,UAAmB,SAA2B;AAC7F,SAAK,OAAO,IAAI;AAChB,SAAK,IAAI,IAAI;AACb,SAAK,SAAS,IAAI;AAClB,SAAK,WAAW,IAAI,SAAS,cAAc,CAAC;AAC5C,SAAK,KAAK,IAAI,SAAS,QAAQ,CAAC;AAAA,EAClC;AAAA,EAEA,WAAmB;AACjB,WAAO,OAAO,KAAK,QAAQ,CAAC;AAAA,EAC9B;AAAA,EAEA,UAAa;AACX,UAAM,EAAE,MAAM,IAAI,cAAc,IAAI;AAEpC,QAAI,UAAU,QAAW;AACvB,YAAM,IAAI,UAAU,oBAAoB;AAAA,IAC1C;AAEA,WAAO;AAAA,EACT;AACF;AAEO,MAAe,uBAA0B,cAAiB;AAAC;AAE3D,MAAM,qBAAqB,eAA0D;AAAA,EAC1F,OAAgB,mBAAmB;AAAA,EAEnC,CAAC,WAAW,EAAE,KAAsB;AAGlC,WAAO,CAAC,QAAQ,KAAK,KAAK,EAAE,SAAS,IAAI,YAAY,CAAC;AAAA,EACxD;AACF;AAEO,MAAM,oBAAoB,eAAoE;AAAA,EACnG,OAAgB,
|
|
4
|
+
"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('itemModel');\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');\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 toString(): string {\n return String(this.valueOf());\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 === '') return undefined;\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\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 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 readonly #createItem: (parent: this, index: number) => MItem;\n #items: Array<MItem | undefined> = [];\n\n constructor(\n parent: ModelParent,\n key: keyof any,\n optional: boolean,\n createItem: (parent: ArrayModel<MItem>, 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 /**\n * Iterates the current array value and yields a binder node for every item.\n */\n *[Symbol.iterator](): IterableIterator<BinderNode<MItem>> {\n const array = this.valueOf();\n\n if (array.length !== this.#items.length) {\n this.#items.length = array.length;\n }\n\n for (let i = 0; i < array.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 getBinderNode(item);\n }\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/index.js
CHANGED
|
@@ -3,7 +3,7 @@ function __REGISTER__(feature) {
|
|
|
3
3
|
window.Vaadin.registrations ??= [];
|
|
4
4
|
window.Vaadin.registrations.push({
|
|
5
5
|
is: feature ? `${"@vaadin/hilla-lit-form"}/${feature}` : "@vaadin/hilla-lit-form",
|
|
6
|
-
version: "24.4.0-
|
|
6
|
+
version: "24.4.0-alpha4"
|
|
7
7
|
});
|
|
8
8
|
}
|
|
9
9
|
export * from "./Binder.js";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vaadin/hilla-lit-form",
|
|
3
|
-
"version": "24.4.0-
|
|
3
|
+
"version": "24.4.0-alpha4",
|
|
4
4
|
"description": "Hilla form utils",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"module": "index.js",
|
|
@@ -71,7 +71,7 @@
|
|
|
71
71
|
"access": "public"
|
|
72
72
|
},
|
|
73
73
|
"dependencies": {
|
|
74
|
-
"@vaadin/hilla-
|
|
74
|
+
"@vaadin/hilla-frontend": "24.4.0-alpha4",
|
|
75
75
|
"validator": "^13.11.0"
|
|
76
76
|
},
|
|
77
77
|
"peerDependencies": {
|