rx-form-mapper
Version:
Proper decorator-based transformation / serialization / deserialization of plain javascript classes to angular reactive forms
50 lines • 8.92 kB
JavaScript
import { FormArray, FormControl, FormGroup } from '@angular/forms';
export class FormWriter {
constructor(value, customMapperResolver, validatorResolver) {
this.value = value;
this.customMapperResolver = customMapperResolver;
this.validatorResolver = validatorResolver;
}
visitCustomControlMetadata(customControlMetadata) {
const mapper = this.customMapperResolver.resolve(customControlMetadata.mapper);
return mapper.writeForm(this.value, this.buildAbstractControlOptions(customControlMetadata));
}
visitFormArrayMetadata(formArrayMetadata) {
var _a;
const values = (_a = this.value) !== null && _a !== void 0 ? _a : [];
const controls = [];
for (const item of values) {
const subWriter = this.copyPrototype(item);
const control = formArrayMetadata.itemForm.accept(subWriter);
controls.push(control);
}
return new FormArray(controls, this.buildAbstractControlOptions(formArrayMetadata));
}
visitFormControlMetadata(formControlMetadata) {
return new FormControl(this.value, this.buildAbstractControlOptions(formControlMetadata));
}
visitFormGroupMetadata(formGroupMetadata) {
return this.visitFormMetadata(formGroupMetadata.form);
}
visitFormMetadata(formMetadata) {
var _a;
const controls = {};
for (const [key, controlMetadata] of Object.entries(formMetadata.controls)) {
const fieldValue = (_a = this.value) === null || _a === void 0 ? void 0 : _a[key];
const subWriter = this.copyPrototype(fieldValue);
controls[key] = controlMetadata.accept(subWriter);
}
return new FormGroup(controls, this.buildAbstractControlOptions(formMetadata));
}
buildAbstractControlOptions(metadata) {
return {
validators: metadata.validators.map(v => this.validatorResolver.resolve(v)),
asyncValidators: metadata.asyncValidators.map(v => this.validatorResolver.resolve(v)),
updateOn: metadata.updateOn
};
}
copyPrototype(value) {
return new FormWriter(value, this.customMapperResolver, this.validatorResolver);
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS13cml0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yeC1mb3JtLW1hcHBlci9zcmMvbGliL3NlcnZpY2VzL2Zvcm0td3JpdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBMkMsU0FBUyxFQUEwQixXQUFXLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFPcEksTUFBTSxPQUFPLFVBQVU7SUFFdEIsWUFBb0MsS0FBVSxFQUFtQixvQkFBMEMsRUFBbUIsaUJBQW9DO1FBQTlILFVBQUssR0FBTCxLQUFLLENBQUs7UUFBbUIseUJBQW9CLEdBQXBCLG9CQUFvQixDQUFzQjtRQUFtQixzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO0lBQUcsQ0FBQztJQUUvSiwwQkFBMEIsQ0FBQyxxQkFBNEM7UUFDN0UsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMvRSxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsMkJBQTJCLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFBO0lBQzdGLENBQUM7SUFFTSxzQkFBc0IsQ0FBQyxpQkFBb0M7O1FBQ2pFLE1BQU0sTUFBTSxTQUFVLElBQUksQ0FBQyxLQUFLLG1DQUFJLEVBQUUsQ0FBQztRQUN2QyxNQUFNLFFBQVEsR0FBc0IsRUFBRSxDQUFDO1FBRXZDLEtBQUssTUFBTSxJQUFJLElBQUksTUFBTSxFQUFFO1lBQzFCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDM0MsTUFBTSxPQUFPLEdBQUcsaUJBQWlCLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUM3RCxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ3ZCO1FBRUQsT0FBTyxJQUFJLFNBQVMsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLDJCQUEyQixDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztJQUNyRixDQUFDO0lBRU0sd0JBQXdCLENBQUMsbUJBQXdDO1FBQ3ZFLE9BQU8sSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsMkJBQTJCLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDO0lBQzNGLENBQUM7SUFFTSxzQkFBc0IsQ0FBQyxpQkFBb0M7UUFDakUsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVNLGlCQUFpQixDQUFDLFlBQTBCOztRQUNsRCxNQUFNLFFBQVEsR0FBdUMsRUFBRSxDQUFDO1FBRXhELEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxlQUFlLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUMzRSxNQUFNLFVBQVUsU0FBRyxJQUFJLENBQUMsS0FBSywwQ0FBRyxHQUFHLENBQUMsQ0FBQztZQUNyQyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ2pELFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxlQUFlLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1NBQ2xEO1FBRUQsT0FBTyxJQUFJLFNBQVMsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLDJCQUEyQixDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7SUFDaEYsQ0FBQztJQUdPLDJCQUEyQixDQUFDLFFBQTJCO1FBQzlELE9BQU87WUFDTixVQUFVLEVBQUUsUUFBUSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzNFLGVBQWUsRUFBRSxRQUFRLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDckYsUUFBUSxFQUFFLFFBQVEsQ0FBQyxRQUFRO1NBQzNCLENBQUM7SUFDSCxDQUFDO0lBRU8sYUFBYSxDQUFDLEtBQVU7UUFDL0IsT0FBTyxJQUFJLFVBQVUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLG9CQUFvQixFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQ2pGLENBQUM7Q0FFRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdEZsYWdzLCBJbmplY3RvciwgVHlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBBYnN0cmFjdENvbnRyb2xPcHRpb25zLCBGb3JtQXJyYXksIFZhbGlkYXRvciwgVmFsaWRhdG9yRm4sIEZvcm1Db250cm9sLCBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7IEN1c3RvbUNvbnRyb2xNYXBwZXIgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IENvbnRyb2xWaXNpdG9yLCBDdXN0b21Db250cm9sTWV0YWRhdGEsIEZvcm1BcnJheU1ldGFkYXRhLCBGb3JtQ29udHJvbE1ldGFkYXRhLCBGb3JtR3JvdXBNZXRhZGF0YSwgRm9ybU1ldGFkYXRhLCBWYWxpZGFibGVNZXRhZGF0YSB9IGZyb20gJy4uL21ldGFkYXRhJztcbmltcG9ydCB7IEN1c3RvbU1hcHBlclJlc29sdmVyIH0gZnJvbSAnLi9jdXN0b20tbWFwcGVyLXJlc29sdmVyJztcbmltcG9ydCB7IFZhbGlkYXRvclJlc29sdmVyIH0gZnJvbSAnLi92YWxpZGF0b3ItcmVzb2x2ZXInO1xuXG5leHBvcnQgY2xhc3MgRm9ybVdyaXRlciBpbXBsZW1lbnRzIENvbnRyb2xWaXNpdG9yPEFic3RyYWN0Q29udHJvbD4ge1xuXG5cdHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHZhbHVlOiBhbnksIHByaXZhdGUgcmVhZG9ubHkgY3VzdG9tTWFwcGVyUmVzb2x2ZXI6IEN1c3RvbU1hcHBlclJlc29sdmVyLCBwcml2YXRlIHJlYWRvbmx5IHZhbGlkYXRvclJlc29sdmVyOiBWYWxpZGF0b3JSZXNvbHZlcikge31cblxuXHRwdWJsaWMgdmlzaXRDdXN0b21Db250cm9sTWV0YWRhdGEoY3VzdG9tQ29udHJvbE1ldGFkYXRhOiBDdXN0b21Db250cm9sTWV0YWRhdGEpOiBBYnN0cmFjdENvbnRyb2wge1xuXHRcdGNvbnN0IG1hcHBlciA9IHRoaXMuY3VzdG9tTWFwcGVyUmVzb2x2ZXIucmVzb2x2ZShjdXN0b21Db250cm9sTWV0YWRhdGEubWFwcGVyKTtcblx0XHRyZXR1cm4gbWFwcGVyLndyaXRlRm9ybSh0aGlzLnZhbHVlLCB0aGlzLmJ1aWxkQWJzdHJhY3RDb250cm9sT3B0aW9ucyhjdXN0b21Db250cm9sTWV0YWRhdGEpKVxuXHR9XG5cblx0cHVibGljIHZpc2l0Rm9ybUFycmF5TWV0YWRhdGEoZm9ybUFycmF5TWV0YWRhdGE6IEZvcm1BcnJheU1ldGFkYXRhKTogQWJzdHJhY3RDb250cm9sIHtcblx0XHRjb25zdCB2YWx1ZXM6IGFueVtdID0gdGhpcy52YWx1ZSA/PyBbXTtcblx0XHRjb25zdCBjb250cm9sczogQWJzdHJhY3RDb250cm9sW10gPSBbXTtcblxuXHRcdGZvciAoY29uc3QgaXRlbSBvZiB2YWx1ZXMpIHtcblx0XHRcdGNvbnN0IHN1YldyaXRlciA9IHRoaXMuY29weVByb3RvdHlwZShpdGVtKTtcblx0XHRcdGNvbnN0IGNvbnRyb2wgPSBmb3JtQXJyYXlNZXRhZGF0YS5pdGVtRm9ybS5hY2NlcHQoc3ViV3JpdGVyKTtcblx0XHRcdGNvbnRyb2xzLnB1c2goY29udHJvbCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG5ldyBGb3JtQXJyYXkoY29udHJvbHMsIHRoaXMuYnVpbGRBYnN0cmFjdENvbnRyb2xPcHRpb25zKGZvcm1BcnJheU1ldGFkYXRhKSk7XG5cdH1cblxuXHRwdWJsaWMgdmlzaXRGb3JtQ29udHJvbE1ldGFkYXRhKGZvcm1Db250cm9sTWV0YWRhdGE6IEZvcm1Db250cm9sTWV0YWRhdGEpOiBBYnN0cmFjdENvbnRyb2wge1xuXHRcdHJldHVybiBuZXcgRm9ybUNvbnRyb2wodGhpcy52YWx1ZSwgdGhpcy5idWlsZEFic3RyYWN0Q29udHJvbE9wdGlvbnMoZm9ybUNvbnRyb2xNZXRhZGF0YSkpO1xuXHR9XG5cblx0cHVibGljIHZpc2l0Rm9ybUdyb3VwTWV0YWRhdGEoZm9ybUdyb3VwTWV0YWRhdGE6IEZvcm1Hcm91cE1ldGFkYXRhKTogQWJzdHJhY3RDb250cm9sIHtcblx0XHRyZXR1cm4gdGhpcy52aXNpdEZvcm1NZXRhZGF0YShmb3JtR3JvdXBNZXRhZGF0YS5mb3JtKTtcblx0fVxuXG5cdHB1YmxpYyB2aXNpdEZvcm1NZXRhZGF0YShmb3JtTWV0YWRhdGE6IEZvcm1NZXRhZGF0YSk6IEFic3RyYWN0Q29udHJvbCB7XG5cdFx0Y29uc3QgY29udHJvbHM6IHsgW2tleTogc3RyaW5nXTogQWJzdHJhY3RDb250cm9sIH0gPSB7fTtcblxuXHRcdGZvciAoY29uc3QgW2tleSwgY29udHJvbE1ldGFkYXRhXSBvZiBPYmplY3QuZW50cmllcyhmb3JtTWV0YWRhdGEuY29udHJvbHMpKSB7XG5cdFx0XHRjb25zdCBmaWVsZFZhbHVlID0gdGhpcy52YWx1ZT8uW2tleV07XG5cdFx0XHRjb25zdCBzdWJXcml0ZXIgPSB0aGlzLmNvcHlQcm90b3R5cGUoZmllbGRWYWx1ZSk7XG5cdFx0XHRjb250cm9sc1trZXldID0gY29udHJvbE1ldGFkYXRhLmFjY2VwdChzdWJXcml0ZXIpO1xuXHRcdH1cblxuXHRcdHJldHVybiBuZXcgRm9ybUdyb3VwKGNvbnRyb2xzLCB0aGlzLmJ1aWxkQWJzdHJhY3RDb250cm9sT3B0aW9ucyhmb3JtTWV0YWRhdGEpKTtcblx0fVxuXG5cblx0cHJpdmF0ZSBidWlsZEFic3RyYWN0Q29udHJvbE9wdGlvbnMobWV0YWRhdGE6IFZhbGlkYWJsZU1ldGFkYXRhKTogQWJzdHJhY3RDb250cm9sT3B0aW9ucyB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHZhbGlkYXRvcnM6IG1ldGFkYXRhLnZhbGlkYXRvcnMubWFwKHYgPT4gdGhpcy52YWxpZGF0b3JSZXNvbHZlci5yZXNvbHZlKHYpKSxcblx0XHRcdGFzeW5jVmFsaWRhdG9yczogbWV0YWRhdGEuYXN5bmNWYWxpZGF0b3JzLm1hcCh2ID0+IHRoaXMudmFsaWRhdG9yUmVzb2x2ZXIucmVzb2x2ZSh2KSksXG5cdFx0XHR1cGRhdGVPbjogbWV0YWRhdGEudXBkYXRlT25cblx0XHR9O1xuXHR9XG5cblx0cHJpdmF0ZSBjb3B5UHJvdG90eXBlKHZhbHVlOiBhbnkpOiBGb3JtV3JpdGVyIHtcblx0XHRyZXR1cm4gbmV3IEZvcm1Xcml0ZXIodmFsdWUsIHRoaXMuY3VzdG9tTWFwcGVyUmVzb2x2ZXIsIHRoaXMudmFsaWRhdG9yUmVzb2x2ZXIpO1xuXHR9XG5cbn1cbiJdfQ==