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