summary refs log tree commit diff
path: root/resources/app/node_modules/electron-dl
diff options
context:
space:
mode:
authorManuel Palenzuela <[email protected]>2019-08-19 12:17:51 +0200
committerManuel Palenzuela <[email protected]>2019-08-19 12:17:51 +0200
commitea7016bdb1d9fb7de1a66a94b3de3b3c9e0f32c9 (patch)
tree22a6413c757bb2cc709a51f851d5718298430c0d /resources/app/node_modules/electron-dl
download9anime-client-ea7016bdb1d9fb7de1a66a94b3de3b3c9e0f32c9.tar.gz
9anime-client-ea7016bdb1d9fb7de1a66a94b3de3b3c9e0f32c9.tar.bz2
9anime-client-ea7016bdb1d9fb7de1a66a94b3de3b3c9e0f32c9.zip
Initial Commit HEAD master
Diffstat (limited to 'resources/app/node_modules/electron-dl')
-rw-r--r--resources/app/node_modules/electron-dl/index.d.ts110
-rw-r--r--resources/app/node_modules/electron-dl/index.js146
-rw-r--r--resources/app/node_modules/electron-dl/license9
-rw-r--r--resources/app/node_modules/electron-dl/readme.md179
4 files changed, 444 insertions, 0 deletions
diff --git a/resources/app/node_modules/electron-dl/index.d.ts b/resources/app/node_modules/electron-dl/index.d.ts
new file mode 100644
index 0000000..b1fad33
--- /dev/null
+++ b/resources/app/node_modules/electron-dl/index.d.ts
@@ -0,0 +1,110 @@
+export interface Options {
+	/**
+	 * Show a `Save As…` dialog instead of downloading immediately.
+	 *
+	 * Note: Only use this option when strictly necessary. Downloading directly without a prompt is a much better user experience.
+	 *
+	 * @default false
+	 */
+	saveAs?: boolean;
+
+	/**
+	 * Directory to save the file in.
+	 *
+	 * Default: [User's downloads directory](https://electronjs.org/docs/api/app/#appgetpathname)
+	 */
+	directory?: string;
+
+	/**
+	 * Name of the saved file.
+	 * This option only makes sense for `electronDl.download()`.
+	 *
+	 * Default: [`downloadItem.getFilename()`](https://electronjs.org/docs/api/download-item/#downloaditemgetfilename)
+	 */
+	filename?: string;
+
+	/**
+	 * Title of the error dialog. Can be customized for localization.
+	 *
+	 * @default 'Download Error'
+	 */
+	errorTitle?: string;
+
+	/**
+	 * Message of the error dialog. `{filename}` is replaced with the name of the actual file. Can be customized for localization.
+	 *
+	 * @default 'The download of {filename} was interrupted'
+	 */
+	errorMessage?: string;
+
+	/**
+	 * Optional callback that receives the [download item](https://electronjs.org/docs/api/download-item).
+	 * You can use this for advanced handling such as canceling the item like `item.cancel()`.
+	 */
+	onStarted?: (item: Electron.DownloadItem) => void;
+
+	/**
+	 * Optional callback that receives a number between `0` and `1` representing the progress of the current download.
+	 */
+	onProgress?: (percent: number) => void;
+
+	/**
+	 * Optional callback that receives the [download item](https://electronjs.org/docs/api/download-item) for which the download has been cancelled.
+	 */
+	onCancel?: (item: Electron.DownloadItem) => void;
+
+	/**
+	 * Reveal the downloaded file in the system file manager, and if possible, select the file.
+	 *
+	 * @default false
+	 */
+	openFolderWhenDone?: boolean;
+
+	/**
+	 * Shows the file count badge on macOS/Linux dock icons when download is in progress.
+	 *
+	 * @default true
+	 */
+	showBadge?: boolean;
+}
+
+/**
+ * Register the helper for all windows.
+ *
+ * @example
+ *
+ * import {app, BrowserWindow} from 'electron';
+ * import electronDl from 'electron-dl';
+ *
+ * electronDl();
+ *
+ * let win;
+ * app.on('ready', () => {
+ * 	win = new BrowserWindow();
+ * });
+ */
+export default function electronDl(options?: Options): void;
+
+/**
+ * This can be useful if you need download functionality in a reusable module.
+ *
+ * @param window - Window to register the behavior on.
+ * @param url - URL to download.
+ * @param options
+ * @returns A promise for the downloaded file.
+ *
+ * @example
+ *
+ * import {BrowserWindow, ipcMain} from 'electron';
+ * import {download} from 'electron-dl';
+ *
+ * ipcMain.on('download-button', async (event, {url}) => {
+ * 	const win = BrowserWindow.getFocusedWindow();
+ * 	console.log(await download(win, url));
+ * });
+ */
+export function download(
+	window: Electron.BrowserWindow,
+	url: string,
+	options?: Options
+): Promise<Electron.DownloadItem>;
diff --git a/resources/app/node_modules/electron-dl/index.js b/resources/app/node_modules/electron-dl/index.js
new file mode 100644
index 0000000..e335ab3
--- /dev/null
+++ b/resources/app/node_modules/electron-dl/index.js
@@ -0,0 +1,146 @@
+'use strict';
+const path = require('path');
+const {app, BrowserWindow, shell, dialog} = require('electron');
+const unusedFilename = require('unused-filename');
+const pupa = require('pupa');
+const extName = require('ext-name');
+
+function getFilenameFromMime(name, mime) {
+	const exts = extName.mime(mime);
+
+	if (exts.length !== 1) {
+		return name;
+	}
+
+	return `${name}.${exts[0].ext}`;
+}
+
+function registerListener(session, options, cb = () => {}) {
+	const downloadItems = new Set();
+	let receivedBytes = 0;
+	let completedBytes = 0;
+	let totalBytes = 0;
+	const activeDownloadItems = () => downloadItems.size;
+	const progressDownloadItems = () => receivedBytes / totalBytes;
+
+	options = Object.assign({
+		showBadge: true
+	}, options);
+
+	const listener = (e, item, webContents) => {
+		downloadItems.add(item);
+		totalBytes += item.getTotalBytes();
+
+		let hostWebContents = webContents;
+		if (webContents.getType() === 'webview') {
+			({hostWebContents} = webContents);
+		}
+
+		const win = BrowserWindow.fromWebContents(hostWebContents);
+
+		const dir = options.directory || app.getPath('downloads');
+		let filePath;
+		if (options.filename) {
+			filePath = path.join(dir, options.filename);
+		} else {
+			const filename = item.getFilename();
+			const name = path.extname(filename) ? filename : getFilenameFromMime(filename, item.getMimeType());
+
+			filePath = unusedFilename.sync(path.join(dir, name));
+		}
+
+		const errorMessage = options.errorMessage || 'The download of {filename} was interrupted';
+		const errorTitle = options.errorTitle || 'Download Error';
+
+		if (!options.saveAs) {
+			item.setSavePath(filePath);
+		}
+
+		if (typeof options.onStarted === 'function') {
+			options.onStarted(item);
+		}
+
+		item.on('updated', () => {
+			receivedBytes = [...downloadItems].reduce((receivedBytes, item) => {
+				receivedBytes += item.getReceivedBytes();
+				return receivedBytes;
+			}, completedBytes);
+
+			if (options.showBadge && ['darwin', 'linux'].includes(process.platform)) {
+				app.setBadgeCount(activeDownloadItems());
+			}
+
+			if (!win.isDestroyed()) {
+				win.setProgressBar(progressDownloadItems());
+			}
+
+			if (typeof options.onProgress === 'function') {
+				options.onProgress(progressDownloadItems());
+			}
+		});
+
+		item.on('done', (event, state) => {
+			completedBytes += item.getTotalBytes();
+			downloadItems.delete(item);
+
+			if (options.showBadge && ['darwin', 'linux'].includes(process.platform)) {
+				app.setBadgeCount(activeDownloadItems());
+			}
+
+			if (!win.isDestroyed() && !activeDownloadItems()) {
+				win.setProgressBar(-1);
+				receivedBytes = 0;
+				completedBytes = 0;
+				totalBytes = 0;
+			}
+
+			if (options.unregisterWhenDone) {
+				session.removeListener('will-download', listener);
+			}
+
+			if (state === 'cancelled') {
+				if (typeof options.onCancel === 'function') {
+					options.onCancel(item);
+				}
+			} else if (state === 'interrupted') {
+				const message = pupa(errorMessage, {filename: item.getFilename()});
+				dialog.showErrorBox(errorTitle, message);
+				cb(new Error(message));
+			} else if (state === 'completed') {
+				if (process.platform === 'darwin') {
+					app.dock.downloadFinished(filePath);
+				}
+
+				if (options.openFolderWhenDone) {
+					shell.showItemInFolder(path.join(dir, item.getFilename()));
+				}
+
+				cb(null, item);
+			}
+		});
+	};
+
+	session.on('will-download', listener);
+}
+
+module.exports = (options = {}) => {
+	app.on('session-created', session => {
+		registerListener(session, options);
+	});
+};
+
+module.exports.default = module.exports;
+
+module.exports.download = (win, url, options) => new Promise((resolve, reject) => {
+	options = Object.assign({}, options, {unregisterWhenDone: true});
+
+	registerListener(win.webContents.session, options, (err, item) => {
+		if (err) {
+			reject(err);
+		} else {
+			resolve(item);
+		}
+	});
+
+	win.webContents.downloadURL(url);
+});
diff --git a/resources/app/node_modules/electron-dl/license b/resources/app/node_modules/electron-dl/license
new file mode 100644
index 0000000..e7af2f7
--- /dev/null
+++ b/resources/app/node_modules/electron-dl/license
@@ -0,0 +1,9 @@
+MIT License
+
+Copyright (c) Sindre Sorhus <[email protected]> (sindresorhus.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/resources/app/node_modules/electron-dl/readme.md b/resources/app/node_modules/electron-dl/readme.md
new file mode 100644
index 0000000..c3dbbb7
--- /dev/null
+++ b/resources/app/node_modules/electron-dl/readme.md
@@ -0,0 +1,179 @@
+# electron-dl [![Build Status](https://travis-ci.org/sindresorhus/electron-dl.svg?branch=master)](https://travis-ci.org/sindresorhus/electron-dl)
+
+> Simplified file downloads for your [Electron](https://electronjs.org) app
+
+
+## Why?
+
+- One function call instead of having to manually implement a lot of [boilerplate](index.js).
+- Saves the file to the users Downloads directory instead of prompting.
+- Bounces the Downloads directory in the dock when done. *(macOS)*
+- Handles multiple downloads.
+- Shows badge count *(macOS & Linux only)* and download progress. Example on macOS:
+
+<img src="screenshot.png" width="82">
+
+
+## Install
+
+```
+$ npm install electron-dl
+```
+
+
+## Usage
+
+### Register it for all windows
+
+This is probably what you want for your app.
+
+```js
+const {app, BrowserWindow} = require('electron');
+const electronDl = require('electron-dl');
+
+electronDl();
+
+let win;
+(async () => {
+	await app.whenReady();
+	win = new BrowserWindow();
+})();
+```
+
+### Use it manually
+
+This can be useful if you need download functionality in a reusable module.
+
+```js
+const {BrowserWindow, ipcMain} = require('electron');
+const {download} = require('electron-dl');
+
+ipcMain.on('download-button', async (event, {url}) => {
+ 	const win = BrowserWindow.getFocusedWindow();
+ 	console.log(await download(win, url));
+});
+```
+
+## API
+
+It can only be used in the [main](https://electronjs.org/docs/glossary/#main-process) process.
+
+### electronDl([options])
+
+### electronDl.download(window, url, [options]): Promise<[DownloadItem](https://electronjs.org/docs/api/download-item)>
+
+### window
+
+Type: `BrowserWindow`
+
+Window to register the behavior on.
+
+### url
+
+Type: `string`
+
+URL to download.
+
+### options
+
+Type: `Object`
+
+#### saveAs
+
+Type: `boolean`<br>
+Default: `false`
+
+Show a `Save As…` dialog instead of downloading immediately.
+
+Note: Only use this option when strictly necessary. Downloading directly without a prompt is a much better user experience.
+
+#### directory
+
+Type: `string`<br>
+Default: [User's downloads directory](https://electronjs.org/docs/api/app/#appgetpathname)
+
+Directory to save the file in.
+
+#### filename
+
+Type: `string`<br>
+Default: [`downloadItem.getFilename()`](https://electronjs.org/docs/api/download-item/#downloaditemgetfilename)
+
+Name of the saved file.
+
+This option only makes sense for `electronDl.download()`.
+
+#### errorTitle
+
+Type: `string`<br>
+Default: `Download Error`
+
+Title of the error dialog. Can be customized for localization.
+
+#### errorMessage
+
+Type: `string`<br>
+Default: `The download of {filename} was interrupted`
+
+Message of the error dialog. `{filename}` is replaced with the name of the actual file. Can be customized for localization.
+
+#### onStarted
+
+Type: `Function`
+
+Optional callback that receives the [download item](https://electronjs.org/docs/api/download-item).
+You can use this for advanced handling such as canceling the item like `item.cancel()`.
+
+#### onProgress
+
+Type: `Function`
+
+Optional callback that receives a number between `0` and `1` representing the progress of the current download.
+
+#### onCancel
+
+Type: `Function`
+
+Optional callback that receives the [download item](https://electronjs.org/docs/api/download-item) for which the download has been cancelled.
+
+#### openFolderWhenDone
+
+Type: `boolean`<br>
+Default: `false`
+
+Reveal the downloaded file in the system file manager, and if possible, select the file.
+
+#### showBadge
+
+Type: `boolean`<br>
+Default: `true`
+
+Shows the file count badge on macOS/Linux dock icons when download is in progress.
+
+
+## Development
+
+After making changes, run the automated tests:
+
+```
+$ npm test
+```
+
+And before submitting a pull request, run the manual tests to manually verify that everything works:
+
+```
+npm start
+```
+
+
+## Related
+
+- [electron-debug](https://github.com/sindresorhus/electron-debug) - Adds useful debug features to your Electron app
+- [electron-context-menu](https://github.com/sindresorhus/electron-context-menu) - Context menu for your Electron app
+- [electron-store](https://github.com/sindresorhus/electron-store) - Save and load data like user preferences, app state, cache, etc
+- [electron-unhandled](https://github.com/sindresorhus/electron-unhandled) - Catch unhandled errors and promise rejections in your Electron app
+
+
+## License
+
+MIT © [Sindre Sorhus](https://sindresorhus.com)