Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More
Socket
Sign inDemoInstall
Socket

file-saver

Package Overview
Dependencies
Maintainers
2
Versions
18
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

file-saver - npm Package Compare versions

Comparing version 2.0.0-rc.1 to 2.0.0-rc.2

changelog.md

56

dist/FileSaver.js

@@ -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)

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc