file-saver
Advanced tools
Comparing version 2.0.0-rc.1 to 2.0.0-rc.2
@@ -21,3 +21,3 @@ (function (global, factory) { | ||
/*! | ||
/* | ||
* FileSaver.js | ||
@@ -44,7 +44,14 @@ * A saveAs() FileSaver implementation. | ||
function bom(blob, autoBom) { | ||
if (!autoBom) return blob; // prepend BOM for UTF-8 XML and text/* types (including HTML) | ||
function bom(blob, opts) { | ||
if (typeof opts === 'undefined') opts = { | ||
autoBom: false | ||
};else if (typeof opts !== 'object') { | ||
console.warn('Depricated: Expected third argument to be a object'); | ||
opts = { | ||
autoBom: !opts | ||
}; | ||
} // prepend BOM for UTF-8 XML and text/* types (including HTML) | ||
// note: your browser will automatically convert UTF-16 U+FEFF to EF BB BF | ||
if (/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(blob.type)) { | ||
if (opts.autoBom && /^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(blob.type)) { | ||
return new Blob([String.fromCharCode(0xFEFF), blob], { | ||
@@ -58,3 +65,3 @@ type: blob.type | ||
function download(url, name, autoBom) { | ||
function download(url, name, opts) { | ||
var xhr = new XMLHttpRequest(); | ||
@@ -65,3 +72,3 @@ xhr.open('GET', url); | ||
xhr.onload = function () { | ||
saveAs(xhr.response, name, autoBom); | ||
saveAs(xhr.response, name, opts); | ||
}; | ||
@@ -82,2 +89,13 @@ | ||
return xhr.status >= 200 && xhr.status <= 299; | ||
} // `a.click()` don't work for all browsers (#465) | ||
function click(node) { | ||
try { | ||
node.dispatchEvent(new MouseEvent('click')); | ||
} catch (e) { | ||
var evt = document.createEvent('MouseEvents'); | ||
evt.initMouseEvent('click', true, true, window, 0, 0, 0, 80, 20, false, false, false, false, 0, null); | ||
node.dispatchEvent(evt); | ||
} | ||
} | ||
@@ -89,3 +107,3 @@ | ||
// Use download attribute first if possible (#193 Lumia mobile) | ||
: 'download' in HTMLAnchorElement.prototype ? function saveAs(blob, name, autoBom) { | ||
: 'download' in HTMLAnchorElement.prototype ? function saveAs(blob, name, opts) { | ||
var URL = _global.URL || _global.webkitURL; | ||
@@ -104,5 +122,5 @@ var a = document.createElement('a'); | ||
if (a.origin !== location.origin) { | ||
corsEnabled(a.href) ? download(blob, name, autoBom) : a.click(a.target = '_blank'); | ||
corsEnabled(a.href) ? download(blob, name, opts) : click(a, a.target = '_blank'); | ||
} else { | ||
a.click(); | ||
click(a); | ||
} | ||
@@ -116,6 +134,8 @@ } else { | ||
setTimeout(a.click.bind(a), 0); | ||
setTimeout(function () { | ||
click(a); | ||
}, 0); | ||
} | ||
} // Use msSaveOrOpenBlob as a second approch | ||
: 'msSaveOrOpenBlob' in navigator ? function saveAs(blob, name, autoBom) { | ||
: 'msSaveOrOpenBlob' in navigator ? function saveAs(blob, name, opts) { | ||
name = name || blob.name || 'download'; | ||
@@ -125,3 +145,3 @@ | ||
if (corsEnabled(blob)) { | ||
download(blob, name, autoBom); | ||
download(blob, name, opts); | ||
} else { | ||
@@ -131,9 +151,11 @@ var a = document.createElement('a'); | ||
a.target = '_blank'; | ||
setTimeout(a.click.bind(a)); | ||
setTimeout(function () { | ||
clikc(a); | ||
}); | ||
} | ||
} else { | ||
navigator.msSaveOrOpenBlob(bom(blob, autoBom), name); | ||
navigator.msSaveOrOpenBlob(bom(blob, opts), name); | ||
} | ||
} // Fallback to using FileReader and a popup | ||
: function saveAs(blob, name, autoBom, popup) { | ||
: function saveAs(blob, name, opts, popup) { | ||
// Open a popup immediately do go around popup blocker | ||
@@ -147,4 +169,4 @@ // Mostly only avalible on user interaction and the fileReader is async so... | ||
if (typeof blob === 'string') return download(blob, name, autoBom); | ||
const force = blob.type === 'application/octet-stream'; | ||
if (typeof blob === 'string') return download(blob, name, opts); | ||
var force = blob.type === 'application/octet-stream'; | ||
@@ -151,0 +173,0 @@ var isSafari = /constructor/i.test(_global.HTMLElement) || _global.safari; |
@@ -1,3 +0,3 @@ | ||
(function(a,b){if("function"==typeof define&&define.amd)define(["exports"],b);else if("undefined"!=typeof exports)b(exports);else{var c={exports:{}};b(c.exports),a.FileSaver=c.exports}})(this,function(a){"use strict";function b(a,b){return b?/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(a.type)?new Blob(["\uFEFF",a],{type:a.type}):a:a}function c(a,b,c){var d=new XMLHttpRequest;d.open("GET",a),d.responseType="blob",d.onload=function(){f(d.response,b,c)},d.onerror=function(){console.error("could not download file")},d.send()}function d(a){var b=new XMLHttpRequest;return b.open("HEAD",a,!1),b.send(),200<=b.status&&299>=b.status}Object.defineProperty(a,"__esModule",{value:!0}),a.default=void 0;var e=function(){try{return Function("return this")()||(42,eval)("this")}catch(a){return"object"==typeof window&&window.window===window?window:"object"==typeof self&&self.self===self?self:"object"==typeof global&&global.global===global?global:this}}(),f=e.saveAs||"object"!=typeof window||window!==e?function(){}:"download"in HTMLAnchorElement.prototype?function(b,f,g){var h=e.URL||e.webkitURL,i=document.createElement("a");f=f||b.name||"download",i.download=f,i.rel="noopener","string"==typeof b?(i.href=b,i.origin===location.origin?i.click():d(i.href)?c(b,f,g):i.click(i.target="_blank")):(i.href=h.createObjectURL(b),setTimeout(function(){h.revokeObjectURL(i.href)},4E4),setTimeout(i.click.bind(i),0))}:"msSaveOrOpenBlob"in navigator?function(e,f,g){if(f=f||e.name||"download","string"!=typeof e)navigator.msSaveOrOpenBlob(b(e,g),f);else if(d(e))c(e,f,g);else{var h=document.createElement("a");h.href=e,h.target="_blank",setTimeout(h.click.bind(h))}}:function(a,b,d,f){if(f=f||open("","_blank"),f&&(f.document.title=f.document.body.innerText="downloading..."),"string"==typeof a)return c(a,b,d);const g="application/octet-stream"===a.type;var h=/constructor/i.test(e.HTMLElement)||e.safari,i=/CriOS\/[\d]+/.test(navigator.userAgent);if((i||g&&h)&&"object"==typeof FileReader){var j=new FileReader;j.onloadend=function(){var a=j.result;a=i?a:a.replace(/^data:[^;]*;/,"data:attachment/file;"),f?f.location.href=a:location=a,f=null},j.readAsDataURL(a)}else{var k=e.URL||e.webkitURL,l=k.createObjectURL(a);f?f.location=l:location.href=l,f=null,setTimeout(function(){k.revokeObjectURL(l)},4E4)}};e.saveAs=f;a.default=f}); | ||
(function(a,b){if("function"==typeof define&&define.amd)define(["exports"],b);else if("undefined"!=typeof exports)b(exports);else{var c={exports:{}};b(c.exports),a.FileSaver=c.exports}})(this,function(a){"use strict";function b(a,b){return"undefined"==typeof b?b={autoBom:!1}:"object"!=typeof b&&(console.warn("Depricated: Expected third argument to be a object"),b={autoBom:!b}),b.autoBom&&/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(a.type)?new Blob(["\uFEFF",a],{type:a.type}):a}function c(a,b,c){var d=new XMLHttpRequest;d.open("GET",a),d.responseType="blob",d.onload=function(){g(d.response,b,c)},d.onerror=function(){console.error("could not download file")},d.send()}function d(a){var b=new XMLHttpRequest;return b.open("HEAD",a,!1),b.send(),200<=b.status&&299>=b.status}function e(a){try{a.dispatchEvent(new MouseEvent("click"))}catch(c){var b=document.createEvent("MouseEvents");b.initMouseEvent("click",!0,!0,window,0,0,0,80,20,!1,!1,!1,!1,0,null),a.dispatchEvent(b)}}Object.defineProperty(a,"__esModule",{value:!0}),a.default=void 0;var f=function(){try{return Function("return this")()||(42,eval)("this")}catch(a){return"object"==typeof window&&window.window===window?window:"object"==typeof self&&self.self===self?self:"object"==typeof global&&global.global===global?global:this}}(),g=f.saveAs||"object"!=typeof window||window!==f?function(){}:"download"in HTMLAnchorElement.prototype?function(b,g,h){var i=f.URL||f.webkitURL,j=document.createElement("a");g=g||b.name||"download",j.download=g,j.rel="noopener","string"==typeof b?(j.href=b,j.origin===location.origin?e(j):d(j.href)?c(b,g,h):e(j,j.target="_blank")):(j.href=i.createObjectURL(b),setTimeout(function(){i.revokeObjectURL(j.href)},4E4),setTimeout(function(){e(j)},0))}:"msSaveOrOpenBlob"in navigator?function(e,f,g){if(f=f||e.name||"download","string"!=typeof e)navigator.msSaveOrOpenBlob(b(e,g),f);else if(d(e))c(e,f,g);else{var h=document.createElement("a");h.href=e,h.target="_blank",setTimeout(function(){clikc(h)})}}:function(a,b,d,e){if(e=e||open("","_blank"),e&&(e.document.title=e.document.body.innerText="downloading..."),"string"==typeof a)return c(a,b,d);var g="application/octet-stream"===a.type,h=/constructor/i.test(f.HTMLElement)||f.safari,i=/CriOS\/[\d]+/.test(navigator.userAgent);if((i||g&&h)&&"object"==typeof FileReader){var j=new FileReader;j.onloadend=function(){var a=j.result;a=i?a:a.replace(/^data:[^;]*;/,"data:attachment/file;"),e?e.location.href=a:location=a,e=null},j.readAsDataURL(a)}else{var k=f.URL||f.webkitURL,l=k.createObjectURL(a);e?e.location=l:location.href=l,e=null,setTimeout(function(){k.revokeObjectURL(l)},4E4)}};f.saveAs=g;a.default=g}); | ||
//# sourceMappingURL=FileSaver.min.js.map |
{ | ||
"name": "file-saver", | ||
"version": "2.0.0-rc.1", | ||
"version": "2.0.0-rc.2", | ||
"description": "An HTML5 saveAs() FileSaver implementation", | ||
@@ -5,0 +5,0 @@ "main": "dist/FileSaver.min.js", |
If you need to save really large files bigger then the blob's size limitation or don't have | ||
enough RAM, then have a look at the more advanced [StreamSaver.js](https://github.com/jimmywarting/StreamSaver.js) | ||
enough RAM, then have a look at the more advanced [StreamSaver.js][7] | ||
that can save data directly to the hard drive asynchronously with the power of the new streams API. That will have | ||
@@ -9,9 +9,5 @@ support for progress, cancelation and knowing when it's done writing | ||
FileSaver.js implements the `saveAs()` FileSaver interface in browsers that do | ||
not natively support it. There is a [FileSaver.js demo][1] that demonstrates saving | ||
various media types. | ||
FileSaver.js is the solution to saving files on the client-side, and is perfect for | ||
webapps that need to generate files, or for saving sensitive information that shouldn't be | ||
sent to an external server. | ||
webapps that generates files on the client, However if the file is coming from the | ||
server we recomend you to first try to use [Content-Disposition][8] attachment response header as it has more cross browser compatible | ||
@@ -68,6 +64,6 @@ Looking for `canvas.toBlob()` for saving canvases? Check out | ||
```js | ||
FileSaver saveAs(Blob/File/Url, optional DOMString filename, optional Boolean autoBOM) | ||
FileSaver saveAs(Blob/File/Url, optional DOMString filename, optional Object { autoBOM }) | ||
``` | ||
Pass `true` for `autoBOM` if you don't want FileSaver.js to automatically provide Unicode text encoding hints (see: [byte order mark](https://en.wikipedia.org/wiki/Byte_order_mark)). | ||
Pass `{ autoBOM: true }` if you want FileSaver.js to automatically provide Unicode text encoding hints (see: [byte order mark](https://en.wikipedia.org/wiki/Byte_order_mark)). | ||
@@ -107,4 +103,3 @@ Examples | ||
```js | ||
var canvas = document.getElementById("my-canvas"), ctx = canvas.getContext("2d"); | ||
// draw to canvas... | ||
var canvas = document.getElementById("my-canvas"); | ||
canvas.toBlob(function(blob) { | ||
@@ -142,2 +137,4 @@ saveAs(blob, "pretty image.png"); | ||
[6]: https://github.com/eligrey/canvas-toBlob.js | ||
[7]: https://github.com/jimmywarting/StreamSaver.js | ||
[8]: https://github.com/eligrey/FileSaver.js/wiki/Saving-a-remote-file#using-http-header | ||
@@ -144,0 +141,0 @@ Installation |
@@ -1,2 +0,2 @@ | ||
/*! | ||
/* | ||
* FileSaver.js | ||
@@ -27,7 +27,12 @@ * A saveAs() FileSaver implementation. | ||
function bom (blob, autoBom) { | ||
if (!autoBom) return blob | ||
function bom (blob, opts) { | ||
if (typeof opts === 'undefined') opts = { autoBom: false } | ||
else if (typeof opts !== 'object') { | ||
console.warn('Depricated: Expected third argument to be a object') | ||
opts = { autoBom: !opts } | ||
} | ||
// prepend BOM for UTF-8 XML and text/* types (including HTML) | ||
// note: your browser will automatically convert UTF-16 U+FEFF to EF BB BF | ||
if (/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(blob.type)) { | ||
if (opts.autoBom && /^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(blob.type)) { | ||
return new Blob([String.fromCharCode(0xFEFF), blob], { type: blob.type }) | ||
@@ -38,3 +43,3 @@ } | ||
function download (url, name, autoBom) { | ||
function download (url, name, opts) { | ||
var xhr = new XMLHttpRequest() | ||
@@ -44,3 +49,3 @@ xhr.open('GET', url) | ||
xhr.onload = function () { | ||
saveAs(xhr.response, name, autoBom) | ||
saveAs(xhr.response, name, opts) | ||
} | ||
@@ -61,2 +66,14 @@ xhr.onerror = function () { | ||
// `a.click()` don't work for all browsers (#465) | ||
function click(node) { | ||
try { | ||
node.dispatchEvent(new MouseEvent('click')) | ||
} catch (e) { | ||
var evt = document.createEvent('MouseEvents') | ||
evt.initMouseEvent('click', true, true, window, 0, 0, 0, 80, | ||
20, false, false, false, false, 0, null) | ||
node.dispatchEvent(evt) | ||
} | ||
} | ||
var saveAs = _global.saveAs || | ||
@@ -69,3 +86,3 @@ // probably in some web worker | ||
: 'download' in HTMLAnchorElement.prototype | ||
? function saveAs (blob, name, autoBom) { | ||
? function saveAs (blob, name, opts) { | ||
var URL = _global.URL || _global.webkitURL | ||
@@ -86,6 +103,6 @@ var a = document.createElement('a') | ||
corsEnabled(a.href) | ||
? download(blob, name, autoBom) | ||
: a.click(a.target = '_blank') | ||
? download(blob, name, opts) | ||
: click(a, a.target = '_blank') | ||
} else { | ||
a.click() | ||
click(a) | ||
} | ||
@@ -96,3 +113,3 @@ } else { | ||
setTimeout(function () { URL.revokeObjectURL(a.href) }, 4E4) // 40s | ||
setTimeout(a.click.bind(a), 0) | ||
setTimeout(function () { click(a) }, 0) | ||
} | ||
@@ -103,3 +120,3 @@ } | ||
: 'msSaveOrOpenBlob' in navigator | ||
? function saveAs (blob, name, autoBom) { | ||
? function saveAs (blob, name, opts) { | ||
name = name || blob.name || 'download' | ||
@@ -109,3 +126,3 @@ | ||
if (corsEnabled(blob)) { | ||
download(blob, name, autoBom) | ||
download(blob, name, opts) | ||
} else { | ||
@@ -115,6 +132,6 @@ var a = document.createElement('a') | ||
a.target = '_blank' | ||
setTimeout(a.click.bind(a)) | ||
setTimeout(function () { clikc(a) }) | ||
} | ||
} else { | ||
navigator.msSaveOrOpenBlob(bom(blob, autoBom), name) | ||
navigator.msSaveOrOpenBlob(bom(blob, opts), name) | ||
} | ||
@@ -124,3 +141,3 @@ } | ||
// Fallback to using FileReader and a popup | ||
: function saveAs (blob, name, autoBom, popup) { | ||
: function saveAs (blob, name, opts, popup) { | ||
// Open a popup immediately do go around popup blocker | ||
@@ -134,5 +151,5 @@ // Mostly only avalible on user interaction and the fileReader is async so... | ||
if (typeof blob === 'string') return download(blob, name, autoBom) | ||
if (typeof blob === 'string') return download(blob, name, opts) | ||
const force = blob.type === 'application/octet-stream' | ||
var force = blob.type === 'application/octet-stream' | ||
var isSafari = /constructor/i.test(_global.HTMLElement) || _global.safari | ||
@@ -139,0 +156,0 @@ var isChromeIOS = /CriOS\/[\d]+/.test(navigator.userAgent) |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
23693
7
326
0
150