rx-form-mapper
Version:
Proper decorator-based transformation / serialization / deserialization of plain javascript classes to angular reactive forms
43 lines • 6.41 kB
JavaScript
import { Injectable } from '@angular/core';
import { isNil } from 'lodash';
import { ModelBinder } from '../bind';
import { CustomMapperResolver } from './custom-mapper-resolver';
import { FormReader } from './form-reader';
import { FormWriter } from './form-writer';
import { ValidatorResolver } from './validator-resolver';
export class RxFormMapper {
constructor(customMapperResolver, validatorResolver) {
this.customMapperResolver = customMapperResolver;
this.validatorResolver = validatorResolver;
}
fromType(type) {
if (isNil(type)) {
throw new Error('type cannot be inferred implicitly');
}
const formWriter = new FormWriter(void (0), this.customMapperResolver, this.validatorResolver);
return ModelBinder.instance.getMetadata(type).accept(formWriter);
}
writeForm(value, type) {
if (isNil(value) && isNil(type)) {
throw new Error('type cannot be inferred implicitly');
}
const valueType = type !== null && type !== void 0 ? type : Object.getPrototypeOf(value).constructor;
const formWriter = new FormWriter(value, this.customMapperResolver, this.validatorResolver);
return ModelBinder.instance.getMetadata(valueType).accept(formWriter);
}
readForm(form, type) {
if (isNil(type)) {
throw new Error('type cannot be inferred implicitly');
}
const formReader = new FormReader(form, this.customMapperResolver);
return ModelBinder.instance.getMetadata(type).accept(formReader);
}
}
RxFormMapper.decorators = [
{ type: Injectable }
];
RxFormMapper.ctorParameters = () => [
{ type: CustomMapperResolver },
{ type: ValidatorResolver }
];
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicngtZm9ybS1tYXBwZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3J4LWZvcm0tbWFwcGVyL3NyYy9saWIvc2VydmljZXMvcngtZm9ybS1tYXBwZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFrQixNQUFNLGVBQWUsQ0FBQztBQUUzRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDdEMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDaEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBR3pELE1BQU0sT0FBTyxZQUFZO0lBQ3hCLFlBQ2tCLG9CQUEwQyxFQUMxQyxpQkFBb0M7UUFEcEMseUJBQW9CLEdBQXBCLG9CQUFvQixDQUFzQjtRQUMxQyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO0lBQ25ELENBQUM7SUFFRyxRQUFRLENBQUksSUFBYTtRQUMvQixJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNoQixNQUFNLElBQUksS0FBSyxDQUFDLG9DQUFvQyxDQUFDLENBQUM7U0FDdEQ7UUFFRCxNQUFNLFVBQVUsR0FBRyxJQUFJLFVBQVUsQ0FBQyxLQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLG9CQUFvQixFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQzlGLE9BQU8sV0FBVyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBYyxDQUFDO0lBQy9FLENBQUM7SUFJTSxTQUFTLENBQUksS0FBUSxFQUFFLElBQWM7UUFDM0MsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ2hDLE1BQU0sSUFBSSxLQUFLLENBQUMsb0NBQW9DLENBQUMsQ0FBQztTQUN0RDtRQUVELE1BQU0sU0FBUyxHQUFHLElBQUksYUFBSixJQUFJLGNBQUosSUFBSSxHQUFJLE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsV0FBVyxDQUFDO1FBQ25FLE1BQU0sVUFBVSxHQUFHLElBQUksVUFBVSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDNUYsT0FBTyxXQUFXLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFjLENBQUM7SUFFcEYsQ0FBQztJQUVNLFFBQVEsQ0FBSSxJQUFlLEVBQUUsSUFBYTtRQUNoRCxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNoQixNQUFNLElBQUksS0FBSyxDQUFDLG9DQUFvQyxDQUFDLENBQUM7U0FDdEQ7UUFFRCxNQUFNLFVBQVUsR0FBRyxJQUFJLFVBQVUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDbkUsT0FBTyxXQUFXLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDbEUsQ0FBQzs7O1lBcENELFVBQVU7OztZQUxGLG9CQUFvQjtZQUdwQixpQkFBaUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3RvciwgVHlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgaXNOaWwgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgTW9kZWxCaW5kZXIgfSBmcm9tICcuLi9iaW5kJztcbmltcG9ydCB7IEN1c3RvbU1hcHBlclJlc29sdmVyIH0gZnJvbSAnLi9jdXN0b20tbWFwcGVyLXJlc29sdmVyJztcbmltcG9ydCB7IEZvcm1SZWFkZXIgfSBmcm9tICcuL2Zvcm0tcmVhZGVyJztcbmltcG9ydCB7IEZvcm1Xcml0ZXIgfSBmcm9tICcuL2Zvcm0td3JpdGVyJztcbmltcG9ydCB7IFZhbGlkYXRvclJlc29sdmVyIH0gZnJvbSAnLi92YWxpZGF0b3ItcmVzb2x2ZXInO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgUnhGb3JtTWFwcGVyIHtcblx0cHVibGljIGNvbnN0cnVjdG9yKFxuXHRcdHByaXZhdGUgcmVhZG9ubHkgY3VzdG9tTWFwcGVyUmVzb2x2ZXI6IEN1c3RvbU1hcHBlclJlc29sdmVyLFxuXHRcdHByaXZhdGUgcmVhZG9ubHkgdmFsaWRhdG9yUmVzb2x2ZXI6IFZhbGlkYXRvclJlc29sdmVyXG5cdCkge31cblxuXHRwdWJsaWMgZnJvbVR5cGU8VD4odHlwZTogVHlwZTxUPik6IEZvcm1Hcm91cCB7XG5cdFx0aWYgKGlzTmlsKHR5cGUpKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ3R5cGUgY2Fubm90IGJlIGluZmVycmVkIGltcGxpY2l0bHknKTtcblx0XHR9XG5cblx0XHRjb25zdCBmb3JtV3JpdGVyID0gbmV3IEZvcm1Xcml0ZXIodm9pZCgwKSwgdGhpcy5jdXN0b21NYXBwZXJSZXNvbHZlciwgdGhpcy52YWxpZGF0b3JSZXNvbHZlcik7XG5cdFx0cmV0dXJuIE1vZGVsQmluZGVyLmluc3RhbmNlLmdldE1ldGFkYXRhKHR5cGUpLmFjY2VwdChmb3JtV3JpdGVyKSBhcyBGb3JtR3JvdXA7XG5cdH1cblxuXHRwdWJsaWMgd3JpdGVGb3JtPFQ+KHZhbHVlOiBUKTogRm9ybUdyb3VwO1xuXHRwdWJsaWMgd3JpdGVGb3JtPFQ+KHZhbHVlOiBULCB0eXBlOiBUeXBlPFQ+KTogRm9ybUdyb3VwO1xuXHRwdWJsaWMgd3JpdGVGb3JtPFQ+KHZhbHVlOiBULCB0eXBlPzogVHlwZTxUPik6IEZvcm1Hcm91cCB7XG5cdFx0aWYgKGlzTmlsKHZhbHVlKSAmJiBpc05pbCh0eXBlKSkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCd0eXBlIGNhbm5vdCBiZSBpbmZlcnJlZCBpbXBsaWNpdGx5Jyk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgdmFsdWVUeXBlID0gdHlwZSA/PyBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpLmNvbnN0cnVjdG9yO1xuXHRcdGNvbnN0IGZvcm1Xcml0ZXIgPSBuZXcgRm9ybVdyaXRlcih2YWx1ZSwgdGhpcy5jdXN0b21NYXBwZXJSZXNvbHZlciwgdGhpcy52YWxpZGF0b3JSZXNvbHZlcik7XG5cdFx0cmV0dXJuIE1vZGVsQmluZGVyLmluc3RhbmNlLmdldE1ldGFkYXRhKHZhbHVlVHlwZSkuYWNjZXB0KGZvcm1Xcml0ZXIpIGFzIEZvcm1Hcm91cDtcblxuXHR9XG5cblx0cHVibGljIHJlYWRGb3JtPFQ+KGZvcm06IEZvcm1Hcm91cCwgdHlwZTogVHlwZTxUPiApOiBUIHtcblx0XHRpZiAoaXNOaWwodHlwZSkpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcigndHlwZSBjYW5ub3QgYmUgaW5mZXJyZWQgaW1wbGljaXRseScpO1xuXHRcdH1cblxuXHRcdGNvbnN0IGZvcm1SZWFkZXIgPSBuZXcgRm9ybVJlYWRlcihmb3JtLCB0aGlzLmN1c3RvbU1hcHBlclJlc29sdmVyKTtcblx0XHRyZXR1cm4gTW9kZWxCaW5kZXIuaW5zdGFuY2UuZ2V0TWV0YWRhdGEodHlwZSkuYWNjZXB0KGZvcm1SZWFkZXIpO1xuXHR9XG59XG4iXX0=