UNPKG

@amaui/utils

Version:
192 lines (152 loc) 6.68 kB
import is from './is'; import isValid from './isValid'; import isEnvironment from './isEnvironment'; import stringify from './stringify'; import castParam from './castParam'; // Only for browser, since browser only has Blob export const dataUriToBlob = function (value) { let arrayBuffer = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; if (isValid('datauri', value) || isValid('base64', value)) { try { // Convert base64 to raw binary data held in a string const byteString = atob(isValid('datauri', value) ? value.split(',')[1] : value); // Separate out the mime component const mimeString = isValid('datauri', value) && value.split(',')[0].split(':')[1].split(';')[0]; // Write the bytes of the string to an ArrayBuffer const ab = new ArrayBuffer(byteString.length * 2); // create a view into the buffer const ia = new Uint16Array(ab); // Set the bytes of the buffer to the correct values for (let i = 0; i < byteString.length; i++) ia[i] = byteString.charCodeAt(i); if (arrayBuffer) return ab; // Write the ArrayBuffer to a blob, and you're done const blob = new Blob([ab], { type: mimeString }); return blob; } catch (error) { return; } } }; // Only for nodejs, since only nodejs has Buffer export const dataUriToBuffer = value => { if (isValid('datauri', value) || isValid('base64', value)) { try { // Extract the base64 data from dataUri const data = isValid('datauri', value) ? value.split(',')[1] : value; // Create buffer from base64 string return Buffer.from(data, 'base64'); } catch (error) { return; } } }; export const blobToDataURI = blob => new Promise(resolve => { const fileReader = new FileReader(); fileReader.onload = event => resolve(event.target.result); fileReader.readAsDataURL(blob); }); export const sizeFormat = function (value) { let decimals = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 2; let thousand = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1000; if (!is('number', value) || value <= 0) return '0 Bytes'; const k = thousand; const dm = decimals < 0 ? 0 : decimals; const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']; const unitIndex = Math.floor(Math.log(value) / Math.log(k)); return "".concat(parseFloat((value / Math.pow(k, unitIndex)).toFixed(dm)), " ").concat(sizes[unitIndex]); }; const optionsDefault = { thousand: 1000, decimals: 2, mime: 'text/plain' }; const to = function (value_) { let type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'arraybuffer'; let options_ = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; const options = { ...optionsDefault, ...options_ }; let value = value_; switch (type) { case 'string': if (is('arraybuffer', value)) return String.fromCharCode.apply(null, new Uint16Array(value)); if (is('buffer', value)) return value.toString('utf-8'); if (isValid('base64', value)) { if (isEnvironment('browser')) return atob(value); if (isEnvironment('nodejs')) return Buffer.from(value, 'base64').toString('binary'); } if (isValid('datauri', value)) { if (isEnvironment('browser')) return atob(value.split(',')[1]); if (isEnvironment('nodejs')) return Buffer.from(value.split(',')[1], 'base64').toString('binary'); } if (is('string', value)) return value; return stringify(value); case 'arraybuffer': if (isValid('base64', value)) { if (isEnvironment('browser')) return dataUriToBlob(value, true); if (isEnvironment('nodejs')) return to(Buffer.from(value, 'base64'), 'arraybuffer', options); } if (isValid('datauri', value)) { if (isEnvironment('browser')) return dataUriToBlob(value, true); if (isEnvironment('nodejs')) return to(value.split(',')[1], 'arraybuffer', options); } if (is('string', value)) { const arrayBuffer = new ArrayBuffer(value.length * 2); const arrayBufferView = new Uint16Array(arrayBuffer); for (let i = 0; i < value.length; i++) arrayBufferView[i] = value.charCodeAt(i); return arrayBuffer; } if (is('buffer', value)) { const arrayBuffer = new ArrayBuffer(value.length * 2); const arrayBufferView = new Uint16Array(arrayBuffer); for (let i = 0; i < value.length; i++) arrayBufferView[i] = value[i]; return arrayBuffer; } if (is('arraybuffer', value)) return value; return; case 'base64': if (isValid('base64', value)) return value; if (is('string', value)) { if (isEnvironment('browser')) value = btoa(value); if (isEnvironment('nodejs')) value = Buffer.from(value, 'binary').toString('base64'); return value; } return; case 'datauri': if (isValid('datauri', value)) return value; if (is('string', value)) { let base64; if (isEnvironment('browser')) base64 = btoa(value); if (isEnvironment('nodejs')) base64 = Buffer.from(value, 'binary').toString('base64'); return "data:".concat(options.mime, ";base64,").concat(base64); } return; case 'blob': if (isEnvironment('browser')) { if (isValid('base64', value)) return dataUriToBlob(value); if (isValid('datauri', value)) return dataUriToBlob(value); if (is('string', value)) return new Blob([value], { type: 'text/plain' }); if (is('blob', value)) return value; } return; case 'buffer': if (isEnvironment('nodejs')) { if (isValid('base64', value)) return dataUriToBuffer(value); if (isValid('datauri', value)) return dataUriToBuffer(value); if (is('string', value)) return Buffer.from(value, 'utf-8'); if (is('buffer', value)) return value; return Buffer.from(stringify(value), 'utf-8'); } return; case 'byte-size': if (is('string', value)) return new TextEncoder().encode(value).byteLength; if (is('typedarray', value) || is('buffer', value)) return value.byteLength; return; case 'size-format': if (is('string', value) || is('number', value)) return sizeFormat(castParam(value), options.decimals, options.thousand); return; case 'size': if (is('string', value)) return sizeFormat(castParam(new TextEncoder().encode(value).byteLength), options.decimals, options.thousand); return; default: return; } }; export default to;