UNPKG

@vaadin/hilla-models

Version:

Generative form models for Hilla

74 lines 2.68 kB
import { Model, $owner, nothing, $key, $name, $defaultValue, $members, } from './Model.js'; import { CoreModelBuilder, ObjectModelBuilder } from './modelBuilders.js'; import { EnumModel, ObjectModel, $itemModel, $enum, } from './models.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; } export { self, optional, array, constrained, meta } from './converters.js'; export function attach(model, targetProvider) { const _model = new CoreModelBuilder(model).name(`@${model[$name]}`).build(); defineProperty(_model, $owner, { get: targetProvider }); return _model; } export function extend(base) { return new ObjectModelBuilder(base); } export function object(name) { return new ObjectModelBuilder(ObjectModel).name(name); } function _enum(obj, name) { return new CoreModelBuilder(EnumModel).define($enum, { value: obj }).name(name).build(); } export { _enum as enum }; export function union(...members) { return new CoreModelBuilder(Model, () => members[0][$defaultValue]) .name(members.map((model) => model[$name]).join(' | ')) .define($members, { value: members }) .define(Symbol.hasInstance, { value: (v) => members.some((member) => v instanceof member), }) .build(); } export function getValue(model) { const v = getRawValue(model); return v === nothing ? model[$defaultValue] : v; } export function* items(model) { const list = arrayItemModels.get(model) ?? []; arrayItemModels.set(model, list); const v = getValue(model) ?? []; list.length = v.length; for (let i = 0; i < v.length; i++) { if (!list[i]) { list[i] = new CoreModelBuilder(model[$itemModel], () => v[i]) .name(`${model[$itemModel][$name]}[${i}]`) .define($key, { value: i }) .define($owner, { value: model }) .build(); } yield list[i]; } } export function withDefaultValue(model, defaultValue) { return new CoreModelBuilder(model, () => defaultValue).name(model[$name]).build(); } export function isConstraint(arg, constraintType) { let p = arg; do { if (p === constraintType) { return true; } if (typeof p !== 'object') { return false; } p = Object.getPrototypeOf(p); } while (p !== undefined && p !== null); return false; } //# sourceMappingURL=m.js.map