@vaadin/hilla-models
Version:
Generative form models for Hilla
74 lines • 2.68 kB
JavaScript
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