start on typescript

This commit is contained in:
Nolan Lawson 2018-05-21 12:33:27 -07:00
parent 8c0f68dc87
commit da31976065
8 changed files with 233 additions and 550 deletions

2
.gitignore vendored
View File

@ -5,4 +5,4 @@ coverage
test/test-bundle.js
npm-debug.log
dist
api.md
lib

6
.tslint.json Normal file
View File

@ -0,0 +1,6 @@
{
"extends": "tslint-config-standard",
"rules": {
"no-var-keyword": false
}
}

View File

@ -7,6 +7,7 @@ Changelog
- Some APIs that returned `Promise`s now return bare values.
- Removed Bower support
- Added ES module support
- Added TypeScript support
- Added `arrayBufferToBinaryString()` and `binaryStringToArrayBuffer()`
## v1.0.0

329
dist/blob-util.js vendored
View File

@ -1,329 +0,0 @@
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
typeof define === 'function' && define.amd ? define(['exports'], factory) :
(factory((global.blobUtil = {})));
}(this, (function (exports) { 'use strict';
/* global Promise */
/* exported createObjectURL, revokeObjectURL, binaryStringToBlob, blobToDataURL,
imgSrcToDataURL, imgSrcToBlob, arrayBufferToBlob, blobToArrayBuffer */
function loadImage(src, crossOrigin) {
return new Promise(function (resolve, reject) {
var img = new Image();
if (crossOrigin) {
img.crossOrigin = crossOrigin;
}
img.onload = function () {
resolve(img);
};
img.onerror = reject;
img.src = src;
});
}
function imgToCanvas(img) {
var canvas = document.createElement('canvas');
canvas.width = img.width;
canvas.height = img.height;
// copy the image contents to the canvas
var context = canvas.getContext('2d');
context.drawImage(
img,
0, 0,
img.width, img.height,
0, 0,
img.width, img.height);
return canvas;
}
/**
* Convert a binary string to an <code>ArrayBuffer</code>.
* @param {string} binary - binary string
* @returns {ArrayBuffer}
*/
function binaryStringToArrayBuffer(binary) {
var length = binary.length;
var buf = new ArrayBuffer(length);
var arr = new Uint8Array(buf);
var i = -1;
while (++i < length) {
arr[i] = binary.charCodeAt(i);
}
return buf;
}
/**
* Convert an <code>ArrayBuffer</code> to a binary string.
* @param {ArrayBuffer} buffer - array buffer
* @returns {string}
*/
function arrayBufferToBinaryString(buffer) {
var binary = '';
var bytes = new Uint8Array(buffer);
var length = bytes.byteLength;
var i = -1;
while (++i < length) {
binary += String.fromCharCode(bytes[i]);
}
return binary;
}
/**
* Shim for
* [new Blob()]{@link https://developer.mozilla.org/en-US/docs/Web/API/Blob.Blob}
* to support
* [older browsers that use the deprecated <code>BlobBuilder</code> API]{@link http://caniuse.com/blob}.
*
* @param {Array} parts - content of the <code>Blob</code>
* @param {Object} options - usually <code>{type: myContentType}</code>,
* you can also pass a string for the content type
* @returns {Blob}
*/
function createBlob(parts, properties) {
/* global BlobBuilder,MSBlobBuilder,MozBlobBuilder,WebKitBlobBuilder */
parts = parts || [];
properties = properties || {};
if (typeof properties === 'string') {
properties = {type: properties}; // infer content type
}
try {
return new Blob(parts, properties);
} catch (e) {
if (e.name !== 'TypeError') {
throw e;
}
var Builder = typeof BlobBuilder !== 'undefined' ?
BlobBuilder : typeof MSBlobBuilder !== 'undefined' ?
MSBlobBuilder : typeof MozBlobBuilder !== 'undefined' ?
MozBlobBuilder : WebKitBlobBuilder;
var builder = new Builder();
for (var i = 0; i < parts.length; i += 1) {
builder.append(parts[i]);
}
return builder.getBlob(properties.type);
}
}
/**
* Shim for
* [URL.createObjectURL()]{@link https://developer.mozilla.org/en-US/docs/Web/API/URL.createObjectURL}
* to support browsers that only have the prefixed
* <code>webkitURL</code> (e.g. Android <4.4).
* @param {Blob} blob
* @returns {string} url
*/
function createObjectURL(blob) {
/* global webkitURL */
return (typeof URL !== 'undefined' ? URL : webkitURL).createObjectURL(blob);
}
/**
* Shim for
* [URL.revokeObjectURL()]{@link https://developer.mozilla.org/en-US/docs/Web/API/URL.revokeObjectURL}
* to support browsers that only have the prefixed
* <code>webkitURL</code> (e.g. Android <4.4).
* @param {string} url
*/
function revokeObjectURL(url) {
/* global webkitURL */
return (typeof URL !== 'undefined' ? URL : webkitURL).revokeObjectURL(url);
}
/**
* Convert a <code>Blob</code> to a binary string.
*
* @param {Blob} blob
* @returns {Promise} Promise that resolves with the binary string
*/
function blobToBinaryString(blob) {
return new Promise(function (resolve, reject) {
var reader = new FileReader();
var hasBinaryString = typeof reader.readAsBinaryString === 'function';
reader.onloadend = function (e) {
var result = e.target.result || '';
if (hasBinaryString) {
return resolve(result);
}
resolve(arrayBufferToBinaryString(result));
};
reader.onerror = reject;
if (hasBinaryString) {
reader.readAsBinaryString(blob);
} else {
reader.readAsArrayBuffer(blob);
}
});
}
/**
* Convert a base64-encoded string to a <code>Blob</code>.
* @param {string} base64
* @param {string|undefined} type - the content type (optional)
* @returns {Blob}
*/
function base64StringToBlob(base64, type) {
var parts = [binaryStringToArrayBuffer(atob(base64))];
return type ? createBlob(parts, {type: type}) : createBlob(parts);
}
/**
* Convert a binary string to a <code>Blob</code>.
* @param {string} binary
* @param {string|undefined} type - the content type (optional)
* @returns {Blob}
*/
function binaryStringToBlob(binary, type) {
return base64StringToBlob(btoa(binary), type);
}
/**
* Convert a <code>Blob</code> to a binary string.
* @param {Blob} blob
* @returns {Promise} Promise that resolves with the binary string
*/
function blobToBase64String(blob) {
return blobToBinaryString(blob).then(btoa);
}
/**
* Convert a data URL string
* (e.g. <code>'data:image/png;base64,iVBORw0KG...'</code>)
* to a <code>Blob</code>.
* @param {string} dataURL
* @returns {Blob}
*/
function dataURLToBlob(dataURL) {
var type = dataURL.match(/data:([^;]+)/)[1];
var base64 = dataURL.replace(/^[^,]+,/, '');
var buff = binaryStringToArrayBuffer(atob(base64));
return createBlob([buff], {type: type});
}
/**
* Convert a <code>Blob</code> to a data URL string
* (e.g. <code>'data:image/png;base64,iVBORw0KG...'</code>).
* @param {Blob} blob
* @returns {Promise} Promise that resolves with the data URL string
*/
function blobToDataURL(blob) {
return blobToBase64String(blob).then(function (base64String) {
return 'data:' + blob.type + ';base64,' + base64String;
});
}
/**
* Convert an image's <code>src</code> URL to a data URL by loading the image and painting
* it to a <code>canvas</code>.
*
* <p/>Note: this will coerce the image to the desired content type, and it
* will only paint the first frame of an animated GIF.
*
* @param {string} src
* @param {string|undefined} type - the content type (optional, defaults to 'image/png')
* @param {string|undefined} crossOrigin - for CORS-enabled images, set this to
* 'Anonymous' to avoid "tainted canvas" errors
* @param {number|undefined} quality - a number between 0 and 1 indicating image quality
* if the requested type is 'image/jpeg' or 'image/webp'
* @returns {Promise} Promise that resolves with the data URL string
*/
function imgSrcToDataURL(src, type, crossOrigin, quality) {
type = type || 'image/png';
return loadImage(src, crossOrigin).then(imgToCanvas).then(function (canvas) {
return canvas.toDataURL(type, quality);
});
}
/**
* Convert a <code>canvas</code> to a <code>Blob</code>.
* @param {string} canvas
* @param {string|undefined} type - the content type (optional, defaults to 'image/png')
* @param {number|undefined} quality - a number between 0 and 1 indicating image quality
* if the requested type is 'image/jpeg' or 'image/webp'
* @returns {Promise} Promise that resolves with the <code>Blob</code>
*/
function canvasToBlob(canvas, type, quality) {
if (typeof canvas.toBlob === 'function') {
return new Promise(function (resolve) {
canvas.toBlob(resolve, type, quality);
});
}
return Promise.resolve(dataURLToBlob(canvas.toDataURL(type, quality)));
}
/**
* Convert an image's <code>src</code> URL to a <code>Blob</code> by loading the image and painting
* it to a <code>canvas</code>.
*
* <p/>Note: this will coerce the image to the desired content type, and it
* will only paint the first frame of an animated GIF.
*
* @param {string} src
* @param {string|undefined} type - the content type (optional, defaults to 'image/png')
* @param {string|undefined} crossOrigin - for CORS-enabled images, set this to
* 'Anonymous' to avoid "tainted canvas" errors
* @param {number|undefined} quality - a number between 0 and 1 indicating image quality
* if the requested type is 'image/jpeg' or 'image/webp'
* @returns {Promise} Promise that resolves with the <code>Blob</code>
*/
function imgSrcToBlob(src, type, crossOrigin, quality) {
type = type || 'image/png';
return loadImage(src, crossOrigin).then(imgToCanvas).then(function (canvas) {
return canvasToBlob(canvas, type, quality);
});
}
/**
* Convert an <code>ArrayBuffer</code> to a <code>Blob</code>.
*
* @param {ArrayBuffer} buffer
* @param {string|undefined} type - the content type (optional)
* @returns {Blob}
*/
function arrayBufferToBlob(buffer, type) {
return createBlob([buffer], type);
}
/**
* Convert a <code>Blob</code> to an <code>ArrayBuffer</code>.
* @param {Blob} blob
* @returns {Promise} Promise that resolves with the <code>ArrayBuffer</code>
*/
function blobToArrayBuffer(blob) {
return new Promise(function (resolve, reject) {
var reader = new FileReader();
reader.onloadend = function (e) {
var result = e.target.result || new ArrayBuffer(0);
resolve(result);
};
reader.onerror = reject;
reader.readAsArrayBuffer(blob);
});
}
exports.binaryStringToArrayBuffer = binaryStringToArrayBuffer;
exports.arrayBufferToBinaryString = arrayBufferToBinaryString;
exports.createBlob = createBlob;
exports.createObjectURL = createObjectURL;
exports.revokeObjectURL = revokeObjectURL;
exports.blobToBinaryString = blobToBinaryString;
exports.base64StringToBlob = base64StringToBlob;
exports.binaryStringToBlob = binaryStringToBlob;
exports.blobToBase64String = blobToBase64String;
exports.dataURLToBlob = dataURLToBlob;
exports.blobToDataURL = blobToDataURL;
exports.imgSrcToDataURL = imgSrcToDataURL;
exports.canvasToBlob = canvasToBlob;
exports.imgSrcToBlob = imgSrcToBlob;
exports.arrayBufferToBlob = arrayBufferToBlob;
exports.blobToArrayBuffer = blobToArrayBuffer;
Object.defineProperty(exports, '__esModule', { value: true });
})));

