{"version":3,"file":"ngx-filesaver.mjs","sources":["../../lib/src/service.ts","../../lib/src/filesaver.ts","../../lib/src/ngx-filesaver.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { saveAs, FileSaverOptions } from 'file-saver';\n\n/** Check the `Blob` existance only once. */\nlet isFileSaverSupported: boolean;\ntry {\n  isFileSaverSupported = !!new Blob();\n} catch {\n  isFileSaverSupported = false;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class FileSaverService {\n  get isFileSaverSupported(): boolean {\n    return isFileSaverSupported;\n  }\n\n  genType(fileName?: string | null): string {\n    if (!fileName || fileName.lastIndexOf('.') === -1) {\n      return 'text/plain';\n    }\n    const type = fileName.substring(fileName.lastIndexOf('.') + 1);\n    switch (type) {\n      case 'txt':\n        return 'text/plain';\n      case 'xml':\n      case 'html':\n        return `text/${type}`;\n      case 'json':\n        return 'octet/stream';\n      default:\n        return `application/${type}`;\n    }\n  }\n\n  save(blob: Blob | null, fileName?: string, filtType?: string, option?: FileSaverOptions): void {\n    if (!blob) {\n      throw new Error('Data argument should be a blob instance');\n    }\n\n    const file = new Blob([blob], { type: filtType ?? blob.type ?? this.genType(fileName) });\n    saveAs(file, decodeURI(fileName ?? 'download'), option);\n  }\n\n  saveText(txt: string, fileName?: string, option?: FileSaverOptions): void {\n    const blob = new Blob([txt]);\n    this.save(blob, fileName, undefined, option);\n  }\n}\n","\nimport { Directive, ElementRef, inject, input } from '@angular/core';\nimport { HttpClient, type HttpHeaders, type HttpParams, type HttpResponse } from '@angular/common/http';\nimport { filter, fromEvent, type Observable, Subject, switchMap } from 'rxjs';\nimport type { FileSaverOptions } from 'file-saver';\nimport { FileSaverService } from './service';\nimport { outputFromObservable, takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\n@Directive({\n  selector: '[fileSaver]',\n  exportAs: 'fileSaver',\n})\nexport class FileSaverDirective {\n  private readonly el = inject<ElementRef<HTMLButtonElement>>(ElementRef);\n  private readonly fss = inject(FileSaverService);\n  private readonly httpClient = inject(HttpClient);\n  readonly method = input('GET');\n  readonly http = input<Observable<HttpResponse<Blob>>>();\n  readonly query = input<HttpParams | Record<string, string | number | boolean | readonly (string | number | boolean)[]>>();\n  readonly header = input<HttpHeaders | Record<string, string | string[]>>();\n  readonly url = input.required<string>();\n  readonly fileName = input<string | null>();\n  readonly fsOptions = input<FileSaverOptions>();\n  private successEmitter = new Subject<HttpResponse<Blob>>();\n  readonly success = outputFromObservable(this.successEmitter);\n  private errorEmitter = new Subject<any>();\n  readonly error = outputFromObservable(this.errorEmitter);\n\n  constructor() {\n    if (!this.fss.isFileSaverSupported) {\n      this.el.nativeElement.classList.add(`filesaver__not-support`);\n    }\n    this.setupClickListener();\n  }\n\n  private getName(res: HttpResponse<Blob>) {\n    return decodeURI(this.fileName() || res.headers.get('filename') || res.headers.get('x-filename') || '');\n  }\n\n  setDisabled(status: boolean): void {\n    const el = this.el.nativeElement;\n    el.disabled = status;\n    el.classList[status ? 'add' : 'remove'](`filesaver__disabled`);\n  }\n\n  private setupClickListener(): void {\n    fromEvent(this.el.nativeElement, 'click')\n      .pipe(\n        filter(() => this.fss.isFileSaverSupported),\n        switchMap(() => {\n          let req = this.http();\n\n          if (!req) {\n            req = this.httpClient.request(this.method(), this.url(), {\n              observe: 'response',\n              responseType: 'blob',\n              headers: this.header(),\n              params: this.query(),\n            });\n          }\n\n          this.setDisabled(true);\n          return req;\n        }),\n        takeUntilDestroyed(),\n      )\n      .subscribe({\n        next: (response) => {\n          if (response.status !== 200 || response.body!.size <= 0) {\n            this.errorEmitter.next(response);\n            return;\n          }\n          this.fss.save(response.body, this.getName(response), undefined, this.fsOptions());\n          this.successEmitter.next(response);\n        },\n        error: (error) => this.errorEmitter.next(error),\n        complete: () => this.setDisabled(false),\n      });\n  }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}