UNPKG

@vaadin/hilla-models

Version:

Generative form models for Hilla

72 lines 2.63 kB
import { CoreModelBuilder, ObjectModelBuilder } from './builders.js'; import { ArrayModel, EnumModel, ObjectModel } from './core.js'; import { $defaultValue, $enum, $itemModel, $key, $members, $name, $optional, $owner, Model, nothing, } from './model.js'; export * from './model.js'; export * from './core.js'; const { defineProperty } = Object; const arrayItemModels = new WeakMap(); function getRawValue(model) { if (model[$owner] instanceof Model) { const parentValue = getRawValue(model[$owner]); return parentValue === nothing ? nothing : parentValue[model[$key]]; } return model[$owner].value; } const m = { attach(model, target) { const _model = new CoreModelBuilder(model) .name(`@${model[$name]}`) .build(); defineProperty(_model, $owner, { value: target }); defineProperty(target, 'model', { enumerable: true, configurable: true, value: model }); return _model; }, extend(base) { return new ObjectModelBuilder(base); }, optional(base) { return new CoreModelBuilder(base) .define($optional, { value: true }) .build(); }, array(itemModel) { return new CoreModelBuilder(ArrayModel) .name(`Array<${itemModel[$name]}>`) .define($itemModel, { value: itemModel }) .build(); }, object(name) { return new ObjectModelBuilder(ObjectModel).name(name); }, enum(obj, name) { return new CoreModelBuilder(EnumModel).define($enum, { value: obj }).name(name).build(); }, union(...members) { return new CoreModelBuilder(Model, () => members[0][$defaultValue]) .name(members.map((model) => model[$name]).join(' | ')) .define($members, { value: members }) .build(); }, *items(model) { const list = arrayItemModels.get(model) ?? []; arrayItemModels.set(model, list); const value = m.value(model); list.length = value.length; for (let i = 0; i < value.length; i++) { if (!list[i]) { list[i] = new CoreModelBuilder(model[$itemModel], () => value[i]) .name(`${model[$itemModel][$name]}[${i}]`) .define($key, { value: i }) .define($owner, { value: model }) .build(); } yield list[i]; } }, value(model) { const value = getRawValue(model); return value === nothing ? model[$defaultValue] : value; }, }; export default m; //# sourceMappingURL=index.js.map