@vaadin/hilla-models
Version:
Generative form models for Hilla
71 lines • 2.15 kB
JavaScript
import { $defaultValue, $key, $meta, $name, $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 = create(null);
for (const key in m) {
defineProperty(result, key, {
enumerable: true,
get: () => m[key][$defaultValue],
});
}
return result;
});
}
object(name) {
return this.name(name);
}
property(key, model, options) {
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 })
.define($meta, { value: options?.meta })
.build();
return props[key];
},
});
return this;
}
}
//# sourceMappingURL=builders.js.map