blob-polyfill
Advanced tools
Comparing version 2.0.20171115 to 3.0.20180112
374
Blob.js
/* Blob.js | ||
* A Blob implementation. | ||
* 2017-11-15 | ||
* 2018-01-12 | ||
* | ||
@@ -18,208 +18,206 @@ * By Eli Grey, http://eligrey.com | ||
(function(global) { | ||
(function (factory) { | ||
if (typeof define === "function" && define.amd) { | ||
// AMD. Register as an anonymous module. | ||
define(["exports"], factory); | ||
} else if (typeof exports === "object" && typeof exports.nodeName !== "string") { | ||
// CommonJS | ||
factory(exports); | ||
} else { | ||
// Browser globals | ||
factory(global); | ||
} | ||
})(function (exports) { | ||
"use strict"; | ||
(function (factory) { | ||
if (typeof define === "function" && define.amd) { | ||
// AMD. Register as an anonymous module. | ||
define(["exports"], factory); | ||
} else if (typeof exports === "object" && typeof exports.nodeName !== "string") { | ||
// CommonJS | ||
factory(exports); | ||
} else { | ||
// Browser globals | ||
factory(global); | ||
} | ||
})(function (exports) { | ||
"use strict"; | ||
exports.URL = global.URL || global.webkitURL; | ||
exports.URL = global.URL || global.webkitURL; | ||
if (global.Blob && global.URL) { | ||
try { | ||
new Blob; | ||
return; | ||
} catch (e) {} | ||
} | ||
if (global.Blob && global.URL) { | ||
try { | ||
new Blob; | ||
return; | ||
} catch (e) { | ||
// Blob did not instantiate, time to polyfill | ||
} | ||
} | ||
// Internally we use a BlobBuilder implementation to base Blob off of | ||
// in order to support older browsers that only have BlobBuilder | ||
var BlobBuilder = global.BlobBuilder || global.WebKitBlobBuilder || global.MozBlobBuilder || (function() { | ||
var | ||
get_class = function(object) { | ||
return Object.prototype.toString.call(object).match(/^\[object\s(.*)\]$/)[1]; | ||
// Internally we use a BlobBuilder implementation to base Blob off of | ||
// in order to support older browsers that only have BlobBuilder | ||
var BlobBuilder = global.BlobBuilder || global.WebKitBlobBuilder || global.MozBlobBuilder || (function() { | ||
var get_class = function(object) { | ||
return Object.prototype.toString.call(object).match(/^\[object\s(.*)\]$/)[1]; | ||
} | ||
, FakeBlobBuilder = function BlobBuilder() { | ||
this.data = []; | ||
} | ||
, FakeBlob = function Blob(data, type, encoding) { | ||
this.data = data; | ||
this.size = data.length; | ||
this.type = type; | ||
this.encoding = encoding; | ||
} | ||
, FBB_proto = FakeBlobBuilder.prototype | ||
, FB_proto = FakeBlob.prototype | ||
, FileReaderSync = global.FileReaderSync | ||
, FileException = function(type) { | ||
this.code = this[this.name = type]; | ||
} | ||
, file_ex_codes = ( | ||
"NOT_FOUND_ERR SECURITY_ERR ABORT_ERR NOT_READABLE_ERR ENCODING_ERR " | ||
+ "NO_MODIFICATION_ALLOWED_ERR INVALID_STATE_ERR SYNTAX_ERR" | ||
).split(" ") | ||
, file_ex_code = file_ex_codes.length | ||
, real_URL = global.URL || global.webkitURL || exports | ||
, real_create_object_URL = real_URL.createObjectURL | ||
, real_revoke_object_URL = real_URL.revokeObjectURL | ||
, URL = real_URL | ||
, btoa = global.btoa | ||
, atob = global.atob | ||
, ArrayBuffer = global.ArrayBuffer | ||
, Uint8Array = global.Uint8Array | ||
, origin = /^[\w-]+:\/*\[?[\w.:-]+\]?(?::[0-9]+)?/ | ||
; | ||
FakeBlob.fake = FB_proto.fake = true; | ||
while (file_ex_code--) { | ||
FileException.prototype[file_ex_codes[file_ex_code]] = file_ex_code + 1; | ||
} | ||
, FakeBlobBuilder = function BlobBuilder() { | ||
this.data = []; | ||
// Polyfill URL | ||
if (!real_URL.createObjectURL) { | ||
URL = exports.URL = function(uri) { | ||
var uri_info = document.createElementNS("http://www.w3.org/1999/xhtml", "a") | ||
, uri_origin | ||
; | ||
uri_info.href = uri; | ||
if (!("origin" in uri_info)) { | ||
if (uri_info.protocol.toLowerCase() === "data:") { | ||
uri_info.origin = null; | ||
} else { | ||
uri_origin = uri.match(origin); | ||
uri_info.origin = uri_origin && uri_origin[1]; | ||
} | ||
} | ||
return uri_info; | ||
}; | ||
} | ||
, FakeBlob = function Blob(data, type, encoding) { | ||
this.data = data; | ||
this.size = data.length; | ||
this.type = type; | ||
this.encoding = encoding; | ||
} | ||
, FBB_proto = FakeBlobBuilder.prototype | ||
, FB_proto = FakeBlob.prototype | ||
, FileReaderSync = global.FileReaderSync | ||
, FileException = function(type) { | ||
this.code = this[this.name = type]; | ||
} | ||
, file_ex_codes = ( | ||
"NOT_FOUND_ERR SECURITY_ERR ABORT_ERR NOT_READABLE_ERR ENCODING_ERR " | ||
+ "NO_MODIFICATION_ALLOWED_ERR INVALID_STATE_ERR SYNTAX_ERR" | ||
).split(" ") | ||
, file_ex_code = file_ex_codes.length | ||
, real_URL = global.URL || global.webkitURL || exports | ||
, real_create_object_URL = real_URL.createObjectURL | ||
, real_revoke_object_URL = real_URL.revokeObjectURL | ||
, URL = real_URL | ||
, btoa = global.btoa | ||
, atob = global.atob | ||
, ArrayBuffer = global.ArrayBuffer | ||
, Uint8Array = global.Uint8Array | ||
, origin = /^[\w-]+:\/*\[?[\w\.:-]+\]?(?::[0-9]+)?/ | ||
; | ||
FakeBlob.fake = FB_proto.fake = true; | ||
while (file_ex_code--) { | ||
FileException.prototype[file_ex_codes[file_ex_code]] = file_ex_code + 1; | ||
} | ||
// Polyfill URL | ||
if (!real_URL.createObjectURL) { | ||
URL = exports.URL = function(uri) { | ||
URL.createObjectURL = function(blob) { | ||
var | ||
uri_info = document.createElementNS("http://www.w3.org/1999/xhtml", "a") | ||
, uri_origin | ||
type = blob.type | ||
, data_URI_header | ||
; | ||
uri_info.href = uri; | ||
if (!("origin" in uri_info)) { | ||
if (uri_info.protocol.toLowerCase() === "data:") { | ||
uri_info.origin = null; | ||
if (type === null) { | ||
type = "application/octet-stream"; | ||
} | ||
if (blob instanceof FakeBlob) { | ||
data_URI_header = "data:" + type; | ||
if (blob.encoding === "base64") { | ||
return data_URI_header + ";base64," + blob.data; | ||
} else if (blob.encoding === "URI") { | ||
return data_URI_header + "," + decodeURIComponent(blob.data); | ||
} if (btoa) { | ||
return data_URI_header + ";base64," + btoa(blob.data); | ||
} else { | ||
uri_origin = uri.match(origin); | ||
uri_info.origin = uri_origin && uri_origin[1]; | ||
return data_URI_header + "," + encodeURIComponent(blob.data); | ||
} | ||
} else if (real_create_object_URL) { | ||
return real_create_object_URL.call(real_URL, blob); | ||
} | ||
return uri_info; | ||
}; | ||
} | ||
URL.createObjectURL = function(blob) { | ||
var | ||
type = blob.type | ||
, data_URI_header | ||
; | ||
if (type === null) { | ||
type = "application/octet-stream"; | ||
} | ||
if (blob instanceof FakeBlob) { | ||
data_URI_header = "data:" + type; | ||
if (blob.encoding === "base64") { | ||
return data_URI_header + ";base64," + blob.data; | ||
} else if (blob.encoding === "URI") { | ||
return data_URI_header + "," + decodeURIComponent(blob.data); | ||
} if (btoa) { | ||
return data_URI_header + ";base64," + btoa(blob.data); | ||
URL.revokeObjectURL = function(object_URL) { | ||
if (object_URL.substring(0, 5) !== "data:" && real_revoke_object_URL) { | ||
real_revoke_object_URL.call(real_URL, object_URL); | ||
} | ||
}; | ||
FBB_proto.append = function(data/*, endings*/) { | ||
var bb = this.data; | ||
// decode data to a binary string | ||
if (Uint8Array && (data instanceof ArrayBuffer || data instanceof Uint8Array)) { | ||
var str = "" | ||
, buf = new Uint8Array(data) | ||
, i = 0 | ||
, buf_len = buf.length | ||
; | ||
for (; i < buf_len; i++) { | ||
str += String.fromCharCode(buf[i]); | ||
} | ||
bb.push(str); | ||
} else if (get_class(data) === "Blob" || get_class(data) === "File") { | ||
if (FileReaderSync) { | ||
var fr = new FileReaderSync; | ||
bb.push(fr.readAsBinaryString(data)); | ||
} else { | ||
// async FileReader won't work as BlobBuilder is sync | ||
throw new FileException("NOT_READABLE_ERR"); | ||
} | ||
} else if (data instanceof FakeBlob) { | ||
if (data.encoding === "base64" && atob) { | ||
bb.push(atob(data.data)); | ||
} else if (data.encoding === "URI") { | ||
bb.push(decodeURIComponent(data.data)); | ||
} else if (data.encoding === "raw") { | ||
bb.push(data.data); | ||
} | ||
} else { | ||
return data_URI_header + "," + encodeURIComponent(blob.data); | ||
if (typeof data !== "string") { | ||
data += ""; // convert unsupported types to strings | ||
} | ||
// decode UTF-16 to binary string | ||
bb.push(unescape(encodeURIComponent(data))); | ||
} | ||
} else if (real_create_object_URL) { | ||
return real_create_object_URL.call(real_URL, blob); | ||
} | ||
}; | ||
URL.revokeObjectURL = function(object_URL) { | ||
if (object_URL.substring(0, 5) !== "data:" && real_revoke_object_URL) { | ||
real_revoke_object_URL.call(real_URL, object_URL); | ||
} | ||
}; | ||
FBB_proto.append = function(data/*, endings*/) { | ||
var bb = this.data; | ||
// decode data to a binary string | ||
if (Uint8Array && (data instanceof ArrayBuffer || data instanceof Uint8Array)) { | ||
var | ||
str = "" | ||
, buf = new Uint8Array(data) | ||
, i = 0 | ||
, buf_len = buf.length | ||
; | ||
for (; i < buf_len; i++) { | ||
str += String.fromCharCode(buf[i]); | ||
}; | ||
FBB_proto.getBlob = function(type) { | ||
if (!arguments.length) { | ||
type = null; | ||
} | ||
bb.push(str); | ||
} else if (get_class(data) === "Blob" || get_class(data) === "File") { | ||
if (FileReaderSync) { | ||
var fr = new FileReaderSync; | ||
bb.push(fr.readAsBinaryString(data)); | ||
} else { | ||
// async FileReader won't work as BlobBuilder is sync | ||
throw new FileException("NOT_READABLE_ERR"); | ||
return new FakeBlob(this.data.join(""), type, "raw"); | ||
}; | ||
FBB_proto.toString = function() { | ||
return "[object BlobBuilder]"; | ||
}; | ||
FB_proto.slice = function(start, end, type) { | ||
var args = arguments.length; | ||
if (args < 3) { | ||
type = null; | ||
} | ||
} else if (data instanceof FakeBlob) { | ||
if (data.encoding === "base64" && atob) { | ||
bb.push(atob(data.data)); | ||
} else if (data.encoding === "URI") { | ||
bb.push(decodeURIComponent(data.data)); | ||
} else if (data.encoding === "raw") { | ||
bb.push(data.data); | ||
return new FakeBlob(this.data.slice(start, args > 1 ? end : this.data.length) | ||
, type | ||
, this.encoding | ||
); | ||
}; | ||
FB_proto.toString = function() { | ||
return "[object Blob]"; | ||
}; | ||
FB_proto.close = function() { | ||
this.size = 0; | ||
delete this.data; | ||
}; | ||
return FakeBlobBuilder; | ||
}()); | ||
exports.Blob = function(blobParts, options) { | ||
var type = options ? (options.type || "") : ""; | ||
var builder = new BlobBuilder(); | ||
if (blobParts) { | ||
for (var i = 0, len = blobParts.length; i < len; i++) { | ||
if (Uint8Array && blobParts[i] instanceof Uint8Array) { | ||
builder.append(blobParts[i].buffer); | ||
} | ||
else { | ||
builder.append(blobParts[i]); | ||
} | ||
} | ||
} else { | ||
if (typeof data !== "string") { | ||
data += ""; // convert unsupported types to strings | ||
} | ||
// decode UTF-16 to binary string | ||
bb.push(unescape(encodeURIComponent(data))); | ||
} | ||
}; | ||
FBB_proto.getBlob = function(type) { | ||
if (!arguments.length) { | ||
type = null; | ||
var blob = builder.getBlob(type); | ||
if (!blob.slice && blob.webkitSlice) { | ||
blob.slice = blob.webkitSlice; | ||
} | ||
return new FakeBlob(this.data.join(""), type, "raw"); | ||
return blob; | ||
}; | ||
FBB_proto.toString = function() { | ||
return "[object BlobBuilder]"; | ||
var getPrototypeOf = Object.getPrototypeOf || function(object) { | ||
return object.__proto__; | ||
}; | ||
FB_proto.slice = function(start, end, type) { | ||
var args = arguments.length; | ||
if (args < 3) { | ||
type = null; | ||
} | ||
return new FakeBlob( | ||
this.data.slice(start, args > 1 ? end : this.data.length) | ||
, type | ||
, this.encoding | ||
); | ||
}; | ||
FB_proto.toString = function() { | ||
return "[object Blob]"; | ||
}; | ||
FB_proto.close = function() { | ||
this.size = 0; | ||
delete this.data; | ||
}; | ||
return FakeBlobBuilder; | ||
}()); | ||
exports.Blob = function(blobParts, options) { | ||
var type = options ? (options.type || "") : ""; | ||
var builder = new BlobBuilder(); | ||
if (blobParts) { | ||
for (var i = 0, len = blobParts.length; i < len; i++) { | ||
if (Uint8Array && blobParts[i] instanceof Uint8Array) { | ||
builder.append(blobParts[i].buffer); | ||
} | ||
else { | ||
builder.append(blobParts[i]); | ||
} | ||
} | ||
} | ||
var blob = builder.getBlob(type); | ||
if (!blob.slice && blob.webkitSlice) { | ||
blob.slice = blob.webkitSlice; | ||
} | ||
return blob; | ||
}; | ||
var getPrototypeOf = Object.getPrototypeOf || function(object) { | ||
return object.__proto__; | ||
}; | ||
exports.Blob.prototype = getPrototypeOf(new exports.Blob()); | ||
}); | ||
exports.Blob.prototype = getPrototypeOf(new exports.Blob()); | ||
}); | ||
})( | ||
@@ -229,3 +227,3 @@ typeof self !== "undefined" && self || | ||
typeof global !== "undefined" && global || | ||
this.content || this | ||
this | ||
); |
{ | ||
"name": "blob-polyfill", | ||
"version": "2.0.20171115", | ||
"version": "3.0.20180112", | ||
"homepage": "https://github.com/bjornstar/blob-polyfill", | ||
@@ -5,0 +5,0 @@ "authors": [ |
# `blob-polyfill` CHANGELOG | ||
## v3.0.20180112 | ||
* Resolve conflict from upstream based on date version change (@bjornstar) | ||
* Remove `this.content` to match upstream changes (@bjornstar) | ||
* Added some very basic tests (@bjornstar) | ||
* Added linting through eslint (@bjornstar) | ||
* Start using travis-ci to verify basic functionality isn't breaking (@bjornstar) | ||
## v2.0.20171115 | ||
@@ -4,0 +11,0 @@ * Add UMD wrapper to allow non-global polluting usage in Node (@jscinoz) |
{ | ||
"name": "blob-polyfill", | ||
"version": "2.0.20171115", | ||
"version": "3.0.20180112", | ||
"description": "Blob.js implements the W3C Blob interface in browsers that do not natively support it.", | ||
"main": "Blob.js", | ||
"scripts": { | ||
"test": "echo \"Error: no test specified\" && exit 1" | ||
"lint": "eslint Blob.js test", | ||
"test": "mocha test" | ||
}, | ||
@@ -22,3 +23,7 @@ "repository": { | ||
}, | ||
"homepage": "https://github.com/bjornstar/blob-polyfill" | ||
"homepage": "https://github.com/bjornstar/blob-polyfill", | ||
"devDependencies": { | ||
"eslint": "^5.1.0", | ||
"mocha": "^5.2.0" | ||
} | ||
} |
@@ -1,15 +0,37 @@ | ||
Blob.js | ||
============== | ||
# Blob Polyfill | ||
Blob.js implements the W3C [`Blob`][1] interface in browsers that do | ||
not natively support it. | ||
[![npm](https://img.shields.io/npm/v/blob-polyfill.svg)](https://www.npmjs.com/package/blob-polyfill) | ||
[![npm](https://img.shields.io/npm/dm/blob-polyfill.svg)](https://www.npmjs.com/package/blob-polyfill) | ||
Supported browsers | ||
------------------ | ||
## Purpose | ||
Blob Polyfill serves [Blob.js][0] over npm. | ||
Blob.js implements the W3C [`Blob`][1] interface in browsers that do not natively support it. | ||
## Changelog | ||
[Please read the changelog](CHANGELOG.md) | ||
## Installation | ||
To install this library, run: | ||
```bash | ||
$ npm install blob-polyfill --save | ||
``` | ||
## Supported browsers | ||
Blob.js shares the [same supported browsers as FileSaver.js][2]. | ||
## License | ||
[MIT](LICENSE.md) | ||
![Tracking image](https://in.getclicky.com/212712ns.gif) | ||
[0]: https://github.com/eligrey/Blob.js | ||
[1]: https://developer.mozilla.org/en-US/docs/Web/API/Blob | ||
[2]: https://github.com/eligrey/FileSaver.js#supported-browsers | ||
[2]: https://github.com/eligrey/FileSaver.js#supported-browsers |
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
No tests
QualityPackage does not have any tests. This is a strong signal of a poorly maintained or low quality package.
Found 1 instance in 1 package
10697
0
38
2
243