@clemox/ngx-file-saver
Version:
URL or blob download helper
1 lines • 5.53 kB
Source Map (JSON)
{"version":3,"file":"clemox-ngx-file-saver.mjs","sources":["../../../projects/ngx-file-saver/src/lib/services/ngx-file-saver.service.ts","../../../projects/ngx-file-saver/src/public-api.ts","../../../projects/ngx-file-saver/src/clemox-ngx-file-saver.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\r\n\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class NgxFileSaverService {\r\n\r\n public saveUrl(url: string, fileName: string): void {\r\n const anchor = this.clickUrlPrepare(url, fileName);\r\n if (anchor === undefined) {\r\n this.downloadProcess(url, fileName);\r\n } else {\r\n this.clickUrlProcess(anchor);\r\n }\r\n }\r\n\r\n public saveBlob(data: Blob, fileName: string): void {\r\n const anchor = this.clickBlobPrepare(data, fileName);\r\n this.clickBlobProcess(anchor);\r\n }\r\n\r\n //\r\n\r\n private clickUrlPrepare(url: string, name: string): HTMLAnchorElement | undefined {\r\n let result: HTMLAnchorElement | undefined = document.createElement('a');\r\n result.download = name;\r\n result.href = url;\r\n result.rel = 'noopener';\r\n\r\n if (result.origin !== undefined && result.origin !== window.location.origin) {\r\n result.target = '_blank';\r\n if (this.isCorsEnabled(result.href)) {\r\n result = undefined;\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n private clickUrlProcess(anchor: HTMLAnchorElement): void {\r\n try {\r\n anchor.dispatchEvent(new MouseEvent('click'));\r\n } catch (e) {\r\n anchor.click();\r\n }\r\n }\r\n\r\n private clickBlobPrepare(data: Blob, name: string): HTMLAnchorElement {\r\n const result = document.createElement('a');\r\n result.download = name;\r\n result.href = URL.createObjectURL(data);\r\n result.rel = 'noopener';\r\n return result;\r\n }\r\n\r\n private clickBlobProcess(anchor: HTMLAnchorElement): void {\r\n setTimeout(() => { URL.revokeObjectURL(anchor.href); }, 4E4); // 40s\r\n setTimeout(() => { this.clickUrlProcess(anchor); }, 0);\r\n }\r\n\r\n private downloadProcess(url: string, name: string): void {\r\n const xhr = new XMLHttpRequest();\r\n xhr.responseType = 'blob';\r\n xhr.open('GET', url);\r\n xhr.onload = (() => this.saveBlob(xhr.response, name));\r\n xhr.onerror = (() => console.error('could not download file'));\r\n xhr.send();\r\n }\r\n\r\n private isCorsEnabled(url: string): boolean {\r\n const xhr = new XMLHttpRequest();\r\n xhr.open('HEAD', url, false);\r\n try {\r\n xhr.send();\r\n } catch (e) { }\r\n return (xhr.status >= 200 && xhr.status <= 299);\r\n }\r\n\r\n}\r\n","/*\n * Public API Surface of ngx-file-saver\n */\n\nexport * from './lib/services/ngx-file-saver.service';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;MAIa,mBAAmB,CAAA;IAErB,OAAO,CAAC,GAAW,EAAE,QAAgB,EAAA;QACxC,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,QAAQ,CAAC;AAClD,QAAA,IAAI,MAAM,KAAK,SAAS,EAAE;AACtB,YAAA,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,QAAQ,CAAC;;aAChC;AACH,YAAA,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC;;;IAI7B,QAAQ,CAAC,IAAU,EAAE,QAAgB,EAAA;QACxC,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,QAAQ,CAAC;AACpD,QAAA,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC;;;IAKzB,eAAe,CAAC,GAAW,EAAE,IAAY,EAAA;QAC7C,IAAI,MAAM,GAAkC,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC;AACvE,QAAA,MAAM,CAAC,QAAQ,GAAG,IAAI;AACtB,QAAA,MAAM,CAAC,IAAI,GAAG,GAAG;AACjB,QAAA,MAAM,CAAC,GAAG,GAAG,UAAU;AAEvB,QAAA,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE;AACzE,YAAA,MAAM,CAAC,MAAM,GAAG,QAAQ;YACxB,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;gBACjC,MAAM,GAAG,SAAS;;;AAI1B,QAAA,OAAO,MAAM;;AAGT,IAAA,eAAe,CAAC,MAAyB,EAAA;AAC7C,QAAA,IAAI;YACA,MAAM,CAAC,aAAa,CAAC,IAAI,UAAU,CAAC,OAAO,CAAC,CAAC;;QAC/C,OAAO,CAAC,EAAE;YACR,MAAM,CAAC,KAAK,EAAE;;;IAId,gBAAgB,CAAC,IAAU,EAAE,IAAY,EAAA;QAC7C,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC;AAC1C,QAAA,MAAM,CAAC,QAAQ,GAAG,IAAI;QACtB,MAAM,CAAC,IAAI,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC;AACvC,QAAA,MAAM,CAAC,GAAG,GAAG,UAAU;AACvB,QAAA,OAAO,MAAM;;AAGT,IAAA,gBAAgB,CAAC,MAAyB,EAAA;QAC9C,UAAU,CAAC,MAAK,EAAG,GAAG,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;AAC7D,QAAA,UAAU,CAAC,MAAQ,EAAA,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;;IAGlD,eAAe,CAAC,GAAW,EAAE,IAAY,EAAA;AAC7C,QAAA,MAAM,GAAG,GAAG,IAAI,cAAc,EAAE;AAChC,QAAA,GAAG,CAAC,YAAY,GAAG,MAAM;AACzB,QAAA,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC;AACpB,QAAA,GAAG,CAAC,MAAM,IAAI,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;AACtD,QAAA,GAAG,CAAC,OAAO,IAAI,MAAM,OAAO,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAC9D,GAAG,CAAC,IAAI,EAAE;;AAGN,IAAA,aAAa,CAAC,GAAW,EAAA;AAC7B,QAAA,MAAM,GAAG,GAAG,IAAI,cAAc,EAAE;QAChC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC;AAC5B,QAAA,IAAI;YACA,GAAG,CAAC,IAAI,EAAE;;AACZ,QAAA,OAAO,CAAC,EAAE;AACZ,QAAA,QAAQ,GAAG,CAAC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG;;8GAtEzC,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAnB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,mBAAmB,cADN,MAAM,EAAA,CAAA,CAAA;;2FACnB,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAD/B,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;ACHlC;;AAEG;;ACFH;;AAEG;;;;"}