UNPKG

8.07 kBJavaScriptView Raw
1import { __awaiter, __generator, __read, __spreadArray } from "tslib";
2import { toFileWithPath } from './file';
3var FILES_TO_IGNORE = [
4 // Thumbnail cache files for macOS and Windows
5 '.DS_Store',
6 'Thumbs.db' // Windows
7];
8/**
9 * Convert a DragEvent's DataTrasfer object to a list of File objects
10 * NOTE: If some of the items are folders,
11 * everything will be flattened and placed in the same list but the paths will be kept as a {path} property.
12 *
13 * EXPERIMENTAL: A list of https://developer.mozilla.org/en-US/docs/Web/API/FileSystemHandle objects can also be passed as an arg
14 * and a list of File objects will be returned.
15 *
16 * @param evt
17 */
18export function fromEvent(evt) {
19 return __awaiter(this, void 0, void 0, function () {
20 return __generator(this, function (_a) {
21 if (isObject(evt) && isDataTransfer(evt.dataTransfer)) {
22 return [2 /*return*/, getDataTransferFiles(evt.dataTransfer, evt.type)];
23 }
24 else if (isChangeEvt(evt)) {
25 return [2 /*return*/, getInputFiles(evt)];
26 }
27 else if (Array.isArray(evt) && evt.every(function (item) { return 'getFile' in item && typeof item.getFile === 'function'; })) {
28 return [2 /*return*/, getFsHandleFiles(evt)];
29 }
30 return [2 /*return*/, []];
31 });
32 });
33}
34function isDataTransfer(value) {
35 return isObject(value);
36}
37function isChangeEvt(value) {
38 return isObject(value) && isObject(value.target);
39}
40function isObject(v) {
41 return typeof v === 'object' && v !== null;
42}
43function getInputFiles(evt) {
44 return fromList(evt.target.files).map(function (file) { return toFileWithPath(file); });
45}
46// Ee expect each handle to be https://developer.mozilla.org/en-US/docs/Web/API/FileSystemFileHandle
47function getFsHandleFiles(handles) {
48 return __awaiter(this, void 0, void 0, function () {
49 var files;
50 return __generator(this, function (_a) {
51 switch (_a.label) {
52 case 0: return [4 /*yield*/, Promise.all(handles.map(function (h) { return h.getFile(); }))];
53 case 1:
54 files = _a.sent();
55 return [2 /*return*/, files.map(function (file) { return toFileWithPath(file); })];
56 }
57 });
58 });
59}
60function getDataTransferFiles(dt, type) {
61 return __awaiter(this, void 0, void 0, function () {
62 var items, files;
63 return __generator(this, function (_a) {
64 switch (_a.label) {
65 case 0:
66 if (!dt.items) return [3 /*break*/, 2];
67 items = fromList(dt.items)
68 .filter(function (item) { return item.kind === 'file'; });
69 // According to https://html.spec.whatwg.org/multipage/dnd.html#dndevents,
70 // only 'dragstart' and 'drop' has access to the data (source node)
71 if (type !== 'drop') {
72 return [2 /*return*/, items];
73 }
74 return [4 /*yield*/, Promise.all(items.map(toFilePromises))];
75 case 1:
76 files = _a.sent();
77 return [2 /*return*/, noIgnoredFiles(flatten(files))];
78 case 2: return [2 /*return*/, noIgnoredFiles(fromList(dt.files)
79 .map(function (file) { return toFileWithPath(file); }))];
80 }
81 });
82 });
83}
84function noIgnoredFiles(files) {
85 return files.filter(function (file) { return FILES_TO_IGNORE.indexOf(file.name) === -1; });
86}
87// IE11 does not support Array.from()
88// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/from#Browser_compatibility
89// https://developer.mozilla.org/en-US/docs/Web/API/FileList
90// https://developer.mozilla.org/en-US/docs/Web/API/DataTransferItemList
91function fromList(items) {
92 if (items === null) {
93 return [];
94 }
95 var files = [];
96 // tslint:disable: prefer-for-of
97 for (var i = 0; i < items.length; i++) {
98 var file = items[i];
99 files.push(file);
100 }
101 return files;
102}
103// https://developer.mozilla.org/en-US/docs/Web/API/DataTransferItem
104function toFilePromises(item) {
105 if (typeof item.webkitGetAsEntry !== 'function') {
106 return fromDataTransferItem(item);
107 }
108 var entry = item.webkitGetAsEntry();
109 // Safari supports dropping an image node from a different window and can be retrieved using
110 // the DataTransferItem.getAsFile() API
111 // NOTE: FileSystemEntry.file() throws if trying to get the file
112 if (entry && entry.isDirectory) {
113 return fromDirEntry(entry);
114 }
115 return fromDataTransferItem(item);
116}
117function flatten(items) {
118 return items.reduce(function (acc, files) { return __spreadArray(__spreadArray([], __read(acc), false), __read((Array.isArray(files) ? flatten(files) : [files])), false); }, []);
119}
120function fromDataTransferItem(item) {
121 var file = item.getAsFile();
122 if (!file) {
123 return Promise.reject("".concat(item, " is not a File"));
124 }
125 var fwp = toFileWithPath(file);
126 return Promise.resolve(fwp);
127}
128// https://developer.mozilla.org/en-US/docs/Web/API/FileSystemEntry
129function fromEntry(entry) {
130 return __awaiter(this, void 0, void 0, function () {
131 return __generator(this, function (_a) {
132 return [2 /*return*/, entry.isDirectory ? fromDirEntry(entry) : fromFileEntry(entry)];
133 });
134 });
135}
136// https://developer.mozilla.org/en-US/docs/Web/API/FileSystemDirectoryEntry
137function fromDirEntry(entry) {
138 var reader = entry.createReader();
139 return new Promise(function (resolve, reject) {
140 var entries = [];
141 function readEntries() {
142 var _this = this;
143 // https://developer.mozilla.org/en-US/docs/Web/API/FileSystemDirectoryEntry/createReader
144 // https://developer.mozilla.org/en-US/docs/Web/API/FileSystemDirectoryReader/readEntries
145 reader.readEntries(function (batch) { return __awaiter(_this, void 0, void 0, function () {
146 var files, err_1, items;
147 return __generator(this, function (_a) {
148 switch (_a.label) {
149 case 0:
150 if (!!batch.length) return [3 /*break*/, 5];
151 _a.label = 1;
152 case 1:
153 _a.trys.push([1, 3, , 4]);
154 return [4 /*yield*/, Promise.all(entries)];
155 case 2:
156 files = _a.sent();
157 resolve(files);
158 return [3 /*break*/, 4];
159 case 3:
160 err_1 = _a.sent();
161 reject(err_1);
162 return [3 /*break*/, 4];
163 case 4: return [3 /*break*/, 6];
164 case 5:
165 items = Promise.all(batch.map(fromEntry));
166 entries.push(items);
167 // Continue reading
168 readEntries();
169 _a.label = 6;
170 case 6: return [2 /*return*/];
171 }
172 });
173 }); }, function (err) {
174 reject(err);
175 });
176 }
177 readEntries();
178 });
179}
180// https://developer.mozilla.org/en-US/docs/Web/API/FileSystemFileEntry
181function fromFileEntry(entry) {
182 return __awaiter(this, void 0, void 0, function () {
183 return __generator(this, function (_a) {
184 return [2 /*return*/, new Promise(function (resolve, reject) {
185 entry.file(function (file) {
186 var fwp = toFileWithPath(file, entry.fullPath);
187 resolve(fwp);
188 }, function (err) {
189 reject(err);
190 });
191 })];
192 });
193 });
194}
195//# sourceMappingURL=file-selector.js.map
\No newline at end of file