UNPKG

@lyra/form-builder

Version:
77 lines (64 loc) 2.54 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _flatten2 = require('lodash/flatten'); var _flatten3 = _interopRequireDefault(_flatten2); exports.extractPastedFiles = extractPastedFiles; exports.extractDroppedFiles = extractDroppedFiles; function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /** * Utilities for extracting files from dataTransfer in a predictable cross-browser fashion. * Also recursively extracts files from a directory * Inspired by https://github.com/component/normalized-upload * Contains special handling of */ function extractPastedFiles(dataTransfer /*: DataTransfer*/) /*: Array<File>*/ { if (dataTransfer.files && dataTransfer.files.length > 0) { return Promise.resolve(Array.from(dataTransfer.files || [])); } return normalizeItems(Array.from(dataTransfer.items || [])).then(_flatten3.default); } function extractDroppedFiles(dataTransfer /*: DataTransfer*/) { const files /*: Array<File>*/ = Array.from(dataTransfer.files || []); const items /*: Array<DataTransferItem>*/ = Array.from(dataTransfer.items || []); if (files && files.length > 0) { return Promise.resolve(files); } return normalizeItems(items).then(_flatten3.default); } function normalizeItems(items /*: Array<DataTransferItem>*/) /*: Promise<Array<File>>*/ { return Promise.all(items.map(item => { // directory if (item.kind === 'file' && item.webkitGetAsEntry) { let entry; // Edge throws try { entry = item.webkitGetAsEntry(); } catch (err) { return [item.getAsFile()]; } if (!entry) { return []; } return entry.isDirectory ? walk(entry) : [item.getAsFile()]; } // file if (item.kind === 'file') { const file = item.getAsFile(); return Promise.resolve(file ? [file] : []); } // others return new Promise(resolve => item.getAsString(resolve)).then(str => str ? [new File([str], 'unknown.txt', { type: item.type })] : []); })); } function walk(entry /*: WebKitFileEntry*/) /*: Promise<Array<File>>*/ { if (entry.isFile) { return new Promise(resolve => entry.file(resolve)).then(file => [file]); } if (entry.isDirectory) { const dir = entry.createReader(); return new Promise(resolve => dir.readEntries(resolve)).then(entries => entries.filter(entr => !entr.name.startsWith('.'))).then(entries => Promise.all(entries.map(walk)).then(_flatten3.default)); } return Promise.resolve([]); }