rx-form-mapper
Version:
Proper decorator-based transformation / serialization / deserialization of plain javascript classes to angular reactive forms
54 lines • 7.92 kB
JavaScript
import { FormArray, FormControl, FormGroup } from '@angular/forms';
export class FormReader {
constructor(control, customMapperResolver) {
this.control = control;
this.customMapperResolver = customMapperResolver;
}
visitCustomControlMetadata(customControlMetadata) {
return this.customMapperResolver.resolve(customControlMetadata.mapper).readForm(this.control);
}
visitFormArrayMetadata(formArrayMetadata) {
if (!this.control) {
return void (0);
}
this.checkControlType(this.control, FormArray);
return this.control.controls.map(control => {
const subFormReader = this.copyPrototype(control);
return formArrayMetadata.itemForm.accept(subFormReader);
});
}
visitFormControlMetadata(formControlMetadata) {
if (!this.control) {
return void (0);
}
this.checkControlType(this.control, FormControl);
return this.control.value;
}
visitFormGroupMetadata(formGroupMetadata) {
return this.visitFormMetadata(formGroupMetadata.form);
}
visitFormMetadata(formMetadata) {
if (!this.control) {
return void (0);
}
this.checkControlType(this.control, FormGroup);
const value = new formMetadata.type();
const formGroup = this.control;
for (const [key, controlMetadata] of Object.entries(formMetadata.controls)) {
const formField = formGroup.controls[key];
const formFieldReader = this.copyPrototype(formField);
value[key] = controlMetadata.accept(formFieldReader);
}
return value;
}
copyPrototype(control) {
return new FormReader(control, this.customMapperResolver);
}
checkControlType(control, type) {
if (control instanceof type) {
return;
}
throw new Error(`control is not ${type.name} instance`);
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1yZWFkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yeC1mb3JtLW1hcHBlci9zcmMvbGliL3NlcnZpY2VzL2Zvcm0tcmVhZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBbUIsU0FBUyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUlwRixNQUFNLE9BQU8sVUFBVTtJQUV0QixZQUFvQyxPQUF3QixFQUFtQixvQkFBMEM7UUFBckYsWUFBTyxHQUFQLE9BQU8sQ0FBaUI7UUFBbUIseUJBQW9CLEdBQXBCLG9CQUFvQixDQUFzQjtJQUFHLENBQUM7SUFFdEgsMEJBQTBCLENBQUMscUJBQTRDO1FBQzdFLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQy9GLENBQUM7SUFFTSxzQkFBc0IsQ0FBQyxpQkFBb0M7UUFDakUsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDbEIsT0FBTyxLQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDZjtRQUVELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBRS9DLE9BQVEsSUFBSSxDQUFDLE9BQXFCLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUN6RCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2xELE9BQU8saUJBQWlCLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUN6RCxDQUFDLENBQUMsQ0FBQztJQUNKLENBQUM7SUFFTSx3QkFBd0IsQ0FBQyxtQkFBd0M7UUFDdkUsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDbEIsT0FBTyxLQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDZjtRQUVELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBRWpELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7SUFDM0IsQ0FBQztJQUVNLHNCQUFzQixDQUFDLGlCQUFvQztRQUNqRSxPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRU0saUJBQWlCLENBQUMsWUFBMEI7UUFDbEQsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDbEIsT0FBTyxLQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDZjtRQUVELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBRS9DLE1BQU0sS0FBSyxHQUFHLElBQUksWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3RDLE1BQU0sU0FBUyxHQUFjLElBQUksQ0FBQyxPQUFvQixDQUFDO1FBRXZELEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxlQUFlLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUMzRSxNQUFNLFNBQVMsR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzFDLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDdEQsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLGVBQWUsQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7U0FDckQ7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNkLENBQUM7SUFFTyxhQUFhLENBQUMsT0FBd0I7UUFDN0MsT0FBTyxJQUFJLFVBQVUsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUVPLGdCQUFnQixDQUFDLE9BQXdCLEVBQUUsSUFBZTtRQUNqRSxJQUFJLE9BQU8sWUFBWSxJQUFJLEVBQUU7WUFDNUIsT0FBTztTQUNQO1FBRUQsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQkFBa0IsSUFBSSxDQUFDLElBQUksV0FBVyxDQUFDLENBQUM7SUFDekQsQ0FBQztDQUVEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVHlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBGb3JtQXJyYXksIEZvcm1Db250cm9sLCBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBDb250cm9sVmlzaXRvciwgQ3VzdG9tQ29udHJvbE1ldGFkYXRhLCBGb3JtQXJyYXlNZXRhZGF0YSwgRm9ybUNvbnRyb2xNZXRhZGF0YSwgRm9ybUdyb3VwTWV0YWRhdGEsIEZvcm1NZXRhZGF0YSB9IGZyb20gJy4uL21ldGFkYXRhJztcbmltcG9ydCB7IEN1c3RvbU1hcHBlclJlc29sdmVyIH0gZnJvbSAnLi9jdXN0b20tbWFwcGVyLXJlc29sdmVyJztcblxuZXhwb3J0IGNsYXNzIEZvcm1SZWFkZXIgaW1wbGVtZW50cyBDb250cm9sVmlzaXRvcjxhbnk+IHtcblxuXHRwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBjb250cm9sOiBBYnN0cmFjdENvbnRyb2wsIHByaXZhdGUgcmVhZG9ubHkgY3VzdG9tTWFwcGVyUmVzb2x2ZXI6IEN1c3RvbU1hcHBlclJlc29sdmVyKSB7fVxuXG5cdHB1YmxpYyB2aXNpdEN1c3RvbUNvbnRyb2xNZXRhZGF0YShjdXN0b21Db250cm9sTWV0YWRhdGE6IEN1c3RvbUNvbnRyb2xNZXRhZGF0YSk6IGFueSB7XG5cdFx0cmV0dXJuIHRoaXMuY3VzdG9tTWFwcGVyUmVzb2x2ZXIucmVzb2x2ZShjdXN0b21Db250cm9sTWV0YWRhdGEubWFwcGVyKS5yZWFkRm9ybSh0aGlzLmNvbnRyb2wpO1xuXHR9XG5cblx0cHVibGljIHZpc2l0Rm9ybUFycmF5TWV0YWRhdGEoZm9ybUFycmF5TWV0YWRhdGE6IEZvcm1BcnJheU1ldGFkYXRhKTogYW55IHtcblx0XHRpZiAoIXRoaXMuY29udHJvbCkge1xuXHRcdFx0cmV0dXJuIHZvaWQoMCk7XG5cdFx0fVxuXG5cdFx0dGhpcy5jaGVja0NvbnRyb2xUeXBlKHRoaXMuY29udHJvbCwgRm9ybUFycmF5KTtcblxuXHRcdHJldHVybiAodGhpcy5jb250cm9sIGFzIEZvcm1BcnJheSkuY29udHJvbHMubWFwKGNvbnRyb2wgPT4ge1xuXHRcdFx0Y29uc3Qgc3ViRm9ybVJlYWRlciA9IHRoaXMuY29weVByb3RvdHlwZShjb250cm9sKTtcblx0XHRcdHJldHVybiBmb3JtQXJyYXlNZXRhZGF0YS5pdGVtRm9ybS5hY2NlcHQoc3ViRm9ybVJlYWRlcik7XG5cdFx0fSk7XG5cdH1cblxuXHRwdWJsaWMgdmlzaXRGb3JtQ29udHJvbE1ldGFkYXRhKGZvcm1Db250cm9sTWV0YWRhdGE6IEZvcm1Db250cm9sTWV0YWRhdGEpOiBhbnkge1xuXHRcdGlmICghdGhpcy5jb250cm9sKSB7XG5cdFx0XHRyZXR1cm4gdm9pZCgwKTtcblx0XHR9XG5cblx0XHR0aGlzLmNoZWNrQ29udHJvbFR5cGUodGhpcy5jb250cm9sLCBGb3JtQ29udHJvbCk7XG5cblx0XHRyZXR1cm4gdGhpcy5jb250cm9sLnZhbHVlO1xuXHR9XG5cblx0cHVibGljIHZpc2l0Rm9ybUdyb3VwTWV0YWRhdGEoZm9ybUdyb3VwTWV0YWRhdGE6IEZvcm1Hcm91cE1ldGFkYXRhKTogYW55IHtcblx0XHRyZXR1cm4gdGhpcy52aXNpdEZvcm1NZXRhZGF0YShmb3JtR3JvdXBNZXRhZGF0YS5mb3JtKTtcblx0fVxuXG5cdHB1YmxpYyB2aXNpdEZvcm1NZXRhZGF0YShmb3JtTWV0YWRhdGE6IEZvcm1NZXRhZGF0YSk6IGFueSB7XG5cdFx0aWYgKCF0aGlzLmNvbnRyb2wpIHtcblx0XHRcdHJldHVybiB2b2lkKDApO1xuXHRcdH1cblxuXHRcdHRoaXMuY2hlY2tDb250cm9sVHlwZSh0aGlzLmNvbnRyb2wsIEZvcm1Hcm91cCk7XG5cblx0XHRjb25zdCB2YWx1ZSA9IG5ldyBmb3JtTWV0YWRhdGEudHlwZSgpO1xuXHRcdGNvbnN0IGZvcm1Hcm91cDogRm9ybUdyb3VwID0gdGhpcy5jb250cm9sIGFzIEZvcm1Hcm91cDtcblxuXHRcdGZvciAoY29uc3QgW2tleSwgY29udHJvbE1ldGFkYXRhXSBvZiBPYmplY3QuZW50cmllcyhmb3JtTWV0YWRhdGEuY29udHJvbHMpKSB7XG5cdFx0XHRjb25zdCBmb3JtRmllbGQgPSBmb3JtR3JvdXAuY29udHJvbHNba2V5XTtcblx0XHRcdGNvbnN0IGZvcm1GaWVsZFJlYWRlciA9IHRoaXMuY29weVByb3RvdHlwZShmb3JtRmllbGQpO1xuXHRcdFx0dmFsdWVba2V5XSA9IGNvbnRyb2xNZXRhZGF0YS5hY2NlcHQoZm9ybUZpZWxkUmVhZGVyKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdmFsdWU7XG5cdH1cblxuXHRwcml2YXRlIGNvcHlQcm90b3R5cGUoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogRm9ybVJlYWRlciB7XG5cdFx0cmV0dXJuIG5ldyBGb3JtUmVhZGVyKGNvbnRyb2wsIHRoaXMuY3VzdG9tTWFwcGVyUmVzb2x2ZXIpO1xuXHR9XG5cblx0cHJpdmF0ZSBjaGVja0NvbnRyb2xUeXBlKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCwgdHlwZTogVHlwZTxhbnk+KTogdm9pZCB7XG5cdFx0aWYgKGNvbnRyb2wgaW5zdGFuY2VvZiB0eXBlKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dGhyb3cgbmV3IEVycm9yKGBjb250cm9sIGlzIG5vdCAke3R5cGUubmFtZX0gaW5zdGFuY2VgKTtcblx0fVxuXG59XG4iXX0=