{"version":3,"file":"ngx-file-upload-core.mjs","sources":["../../../projects/core/src/lib/core.ts","../../../projects/core/src/lib/api/src/upload.ts","../../../projects/core/src/lib/upload/src/upload.form.ts","../../../projects/core/src/lib/upload/src/upload.request.model.ts","../../../projects/core/src/lib/upload/src/upload.request.ts","../../../projects/core/src/lib/upload/src/upload.file.ts","../../../projects/core/src/lib/upload/src/upload.factory.ts","../../../projects/core/src/lib/upload/src/upload.queue.ts","../../../projects/core/src/lib/upload/src/upload.storage.ts","../../../projects/core/src/lib/validation/src/grouped.validator.ts","../../../projects/core/src/lib/validation/src/and.validator.ts","../../../projects/core/src/lib/validation/src/or.validator.ts","../../../projects/core/src/lib/validation/src/validation.builder.ts","../../../projects/core/src/public-api.ts","../../../projects/core/src/ngx-file-upload-core.ts"],"sourcesContent":["import { NgModule } from \"@angular/core\";\nimport { provideHttpClient, withInterceptorsFromDi } from \"@angular/common/http\";\n\n@NgModule({ imports: [], providers: [provideHttpClient(withInterceptorsFromDi())] })\nexport class NgxFileUploadCoreModule {}\n","import type { Observable } from 'rxjs';\nimport type { NgxFileUploadValidation } from '..';\nimport type { NgxFileUploadForm } from '../../upload/src/upload.form';\nimport type { NgxFileUploadValidationErrors } from './validation';\nimport type { HttpErrorResponse, HttpResponse } from '@angular/common/http';\n\nexport enum NgxFileUploadState {\n  INVALID = 0,\n  IDLE = 1,\n  START = 2,\n  PENDING = 3,\n  CONNECT = 4,\n  PROGRESS = 5,\n  CANCELED = 6,\n  COMPLETED = 7\n}\n\nexport interface NgxFileUploadControl {\n  retry(): void;\n\n  start(): void;\n\n  stop(): void;\n\n  remove(): void;\n}\n\nexport interface UploadValidation {\n  errors: NgxFileUploadValidationErrors | null;\n}\n\nexport interface INgxFileUploadFile {\n  readonly raw: File;\n\n  readonly size: number;\n\n  readonly name: string;\n\n  readonly type: string;\n\n  validationErrors: NgxFileUploadValidationErrors | null;\n}\n\nexport interface INgxFileUploadRequestData {\n  readonly files: INgxFileUploadFile[];\n\n  readonly size: number;\n\n  readonly name: string[];\n\n  response: HttpResponse<unknown> | HttpErrorResponse | null;\n\n  state: NgxFileUploadState;\n\n  uploaded: number;\n\n  validationErrors: NgxFileUploadValidationErrors | null;\n\n  progress: number;\n\n  hasError: boolean;\n}\n\nexport interface INgxFileUploadRequestModel extends INgxFileUploadRequestData {\n  toJson(): INgxFileUploadRequestData;\n}\n\nexport declare type BeforeStartFn = (request: INgxFileUploadRequest) => boolean | Observable<boolean> | Promise<boolean>;\n\nexport interface INgxFileUploadRequest {\n  requestId: string;\n\n  /**\n   * returns observable which notify if file upload state\n   * has been changed\n   */\n  readonly change: Observable<INgxFileUploadRequestData>;\n\n  readonly data: INgxFileUploadRequestData;\n\n  readonly destroyed: Observable<boolean>;\n\n  readonly form: NgxFileUploadForm;\n\n  url: string;\n\n  state: NgxFileUploadState;\n\n  /**\n   * @description add additional headers to request\n   */\n  addHeader(name: string, value: string): void;\n\n  /**\n   * @description gets header from request\n   */\n  getHeader(name: string): string | undefined | AuthorizationHeader;\n\n  /**\n   * @description remove additional headers from request\n   */\n  removeHeader(name: string): void;\n\n  beforeStart(hook: BeforeStartFn): void;\n\n  destroy(): void;\n\n  /**\n   * cancel current file upload, this will complete change subject\n   */\n  cancel(): void;\n\n  /**\n   * return true if upload was not completed since the server\n   * sends back an error response\n   */\n  hasError(): boolean;\n\n  isIdle(): boolean;\n\n  /**\n   * returns true if validators are set and upload not validated\n   */\n  isInvalid(): boolean;\n\n  isProgress(): boolean;\n\n  isPending(): boolean;\n\n  isCompleted(ignoreError?: boolean): boolean;\n\n  isCanceled(): boolean;\n\n  removeInvalidFiles(): void;\n\n  retry(): void;\n\n  start(): void;\n}\n\nexport interface NgxFileUploadStorageConfig {\n  /**\n   * max count of uploads at once, set to -1 for no limit\n   */\n  concurrentUploads: number;\n  /**\n   * if set to true it will automatically starts uploads\n   */\n  autoStart?: boolean;\n  /**\n   * if set it will remove success full completed uploads after a specific\n   * amount of time.\n   */\n  removeCompleted?: number;\n}\n\nexport interface AuthorizationHeader {\n  key?: string;\n  token: string;\n}\n\nexport interface NgxFileUploadHeaders {\n  [key: string]: string | AuthorizationHeader | undefined;\n  authorization?: string | AuthorizationHeader;\n}\n\nexport interface NgxFileuploadFormControl {\n  validator?: NgxFileUploadValidation<NgxFileuploadFormControl>;\n  value?: unknown;\n  valid: boolean;\n  errors: NgxFileUploadValidationErrors | null;\n  /**\n   * @description form control is dirty, validator, value changed\n   */\n  dirty: boolean;\n  /**\n   * @description if set to false form control will not attached to form-data or headers. Default is true.\n   * This becomes useful is this formcontrol is only used internal and we need some meta data inside beforeStartFn.\n   *\n   * @example\n   *\n   * ```\n   * @todo\n   * ```\n   */\n  send?: boolean;\n}\n\nexport interface NgxFileuploadFormGroup {\n  [key: string]: NgxFileuploadFormControl;\n}\n\nexport declare type NgxFileUploadFormControlOptions = Pick<NgxFileuploadFormControl, 'send' | 'validator' | 'value'>\n\n/**\n * Upload Options\n */\nexport interface NgxFileUploadOptions {\n  /**\n   * url which should used to upload file\n   */\n  url: string;\n  /**\n   * @description\n   */\n  headers?: NgxFileUploadHeaders;\n  /**\n   * @todo docs\n   */\n  formControls?: Record<string, NgxFileUploadFormControlOptions>;\n  /**\n   * @description only used if transferMethod is body, so form control names will attached\n   * to headers. If formControlNameToKebabCase is set to true name will transformed.\n   *\n   * default is false\n   *\n   * @example\n   *\n   * default behavior\n   *\n   * ```\n   * const config: NgxFileUploadOptions = {\n   *   transferMethod: 'body',\n   *   formControls: {\n   *     userId: {\n   *       value: 10\n   *     }\n   *   }\n   * }\n   * // header sent userId: 10\n   * ```\n   *\n   * @example\n   *\n   * formControlNameToKebabCase set to true\n   *\n   * ```\n   * const config: NgxFileUploadOptions = {\n   *   transferMethod: 'body',\n   *   formControlNameToKebabCase: true,\n   *   formControls: {\n   *     userId: {\n   *       value: 10,\n   *     }\n   *   }\n   * }\n   * // header sent User-Id: 10\n   * ```\n   */\n  formControlNameToKebabCase?: boolean;\n  /**\n   * @description how the file will be send. If set to formdata it will create a FormData Object and attach file to files (good for multiple files at once)\n   * Otherwise it will send file as body directly to server.\n   *\n   * Default is formdata.\n   */\n  transferMethod?: 'body' | 'formdata';\n  /**\n   * if set to true will include HTTP-only cookies with the request\n   */\n  withCredentials?: boolean;\n}\n","import { BehaviorSubject, map } from 'rxjs';\nimport {\n  NgxFileUploadState,\n  type NgxFileUploadFormControlOptions,\n  type NgxFileUploadValidation,\n  type NgxFileUploadValidationErrors,\n  type NgxFileuploadFormControl,\n} from '../../api';\nimport type { NgxFileUploadRequest } from './upload.request';\n\n\nexport class NgxFileUploadForm {\n  private readonly formControls: Map<string, NgxFileuploadFormControl> = new Map();\n\n  private readonly formErrors = new BehaviorSubject<NgxFileUploadValidationErrors | null>(null);\n\n  get errors(): NgxFileUploadValidationErrors | null {\n    return this.formErrors.getValue();\n  }\n\n  validationState = this.formErrors.pipe(map((errors) => (errors === null ? 'VALID' : 'INVALID')));\n\n  constructor(private readonly request: NgxFileUploadRequest) {}\n\n  /**\n   * @description\n   */\n  addControl(name: string, ctrl: NgxFileUploadFormControlOptions) {\n    if (this.request.state > NgxFileUploadState.IDLE) {\n      return;\n    }\n\n    const control: NgxFileuploadFormControl = {\n      errors: null,\n      valid: true,\n      dirty: true,\n      send: true,\n      ...ctrl\n    };\n\n    this.formControls.set(name, control);\n    this.validate();\n  }\n\n  controls() {\n    return this.formControls.entries();\n  }\n\n  /**\n   * @description\n   */\n  getControl(ctrl: string): NgxFileuploadFormControl | undefined {\n    return this.formControls.get(ctrl);\n  }\n\n  /**\n   * @description\n   */\n  getRawValue(): Record<string, unknown> {\n    const raw: Record<string, unknown> = {};\n    for (const [name, ctrl] of this.formControls.entries()) {\n      raw[name] = ctrl.value;\n    }\n    return raw;\n  }\n\n  /**\n   * @description\n   */\n  removeControl(key: string): void {\n    if (this.request.state > NgxFileUploadState.IDLE) {\n      return;\n    }\n\n    this.formControls.delete(key);\n    this.validate();\n  }\n\n  /**\n   * @description\n   * @param formCtrlName\n   * @param validator\n   * @returns\n   */\n  addValidator(formCtrlName: string, validator: NgxFileUploadValidation<NgxFileuploadFormControl>) {\n    const control = this.formControls.get(formCtrlName);\n    if (!control) {\n      return;\n    }\n\n    const updated: NgxFileuploadFormControl = { ...control, dirty: true, validator };\n    this.formControls.set(formCtrlName, updated);\n    this.validate();\n  }\n\n  // removeValidator(formCtrlName: string, validator: NgxFileUploadValidation<NgxFileuploadFormControl>) {}\n\n  /**\n   * @description\n   */\n  setValue(ctrl: string, value: unknown) {\n    const control = this.formControls.get(ctrl);\n    if (!control) {\n      return;\n    }\n\n    const updated = { ...control, dirty: true, value };\n    this.formControls.set(ctrl, updated);\n    this.validate();\n  }\n\n  /**\n   * @description\n   */\n  private validate() {\n    let formErrors: NgxFileUploadValidationErrors = {};\n\n    for (const [name, ctrl] of this.formControls.entries()) {\n      const validator = ctrl.validator;\n\n      if (!validator) continue;\n\n      let errors: NgxFileUploadValidationErrors | null = ctrl.errors;\n      if (ctrl.dirty === true) {\n        errors = 'validate' in validator ? validator.validate(ctrl) : validator(ctrl);\n        this.formControls.set(name, { ...ctrl, dirty: false, errors });\n      }\n\n      if (errors !== null) {\n        formErrors = {\n          ...formErrors,\n          ...(errors !== null ? { [name]: errors } : {}),\n        };\n      }\n    }\n\n    this.formErrors.next(Object.keys(formErrors).length > 0 ? formErrors : null);\n  }\n}\n","import type { HttpErrorResponse, HttpResponse } from '@angular/common/http';\nimport {\n  NgxFileUploadState,\n  type INgxFileUploadFile,\n  type INgxFileUploadRequestData,\n  type INgxFileUploadRequestModel,\n  type NgxFileUploadValidationErrors,\n} from '../../api';\nimport type { NgxFileUploadFile } from './upload.file';\n\n/**\n * Represents an upload request, and store the data inside\n */\nexport class NgxFileUploadRequestModel implements INgxFileUploadRequestModel {\n\n  private errors: NgxFileUploadValidationErrors | null = null;\n\n  constructor(\n    private readonly filesToUpload: INgxFileUploadFile | INgxFileUploadFile[],\n  ) { }\n\n  get files(): NgxFileUploadFile[] {\n    return Array.isArray(this.filesToUpload) ? this.filesToUpload : [this.filesToUpload];\n  }\n\n  get name(): string[] {\n    return this.files.map((file) => file.name);\n  }\n\n  get size(): number {\n    return this.files.reduce((size, file) => size + file.size, 0);\n  }\n\n  get validationErrors(): NgxFileUploadValidationErrors | null {\n    return this.errors;\n  }\n\n  response: HttpResponse<unknown> | HttpErrorResponse | null = null;\n\n  state: NgxFileUploadState = NgxFileUploadState.IDLE;\n\n  uploaded = 0;\n\n  progress = 0;\n\n  hasError = false;\n\n  toJson(): INgxFileUploadRequestData {\n    return {\n      files: this.files,\n      hasError: this.hasError,\n      name: this.name,\n      progress: this.progress,\n      response: this.response,\n      size: this.size,\n      state: this.state,\n      uploaded: this.uploaded,\n      validationErrors: this.validationErrors,\n    };\n  }\n}\n","import { HttpClient, HttpErrorResponse, HttpEvent, HttpEventType, HttpHeaders, HttpProgressEvent, HttpResponse } from '@angular/common/http';\nimport { Observable, Subject, concat, from, isObservable, merge, of } from 'rxjs';\nimport { bufferCount, distinctUntilChanged, filter, map, takeUntil, tap } from 'rxjs/operators';\nimport {\n  INgxFileUploadRequest,\n  INgxFileUploadRequestData,\n  NgxFileUploadOptions,\n  NgxFileUploadState,\n  type BeforeStartFn,\n  type NgxFileUploadHeaders,\n  type NgxFileUploadValidationErrors,\n} from '../../api';\nimport type { NgxFileUploadFile } from './upload.file';\nimport { NgxFileUploadForm } from './upload.form';\nimport { NgxFileUploadRequestModel } from './upload.request.model';\n\nexport class NgxFileUploadRequest implements INgxFileUploadRequest {\n  private cancel$: Subject<boolean> = new Subject();\n  private change$: Subject<INgxFileUploadRequestData> = new Subject();\n  private destroyed$: Subject<boolean> = new Subject();\n  private totalSize = -1;\n\n  private options: NgxFileUploadOptions = {\n    url: '',\n    withCredentials: false,\n    transferMethod: 'formdata',\n    formControlNameToKebabCase: false,\n  };\n\n  private model: NgxFileUploadRequestModel;\n\n  private readonly uploadForm: NgxFileUploadForm;\n\n  private hooks: { beforeStart: BeforeStartFn[] } = { beforeStart: [] };\n\n  private headers: NgxFileUploadHeaders = {};\n\n  private uploadUrl: string = '';\n\n  get change(): Observable<INgxFileUploadRequestData> {\n    return this.change$.asObservable();\n  }\n\n  get destroyed(): Observable<boolean> {\n    return this.destroyed$.asObservable();\n  }\n\n  get data(): INgxFileUploadRequestData {\n    return this.model.toJson();\n  }\n\n  set state(state: NgxFileUploadState) {\n    const prevState = this.state;\n    this.model.state = state;\n\n    if (prevState !== state) {\n        this.notifyObservers();\n    }\n  }\n\n  get state(): NgxFileUploadState {\n    return this.model.state;\n  }\n\n  get form(): NgxFileUploadForm {\n    return this.uploadForm;\n  }\n\n  set url(url: string) {\n    if (this.state <= NgxFileUploadState.IDLE) {\n      this.uploadUrl = url;\n    }\n  }\n\n  get url(): string {\n    return this.uploadUrl;\n  }\n\n  requestId: string = '';\n\n  constructor(private http: HttpClient, files: NgxFileUploadFile | NgxFileUploadFile[], options: NgxFileUploadOptions) {\n    // additional form data hinzufuegen muessen\n    this.options = { ...this.options, ...options };\n    this.model = new NgxFileUploadRequestModel(files);\n\n    this.uploadForm = this.createForm();\n    this.state = this.isInvalid() ? NgxFileUploadState.INVALID : NgxFileUploadState.IDLE;\n\n    this.headers = structuredClone(this.options.headers ?? {});\n    this.url = this.options.url;\n\n    /**\n     * subscribe to validation state change for form, if state changed update validility for uploda request\n     */\n    this.uploadForm.validationState.pipe(takeUntil(this.destroyed$), distinctUntilChanged()).subscribe(() => this.updateValidility());\n  }\n\n  getHeader(name: string) {\n    return this.headers[name];\n  }\n\n  /**\n   * @description add additional headers to request\n   */\n  addHeader(name: string, value: string) {\n    if (this.state !== NgxFileUploadState.IDLE) {\n      return;\n    }\n    this.headers[name] = value;\n  }\n\n  /**\n   * @description remove additional headers from request\n   */\n  removeHeader(name: string) {\n    if (this.state !== NgxFileUploadState.IDLE) {\n      return;\n    }\n    delete this.headers[name];\n  }\n\n  beforeStart(hook: BeforeStartFn) {\n    this.hooks.beforeStart = [...this.hooks.beforeStart, hook];\n  }\n\n  /**\n   * cancel current file upload, this will complete change subject\n   */\n  cancel() {\n    if (this.isProgress() || this.isPending()) {\n      this.model.state = NgxFileUploadState.CANCELED;\n      this.notifyObservers();\n      this.cancel$.next(true);\n    }\n  }\n\n  destroy() {\n    this.finalizeUpload();\n    this.destroyed$.next(true);\n    this.destroyed$.complete();\n  }\n\n  /**\n   * return true if upload was not completed since the server\n   * sends back an error response\n   */\n  hasError(): boolean {\n    return this.model.response instanceof HttpErrorResponse;\n  }\n\n  isCompleted(ignoreError = false): boolean {\n    let isCompleted = this.isRequestCompleted();\n    isCompleted = isCompleted && (ignoreError || !this.hasError());\n    isCompleted = isCompleted || this.model.state === NgxFileUploadState.CANCELED;\n    return isCompleted;\n  }\n\n  isCanceled(): boolean {\n    return this.model.state === NgxFileUploadState.CANCELED;\n  }\n\n  isInvalid(): boolean {\n    return this.state === NgxFileUploadState.INVALID || this.model.validationErrors !== null;\n  }\n\n  isProgress(): boolean {\n    return this.state === NgxFileUploadState.PROGRESS || this.state === NgxFileUploadState.START;\n  }\n\n  isPending(): boolean {\n    return this.state === NgxFileUploadState.PENDING;\n  }\n\n  isIdle(): boolean {\n    return this.state === NgxFileUploadState.IDLE;\n  }\n\n  isRequestCompleted() {\n    return this.state === NgxFileUploadState.COMPLETED;\n  }\n\n  /**\n   * restart download again\n   * reset state, and reset errors\n   */\n  retry() {\n    if ((this.isRequestCompleted() && this.hasError()) || this.isCanceled()) {\n      this.model = new NgxFileUploadRequestModel(this.model.files);\n      this.start();\n    }\n  }\n\n  /**\n   * start file upload\n   */\n  start() {\n    if (!this.isIdle() && !this.isPending()) {\n      return;\n    }\n\n    this.beforeStartHook$.pipe(filter((isAllowedToStart) => isAllowedToStart)).subscribe(() => {\n      this.state = NgxFileUploadState.START;\n    });\n  }\n\n  /**\n   * @description internal use only, before start hooks can become async if they return simple\n   * boolean value or a promise. A boolean Value will turned into a Promise into an observable.\n   */\n  run() {\n    this.startUploadRequest().subscribe({\n      next: (event: HttpEvent<string>) => this.handleHttpEvent(event),\n      error: (error: HttpErrorResponse) => this.handleError(error),\n    });\n  }\n\n  removeInvalidFiles() {\n    if (this.state !== NgxFileUploadState.INVALID) {\n      return;\n    }\n\n    const files = this.data.files.filter((file) => file.validationErrors === null);\n\n    if (files.length) {\n      this.model = new NgxFileUploadRequestModel(files);\n      this.state = NgxFileUploadState.IDLE;\n    } else {\n      this.destroy();\n    }\n  }\n\n  /**\n   * @description updates validility for upload request\n   */\n  private updateValidility() {\n    if (this.state > NgxFileUploadState.IDLE) {\n      return;\n    }\n\n    let validationErrors: Record<string, unknown> = {};\n\n    // validation errors file\n    validationErrors = this.model.files.reduce<NgxFileUploadValidationErrors>((errors, file) => {\n      if (file.validationErrors) {\n        return {\n          ...errors,\n          [file.name]: { ...file.validationErrors },\n        };\n      }\n      return errors;\n    }, {});\n\n    // validation errors form\n    if (this.form.errors !== null) {\n      validationErrors = { ...validationErrors, ...this.form.errors };\n    }\n\n    const errors = Object.keys(validationErrors).length ? validationErrors : null;\n    if (errors === null) {\n      this.state = NgxFileUploadState.IDLE;\n      return;\n    }\n\n    this.state = NgxFileUploadState.INVALID;\n  }\n\n  /**\n   * call hooks in order, see playground\n   * @see https://rxviz.com/v/58GkkYv8\n   */\n  private get beforeStartHook$(): Observable<boolean> {\n    const initialState = this.model.state;\n    let hook$: Observable<boolean> = of(true);\n    if (this.hooks.beforeStart.length) {\n      const hooks = this.hooks.beforeStart.map((beforeStartFn) => {\n        let hook = beforeStartFn(this);\n        if (!isObservable(hook)) {\n          hook = from(Promise.resolve(hook));\n        }\n        return hook;\n      });\n\n      // push hooks into a stream so everyone is called\n      hook$ = concat(...hooks).pipe(\n        bufferCount(this.hooks.beforeStart.length),\n        map((result) => result.every((isAllowed) => isAllowed)),\n        tap(() => (this.model.state !== initialState ? this.notifyObservers() : void 0)),\n      );\n    }\n    return hook$;\n  }\n\n  private createForm(): NgxFileUploadForm {\n    const form = new NgxFileUploadForm(this);\n    for (const [name, ctrlOptions] of Object.entries(this.options.formControls ?? {})) {\n      form.addControl(name, ctrlOptions);\n    }\n    return form;\n  }\n\n  /**\n   * build form data and send request to server\n   */\n  private startUploadRequest(): Observable<HttpEvent<string>> {\n    const uploadBody = this.createUploadBody();\n    const headers = this.createUploadHeaders();\n\n    /**\n     * save size on start so we do not call it every time\n     * since this running a reduce loop, and the size will not change\n     * anymore after we start it\n     */\n    this.totalSize = this.model.size;\n\n    return this.http\n      .post<string>(this.url, uploadBody, {\n        reportProgress: true,\n        withCredentials: this.options.withCredentials,\n        observe: 'events',\n        headers,\n      })\n      .pipe(takeUntil(merge(this.cancel$, this.destroyed$)));\n  }\n\n  /**\n   * create upload body which will should be send\n   */\n  private createUploadBody(): FormData | File {\n    if (this.options.transferMethod === 'formdata') {\n      const formData = new FormData();\n      this.model.files.forEach((file) => {\n        formData.append('files', file.raw, file.name);\n      });\n\n      // add form controls\n      for (const [name, ctrl] of this.form.controls()) {\n        if (ctrl.send === false) {\n          continue;\n        }\n        formData.append(name, JSON.stringify(ctrl.value));\n      }\n      return formData;\n    }\n\n    // we have to add header how the file is named\n    // since transfer method is body we can only upload 1 file\n    return this.model.files[0].raw;\n  }\n\n  /**\n   * create upload request headers\n   */\n  private createUploadHeaders(): HttpHeaders {\n    let headers = new HttpHeaders();\n\n    /** if transfer method is body send all form data through headers */\n    if (this.options.transferMethod === 'body') {\n      for (const [name, ctrl] of this.form.controls()) {\n        if (ctrl.send === false) {\n          continue;\n        }\n\n        let headerName = name;\n        if (this.options.formControlNameToKebabCase) {\n          headerName = name\n            // transform fooBar to Foo-Bar-\n            .replace(/(?:(\\w)([^A-Z]+))/g, (_full, first, rest) => {\n              return first.toUpperCase().concat(rest, '-');\n            })\n            // remove trailing -\n            .slice(0, -1);\n        }\n        headers = headers.append(headerName, JSON.stringify(ctrl.value));\n      }\n    }\n\n    if (this.headers.authorization) {\n      headers = this.createAuthroizationHeader(headers);\n    }\n\n    /** add additional headers which should send */\n    Object.keys(this.headers)\n      .filter((header) => header !== 'authorization')\n      .forEach((header) => (headers = headers.append(header, this.headers[header] as string)));\n\n    return headers;\n  }\n\n  /**\n   * create authorization header which will send\n   */\n  private createAuthroizationHeader(headers: HttpHeaders): HttpHeaders {\n    const authHeader = this.headers.authorization;\n    if (authHeader) {\n      if (typeof authHeader === 'string') {\n        headers = headers.append('Authorization', `Bearer ${authHeader}`);\n      } else {\n        headers = headers.append('Authorization', `${authHeader.key ?? 'Bearer'} ${authHeader.token}`);\n      }\n    }\n    return headers;\n  }\n\n  /**\n   * request responds with an error\n   */\n  private handleError(response: HttpErrorResponse) {\n    this.model.state = NgxFileUploadState.COMPLETED;\n    this.model.response = response;\n    this.model.hasError = true;\n    this.notifyObservers();\n  }\n\n  /**\n   * handle all http events\n   */\n  private handleHttpEvent(event: HttpEvent<string>) {\n    switch (event.type) {\n      case HttpEventType.UploadProgress:\n        this.handleProgress(event);\n        break;\n\n      case HttpEventType.Response:\n        this.handleResponse(event);\n        break;\n    }\n  }\n\n  /**\n   * handle http progress event\n   */\n  private handleProgress(event: HttpProgressEvent) {\n    const loaded = event.loaded;\n    const progress = (loaded * 100) / this.totalSize;\n    this.model.state = NgxFileUploadState.PROGRESS;\n\n    /**\n     * for some reason the upload is sometimes a bit bigger then the files,\n     * pretty sure this happens because of headers which are send makes the request a bit\n     * bigger\n     */\n    this.model.uploaded = Math.min(loaded, this.totalSize);\n    this.model.progress = Math.min(Math.round(progress), 100);\n    this.notifyObservers();\n  }\n\n  /**\n   * upload completed with an success\n   */\n  private handleResponse(res: HttpResponse<unknown>) {\n    this.model.response = res;\n    this.model.state = NgxFileUploadState.COMPLETED;\n    this.notifyObservers();\n    this.finalizeUpload();\n  }\n\n  /**\n   * send notification to observers\n   */\n  private notifyObservers() {\n    this.change$.next(this.data);\n  }\n\n  /**\n   * upload has been completed, canceled or destroyed\n   */\n  private finalizeUpload() {\n    this.change$.complete();\n    this.cancel$.complete();\n  }\n}\n","import { NgxFileUploadValidationErrors, INgxFileUploadFile } from \"../../api\";\n\nexport class NgxFileUploadFile implements INgxFileUploadFile {\n  readonly raw: File\n\n  readonly size: number\n\n  readonly name: string\n\n  readonly type: string\n\n  validationErrors: NgxFileUploadValidationErrors | null = null\n\n  public constructor(file: File) {\n    this.raw = file\n    this.size = file.size\n    this.type = file.type\n    this.name = file.name\n  }\n}\n","import { HttpClient } from '@angular/common/http';\nimport { InjectionToken, inject } from '@angular/core';\nimport { INgxFileUploadFile, INgxFileUploadRequest, NgxFileUploadOptions, NgxFileUploadValidation } from '../../api';\nimport { NgxFileUploadRequest } from './upload.request';\nimport { NgxFileUploadFile } from './upload.file';\n\nexport interface NgxFileUploadFactory {\n  createUploadRequest(\n    file: File | File[],\n    options: NgxFileUploadOptions,\n    validator?: NgxFileUploadValidation | null,\n  ): INgxFileUploadRequest | null;\n}\n\n/**\n * Factory to create upload requests\n */\nclass Factory implements NgxFileUploadFactory {\n  /**\n   * construct upload factory\n   */\n  public constructor(private httpClient: HttpClient) {}\n\n  public createUploadRequest(\n    file: File | File[],\n    options: NgxFileUploadOptions,\n    validator?: NgxFileUploadValidation,\n  ): INgxFileUploadRequest | null {\n    const files = Array.isArray(file) ? file : [file];\n\n    if (files.length) {\n      const fileModels: INgxFileUploadFile[] = files.map((file) => {\n        const model = new NgxFileUploadFile(file);\n        if (validator) {\n          model.validationErrors = 'validate' in validator ? validator.validate(file) : validator(file);\n        }\n        return model;\n      });\n\n      // * create one requests which holds all files\n      return new NgxFileUploadRequest(this.httpClient, fileModels, options);\n    }\n\n    return null;\n  }\n}\n\n/**\n * InjectionToken for NgxFileuploadFactory\n */\nexport const NgxFileUploadFactory = new InjectionToken<NgxFileUploadFactory>('Ngx Fileupload Factory', {\n  providedIn: 'root',\n  factory: () => new Factory(inject(HttpClient)),\n});\n","import { Subject, merge } from 'rxjs';\nimport { distinctUntilChanged, filter, take, takeUntil } from 'rxjs/operators';\nimport { NgxFileUploadState } from '../../api';\nimport type { NgxFileUploadRequest } from './upload.request';\n\nexport class NgxFileUploadQueue {\n  private active = 0;\n\n  private queuedUploads: NgxFileUploadRequest[] = [];\n\n  private concurrentCount = -1;\n\n  private observedUploads = new WeakSet<NgxFileUploadRequest>();\n\n  private queue$ = new Subject<NgxFileUploadRequest>();\n\n  constructor() {\n    this.queue$.subscribe((request) => {\n      request.state = NgxFileUploadState.PENDING;\n      this.writeToQueue(request);\n    });\n  }\n\n  public set concurrent(count: number) {\n    this.concurrentCount = count;\n  }\n\n  public register(upload: NgxFileUploadRequest) {\n    this.registerUploadChange(upload);\n  }\n\n  /**\n   * register to upload change\n   */\n  private registerUploadChange(request: NgxFileUploadRequest): void {\n    if (!this.observedUploads.has(request)) {\n      this.observedUploads.add(request);\n\n      const change$ = request.change;\n\n      /** register for changes which make request complete */\n      const uploadComplete$ = change$.pipe(\n        filter(() => request.isCompleted(true)),\n        take(1),\n      );\n\n      change$\n        .pipe(\n          takeUntil(merge(request.destroyed, uploadComplete$)),\n          distinctUntilChanged(),\n          filter((data) => data.state === NgxFileUploadState.START),\n        )\n        .subscribe({\n          next: () => this.queue$.next(request),\n          complete: () => this.requestCompleted(request),\n        });\n    }\n  }\n\n  private writeToQueue(request: NgxFileUploadRequest) {\n    if (this.active < this.concurrentCount || this.concurrentCount === -1) {\n      this.runRequest(request);\n      return;\n    }\n\n    this.queuedUploads = [...this.queuedUploads, request];\n  }\n\n  private runRequest(request: NgxFileUploadRequest) {\n    this.active += 1;\n    request.state = NgxFileUploadState.CONNECT;\n    request.run();\n  }\n\n  /**\n   * requests gets completed, this means request is pending or was progressing and the user\n   * cancel request, remove it or even destroys them\n   */\n  private requestCompleted(request: NgxFileUploadRequest) {\n    if (this.isInUploadQueue(request)) {\n        this.removeFromQueue(request)\n     } else {\n        this.startNextInQueue();\n     }\n    this.observedUploads.delete(request);\n  }\n\n  /**\n   * checks upload is in queue\n   */\n  private isInUploadQueue(request: NgxFileUploadRequest): boolean {\n    return this.queuedUploads.indexOf(request) > -1;\n  }\n\n  /**\n   * remove upload request from queued uploads\n   */\n  private removeFromQueue(request: NgxFileUploadRequest) {\n    this.queuedUploads = this.queuedUploads.filter((upload) => upload !== request);\n  }\n\n  private startNextInQueue() {\n    this.active = Math.max(this.active - 1, 0);\n    if (this.queuedUploads.length > 0) {\n      const nextUpload = this.queuedUploads.shift() as NgxFileUploadRequest;\n      this.runRequest(nextUpload);\n    }\n  }\n}\n","import { Observable, ReplaySubject, Subject, timer } from 'rxjs';\nimport { distinctUntilKeyChanged, filter, switchMap, take, takeUntil, tap } from 'rxjs/operators';\nimport { INgxFileUploadRequest, NgxFileUploadState, NgxFileUploadStorageConfig } from '../../api';\nimport { NgxFileUploadQueue } from './upload.queue';\nimport type { NgxFileUploadRequest } from './upload.request';\n\nconst defaultStoreConfig: NgxFileUploadStorageConfig = {\n  concurrentUploads: 5,\n  autoStart: false,\n};\n\nexport class NgxFileUploadStorage {\n  private change$: ReplaySubject<INgxFileUploadRequest[]>;\n  private uploads: Map<string, INgxFileUploadRequest> = new Map();\n  private uploadQueue: NgxFileUploadQueue;\n  private storeConfig: NgxFileUploadStorageConfig;\n  private destroyed$: Subject<boolean> = new Subject();\n  private bulkProcess: string[] = [];\n\n  constructor(config?: NgxFileUploadStorageConfig) {\n    this.change$ = new ReplaySubject(1);\n    this.uploadQueue = new NgxFileUploadQueue();\n\n    this.storeConfig = { ...defaultStoreConfig, ...(config || {}) };\n    this.uploadQueue.concurrent = this.storeConfig.concurrentUploads;\n  }\n\n  /**\n   * submits if any upload changes his state, uploads\n   * gets removed or added\n   */\n  change(): Observable<INgxFileUploadRequest[]> {\n    return this.change$;\n  }\n\n  /**\n   * add new upload to store\n   */\n  add(upload: INgxFileUploadRequest | INgxFileUploadRequest[]) {\n    const requests = Array.isArray(upload) ? upload : [upload];\n\n    requests.forEach((request: INgxFileUploadRequest) => {\n      if (request.requestId && this.uploads.has(request.requestId)) {\n        return;\n      }\n      request.requestId = request.requestId || this.generateUniqeRequestId();\n      this.uploads.set(request.requestId, request);\n      // @todo better interface we only want run method but we do not want publish it\n      // better strategy for this ?\n      this.registerUploadEvents(request as NgxFileUploadRequest);\n    });\n\n    this.afterUploadsAdd(requests);\n    this.notifyObserver();\n  }\n\n  destroy() {\n    /** remove from all subscriptions */\n    this.destroyed$.next(true);\n    /** stop all downloads */\n    this.stopAll();\n    /** destroy change stream */\n    this.destroyed$.complete();\n    this.change$.complete();\n  }\n\n  remove(upload: INgxFileUploadRequest | string) {\n    const id = typeof upload === 'string' ? upload : upload.requestId;\n    const request = this.uploads.get(id);\n    request?.destroy();\n  }\n\n  purge() {\n    let notify = false;\n    this.uploads.forEach((request) => {\n      if (request.isCompleted() || request.isInvalid()) {\n        this.bulkProcess.push(request.requestId);\n        notify = true;\n        request.destroy();\n      }\n    });\n\n    if (notify) {\n      this.notifyObserver();\n    }\n  }\n\n  startAll() {\n    this.uploads.forEach((upload) => {\n      // zu schnell\n      if (upload.isIdle()) {\n        this.bulkProcess.push(upload.requestId);\n        upload.start();\n      }\n    });\n    this.notifyObserver();\n  }\n\n  stopAll() {\n    this.uploads.forEach((upload) => {\n      this.bulkProcess.push(upload.requestId);\n      upload.destroy();\n    });\n    this.notifyObserver();\n  }\n\n  removeInvalid() {\n    this.uploads.forEach((upload) => {\n      if (upload.isInvalid()) {\n        this.bulkProcess.push(upload.requestId);\n        upload.destroy();\n      }\n    });\n    this.notifyObserver();\n  }\n\n  private registerUploadEvents(request: NgxFileUploadRequest): void {\n    if (!request.isInvalid()) {\n      this.queueRequest(request);\n    } else {\n      request.change\n        .pipe(\n          filter((data) => data.state === NgxFileUploadState.IDLE),\n          take(1),\n          takeUntil(request.destroyed),\n        )\n        .subscribe(() => {\n          this.queueRequest(request);\n          this.notifyObserver();\n        });\n    }\n\n    request.destroyed\n      .pipe(\n        tap(() => this.uploads.delete(request.requestId)),\n        take(1),\n      )\n      .subscribe(() => (this.isBulkProcess(request) ? this.removeBulkProcess(request) : this.notifyObserver()));\n  }\n\n  private queueRequest(request: NgxFileUploadRequest) {\n    this.uploadQueue.register(request);\n    this.handleRequestChange(request);\n  }\n\n  /**\n   * @description register to request change events, this will notify all observers\n   * if state from upload state has been changed, this will not notify\n   * if amount of uploaded size has been changed\n   */\n  private handleRequestChange(request: INgxFileUploadRequest) {\n    const isAutoRemove = !!(this.storeConfig.removeCompleted ?? 0);\n    request.change\n      .pipe(\n        distinctUntilKeyChanged('state'),\n        tap(() => /** do not notify if bulk process */ {\n          this.isBulkProcess(request) ? this.removeBulkProcess(request) : this.notifyObserver();\n        }),\n        /* only continue if completed with no errors and autoremove is enabled */\n        filter(() => request.data.state === NgxFileUploadState.COMPLETED && !request.hasError() && isAutoRemove),\n        /** wait for given amount of time before we remove item */\n        switchMap(() => timer(this.storeConfig.removeCompleted ?? 0)),\n        /* automatically unsubscribe if request gets destroyed */\n        takeUntil(request.destroyed),\n      )\n      .subscribe(() => this.remove(request));\n  }\n\n  private afterUploadsAdd(requests: INgxFileUploadRequest[]): void {\n    if (this.storeConfig.autoStart) {\n      requests.forEach((uploadRequest) => uploadRequest.start());\n    }\n  }\n\n  private generateUniqeRequestId(): string {\n    let reqId: string;\n    do {\n      reqId = Array.from({ length: 4 }, () => Math.random().toString(32).slice(2)).join('-');\n    } while (this.uploads.has(reqId));\n    return reqId;\n  }\n\n  private notifyObserver() {\n    this.change$.next(Array.from(this.uploads.values()));\n  }\n\n  private removeBulkProcess(request: INgxFileUploadRequest) {\n    this.bulkProcess = this.bulkProcess.filter((id) => request.requestId !== id);\n  }\n\n  private isBulkProcess(request: INgxFileUploadRequest): boolean {\n    return this.bulkProcess.indexOf(request.requestId) > -1;\n  }\n}\n","import { NgxFileUploadValidationErrors, NgxFileUploadValidation, NgxFileUploadValidator } from \"../../api\";\n\nexport abstract class NgxFileUploadGroupedvalidator implements NgxFileUploadValidator {\n\n    protected validators: Array<NgxFileUploadValidation>;\n\n    public constructor(\n       validators?: Array<NgxFileUploadValidation>\n    ) {\n        this.validators = Array.isArray(validators) ? validators : [];\n    }\n\n    public abstract validate(file: File): NgxFileUploadValidationErrors | null;\n\n    /**\n     * add validators\n     */\n    public add(...validators: Array<NgxFileUploadValidation>): void {\n        this.validators = this.validators.concat(validators);\n    }\n\n    /**\n     * clean up all validators\n     */\n    public clean() {\n        this.validators = [];\n    }\n\n    /**\n     * executes validator and returns validation result\n     */\n    protected execValidator(\n        validator: NgxFileUploadValidation,\n        file: File\n    ): NgxFileUploadValidationErrors | null {\n        /** we handle a validator class directly */\n        if (\"validate\" in validator) {\n            return validator.validate(file);\n        }\n        /** we handle a validation function */\n        return validator(file);\n    }\n}\n","import { NgxFileUploadGroupedvalidator } from \"./grouped.validator\";\nimport { NgxFileUploadValidationErrors } from \"../../api\";\n\nexport class NgxFileUploadAndValidator extends NgxFileUploadGroupedvalidator {\n\n    public validate(file: File): NgxFileUploadValidationErrors | null {\n\n        const validationResult: NgxFileUploadValidationErrors = {};\n        let hasErrors = false;\n\n        for (const validator of this.validators) {\n            const result = this.execValidator(validator, file);\n\n            if (result !== null) {\n                Object.assign(validationResult, result);\n                hasErrors = true;\n            }\n        }\n        return hasErrors ? validationResult : null;\n    }\n}\n","import { NgxFileUploadValidationErrors } from \"../../api\";\nimport { NgxFileUploadGroupedvalidator } from \"./grouped.validator\";\n\nexport class NgxFileUploadOrValidator extends NgxFileUploadGroupedvalidator {\n\n    public validate(file: File): NgxFileUploadValidationErrors | null {\n\n        let validationResult: NgxFileUploadValidationErrors | null = {};\n\n        for (const validator of this.validators) {\n            const result = this.execValidator(validator, file);\n\n            if (result === null) {\n                validationResult = null;\n                break;\n            }\n\n            Object.assign(validationResult, result);\n        }\n\n        return validationResult;\n    }\n}\n","import { NgxFileUploadGroupedvalidator } from \"./grouped.validator\";\nimport { NgxFileUploadAndValidator } from \"./and.validator\";\nimport { NgxFileUploadOrValidator } from \"./or.validator\";\nimport { NgxFileUploadValidation } from \"../../api\";\n\nexport class NgxFileUploadValidationBuilder {\n\n    public static and(...validators: Array<NgxFileUploadValidation>): NgxFileUploadGroupedvalidator {\n        return new NgxFileUploadAndValidator(validators);\n    }\n\n    public static or(...validators: Array<NgxFileUploadValidation>): NgxFileUploadGroupedvalidator {\n        return new NgxFileUploadOrValidator(validators);\n    }\n}\n","/*\n * Public API Surface of core\n */\nexport * from \"./lib/core\";\nexport * from \"./lib/api\";\nexport * from \"./lib/upload\";\nexport * from \"./lib/validation\";\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["map"],"mappings":"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"}