View File

@ -1 +0,0 @@
!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports):"function"==typeof define&&define.amd?define(["exports"],n):n(e.blobUtil={})}(this,function(e){"use strict";function n(e,n){return new Promise(function(r,t){var o=new Image;n&&(o.crossOrigin=n),o.onload=function(){r(o)},o.onerror=t,o.src=e})}function r(e){var n=document.createElement("canvas");return n.width=e.width,n.height=e.height,n.getContext("2d").drawImage(e,0,0,e.width,e.height,0,0,e.width,e.height),n}function t(e){for(var n=e.length,r=new ArrayBuffer(n),t=new Uint8Array(r),o=-1;++o<n;)t[o]=e.charCodeAt(o);return r}function o(e){for(var n="",r=new Uint8Array(e),t=r.byteLength,o=-1;++o<t;)n+=String.fromCharCode(r[o]);return n}function i(e,n){e=e||[],"string"==typeof(n=n||{})&&(n={type:n});try{return new Blob(e,n)}catch(i){if("TypeError"!==i.name)throw i;for(var r="undefined"!=typeof BlobBuilder?BlobBuilder:"undefined"!=typeof MSBlobBuilder?MSBlobBuilder:"undefined"!=typeof MozBlobBuilder?MozBlobBuilder:WebKitBlobBuilder,t=new r,o=0;o<e.length;o+=1)t.append(e[o]);return t.getBlob(n.type)}}function u(e){return("undefined"!=typeof URL?URL:webkitURL).createObjectURL(e)}function a(e){return("undefined"!=typeof URL?URL:webkitURL).revokeObjectURL(e)}function f(e){return new Promise(function(n,r){var t=new FileReader,i="function"==typeof t.readAsBinaryString;t.onloadend=function(e){var r=e.target.result||"";if(i)return n(r);n(o(r))},t.onerror=r,i?t.readAsBinaryString(e):t.readAsArrayBuffer(e)})}function c(e,n){var r=[t(atob(e))];return n?i(r,{type:n}):i(r)}function d(e,n){return c(btoa(e),n)}function b(e){return f(e).then(btoa)}function l(e){var n=e.match(/data:([^;]+)/)[1],r=e.replace(/^[^,]+,/,"");return i([t(atob(r))],{type:n})}function B(e){return b(e).then(function(n){return"data:"+e.type+";base64,"+n})}function y(e,t,o,i){return t=t||"image/png",n(e,o).then(r).then(function(e){return e.toDataURL(t,i)})}function g(e,n,r){return"function"==typeof e.toBlob?new Promise(function(t){e.toBlob(t,n,r)}):Promise.resolve(l(e.toDataURL(n,r)))}function s(e,t,o,i){return t=t||"image/png",n(e,o).then(r).then(function(e){return g(e,t,i)})}function h(e,n){return i([e],n)}function p(e){return new Promise(function(n,r){var t=new FileReader;t.onloadend=function(e){var r=e.target.result||new ArrayBuffer(0);n(r)},t.onerror=r,t.readAsArrayBuffer(e)})}e.binaryStringToArrayBuffer=t,e.arrayBufferToBinaryString=o,e.createBlob=i,e.createObjectURL=u,e.revokeObjectURL=a,e.blobToBinaryString=f,e.base64StringToBlob=c,e.binaryStringToBlob=d,e.blobToBase64String=b,e.dataURLToBlob=l,e.blobToDataURL=B,e.imgSrcToDataURL=y,e.canvasToBlob=g,e.imgSrcToBlob=s,e.arrayBufferToBlob=h,e.blobToArrayBuffer=p,Object.defineProperty(e,"__esModule",{value:!0})});

