UNPKG

rx-form-mapper

Version:

Proper decorator-based transformation / serialization / deserialization of plain javascript classes to angular reactive forms

35 lines 6.31 kB
import 'reflect-metadata'; import { MetadataDesignTypes } from '.'; import { FormMetadata } from '../metadata'; export class ModelBinder { constructor() { this.metadataKey = 'rx-form-mapper-metadata'; } getMetadata(target) { if (!Reflect.hasMetadata(this.metadataKey, target)) { Reflect.defineMetadata(this.metadataKey, new FormMetadata(target), target); } return Reflect.getMetadata(this.metadataKey, target); } bindForm(target, opts) { const formMetadata = this.getMetadata(target); formMetadata.setValidators(opts); } bindCustomControl(target, propertyName, opts) { this.getMetadata(target.constructor).setCustomControl(propertyName, opts.mapper, opts); } bindFormControl(target, propertyName, opts) { this.getMetadata(target.constructor).setFormControl(propertyName, opts); } bindFormGroup(target, propertyName, type) { const propertyType = type !== null && type !== void 0 ? type : Reflect.getMetadata(MetadataDesignTypes.TYPE, target, propertyName); const propertyFormMetadata = this.getMetadata(propertyType); this.getMetadata(target.constructor).setFormGroup(propertyName, propertyFormMetadata); } bindFormArray(target, propertyName, opts) { const itemFormMetadata = this.getMetadata(opts.type); this.getMetadata(target.constructor).setFormArray(propertyName, itemFormMetadata, opts); } } ModelBinder.instance = new ModelBinder(); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwtYmluZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcngtZm9ybS1tYXBwZXIvc3JjL2xpYi9iaW5kL21vZGVsLWJpbmRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFBRyxtQkFBbUIsRUFBRSxNQUFNLEdBQUcsQ0FBQztBQUV6QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRTNDLE1BQU0sT0FBTyxXQUFXO0lBTXZCO1FBSlEsZ0JBQVcsR0FBRyx5QkFBeUIsQ0FBQztJQUl6QixDQUFDO0lBRWpCLFdBQVcsQ0FBQyxNQUFpQjtRQUNuQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxFQUFFO1lBQ25ELE9BQU8sQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLFlBQVksQ0FBQyxNQUFNLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztTQUMzRTtRQUVELE9BQU8sT0FBTyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFTSxRQUFRLENBQUMsTUFBaUIsRUFBRSxJQUFjO1FBQ2hELE1BQU0sWUFBWSxHQUFpQixJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzVELFlBQVksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVNLGlCQUFpQixDQUFDLE1BQWdDLEVBQUUsWUFBb0IsRUFBRSxJQUF1QjtRQUN2RyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN4RixDQUFDO0lBRU0sZUFBZSxDQUFDLE1BQWdDLEVBQUUsWUFBb0IsRUFBRSxJQUFzQjtRQUNwRyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxjQUFjLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3pFLENBQUM7SUFFTSxhQUFhLENBQUMsTUFBZ0MsRUFBRSxZQUFvQixFQUFFLElBQWdCO1FBQzVGLE1BQU0sWUFBWSxHQUFHLElBQUksYUFBSixJQUFJLGNBQUosSUFBSSxHQUFJLE9BQU8sQ0FBQyxXQUFXLENBQUMsbUJBQW1CLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxZQUFZLENBQUMsQ0FBQztRQUNqRyxNQUFNLG9CQUFvQixHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDNUQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsWUFBWSxDQUFDLFlBQVksRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO0lBQ3ZGLENBQUM7SUFFTSxhQUFhLENBQUMsTUFBZ0MsRUFBRSxZQUFvQixFQUFFLElBQW1CO1FBQy9GLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsWUFBWSxDQUFDLFlBQVksRUFBRSxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN6RixDQUFDOztBQWxDc0Isb0JBQVEsR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVHlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0ICdyZWZsZWN0LW1ldGFkYXRhJztcbmltcG9ydCB7ICBNZXRhZGF0YURlc2lnblR5cGVzIH0gZnJvbSAnLic7XG5pbXBvcnQgeyBDdXN0b21Db250cm9sT3B0cywgRm9ybUFycmF5T3B0cywgRm9ybUNvbnRyb2xPcHRzLCBGb3JtT3B0cyB9IGZyb20gJy4uL2RlY29yYXRvcnMnO1xuaW1wb3J0IHsgRm9ybU1ldGFkYXRhIH0gZnJvbSAnLi4vbWV0YWRhdGEnO1xuXG5leHBvcnQgY2xhc3MgTW9kZWxCaW5kZXIge1xuXG5cdHByaXZhdGUgbWV0YWRhdGFLZXkgPSAncngtZm9ybS1tYXBwZXItbWV0YWRhdGEnO1xuXG5cdHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaW5zdGFuY2UgPSBuZXcgTW9kZWxCaW5kZXIoKTtcblxuXHRwcml2YXRlIGNvbnN0cnVjdG9yKCkge31cblxuXHRwdWJsaWMgZ2V0TWV0YWRhdGEodGFyZ2V0OiBUeXBlPGFueT4pOiBGb3JtTWV0YWRhdGEge1xuXHRcdGlmICghUmVmbGVjdC5oYXNNZXRhZGF0YSh0aGlzLm1ldGFkYXRhS2V5LCB0YXJnZXQpKSB7XG5cdFx0XHRSZWZsZWN0LmRlZmluZU1ldGFkYXRhKHRoaXMubWV0YWRhdGFLZXksIG5ldyBGb3JtTWV0YWRhdGEodGFyZ2V0KSwgdGFyZ2V0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gUmVmbGVjdC5nZXRNZXRhZGF0YSh0aGlzLm1ldGFkYXRhS2V5LCB0YXJnZXQpO1xuXHR9XG5cblx0cHVibGljIGJpbmRGb3JtKHRhcmdldDogVHlwZTxhbnk+LCBvcHRzOiBGb3JtT3B0cykge1xuXHRcdGNvbnN0IGZvcm1NZXRhZGF0YTogRm9ybU1ldGFkYXRhID0gdGhpcy5nZXRNZXRhZGF0YSh0YXJnZXQpO1xuXHRcdGZvcm1NZXRhZGF0YS5zZXRWYWxpZGF0b3JzKG9wdHMpO1xuXHR9XG5cblx0cHVibGljIGJpbmRDdXN0b21Db250cm9sKHRhcmdldDoge2NvbnN0cnVjdG9yOiBUeXBlPGFueT59LCBwcm9wZXJ0eU5hbWU6IHN0cmluZywgb3B0czogQ3VzdG9tQ29udHJvbE9wdHMpIHtcblx0XHR0aGlzLmdldE1ldGFkYXRhKHRhcmdldC5jb25zdHJ1Y3Rvcikuc2V0Q3VzdG9tQ29udHJvbChwcm9wZXJ0eU5hbWUsIG9wdHMubWFwcGVyLCBvcHRzKTtcblx0fVxuXG5cdHB1YmxpYyBiaW5kRm9ybUNvbnRyb2wodGFyZ2V0OiB7Y29uc3RydWN0b3I6IFR5cGU8YW55Pn0sIHByb3BlcnR5TmFtZTogc3RyaW5nLCBvcHRzPzogRm9ybUNvbnRyb2xPcHRzKTogdm9pZCB7XG5cdFx0dGhpcy5nZXRNZXRhZGF0YSh0YXJnZXQuY29uc3RydWN0b3IpLnNldEZvcm1Db250cm9sKHByb3BlcnR5TmFtZSwgb3B0cyk7XG5cdH1cblxuXHRwdWJsaWMgYmluZEZvcm1Hcm91cCh0YXJnZXQ6IHtjb25zdHJ1Y3RvcjogVHlwZTxhbnk+fSwgcHJvcGVydHlOYW1lOiBzdHJpbmcsIHR5cGU/OiBUeXBlPGFueT4pOiB2b2lkIHtcblx0XHRjb25zdCBwcm9wZXJ0eVR5cGUgPSB0eXBlID8/IFJlZmxlY3QuZ2V0TWV0YWRhdGEoTWV0YWRhdGFEZXNpZ25UeXBlcy5UWVBFLCB0YXJnZXQsIHByb3BlcnR5TmFtZSk7XG5cdFx0Y29uc3QgcHJvcGVydHlGb3JtTWV0YWRhdGEgPSB0aGlzLmdldE1ldGFkYXRhKHByb3BlcnR5VHlwZSk7XG5cdFx0dGhpcy5nZXRNZXRhZGF0YSh0YXJnZXQuY29uc3RydWN0b3IpLnNldEZvcm1Hcm91cChwcm9wZXJ0eU5hbWUsIHByb3BlcnR5Rm9ybU1ldGFkYXRhKTtcblx0fVxuXG5cdHB1YmxpYyBiaW5kRm9ybUFycmF5KHRhcmdldDoge2NvbnN0cnVjdG9yOiBUeXBlPGFueT59LCBwcm9wZXJ0eU5hbWU6IHN0cmluZywgb3B0czogRm9ybUFycmF5T3B0cyk6IHZvaWQge1xuXHRcdGNvbnN0IGl0ZW1Gb3JtTWV0YWRhdGEgPSB0aGlzLmdldE1ldGFkYXRhKG9wdHMudHlwZSk7XG5cdFx0dGhpcy5nZXRNZXRhZGF0YSh0YXJnZXQuY29uc3RydWN0b3IpLnNldEZvcm1BcnJheShwcm9wZXJ0eU5hbWUsIGl0ZW1Gb3JtTWV0YWRhdGEsIG9wdHMpO1xuXHR9XG5cbn1cbiJdfQ==