{"version":3,"file":"developerwellness-angular-typed-forms.mjs","sources":["../../../src/internal_api.ts","../../../src/developerwellness-angular-typed-forms.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nimport {\n  AbstractControl,\n  AbstractControlOptions,\n  AsyncValidatorFn,\n  FormArray,\n  FormControl,\n  FormGroup,\n  ValidatorFn,\n} from '@angular/forms';\n\nfunction createTypedFormArray<T, E>(\n  controls: ITypedAbstractFormControl<T>[],\n  validatorOrOpts?: ValidatorFn | ValidatorFn[] | AbstractControlOptions | null,\n  asyncValidator?: AsyncValidatorFn | AsyncValidatorFn[] | null\n): TypedFormArray<T, E> {\n  return new TypedFormArray<T, E>(controls, validatorOrOpts, asyncValidator);\n}\n\nexport interface ITypedFormArray<_T, E = any>\n  extends Iterable<AbstractControl>,\n    FormArray {\n  add(value: E | ITypedFormModel<E>);\n}\n\nclass TypedFormArrayIterator<E>\n  implements Iterator<ITypedAbstractFormControl<E>>\n{\n  private _index = 0;\n  constructor(private _formArray: TypedFormArray<any, any>) {}\n  next() {\n    if (this._index < this._formArray.length) {\n      const control = this._formArray.controls[this._index];\n      this._index++;\n      return {\n        value: control as ITypedAbstractFormControl<E>,\n        done: false as const,\n      };\n    }\n    return {\n      value: null,\n      done: true as const,\n    };\n  }\n}\n\nclass TypedFormArray<T, E = any>\n  extends FormArray\n  implements ITypedFormArray<T, E>\n{\n  constructor(\n    controls: ITypedAbstractFormControl<T>[],\n    validatorOrOpts?:\n      | ValidatorFn\n      | ValidatorFn[]\n      | AbstractControlOptions\n      | null,\n    asyncValidator?: AsyncValidatorFn | AsyncValidatorFn[] | null\n  ) {\n    super(controls, validatorOrOpts, asyncValidator);\n  }\n\n  add(value: E) {\n    super.push(createTypedControls(value));\n  }\n\n  [Symbol.iterator](): Iterator<ITypedAbstractFormControl<E>> {\n    return new TypedFormArrayIterator<E>(this);\n  }\n}\n\nfunction createTypedFormControl<T>(\n  formState: T,\n  validatorOrOpts?: ValidatorFn | ValidatorFn[] | AbstractControlOptions | null,\n  asyncValidator?: AsyncValidatorFn | AsyncValidatorFn[] | null\n): TypedFormControl<T> {\n  return new TypedFormControl<T>(formState, validatorOrOpts, asyncValidator);\n}\n\ninterface ITypedAbstractFormControl<T> extends AbstractControl {\n  value: T;\n}\n\ninterface ITypedFormControl<T> extends FormControl {\n  value: T;\n}\n\nclass TypedFormControl<T> extends FormControl implements ITypedFormControl<T> {\n  constructor(\n    formState: T,\n    validatorOrOpts?:\n      | ValidatorFn\n      | ValidatorFn[]\n      | AbstractControlOptions\n      | null,\n    asyncValidator?: AsyncValidatorFn | AsyncValidatorFn[] | null\n  ) {\n    super(formState, validatorOrOpts, asyncValidator);\n  }\n\n  setValue(\n    value: T,\n    options?: {\n      onlySelf?: boolean;\n      emitEvent?: boolean;\n      emitModelToViewChange?: boolean;\n      emitViewToModelChange?: boolean;\n    }\n  ) {\n    super.setValue(value, options);\n  }\n\n  patchValue(\n    value: T,\n    options?: {\n      onlySelf?: boolean;\n      emitEvent?: boolean;\n      emitModelToViewChange?: boolean;\n      emitViewToModelChange?: boolean;\n    }\n  ) {\n    super.patchValue(value, options);\n  }\n\n  reset(\n    formState?: T,\n    options?: {\n      onlySelf?: boolean;\n      emitEvent?: boolean;\n    }\n  ) {\n    super.reset(formState, options);\n  }\n}\n\nfunction createTypedFormGroup<T>(\n  controls: ITypedFormGroupControls<T>,\n  validatorOrOpts?: ValidatorFn | ValidatorFn[] | AbstractControlOptions | null,\n  asyncValidator?: AsyncValidatorFn | AsyncValidatorFn[] | null\n): TypedFormGroup<T> {\n  return new TypedFormGroup<T>(controls, validatorOrOpts, asyncValidator);\n}\n\nexport interface ITypedFormGroup<T> extends FormGroup {\n  controls: ITypedFormGroupControls<T>;\n  setReadonly(value: boolean);\n  getValue(): T;\n}\n\ntype ITypedFormGroupControls<T> = {\n  [P in keyof T]?: T[P] extends (infer E)[]\n    ? ITypedFormArray<T, E>\n    : T[P] extends object\n    ? ITypedFormGroup<T[P]>\n    : ITypedFormControl<T[P]>;\n};\n\nexport class TypedFormGroup<T> extends FormGroup implements ITypedFormGroup<T> {\n  controls: ITypedFormGroupControls<T>;\n  constructor(\n    controls: ITypedFormGroupControls<T>,\n    validatorOrOpts?:\n      | ValidatorFn\n      | ValidatorFn[]\n      | AbstractControlOptions\n      | null,\n    asyncValidator?: AsyncValidatorFn | AsyncValidatorFn[] | null\n  ) {\n    super(controls, validatorOrOpts, asyncValidator);\n  }\n  setReadonly(_value: boolean) {}\n  getValue(): T {\n    return this.value;\n  }\n}\n\ninterface CreateTypedControlsOptions {\n  ignoreFields: string[];\n}\n\nfunction _hasValueChanged<T>(valueA: ITypedAbstractFormControl<T>, valueB: T) {\n  const result = !deepEquals(valueA.value, valueB);\n  return result;\n}\n\nfunction _isArray(value: any): value is any[] {\n  return Array.isArray(value);\n}\n\nfunction _isObject(value: any) {\n  return !!(typeof value === 'object' && value);\n}\n\nfunction _shouldBeProcessedFactory(options: CreateTypedControlsOptions) {\n  return (value: string) => !options.ignoreFields.includes(value);\n}\n\nfunction _containsErrors(value) {\n  if (!value?.errors) return false;\n  return true;\n}\n\nfunction createTypedFormGroupControls<T>(\n  value: T,\n  options: CreateTypedControlsOptions\n): ITypedFormGroupControls<T> {\n  if (!value) return null;\n  return Object.keys(value)\n    .map((key: string) => [key, createTypedControls(value[key], options, key)])\n    .reduce(\n      (\n        formGroupControls,\n        [key, formControl]: [string, ITypedFormControl<any>]\n      ) => ({\n        ...formGroupControls,\n        [key]: formControl,\n      }),\n      {}\n    );\n}\n\nfunction _isTypedFormModel<T>(\n  formValue: T | ITypedFormModelValue<T>\n): formValue is ITypedFormModelValue<T> {\n  return (\n    _isObject(formValue) &&\n    'value' in formValue &&\n    ('validatorOrOpts' in formValue || 'asyncValidator' in formValue)\n  );\n}\n\nfunction createTypedControls<T>(\n  formValue: T | ITypedFormModel<T>,\n  options: CreateTypedControlsOptions = { ignoreFields: [] },\n  key?: string\n): ITypedAbstractFormControl<T> {\n  const shouldBeProcessed = _shouldBeProcessedFactory(options);\n  if (_isArray(formValue) && shouldBeProcessed(key)) {\n    return createTypedFormArray(\n      formValue.map((item) => createTypedControls(item, options, key))\n    );\n  } else if (\n    _isObject(formValue) &&\n    !_isTypedFormModel(formValue) &&\n    shouldBeProcessed(key)\n  ) {\n    return createTypedFormGroup(\n      createTypedFormGroupControls(formValue, options)\n    );\n  } else {\n    return _isTypedFormModel(formValue)\n      ? createTypedFormControl(\n          formValue.value,\n          formValue.validatorOrOpts,\n          formValue.asyncValidator\n        )\n      : createTypedFormControl(formValue);\n  }\n}\n\nfunction removeFormArrayControls<T>(\n  formArray: ITypedFormArray<T>,\n  formValue: T[]\n) {\n  forEach(new Array(formArray.length - formValue.length), () => {\n    formArray.removeAt(0, { emitEvent: false });\n  });\n}\n\nfunction updateTypedFormArray<T>(\n  formArray: ITypedFormArray<T, any>,\n  formValue: T[],\n  options: CreateTypedControlsOptions = { ignoreFields: [] }\n) {\n  if (formArray.length > formValue.length) {\n    removeFormArrayControls(formArray, formValue);\n    forEach(formArray.controls, (item, index) => {\n      updateTypedFormControls(\n        item as ITypedAbstractFormControl<T>,\n        formValue[index],\n        options\n      );\n    });\n  } else {\n    forEach(formValue, (item, index) => {\n      if (formArray.controls[index]) {\n        updateTypedFormControls(\n          formArray.controls[index] as ITypedAbstractFormControl<T>,\n          item,\n          options\n        );\n      } else {\n        //Should be fixed with https://github.com/angular/angular/issues/20439#issuecomment-763976919\n        (formArray as ITypedFormArray<T>).push(\n          createTypedControls(item, options),\n          { emitEvent: false }\n        );\n      }\n    });\n  }\n}\n\nfunction updateTypedFormGroup<T>(\n  formGroup: ITypedFormGroup<T>,\n  formValue: T,\n  options: CreateTypedControlsOptions = { ignoreFields: [] }\n) {\n  if (!formValue) {\n    Object.keys(formGroup.value)\n      .filter(\n        (key) =>\n          formGroup &&\n          (formGroup as ITypedFormGroup<T>).contains &&\n          (formGroup as ITypedFormGroup<T>).contains(key)\n      )\n      .map((key) => formGroup.get(key))\n      .forEach((itemControl) => {\n        itemControl.patchValue(null, { emitEvent: false });\n      });\n  } else {\n    Object.keys(formValue)\n      .filter(\n        (key) =>\n          formGroup &&\n          (formGroup as ITypedFormGroup<T>).contains &&\n          (formGroup as ITypedFormGroup<T>).contains(key)\n      )\n      .map((key) => [formValue[key], formGroup.get(key), key])\n      .forEach(([item, itemControl, key]) =>\n        updateTypedFormControls(itemControl, item, options, key)\n      );\n    Object.keys(formValue)\n      .filter(\n        (key) =>\n          formGroup &&\n          (formGroup as ITypedFormGroup<T>).contains &&\n          !(formGroup as ITypedFormGroup<T>).contains(key)\n      )\n      .map((key) => [key, formValue[key]])\n      .forEach(([key, item]) =>\n        (formGroup as ITypedFormGroup<T>).addControl(\n          key,\n          createTypedControls(item, options, key),\n          {\n            emitEvent: false,\n          }\n        )\n      );\n  }\n}\n\nfunction updateTypedFormControl<T>(\n  formControl: ITypedFormControl<T>,\n  formValue: T\n) {\n  if (_containsErrors(formValue)) {\n    const { errors } = formValue as any;\n    formControl.setErrors(errors);\n  } else {\n    formControl.patchValue(formValue, { emitEvent: false });\n    formControl.setErrors(null);\n  }\n}\n\nfunction updateTypedFormControls<T>(\n  formControl: ITypedAbstractFormControl<T>,\n  formValue: T | T[],\n  options: CreateTypedControlsOptions = { ignoreFields: [] },\n  key?: string\n) {\n  const _shouldBeIgnored = _shouldBeProcessedFactory(options);\n  if (\n    _isArray(formValue || formControl.value) &&\n    _shouldBeIgnored(key) &&\n    _hasValueChanged(formControl, formValue)\n  ) {\n    updateTypedFormArray(\n      formControl as ITypedFormArray<T>,\n      formValue as T[],\n      options\n    );\n  } else if (\n    _isObject(formControl.value || formControl.value) &&\n    _shouldBeIgnored(key) &&\n    _hasValueChanged(formControl, formValue) &&\n    (formControl as ITypedFormGroup<T>)?.controls\n  ) {\n    updateTypedFormGroup(formControl as ITypedFormGroup<T>, formValue, options);\n  } else if (_hasValueChanged(formControl, formValue)) {\n    updateTypedFormControl(formControl as ITypedFormControl<T>, formValue);\n  }\n}\n\nconst FORM_GROUP_PROP = 'formGroup';\nconst VALUE_PROP = 'value';\n\ntype ITypedFormBuilderOptions = CreateTypedControlsOptions;\ntype ITypedFormModelValue<T> = {\n  value: T;\n  validatorOrOpts?: ValidatorFn | ValidatorFn[] | AbstractControlOptions | null;\n  asyncValidator?: AsyncValidatorFn | AsyncValidatorFn[] | null;\n};\nexport type ITypedFormModel<T> = {\n  [P in keyof T]: T[P] | ITypedFormModelValue<T[P]> | ITypedFormModel<T[P]>;\n};\n\nexport function typedFormBuilderFactory<T extends object>(\n  defaultValue: ITypedFormModel<T>,\n  options: ITypedFormBuilderOptions = { ignoreFields: [] }\n): ITypedFormBuilder<T> | null {\n  if (!defaultValue) return null;\n  const formGroup = createTypedControls<T>(defaultValue, options);\n  const controlValueProxyHandler = {\n    get: (target, prop) => {\n      if (target[prop] === undefined) return undefined;\n      if (prop != FORM_GROUP_PROP) {\n        if (Array.isArray(target[prop])) {\n          return formGroup.get(prop);\n        } else if (_isObject(target[prop])) {\n          return new Proxy(target[prop], controlValueProxyHandler);\n        }\n        return formGroup.get(prop);\n      }\n      return target[prop];\n    },\n    set: (target, prop, value) => {\n      if (prop !== FORM_GROUP_PROP) {\n        if (prop === VALUE_PROP) {\n          updateTypedFormControls(formGroup, value, options);\n        } else {\n          updateTypedFormControls(\n            formGroup.get(prop) as ITypedAbstractFormControl<T>,\n            value,\n            options\n          );\n        }\n      } else {\n        target[prop] = value;\n      }\n      return true;\n    },\n  };\n  const formBuilder = new Proxy(\n    {\n      value: defaultValue,\n    },\n    controlValueProxyHandler\n  );\n  formBuilder.formGroup = formGroup;\n  return formBuilder;\n}\n\nexport const TYPED_FORM_BUILDER: InjectionToken<ITypedFormBuilder<any>> =\n  new InjectionToken<ITypedFormBuilder<any>>('TYPED_FORM_BUILDER');\n\nfunction forEach<T>(\n  elements: T[],\n  callback: (item: T, index: number) => any,\n  returnIf?: any\n): boolean | void {\n  let result = true;\n  const length = elements.length;\n  for (let index = 0; index < length; index++) {\n    result = callback(elements[index], index);\n    if (!!returnIf && returnIf(result)) {\n      return result;\n    }\n  }\n  if (returnIf) {\n    return result;\n  }\n  return false;\n}\n\nfunction deepEquals(objectA, objectB) {\n  if (\n    (objectA === null || objectA === undefined) &&\n    (objectB === null || objectB === undefined)\n  )\n    return true;\n  if (!objectA || !objectB) return false;\n  if (typeof objectA !== 'object' && typeof objectB !== 'object') {\n    return objectA === objectB;\n  }\n  if (Array.isArray(objectA) && Array.isArray(objectB)) {\n    if (objectA.length !== objectB.length) return false;\n    return forEach(\n      objectA,\n      function (elementA, index) {\n        return deepEquals(elementA, objectB[index]);\n      },\n      function (result) {\n        return !result;\n      }\n    );\n  }\n  if (typeof objectA === 'object' && typeof objectB === 'object') {\n    if (Object.keys(objectA).length === 0 && Object.keys(objectA).length === 0)\n      return true;\n    return forEach(\n      Object.keys(objectA),\n      function (objectAKey) {\n        if (typeof objectB[objectAKey] !== undefined) {\n          return deepEquals(objectA[objectAKey], objectB[objectAKey]);\n        }\n        return false;\n      },\n      function (result) {\n        return !result;\n      }\n    );\n  }\n  return false;\n}\n\ntype ITypedFormBuilderValue<T> = {\n  [P in keyof T]?: T[P] extends (infer E)[]\n    ? ITypedFormArray<T[P], E> | T[P]\n    : T[P] extends object\n    ? ITypedFormBuilderValue<T[P]>\n    : ITypedFormControl<T[P]> | T[P];\n};\n\nexport interface ITypedFormBuilder<T> {\n  value: ITypedFormBuilderValue<T>;\n  formGroup: ITypedFormGroup<T>;\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}