(item, path = "")
| 437 | ----------------------------------------------------- */ |
| 438 | // Recursively traverse a dropped folder. |
| 439 | function traverseFileTreePromise(item, path = "") { |
| 440 | return new Promise((resolve) => { |
| 441 | if (item.isFile) { |
| 442 | item.file(file => { |
| 443 | // Store relative path for folder uploads. |
| 444 | Object.defineProperty(file, 'customRelativePath', { |
| 445 | value: path + file.name, |
| 446 | writable: true, |
| 447 | configurable: true |
| 448 | }); |
| 449 | Object.defineProperty(file, 'relativePath', { |
| 450 | value: path + file.name, |
| 451 | writable: true, |
| 452 | configurable: true |
| 453 | }); |
| 454 | resolve([file]); |
| 455 | }); |
| 456 | } else if (item.isDirectory) { |
| 457 | const dirReader = item.createReader(); |
| 458 | dirReader.readEntries(entries => { |
| 459 | const promises = []; |
| 460 | for (let i = 0; i < entries.length; i++) { |
| 461 | promises.push(traverseFileTreePromise(entries[i], path + item.name + "/")); |
| 462 | } |
| 463 | Promise.all(promises).then(results => resolve(results.flat())); |
| 464 | }); |
| 465 | } else { |
| 466 | resolve([]); |
| 467 | } |
| 468 | }); |
| 469 | } |
| 470 | |
| 471 | // --- Lazy loader for Resumable.js (no CSP inline, cached, safe) --- |
| 472 | const RESUMABLE_SRC = withBase('/vendor/resumable/1.1.0/resumable.min.js?v={{APP_QVER}}'); |
no outgoing calls
no test coverage detected