ngx-forms-builder
Version:
A small library that adds validation with decorators and build angular forms.
102 lines • 7.73 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import 'reflect-metadata';
import { Injectable } from '@angular/core';
import { FormGroup, FormControl, Validators } from '@angular/forms';
/**
* @template T
*/
export class ModelFormBuilder {
/**
* @param {?} target
* @param {?=} options
* @return {?}
*/
build(target, options) {
/** @type {?} */
const fg = new FormGroup({}, options);
for (const propertyKey of Object.keys(target)) {
/** @type {?} */
const decorators = Reflect.getMetadataKeys(target, propertyKey);
if (decorators.indexOf('exclude') > 0) {
continue;
}
fg.addControl(propertyKey, new FormControl(target[propertyKey]));
/** @type {?} */
const validators = [];
decorators
.filter((/**
* @param {?} x
* @return {?}
*/
x => x !== 'design:type'))
.forEach((/**
* @param {?} decorator
* @return {?}
*/
(decorator) => {
/** @type {?} */
const validator = this.getValidatorByType(decorator, target, propertyKey);
if (validator !== null) {
validators.push(validator);
}
}));
fg.get(propertyKey).setValidators(validators);
}
return fg;
}
/**
* @param {?} metadataKey
* @param {?} target
* @param {?} propertyKey
* @return {?}
*/
getValidatorByType(metadataKey, target, propertyKey) {
/** @type {?} */
const validatorsType = {
required: (/**
* @param {?} _
* @return {?}
*/
_ => Validators.required),
email: (/**
* @param {?} _
* @return {?}
*/
_ => Validators.email),
min: (/**
* @param {?} min
* @return {?}
*/
(min) => Validators.min(min)),
max: (/**
* @param {?} max
* @return {?}
*/
(max) => Validators.max(max)),
pattern: (/**
* @param {?} pattern
* @return {?}
*/
(pattern) => Validators.pattern(pattern)),
customValidator: (/**
* @param {?} custom
* @return {?}
*/
(custom) => custom)
};
/** @type {?} */
const metadataValue = Reflect.getMetadata(metadataKey, target, propertyKey);
return validatorsType[metadataKey](metadataValue);
}
}
ModelFormBuilder.decorators = [
{ type: Injectable }
];
/**
* @record
*/
function ValidatorsType() { }
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwtZm9ybS1idWlsZGVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtZm9ybXMtYnVpbGRlci8iLCJzb3VyY2VzIjpbImxpYi9zZXJ2aWNlcy9tb2RlbC1mb3JtLWJ1aWxkZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBdUMsTUFBTSxnQkFBZ0IsQ0FBQzs7OztBQUd6RyxNQUFNLE9BQU8sZ0JBQWdCOzs7Ozs7SUFFcEIsS0FBSyxDQUFDLE1BQVMsRUFBRSxPQUF1Qzs7Y0FDdkQsRUFBRSxHQUFHLElBQUksU0FBUyxDQUFDLEVBQUUsRUFBRSxPQUFPLENBQUM7UUFFckMsS0FBSyxNQUFNLFdBQVcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFOztrQkFFdkMsVUFBVSxHQUFHLE9BQU8sQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQztZQUMvRCxJQUFJLFVBQVUsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUNyQyxTQUFTO2FBQ1Y7WUFFRCxFQUFFLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRSxJQUFJLFdBQVcsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDOztrQkFDM0QsVUFBVSxHQUFrQixFQUFFO1lBRXBDLFVBQVU7aUJBQ1AsTUFBTTs7OztZQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLGFBQWEsRUFBQztpQkFDaEMsT0FBTzs7OztZQUFDLENBQUMsU0FBUyxFQUFFLEVBQUU7O3NCQUNmLFNBQVMsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxXQUFXLENBQUM7Z0JBQ3pFLElBQUksU0FBUyxLQUFLLElBQUksRUFBRTtvQkFDdEIsVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztpQkFDNUI7WUFDSCxDQUFDLEVBQUMsQ0FBQztZQUVMLEVBQUUsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1NBQy9DO1FBRUQsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDOzs7Ozs7O0lBRUQsa0JBQWtCLENBQUMsV0FBbUIsRUFBRSxNQUFTLEVBQUUsV0FBNEI7O2NBRXZFLGNBQWMsR0FBbUI7WUFDckMsUUFBUTs7OztZQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQTtZQUNsQyxLQUFLOzs7O1lBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFBO1lBQzVCLEdBQUc7Ozs7WUFBRSxDQUFDLEdBQVcsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUN6QyxHQUFHOzs7O1lBQUUsQ0FBQyxHQUFXLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUE7WUFDekMsT0FBTzs7OztZQUFFLENBQUMsT0FBd0IsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQTtZQUNsRSxlQUFlOzs7O1lBQUUsQ0FBQyxNQUFtQixFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUE7U0FDakQ7O2NBRUssYUFBYSxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLE1BQU0sRUFBRSxXQUFXLENBQUM7UUFDM0UsT0FBTyxjQUFjLENBQUMsV0FBVyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDcEQsQ0FBQzs7O1lBNUNGLFVBQVU7Ozs7O0FBZ0RYLDZCQUVDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICdyZWZsZWN0LW1ldGFkYXRhJztcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1Hcm91cCwgRm9ybUNvbnRyb2wsIFZhbGlkYXRvcnMsIFZhbGlkYXRvckZuLCBBYnN0cmFjdENvbnRyb2xPcHRpb25zIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgTW9kZWxGb3JtQnVpbGRlcjxUPiB7XG5cbiAgcHVibGljIGJ1aWxkKHRhcmdldDogVCwgb3B0aW9ucz86IEFic3RyYWN0Q29udHJvbE9wdGlvbnMgfCBudWxsKTogRm9ybUdyb3VwIHtcbiAgICBjb25zdCBmZyA9IG5ldyBGb3JtR3JvdXAoe30sIG9wdGlvbnMpO1xuXG4gICAgZm9yIChjb25zdCBwcm9wZXJ0eUtleSBvZiBPYmplY3Qua2V5cyh0YXJnZXQpKSB7XG5cbiAgICAgIGNvbnN0IGRlY29yYXRvcnMgPSBSZWZsZWN0LmdldE1ldGFkYXRhS2V5cyh0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgICAgIGlmIChkZWNvcmF0b3JzLmluZGV4T2YoJ2V4Y2x1ZGUnKSA+IDApIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGZnLmFkZENvbnRyb2wocHJvcGVydHlLZXksIG5ldyBGb3JtQ29udHJvbCh0YXJnZXRbcHJvcGVydHlLZXldKSk7XG4gICAgICBjb25zdCB2YWxpZGF0b3JzOiBWYWxpZGF0b3JGbltdID0gW107XG5cbiAgICAgIGRlY29yYXRvcnNcbiAgICAgICAgLmZpbHRlcih4ID0+IHggIT09ICdkZXNpZ246dHlwZScpXG4gICAgICAgIC5mb3JFYWNoKChkZWNvcmF0b3IpID0+IHtcbiAgICAgICAgICBjb25zdCB2YWxpZGF0b3IgPSB0aGlzLmdldFZhbGlkYXRvckJ5VHlwZShkZWNvcmF0b3IsIHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgICAgICAgIGlmICh2YWxpZGF0b3IgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHZhbGlkYXRvcnMucHVzaCh2YWxpZGF0b3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgIGZnLmdldChwcm9wZXJ0eUtleSkuc2V0VmFsaWRhdG9ycyh2YWxpZGF0b3JzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmc7XG4gIH1cblxuICBnZXRWYWxpZGF0b3JCeVR5cGUobWV0YWRhdGFLZXk6IHN0cmluZywgdGFyZ2V0OiBULCBwcm9wZXJ0eUtleTogc3RyaW5nIHwgc3ltYm9sKTogVmFsaWRhdG9yRm4ge1xuXG4gICAgY29uc3QgdmFsaWRhdG9yc1R5cGU6IFZhbGlkYXRvcnNUeXBlID0ge1xuICAgICAgcmVxdWlyZWQ6IF8gPT4gVmFsaWRhdG9ycy5yZXF1aXJlZCxcbiAgICAgIGVtYWlsOiBfID0+IFZhbGlkYXRvcnMuZW1haWwsXG4gICAgICBtaW46IChtaW46IG51bWJlcikgPT4gVmFsaWRhdG9ycy5taW4obWluKSxcbiAgICAgIG1heDogKG1heDogbnVtYmVyKSA9PiBWYWxpZGF0b3JzLm1heChtYXgpLFxuICAgICAgcGF0dGVybjogKHBhdHRlcm46IHN0cmluZyB8IFJlZ0V4cCkgPT4gVmFsaWRhdG9ycy5wYXR0ZXJuKHBhdHRlcm4pLFxuICAgICAgY3VzdG9tVmFsaWRhdG9yOiAoY3VzdG9tOiBWYWxpZGF0b3JGbikgPT4gY3VzdG9tXG4gICAgfTtcblxuICAgIGNvbnN0IG1ldGFkYXRhVmFsdWUgPSBSZWZsZWN0LmdldE1ldGFkYXRhKG1ldGFkYXRhS2V5LCB0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgICByZXR1cm4gdmFsaWRhdG9yc1R5cGVbbWV0YWRhdGFLZXldKG1ldGFkYXRhVmFsdWUpO1xuICB9XG5cbn1cblxuaW50ZXJmYWNlIFZhbGlkYXRvcnNUeXBlIHtcbiAgW2tleTogc3RyaW5nXTogKCguLi5hcmdzOiBhbnkpID0+IFZhbGlkYXRvckZuKTtcbn1cbiJdfQ==