From 118650b2dd2cd4e60e31f6f8318f04776e7c6329 Mon Sep 17 00:00:00 2001 From: Dimitri Benin Date: Sat, 6 Apr 2019 07:10:44 +0000 Subject: [PATCH] Refactor TypeScript definition to CommonJS compatible export (#75) --- index.d.ts | 207 +++++++++++++++++++++++++----------------------- index.js | 1 + index.test-d.ts | 11 ++- package.json | 13 +-- 4 files changed, 125 insertions(+), 107 deletions(-) diff --git a/index.d.ts b/index.d.ts index edde9c9..198cdaa 100644 --- a/index.d.ts +++ b/index.d.ts @@ -1,112 +1,123 @@ import {BrowserWindow, DownloadItem} from 'electron'; -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 - */ - readonly saveAs?: boolean; +declare namespace electronDl { + interface Options { + /** + Show a `Save As…` dialog instead of downloading immediately. - /** - * Directory to save the file in. - * - * Default: [User's downloads directory](https://electronjs.org/docs/api/app/#appgetpathname) - */ - readonly directory?: string; + Note: Only use this option when strictly necessary. Downloading directly without a prompt is a much better user experience. - /** - * Name of the saved file. - * This option only makes sense for `electronDl.download()`. - * - * Default: [`downloadItem.getFilename()`](https://electronjs.org/docs/api/download-item/#downloaditemgetfilename) - */ - readonly filename?: string; + @default false + */ + readonly saveAs?: boolean; - /** - * Title of the error dialog. Can be customized for localization. - * - * @default 'Download Error' - */ - readonly errorTitle?: string; + /** + Directory to save the file in. - /** - * 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' - */ - readonly errorMessage?: string; + Default: [User's downloads directory](https://electronjs.org/docs/api/app/#appgetpathname) + */ + readonly directory?: 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()`. - */ - readonly onStarted?: (item: DownloadItem) => void; + /** + Name of the saved file. + This option only makes sense for `electronDl.download()`. - /** - * Optional callback that receives a number between `0` and `1` representing the progress of the current download. - */ - readonly onProgress?: (percent: number) => void; + Default: [`downloadItem.getFilename()`](https://electronjs.org/docs/api/download-item/#downloaditemgetfilename) + */ + readonly filename?: string; - /** - * Optional callback that receives the [download item](https://electronjs.org/docs/api/download-item) for which the download has been cancelled. - */ - readonly onCancel?: (item: DownloadItem) => void; + /** + Title of the error dialog. Can be customized for localization. + + @default 'Download Error' + */ + readonly 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' + */ + readonly 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()`. + */ + readonly onStarted?: (item: DownloadItem) => void; + + /** + Optional callback that receives a number between `0` and `1` representing the progress of the current download. + */ + readonly 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. + */ + readonly onCancel?: (item: DownloadItem) => void; + /** + Reveal the downloaded file in the system file manager, and if possible, select the file. + + @default false + */ + readonly openFolderWhenDone?: boolean; + + /** + Shows the file count badge on macOS/Linux dock icons when download is in progress. + + @default true + */ + readonly showBadge?: boolean; + } +} + +declare const electronDl: { /** - * Reveal the downloaded file in the system file manager, and if possible, select the file. - * - * @default false - */ - readonly openFolderWhenDone?: boolean; + Register the helper for all windows. + + @example + ``` + import {app, BrowserWindow} from 'electron'; + import electronDl = require('electron-dl'); + + electronDl(); + + let win; + (async () => { + await app.whenReady(); + win = new BrowserWindow(); + })(); + ``` + */ + (options?: electronDl.Options): void; /** - * Shows the file count badge on macOS/Linux dock icons when download is in progress. - * - * @default true - */ - readonly showBadge?: boolean; -} + 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. + @returns A promise for the downloaded file. + + @example + ``` + import {BrowserWindow, ipcMain} from 'electron'; + import electronDl = require('electron-dl'); + + ipcMain.on('download-button', async (event, {url}) => { + const win = BrowserWindow.getFocusedWindow(); + console.log(await electronDl.download(win, url)); + }); + ``` + */ + download( + window: BrowserWindow, + url: string, + options?: electronDl.Options + ): Promise; + + // TODO: Remove this for the next major release + default: typeof electronDl; +}; -/** - * Register the helper for all windows. - * - * @example - * - * import {app, BrowserWindow} from 'electron'; - * import electronDl from 'electron-dl'; - * - * electronDl(); - * - * let win; - * (async () => { - * await app.whenReady(); - * 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. - * @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: BrowserWindow, - url: string, - options?: Options -): Promise; +export = electronDl; diff --git a/index.js b/index.js index e335ab3..11a9f06 100644 --- a/index.js +++ b/index.js @@ -129,6 +129,7 @@ module.exports = (options = {}) => { }); }; +// TODO: Remove this for the next major release module.exports.default = module.exports; module.exports.download = (win, url, options) => new Promise((resolve, reject) => { diff --git a/index.test-d.ts b/index.test-d.ts index a1f5875..7821052 100644 --- a/index.test-d.ts +++ b/index.test-d.ts @@ -1,6 +1,11 @@ -import {expectType} from 'tsd-check'; +/// +/// +import {expectType} from 'tsd'; import {BrowserWindow, DownloadItem} from 'electron'; -import electronDl, {download} from '.'; +import electronDl = require('.'); +import {download} from '.'; expectType(electronDl()); -expectType(await download(new BrowserWindow(), 'test', {errorTitle: 'Nope'})); +expectType>( + download(new BrowserWindow(), 'test', {errorTitle: 'Nope'}) +); diff --git a/package.json b/package.json index 3a98c63..4e1822d 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ }, "scripts": { "start": "electron run.js", - "test": "xo && ava && tsd-check" + "test": "xo && ava && tsd" }, "files": [ "index.js", @@ -31,15 +31,16 @@ "unused-filename": "^1.0.0" }, "devDependencies": { - "ava": "^1.2.0", - "cp-file": "^6.0.0", + "@types/node": "^11.13.0", + "ava": "^1.4.1", + "cp-file": "^6.2.0", "electron": "^3.1.2", "minimist": "^1.2.0", - "node-static": "^0.7.9", + "node-static": "^0.7.11", "pify": "^4.0.1", "spectron": "^5.0.0", - "tsd-check": "^0.3.0", - "uuid": "^3.1.0", + "tsd": "^0.7.2", + "uuid": "^3.3.2", "xo": "^0.24.0" }, "xo": {