View File

@ -21,15 +21,16 @@
"url": "https://github.com/nolanlawson/blob-util/issues"
},
"scripts": {
"jshint": "jshint -c .jshintrc src/*.js test/test.js",
"test": "npm run build && npm run jshint && zuul --no-coverage ./test/test.js",
"lint": "standard test/*js && tslint -c .tslint.json src/*ts",
"test": "npm run build && npm run lint && zuul --no-coverage ./test/test.js",
"test-local": "npm run build && zuul ./test/test.js --local 9000 --no-coverage",
"clean": "rimraf dist && mkdirp dist",
"build": "run-s clean build-all min",
"build-all": "run-p build-es build-cjs build-umd",
"build-es": "rollup -i src/index.js -f es -o dist/blob-util.es.js",
"build-cjs": "rollup -i src/index.js -f cjs -o dist/blob-util.cjs.js",
"build-umd": "rollup -i src/index.js -f umd -n blobUtil -o dist/blob-util.js",
"clean": "rimraf dist lib && mkdirp dist lib",
"build": "run-s clean build-ts build-js min",
"build-ts": "tsc src/blob-util.ts --target ES6 --module es2015 --outDir lib -d && cp lib/blob-util.d.ts dist/",
"build-js": "run-p build-es build-cjs build-umd",
"build-es": "rollup -i lib/blob-util.js -f es -o dist/blob-util.es.js",
"build-cjs": "rollup -i lib/blob-util.js -f cjs -o dist/blob-util.cjs.js",
"build-umd": "rollup -i lib/blob-util.js -f umd -n blobUtil -o dist/blob-util.js",
"min": "uglifyjs dist/blob-util.js -mc > dist/blob-util.min.js"
},
"devDependencies": {
@ -37,7 +38,6 @@
"chai": "~1.8.1",
"chai-as-promised": "~4.1.0",
"istanbul": "^0.2.7",
"jshint": "~2.3.0",
"mkdirp": "^0.5.0",
"mocha": "~1.18",
"native-or-lie": "1.0.2",
@ -45,6 +45,12 @@
"request": "^2.36.0",
"rimraf": "^2.6.2",
"rollup": "^0.59.1",
"standard": "^11.0.1",
"tslint": "^5.10.0",
"tslint-config-standard": "^7.0.0",
"typedoc": "^0.11.1",
"typedoc-plugin-markdown": "^1.1.11",
"typescript": "^2.8.3",
"uglify-js": "^2.4.13",
"zuul": "^3.10.1",
"zuul-ngrok": "nolanlawson/zuul-ngrok#patch-1"

View File

@ -1,37 +1,37 @@
/* global Promise */
/* global Promise, Image, Blob, FileReader, atob, btoa */
/* exported createObjectURL, revokeObjectURL, binaryStringToBlob, blobToDataURL,
imgSrcToDataURL, imgSrcToBlob, arrayBufferToBlob, blobToArrayBuffer */
function loadImage(src, crossOrigin) {
function loadImage (src, crossOrigin) {
return new Promise(function (resolve, reject) {
var img = new Image();
var img = new Image()
if (crossOrigin) {
img.crossOrigin = crossOrigin;
img.crossOrigin = crossOrigin
}
img.onload = function () {
resolve(img);
};
img.onerror = reject;
img.src = src;
});
resolve(img)
}
img.onerror = reject
img.src = src
})
}
function imgToCanvas(img) {
var canvas = document.createElement('canvas');
function imgToCanvas (img) {
var canvas = document.createElement('canvas')
canvas.width = img.width;
canvas.height = img.height;
canvas.width = img.width
canvas.height = img.height
// copy the image contents to the canvas
var context = canvas.getContext('2d');
var context = canvas.getContext('2d')
context.drawImage(
img,
0, 0,
img.width, img.height,
0, 0,
img.width, img.height);
img.width, img.height)
return canvas;
return canvas
}
/**
@ -39,15 +39,15 @@ function imgToCanvas(img) {
* @param {string} binary - binary string
* @returns {ArrayBuffer}
*/
export function binaryStringToArrayBuffer(binary) {
var length = binary.length;
var buf = new ArrayBuffer(length);
var arr = new Uint8Array(buf);
var i = -1;
export function binaryStringToArrayBuffer (binary) {
var length = binary.length
var buf = new ArrayBuffer(length)
var arr = new Uint8Array(buf)
var i = -1
while (++i < length) {
arr[i] = binary.charCodeAt(i);
arr[i] = binary.charCodeAt(i)
}
return buf;
return buf
}
/**
@ -55,15 +55,15 @@ export function binaryStringToArrayBuffer(binary) {
* @param {ArrayBuffer} buffer - array buffer
* @returns {string}
*/
export function arrayBufferToBinaryString(buffer) {
var binary = '';
var bytes = new Uint8Array(buffer);
var length = bytes.byteLength;
var i = -1;
export function arrayBufferToBinaryString (buffer) {
var binary = ''
var bytes = new Uint8Array(buffer)
var length = bytes.byteLength
var i = -1
while (++i < length) {
binary += String.fromCharCode(bytes[i]);
binary += String.fromCharCode(bytes[i])
}
return binary;
return binary
}
/**
@ -77,28 +77,28 @@ export function arrayBufferToBinaryString(buffer) {
* you can also pass a string for the content type
* @returns {Blob}
*/
export function createBlob(parts, properties) {
export function createBlob (parts, properties) {
/* global BlobBuilder,MSBlobBuilder,MozBlobBuilder,WebKitBlobBuilder */
parts = parts || [];
properties = properties || {};
parts = parts || []
properties = properties || {}
if (typeof properties === 'string') {
properties = {type: properties}; // infer content type
properties = { type: properties } // infer content type
}
try {
return new Blob(parts, properties);
return new Blob(parts, properties)
} catch (e) {
if (e.name !== 'TypeError') {
throw e;
throw e
}
var Builder = typeof BlobBuilder !== 'undefined' ?
BlobBuilder : typeof MSBlobBuilder !== 'undefined' ?
MSBlobBuilder : typeof MozBlobBuilder !== 'undefined' ?
MozBlobBuilder : WebKitBlobBuilder;
var builder = new Builder();
var Builder = typeof BlobBuilder !== 'undefined'
? BlobBuilder : typeof MSBlobBuilder !== 'undefined'
? MSBlobBuilder : typeof MozBlobBuilder !== 'undefined'
? MozBlobBuilder : WebKitBlobBuilder
var builder = new Builder()
for (var i = 0; i < parts.length; i += 1) {
builder.append(parts[i]);
builder.append(parts[i])
}
return builder.getBlob(properties.type);
return builder.getBlob(properties.type)
}
}
@ -110,9 +110,9 @@ export function createBlob(parts, properties) {
* @param {Blob} blob
* @returns {string} url
*/
export function createObjectURL(blob) {
export function createObjectURL (blob) {
/* global webkitURL */
return (typeof URL !== 'undefined' ? URL : webkitURL).createObjectURL(blob);
return (typeof URL !== 'undefined' ? URL : webkitURL).createObjectURL(blob)
}
/**
@ -122,9 +122,9 @@ export function createObjectURL(blob) {
* <code>webkitURL</code> (e.g. Android <4.4).
* @param {string} url
*/
export function revokeObjectURL(url) {
export function revokeObjectURL (url) {
/* global webkitURL */
return (typeof URL !== 'undefined' ? URL : webkitURL).revokeObjectURL(url);
return (typeof URL !== 'undefined' ? URL : webkitURL).revokeObjectURL(url)
}
/**
@ -133,24 +133,24 @@ export function revokeObjectURL(url) {
* @param {Blob} blob
* @returns {Promise} Promise that resolves with the binary string
*/
export function blobToBinaryString(blob) {
export function blobToBinaryString (blob) {
return new Promise(function (resolve, reject) {
var reader = new FileReader();
var hasBinaryString = typeof reader.readAsBinaryString === 'function';
var reader = new FileReader()
var hasBinaryString = typeof reader.readAsBinaryString === 'function'
reader.onloadend = function (e) {
var result = e.target.result || '';
var result = e.target.result || ''
if (hasBinaryString) {
return resolve(result);
return resolve(result)
}
resolve(arrayBufferToBinaryString(result));
};
reader.onerror = reject;
if (hasBinaryString) {
reader.readAsBinaryString(blob);
} else {
reader.readAsArrayBuffer(blob);
resolve(arrayBufferToBinaryString(result))
}
});
reader.onerror = reject
if (hasBinaryString) {
reader.readAsBinaryString(blob)
} else {
reader.readAsArrayBuffer(blob)
}
})
}
/**
@ -159,9 +159,9 @@ export function blobToBinaryString(blob) {
* @param {string|undefined} type - the content type (optional)
* @returns {Blob}
*/
export function base64StringToBlob(base64, type) {
var parts = [binaryStringToArrayBuffer(atob(base64))];
return type ? createBlob(parts, {type: type}) : createBlob(parts);
export function base64StringToBlob (base64, type) {
var parts = [binaryStringToArrayBuffer(atob(base64))]
return type ? createBlob(parts, { type: type }) : createBlob(parts)
}
/**
@ -170,8 +170,8 @@ export function base64StringToBlob(base64, type) {
* @param {string|undefined} type - the content type (optional)
* @returns {Blob}
*/
export function binaryStringToBlob(binary, type) {
return base64StringToBlob(btoa(binary), type);
export function binaryStringToBlob (binary, type) {
return base64StringToBlob(btoa(binary), type)
}
/**
@ -179,8 +179,8 @@ export function binaryStringToBlob(binary, type) {
* @param {Blob} blob
* @returns {Promise} Promise that resolves with the binary string
*/
export function blobToBase64String(blob) {
return blobToBinaryString(blob).then(btoa);
export function blobToBase64String (blob) {
return blobToBinaryString(blob).then(btoa)
}
/**
@ -190,12 +190,12 @@ export function blobToBase64String(blob) {
* @param {string} dataURL
* @returns {Blob}
*/
export function dataURLToBlob(dataURL) {
var type = dataURL.match(/data:([^;]+)/)[1];
var base64 = dataURL.replace(/^[^,]+,/, '');
export function dataURLToBlob (dataURL) {
var type = dataURL.match(/data:([^;]+)/)[1]
var base64 = dataURL.replace(/^[^,]+,/, '')
var buff = binaryStringToArrayBuffer(atob(base64));
return createBlob([buff], {type: type});
var buff = binaryStringToArrayBuffer(atob(base64))
return createBlob([buff], { type: type })
}
/**
@ -204,10 +204,10 @@ export function dataURLToBlob(dataURL) {
* @param {Blob} blob
* @returns {Promise} Promise that resolves with the data URL string
*/
export function blobToDataURL(blob) {
export function blobToDataURL (blob) {
return blobToBase64String(blob).then(function (base64String) {
return 'data:' + blob.type + ';base64,' + base64String;
});
return 'data:' + blob.type + ';base64,' + base64String
})
}
/**
@ -225,12 +225,12 @@ export function blobToDataURL(blob) {
* if the requested type is 'image/jpeg' or 'image/webp'
* @returns {Promise} Promise that resolves with the data URL string
*/
export function imgSrcToDataURL(src, type, crossOrigin, quality) {
type = type || 'image/png';
export function imgSrcToDataURL (src, type, crossOrigin, quality) {
type = type || 'image/png'
return loadImage(src, crossOrigin).then(imgToCanvas).then(function (canvas) {
return canvas.toDataURL(type, quality);
});
return canvas.toDataURL(type, quality)
})
}
/**
@ -241,13 +241,13 @@ export function imgSrcToDataURL(src, type, crossOrigin, quality) {
* if the requested type is 'image/jpeg' or 'image/webp'
* @returns {Promise} Promise that resolves with the <code>Blob</code>
*/
export function canvasToBlob(canvas, type, quality) {
export function canvasToBlob (canvas, type, quality) {
if (typeof canvas.toBlob === 'function') {
return new Promise(function (resolve) {
canvas.toBlob(resolve, type, quality);
});
canvas.toBlob(resolve, type, quality)
})
}
return Promise.resolve(dataURLToBlob(canvas.toDataURL(type, quality)));
return Promise.resolve(dataURLToBlob(canvas.toDataURL(type, quality)))
}
/**
@ -265,12 +265,12 @@ export function canvasToBlob(canvas, type, quality) {
* if the requested type is 'image/jpeg' or 'image/webp'
* @returns {Promise} Promise that resolves with the <code>Blob</code>
*/
export function imgSrcToBlob(src, type, crossOrigin, quality) {
type = type || 'image/png';
export function imgSrcToBlob (src, type, crossOrigin, quality) {
type = type || 'image/png'
return loadImage(src, crossOrigin).then(imgToCanvas).then(function (canvas) {
return canvasToBlob(canvas, type, quality);
});
return canvasToBlob(canvas, type, quality)
})
}
/**
@ -280,8 +280,8 @@ export function imgSrcToBlob(src, type, crossOrigin, quality) {
* @param {string|undefined} type - the content type (optional)
* @returns {Blob}
*/
export function arrayBufferToBlob(buffer, type) {
return createBlob([buffer], type);
export function arrayBufferToBlob (buffer, type) {
return createBlob([buffer], type)
}
/**
@ -289,14 +289,14 @@ export function arrayBufferToBlob(buffer, type) {
* @param {Blob} blob
* @returns {Promise} Promise that resolves with the <code>ArrayBuffer</code>
*/
export function blobToArrayBuffer(blob) {
export function blobToArrayBuffer (blob) {
return new Promise(function (resolve, reject) {
var reader = new FileReader();
var reader = new FileReader()
reader.onloadend = function (e) {
var result = e.target.result || new ArrayBuffer(0);
resolve(result);
};
reader.onerror = reject;
reader.readAsArrayBuffer(blob);
});
var result = e.target.result || new ArrayBuffer(0)
resolve(result)
}
reader.onerror = reject
reader.readAsArrayBuffer(blob)
})
}

View File

@ -1,200 +1,200 @@
'use strict';
'use strict'
/* global describe, it, atob, before */
if (typeof Promise === 'undefined') {
window.Promise = require('native-or-lie');
window.Promise = require('native-or-lie')
}
var blobUtil = require('../dist/blob-util.cjs.js');
var blobUtil = require('../dist/blob-util.cjs.js')
var chai = require('chai');
chai.use(require("chai-as-promised"));
var chai = require('chai')
chai.use(require('chai-as-promised'))
var should = chai.should();
var Promise = require('native-or-lie');
var should = chai.should()
var transparent1x1Png =
'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR4nGP6zwAAAg' +
'cBApocMXEAAAAASUVORK5CYII=';
'cBApocMXEAAAAASUVORK5CYII='
var black1x1Png =
'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAAAAAA6fptVAAAACklEQVR4nGNiAAAABg' +
'ADNjd8qAAAAABJRU5ErkJggg==';
'ADNjd8qAAAAABJRU5ErkJggg=='
describe('basic tests', function () {
this.timeout(30000);
this.timeout(30000)
before(function () {
var img = document.createElement('img');
img.src = 'test/kirby.gif';
img.id = 'kirby';
document.body.appendChild(img);
var img = document.createElement('img')
img.src = 'test/kirby.gif'
img.id = 'kirby'
document.body.appendChild(img)
var transparent = document.createElement('img');
var transparent = document.createElement('img')
transparent.src = 'data:image/png;base64,iVBORw0KGgoAAAANSUh' +
'EUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR4nGP6zwAAAgcBApocMXEA' +
'AAAASUVORK5CYII=';
transparent.id = 'transparent';
document.body.appendChild(transparent);
});
'AAAASUVORK5CYII='
transparent.id = 'transparent'
document.body.appendChild(transparent)
})
it('convert plain blobs', function () {
var blob = blobUtil.createBlob(['foo'], 'text/plain');
blob.type.should.equal('text/plain');
var blob = blobUtil.createBlob(['foo'], 'text/plain')
blob.type.should.equal('text/plain')
return blobUtil.blobToBase64String(blob).then(function (base64) {
base64.should.equal('Zm9v');
});
});
base64.should.equal('Zm9v')
})
})
it('convert regular gif', function () {
var img = document.getElementById('kirby');
var img = document.getElementById('kirby')
return blobUtil.imgSrcToBlob(img.src).then(function (blob) {
blob.type.should.equal('image/png');
blob.type.should.equal('image/png')
return blobUtil.blobToBase64String(blob).then(function (base64) {
should.exist(base64);
});
});
});
should.exist(base64)
})
})
})
it('convert regular gif as jpeg', function () {
var img = document.getElementById('kirby');
var img = document.getElementById('kirby')
return blobUtil.imgSrcToBlob(img.src, 'image/jpeg').then(function (blob) {
blob.type.should.equal('image/jpeg');
blob.type.should.equal('image/jpeg')
return blobUtil.blobToBase64String(blob).then(function (base64) {
should.exist(base64);
});
});
});
should.exist(base64)
})
})
})
it('convert regular gif to canvas and back', function () {
var img = document.getElementById('kirby');
var img = document.getElementById('kirby')
return blobUtil.imgSrcToBlob(img.src).then(function (blob) {
blob.type.should.equal('image/png');
blob.type.should.equal('image/png')
var url = blobUtil.createObjectURL(blob);
var url = blobUtil.createObjectURL(blob)
return blobUtil.imgSrcToBlob(url).then(function (otherBlob) {
return Promise.all([
blobUtil.blobToBase64String(blob),
blobUtil.blobToBase64String(otherBlob)
]).then(function (strings) {
strings[0].should.equal(strings[1]);
});
});
});
});
strings[0].should.equal(strings[1])
})
})
})
})
it('convert base64 to png', function () {
return Promise.resolve(blobUtil.base64StringToBlob(transparent1x1Png, 'image/png')).then(function (blob) {
return blobUtil.blobToBase64String(blob);
return blobUtil.blobToBase64String(blob)
}).then(function (string) {
string.should.equal(transparent1x1Png);
});
});
string.should.equal(transparent1x1Png)
})
})
it('convert base64 to png 2', function () {
return Promise.resolve(blobUtil.base64StringToBlob(black1x1Png, 'image/png')).then(function (blob) {
return blobUtil.blobToBase64String(blob);
return blobUtil.blobToBase64String(blob)
}).then(function (string) {
string.should.equal(black1x1Png);
});
});
string.should.equal(black1x1Png)
})
})
it('convert data url', function () {
var dataURL = 'data:image/png;base64,' + transparent1x1Png;
var dataURL = 'data:image/png;base64,' + transparent1x1Png
return Promise.resolve(blobUtil.dataURLToBlob(dataURL)).then(function (blob) {
return blobUtil.blobToBase64String(blob);
return blobUtil.blobToBase64String(blob)
}).then(function (string) {
string.should.equal(transparent1x1Png);
});
});
string.should.equal(transparent1x1Png)
})
})
it('convert blob to data url', function () {
var blob = blobUtil.createBlob(['foo'], 'text/plain');
var blob = blobUtil.createBlob(['foo'], 'text/plain')
return blobUtil.blobToDataURL(blob).then(function (dataURL) {
dataURL.should.equal('data:text/plain;base64,Zm9v');
});
});
dataURL.should.equal('data:text/plain;base64,Zm9v')
})
})
it('convert img to dataURL', function () {
var img = document.getElementById('transparent');
var img = document.getElementById('transparent')
return blobUtil.imgSrcToDataURL(img.src).then(function (url) {
url.should.match(/^data:image\/png;base64/);
});
});
url.should.match(/^data:image\/png;base64/)
})
})
it('convert img to dataURL 2', function () {
var img = document.getElementById('kirby');
var img = document.getElementById('kirby')
return blobUtil.imgSrcToDataURL(img.src).then(function (url) {
url.should.match(/^data:image\/png;base64/);
});
});
url.should.match(/^data:image\/png;base64/)
})
})
it('convert img to dataURL 3', function () {
var img = document.getElementById('kirby');
var img = document.getElementById('kirby')
return blobUtil.imgSrcToDataURL(img.src, 'image/jpeg').then(function (url) {
url.should.match(/^data:image\/jpeg;base64/);
});
});
url.should.match(/^data:image\/jpeg;base64/)
})
})
it('convert to binary and back', function () {
var binary = atob(transparent1x1Png);
var binary = atob(transparent1x1Png)
return Promise.resolve(blobUtil.binaryStringToBlob(binary, 'image/png')).then(function (blob) {
blob.size.should.equal(68);
blob.size.should.equal(68)
return blobUtil.blobToBase64String(blob).then(function (base64) {
base64.should.equal(transparent1x1Png);
return blobUtil.blobToBinaryString(blob);
base64.should.equal(transparent1x1Png)
return blobUtil.blobToBinaryString(blob)
}).then(function (bin) {
bin.should.equal(atob(transparent1x1Png));
});
});
});
bin.should.equal(atob(transparent1x1Png))
})
})
})
it('convert to array buffer and back', function () {
var bin = atob(transparent1x1Png);
var buffer = new ArrayBuffer(bin.length);
var arr = new Uint8Array(buffer);
var bin = atob(transparent1x1Png)
var buffer = new ArrayBuffer(bin.length)
var arr = new Uint8Array(buffer)
for (var i = 0; i < bin.length; i++) {
arr[i] = bin.charCodeAt(i);
arr[i] = bin.charCodeAt(i)
}
return Promise.resolve(blobUtil.arrayBufferToBlob(buffer, 'image/png')).then(function (blob) {
blob.size.should.equal(68);
blob.size.should.equal(68)
return blobUtil.blobToBase64String(blob).then(function (base64) {
base64.should.equal(transparent1x1Png);
return blobUtil.blobToBinaryString(blob);
base64.should.equal(transparent1x1Png)
return blobUtil.blobToBinaryString(blob)
}).then(function (bin) {
bin.should.equal(atob(transparent1x1Png));
return blobUtil.blobToArrayBuffer(blob);
bin.should.equal(atob(transparent1x1Png))
return blobUtil.blobToArrayBuffer(blob)
}).then(function (buff) {
buff.byteLength.should.equal(68);
return blobUtil.arrayBufferToBlob(buff, 'image/png');
buff.byteLength.should.equal(68)
return blobUtil.arrayBufferToBlob(buff, 'image/png')
}).then(function (blob) {
return blobUtil.blobToBase64String(blob);
return blobUtil.blobToBase64String(blob)
}).then(function (base64) {
base64.should.equal(transparent1x1Png);
});
});
});
base64.should.equal(transparent1x1Png)
})
})
})
it('convert with specific quality', function () {
var img = document.getElementById('kirby');
var img = document.getElementById('kirby')
return blobUtil.imgSrcToBlob(img.src, 'image/jpeg', undefined, 1).then(function (blob) {
return blobUtil.imgSrcToBlob(img.src, 'image/jpeg', undefined, 0.5).then(function (lowQualityBlob) {
lowQualityBlob.size.should.be.lessThan(blob.size);
});
});
});
lowQualityBlob.size.should.be.lessThan(blob.size)
})
})
})
it('convert array buffer to binary string and back', function () {
var bin = atob(transparent1x1Png);
var buffer = new ArrayBuffer(bin.length);
var arr = new Uint8Array(buffer);
var bin = atob(transparent1x1Png)
var buffer = new ArrayBuffer(bin.length)
var arr = new Uint8Array(buffer)
for (var i = 0; i < bin.length; i++) {
arr[i] = bin.charCodeAt(i);
arr[i] = bin.charCodeAt(i)
}
var outputBin = blobUtil.arrayBufferToBinaryString(buffer);
var outputBuff = blobUtil.binaryStringToArrayBuffer(bin);
var outputBin = blobUtil.arrayBufferToBinaryString(buffer)
var outputBuff = blobUtil.binaryStringToArrayBuffer(bin)
outputBin.should.equal(bin);
blobUtil.arrayBufferToBinaryString(outputBuff).should.equal(bin);
});
});
outputBin.should.equal(bin)
blobUtil.arrayBufferToBinaryString(outputBuff).should.equal(bin)
})
})