UNPKG

typed-reactive-form

Version:

Allows creation of a ReactiveForm based on a class with its properties properly decorated.

82 lines (74 loc) 2.39 kB
import 'reflect-metadata'; import { FormGroup as FormGroup$1, FormControl } from '@angular/forms'; const formMemberKey = 'formMember'; const formGroupKey = 'formGroup'; function FormMember(options) { return (target, key) => { let formMembers = Reflect.getMetadata(formMemberKey, target); if (formMembers) { formMembers.push({ property: key, options: getOptions(options) }); } else { formMembers = [{ property: key, options: getOptions(options) }]; Reflect.defineMetadata(formMemberKey, formMembers, target); } }; } function getOptions(options) { const defaultOptions = { defaultValue: null, validators: [], }; if (options) { Object.assign(defaultOptions, options); } return defaultOptions; } function FormGroup(constructor) { return (target, key) => { let formArrays = Reflect.getMetadata(formGroupKey, target); if (formArrays) { formArrays.push({ property: key, constructor }); } else { formArrays = [{ property: key, constructor }]; Reflect.defineMetadata(formGroupKey, formArrays, target); } }; } class TypedReactiveForm extends FormGroup$1 { constructor(c, context) { super(createControls(new c(), context)); } } function createControls(instance, context) { const result = {}; const members = getFormMemberDetails(instance); members.forEach(member => { const options = member.options; if (!options.context || options.context.length === 0 || options.context.includes(context)) { result[member.property] = new FormControl(instance[member.property], options.validators); } }); const groups = getFormGroupDetails(instance); if (groups) { groups.forEach(group => { result[group.property] = new TypedReactiveForm(group.constructor); }); } return result; } function getFormMemberDetails(instance) { return Reflect.getMetadata(formMemberKey, instance); } function getFormGroupDetails(instance) { return Reflect.getMetadata(formGroupKey, instance); } /* * Public API Surface of typed-reactive-form */ /** * Generated bundle index. Do not edit. */ export { FormGroup, FormMember, TypedReactiveForm }; //# sourceMappingURL=typed-reactive-form.js.map