{"version":3,"file":"file-input-accessor.mjs","sources":["../../../projects/file-input-accessor/src/lib/file-input-accessor.ts","../../../projects/file-input-accessor/src/lib/file-input-accessor.module.ts","../../../projects/file-input-accessor/src/public_api.ts","../../../projects/file-input-accessor/src/file-input-accessor.ts"],"sourcesContent":["import {Directive, ElementRef, forwardRef, HostListener, Input, Renderer2} from '@angular/core';\nimport {\n    AbstractControl,\n    AsyncValidator,\n    AsyncValidatorFn,\n    ControlValueAccessor,\n    UntypedFormControl,\n    NG_ASYNC_VALIDATORS,\n    NG_VALUE_ACCESSOR,\n    ValidationErrors\n} from '@angular/forms';\n\nimport {forkJoin, fromEventPattern, Observable, of, ReplaySubject} from 'rxjs';\nimport {first, map, shareReplay, take} from 'rxjs/operators';\nimport {ICustomFile} from './interfaces';\n\n\n@Directive({\n    selector: 'input[type=file][formControl],input[type=file][formControlName],input[type=file][ngModel]',\n    providers: [\n        {\n            provide: NG_VALUE_ACCESSOR,\n            useExisting: forwardRef(() => FileInputAccessor),\n            multi: true\n        },\n        {\n            provide: NG_ASYNC_VALIDATORS,\n            useExisting: forwardRef(() => FileInputAccessor),\n            multi: true\n        }\n    ],\n    standalone: false\n})\nexport class FileInputAccessor implements ControlValueAccessor, AsyncValidator {\n    @Input() allowedTypes: RegExp | string | string[];\n\n    @Input() size: number;\n\n    @Input() withMeta: boolean;\n\n    @Input() maxHeight: number;\n\n    @Input() maxWidth: number;\n\n    @Input() minHeight: number;\n\n    @Input() minWidth: number;\n\n    @Input()\n    set allowedExt(value: RegExp | string | string[]) {\n        if (typeof value === 'string') {\n            value = value + '$';\n        }\n        if (value instanceof Array) {\n            value = value.join('|') + '$';\n        }\n        this._allowedExt = value;\n    }\n\n    get allowedExt(): RegExp | string | string[] {\n        return this._allowedExt;\n    }\n\n    validator: AsyncValidatorFn;\n\n    private _allowedExt: RegExp | string | string[];\n\n    @HostListener('change', ['$event.target.files']) onChange = (_: any) => {};\n    @HostListener('blur') onTouched = () => {};\n\n    constructor(private _renderer: Renderer2, private _elementRef: ElementRef) {\n        this.validator = this.generateAsyncValidator();\n    }\n\n    writeValue(value: any) {\n        this._renderer.setProperty(this._elementRef.nativeElement, 'value', null);\n    }\n\n    registerOnChange(fn: (_: any) => {}): void {\n        this.onChange = this.onChangeGenerator(fn);\n    }\n\n    registerOnTouched(fn: () => {}): void {}\n\n    setDisabledState(isDisabled: boolean): void {\n        this._renderer.setProperty(this._elementRef.nativeElement, 'disabled', isDisabled);\n    }\n\n    validate(c: AbstractControl): Observable<ValidationErrors | null> | Promise<ValidationErrors | null> {\n        return this.validator(c);\n    }\n\n    /**\n     * Generator method that I used to move the code for the AsyncValidator down here so it didn't\n     * get in my way, way up there ^.\n     */\n    private generateAsyncValidator(): AsyncValidatorFn {\n        return (c: UntypedFormControl): Observable<ValidationErrors> => {\n            if (!c.value || !c.value.length || c.disabled) return of({});\n\n            const errors: ValidationErrors = {};\n            const loaders: ReplaySubject<ProgressEvent>[] = [];\n\n            for (const f of c.value) {\n                if (this.size && this.size < f.size) {\n                    f.errors.fileSize = true;\n                    errors.fileSize = true;\n                }\n\n                if (f.isImg && (this.maxWidth || this.maxHeight || this.minWidth || this.minHeight)) {\n                    loaders.push(\n                        f.imgLoadReplay\n                            .pipe(\n                                take(1),\n                                map((e: ProgressEvent) => {\n                                    const minWidthError = this.minWidth && f.imgWidth < this.minWidth;\n                                    const minHeightError = this.minHeight && f.imgHeight < this.minHeight;\n                                    const maxWidthError = this.maxWidth && f.imgWidth > this.maxWidth;\n                                    const maxHeightError = this.maxHeight && f.imgHeight > this.maxHeight;\n\n                                    if (minWidthError) {\n                                        f.errors.minWidth = true;\n                                        errors.minWidth = true;\n                                    }\n\n                                    if (minHeightError) {\n                                        f.errors.minHeight = true;\n                                        errors.minHeight = true;\n                                    }\n\n                                    if (maxWidthError) {\n                                        f.errors.maxWidth = true;\n                                        errors.maxWidth = true;\n                                    }\n\n                                    if (maxHeightError) {\n                                        f.errors.maxHeight = true;\n                                        errors.maxHeight = true;\n                                    }\n\n                                    /** will be @deprecated **/\n                                    if (minWidthError || maxWidthError) {\n                                        f.errors.imageWidth = true;\n                                        errors.imageWidth = true;\n                                    }\n\n                                    /** will be @deprecated **/\n                                    if (minHeightError || maxHeightError) {\n                                        f.errors.imageHeight = true;\n                                        errors.imageHeight = true;\n                                    }\n\n                                    return e;\n                                }))\n                    );\n                }\n\n                if (!this.allowedExt && !this.allowedTypes) continue;\n\n                const extP = this.generateRegExp(this.allowedExt);\n                const typeP = this.generateRegExp(this.allowedTypes);\n\n                if (extP && !extP.test(f.name)) {\n                    f.errors.fileExt = true;\n                    errors.fileExt = true;\n                }\n\n                if (typeP && !typeP.test(f.type)) {\n                    f.errors.fileType = true;\n                    errors.fileType = true;\n                }\n            }\n            if (loaders.length) {\n                return forkJoin(...loaders).pipe(map(() => errors));\n            }\n            return of(errors);\n        };\n    }\n\n    /**\n     * Generator method that returns an onChange handler\n     */\n    private onChangeGenerator(fn: (_: any) => {}): (_: ICustomFile[]) => void {\n        return (files: ICustomFile[]) => {\n            const fileArr: File[] = [];\n\n            for (const f of files) {\n                if (this.withMeta && FileReader) {\n                    const fr = new FileReader();\n                    this.generateFileMeta(f, fr);\n                }\n                f.errors = {};\n                fileArr.push(f);\n            }\n            fn(fileArr);\n        };\n    }\n\n    private generateRegExp(pattern: RegExp | string | string[]): RegExp | null {\n        if (!pattern) return null;\n\n        if (pattern instanceof RegExp) {\n            return new RegExp(pattern);\n        } else if (typeof pattern === 'string') {\n            return new RegExp(pattern, 'ig');\n        } else if (pattern instanceof Array) {\n            return new RegExp(`(${pattern.join('|')})`, 'ig');\n        }\n        return null;\n    }\n\n    /**\n     * The ICustomFile has a ReplaySubject property for text / image files that will emit\n     * once the file has been loaded. Might get removed later since I haven't found a use for it yet.\n     */\n    private generateFileMeta(f: ICustomFile, fr: FileReader) {\n        if (f.type.match(/text.*/)) {\n            f.textLoadReplay = this.setText(f, fr);\n        } else if (f.type.match(/image.*/)) {\n            f.imgLoadReplay = this.setImage(f, fr);\n        }\n    }\n\n    private setImage(f: ICustomFile, fr: FileReader): ReplaySubject<[Event, ProgressEvent]> {\n        f.isImg = true;\n\n        const img = new Image();\n\n        const imgLoadObs = fromEventPattern<Event>(\n            ((handler: any) => img.addEventListener('load', handler)),\n            ((handler: any) => img.removeEventListener('load', handler))\n        ).pipe(\n            take(1),\n            shareReplay()\n        );\n\n        const frLoadObs = fromEventPattern<ProgressEvent>(\n            ((handler: any) => fr.addEventListener('load', handler)),\n            ((handler: any) => fr.removeEventListener('load', handler))\n        ).pipe(\n            take(1),\n            shareReplay()\n        );\n\n        const onloadReplay = new ReplaySubject<[Event, ProgressEvent]>(1);\n        forkJoin([imgLoadObs, frLoadObs]).pipe(first()).subscribe(onloadReplay);\n\n        imgLoadObs.pipe(first()).subscribe(() => {\n            f.imgHeight = img.height;\n            f.imgWidth = img.width;\n        });\n\n        frLoadObs.pipe(first()).subscribe(() => {\n            f.imgSrc = fr.result + '';\n            img.src = fr.result + '';\n        });\n\n        fr.readAsDataURL(f);\n\n        return onloadReplay;\n    }\n\n    private setText(f: ICustomFile, fr: FileReader): ReplaySubject<ProgressEvent> {\n        const frLoadObs = fromEventPattern<ProgressEvent>(\n            ((handler: any) => fr.addEventListener('load', handler)),\n            ((handler: any ) => fr.removeEventListener('load', handler))\n        ).pipe(\n            take(1),\n            shareReplay()\n        );\n\n        const onloadReplay = new ReplaySubject<ProgressEvent>(1);\n        frLoadObs.subscribe(onloadReplay);\n\n        frLoadObs.pipe(first()).subscribe(() => {\n            f.textContent = fr.result + '';\n        });\n\n        fr.readAsText(f);\n\n        return onloadReplay;\n    }\n}\n","import {NgModule} from '@angular/core';\nimport {FileInputAccessor} from './file-input-accessor';\nimport {FormsModule, ReactiveFormsModule} from '@angular/forms';\n\n@NgModule({\n    declarations: [FileInputAccessor],\n    imports: [\n        FormsModule,\n        ReactiveFormsModule\n    ],\n    exports: [\n        FileInputAccessor,\n        FormsModule,\n        ReactiveFormsModule\n    ]\n})\nexport class FileInputAccessorModule {\n}\n","/*\n * Public API Surface of file-input-accessor\n */\n\nexport * from './lib/file-input-accessor';\nexport * from './lib/file-input-accessor.module';\nexport * from './lib/interfaces';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}