UNPKG

@onesy/utils

Version:
218 lines (217 loc) 9.74 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.sizeFormat = exports.blobToDataURI = exports.dataURIToBlob = exports.dataURIToBuffer = void 0; const is_1 = __importDefault(require("./is")); const isValid_1 = __importDefault(require("./isValid")); const isEnvironment_1 = __importDefault(require("./isEnvironment")); const stringify_1 = __importDefault(require("./stringify")); const castParam_1 = __importDefault(require("./castParam")); // Only for nodejs, since only nodejs has Buffer const dataURIToBuffer = (value) => { if ((0, isValid_1.default)('datauri', value) || (0, isValid_1.default)('base64', value)) { try { // Extract the base64 data from dataUri const data = (0, isValid_1.default)('datauri', value) ? value.split(',')[1] : value; // Create buffer from base64 string return Buffer.from(data, 'base64'); } catch (error) { return; } } }; exports.dataURIToBuffer = dataURIToBuffer; // Only for browser, since browser only has Blob const dataURIToBlob = (value, outputArrayBuffer = false) => { // Extract base64 part of the dataURL (remove the prefix) const base64Data = value.split(',')[1]; // Convert base64 string to binary data (Blob) // Decode base64 string const byteCharacters = atob(base64Data); const byteArrays = []; for (let offset = 0; offset < byteCharacters.length; offset += 1024) { const slice = byteCharacters.slice(offset, offset + 1024); const byteNumbers = new Array(slice.length); for (let i = 0; i < slice.length; i++) byteNumbers[i] = slice.charCodeAt(i); const byteArray = new Uint8Array(byteNumbers); byteArrays.push(byteArray); } // array buffer if (outputArrayBuffer) { // Calculate the total length of all Uint8Arrays let totalLength = 0; for (let array of byteArrays) totalLength += array.length; // Create a new ArrayBuffer to hold all the data const arrayBuffer = new ArrayBuffer(totalLength); // Create a view of the ArrayBuffer as a Uint8Array const combinedArray = new Uint8Array(arrayBuffer); // Copy the contents of each Uint8Array into the combined ArrayBuffer let offset = 0; for (let array of byteArrays) { combinedArray.set(array, offset); offset += array.length; } return arrayBuffer; } // blob // Create Blob from the byte arrays const blob = new Blob(byteArrays, { type: 'image/png' }); return blob; }; exports.dataURIToBlob = dataURIToBlob; const blobToDataURI = blob => new Promise(resolve => { const reader = new FileReader(); reader.onloadend = () => { const result = reader.result; if (typeof result === 'string') resolve(result); else resolve(''); }; reader.onerror = () => resolve(''); reader.readAsDataURL(blob); }); exports.blobToDataURI = blobToDataURI; const sizeFormat = (value, decimals = 2, thousand = 1000) => { if (!(0, is_1.default)('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 `${parseFloat((value / Math.pow(k, unitIndex)).toFixed(dm))} ${sizes[unitIndex]}`; }; exports.sizeFormat = sizeFormat; const optionsDefault = { thousand: 1000, decimals: 2, mime: 'text/plain', }; const to = (value_, type = 'arraybuffer', options_ = {}) => { const options = Object.assign(Object.assign({}, optionsDefault), options_); let value = value_; switch (type) { case 'string': if ((0, is_1.default)('arraybuffer', value)) return String.fromCharCode.apply(null, new Uint16Array(value)); if ((0, is_1.default)('buffer', value)) return value.toString('utf-8'); if ((0, isValid_1.default)('base64', value)) { if ((0, isEnvironment_1.default)('browser')) return atob(value); if ((0, isEnvironment_1.default)('nodejs')) return Buffer.from(value, 'base64').toString('binary'); } if ((0, isValid_1.default)('datauri', value)) { if ((0, isEnvironment_1.default)('browser')) return atob(value.split(',')[1]); if ((0, isEnvironment_1.default)('nodejs')) return Buffer.from(value.split(',')[1], 'base64').toString('binary'); } if ((0, is_1.default)('string', value)) return value; return (0, stringify_1.default)(value); case 'arraybuffer': if ((0, isValid_1.default)('base64', value)) { if ((0, isEnvironment_1.default)('browser')) return (0, exports.dataURIToBlob)(value, true); if ((0, isEnvironment_1.default)('nodejs')) return to(Buffer.from(value, 'base64'), 'arraybuffer', options); } if ((0, isValid_1.default)('datauri', value)) { if ((0, isEnvironment_1.default)('browser')) return (0, exports.dataURIToBlob)(value, true); if ((0, isEnvironment_1.default)('nodejs')) return to(value.split(',')[1], 'arraybuffer', options); } if ((0, is_1.default)('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 ((0, is_1.default)('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 ((0, is_1.default)('arraybuffer', value)) return value; return; case 'base64': if ((0, isValid_1.default)('base64', value)) return value; if ((0, is_1.default)('string', value)) { if ((0, isEnvironment_1.default)('browser')) value = btoa(value); if ((0, isEnvironment_1.default)('nodejs')) value = Buffer.from(value, 'binary').toString('base64'); return value; } return; case 'datauri': if ((0, is_1.default)('blob', value)) return (0, exports.blobToDataURI)(value); if ((0, isValid_1.default)('datauri', value)) return value; if ((0, is_1.default)('string', value)) { let base64; if ((0, isEnvironment_1.default)('browser')) base64 = btoa(value); if ((0, isEnvironment_1.default)('nodejs')) base64 = Buffer.from(value, 'binary').toString('base64'); return `data:${options.mime};base64,${base64}`; } return; case 'blob': if ((0, isEnvironment_1.default)('browser')) { if ((0, isValid_1.default)('base64', value)) return (0, exports.dataURIToBlob)(value); if ((0, isValid_1.default)('datauri', value)) return (0, exports.dataURIToBlob)(value); if ((0, is_1.default)('string', value)) return new Blob([value], { type: 'text/plain' }); if ((0, is_1.default)('blob', value)) return value; } return; case 'buffer': if ((0, isEnvironment_1.default)('nodejs')) { if ((0, isValid_1.default)('base64', value)) return (0, exports.dataURIToBuffer)(value); if ((0, isValid_1.default)('datauri', value)) return (0, exports.dataURIToBuffer)(value); if ((0, is_1.default)('string', value)) return Buffer.from(value, 'utf-8'); if ((0, is_1.default)('buffer', value)) return value; return Buffer.from((0, stringify_1.default)(value), 'utf-8'); } return; case 'byte-size': if ((0, is_1.default)('string', value)) return new TextEncoder().encode(value).byteLength; if ((0, is_1.default)('typedarray', value) || (0, is_1.default)('buffer', value)) return value.byteLength; return; case 'size-format': if ((0, is_1.default)('string', value) || (0, is_1.default)('number', value)) return (0, exports.sizeFormat)((0, castParam_1.default)(value), options.decimals, options.thousand); return; case 'size': if ((0, is_1.default)('string', value)) return (0, exports.sizeFormat)((0, castParam_1.default)(new TextEncoder().encode(value).byteLength), options.decimals, options.thousand); return; default: return; } }; exports.default = to;