@vaadin/hilla-models
Version:
Generative form models for Hilla
68 lines • 2.06 kB
JavaScript
import { $defaultValue, $key, $meta, $name, $optional, $owner, } from './Model.js';
const { create, defineProperty } = Object;
const $model = Symbol('model');
export class CoreModelBuilder {
[$model];
constructor(base, defaultValueProvider) {
this[$model] = create(base);
if (defaultValueProvider) {
this.defaultValueProvider(defaultValueProvider);
}
}
meta(value) {
this.define($meta, { value });
return this;
}
define(key, value) {
defineProperty(this[$model], key, value);
return this;
}
defaultValueProvider(defaultValueProvider) {
this.define($defaultValue, {
get() {
return defaultValueProvider(this);
},
});
return this;
}
name(name) {
return this.define($name, { value: name });
}
build() {
return this[$model];
}
}
const propertyRegistry = new WeakMap();
export class ObjectModelBuilder extends CoreModelBuilder {
constructor(base) {
super(base, (m) => {
const result = {};
for (const key in m) {
const keyModel = m[key];
result[key] = keyModel[$optional] ? undefined : keyModel[$defaultValue];
}
return result;
});
}
object(name) {
return this.name(name);
}
property(key, model) {
defineProperty(this[$model], key, {
enumerable: true,
get() {
if (!propertyRegistry.has(this)) {
propertyRegistry.set(this, {});
}
const props = propertyRegistry.get(this);
props[key] ??= new CoreModelBuilder(typeof model === 'function' ? model(this) : model)
.define($key, { value: key })
.define($owner, { value: this })
.build();
return props[key];
},
});
return this;
}
}
//# sourceMappingURL=modelBuilders.js.map