@vaadin/hilla-lit-form 24.4.6 → 24.5.0-alpha10

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/Field.d.ts CHANGED
@@ -115,8 +115,8 @@ export declare function getDefaultFieldStrategy<T>(elm: FieldElement<T>, model?:
115
115
  */
116
116
  export declare const field: (_model: AbstractModel<any>, _effect?: ((element: Element) => void) | undefined) => import("lit-html/directive.js").DirectiveResult<{
117
117
  new (partInfo: PartInfo): {
118
- fieldState?: FieldState<any> | undefined;
119
- render(_model: AbstractModel<any>, _effect?: ((element: Element) => void) | undefined): symbol;
118
+ fieldState?: FieldState<any>;
119
+ render(_model: AbstractModel<any>, _effect?: (element: Element) => void): symbol;
120
120
  update(part: ElementPart | PropertyPart, [model, effect]: [_model: AbstractModel<any>, _effect?: ((element: Element) => void) | undefined]): symbol;
121
121
  readonly _$isConnected: boolean;
122
122
  };
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/Models.d.ts CHANGED
@@ -8,6 +8,7 @@ export declare const _validators: unique symbol;
8
8
  export declare const _meta: unique symbol;
9
9
  export declare const _getPropertyModel: unique symbol;
10
10
  export declare const _enum: unique symbol;
11
+ export declare const _items: unique symbol;
11
12
  declare const _optional: unique symbol;
12
13
  export interface HasFromString<T> {
13
14
  [_fromString](value: string): T;
@@ -44,7 +45,23 @@ export declare abstract class AbstractModel<T = unknown> {
44
45
  readonly [_optional]: boolean;
45
46
  [_key]: keyof any;
46
47
  constructor(parent: ModelParent, key: keyof any, optional: boolean, options?: ModelOptions<T>);
48
+ /**
49
+ * @deprecated Use {@link BinderNode.value} with string conversion instead
50
+ *
51
+ * @example
52
+ * ```ts
53
+ * const result = String(binder.for(model).value);
54
+ * ```
55
+ */
47
56
  toString(): string;
57
+ /**
58
+ * @deprecated Use {@link BinderNode.value} instead
59
+ *
60
+ * @example
61
+ * ```ts
62
+ * const result = binder.for(model).value;
63
+ * ```
64
+ */
48
65
  valueOf(): T;
49
66
  }
50
67
  export declare abstract class PrimitiveModel<T> extends AbstractModel<T> {
@@ -74,7 +91,7 @@ export declare function makeObjectEmptyValueCreator<M extends ObjectModel>(type:
74
91
  type ChildModel<T extends Record<never, never>, K extends keyof T> = AbstractModel<NonNullable<T[K]>>;
75
92
  export declare class ObjectModel<T extends Record<never, never> = Record<never, never>> extends AbstractModel<T> {
76
93
  #private;
77
- static createEmptyValue: () => Record<never, never>;
94
+ static createEmptyValue: () => Value<ObjectModel<Record<never, never>>>;
78
95
  protected [_getPropertyModel]<K extends keyof T, M extends ChildModel<T, K>>(key: K, init: (parent: this, key: K) => M): M;
79
96
  }
80
97
  export type ArrayItemModel<M> = M extends ArrayModel<infer MItem> ? MItem : never;
@@ -82,11 +99,37 @@ export declare class ArrayModel<MItem extends AbstractModel = AbstractModel> ext
82
99
  #private;
83
100
  static createEmptyValue(): [];
84
101
  [_createEmptyItemValue]: () => Value<MItem>;
85
- constructor(parent: ModelParent, key: keyof any, optional: boolean, createItem: (parent: ArrayModel<MItem>, key: number) => MItem, options?: ModelOptions<Array<Value<MItem>>>);
102
+ constructor(parent: ModelParent, key: keyof any, optional: boolean, createItem: (parent: AbstractModel, key: number) => MItem, options?: ModelOptions<Array<Value<MItem>>>);
103
+ [_items](): Generator<MItem, void, void>;
86
104
  /**
87
- * Iterates the current array value and yields a binder node for every item.
105
+ * Iterates over the current model and yields a binder node for every item
106
+ * model.
107
+ *
108
+ * @deprecated Use the {@link m.items} function instead. For example, in React:
109
+ * ```tsx
110
+ * const {model, field} = useForm(GroupModel);
111
+ * return Array.from(m.items(model.people), (personModel) =>
112
+ * <TextField label="Full name" {...field(personModel.fullName)} />
113
+ * );
114
+ * ```
115
+ * In Lit:
116
+ * ```ts
117
+ * return html`${repeat(
118
+ * m.items(this.binder.model.people),
119
+ * (personModel) => html`<vaadin-text-field label="Full name" ${field(personModel.fullName)}></vaadin-text-field>`,
120
+ * )}`;
121
+ * ```
88
122
  */
89
123
  [Symbol.iterator](): IterableIterator<BinderNode<MItem>>;
90
124
  }
125
+ export declare const m: {
126
+ /**
127
+ * Returns an iterator over item models in the array model.
128
+ *
129
+ * @param model - The array model to iterate over.
130
+ * @returns An iterator over item models.
131
+ */
132
+ items<M extends ArrayModel>(model: M): Generator<ArrayItemModel<M>, void, void>;
133
+ };
91
134
  export {};
92
135
  //# sourceMappingURL=Models.d.ts.map
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":"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"}
package/Models.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import isNumeric from "validator/es/lib/isNumeric.js";
2
2
  import { getBinderNode } from "./BinderNode.js";
3
3
  import { IsNumber } from "./Validators.js";
4
- const _createEmptyItemValue = Symbol("itemModel");
4
+ const _createEmptyItemValue = Symbol("createEmptyItemValue");
5
5
  const _parent = Symbol("parent");
6
6
  const _key = Symbol("key");
7
7
  const _fromString = Symbol("fromString");
@@ -9,6 +9,7 @@ const _validators = Symbol("validators");
9
9
  const _meta = Symbol("meta");
10
10
  const _getPropertyModel = Symbol("getPropertyModel");
11
11
  const _enum = Symbol("enum");
12
+ const _items = Symbol("items");
12
13
  const _optional = Symbol("optional");
13
14
  function hasFromString(model) {
14
15
  return _fromString in model;
@@ -33,9 +34,25 @@ class AbstractModel {
33
34
  this[_validators] = options?.validators ?? [];
34
35
  this[_meta] = options?.meta ?? {};
35
36
  }
37
+ /**
38
+ * @deprecated Use {@link BinderNode.value} with string conversion instead
39
+ *
40
+ * @example
41
+ * ```ts
42
+ * const result = String(binder.for(model).value);
43
+ * ```
44
+ */
36
45
  toString() {
37
46
  return String(this.valueOf());
38
47
  }
48
+ /**
49
+ * @deprecated Use {@link BinderNode.value} instead
50
+ *
51
+ * @example
52
+ * ```ts
53
+ * const result = binder.for(model).value;
54
+ * ```
55
+ */
39
56
  valueOf() {
40
57
  const { value } = getBinderNode(this);
41
58
  if (value === void 0) {
@@ -116,6 +133,8 @@ class ArrayModel extends AbstractModel {
116
133
  return [];
117
134
  }
118
135
  [_createEmptyItemValue];
136
+ // The `parent` parameter is AbstractModel here for purpose; for some reason, setting it to `ArrayModel<MItem>` or
137
+ // `this` breaks the type inference in TS (v5.3.2).
119
138
  #createItem;
120
139
  #items = [];
121
140
  constructor(parent, key, optional, createItem, options) {
@@ -123,24 +142,56 @@ class ArrayModel extends AbstractModel {
123
142
  this.#createItem = createItem;
124
143
  this[_createEmptyItemValue] = createItem(this, 0).constructor.createEmptyValue;
125
144
  }
126
- /**
127
- * Iterates the current array value and yields a binder node for every item.
128
- */
129
- *[Symbol.iterator]() {
130
- const array = this.valueOf();
131
- if (array.length !== this.#items.length) {
132
- this.#items.length = array.length;
145
+ *[_items]() {
146
+ const values = getBinderNode(this).value ?? [];
147
+ if (values.length !== this.#items.length) {
148
+ this.#items.length = values.length;
133
149
  }
134
- for (let i = 0; i < array.length; i++) {
150
+ for (let i = 0; i < values.length; i++) {
135
151
  let item = this.#items[i];
136
152
  if (!item) {
137
153
  item = this.#createItem(this, i);
138
154
  this.#items[i] = item;
139
155
  }
156
+ yield item;
157
+ }
158
+ }
159
+ /**
160
+ * Iterates over the current model and yields a binder node for every item
161
+ * model.
162
+ *
163
+ * @deprecated Use the {@link m.items} function instead. For example, in React:
164
+ * ```tsx
165
+ * const {model, field} = useForm(GroupModel);
166
+ * return Array.from(m.items(model.people), (personModel) =>
167
+ * <TextField label="Full name" {...field(personModel.fullName)} />
168
+ * );
169
+ * ```
170
+ * In Lit:
171
+ * ```ts
172
+ * return html`${repeat(
173
+ * m.items(this.binder.model.people),
174
+ * (personModel) => html`<vaadin-text-field label="Full name" ${field(personModel.fullName)}></vaadin-text-field>`,
175
+ * )}`;
176
+ * ```
177
+ */
178
+ *[Symbol.iterator]() {
179
+ for (const item of this[_items]()) {
140
180
  yield getBinderNode(item);
141
181
  }
142
182
  }
143
183
  }
184
+ const m = {
185
+ /**
186
+ * Returns an iterator over item models in the array model.
187
+ *
188
+ * @param model - The array model to iterate over.
189
+ * @returns An iterator over item models.
190
+ */
191
+ items(model) {
192
+ return model[_items]();
193
+ }
194
+ };
144
195
  export {
145
196
  AbstractModel,
146
197
  ArrayModel,
@@ -154,6 +205,7 @@ export {
154
205
  _enum,
155
206
  _fromString,
156
207
  _getPropertyModel,
208
+ _items,
157
209
  _key,
158
210
  _meta,
159
211
  _parent,
@@ -161,6 +213,7 @@ export {
161
213
  createDetachedModel,
162
214
  getObjectModelOwnAndParentGetters,
163
215
  hasFromString,
216
+ m,
164
217
  makeEnumEmptyValueCreator,
165
218
  makeObjectEmptyValueCreator,
166
219
  modelDetachedParent
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(): 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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",
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('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 === '') 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 // 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 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"],
5
+ "mappings": "AAAA,OAAO,eAAe;AACtB,SAA0B,qBAAqB;AAE/C,SAAS,gBAAgB;AAElB,MAAM,wBAAwB,OAAO,sBAAsB;AAC3D,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;AAC3B,MAAM,SAAS,OAAO,OAAO;AAEpC,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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,WAAmB;AACjB,WAAO,OAAO,KAAK,QAAQ,CAAC;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,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,mBAA2B;AACzC,WAAO;AAAA,EACT;AAAA,EAEA,YAAY,QAAqB,KAAgB,UAAmB,SAAgC;AAElG,UAAM,aAAa,CAAC,IAAI,SAAS,QAAQ,GAAG,GAAI,SAAS,cAAc,CAAC,CAAE;AAC1E,UAAM,QAAQ,KAAK,UAAU,EAAE,GAAG,SAAS,WAAW,CAAC;AAAA,EACzD;AAAA,EAEA,CAAC,WAAW,EAAE,KAAiC;AAG7C,QAAI,QAAQ;AAAI,aAAO;AACvB,WAAO,UAAU,GAAG,IAAI,OAAO,WAAW,GAAG,IAAI;AAAA,EACnD;AACF;AAEO,MAAM,oBAAoB,eAAwD;AAAA,EACvF,OAAgB,mBAAmB;AAAA,EACnC,CAAC,WAAW,IAAI;AAClB;AAIO,SAAS,0BAA+C,MAAmD;AAChH,QAAM,EAAE,CAAC,KAAK,GAAG,WAAW,IAAI,oBAAoB,IAAI;AACxD,QAAM,eAAe,OAAO,OAAO,UAAU,EAAE,CAAC;AAEhD,SAAO,MAAM;AACf;AAEO,MAAe,kBACZ,cAEV;AAAA,EAGE,CAAC,WAAW,EAAE,OAAuC;AACnD,WAAO,SAAS,KAAK,KAAK,IAAK,QAAuB;AAAA,EACxD;AACF;AAEO,UAAU,kCACf,OACwE;AACxE,WACM,QAAQ,OAAO,eAAe,KAAK,GACvC,UAAU,YAAY,WACtB,QAAQ,OAAO,eAAe,KAAK,GACnC;AACA,UAAM,cAAc,OAAO,0BAA0B,KAAK;AAC1D,eAAW,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,OAAO,QAAQ,WAAW,GAAG;AACzD,UAAI,KAAK;AACP,cAAM,CAAC,MAAwB,GAAG;AAAA,MACpC;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,4BAAmD,MAAmD;AACpH,QAAM,QAAQ,oBAAoB,IAAI;AAEtC,SAAO,MAAM;AAEX,UAAM,MAAyB,CAAC;AAIhC,eAAW,CAAC,KAAK,MAAM,KAAK,kCAAkC,KAAK,GAAG;AACpE,YAAM,gBAAgB,OAAO,KAAK,KAAK;AACvC,UAAI,GAAG,IACL,cAAc,SAAS,IAAI,SAAY,cAAc,YAAY,iBAAiB;AAAA,IAEtF;AAEA,WAAO;AAAA,EACT;AACF;AAIO,MAAM,oBAA2E,cAAiB;AAAA,EACvG,OAAgB,mBAAmB,4BAA4B,WAAW;AAAA,EAE1E,cAAqD,CAAC;AAAA,EAEtD,CAAW,iBAAiB,EAC1B,KACA,MACG;AACH,QAAI,CAAC,KAAK,YAAY,GAAG,GAAG;AAC1B,WAAK,YAAY,GAAG,IAAI,KAAK,MAAM,GAAG;AAAA,IACxC;AAEA,WAAO,KAAK,YAAY,GAAG;AAAA,EAC7B;AACF;AAIO,MAAM,mBAAgE,cAAmC;AAAA,EAC9G,OAAgB,mBAAuB;AACrC,WAAO,CAAC;AAAA,EACV;AAAA,EAEA,CAAC,qBAAqB;AAAA;AAAA;AAAA,EAIb;AAAA,EACT,SAAmC,CAAC;AAAA,EAEpC,YACE,QACA,KACA,UACA,YACA,SACA;AACA,UAAM,QAAQ,KAAK,UAAU,OAAO;AACpC,SAAK,cAAc;AACnB,SAAK,qBAAqB,IAAI,WAAW,MAAM,CAAC,EAAE,YAAY;AAAA,EAChE;AAAA,EAEA,EAAE,MAAM,IAAkC;AACxC,UAAM,SAAS,cAAc,IAAI,EAAE,SAAS,CAAC;AAE7C,QAAI,OAAO,WAAW,KAAK,OAAO,QAAQ;AACxC,WAAK,OAAO,SAAS,OAAO;AAAA,IAC9B;AAEA,aAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,UAAI,OAA0B,KAAK,OAAO,CAAC;AAE3C,UAAI,CAAC,MAAM;AACT,eAAO,KAAK,YAAY,MAAM,CAAC;AAC/B,aAAK,OAAO,CAAC,IAAI;AAAA,MACnB;AAEA,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqBA,EAAE,OAAO,QAAQ,IAAyC;AACxD,eAAW,QAAQ,KAAK,MAAM,EAAE,GAAG;AACjC,YAAM,cAAc,IAAI;AAAA,IAC1B;AAAA,EACF;AACF;AAEO,MAAM,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOf,MAA4B,OAAoD;AAC9E,WAAO,MAAM,MAAM,EAAE;AAAA,EACvB;AACF;",
6
6
  "names": []
7
7
  }
package/Validation.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import type { BinderNode } from './BinderNode.js';
2
2
  import type { BinderRoot } from './BinderRoot.js';
3
- import { type AbstractModel, type Value } from './Models.js';
3
+ import { AbstractModel, type Value } from './Models.js';
4
4
  export interface ValueError<T = unknown> {
5
5
  property: AbstractModel | string;
6
6
  message: string;
@@ -1 +1 @@
1
- {"version":3,"file":"Validation.d.ts","sourceRoot":"","sources":["src/Validation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,KAAK,aAAa,EAAe,KAAK,KAAK,EAAE,MAAM,aAAa,CAAC;AAG1E,MAAM,WAAW,UAAU,CAAC,CAAC,GAAG,OAAO;IACrC,QAAQ,EAAE,aAAa,GAAG,MAAM,CAAC;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,CAAC,CAAC;IACT,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,aAAa,GAAG,MAAM,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,eAAgB,SAAQ,KAAK;IACxC,MAAM,EAAE,SAAS,UAAU,EAAE,CAAC;gBAElB,MAAM,EAAE,SAAS,UAAU,EAAE;CAY1C;AAED,MAAM,MAAM,0BAA0B,CAAC,CAAC,SAAS,aAAa,IAAI,CAChE,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAC9B,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,KACtB,MAAM,CAAC;AAEZ,MAAM,WAAW,SAAS,CAAC,CAAC,GAAG,OAAO;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CACN,KAAK,EAAE,CAAC,EACR,MAAM,EAAE,UAAU,GAEhB,OAAO,CAAC,gBAAgB,GAAG,OAAO,GAAG,SAAS,gBAAgB,EAAE,CAAC,GACjE,gBAAgB,GAChB,OAAO,GACP,SAAS,gBAAgB,EAAE,CAAC;CACjC;AAED,qBAAa,eAAgB,YAAW,SAAS;IAC/C,IAAI,SAAqB;IACzB,OAAO,EAAE,MAAM,CAAC;gBAEJ,OAAO,EAAE,MAAM;IAI3B,QAAQ,QAAO,OAAO,CAAU;CACjC;AAUD,wBAAsB,YAAY,CAAC,CAAC,SAAS,aAAa,EACxD,KAAK,EAAE,CAAC,EACR,SAAS,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAC9B,0BAA0B,CAAC,EAAE,0BAA0B,CAAC,CAAC,CAAC,GACzD,OAAO,CAAC,aAAa,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAyD9C"}
1
+ {"version":3,"file":"Validation.d.ts","sourceRoot":"","sources":["src/Validation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAe,KAAK,KAAK,EAAE,MAAM,aAAa,CAAC;AAGrE,MAAM,WAAW,UAAU,CAAC,CAAC,GAAG,OAAO;IACrC,QAAQ,EAAE,aAAa,GAAG,MAAM,CAAC;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,CAAC,CAAC;IACT,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,aAAa,GAAG,MAAM,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,eAAgB,SAAQ,KAAK;IACxC,MAAM,EAAE,SAAS,UAAU,EAAE,CAAC;gBAElB,MAAM,EAAE,SAAS,UAAU,EAAE;CAa1C;AAED,MAAM,MAAM,0BAA0B,CAAC,CAAC,SAAS,aAAa,IAAI,CAChE,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAC9B,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,KACtB,MAAM,CAAC;AAEZ,MAAM,WAAW,SAAS,CAAC,CAAC,GAAG,OAAO;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CACN,KAAK,EAAE,CAAC,EACR,MAAM,EAAE,UAAU,GAEhB,OAAO,CAAC,gBAAgB,GAAG,OAAO,GAAG,SAAS,gBAAgB,EAAE,CAAC,GACjE,gBAAgB,GAChB,OAAO,GACP,SAAS,gBAAgB,EAAE,CAAC;CACjC;AAED,qBAAa,eAAgB,YAAW,SAAS;IAC/C,IAAI,SAAqB;IACzB,OAAO,EAAE,MAAM,CAAC;gBAEJ,OAAO,EAAE,MAAM;IAI3B,QAAQ,QAAO,OAAO,CAAU;CACjC;AAUD,wBAAsB,YAAY,CAAC,CAAC,SAAS,aAAa,EACxD,KAAK,EAAE,CAAC,EACR,SAAS,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAC9B,0BAA0B,CAAC,EAAE,0BAA0B,CAAC,CAAC,CAAC,GACzD,OAAO,CAAC,aAAa,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAyD9C"}
package/Validation.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { getBinderNode } from "./BinderNode.js";
2
- import { NumberModel } from "./Models.js";
2
+ import { AbstractModel, NumberModel } from "./Models.js";
3
3
  import { Required } from "./Validators.js";
4
4
  class ValidationError extends Error {
5
5
  errors;
@@ -7,9 +7,10 @@ class ValidationError extends Error {
7
7
  super(
8
8
  [
9
9
  "There are validation errors in the form.",
10
- ...errors.map(
11
- (e) => `${e.property.toString()} - ${e.validator.constructor.name}${e.message ? `: ${e.message}` : ""}`
12
- )
10
+ ...errors.map((e) => {
11
+ const property = e.property instanceof AbstractModel ? String(getBinderNode(e.property).value) : e.property;
12
+ return `${property} - ${e.validator.constructor.name}${e.message ? `: ${e.message}` : ""}`;
13
+ })
13
14
  ].join("\n - ")
14
15
  );
15
16
  this.errors = errors;
package/Validation.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["src/Validation.ts"],
4
- "sourcesContent": ["import type { BinderNode } from './BinderNode.js';\nimport { getBinderNode } from './BinderNode.js';\nimport type { BinderRoot } from './BinderRoot.js';\nimport { type AbstractModel, NumberModel, type Value } from './Models.js';\nimport { Required } from './Validators.js';\n\nexport interface ValueError<T = unknown> {\n property: AbstractModel | string;\n message: string;\n value: T;\n validator: Validator<T>;\n validatorMessage?: string;\n}\n\nexport interface ValidationResult {\n property: AbstractModel | string;\n message?: string;\n}\n\nexport class ValidationError extends Error {\n errors: readonly ValueError[];\n\n constructor(errors: readonly ValueError[]) {\n super(\n [\n 'There are validation errors in the form.',\n ...errors.map(\n (e) => `${e.property.toString()} - ${e.validator.constructor.name}${e.message ? `: ${e.message}` : ''}`,\n ),\n ].join('\\n - '),\n );\n this.errors = errors;\n this.name = this.constructor.name;\n }\n}\n\nexport type InterpolateMessageCallback<M extends AbstractModel> = (\n message: string,\n validator: Validator<Value<M>>,\n binderNode: BinderNode<M>,\n) => string;\n\nexport interface Validator<T = unknown> {\n message: string;\n impliesRequired?: boolean;\n name?: string;\n validate(\n value: T,\n binder: BinderRoot,\n ):\n | Promise<ValidationResult | boolean | readonly ValidationResult[]>\n | ValidationResult\n | boolean\n | readonly ValidationResult[];\n}\n\nexport class ServerValidator implements Validator {\n name = 'ServerValidator';\n message: string;\n\n constructor(message: string) {\n this.message = message;\n }\n\n validate = (): boolean => false;\n}\n\n// The `property` field of `ValidationResult`s is a path relative to the parent.\nfunction setPropertyAbsolutePath(binderNodeName: string, result: ValidationResult): ValidationResult {\n if (typeof result.property === 'string' && binderNodeName.length > 0) {\n result.property = `${binderNodeName}.${result.property}`;\n }\n return result;\n}\n\nexport async function runValidator<M extends AbstractModel>(\n model: M,\n validator: Validator<Value<M>>,\n interpolateMessageCallback?: InterpolateMessageCallback<M>,\n): Promise<ReadonlyArray<ValueError<Value<M>>>> {\n const binderNode = getBinderNode(model);\n const value = binderNode.value as Value<M>;\n\n const interpolateMessage = (message: string) => {\n if (!interpolateMessageCallback) {\n return message;\n }\n return interpolateMessageCallback(message, validator, binderNode);\n };\n\n // If model is not required and value empty, do not run any validator. Except\n // always validate NumberModel, which has a mandatory builtin validator\n // to indicate NaN input.\n if (!binderNode.required && !new Required().validate(value) && !(model instanceof NumberModel)) {\n return [];\n }\n\n try {\n const result = await validator.validate(value, binderNode.binder);\n\n if (result === false) {\n return [\n {\n message: interpolateMessage(validator.message),\n property: binderNode.name,\n validator,\n value,\n },\n ];\n }\n\n if (result === true || (Array.isArray(result) && result.length === 0)) {\n return [];\n }\n\n if (Array.isArray(result)) {\n return result.map((result2) => ({\n message: interpolateMessage(validator.message),\n ...setPropertyAbsolutePath(binderNode.name, result2),\n validator,\n value,\n }));\n }\n\n return [\n {\n message: interpolateMessage(validator.message),\n ...setPropertyAbsolutePath(binderNode.name, result as ValidationResult),\n validator,\n value,\n },\n ];\n } catch (error: unknown) {\n console.error(`${binderNode.name} - Validator ${validator.constructor.name} threw an error:`, error);\n return [{ message: 'Validator threw an error', property: binderNode.name, validator, value }];\n }\n}\n"],
5
- "mappings": "AACA,SAAS,qBAAqB;AAE9B,SAA6B,mBAA+B;AAC5D,SAAS,gBAAgB;AAelB,MAAM,wBAAwB,MAAM;AAAA,EACzC;AAAA,EAEA,YAAY,QAA+B;AACzC;AAAA,MACE;AAAA,QACE;AAAA,QACA,GAAG,OAAO;AAAA,UACR,CAAC,MAAM,GAAG,EAAE,SAAS,SAAS,CAAC,MAAM,EAAE,UAAU,YAAY,IAAI,GAAG,EAAE,UAAU,KAAK,EAAE,OAAO,KAAK,EAAE;AAAA,QACvG;AAAA,MACF,EAAE,KAAK,OAAO;AAAA,IAChB;AACA,SAAK,SAAS;AACd,SAAK,OAAO,KAAK,YAAY;AAAA,EAC/B;AACF;AAsBO,MAAM,gBAAqC;AAAA,EAChD,OAAO;AAAA,EACP;AAAA,EAEA,YAAY,SAAiB;AAC3B,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,WAAW,MAAe;AAC5B;AAGA,SAAS,wBAAwB,gBAAwB,QAA4C;AACnG,MAAI,OAAO,OAAO,aAAa,YAAY,eAAe,SAAS,GAAG;AACpE,WAAO,WAAW,GAAG,cAAc,IAAI,OAAO,QAAQ;AAAA,EACxD;AACA,SAAO;AACT;AAEA,eAAsB,aACpB,OACA,WACA,4BAC8C;AAC9C,QAAM,aAAa,cAAc,KAAK;AACtC,QAAM,QAAQ,WAAW;AAEzB,QAAM,qBAAqB,CAAC,YAAoB;AAC9C,QAAI,CAAC,4BAA4B;AAC/B,aAAO;AAAA,IACT;AACA,WAAO,2BAA2B,SAAS,WAAW,UAAU;AAAA,EAClE;AAKA,MAAI,CAAC,WAAW,YAAY,CAAC,IAAI,SAAS,EAAE,SAAS,KAAK,KAAK,EAAE,iBAAiB,cAAc;AAC9F,WAAO,CAAC;AAAA,EACV;AAEA,MAAI;AACF,UAAM,SAAS,MAAM,UAAU,SAAS,OAAO,WAAW,MAAM;AAEhE,QAAI,WAAW,OAAO;AACpB,aAAO;AAAA,QACL;AAAA,UACE,SAAS,mBAAmB,UAAU,OAAO;AAAA,UAC7C,UAAU,WAAW;AAAA,UACrB;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,QAAI,WAAW,QAAS,MAAM,QAAQ,MAAM,KAAK,OAAO,WAAW,GAAI;AACrE,aAAO,CAAC;AAAA,IACV;AAEA,QAAI,MAAM,QAAQ,MAAM,GAAG;AACzB,aAAO,OAAO,IAAI,CAAC,aAAa;AAAA,QAC9B,SAAS,mBAAmB,UAAU,OAAO;AAAA,QAC7C,GAAG,wBAAwB,WAAW,MAAM,OAAO;AAAA,QACnD;AAAA,QACA;AAAA,MACF,EAAE;AAAA,IACJ;AAEA,WAAO;AAAA,MACL;AAAA,QACE,SAAS,mBAAmB,UAAU,OAAO;AAAA,QAC7C,GAAG,wBAAwB,WAAW,MAAM,MAA0B;AAAA,QACtE;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF,SAAS,OAAgB;AACvB,YAAQ,MAAM,GAAG,WAAW,IAAI,gBAAgB,UAAU,YAAY,IAAI,oBAAoB,KAAK;AACnG,WAAO,CAAC,EAAE,SAAS,4BAA4B,UAAU,WAAW,MAAM,WAAW,MAAM,CAAC;AAAA,EAC9F;AACF;",
4
+ "sourcesContent": ["import type { BinderNode } from './BinderNode.js';\nimport { getBinderNode } from './BinderNode.js';\nimport type { BinderRoot } from './BinderRoot.js';\nimport { AbstractModel, NumberModel, type Value } from './Models.js';\nimport { Required } from './Validators.js';\n\nexport interface ValueError<T = unknown> {\n property: AbstractModel | string;\n message: string;\n value: T;\n validator: Validator<T>;\n validatorMessage?: string;\n}\n\nexport interface ValidationResult {\n property: AbstractModel | string;\n message?: string;\n}\n\nexport class ValidationError extends Error {\n errors: readonly ValueError[];\n\n constructor(errors: readonly ValueError[]) {\n super(\n [\n 'There are validation errors in the form.',\n ...errors.map((e) => {\n const property = e.property instanceof AbstractModel ? String(getBinderNode(e.property).value) : e.property;\n return `${property} - ${e.validator.constructor.name}${e.message ? `: ${e.message}` : ''}`;\n }),\n ].join('\\n - '),\n );\n this.errors = errors;\n this.name = this.constructor.name;\n }\n}\n\nexport type InterpolateMessageCallback<M extends AbstractModel> = (\n message: string,\n validator: Validator<Value<M>>,\n binderNode: BinderNode<M>,\n) => string;\n\nexport interface Validator<T = unknown> {\n message: string;\n impliesRequired?: boolean;\n name?: string;\n validate(\n value: T,\n binder: BinderRoot,\n ):\n | Promise<ValidationResult | boolean | readonly ValidationResult[]>\n | ValidationResult\n | boolean\n | readonly ValidationResult[];\n}\n\nexport class ServerValidator implements Validator {\n name = 'ServerValidator';\n message: string;\n\n constructor(message: string) {\n this.message = message;\n }\n\n validate = (): boolean => false;\n}\n\n// The `property` field of `ValidationResult`s is a path relative to the parent.\nfunction setPropertyAbsolutePath(binderNodeName: string, result: ValidationResult): ValidationResult {\n if (typeof result.property === 'string' && binderNodeName.length > 0) {\n result.property = `${binderNodeName}.${result.property}`;\n }\n return result;\n}\n\nexport async function runValidator<M extends AbstractModel>(\n model: M,\n validator: Validator<Value<M>>,\n interpolateMessageCallback?: InterpolateMessageCallback<M>,\n): Promise<ReadonlyArray<ValueError<Value<M>>>> {\n const binderNode = getBinderNode(model);\n const value = binderNode.value as Value<M>;\n\n const interpolateMessage = (message: string) => {\n if (!interpolateMessageCallback) {\n return message;\n }\n return interpolateMessageCallback(message, validator, binderNode);\n };\n\n // If model is not required and value empty, do not run any validator. Except\n // always validate NumberModel, which has a mandatory builtin validator\n // to indicate NaN input.\n if (!binderNode.required && !new Required().validate(value) && !(model instanceof NumberModel)) {\n return [];\n }\n\n try {\n const result = await validator.validate(value, binderNode.binder);\n\n if (result === false) {\n return [\n {\n message: interpolateMessage(validator.message),\n property: binderNode.name,\n validator,\n value,\n },\n ];\n }\n\n if (result === true || (Array.isArray(result) && result.length === 0)) {\n return [];\n }\n\n if (Array.isArray(result)) {\n return result.map((result2) => ({\n message: interpolateMessage(validator.message),\n ...setPropertyAbsolutePath(binderNode.name, result2),\n validator,\n value,\n }));\n }\n\n return [\n {\n message: interpolateMessage(validator.message),\n ...setPropertyAbsolutePath(binderNode.name, result as ValidationResult),\n validator,\n value,\n },\n ];\n } catch (error: unknown) {\n console.error(`${binderNode.name} - Validator ${validator.constructor.name} threw an error:`, error);\n return [{ message: 'Validator threw an error', property: binderNode.name, validator, value }];\n }\n}\n"],
5
+ "mappings": "AACA,SAAS,qBAAqB;AAE9B,SAAS,eAAe,mBAA+B;AACvD,SAAS,gBAAgB;AAelB,MAAM,wBAAwB,MAAM;AAAA,EACzC;AAAA,EAEA,YAAY,QAA+B;AACzC;AAAA,MACE;AAAA,QACE;AAAA,QACA,GAAG,OAAO,IAAI,CAAC,MAAM;AACnB,gBAAM,WAAW,EAAE,oBAAoB,gBAAgB,OAAO,cAAc,EAAE,QAAQ,EAAE,KAAK,IAAI,EAAE;AACnG,iBAAO,GAAG,QAAQ,MAAM,EAAE,UAAU,YAAY,IAAI,GAAG,EAAE,UAAU,KAAK,EAAE,OAAO,KAAK,EAAE;AAAA,QAC1F,CAAC;AAAA,MACH,EAAE,KAAK,OAAO;AAAA,IAChB;AACA,SAAK,SAAS;AACd,SAAK,OAAO,KAAK,YAAY;AAAA,EAC/B;AACF;AAsBO,MAAM,gBAAqC;AAAA,EAChD,OAAO;AAAA,EACP;AAAA,EAEA,YAAY,SAAiB;AAC3B,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,WAAW,MAAe;AAC5B;AAGA,SAAS,wBAAwB,gBAAwB,QAA4C;AACnG,MAAI,OAAO,OAAO,aAAa,YAAY,eAAe,SAAS,GAAG;AACpE,WAAO,WAAW,GAAG,cAAc,IAAI,OAAO,QAAQ;AAAA,EACxD;AACA,SAAO;AACT;AAEA,eAAsB,aACpB,OACA,WACA,4BAC8C;AAC9C,QAAM,aAAa,cAAc,KAAK;AACtC,QAAM,QAAQ,WAAW;AAEzB,QAAM,qBAAqB,CAAC,YAAoB;AAC9C,QAAI,CAAC,4BAA4B;AAC/B,aAAO;AAAA,IACT;AACA,WAAO,2BAA2B,SAAS,WAAW,UAAU;AAAA,EAClE;AAKA,MAAI,CAAC,WAAW,YAAY,CAAC,IAAI,SAAS,EAAE,SAAS,KAAK,KAAK,EAAE,iBAAiB,cAAc;AAC9F,WAAO,CAAC;AAAA,EACV;AAEA,MAAI;AACF,UAAM,SAAS,MAAM,UAAU,SAAS,OAAO,WAAW,MAAM;AAEhE,QAAI,WAAW,OAAO;AACpB,aAAO;AAAA,QACL;AAAA,UACE,SAAS,mBAAmB,UAAU,OAAO;AAAA,UAC7C,UAAU,WAAW;AAAA,UACrB;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,QAAI,WAAW,QAAS,MAAM,QAAQ,MAAM,KAAK,OAAO,WAAW,GAAI;AACrE,aAAO,CAAC;AAAA,IACV;AAEA,QAAI,MAAM,QAAQ,MAAM,GAAG;AACzB,aAAO,OAAO,IAAI,CAAC,aAAa;AAAA,QAC9B,SAAS,mBAAmB,UAAU,OAAO;AAAA,QAC7C,GAAG,wBAAwB,WAAW,MAAM,OAAO;AAAA,QACnD;AAAA,QACA;AAAA,MACF,EAAE;AAAA,IACJ;AAEA,WAAO;AAAA,MACL;AAAA,QACE,SAAS,mBAAmB,UAAU,OAAO;AAAA,QAC7C,GAAG,wBAAwB,WAAW,MAAM,MAA0B;AAAA,QACtE;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF,SAAS,OAAgB;AACvB,YAAQ,MAAM,GAAG,WAAW,IAAI,gBAAgB,UAAU,YAAY,IAAI,oBAAoB,KAAK;AACnG,WAAO,CAAC,EAAE,SAAS,4BAA4B,UAAU,WAAW,MAAM,WAAW,MAAM,CAAC;AAAA,EAC9F;AACF;",
6
6
  "names": []
7
7
  }
package/index.js CHANGED
@@ -2,7 +2,7 @@ function __REGISTER__(feature, vaadinObj = window.Vaadin ??= {}) {
2
2
  vaadinObj.registrations ??= [];
3
3
  vaadinObj.registrations.push({
4
4
  is: feature ? `${"@vaadin/hilla-lit-form"}/${feature}` : "@vaadin/hilla-lit-form",
5
- version: "24.4.6"
5
+ version: "24.5.0-alpha10"
6
6
  });
7
7
  }
8
8
  export * from "./Binder.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vaadin/hilla-lit-form",
3
- "version": "24.4.6",
3
+ "version": "24.5.0-alpha10",
4
4
  "description": "Hilla form utils",
5
5
  "main": "index.js",
6
6
  "module": "index.js",
@@ -21,7 +21,7 @@
21
21
  "build:dts": "tsc --isolatedModules -p tsconfig.build.json",
22
22
  "lint": "eslint src test",
23
23
  "lint:fix": "npm run lint -- --fix",
24
- "test": "karma start ../../../karma.config.cjs --port 9877",
24
+ "test": "karma start ../../../karma.config.cjs --port 9876",
25
25
  "test:coverage": "npm run test -- --coverage",
26
26
  "test:watch": "npm run test -- --watch",
27
27
  "typecheck": "tsc --noEmit"
@@ -71,7 +71,7 @@
71
71
  "access": "public"
72
72
  },
73
73
  "dependencies": {
74
- "@vaadin/hilla-frontend": "24.4.6",
74
+ "@vaadin/hilla-frontend": "24.5.0-alpha10",
75
75
  "validator": "^13.11.0"
76
76
  },
77
77
  "peerDependencies": {
@@ -88,6 +88,6 @@
88
88
  "chai-dom": "^1.11.0",
89
89
  "sinon": "^16.0.0",
90
90
  "sinon-chai": "^3.7.0",
91
- "typescript": "5.3.2"
91
+ "typescript": "5.5.2"
92
92
  }
93
93
  }