UNPKG

@beenotung/tslib

Version:
219 lines 7.48 kB
"use strict"; /** * For DOM * */ Object.defineProperty(exports, "__esModule", { value: true }); exports.saveStringToFile = exports.saveBlobToFile = exports.selectAudio = exports.selectVideo = exports.selectImage = exports.selectFile = exports.saveFile = exports.downloadFile = exports.fileToArrayBuffer = exports.fileToArray = exports.fileToBinaryString = exports.filesToBase64Strings = exports.filesMap = exports.filesForEach = exports.fileToText = exports.fileToBase64String = void 0; const tslib_1 = require("tslib"); const defer_1 = require("./async/defer"); const blob_1 = require("./blob"); const lang_1 = require("./lang"); function createAsyncFileReader() { const defer = defer_1.createDefer(); const reader = new FileReader(); reader.onload = () => { if (reader.result === null) { return defer.reject('unexpected null reader.result'); } return defer.resolve(reader.result); }; reader.onerror = defer.reject; return [defer, reader]; } function fileToBase64String(file) { return tslib_1.__awaiter(this, void 0, void 0, function* () { const [defer, reader] = createAsyncFileReader(); reader.readAsDataURL(file); return defer.promise.then(blob_1.arrayBufferToString); }); } exports.fileToBase64String = fileToBase64String; function fileToText(file) { return tslib_1.__awaiter(this, void 0, void 0, function* () { const [defer, reader] = createAsyncFileReader(); reader.readAsText(file); return defer.promise.then(); }); } exports.fileToText = fileToText; function filesForEach(files, f) { if (Array.isArray(files)) { files.forEach(f); } else { for (let i = 0; i < files.length; i++) { f(files.item(i), i, files); } } } exports.filesForEach = filesForEach; function filesMap(files, f) { const xs = new Array(files.length); filesForEach(files, (file, i, files) => (xs[i] = f(file, i, files))); return xs; } exports.filesMap = filesMap; function filesToBase64Strings(files) { return tslib_1.__awaiter(this, void 0, void 0, function* () { return Promise.all(filesMap(files, file => fileToBase64String(file))); }); } exports.filesToBase64Strings = filesToBase64Strings; function fileToBinaryString(file) { return tslib_1.__awaiter(this, void 0, void 0, function* () { const [defer, reader] = createAsyncFileReader(); reader.readAsBinaryString(file); return defer.promise.then(blob_1.arrayBufferToString); }); } exports.fileToBinaryString = fileToBinaryString; function fileToArray(file) { return tslib_1.__awaiter(this, void 0, void 0, function* () { const s = yield fileToBinaryString(file); return lang_1.mapI(i => s.charCodeAt(i), s.length); }); } exports.fileToArray = fileToArray; function fileToArrayBuffer(file) { return tslib_1.__awaiter(this, void 0, void 0, function* () { const [defer, reader] = createAsyncFileReader(); reader.readAsArrayBuffer(file); return defer.promise.then(x => { if (typeof x === 'string') { const xs = new ArrayBuffer(x.length); for (let i = 0, n = x.length; i < n; i++) { ; xs[i] = x[i]; } return xs; } else { return x; } }); }); } exports.fileToArrayBuffer = fileToArrayBuffer; // reference: https://ausdemmaschinenraum.wordpress.com/2012/12/06/how-to-save-a-file-from-a-url-with-javascript/ // // if filename is not given, will get from url function downloadFile(url, filename = url.substring(url.lastIndexOf('/') + 1).split('?')[0]) { return tslib_1.__awaiter(this, void 0, void 0, function* () { const defer = defer_1.createDefer(); const xhr = new XMLHttpRequest(); xhr.responseType = 'blob'; xhr.onload = function () { const a = document.createElement('a'); a.href = window.URL.createObjectURL(xhr.response); // xhr.response is a blob a.download = filename; // Set the file name. a.style.display = 'none'; document.body.appendChild(a); a.click(); defer.resolve(true); }; xhr.onerror = e => defer.reject(e); xhr.open('GET', url); xhr.send(); return defer.promise; }); } exports.downloadFile = downloadFile; /**@deprecated*/ exports.saveFile = downloadFile; function captureMode(capture) { if (capture === true) { return 'camera'; } if (capture === false) { return 'album'; } return 'both'; } function selectFile(options = {}) { return new Promise((resolve, reject) => { if (!options.capture) { delete options.capture; } const input = document.createElement('input'); input.type = 'file'; Object.keys(options).forEach(x => (input[x] = options[x])); // document.body.appendChild(input); input.onchange = e => { if (!input.files) { reject('user canceled'); return; } const nFile = input.files.length; if (nFile < 1) { reject('no files selected'); } else { const files = new Array(nFile); for (let i = 0; i < nFile; i++) { files[i] = input.files.item(i); } resolve(files); // document.body.removeChild(input); } }; input.click(); }); } exports.selectFile = selectFile; /** * must from album * <input type="file" accept="image/*"> * * must from camera * <input type="file" accept="image/*" capture=""> * * both album and camera * <input type="file" accept="image/*;capture=camera"> * */ function selectImage(options = {}) { options.accept = options.accept || 'image/*'; if (captureMode(options.capture) === 'both' && !options.accept.includes('camera')) { options.accept += ';capture=camera'; } return selectFile(options); } exports.selectImage = selectImage; function selectVideo(options = {}) { options.accept = options.accept || 'video/mp4,video/x-m4v,video/*'; if (captureMode(options.capture) === 'both' && !options.accept.includes('camcorder')) { options.accept += ';capture=camcorder'; } return selectFile(options); } exports.selectVideo = selectVideo; function selectAudio(options = {}) { options.accept = options.accept || 'audio/*'; if (captureMode(options.capture) === 'both' && !options.accept.includes('microphone')) { options.accept += ';capture=microphone'; } return selectFile(options); } exports.selectAudio = selectAudio; function saveBlobToFile(blob, filename) { const url = URL.createObjectURL(blob); const a = document.createElement('a'); if (filename) { a.download = filename; } a.href = url; if (document.body) { a.style.display = 'none'; a.textContent = 'Download file'; document.body.appendChild(a); } a.click(); } exports.saveBlobToFile = saveBlobToFile; function saveStringToFile(s, type = 'text/plain', filename) { return saveBlobToFile(new Blob([s], { type }), filename); } exports.saveStringToFile = saveStringToFile; //# sourceMappingURL=file.js.map