{"version":3,"file":"pilusonoka-ngx-dynamic-form-builder.mjs","sources":["../../../libs/ngx-dynamic-form-builder/src/lib/constants/default.ts","../../../libs/ngx-dynamic-form-builder/src/lib/decorators/expose-nested.decorator.ts","../../../libs/ngx-dynamic-form-builder/src/lib/utils/get-global.util.ts","../../../libs/ngx-dynamic-form-builder/src/lib/storages/class-validator-messages.storage.ts","../../../libs/ngx-dynamic-form-builder/src/lib/storages/class-validator-titles.storage.ts","../../../libs/ngx-dynamic-form-builder/src/lib/types/dynamic-form-group-config.ts","../../../libs/ngx-dynamic-form-builder/src/lib/validators/forever-invalid.validator.ts","../../../libs/ngx-dynamic-form-builder/src/lib/utils/dynamic-form-control.ts","../../../libs/ngx-dynamic-form-builder/src/lib/utils/dynamic-form-group.util.ts","../../../libs/ngx-dynamic-form-builder/src/lib/utils/get-or-set-empty-object.ts","../../../libs/ngx-dynamic-form-builder/src/lib/utils/has-to-json.ts","../../../libs/ngx-dynamic-form-builder/src/lib/utils/dynamic-form-group.ts","../../../libs/ngx-dynamic-form-builder/src/lib/utils/dynamic-form-builder.ts","../../../libs/ngx-dynamic-form-builder/src/public_api.ts","../../../libs/ngx-dynamic-form-builder/src/pilusonoka-ngx-dynamic-form-builder.ts"],"sourcesContent":["import { ClassTransformOptions } from 'class-transformer';\nimport { ValidatorOptions } from 'class-validator-multi-lang';\n\nexport const DEFAULT_CLASS_TRANSFORM_OPTIONS: ClassTransformOptions = {\n  strategy: 'excludeAll',\n};\nexport const DEFAULT_CLASS_TRANSFORM_TO_PLAIN_OPTIONS: ClassTransformOptions = {\n  strategy: 'exposeAll',\n};\nexport const DEFAULT_CLASS_VALIDATOR_OPTIONS: ValidatorOptions = { validationError: { target: false }, always: true };\n","import { Expose, ExposeOptions, Transform, TransformFnParams } from 'class-transformer';\n\n// for correct work expose with js object\n// https://github.com/typestack/class-transformer/issues/365\nexport function ExposeNested(options?: ExposeOptions & { default: any }) {\n  const exposeFn = Expose(options);\n  const transformFn = (propertyKey: string) =>\n    Transform((params: TransformFnParams) => {\n      return (\n        (params.obj && Object.getOwnPropertyDescriptor(params.obj, propertyKey)\n          ? params.obj[propertyKey]\n          : options?.default) || params.value\n      );\n    });\n  return (target: any, propertyKey: string) => {\n    transformFn(propertyKey)(target, propertyKey);\n    exposeFn(target, propertyKey);\n  };\n}\n","/**\n * This function returns the global object across Node and browsers.\n *\n * Note: `globalThis` is the standardized approach however it has been added to\n * Node.js in version 12. We need to include this snippet until Node 12 EOL.\n */\nexport function getGlobal() {\n  if (typeof globalThis !== 'undefined') {\n    return globalThis;\n  }\n\n  if (typeof global !== 'undefined') {\n    return global;\n  }\n\n  // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n  // @ts-ignore: Cannot find name 'window'.\n  if (typeof window !== 'undefined') {\n    // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n    // @ts-ignore: Cannot find name 'window'.\n    return window;\n  }\n\n  // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n  // @ts-ignore: Cannot find name 'self'.\n  if (typeof self !== 'undefined') {\n    // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n    // @ts-ignore: Cannot find name 'self'.\n    return self;\n  }\n  throw Error('Can not work with the global object');\n}\n","import { getClassValidatorMessagesStorage } from 'class-validator-multi-lang';\nimport { BehaviorSubject } from 'rxjs';\nimport { getGlobal } from '../utils/get-global.util';\n\nconst CLASS_VALIDATOR_MESSAGES_STORAGE = 'CLASS_VALIDATOR_MESSAGES_STORAGE';\n\nexport function getValidatorMessagesStorage(): BehaviorSubject<{\n  [key: string]: string;\n}> {\n  const global = getGlobal();\n  if (!global[CLASS_VALIDATOR_MESSAGES_STORAGE]) {\n    global[CLASS_VALIDATOR_MESSAGES_STORAGE] = new BehaviorSubject(getClassValidatorMessagesStorage());\n  }\n  return global[CLASS_VALIDATOR_MESSAGES_STORAGE];\n}\n\nexport function updateValidatorMessagesStorage(messages: { [key: string]: string }) {\n  getValidatorMessagesStorage().next(messages);\n}\n","import { BehaviorSubject } from 'rxjs';\nimport { getGlobal } from '../utils/get-global.util';\n\nconst CLASS_VALIDATOR_TITLES_STORAGE = 'CLASS_VALIDATOR_TITLES_STORAGE';\n\nexport function getValidatorTitlesStorage(): BehaviorSubject<\n  | {\n      [key: string]: string;\n    }\n  | undefined\n> {\n  const global = getGlobal();\n  if (!global[CLASS_VALIDATOR_TITLES_STORAGE]) {\n    global[CLASS_VALIDATOR_TITLES_STORAGE] = new BehaviorSubject({});\n  }\n  return global[CLASS_VALIDATOR_TITLES_STORAGE];\n}\n\nexport function updateValidatorTitlesStorage(titles: { [key: string]: string } | undefined) {\n  getValidatorTitlesStorage().next(titles);\n}\n","import { AbstractControlOptions, AsyncValidatorFn, ValidatorFn } from '@angular/forms';\nimport { ClassTransformOptions } from 'class-transformer';\nimport { ValidatorOptions } from 'class-validator-multi-lang';\n\nexport interface DynamicFormGroupConfig {\n  validator?: ValidatorFn | undefined;\n  asyncValidator?: AsyncValidatorFn | undefined;\n  validators?: ValidatorFn[] | undefined;\n  asyncValidators?: AsyncValidatorFn[] | undefined;\n  updateOn?: any | undefined;\n  classValidatorOptions?: ValidatorOptions | undefined;\n  classTransformOptions?: ClassTransformOptions | undefined;\n  classTransformToPlainOptions?: ClassTransformOptions | undefined;\n  validateAllFormFields?: boolean | undefined;\n}\nexport function isDynamicFormGroupConfig(options: AbstractControlOptions | DynamicFormGroupConfig) {\n  return (\n    options &&\n    (Object.getOwnPropertyDescriptor(options, 'classValidatorOptions') ||\n      Object.getOwnPropertyDescriptor(options, 'classTransformOptions') ||\n      Object.getOwnPropertyDescriptor(options, 'classTransformToPlainOptions') ||\n      Object.getOwnPropertyDescriptor(options, 'validateAllFormFields'))\n  );\n}\nexport function isLegacyOrOpts(options: AbstractControlOptions | DynamicFormGroupConfig) {\n  return options && (!!options['validator'] || !!options['asyncValidator']);\n}\nexport function isAbstractControlOptions(options: AbstractControlOptions | DynamicFormGroupConfig) {\n  return options && (!!options.validators || !!options.asyncValidators || !!options.updateOn);\n}\n","import { FormControl } from '@angular/forms';\n\nexport function foreverInvalid(c: FormControl) {\n  return {\n    foreverInvalid: {\n      valid: false,\n    },\n  };\n}\nexport const FOREVER_INVALID_NAME = 'foreverInvalid';\n","import { AsyncValidatorFn, FormControl, ValidatorFn } from '@angular/forms';\nimport { ValidationMetadata } from 'class-validator-multi-lang';\nimport { Observable } from 'rxjs';\nimport { DynamicFormGroupField } from '../types/dynamic-form-group-field';\n\nexport class DynamicFormControl extends FormControl {\n  public controlName: string;\n  public validationDefinitions: ValidationMetadata[];\n\n  constructor(name: string, fieldDefinition: DynamicFormGroupField) {\n    super(\n      fieldDefinition.data instanceof Observable ? null : fieldDefinition.data,\n      fieldDefinition.validationFunctions\n        .filter((func) => func.type === 'sync')\n        .map((func) => func.validator as ValidatorFn),\n      fieldDefinition.validationFunctions\n        .filter((func) => func.type === 'async')\n        .map((func) => func.validator as AsyncValidatorFn)\n    );\n    this.controlName = name;\n    this.validationDefinitions = fieldDefinition.validationDefinitions;\n  }\n}\n","import { ValidationError } from 'class-validator-multi-lang';\nimport { ShortValidationErrors } from '../types/short-validation-errors';\n\nconst cloneDeep = require('lodash.clonedeep');\nconst mergeWith = require('lodash.mergewith');\n\nexport function transformValidationErrors(errors: ValidationError[]): ShortValidationErrors {\n  const customErrors: ShortValidationErrors = {};\n\n  errors.forEach((error: ValidationError) => {\n    if (error && error.constraints !== undefined) {\n      Object.keys(error.constraints).forEach((key: string) => {\n        if (!customErrors[error.property]) {\n          customErrors[error.property] = [];\n        }\n\n        if (error.constraints && (customErrors[error.property] as string[]).indexOf(error.constraints[key]) === -1) {\n          (customErrors[error.property] as string[]).push(error.constraints[key]);\n        }\n      });\n    }\n\n    if (error.children !== undefined && error.children.length) {\n      customErrors[error.property] = transformValidationErrors(error.children);\n    }\n  });\n\n  return customErrors;\n}\n\nexport function mergeErrors(externalErrors?: ShortValidationErrors, validationErrors?: ShortValidationErrors) {\n  const clonedExternalErrors = cloneDeep(externalErrors);\n  return mergeWith(clonedExternalErrors, validationErrors, (objValue, srcValue) => {\n    if (canMerge()) {\n      return objValue.concat(srcValue);\n    }\n\n    function canMerge() {\n      return (\n        Array.isArray(objValue) && Array.isArray(srcValue) && !objValue.find((objItem) => srcValue.includes(objItem))\n      );\n    }\n  });\n}\n","export function getOrSetEmptyObject(factoryModel: any) {\n  if (!factoryModel) {\n    return undefined;\n  }\n  if (!factoryModel.emptyObject) {\n    factoryModel.emptyObject = new factoryModel();\n  }\n  return factoryModel.emptyObject;\n}\n","export function hasToJSON(object: any) {\n  return object ? typeof object.toJSON === 'function' : false;\n}\n","import {\n  AbstractControl,\n  AbstractControlOptions,\n  AsyncValidatorFn,\n  FormArray,\n  FormBuilder,\n  FormControl,\n  FormGroup,\n  ValidatorFn,\n} from '@angular/forms';\nimport { classToPlain, ClassTransformOptions, plainToClass } from 'class-transformer';\nimport { ClassConstructor } from 'class-transformer';\nimport {\n  getMetadataStorage,\n  validateSync,\n  ValidationMetadata,\n  ValidationTypes,\n  Validator,\n  ValidatorOptions,\n} from 'class-validator-multi-lang';\nimport stringify from 'fast-safe-stringify';\nimport 'reflect-metadata';\nimport { BehaviorSubject, combineLatest, Subject, Subscription } from 'rxjs';\nimport { distinctUntilChanged, take, tap } from 'rxjs/operators';\nimport stringHash from 'string-hash';\nimport { getValidatorMessagesStorage } from '../storages/class-validator-messages.storage';\nimport { getValidatorTitlesStorage } from '../storages/class-validator-titles.storage';\nimport { Dictionary } from '../types/dictionary';\nimport { DynamicFormGroupConfig } from '../types/dynamic-form-group-config';\nimport { DynamicFormGroupField } from '../types/dynamic-form-group-field';\nimport { ErrorPropertyName } from '../types/error-property-name';\nimport { FormModel } from '../types/form-model';\nimport { ShortValidationErrors } from '../types/short-validation-errors';\nimport { ValidatorFunctionType } from '../types/validator-function-type';\nimport { foreverInvalid, FOREVER_INVALID_NAME } from '../validators/forever-invalid.validator';\nimport { DynamicFormBuilder } from './dynamic-form-builder';\nimport { DynamicFormControl } from './dynamic-form-control';\nimport { mergeErrors, transformValidationErrors } from './dynamic-form-group.util';\nimport { getOrSetEmptyObject } from './get-or-set-empty-object';\nimport { hasToJSON } from './has-to-json';\n\nconst cloneDeep = require('lodash.clonedeep');\nconst validator = new Validator();\n\nexport class DynamicFormGroup<TModel> extends FormGroup {\n  public nativeValidateErrors = new BehaviorSubject<Dictionary>({});\n  public customValidateErrors = new BehaviorSubject<ShortValidationErrors>({});\n  public formErrors: ShortValidationErrors;\n  public formFields: Dictionary;\n  public objectChange = new Subject();\n  public valueChangesSubscription: Subscription;\n  public dynamicFormBuilder: DynamicFormBuilder;\n  public originalFormBuilder: FormBuilder;\n\n  protected _object: TModel;\n  protected _externalErrors: ShortValidationErrors;\n  protected _validatorOptions: ValidatorOptions;\n  protected _classTransformOptions: ClassTransformOptions;\n  protected _classTransformToPlainOptions: ClassTransformOptions;\n  protected _validateSubscription: Subscription | undefined;\n  protected _validateAllFormFields: boolean;\n\n  constructor(\n    public factoryModel: ClassConstructor<TModel>,\n    public fields?: FormModel<TModel>,\n    protected _validatorOrOpts?: ValidatorFn | ValidatorFn[] | AbstractControlOptions | null,\n    protected _asyncValidator?: AsyncValidatorFn | AsyncValidatorFn[] | null,\n    protected readonly options?: DynamicFormGroupConfig\n  ) {\n    super({}, _validatorOrOpts, _asyncValidator);\n    /*\n    const classValidators = DynamicFormGroup.getClassValidators<TModel>(\n      this.factoryModel,\n      this.fields,\n      this.defaultValidatorOptions\n    );\n    const formGroup = this._fb.group(\n      classValidators\n    );\n    Object.keys(formGroup.controls).forEach(key => {\n      this.addControl(key, formGroup.controls[key]);\n    });\n    this.valueChanges.subscribe(data => {\n      this.validate(\n        undefined,\n        this.defaultValidatorOptions\n      );\n    });*/\n    if (options?.classTransformOptions) {\n      this._classTransformOptions = options.classTransformOptions;\n    }\n    if (options?.classTransformToPlainOptions) {\n      this._classTransformToPlainOptions = options.classTransformToPlainOptions;\n    }\n    if (options?.classValidatorOptions) {\n      this._validatorOptions = options.classValidatorOptions;\n    }\n    if (options?.validateAllFormFields !== undefined) {\n      this._validateAllFormFields = options.validateAllFormFields;\n    }\n    this.formFields = this.onlyFields(fields);\n  }\n\n  subscribeToValueChanges(externalErrors?: ShortValidationErrors, validatorOptions?: ValidatorOptions) {\n    if (!this.valueChangesSubscription) {\n      this.valueChangesSubscription = this.valueChanges\n        .pipe(\n          distinctUntilChanged(),\n          tap(() => this.validate(externalErrors, validatorOptions))\n        )\n        .subscribe({\n          error: (err) => {\n            throw err;\n          },\n        });\n    }\n  }\n\n  // Getters & Setters\n  set externalErrors(externalErrors: ShortValidationErrors) {\n    this._externalErrors = externalErrors;\n    this.validate();\n  }\n  get externalErrors(): ShortValidationErrors {\n    return this._externalErrors;\n  }\n\n  set classTransformOptions(classTransformOptions: ClassTransformOptions) {\n    this._classTransformOptions = classTransformOptions;\n    this.validate();\n  }\n\n  get classTransformOptions(): ClassTransformOptions {\n    return this._classTransformOptions;\n  }\n\n  set classTransformToPlainOptions(classTransformToPlainOptions: ClassTransformOptions) {\n    this._classTransformToPlainOptions = classTransformToPlainOptions;\n    this.validate();\n  }\n\n  get classTransformToPlainOptions(): ClassTransformOptions {\n    return this._classTransformToPlainOptions;\n  }\n\n  set validatorOptions(validatorOptions: ValidatorOptions) {\n    this._validatorOptions = validatorOptions;\n    this.validate();\n  }\n\n  get validatorOptions(): ValidatorOptions {\n    return this._validatorOptions;\n  }\n\n  set object(object: TModel) {\n    this.setObject(object);\n  }\n\n  get object() {\n    return this.getObject();\n  }\n\n  set json(jsonData: any) {\n    this.setJSON(jsonData);\n  }\n\n  get json() {\n    return this.getJSON();\n  }\n\n  validateStream(externalErrors?: ShortValidationErrors, validatorOptions?: ValidatorOptions) {\n    const argumentExternalErrors: ShortValidationErrors = externalErrors ? cloneDeep(externalErrors) : externalErrors;\n    const argumentValidatorOptions: ValidatorOptions = validatorOptions\n      ? cloneDeep(validatorOptions)\n      : validatorOptions;\n\n    return combineLatest([getValidatorMessagesStorage(), getValidatorTitlesStorage()]).pipe(\n      tap(([messages, titles]) => {\n        validatorOptions = cloneDeep(this._validatorOptions || argumentValidatorOptions);\n        externalErrors = cloneDeep(this._externalErrors || argumentExternalErrors);\n\n        if (!validatorOptions) {\n          validatorOptions = {};\n        }\n\n        if (!validatorOptions.messages) {\n          validatorOptions.messages = {};\n        }\n\n        if (!validatorOptions.titles) {\n          validatorOptions.titles = {};\n        }\n\n        if (messages) {\n          validatorOptions.messages = { ...cloneDeep(messages), ...validatorOptions.messages };\n        }\n\n        if (titles) {\n          validatorOptions.titles = { ...cloneDeep(titles), ...validatorOptions.titles };\n        }\n\n        const dataToValidate = this.object;\n        const validationErrors = getValidateErrors(this, dataToValidate, validatorOptions);\n\n        if (!externalErrors) {\n          externalErrors = {};\n        }\n\n        const allErrors = mergeErrors(externalErrors, validationErrors);\n        const allErrorsKeys = Object.keys(allErrors);\n\n        this.markAsInvalidForExternalErrors(externalErrors);\n        this.setCustomErrors(allErrors);\n\n        // todo: refactor, invalidate form if exists any allErrors\n        let usedForeverInvalid = false;\n        if (!allErrorsKeys.find((key) => key !== FOREVER_INVALID_NAME) && this.get(FOREVER_INVALID_NAME)) {\n          this.removeControl(FOREVER_INVALID_NAME);\n          usedForeverInvalid = true;\n        }\n        if (this.valid && allErrorsKeys.length > 0 && !this.get(FOREVER_INVALID_NAME)) {\n          this.addControl(FOREVER_INVALID_NAME, new FormControl('', [foreverInvalid]));\n          usedForeverInvalid = true;\n        }\n        if (usedForeverInvalid) {\n          this.updateValueAndValidity({\n            onlySelf: true,\n            emitEvent: false,\n          });\n        }\n        if (this._validateAllFormFields) {\n          this.validateAllFormFields();\n        }\n      })\n    );\n  }\n\n  validateAsync(externalErrors?: ShortValidationErrors, validatorOptions?: ValidatorOptions) {\n    return this.validateStream(externalErrors, validatorOptions).pipe(take(1)).toPromise();\n  }\n\n  // Public API\n  validate(externalErrors?: ShortValidationErrors, validatorOptions?: ValidatorOptions) {\n    if (this._validateSubscription) {\n      this._validateSubscription.unsubscribe();\n      this._validateSubscription = undefined;\n    }\n    this._validateSubscription = this.validateStream(externalErrors, validatorOptions).subscribe({\n      error: (err) => {\n        throw err;\n      },\n    });\n  }\n\n  setCustomErrors(allErrors: any, force = false) {\n    if (force || stringify(allErrors) !== stringify(this.customValidateErrors.value)) {\n      this.formErrors = allErrors;\n      this.customValidateErrors.next(this.formErrors);\n    }\n    const nativeValidateErrors = this.collectErrors(this);\n    if (force || stringify(nativeValidateErrors) !== stringify(this.nativeValidateErrors.value)) {\n      this.nativeValidateErrors.next(this.collectErrors(this));\n    }\n  }\n\n  protected collectErrors(control: Dictionary, isRoot = true) {\n    if (control.controls) {\n      return {\n        ...(isRoot ? this.errors : {}),\n        ...Object.entries(control.controls).reduce((acc, [key, childControl]: [string, Dictionary]) => {\n          const childErrors = this.collectErrors(childControl, false);\n          if (childErrors && Object.keys(childErrors).length > 0) {\n            acc = {\n              ...acc,\n              [key]: {\n                ...(acc && acc[key] ? acc[key] : {}),\n                ...childErrors,\n              },\n            };\n          }\n          return acc;\n        }, {}),\n      };\n    } else {\n      return control.errors;\n    }\n  }\n\n  validateAllFormFields() {\n    let control: any;\n    let formArrayControlsLength: any;\n    Object.keys(this.controls).forEach((field) => {\n      control = this.get(field);\n\n      // Control\n      if (control instanceof FormControl) {\n        control.markAsTouched({ onlySelf: true });\n      }\n      // Group: recursive\n      else if (control instanceof DynamicFormGroup) {\n        control.validateAllFormFields();\n      }\n      // Array\n      else if (control instanceof FormArray) {\n        formArrayControlsLength = (control as FormArray).controls.length;\n        for (let i = 0; i < formArrayControlsLength; i++) {\n          // Control in Array\n          if ((control as FormArray).controls[i] instanceof FormControl) {\n            ((control as FormArray).controls[i] as FormControl).markAsTouched({ onlySelf: true });\n          }\n          // Group in Array: recursive\n          else if ((control as FormArray).controls[i] instanceof DynamicFormGroup) {\n            ((control as FormArray).controls[i] as DynamicFormGroup<any>).validateAllFormFields();\n          }\n        }\n      }\n    });\n    formArrayControlsLength = null;\n    control = null;\n  }\n\n  resetValidateAllFormFields() {\n    this.markAsInvalidForExternalErrors({});\n    let control: any;\n    Object.keys(this.controls).forEach((field) => {\n      control = this.get(field);\n\n      // Control\n      if (control instanceof FormControl) {\n        control.setErrors(null, { emitEvent: false });\n        control.markAsUntouched({ onlySelf: true });\n        control.markAsPristine({ onlySelf: true });\n      }\n      // Group: recursive\n      else if (control instanceof DynamicFormGroup) {\n        control.resetValidateAllFormFields();\n      }\n      // Array\n      else if (control instanceof FormArray) {\n        const formArrayControlsLength = (control as FormArray).controls.length;\n        for (let i = 0; i < formArrayControlsLength; i++) {\n          // Control in Array\n          if ((control as FormArray).controls[i] instanceof FormControl) {\n            ((control as FormArray).controls[i] as FormControl).setErrors(null, { emitEvent: false });\n            ((control as FormArray).controls[i] as FormControl).markAsUntouched({ onlySelf: true });\n            ((control as FormArray).controls[i] as FormControl).markAsPristine({ onlySelf: true });\n          }\n          // Group in Array: recursive\n          else if ((control as FormArray).controls[i] instanceof DynamicFormGroup) {\n            ((control as FormArray).controls[i] as DynamicFormGroup<any>).resetValidateAllFormFields();\n          }\n        }\n      }\n    });\n    control = null;\n    this.setCustomErrors({});\n  }\n\n  classToClass<TClassModel>(object: TClassModel) {\n    if (hasToJSON(object)) {\n      return new (object as any).constructor((object as any).toJSON());\n    }\n    return cloneDeep(object);\n  }\n\n  plainToClass<TClassModel, Object>(cls: ClassConstructor<TClassModel>, plain: Object) {\n    if (hasToJSON(getOrSetEmptyObject(cls))) {\n      return new cls(plain);\n    }\n    if (Object.keys(plain || {}).length === 0) {\n      return this.classToClass(getOrSetEmptyObject(cls));\n    }\n    if (plain instanceof cls) {\n      return this.classToClass(plain);\n    }\n    if (stringify(plain) === stringify(getOrSetEmptyObject(cls))) {\n      return this.classToClass(getOrSetEmptyObject(cls));\n    }\n    return plainToClass(cls, plain, { ...this._classTransformOptions });\n  }\n\n  classToPlain<TClassModel>(object: TClassModel) {\n    if (hasToJSON(object)) {\n      return (object as any).toJSON();\n    }\n    return classToPlain(object, { ...this._classTransformToPlainOptions });\n  }\n\n  /**\n   * @deprecated please use sync method setExternalErrors(errors)\n   */\n  setExternalErrorsAsync(externalErrors: ShortValidationErrors) {\n    this.setExternalErrors(externalErrors);\n    return Promise.resolve();\n  }\n\n  setExternalErrors(externalErrors: ShortValidationErrors) {\n    this._externalErrors = externalErrors;\n    this.validate();\n  }\n\n  getExternalErrors(): ShortValidationErrors {\n    return this._externalErrors;\n  }\n\n  /**\n   * @deprecated please use sync method setExternalErrors({})\n   */\n  clearExternalErrorsAsync() {\n    this.setExternalErrors({});\n    return Promise.resolve();\n  }\n\n  clearExternalErrors() {\n    this.setExternalErrors({});\n  }\n\n  setValidatorOptions(validatorOptions?: ValidatorOptions) {\n    this._validatorOptions = <ValidatorOptions>validatorOptions;\n    this.validate();\n  }\n\n  getValidatorOptions(): ValidatorOptions {\n    return this._validatorOptions;\n  }\n\n  // Helpers\n  protected onlyFields(fields?: FormModel<any>): Dictionary {\n    const newFields: Dictionary = {};\n\n    if (fields !== undefined) {\n      Object.keys(fields).forEach((key) => {\n        if (fields[key] instanceof DynamicFormGroup) {\n          // Group: recursive\n          newFields[key] = this.onlyFields((fields[key] as DynamicFormGroup<any>).formFields);\n        } else {\n          // Array\n          if (fields[key] instanceof FormArray) {\n            if ((fields[key] as FormArray).controls[0] instanceof DynamicFormGroup) {\n              // Group within Array: recursive\n              newFields[key] = this.onlyFields(\n                ((fields[key] as FormArray).controls[0] as DynamicFormGroup<any>).formFields\n              );\n            } else {\n              // Control within Array\n              newFields[key] = (fields[key] as FormArray).controls[0].value;\n            }\n          } else {\n            // Handle Control\n            newFields[key] = fields[key];\n          }\n        }\n      });\n    }\n\n    return newFields;\n  }\n\n  protected markAsInvalidForExternalErrors(errors: ShortValidationErrors, controls?: Dictionary<AbstractControl>) {\n    const currentControls = controls ? controls : this.controls;\n    Object.keys(currentControls).forEach((field) => {\n      const control = currentControls[field];\n\n      // Control\n      if (control instanceof FormControl) {\n        if (errors && errors[field]) {\n          control.setErrors({ externalError: true });\n        } else {\n          if (control.errors && control.errors.externalError === true) {\n            control.setErrors(null);\n          }\n        }\n      }\n      // Group\n      else if (control instanceof DynamicFormGroup) {\n        control.markAsInvalidForExternalErrors(errors && errors[field] ? (errors[field] as ShortValidationErrors) : {});\n      }\n      // Array\n      else if (control instanceof FormArray) {\n        const formArrayControlsLength = (control as FormArray).length;\n        for (let i = 0; i < formArrayControlsLength; i++) {\n          // Control in Array\n          if (control[i] instanceof FormControl) {\n            if (errors && errors[i] && errors[i][field]) {\n              control[i].setErrors({ externalError: true });\n            } else if (control[i].errors && control[i].errors.externalError === true) {\n              control[i].setErrors(null);\n            }\n          }\n          // Group in Array\n          else if (control[i] instanceof DynamicFormGroup) {\n            control[i].markAsInvalidForExternalErrors(\n              errors && errors[i] && errors[i][field] ? (errors[i][field] as ShortValidationErrors) : {}\n            );\n          }\n        }\n      }\n    });\n  }\n\n  /**\n   * Recursively gets all values from the form controls and all sub form group and array controls and returns it as\n   * an object\n   */\n  protected getObject(): TModel {\n    // Initialize the shape of the response\n    const object = this.classToClass(this._object || getOrSetEmptyObject(this.factoryModel) || undefined);\n\n    if (object !== undefined) {\n      // Recursively get the value of all fields\n      Object.keys(this.controls)\n        .filter((name) => name !== FOREVER_INVALID_NAME)\n        .forEach((key) => {\n          // Handle Group\n          if (this.controls[key] instanceof DynamicFormGroup) {\n            object[key] = (this.controls[key] as DynamicFormGroup<any>).object;\n          }\n\n          // Handle Form Array\n          else if (this.controls[key] instanceof FormArray) {\n            // Initialize value\n            object[key] = [];\n            const formArrayControlsLength = (this.controls[key] as FormArray).controls.length;\n            let value;\n            for (let i = 0; i < formArrayControlsLength; i++) {\n              if ((this.controls[key] as FormArray).controls[i] instanceof DynamicFormGroup) {\n                // Recursively get object group\n                value = ((this.controls[key] as FormArray).controls[i] as DynamicFormGroup<any>).object;\n              } else {\n                value = (this.controls[key] as FormArray).controls[i].value;\n              }\n              if (value && Object.keys(value).length > 0) {\n                object[key].push(value);\n              }\n            }\n            value = null;\n          }\n\n          // Handle Control\n          else {\n            if (this.controls[key]) {\n              object[key] = this.controls[key].value;\n            }\n          }\n        });\n    }\n    return this.factoryModel ? this.plainToClass(this.factoryModel, object) : <TModel>object;\n    // todo: try change to return this.classToClass(object);\n  }\n\n  /**\n   * Sets the value of every control on the form and recursively sets the values of the controls\n   * on all sub form groups\n   *\n   * @param object the data to assign to all controls of the form group and sub groups\n   */\n  protected setObject(object: TModel) {\n    // console.time(String(object));\n    if (object instanceof this.factoryModel) {\n      this._object = this.classToClass(object); // Ensure correct type\n    } else {\n      this._object = this.plainToClass(this.factoryModel, object); // Convert to Model type\n      /*\n      todo: remove later if speed is normal\n      let objectWithOnlyFormFields: any = {};\n      // for speed up on work with short version of model\n      Object.keys(this.formFields).forEach((key) => (objectWithOnlyFormFields[key] = object ? object[key] : undefined));\n      this._object = this.plainToClass(this.factoryModel, objectWithOnlyFormFields); // Convert to Model type\n      objectWithOnlyFormFields = null;\n      */\n    }\n    let newObject: any;\n    let newValue: any;\n    // Recursively set the value of all fields\n    Object.keys(this.controls)\n      .filter((name) => name !== FOREVER_INVALID_NAME)\n      .forEach((key) => {\n        // Handle Group\n        if (this.controls[key] instanceof DynamicFormGroup) {\n          if ((this.controls[key] as DynamicFormGroup<any>)._object !== this._object[key]) {\n            (this.controls[key] as DynamicFormGroup<any>).setObject(this._object ? this._object[key] : {});\n          }\n        }\n\n        // Handle FormArray\n        else if (this.controls[key] instanceof FormArray) {\n          let objectArray: any = this._object ? this._object[key] : [];\n          let formArray: any = this.controls[key] as FormArray;\n          let isFormGroup: any = formArray.controls[0] instanceof DynamicFormGroup;\n          let firstFormGroup: any = formArray.controls[0] as DynamicFormGroup<any>;\n          let formControl: any = formArray.controls[0] as FormControl;\n\n          // Clear FormArray while retaining the reference\n          let objectArrayLength = objectArray.length;\n          let dynamicFormGroup: any;\n\n          let controlValue: any;\n          let newFormControl: any;\n          let classValidators: any;\n          let formGroup: any;\n          let formArrayLength = formArray.length;\n\n          for (let i = 0; i < formArrayLength; i++) {\n            if (\n              formArray.controls[i] instanceof DynamicFormGroup &&\n              (formArray.controls[i] as DynamicFormGroup<any>).valueChangesSubscription\n            ) {\n              (formArray.controls[i] as DynamicFormGroup<any>).valueChangesSubscription.unsubscribe();\n            }\n          }\n\n          while (formArrayLength !== 0) {\n            formArray.removeAt(0);\n            formArrayLength--;\n          }\n          formArrayLength = null;\n\n          for (let i = 0; i < objectArrayLength; i++) {\n            if (isFormGroup) {\n              // Create FormGroup\n              dynamicFormGroup = this.dynamicFormBuilder.factoryDynamicFormGroup(\n                firstFormGroup.factoryModel,\n                firstFormGroup.formFields\n              );\n\n              dynamicFormGroup.setParent(formArray);\n\n              formGroup = this.originalFormBuilder.group(\n                getClassValidators<TModel>(firstFormGroup.factoryModel, firstFormGroup.formFields)\n              );\n\n              // Add all controls to the form group\n              Object.keys(formGroup.controls).forEach((ctrlKey) => {\n                dynamicFormGroup.addControl(ctrlKey, formGroup.controls[ctrlKey]);\n              });\n\n              formArray.controls.push(dynamicFormGroup);\n            } else {\n              // Create control\n              controlValue = this._object && objectArray && objectArray[i] ? objectArray[i] : undefined;\n              newFormControl = new FormControl(controlValue, formControl ? formControl.validator : undefined);\n              newFormControl.setParent(formArray);\n\n              // Add the control to the FormArray\n              formArray.controls.push(newFormControl);\n            }\n          }\n          let arrayLength = formArray.length;\n          for (let i = 0; i < arrayLength; i++) {\n            if (isFormGroup) {\n              // Add a value change listener to the group. on change, validate\n              if (formArray.controls[i] instanceof DynamicFormGroup) {\n                // Recusrively set the object value\n                (formArray.controls[i] as DynamicFormGroup<any>).setObject(\n                  this._object && objectArray && objectArray[i] ? objectArray[i] : {}\n                );\n              }\n            }\n          }\n          for (let i = 0; i < arrayLength; i++) {\n            if (isFormGroup) {\n              // Add a value change listener to the group. on change, validate\n              if (formArray.controls[i] instanceof DynamicFormGroup) {\n                (formArray.controls[i] as DynamicFormGroup<any>).subscribeToValueChanges(\n                  undefined,\n                  this._validatorOptions\n                );\n              }\n            }\n          }\n          classValidators = null;\n          formGroup = null;\n          controlValue = null;\n          newFormControl = null;\n          dynamicFormGroup = null;\n          objectArrayLength = null;\n          arrayLength = null;\n          objectArray = null;\n          formArray = null;\n          isFormGroup = null;\n          firstFormGroup = null;\n          formControl = null;\n        }\n\n        // Handle Control\n        else {\n          newObject = this._object ? this._object[key] : [];\n          newValue = this._object && newObject ? newObject : undefined;\n          if (this.controls[key] && this.controls[key].value !== newValue) {\n            // very slow operations :(\n            this.controls[key].setValue(newValue, { emitEvent: false, onlySelf: true });\n          }\n        }\n      });\n    newValue = null;\n    newObject = null;\n    this.updateValueAndValidity();\n    this.objectChange.next(this._object);\n    if (this._validateAllFormFields) {\n      this.validateAllFormFields();\n    }\n    // console.timeEnd(String(object));\n  }\n\n  protected getJSON() {\n    return this.classToPlain(this.getObject());\n  }\n\n  protected setJSON(jsonData: any) {\n    this.setObject(this.plainToClass(this.factoryModel, jsonData));\n  }\n}\n\nexport function getClassValidators<TModel>(\n  factoryModel: ClassConstructor<TModel>,\n  fields?: Dictionary,\n  validatorOptions?: ValidatorOptions\n) {\n  const groups = validatorOptions ? validatorOptions.groups : undefined;\n  const strictGroups = (validatorOptions && validatorOptions.strictGroups) || false;\n  const always = (validatorOptions && validatorOptions.always) || false;\n\n  // console.time(String(factoryModel));\n  // Get the validation rules from the object decorators\n  let allValidationMetadatas: ValidationMetadata[] | any = getMetadataStorage().getTargetValidationMetadatas(\n    factoryModel,\n    '',\n    always,\n    strictGroups\n  );\n\n  // Get the validation rules for the validation group: https://github.com/typestack/class-validator-multi-lang#validation-groups\n  let validationGroupMetadatas: ValidationMetadata[] | any = getMetadataStorage().getTargetValidationMetadatas(\n    factoryModel,\n    '',\n    always,\n    strictGroups,\n    groups\n  );\n  const formGroupFields = {};\n\n  // Loop through all fields in the form definition\n  if (fields) {\n    let conditionalValidations: ValidationMetadata[] | any;\n    let allNestedValidations: ValidationMetadata[] | any;\n    let nestedGroupValidations: ValidationMetadata[] | any;\n    let fieldDefinition: DynamicFormGroupField | any;\n    let dynamicValidate: any;\n    let customValidation: any;\n    let objectToValidate: any;\n    let nestedValidate: any;\n\n    Object.keys(fields)\n      .filter((key) => key.indexOf('__') !== 0)\n      .forEach((fieldName) => {\n        // Conditional Validation for the field\n        conditionalValidations = [];\n        validationGroupMetadatas.forEach((validationMetadata) => {\n          if (isPropertyValidatorOfType(validationMetadata, fieldName, ValidationKeys.conditional.type)) {\n            conditionalValidations.push(validationMetadata);\n          }\n        });\n\n        // All Nested Validation for the field\n        allNestedValidations = [];\n        allValidationMetadatas.forEach((validationMetadata) => {\n          if (isPropertyValidatorOfType(validationMetadata, fieldName, ValidationKeys.nested.type)) {\n            allNestedValidations.push(validationMetadata);\n          }\n        });\n\n        // Nested Validation for the field for the requested class-validator-multi-lang group\n        nestedGroupValidations = [];\n        validationGroupMetadatas.forEach((validationMetadata) => {\n          if (isPropertyValidatorOfType(validationMetadata, fieldName, ValidationKeys.nested.type)) {\n            nestedGroupValidations.push(validationMetadata);\n          }\n        });\n\n        fieldDefinition = {\n          data: formGroupFields[fieldName] || undefined,\n          validationFunctions: [],\n          validationDefinitions: [],\n        };\n\n        if (fieldDefinition.data === undefined) {\n          fieldDefinition.data = fields[fieldName];\n        }\n        // TRY LINK EXISTS NATIVE VALIDATIONS, UNSTABLE !!!\n        if (\n          Array.isArray(fieldDefinition.data) &&\n          fieldDefinition.data.length > 1 &&\n          fieldDefinition.data.find(\n            (validationFunction, index) => index > 0 && typeof validationFunction === 'function'\n          )\n        ) {\n          fieldDefinition.data\n            .filter((validationFunction, index) => index > 0 && typeof validationFunction === 'function')\n            .forEach((validationFunction) =>\n              fieldDefinition.validationFunctions.push({ type: 'sync', validator: validationFunction })\n            );\n          fieldDefinition.data = fieldDefinition.data[0];\n        }\n\n        validationGroupMetadatas.forEach((validationMetadata) => {\n          if (\n            validationMetadata.propertyName === fieldName &&\n            validationMetadata.type !== ValidationKeys.conditional.type\n          ) {\n            // Add all validation to the field except the @NestedValidation definition as\n            // being part of the form would imply it is validated if any other rules are present\n            if (validationMetadata.type !== ValidationKeys.nested.type) {\n              fieldDefinition.validationDefinitions.push(validationMetadata);\n            }\n\n            Object.keys(ValidationTypes).forEach((typeKey) => {\n              if (ValidationTypes.hasOwnProperty(typeKey)) {\n                // Handle Nested Validation\n                if (checkWithAllNestedValidations(allNestedValidations, nestedGroupValidations, fieldName)) {\n                  if (isNestedValidate(validationMetadata, typeKey)) {\n                    objectToValidate =\n                      fields[fieldName] instanceof DynamicFormGroup ? fields[fieldName].object : undefined;\n                    nestedValidate = createNestedValidate(fieldName, objectToValidate, validationMetadata);\n                    setFieldData(fieldName, fieldDefinition, nestedValidate);\n                    objectToValidate = null;\n                    nestedValidate = null;\n                  }\n                }\n\n                // Handle Custom Validation\n                if (isCustomValidate(validationMetadata, typeKey)) {\n                  customValidation = createCustomValidation(fieldName, validationMetadata);\n                  setFieldData(fieldName, fieldDefinition, customValidation);\n                  customValidation = null;\n                }\n\n                // Handle remaining validation\n                if (isDynamicValidate(validationMetadata, typeKey)) {\n                  dynamicValidate = createDynamicValidate(fieldName, validationMetadata, conditionalValidations);\n                  setFieldData(fieldName, fieldDefinition, dynamicValidate);\n                  dynamicValidate = null;\n                }\n              }\n            });\n          }\n        });\n        // Convert to a structure, angular understands\n        if (fieldDefinition.data instanceof DynamicFormGroup || fieldDefinition.data instanceof FormArray) {\n          formGroupFields[fieldName] = fieldDefinition.data;\n        } else {\n          formGroupFields[fieldName] = new DynamicFormControl(fieldName, fieldDefinition);\n        }\n      });\n\n    dynamicValidate = null;\n    customValidation = null;\n    objectToValidate = null;\n    nestedValidate = null;\n\n    conditionalValidations = null;\n    allNestedValidations = null;\n    nestedGroupValidations = null;\n    fieldDefinition = null;\n  }\n\n  allValidationMetadatas = null;\n  validationGroupMetadatas = null;\n\n  // console.timeEnd(String(factoryModel));\n  return formGroupFields;\n\n  // ******************************************************************************************\n  // Local Helper functions to help make the main code more readable\n  //\n\n  function createNestedValidate(\n    fieldName: string,\n    objectToValidate: any,\n    validationMetadata: ValidationMetadata\n  ): ValidatorFunctionType {\n    return {\n      type: 'sync',\n      validator: function (control: FormControl) {\n        let parent = control.parent;\n        let validateErrors: ShortValidationErrors | null =\n          (parent &&\n            parent.value &&\n            getValidateErrors(\n              parent,\n              objectToValidate !== undefined ? objectToValidate : control.value,\n              validatorOptions\n            )) ||\n          {};\n        let validateState: boolean | null = Object.keys(validateErrors || {}).length === 0;\n        const result = getIsValidResult(validateState, validationMetadata, 'nestedValidate');\n        parent = null;\n        validateErrors = null;\n        validateState = null;\n        return result;\n      },\n    };\n  }\n\n  function createDynamicValidate(\n    fieldName: string,\n    validationMetadata: ValidationMetadata,\n    conditionalValidations: ValidationMetadata[]\n  ): ValidatorFunctionType {\n    return {\n      type: 'sync',\n      validator: function (control: FormControl) {\n        if (!control) {\n          return null;\n        }\n        let validateErrors: any = setObjectValueAndGetValidationErrors(fieldName, control, validatorOptions);\n        let validateState: any = getAllErrors(validateErrors, fieldName).length === 0;\n        const result = getIsValidResult(validateState, validationMetadata, 'dynamicValidate');\n        validateErrors = null;\n        validateState = null;\n        return result;\n      },\n    };\n  }\n\n  function createCustomValidation(fieldName: string, validationMetadata: ValidationMetadata): ValidatorFunctionType {\n    return {\n      type: 'sync',\n      validator: function (control: FormControl) {\n        let validateErrors: any = setObjectValueAndGetValidationErrors(fieldName, control, validatorOptions);\n        let validateState: any = validateErrors && validateErrors[fieldName] ? false : true;\n        const result = getIsValidResult(validateState, validationMetadata, 'customValidation');\n        validateErrors = null;\n        validateState = null;\n        return result;\n      },\n    };\n  }\n\n  function checkWithAllNestedValidations(\n    allNestedValidations: ValidationMetadata[],\n    nestedValidations: ValidationMetadata[],\n    key: string\n  ) {\n    const allNestedValidationsLength = allNestedValidations.length;\n    const nestedValidationsLength = nestedValidations.length;\n    return (\n      allNestedValidationsLength === nestedValidationsLength ||\n      (((fields && fields[key] instanceof DynamicFormGroup) || (fields && fields[key] instanceof FormArray)) &&\n        allNestedValidationsLength > 0 &&\n        nestedValidationsLength === 0)\n    );\n  }\n\n  function isDynamicValidate(validationMetadata: ValidationMetadata, typeKey: string) {\n    return validationMetadata.type === ValidationTypes[typeKey] && validator[validationMetadata.type] !== undefined;\n  }\n\n  /**\n   * marked with @Validate(...)\n   * https://github.com/typestack/class-validator-multi-lang#custom-validation-classes\n   */\n  function isCustomValidate(validationMetadata: ValidationMetadata, typeKey: string) {\n    return (\n      isNotPropertyValidation(validationMetadata, typeKey) &&\n      validationMetadata.type === ValidationKeys.custom.type &&\n      typeKey === ValidationKeys.custom.typeKey\n    );\n  }\n\n  /**\n   * marked with @ValidateNested()\n   * https://github.com/typestack/class-validator-multi-lang#validating-nested-objects\n   */\n  function isNestedValidate(validationMetadata: ValidationMetadata, typeKey: string) {\n    return (\n      isNotPropertyValidation(validationMetadata, typeKey) &&\n      validationMetadata.type === ValidationKeys.nested.type &&\n      typeKey === ValidationKeys.nested.typeKey\n    );\n  }\n\n  function isNotPropertyValidation(validationMetadata: ValidationMetadata, typeKey: string) {\n    return validationMetadata.type === ValidationTypes[typeKey] && validator[validationMetadata.type] === undefined;\n  }\n\n  function setFieldData(\n    fieldName: string,\n    fieldDefinition: DynamicFormGroupField,\n    validationFunction: ValidatorFunctionType\n  ) {\n    /* todo: maybe not need, if enable this code, experemental mode not work\n    if (fields[fieldName] instanceof DynamicFormGroup) {\n      fields[fieldName].object = fields[fieldName].fields;\n    }*/\n\n    // Fill field data if empty\n    if (fieldDefinition.data === undefined) {\n      fieldDefinition.data = fields && fields[fieldName];\n    }\n\n    fieldDefinition.validationFunctions.push(validationFunction);\n  }\n\n  function getAllErrors(validateErrors: ShortValidationErrors, fieldName: string): string[] {\n    return Object.keys(validateErrors).filter(\n      (key: string) =>\n        // Check for nested/child errors\n        validateErrors[key][fieldName] || validateErrors[fieldName]\n    );\n  }\n}\n\n// ***************************************************************\n// Global Helper functions\n//\n\nfunction isPropertyValidatorOfType(\n  validationMetadata: ValidationMetadata,\n  fieldName: string,\n  validationMetadataType: string\n) {\n  return validationMetadata.propertyName === fieldName && validationMetadata.type === validationMetadataType;\n}\n\nfunction setObjectValueAndGetValidationErrors(\n  fieldName: string,\n  control: FormControl,\n  validatorOptions?: ValidatorOptions\n) {\n  let parent =\n    control.parent instanceof DynamicFormGroup\n      ? (control.parent as DynamicFormGroup<any>)\n      : control.parent\n      ? control.parent\n      : null;\n  let object =\n    control.parent instanceof DynamicFormGroup\n      ? (control.parent as DynamicFormGroup<any>).object\n      : control.parent\n      ? control.parent.value\n      : {};\n\n  if (object) {\n    object[fieldName] = control.value;\n  }\n  const result = (parent && parent.value && getValidateErrors(parent, object, validatorOptions)) || {};\n  parent = null;\n  object = null;\n  return result;\n}\n\nfunction getValidateErrors<T>(\n  control: FormControl | FormArray | DynamicFormGroup<T> | null | any,\n  dataToValidate: any,\n  validatorOptions?: ValidatorOptions\n): ShortValidationErrors {\n  let validateKey: any = stringHash(stringify({ dataToValidate, validatorOptions }));\n  let ctrl: { __prevValidateKey: string; __prevValidateErrors: ShortValidationErrors } | any = (control as any) || {};\n  let validatedErrors: ShortValidationErrors;\n  if (ctrl.__prevValidateKey === validateKey && ctrl.__prevValidateErrors !== undefined) {\n    // console.log('CACHED', validateKey);\n    validatedErrors = ctrl.__prevValidateErrors;\n  } else {\n    // console.log('NO CACHED', validateKey);\n    validatedErrors = transformValidationErrors(validateSync(dataToValidate, validatorOptions));\n    ctrl.__prevValidateErrors = validatedErrors;\n    ctrl.__prevValidateKey = validateKey;\n  }\n  validateKey = null;\n  ctrl = null;\n  return validatedErrors;\n}\n\nfunction getIsValidResult(isValid: boolean, validationMetadata: ValidationMetadata, errorType: ErrorPropertyName) {\n  return isValid\n    ? null\n    : {\n        [errorType]: {\n          valid: false,\n          type: validationMetadata.type,\n        },\n      };\n}\n\nconst ValidationKeys = {\n  nested: {\n    type: 'nestedValidation',\n    typeKey: 'NESTED_VALIDATION',\n  },\n  conditional: {\n    type: 'conditionalValidation',\n  },\n  custom: {\n    type: 'customValidation',\n    typeKey: 'CUSTOM_VALIDATION',\n  },\n};\n","import { AbstractControlOptions, AsyncValidatorFn, FormBuilder, ValidatorFn } from '@angular/forms';\nimport { ClassConstructor } from 'class-transformer';\nimport 'reflect-metadata';\nimport {\n  DEFAULT_CLASS_TRANSFORM_OPTIONS,\n  DEFAULT_CLASS_TRANSFORM_TO_PLAIN_OPTIONS,\n  DEFAULT_CLASS_VALIDATOR_OPTIONS,\n} from '../constants/default';\nimport { DynamicFormBuilderOptions } from '../types/dynamic-form-builder-options';\nimport {\n  DynamicFormGroupConfig,\n  isAbstractControlOptions,\n  isDynamicFormGroupConfig,\n  isLegacyOrOpts,\n} from '../types/dynamic-form-group-config';\nimport { FormModel } from '../types/form-model';\nimport { DynamicFormGroup, getClassValidators } from './dynamic-form-group';\nconst cloneDeep = require('lodash.clonedeep');\n\nexport class DynamicFormBuilder extends FormBuilder {\n  // need for createEmptyObject\n  protected emptyDynamicFormGroup = this.factoryDynamicFormGroup(Object);\n\n  constructor(protected options?: DynamicFormBuilderOptions) {\n    super();\n  }\n\n  // ******************\n  // Public API\n\n  group<TModel>(\n    factoryModel: ClassConstructor<TModel>,\n    controlsConfig?: FormModel<TModel> | DynamicFormGroupConfig | { [key: string]: any },\n    options?: AbstractControlOptions | DynamicFormGroupConfig\n  ): DynamicFormGroup<TModel> {\n    // console.time(factoryModel.toString());\n    if (!controlsConfig && !options) {\n      options = {};\n    }\n    // Process the group with the controlsConfig passed into extra instead. (What does this accomplish?)\n    if (\n      controlsConfig &&\n      (isAbstractControlOptions(controlsConfig) ||\n        isLegacyOrOpts(controlsConfig) ||\n        isDynamicFormGroupConfig(controlsConfig)) &&\n      Object.keys(options || {}).length === 0\n    ) {\n      return this.group(factoryModel, undefined, controlsConfig);\n    }\n    let extra: DynamicFormGroupConfig = cloneDeep(options) as DynamicFormGroupConfig;\n\n    let validators: ValidatorFn[] | null = null;\n    let asyncValidators: AsyncValidatorFn[] | null = null;\n    let updateOn: any;\n\n    if (extra != null) {\n      if (isAbstractControlOptions(extra)) {\n        // `extra` are `AbstractControlOptions`\n        validators = extra.validators != null ? extra.validators : null;\n        asyncValidators = extra.asyncValidators != null ? extra.asyncValidators : null;\n        updateOn = extra.updateOn != null ? extra.updateOn : undefined;\n      }\n      if (isLegacyOrOpts(extra)) {\n        // `extra` are legacy form group options\n        validators = validators || [];\n        if (extra.validator != null) {\n          validators.push(extra.validator);\n        }\n        asyncValidators = asyncValidators || [];\n        if (extra.asyncValidator != null) {\n          asyncValidators.push(extra.asyncValidator);\n        }\n      }\n    } else {\n      extra = {};\n    }\n\n    if (this.options?.classValidatorOptions && !extra.classValidatorOptions) {\n      extra.classValidatorOptions = this.options?.classValidatorOptions;\n    }\n    if (this.options?.classTransformOptions && !extra.classTransformOptions) {\n      extra.classTransformOptions = this.options?.classTransformOptions;\n    }\n    if (this.options?.classTransformToPlainOptions && !extra.classTransformToPlainOptions) {\n      extra.classTransformToPlainOptions = this.options?.classTransformToPlainOptions;\n    }\n    if (this.options?.validateAllFormFields !== undefined && extra.validateAllFormFields === undefined) {\n      extra.validateAllFormFields = this.options?.validateAllFormFields;\n    }\n    // Set default classValidatorOptions\n    if (!extra.classValidatorOptions) {\n      extra.classValidatorOptions = DEFAULT_CLASS_VALIDATOR_OPTIONS;\n    }\n    if (!extra.classTransformOptions) {\n      extra.classTransformOptions = DEFAULT_CLASS_TRANSFORM_OPTIONS;\n    }\n    if (!extra.classTransformToPlainOptions) {\n      extra.classTransformToPlainOptions = DEFAULT_CLASS_TRANSFORM_TO_PLAIN_OPTIONS;\n    }\n    if (extra.validateAllFormFields === undefined) {\n      extra.validateAllFormFields = false;\n    }\n\n    let newControlsConfig: FormModel<TModel> | undefined;\n\n    if (controlsConfig !== undefined) {\n      newControlsConfig = controlsConfig as FormModel<TModel>;\n    }\n\n    // experimental\n    if (controlsConfig === undefined) {\n      newControlsConfig = { ...this.createEmptyObject(factoryModel, { __experimental__: true }) };\n      if (newControlsConfig !== undefined) {\n        Object.keys(newControlsConfig).forEach((key) => {\n          if (canCreateGroup() && newControlsConfig) {\n            // recursively create a dynamic group for the nested object\n            newControlsConfig[key] = this.group(newControlsConfig[key].constructor, undefined, {\n              classValidatorOptions: extra.classValidatorOptions,\n              classTransformOptions: extra.classTransformOptions,\n              classTransformToPlainOptions: extra.classTransformToPlainOptions,\n              validateAllFormFields: extra.validateAllFormFields,\n              asyncValidators,\n              updateOn,\n              validators,\n            });\n          } else {\n            if (canCreateArray() && newControlsConfig) {\n              if (newControlsConfig[key][0].constructor) {\n                // recursively create an array with a group\n                newControlsConfig[key] = super.array(\n                  newControlsConfig[key].map((newControlsConfigItem) =>\n                    this.group(newControlsConfigItem.constructor, undefined, {\n                      classValidatorOptions: extra.classValidatorOptions,\n                      classTransformOptions: extra.classTransformOptions,\n                      classTransformToPlainOptions: extra.classTransformToPlainOptions,\n                      validateAllFormFields: extra.validateAllFormFields,\n                      asyncValidators,\n                      updateOn,\n                      validators,\n                    })\n                  )\n                );\n              } else {\n                // Create an array of form controls\n                newControlsConfig[key] = super.array(\n                  newControlsConfig[key].map((newControlsConfigItem) => this.control(newControlsConfigItem))\n                );\n              }\n            }\n          }\n\n          function canCreateGroup() {\n            const candidate = newControlsConfig && newControlsConfig[key];\n\n            return (\n              candidate &&\n              !Array.isArray(candidate) &&\n              candidate.constructor &&\n              typeof candidate === 'object' &&\n              (candidate.length === undefined ||\n                (candidate.length !== undefined && Object.keys(candidate).length === candidate.length))\n            );\n          }\n\n          function canCreateArray() {\n            if (Array.isArray(newControlsConfig && newControlsConfig[key]) === false) {\n              return false;\n            }\n\n            const candidate = newControlsConfig && newControlsConfig[key][0];\n\n            return (\n              candidate.constructor &&\n              typeof candidate === 'object' &&\n              (candidate.length === undefined ||\n                (candidate.length !== undefined && Object.keys(candidate).length === candidate.length))\n            );\n          }\n        });\n      }\n    }\n\n    // Remove empty\n    validators = validators && validators.filter((validator) => validator);\n    asyncValidators = asyncValidators && asyncValidators.filter((validator) => validator);\n\n    // Create an Angular group from the top-level object\n    let classValidators: any = getClassValidators<TModel>(\n      factoryModel,\n      newControlsConfig,\n      extra && extra.classValidatorOptions\n    );\n    let formGroup: any = super.group(classValidators, {\n      ...(asyncValidators || {}),\n      ...(updateOn || {}),\n      ...(validators || {}),\n    });\n\n    // Initialize the resulting group\n    const dynamicFormGroup = this.factoryDynamicFormGroup<TModel>(\n      factoryModel,\n      newControlsConfig,\n      {\n        asyncValidators,\n        updateOn,\n        validators,\n      },\n      undefined,\n      extra\n    );\n\n    // Add all angular controls to the resulting dynamic group\n    Object.keys(formGroup.controls).forEach((key) => {\n      dynamicFormGroup.addControl(key, formGroup.controls[key]);\n    });\n\n    // Add a listener to the dynamic group for value changes; on change, execute validation\n    dynamicFormGroup.subscribeToValueChanges(undefined, extra && extra.classValidatorOptions);\n\n    classValidators = null;\n    formGroup = null;\n\n    if (extra.validateAllFormFields) {\n      dynamicFormGroup.validate();\n    }\n    // console.timeEnd(factoryModel.toString());\n    return dynamicFormGroup;\n  }\n\n  protected factoryFormBuilder() {\n    return new FormBuilder();\n  }\n\n  public factoryDynamicFormGroup<TModel>(\n    factoryModel: ClassConstructor<TModel>,\n    fields?: FormModel<TModel>,\n    validatorOrOpts?: ValidatorFn | ValidatorFn[] | AbstractControlOptions | null,\n    asyncValidator?: AsyncValidatorFn | AsyncValidatorFn[] | null,\n    options?: DynamicFormGroupConfig\n  ) {\n    const formGroup = this.options?.factoryDynamicFormGroup\n      ? this.options.factoryDynamicFormGroup(factoryModel, fields, validatorOrOpts, asyncValidator, options)\n      : new DynamicFormGroup<TModel>(factoryModel, fields, validatorOrOpts, asyncValidator, options);\n    formGroup.dynamicFormBuilder = this;\n    formGroup.originalFormBuilder = this.options?.factoryFormBuilder\n      ? this.options?.factoryFormBuilder()\n      : this.factoryFormBuilder();\n    return formGroup;\n  }\n\n  // *******************\n  // Helpers\n\n  /**\n   * Recursively creates an empty object from the data provided\n   */\n  protected createEmptyObject<TModel>(factoryModel: ClassConstructor<TModel>, data = {}) {\n    let modifed = false;\n\n    let object: any = factoryModel ? this.emptyDynamicFormGroup.plainToClass(factoryModel, data) : data;\n    let fields: any = Object.keys(object);\n\n    let objectFieldNameLength: number | undefined;\n    let objectFieldName0: any;\n    fields.forEach((fieldName: any) => {\n      const object1 = object[fieldName];\n      objectFieldNameLength = object1 && Array.isArray(object1) ? object1.length : undefined;\n      if (objectFieldNameLength !== undefined) {\n        objectFieldName0 = object1[0];\n        if (objectFieldNameLength === 1 && Object.keys(objectFieldName0).length > 0 && objectFieldName0.constructor) {\n          object[fieldName] = [this.createEmptyObject(objectFieldName0.constructor)];\n        }\n\n        if (objectFieldNameLength === 0) {\n          data[fieldName] = [{}];\n          modifed = true;\n        }\n      } else {\n        data[fieldName] = undefined;\n      }\n    });\n\n    if (modifed) {\n      object = null;\n      fields = null;\n      return this.createEmptyObject(factoryModel, data);\n    }\n\n    fields = null;\n    return object;\n  }\n}\n","/*\n * Public API Surface of ngx-dynamic-form-builder\n */\n\nexport * from './index';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["cloneDeep"],"mappings":"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"}