UNPKG

@vaadin/hilla-models

Version:

Generative form models for Hilla

68 lines 2.06 kB
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