@developerwellness/angular-typed-forms
Version:
1 lines • 24.2 kB
Source Map (JSON)
{"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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"}