angular-typesafe-reactive-forms-helper
Version:
Use angular reactive forms with type-safety.
44 lines • 9.22 kB
JavaScript
import { Injectable } from '@angular/core';
import { FormBuilder } from '@angular/forms';
import { getPropertyName } from './getPropertyName';
export const generateGetSafeFunction = (gr) => {
return (propertyFunction) => {
const getStr = getPropertyName(propertyFunction.toString());
const p = gr.get(getStr);
return p;
};
};
export const generateSetControlSafeFunction = (gr) => {
return (propertyFunction, control) => {
const getStr = getPropertyName(propertyFunction.toString());
gr.setControl(getStr, control);
};
};
export const generateRemoveControlSafeFunction = (gr) => {
return (propertyFunction) => {
const getStr = getPropertyName(propertyFunction.toString());
gr.removeControl(getStr);
};
};
// tslint:disable-next-line: max-classes-per-file
export class FormBuilderTypeSafe extends FormBuilder {
// override group to be type safe
group(controlsConfig, options) {
/* NOTE the return FormGroupTypeSafe<T> */
// instantiate group from angular type
const gr = super.group(controlsConfig, options);
if (gr) {
// implement getSafe method
gr.getSafe = generateGetSafeFunction(gr);
// implement setControlSafe
gr.setControlSafe = generateSetControlSafeFunction(gr);
// implement removeControlSafe
gr.removeControlSafe = generateRemoveControlSafeFunction(gr);
}
return gr;
}
}
FormBuilderTypeSafe.decorators = [
{ type: Injectable }
];
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhclR5cGVzYWZlUmVhY3RpdmVGb3Jtc0hlbHBlci5qcyIsInNvdXJjZVJvb3QiOiIvaG9tZS9ydW5uZXIvd29yay9hbmd1bGFyLXR5cGVzYWZlLXJlYWN0aXZlLWZvcm1zLWhlbHBlci9hbmd1bGFyLXR5cGVzYWZlLXJlYWN0aXZlLWZvcm1zLWhlbHBlci8iLCJzb3VyY2VzIjpbInNyYy9hbmd1bGFyVHlwZXNhZmVSZWFjdGl2ZUZvcm1zSGVscGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFtQixXQUFXLEVBQTZELE1BQU0sZ0JBQWdCLENBQUM7QUFFekgsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBeURwRCxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxDQUFvQixFQUF3QixFQUFFLEVBQUU7SUFDckYsT0FBTyxDQUFDLGdCQUFxQyxFQUFtQixFQUFFO1FBQ2hFLE1BQU0sTUFBTSxHQUFHLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQzVELE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUF5QixDQUFDO1FBQ2pELE9BQU8sQ0FBQyxDQUFDO0lBQ1gsQ0FBQyxDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sOEJBQThCLEdBQUcsQ0FBb0IsRUFBd0IsRUFBRSxFQUFFO0lBQzVGLE9BQU8sQ0FBQyxnQkFBcUMsRUFBRSxPQUF3QixFQUFRLEVBQUU7UUFDL0UsTUFBTSxNQUFNLEdBQUcsZUFBZSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDNUQsRUFBRSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDakMsQ0FBQyxDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBR0YsTUFBTSxDQUFDLE1BQU0saUNBQWlDLEdBQUcsQ0FBb0IsRUFBd0IsRUFBRSxFQUFFO0lBQy9GLE9BQU8sQ0FBQyxnQkFBcUMsRUFBUSxFQUFFO1FBQ3JELE1BQU0sTUFBTSxHQUFHLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQzVELEVBQUUsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDM0IsQ0FBQyxDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBRUYsaURBQWlEO0FBRWpELE1BQU0sT0FBTyxtQkFBb0IsU0FBUSxXQUFXO0lBQ2xELGlDQUFpQztJQUMxQixLQUFLLENBQ1YsY0FBc0MsRUFDdEMsT0FFTTtRQUNOLDBDQUEwQztRQUUxQyxzQ0FBc0M7UUFDdEMsTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsT0FBTyxDQUF5QixDQUFDO1FBRXhFLElBQUksRUFBRSxFQUFFO1lBQ04sMkJBQTJCO1lBQzNCLEVBQUUsQ0FBQyxPQUFPLEdBQUcsdUJBQXVCLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDekMsMkJBQTJCO1lBQzNCLEVBQUUsQ0FBQyxjQUFjLEdBQUcsOEJBQThCLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDdkQsOEJBQThCO1lBQzlCLEVBQUUsQ0FBQyxpQkFBaUIsR0FBRyxpQ0FBaUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUM5RDtRQUVELE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQzs7O1lBdkJGLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIEZvcm1CdWlsZGVyLCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBBYnN0cmFjdENvbnRyb2xPcHRpb25zLCBGb3JtQXJyYXkgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBnZXRQcm9wZXJ0eU5hbWUgfSBmcm9tICcuL2dldFByb3BlcnR5TmFtZSc7XG5cbmV4cG9ydCB0eXBlIFJlY3Vyc2l2ZVBhcnRpYWw8VD4gPSB7XG4gIFtQIGluIGtleW9mIFRdPzogUmVjdXJzaXZlUGFydGlhbDxUW1BdPjtcbn07XG5cbmV4cG9ydCB0eXBlIEZvcm1Hcm91cENvbnRyb2xzT2Y8VD4gPSB7XG4gIFtQIGluIGtleW9mIFRdOiBGb3JtQ29udHJvbCB8IEZvcm1Hcm91cCB8IEZvcm1BcnJheTtcbn07XG5cbmV4cG9ydCB0eXBlIENvbnRyb2xTdGF0dXMgPSAnVkFMSUQnIHwgJ0lOVkFMSUQnIHwgJ1BFTkRJTkcnIHwgJ0RJU0FCTEVEJztcblxuZXhwb3J0IGludGVyZmFjZSBBYnN0cmFjdENvbnRyb2xUeXBlU2FmZTxUPiBleHRlbmRzIEFic3RyYWN0Q29udHJvbCB7XG4gIC8vIGNvbW1vbiBwcm9wZXJ0aWVzIHRvIEZvcm1Hcm91cCwgRm9ybUNvbnRyb2wgYW5kIEZvcm1BcnJheVxuICByZWFkb25seSB2YWx1ZTogVDtcbiAgcmVhZG9ubHkgdmFsdWVDaGFuZ2VzOiBPYnNlcnZhYmxlPFQ+O1xuXG4gIC8qXG4gICAgQW5ndWxhciBgZ2V0YCBzaWduYXR1cmU6XG4gICAgICBnZXQocGF0aDogQXJyYXk8c3RyaW5nIHwgbnVtYmVyPiB8IHN0cmluZyk6IEFic3RyYWN0Q29udHJvbCB8IG51bGw7XG4gICAgXG4gICAgICBzcGxpdCBpbnRvIHR3byBnZXQgbWV0aG9kc1xuICAqL1xuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IGFycmF5LXR5cGVcbiAgZ2V0KHBhdGg6IEFycmF5PHN0cmluZz4gfCBzdHJpbmcpOiBBYnN0cmFjdENvbnRyb2wgfCBudWxsOyBcbiAgZ2V0KHBhdGg6IG51bWJlcltdKTogQWJzdHJhY3RDb250cm9sVHlwZVNhZmU8VCBleHRlbmRzIChpbmZlciBSKVtdID8gUiA6IFQ+IHwgbnVsbDtcbiAgcmVhZG9ubHkgc3RhdHVzQ2hhbmdlczogT2JzZXJ2YWJsZTxDb250cm9sU3RhdHVzPjtcbn1cblxuLy8gdGhlIGlkZWEgaXMgdG8gdXNlIEFuZ3VsYXIncyBGb3JtR3JvdXAgZXhhY3RseSBhcyBpcyBidXQganVzdCBzcHJpbmtsZSBhIGJpdCBvZiB0eXBlLXNhZmV0eSBpbi1iZXR3ZWVuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1Hcm91cFR5cGVTYWZlPFQ+IGV4dGVuZHMgRm9ybUdyb3VwIHtcbiAgcmVhZG9ubHkgdmFsdWU6IFQ7XG4gIHJlYWRvbmx5IHZhbHVlQ2hhbmdlczogT2JzZXJ2YWJsZTxUPjtcblxuICAvKiAtLS0tLSBuZXcgZnVuY3Rpb25zIGFkZGVkIG5vdCBwYXJ0IG9mIEZvcm1Hcm91cCAgLS0tLS0gKi9cbiAgLy8gY3JlYXRlIGhlbHBlciBtZXRob2RzIHRvIGFjaGlldmUgdGhpcyBzeW50YXhcbiAgLy8gIGVnOiB0aGlzLmZvcm0uZ2V0U2FmZSh4ID0+IHguaGVyb05hbWUpLnBhdGNoVmFsdWUoJ0hlLU1hbicpXG4gIGdldFNhZmU8UD4ocHJvcGVydHlGdW5jdGlvbjogKHR5cGVWYWw6IFQpID0+IFApOiBBYnN0cmFjdENvbnRyb2xUeXBlU2FmZTxQPiB8IG51bGw7XG4gIC8vIGVnOiB0aGlzLmZvcm0uc2V0Q29udHJvbFNhZmUoeCA9PiB4Lm5hbWUsIG5ldyBGb3JtQ29udHJvbCgnSHVsaycpKTtcbiAgc2V0Q29udHJvbFNhZmUocHJvcGVydHlGdW5jdGlvbjogKHR5cGVWYWw6IFQpID0+IGFueSwgY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogdm9pZDtcbiAgcmVtb3ZlQ29udHJvbFNhZmUocHJvcGVydHlGdW5jdGlvbjogKHR5cGVWYWw6IFQpID0+IGFueSk6IHZvaWQ7XG4gIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbiAgc2V0VmFsdWUodmFsdWU6IFQsIG9wdGlvbnM/OiB7IG9ubHlTZWxmPzogYm9vbGVhbjsgZW1pdEV2ZW50PzogYm9vbGVhbiB9KTogdm9pZDtcblxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6YmFuLXR5cGVzXG4gIHBhdGNoVmFsdWUodmFsdWU6IFJlY3Vyc2l2ZVBhcnRpYWw8VD4sIG9wdGlvbnM/OiBPYmplY3QpOiB2b2lkO1xuICByZWFkb25seSBzdGF0dXM6IENvbnRyb2xTdGF0dXM7XG4gIHJlYWRvbmx5IHN0YXR1c0NoYW5nZXM6IE9ic2VydmFibGU8Q29udHJvbFN0YXR1cz47XG4gIGNvbnRyb2xzOiB7IFtQIGluIGtleW9mIFRdOiBBYnN0cmFjdENvbnRyb2xUeXBlU2FmZTxUW1BdPiB9O1xufVxuXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWNsYXNzZXMtcGVyLWZpbGVcbmV4cG9ydCBpbnRlcmZhY2UgRm9ybUNvbnRyb2xUeXBlU2FmZTxUPiBleHRlbmRzIEZvcm1Db250cm9sIHtcbiAgdmFsdWU6IFQgfCB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBjb25zdCBnZW5lcmF0ZUdldFNhZmVGdW5jdGlvbiA9IDxUIGV4dGVuZHMgdW5rbm93bj4oZ3I6IEZvcm1Hcm91cFR5cGVTYWZlPFQ+KSA9PiB7XG4gIHJldHVybiAocHJvcGVydHlGdW5jdGlvbjogKHR5cGVWYWw6IFQpID0+IGFueSk6IEFic3RyYWN0Q29udHJvbCA9PiB7XG4gICAgY29uc3QgZ2V0U3RyID0gZ2V0UHJvcGVydHlOYW1lKHByb3BlcnR5RnVuY3Rpb24udG9TdHJpbmcoKSk7XG4gICAgY29uc3QgcCA9IGdyLmdldChnZXRTdHIpIGFzIEZvcm1Hcm91cFR5cGVTYWZlPFQ+O1xuICAgIHJldHVybiBwO1xuICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IGdlbmVyYXRlU2V0Q29udHJvbFNhZmVGdW5jdGlvbiA9IDxUIGV4dGVuZHMgdW5rbm93bj4oZ3I6IEZvcm1Hcm91cFR5cGVTYWZlPFQ+KSA9PiB7XG4gIHJldHVybiAocHJvcGVydHlGdW5jdGlvbjogKHR5cGVWYWw6IFQpID0+IGFueSwgY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogdm9pZCA9PiB7XG4gICAgY29uc3QgZ2V0U3RyID0gZ2V0UHJvcGVydHlOYW1lKHByb3BlcnR5RnVuY3Rpb24udG9TdHJpbmcoKSk7XG4gICAgZ3Iuc2V0Q29udHJvbChnZXRTdHIsIGNvbnRyb2wpO1xuICB9O1xufTtcblxuXG5leHBvcnQgY29uc3QgZ2VuZXJhdGVSZW1vdmVDb250cm9sU2FmZUZ1bmN0aW9uID0gPFQgZXh0ZW5kcyB1bmtub3duPihncjogRm9ybUdyb3VwVHlwZVNhZmU8VD4pID0+IHtcbiAgcmV0dXJuIChwcm9wZXJ0eUZ1bmN0aW9uOiAodHlwZVZhbDogVCkgPT4gYW55KTogdm9pZCA9PiB7XG4gICAgY29uc3QgZ2V0U3RyID0gZ2V0UHJvcGVydHlOYW1lKHByb3BlcnR5RnVuY3Rpb24udG9TdHJpbmcoKSk7XG4gICAgZ3IucmVtb3ZlQ29udHJvbChnZXRTdHIpO1xuICB9O1xufTtcblxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtYXgtY2xhc3Nlcy1wZXItZmlsZVxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEZvcm1CdWlsZGVyVHlwZVNhZmUgZXh0ZW5kcyBGb3JtQnVpbGRlciB7XG4gIC8vIG92ZXJyaWRlIGdyb3VwIHRvIGJlIHR5cGUgc2FmZVxuICBwdWJsaWMgZ3JvdXA8VD4oXG4gICAgY29udHJvbHNDb25maWc6IEZvcm1Hcm91cENvbnRyb2xzT2Y8VD4sXG4gICAgb3B0aW9ucz86IEFic3RyYWN0Q29udHJvbE9wdGlvbnMgfCB7XG4gICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gIH0gfCBudWxsKTogRm9ybUdyb3VwVHlwZVNhZmU8VD4ge1xuICAgIC8qIE5PVEUgdGhlIHJldHVybiBGb3JtR3JvdXBUeXBlU2FmZTxUPiAqL1xuXG4gICAgLy8gaW5zdGFudGlhdGUgZ3JvdXAgZnJvbSBhbmd1bGFyIHR5cGVcbiAgICBjb25zdCBnciA9IHN1cGVyLmdyb3VwKGNvbnRyb2xzQ29uZmlnLCBvcHRpb25zKSBhcyBGb3JtR3JvdXBUeXBlU2FmZTxUPjtcblxuICAgIGlmIChncikge1xuICAgICAgLy8gaW1wbGVtZW50IGdldFNhZmUgbWV0aG9kXG4gICAgICBnci5nZXRTYWZlID0gZ2VuZXJhdGVHZXRTYWZlRnVuY3Rpb24oZ3IpO1xuICAgICAgLy8gaW1wbGVtZW50IHNldENvbnRyb2xTYWZlXG4gICAgICBnci5zZXRDb250cm9sU2FmZSA9IGdlbmVyYXRlU2V0Q29udHJvbFNhZmVGdW5jdGlvbihncik7XG4gICAgICAvLyBpbXBsZW1lbnQgcmVtb3ZlQ29udHJvbFNhZmVcbiAgICAgIGdyLnJlbW92ZUNvbnRyb2xTYWZlID0gZ2VuZXJhdGVSZW1vdmVDb250cm9sU2FmZUZ1bmN0aW9uKGdyKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZ3I7XG4gIH1cbn1cbiJdfQ==