diff --git a/electron.cjs b/electron.cjs new file mode 100644 index 00000000..8495d3cb --- /dev/null +++ b/electron.cjs @@ -0,0 +1 @@ +module.exports = require('electron') \ No newline at end of file diff --git a/index.cjs b/index.cjs new file mode 100644 index 00000000..16a9d44a --- /dev/null +++ b/index.cjs @@ -0,0 +1 @@ +import('./build/main/index.js') diff --git a/index.js b/index.js deleted file mode 100644 index 67582133..00000000 --- a/index.js +++ /dev/null @@ -1 +0,0 @@ -require('./build/main') diff --git a/package.json b/package.json index 54a74bba..a61582ad 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,6 @@ { "name": "webtorrent-desktop", + "type": "module", "description": "WebTorrent, the streaming torrent client. For Mac, Windows, and Linux.", "version": "0.24.0", "author": { @@ -96,7 +97,7 @@ "webtorrent" ], "license": "MIT", - "main": "index.js", + "main": "index.cjs", "optionalDependencies": { "appdmg": "^0.6.0", "electron-installer-debian": "^3.1.0", diff --git a/src/config.js b/src/config.js index deb86963..70a380bc 100644 --- a/src/config.js +++ b/src/config.js @@ -1,12 +1,13 @@ -const appConfig = require('application-config')('WebTorrent') -const path = require('path') -const { app } = require('electron') -const arch = require('arch') +import applicationConfig from 'application-config' +import path from 'path' +import arch from 'arch' +import fs from 'fs' +import electron from '../electron.cjs' +const appConfig = applicationConfig('WebTorrent') const APP_NAME = 'WebTorrent' const APP_TEAM = 'WebTorrent, LLC' -const APP_VERSION = require('../package.json').version - +const APP_VERSION = JSON.parse(fs.readFileSync('package.json').toString()).version const IS_TEST = isTest() const PORTABLE_PATH = IS_TEST ? path.join(process.platform === 'win32' ? 'C:\\Windows\\Temp' : '/tmp', 'WebTorrentTest') @@ -17,93 +18,6 @@ const IS_PORTABLE = isPortable() const UI_HEADER_HEIGHT = 38 const UI_TORRENT_HEIGHT = 100 -module.exports = { - ANNOUNCEMENT_URL: 'https://webtorrent.io/desktop/announcement', - AUTO_UPDATE_URL: 'https://webtorrent.io/desktop/update', - CRASH_REPORT_URL: 'https://webtorrent.io/desktop/crash-report', - TELEMETRY_URL: 'https://webtorrent.io/desktop/telemetry', - - APP_COPYRIGHT: `Copyright © 2014-${new Date().getFullYear()} ${APP_TEAM}`, - APP_FILE_ICON: path.join(__dirname, '..', 'static', 'WebTorrentFile'), - APP_ICON: path.join(__dirname, '..', 'static', 'WebTorrent'), - APP_NAME, - APP_TEAM, - APP_VERSION, - APP_WINDOW_TITLE: APP_NAME, - - CONFIG_PATH: getConfigPath(), - - DEFAULT_TORRENTS: [ - { - testID: 'bbb', - name: 'Big Buck Bunny', - posterFileName: 'bigBuckBunny.jpg', - torrentFileName: 'bigBuckBunny.torrent' - }, - { - testID: 'cosmos', - name: 'Cosmos Laundromat (Preview)', - posterFileName: 'cosmosLaundromat.jpg', - torrentFileName: 'cosmosLaundromat.torrent' - }, - { - testID: 'sintel', - name: 'Sintel', - posterFileName: 'sintel.jpg', - torrentFileName: 'sintel.torrent' - }, - { - testID: 'tears', - name: 'Tears of Steel', - posterFileName: 'tearsOfSteel.jpg', - torrentFileName: 'tearsOfSteel.torrent' - }, - { - testID: 'wired', - name: 'The WIRED CD - Rip. Sample. Mash. Share', - posterFileName: 'wiredCd.jpg', - torrentFileName: 'wiredCd.torrent' - } - ], - - DELAYED_INIT: 3000 /* 3 seconds */, - - DEFAULT_DOWNLOAD_PATH: getDefaultDownloadPath(), - - GITHUB_URL: 'https://github.com/webtorrent/webtorrent-desktop', - GITHUB_URL_ISSUES: 'https://github.com/webtorrent/webtorrent-desktop/issues', - GITHUB_URL_RAW: 'https://raw.githubusercontent.com/webtorrent/webtorrent-desktop/master', - GITHUB_URL_RELEASES: 'https://github.com/webtorrent/webtorrent-desktop/releases', - - HOME_PAGE_URL: 'https://webtorrent.io', - TWITTER_PAGE_URL: 'https://twitter.com/WebTorrentApp', - - IS_PORTABLE, - IS_PRODUCTION, - IS_TEST, - - OS_SYSARCH: arch() === 'x64' ? 'x64' : 'ia32', - - POSTER_PATH: path.join(getConfigPath(), 'Posters'), - ROOT_PATH: path.join(__dirname, '..'), - STATIC_PATH: path.join(__dirname, '..', 'static'), - TORRENT_PATH: path.join(getConfigPath(), 'Torrents'), - - WINDOW_ABOUT: 'file://' + path.join(__dirname, '..', 'static', 'about.html'), - WINDOW_MAIN: 'file://' + path.join(__dirname, '..', 'static', 'main.html'), - WINDOW_WEBTORRENT: 'file://' + path.join(__dirname, '..', 'static', 'webtorrent.html'), - - WINDOW_INITIAL_BOUNDS: { - width: 500, - height: UI_HEADER_HEIGHT + (UI_TORRENT_HEIGHT * 6) // header + 6 torrents - }, - WINDOW_MIN_HEIGHT: UI_HEADER_HEIGHT + (UI_TORRENT_HEIGHT * 2), // header + 2 torrents - WINDOW_MIN_WIDTH: 425, - - UI_HEADER_HEIGHT, - UI_TORRENT_HEIGHT -} - function getConfigPath () { if (IS_PORTABLE) { return PORTABLE_PATH @@ -121,16 +35,12 @@ function getDefaultDownloadPath () { } function getPath (key) { - if (!process.versions.electron) { + if (!process.versions.electron || process.type !== 'browser') { // Node.js process return '' - } else if (process.type === 'renderer') { - // Electron renderer process - return require('@electron/remote').app.getPath(key) - } else { - // Electron main process - return app.getPath(key) } + // Electron main process + return electron.app.getPath(key) } function isTest () { @@ -147,8 +57,6 @@ function isPortable () { return false } - const fs = require('fs') - try { // This line throws if the "Portable Settings" folder does not exist, and does // nothing otherwise. @@ -174,3 +82,117 @@ function isProduction () { return !/\/electron$/.test(process.execPath) } } + +export const ANNOUNCEMENT_URL = 'https://webtorrent.io/desktop/announcement' +export const AUTO_UPDATE_URL = 'https://webtorrent.io/desktop/update' +export const CRASH_REPORT_URL = 'https://webtorrent.io/desktop/crash-report' +export const TELEMETRY_URL = 'https://webtorrent.io/desktop/telemetry' +export const APP_COPYRIGHT = `Copyright © 2014-${new Date().getFullYear()} ${APP_TEAM}` +export const APP_FILE_ICON = new URL('../static/WebTorrentFile', import.meta.url).pathname // path.join(__dirname, '..', +// 'static', 'WebTorrentFile') +export const APP_ICON = new URL('../static/WebTorrent', import.meta.url).pathname // path.join(__dirname, '..', +// 'static', +// 'WebTorrent') +export const CONFIG_PATH = getConfigPath() +export const DEFAULT_TORRENTS = [ + { + testID: 'bbb', + name: 'Big Buck Bunny', + posterFileName: 'bigBuckBunny.jpg', + torrentFileName: 'bigBuckBunny.torrent' + }, + { + testID: 'cosmos', + name: 'Cosmos Laundromat (Preview)', + posterFileName: 'cosmosLaundromat.jpg', + torrentFileName: 'cosmosLaundromat.torrent' + }, + { + testID: 'sintel', + name: 'Sintel', + posterFileName: 'sintel.jpg', + torrentFileName: 'sintel.torrent' + }, + { + testID: 'tears', + name: 'Tears of Steel', + posterFileName: 'tearsOfSteel.jpg', + torrentFileName: 'tearsOfSteel.torrent' + }, + { + testID: 'wired', + name: 'The WIRED CD - Rip. Sample. Mash. Share', + posterFileName: 'wiredCd.jpg', + torrentFileName: 'wiredCd.torrent' + } +] +export const DELAYED_INIT = 3000 /* 3 seconds */ +export const DEFAULT_DOWNLOAD_PATH = getDefaultDownloadPath() +export const GITHUB_URL = 'https://github.com/webtorrent/webtorrent-desktop' +export const GITHUB_URL_ISSUES = 'https://github.com/webtorrent/webtorrent-desktop/issues' +export const GITHUB_URL_RAW = 'https://raw.githubusercontent.com/webtorrent/webtorrent-desktop/master' +export const GITHUB_URL_RELEASES = 'https://github.com/webtorrent/webtorrent-desktop/releases' +export const HOME_PAGE_URL = 'https://webtorrent.io' +export const TWITTER_PAGE_URL = 'https://twitter.com/WebTorrentApp' +export const OS_SYSARCH = arch() === 'x64' ? 'x64' : 'ia32' +export const POSTER_PATH = path.join(getConfigPath(), 'Posters') +export const ROOT_PATH = new URL('../', import.meta.url).pathname +export const STATIC_PATH = new URL('../static', import.meta.url).pathname +export const TORRENT_PATH = path.join(getConfigPath(), 'Torrents') +export const WINDOW_ABOUT = 'file://' + new URL('../static/about.html', import.meta.url).pathname +export const WINDOW_MAIN = 'file://' + new URL('../static/main.html', import.meta.url).pathname +export const WINDOW_WEBTORRENT = 'file://' + new URL('../static/webtorrent.html', import.meta.url).pathname +export const WINDOW_INITIAL_BOUNDS = { + width: 500, + height: UI_HEADER_HEIGHT + (UI_TORRENT_HEIGHT * 6) // header + 6 torrents +} +export const WINDOW_MIN_HEIGHT = UI_HEADER_HEIGHT + (UI_TORRENT_HEIGHT * 2) +export const WINDOW_MIN_WIDTH = 425 +export { APP_NAME } +export { APP_TEAM } +export { APP_VERSION } +export { APP_NAME as APP_WINDOW_TITLE } +export { IS_PORTABLE } +export { IS_PRODUCTION } +export { IS_TEST } +export { UI_HEADER_HEIGHT } +export { UI_TORRENT_HEIGHT } +export default { + ANNOUNCEMENT_URL, + AUTO_UPDATE_URL, + CRASH_REPORT_URL, + TELEMETRY_URL, + APP_COPYRIGHT, + APP_FILE_ICON, + APP_ICON, + APP_NAME, + APP_TEAM, + APP_VERSION, + APP_WINDOW_TITLE: APP_NAME, + CONFIG_PATH, + DEFAULT_TORRENTS, + DELAYED_INIT, + DEFAULT_DOWNLOAD_PATH, + GITHUB_URL, + GITHUB_URL_ISSUES, + GITHUB_URL_RAW, + GITHUB_URL_RELEASES, + HOME_PAGE_URL, + TWITTER_PAGE_URL, + IS_PORTABLE, + IS_PRODUCTION, + IS_TEST, + OS_SYSARCH, + POSTER_PATH, + ROOT_PATH, + STATIC_PATH, + TORRENT_PATH, + WINDOW_ABOUT, + WINDOW_MAIN, + WINDOW_WEBTORRENT, + WINDOW_INITIAL_BOUNDS, + WINDOW_MIN_HEIGHT, + WINDOW_MIN_WIDTH, + UI_HEADER_HEIGHT, + UI_TORRENT_HEIGHT +} diff --git a/src/crash-reporter.js b/src/crash-reporter.js index 5832592e..1d40fc46 100644 --- a/src/crash-reporter.js +++ b/src/crash-reporter.js @@ -1,15 +1,13 @@ -module.exports = { - init -} +import electron from '../electron.cjs' -function init () { - const config = require('./config') - const { crashReporter } = require('electron') - - crashReporter.start({ +async function init () { + const config = await import('./config.js') + electron.crashReporter.start({ productName: config.APP_NAME, submitURL: config.CRASH_REPORT_URL, globalExtra: { _companyName: config.APP_NAME }, compress: true }) } + +export default { init } diff --git a/src/main/announcement.js b/src/main/announcement.js index faf3c5dc..8a502c53 100644 --- a/src/main/announcement.js +++ b/src/main/announcement.js @@ -1,11 +1,6 @@ -module.exports = { - init -} - -const { dialog } = require('electron') - -const config = require('../config') -const log = require('./log') +import electron from '../../electron.cjs' +import config from '../config.js' +import log from './log.js' const ANNOUNCEMENT_URL = `${config.ANNOUNCEMENT_URL}?version=${config.APP_VERSION}&platform=${process.platform}` @@ -24,8 +19,8 @@ const ANNOUNCEMENT_URL = * "detail": "Please update to v0.xx as soon as possible..." * } */ -function init () { - const get = require('simple-get') +async function init () { + const { default: get } = await import('simple-get') get.concat(ANNOUNCEMENT_URL, onResponse) } @@ -44,7 +39,7 @@ function onResponse (err, res, data) { } } - dialog.showMessageBox({ + electron.dialog.showMessageBox({ type: 'info', buttons: ['OK'], title: data.title, @@ -52,3 +47,5 @@ function onResponse (err, res, data) { detail: data.detail }) } + +export default { init } diff --git a/src/main/dialog.js b/src/main/dialog.js index 02866a5a..f76d9671 100644 --- a/src/main/dialog.js +++ b/src/main/dialog.js @@ -1,20 +1,13 @@ -module.exports = { - openSeedFile, - openSeedDirectory, - openTorrentFile, - openTorrentAddress, - openFiles -} +import electron from '../../electron.cjs' +import log from './log.js' +import * as windows from './windows/index.js' -const { dialog } = require('electron') - -const log = require('./log') -const windows = require('./windows') +const { dialog } = electron /** * Show open dialog to create a single-file torrent. */ -function openSeedFile () { +export function openSeedFile () { if (!windows.main.win) return log('openSeedFile') const opts = { @@ -29,7 +22,7 @@ function openSeedFile () { * Windows and Linux, open dialogs are for files *or* directories only, not both, * so this function shows a directory dialog on those platforms. */ -function openSeedDirectory () { +export function openSeedDirectory () { if (!windows.main.win) return log('openSeedDirectory') const opts = process.platform === 'darwin' @@ -48,7 +41,7 @@ function openSeedDirectory () { * Show flexible open dialog that supports selecting .torrent files to add, or * a file or folder to create a single-file or single-directory torrent. */ -function openFiles () { +export function openFiles () { if (!windows.main.win) return log('openFiles') const opts = process.platform === 'darwin' @@ -70,7 +63,7 @@ function openFiles () { /* * Show open dialog to open a .torrent file. */ -function openTorrentFile () { +export function openTorrentFile () { if (!windows.main.win) return log('openTorrentFile') const opts = { @@ -90,7 +83,7 @@ function openTorrentFile () { /* * Show modal dialog to open a torrent URL (magnet uri, http torrent link, etc.) */ -function openTorrentAddress () { +export function openTorrentAddress () { log('openTorrentAddress') windows.main.dispatch('openTorrentAddress') } diff --git a/src/main/dock.js b/src/main/dock.js index 66b25f40..074a8150 100644 --- a/src/main/dock.js +++ b/src/main/dock.js @@ -1,13 +1,8 @@ -module.exports = { - downloadFinished, - init, - setBadge -} +import electron from '../../electron.cjs' +import * as dialog from './dialog.js' +import log from './log.js' -const { app, Menu } = require('electron') - -const dialog = require('./dialog') -const log = require('./log') +const { app, Menu } = electron /** * Add a right-click menu to the dock icon. (Mac) @@ -57,3 +52,5 @@ function getMenuTemplate () { } ] } + +export default { downloadFinished, init, setBadge } diff --git a/src/main/external-player.js b/src/main/external-player.js index 77ef44ac..fcd2fd71 100644 --- a/src/main/external-player.js +++ b/src/main/external-player.js @@ -1,27 +1,19 @@ -module.exports = { - spawn, - kill, - checkInstall -} - -const cp = require('child_process') -const path = require('path') -const vlcCommand = require('vlc-command') - -const log = require('./log') -const windows = require('./windows') - +import cp from 'child_process' +import path from 'path' +import vlcCommand from 'vlc-command' +import log from './log.js' +import * as windows from './windows' // holds a ChildProcess while we're playing a video in an external player, null otherwise let proc = null -function checkInstall (playerPath, cb) { +export function checkInstall (playerPath, cb) { // check for VLC if external player has not been specified by the user // otherwise assume the player is installed if (!playerPath) return vlcCommand(cb) process.nextTick(() => cb(null)) } -function spawn (playerPath, url, title) { +export function spawn (playerPath, url, title) { if (playerPath) return spawnExternal(playerPath, [url]) // Try to find and use VLC if external player is not specified @@ -37,7 +29,7 @@ function spawn (playerPath, url, title) { }) } -function kill () { +export function kill () { if (!proc) return log(`Killing external player, pid ${proc.pid}`) proc.kill('SIGKILL') // kill -9 diff --git a/src/main/folder-watcher.js b/src/main/folder-watcher.js index e813a434..a9d864b0 100644 --- a/src/main/folder-watcher.js +++ b/src/main/folder-watcher.js @@ -1,7 +1,7 @@ -const chokidar = require('chokidar') -const log = require('./log') +import * as chokidar from 'chokidar' +import log from './log.js' -class FolderWatcher { +export class FolderWatcher { constructor ({ window, state }) { this.window = window this.state = state @@ -46,5 +46,3 @@ class FolderWatcher { this.watching = false } } - -module.exports = FolderWatcher diff --git a/src/main/handlers.js b/src/main/handlers.js index 20c905a0..25b9d3a9 100644 --- a/src/main/handlers.js +++ b/src/main/handlers.js @@ -1,12 +1,7 @@ -module.exports = { - install, - uninstall -} +import config from '../config.js' +import path from 'path' -const config = require('../config') -const path = require('path') - -function install () { +export function install () { switch (process.platform) { case 'darwin': installDarwin() break @@ -15,7 +10,7 @@ function install () { } } -function uninstall () { +export function uninstall () { switch (process.platform) { case 'darwin': uninstallDarwin() break @@ -24,9 +19,8 @@ function uninstall () { } } -function installDarwin () { - const { app } = require('electron') - +async function installDarwin () { + const { app } = await import('electron') // On Mac, only protocols that are listed in `Info.plist` can be set as the // default handler at runtime. app.setAsDefaultProtocolClient('magnet') @@ -43,33 +37,14 @@ if (!config.IS_PRODUCTION) { EXEC_COMMAND.push(config.ROOT_PATH) } -function installWin32 () { - const Registry = require('winreg') +async function installWin32 () { + const Registry = await import('wingreg') + const log = await import('./log') - const log = require('./log') - - const iconPath = path.join( - process.resourcesPath, 'app.asar.unpacked', 'static', 'WebTorrentFile.ico' - ) - registerProtocolHandlerWin32( - 'magnet', - 'URL:BitTorrent Magnet URL', - iconPath, - EXEC_COMMAND - ) - registerProtocolHandlerWin32( - 'stream-magnet', - 'URL:BitTorrent Stream-Magnet URL', - iconPath, - EXEC_COMMAND - ) - registerFileHandlerWin32( - '.torrent', - 'io.webtorrent.torrent', - 'BitTorrent Document', - iconPath, - EXEC_COMMAND - ) + const iconPath = path.join(process.resourcesPath, 'app.asar.unpacked', 'static', 'WebTorrentFile.ico') + registerProtocolHandlerWin32('magnet', 'URL:BitTorrent Magnet URL', iconPath, EXEC_COMMAND) + registerProtocolHandlerWin32('stream-magnet', 'URL:BitTorrent Stream-Magnet URL', iconPath, EXEC_COMMAND) + registerFileHandlerWin32('.torrent', 'io.webtorrent.torrent', 'BitTorrent Document', iconPath, EXEC_COMMAND) /** * To add a protocol handler, the following keys must be added to the Windows registry: @@ -197,9 +172,8 @@ function installWin32 () { } } -function uninstallWin32 () { - const Registry = require('winreg') - +async function uninstallWin32 () { + const Registry = await import('winreg') unregisterProtocolHandlerWin32('magnet', EXEC_COMMAND) unregisterProtocolHandlerWin32('stream-magnet', EXEC_COMMAND) unregisterFileHandlerWin32('.torrent', 'io.webtorrent.torrent', EXEC_COMMAND) diff --git a/src/main/index.js b/src/main/index.js index 606f7343..540072be 100644 --- a/src/main/index.js +++ b/src/main/index.js @@ -1,22 +1,25 @@ +/* eslint-disable import/first */ console.time('init') -require('@electron/remote/main').initialize() -const { app, ipcMain } = require('electron') +import * as RemoteMain from '@electron/remote/main/index.js' +RemoteMain.initialize() +import electron from '../../electron.cjs' +const { app, ipcMain } = electron // Start crash reporter early, so it takes effect for child processes -const crashReporter = require('../crash-reporter') +import crashReporter from '../crash-reporter.js' crashReporter.init() -const parallel = require('run-parallel') +import fs from 'fs' +import parallel from 'run-parallel' +import config from '../config.js' +import ipc from './ipc.js' +import log from './log.js' +import menu from './menu.js' +import State from '../renderer/lib/state.js' +import * as windows from './windows/index.js' -const config = require('../config') -const ipc = require('./ipc') -const log = require('./log') -const menu = require('./menu') -const State = require('../renderer/lib/state') -const windows = require('./windows') - -const WEBTORRENT_VERSION = require('webtorrent/package.json').version +const WEBTORRENT_VERSION = JSON.parse(fs.readFileSync('node_modules/webtorrent/package.json').toString()).version let shouldQuit = false let argv = sliceArgv(process.argv) @@ -54,13 +57,18 @@ if (!shouldQuit && !config.IS_PORTABLE) { if (shouldQuit) { app.quit() } else { - init() + init().catch(console.error) } -function init () { +async function init () { + console.log('index init') + app.whenReady().then(() => { + console.log('readyyyy') + }) app.on('second-instance', (event, commandLine, workingDirectory) => onAppOpen(commandLine)) if (config.IS_PORTABLE) { - const path = require('path') + console.log('is portable') + const path = await import('path') // Put all user data into the "Portable Settings" folder app.setPath('userData', config.CONFIG_PATH) // Put Electron crash files, etc. into the "Portable Settings\Temp" folder @@ -72,7 +80,7 @@ function init () { app.isQuitting = false parallel({ - appReady: (cb) => app.on('ready', () => cb(null)), + appReady: (cb) => app.whenReady().then(cb), state: (cb) => State.load(cb) }, onReady) @@ -130,17 +138,18 @@ function init () { }) app.on('activate', () => { + console.log('activate') if (isReady) windows.main.show() }) } -function delayedInit (state) { +async function delayedInit (state) { if (app.isQuitting) return - const announcement = require('./announcement') - const dock = require('./dock') - const updater = require('./updater') - const FolderWatcher = require('./folder-watcher') + const { default: announcement } = await import('./announcement.js') + const { default: dock } = await import('./dock.js') + const { default: updater } = await import('./updater.js') + const { FolderWatcher } = await import('./folder-watcher.js') const folderWatcher = new FolderWatcher({ window: windows.main, state }) announcement.init() @@ -153,13 +162,13 @@ function delayedInit (state) { } if (process.platform === 'win32') { - const userTasks = require('./user-tasks') + const userTasks = await import('./user-tasks.js') userTasks.init() } if (process.platform !== 'darwin') { - const tray = require('./tray') - tray.init() + const { init: trayInit } = await import('./tray.js') + trayInit() } } @@ -205,12 +214,12 @@ function sliceArgv (argv) { ) } -function processArgv (argv) { +async function processArgv (argv) { const torrentIds = [] - argv.forEach(arg => { + await Promise.all(argv.forEach(async arg => { if (arg === '-n' || arg === '-o' || arg === '-u') { // Critical path: Only load the 'dialog' package if it is needed - const dialog = require('./dialog') + const dialog = await import('./dialog') if (arg === '-n') { dialog.openSeedDirectory() } else if (arg === '-o') { @@ -233,7 +242,7 @@ function processArgv (argv) { // running. torrentIds.push(arg) } - }) + })) if (torrentIds.length > 0) { windows.main.dispatch('onOpen', torrentIds) } diff --git a/src/main/ipc.js b/src/main/ipc.js index a18a5bb1..b47ec309 100644 --- a/src/main/ipc.js +++ b/src/main/ipc.js @@ -1,13 +1,10 @@ -module.exports = { - init, - setModule -} +import electron from '../../electron.cjs' -const { app, ipcMain } = require('electron') +import log from './log.js' +import menu from './menu.js' +import * as windows from './windows/index.js' -const log = require('./log') -const menu = require('./menu') -const windows = require('./windows') +const { app, ipcMain } = electron // Messages from the main process, to be sent once the WebTorrent process starts const messageQueueMainToWebTorrent = [] @@ -40,12 +37,12 @@ function init () { * Dialog */ - ipcMain.on('openTorrentFile', () => { - const dialog = require('./dialog') + ipcMain.on('openTorrentFile', async () => { + const dialog = await import('./dialog') dialog.openTorrentFile() }) - ipcMain.on('openFiles', () => { - const dialog = require('./dialog') + ipcMain.on('openFiles', async () => { + const dialog = await import('./dialog') dialog.openFiles() }) @@ -53,12 +50,12 @@ function init () { * Dock */ - ipcMain.on('setBadge', (e, ...args) => { - const dock = require('./dock') + ipcMain.on('setBadge', async (e, ...args) => { + const dock = await import('./dock') dock.setBadge(...args) }) - ipcMain.on('downloadFinished', (e, ...args) => { - const dock = require('./dock') + ipcMain.on('downloadFinished', async (e, ...args) => { + const dock = await import('./dock') dock.downloadFinished(...args) }) @@ -66,10 +63,10 @@ function init () { * Player Events */ - ipcMain.on('onPlayerOpen', () => { - const powerSaveBlocker = require('./power-save-blocker') - const shortcuts = require('./shortcuts') - const thumbar = require('./thumbar') + ipcMain.on('onPlayerOpen', async () => { + const powerSaveBlocker = await import('./power-save-blocker') + const shortcuts = await import('./shortcuts') + const thumbar = await import('./thumbar') menu.togglePlaybackControls(true) powerSaveBlocker.enable() @@ -77,17 +74,17 @@ function init () { thumbar.enable() }) - ipcMain.on('onPlayerUpdate', (e, ...args) => { - const thumbar = require('./thumbar') + ipcMain.on('onPlayerUpdate', async (e, ...args) => { + const thumbar = await import('./thumbar') menu.onPlayerUpdate(...args) thumbar.onPlayerUpdate(...args) }) - ipcMain.on('onPlayerClose', () => { - const powerSaveBlocker = require('./power-save-blocker') - const shortcuts = require('./shortcuts') - const thumbar = require('./thumbar') + ipcMain.on('onPlayerClose', async () => { + const powerSaveBlocker = await import('./power-save-blocker') + const shortcuts = await import('./shortcuts') + const thumbar = await import('./thumbar') menu.togglePlaybackControls(false) powerSaveBlocker.disable() @@ -95,17 +92,17 @@ function init () { thumbar.disable() }) - ipcMain.on('onPlayerPlay', () => { - const powerSaveBlocker = require('./power-save-blocker') - const thumbar = require('./thumbar') + ipcMain.on('onPlayerPlay', async () => { + const powerSaveBlocker = await import('./power-save-blocker') + const thumbar = await import('./thumbar') powerSaveBlocker.enable() thumbar.onPlayerPlay() }) - ipcMain.on('onPlayerPause', () => { - const powerSaveBlocker = require('./power-save-blocker') - const thumbar = require('./thumbar') + ipcMain.on('onPlayerPause', async () => { + const powerSaveBlocker = await import('./power-save-blocker') + const thumbar = await import('./thumbar') powerSaveBlocker.disable() thumbar.onPlayerPause() @@ -137,16 +134,16 @@ function init () { * Shell */ - ipcMain.on('openPath', (e, ...args) => { - const shell = require('./shell') + ipcMain.on('openPath', async (e, ...args) => { + const shell = await import('./shell') shell.openPath(...args) }) - ipcMain.on('showItemInFolder', (e, ...args) => { - const shell = require('./shell') + ipcMain.on('showItemInFolder', async (e, ...args) => { + const shell = await import('./shell') shell.showItemInFolder(...args) }) - ipcMain.on('moveItemToTrash', (e, ...args) => { - const shell = require('./shell') + ipcMain.on('moveItemToTrash', async (e, ...args) => { + const shell = await import('./shell') shell.moveItemToTrash(...args) }) @@ -154,8 +151,8 @@ function init () { * File handlers */ - ipcMain.on('setDefaultFileHandler', (e, flag) => { - const handlers = require('./handlers') + ipcMain.on('setDefaultFileHandler', async (e, flag) => { + const handlers = await import('./handlers') if (flag) handlers.install() else handlers.uninstall() @@ -165,8 +162,8 @@ function init () { * Auto start on login */ - ipcMain.on('setStartup', (e, flag) => { - const startup = require('./startup') + ipcMain.on('setStartup', async (e, flag) => { + const startup = await import('./startup') if (flag) startup.install() else startup.uninstall() @@ -190,18 +187,18 @@ function init () { * External Media Player */ - ipcMain.on('checkForExternalPlayer', (e, path) => { - const externalPlayer = require('./external-player') + ipcMain.on('checkForExternalPlayer', async (e, path) => { + const externalPlayer = await import('./external-player') externalPlayer.checkInstall(path, err => { windows.main.send('checkForExternalPlayer', !err) }) }) - ipcMain.on('openExternalPlayer', (e, ...args) => { - const externalPlayer = require('./external-player') - const shortcuts = require('./shortcuts') - const thumbar = require('./thumbar') + ipcMain.on('openExternalPlayer', async (e, ...args) => { + const externalPlayer = await import('./external-player') + const shortcuts = await import('./shortcuts') + const thumbar = await import('./thumbar') menu.togglePlaybackControls(false) shortcuts.disable() @@ -209,8 +206,8 @@ function init () { externalPlayer.spawn(...args) }) - ipcMain.on('quitExternalPlayer', () => { - const externalPlayer = require('./external-player') + ipcMain.on('quitExternalPlayer', async () => { + const externalPlayer = await import('./external-player') externalPlayer.kill() }) @@ -246,3 +243,10 @@ function init () { oldEmit.call(ipcMain, name, e, ...args) } } + +export { init } +export { setModule } +export default { + init, + setModule +} diff --git a/src/main/log.js b/src/main/log.js index ac0aa36b..55486827 100644 --- a/src/main/log.js +++ b/src/main/log.js @@ -1,5 +1,7 @@ -module.exports = log -module.exports.error = error +import electron from '../../electron.cjs' +import * as windows from './windows/index.js' + +const { app } = electron /** * In the main electron process, we do not use console.log() statements because they do @@ -7,11 +9,7 @@ module.exports.error = error * version of the app. Instead use this module, which sends the logs to the main window * where they can be viewed in Developer Tools. */ - -const { app } = require('electron') -const windows = require('./windows') - -function log (...args) { +export default function log (...args) { if (app.ipcReady) { windows.main.send('log', ...args) } else { @@ -19,7 +17,7 @@ function log (...args) { } } -function error (...args) { +export function error (...args) { if (app.ipcReady) { windows.main.send('error', ...args) } else { diff --git a/src/main/menu.js b/src/main/menu.js index 26bdf6d8..e3da968b 100644 --- a/src/main/menu.js +++ b/src/main/menu.js @@ -1,23 +1,14 @@ -module.exports = { - init, - togglePlaybackControls, - setWindowFocus, - setAllowNav, - onPlayerUpdate, - onToggleAlwaysOnTop, - onToggleFullScreen -} - -const { app, Menu } = require('electron') - -const config = require('../config') -const windows = require('./windows') +import electron from '../../electron.cjs' +import config from '../config.js' +import * as windows from './windows/index.js' +import shell from './shell.js' let menu = null function init () { - menu = Menu.buildFromTemplate(getMenuTemplate()) - Menu.setApplicationMenu(menu) + console.log('menu init') + menu = electron.Menu.buildFromTemplate(getMenuTemplate()) + electron.Menu.setApplicationMenu(menu) } function togglePlaybackControls (flag) { @@ -85,24 +76,24 @@ function getMenuTemplate () { ? 'Create New Torrent...' : 'Create New Torrent from Folder...', accelerator: 'CmdOrCtrl+N', - click: () => { - const dialog = require('./dialog') + click: async () => { + const dialog = await import('./dialog') dialog.openSeedDirectory() } }, { label: 'Open Torrent File...', accelerator: 'CmdOrCtrl+O', - click: () => { - const dialog = require('./dialog') + click: async () => { + const dialog = await import('./dialog') dialog.openTorrentFile() } }, { label: 'Open Torrent Address...', accelerator: 'CmdOrCtrl+U', - click: () => { - const dialog = require('./dialog') + click: async () => { + const dialog = await import('./dialog') dialog.openTorrentAddress() } }, @@ -303,21 +294,18 @@ function getMenuTemplate () { { label: 'Learn more about ' + config.APP_NAME, click: () => { - const shell = require('./shell') shell.openExternal(config.HOME_PAGE_URL) } }, { label: 'Release Notes', click: () => { - const shell = require('./shell') shell.openExternal(config.GITHUB_URL_RELEASES) } }, { label: 'Contribute on GitHub', click: () => { - const shell = require('./shell') shell.openExternal(config.GITHUB_URL) } }, @@ -327,21 +315,18 @@ function getMenuTemplate () { { label: 'Report an Issue...', click: () => { - const shell = require('./shell') shell.openExternal(config.GITHUB_URL_ISSUES) } }, { label: 'Follow us on Twitter', click: () => { - const shell = require('./shell') shell.openExternal(config.TWITTER_PAGE_URL) } } ] } ] - if (process.platform === 'darwin') { // WebTorrent menu (Mac) template.unshift({ @@ -426,8 +411,8 @@ function getMenuTemplate () { // File menu (Windows, Linux) template[0].submenu.unshift({ label: 'Create New Torrent from File...', - click: () => { - const dialog = require('./dialog') + click: async () => { + const dialog = await import('./dialog') dialog.openSeedFile() } }) @@ -460,9 +445,26 @@ function getMenuTemplate () { // File menu (Linux) template[0].submenu.push({ label: 'Quit', - click: () => app.quit() + click: () => electron.app.quit() }) } return template } + +export { init } +export { togglePlaybackControls } +export { setWindowFocus } +export { setAllowNav } +export { onPlayerUpdate } +export { onToggleAlwaysOnTop } +export { onToggleFullScreen } +export default { + init, + togglePlaybackControls, + setWindowFocus, + setAllowNav, + onPlayerUpdate, + onToggleAlwaysOnTop, + onToggleFullScreen +} diff --git a/src/main/power-save-blocker.js b/src/main/power-save-blocker.js index 79c01691..e3af58b5 100644 --- a/src/main/power-save-blocker.js +++ b/src/main/power-save-blocker.js @@ -1,10 +1,5 @@ -module.exports = { - enable, - disable -} - -const { powerSaveBlocker } = require('electron') -const log = require('./log') +import { powerSaveBlocker } from 'electron' +import log from './log.js' let blockId = 0 @@ -12,7 +7,7 @@ let blockId = 0 * Block the system from entering low-power (sleep) mode or turning off the * display. */ -function enable () { +export function enable () { if (powerSaveBlocker.isStarted(blockId)) { // If a power saver block already exists, do nothing. return @@ -24,7 +19,7 @@ function enable () { /** * Stop blocking the system from entering low-power mode. */ -function disable () { +export function disable () { if (!powerSaveBlocker.isStarted(blockId)) { // If a power saver block does not exist, do nothing. return diff --git a/src/main/shell.js b/src/main/shell.js index 80588800..90dd201e 100644 --- a/src/main/shell.js +++ b/src/main/shell.js @@ -1,12 +1,7 @@ -module.exports = { - openExternal, - openPath, - showItemInFolder, - moveItemToTrash -} +import electron from '../../electron.cjs' +import log from './log.js' -const { shell } = require('electron') -const log = require('./log') +const { shell } = electron /** * Open the given external protocol URL in the desktop’s default manner. @@ -19,7 +14,6 @@ function openExternal (url) { /** * Open the given file in the desktop’s default manner. */ - function openPath (path) { log(`openPath: ${path}`) shell.openPath(path) @@ -40,3 +34,10 @@ function moveItemToTrash (path) { log(`moveItemToTrash: ${path}`) shell.trashItem(path) } + +export default { + openExternal, + openPath, + showItemInFolder, + moveItemToTrash +} diff --git a/src/main/shortcuts.js b/src/main/shortcuts.js index 51bcf3bd..2dd64162 100644 --- a/src/main/shortcuts.js +++ b/src/main/shortcuts.js @@ -1,12 +1,7 @@ -module.exports = { - disable, - enable -} +import { globalShortcut } from 'electron' +import * as windows from './windows' -const { globalShortcut } = require('electron') -const windows = require('./windows') - -function enable () { +export function enable () { // Register play/pause media key, available on some keyboards. globalShortcut.register( 'MediaPlayPause', @@ -22,7 +17,7 @@ function enable () { ) } -function disable () { +export function disable () { // Return the media key to the OS, so other apps can use it. globalShortcut.unregister('MediaPlayPause') globalShortcut.unregister('MediaNextTrack') diff --git a/src/main/squirrel-win32.js b/src/main/squirrel-win32.js index 16db39c8..20f4fe99 100644 --- a/src/main/squirrel-win32.js +++ b/src/main/squirrel-win32.js @@ -1,23 +1,16 @@ -module.exports = { - handleEvent -} - -const { app } = require('electron') - -const path = require('path') -const spawn = require('child_process').spawn - -const handlers = require('./handlers') +import { app } from 'electron' +import path from 'path' +import { spawn } from 'child_process' +import handlers from './handlers.js' const EXE_NAME = path.basename(process.execPath) const UPDATE_EXE = path.join(process.execPath, '..', '..', 'Update.exe') const run = (args, done) => { - spawn(UPDATE_EXE, args, { detached: true }) - .on('close', done) + spawn(UPDATE_EXE, args, { detached: true }).on('close', done) } -function handleEvent (cmd) { +export function handleEvent (cmd) { if (cmd === '--squirrel-install' || cmd === '--squirrel-updated') { run([`--createShortcut=${EXE_NAME}`], app.quit) return true diff --git a/src/main/startup.js b/src/main/startup.js index 7f05e600..5b3f8072 100644 --- a/src/main/startup.js +++ b/src/main/startup.js @@ -1,17 +1,12 @@ -module.exports = { - install, - uninstall -} - -const { APP_NAME } = require('../config') -const AutoLaunch = require('auto-launch') +import { APP_NAME } from '../config.js' +import AutoLaunch from 'auto-launch' const appLauncher = new AutoLaunch({ name: APP_NAME, isHidden: true }) -function install () { +export function install () { return appLauncher .isEnabled() .then(enabled => { @@ -19,7 +14,7 @@ function install () { }) } -function uninstall () { +export function uninstall () { return appLauncher .isEnabled() .then(enabled => { diff --git a/src/main/thumbar.js b/src/main/thumbar.js index f6f936e6..74266ccf 100644 --- a/src/main/thumbar.js +++ b/src/main/thumbar.js @@ -1,21 +1,6 @@ -module.exports = { - disable, - enable, - onPlayerPause, - onPlayerPlay, - onPlayerUpdate -} - -/** - * On Windows, add a "thumbnail toolbar" with a play/pause button in the taskbar. - * This provides users a way to access play/pause functionality without restoring - * or activating the window. - */ - -const path = require('path') -const config = require('../config') - -const windows = require('./windows') +import path from 'path' +import config from '../config.js' +import * as windows from './windows' const PREV_ICON = path.join(config.STATIC_PATH, 'PreviousTrackThumbnailBarButton.png') const PLAY_ICON = path.join(config.STATIC_PATH, 'PlayThumbnailBarButton.png') @@ -32,7 +17,7 @@ let buttons = [] /** * Show the Windows thumbnail toolbar buttons. */ -function enable () { +export function enable () { buttons = [ { tooltip: 'Previous Track', @@ -56,26 +41,26 @@ function enable () { /** * Hide the Windows thumbnail toolbar buttons. */ -function disable () { +export function disable () { buttons = [] update() } -function onPlayerPause () { +export function onPlayerPause () { if (!isEnabled()) return buttons[PLAY_PAUSE].tooltip = 'Play' buttons[PLAY_PAUSE].icon = PLAY_ICON update() } -function onPlayerPlay () { +export function onPlayerPlay () { if (!isEnabled()) return buttons[PLAY_PAUSE].tooltip = 'Pause' buttons[PLAY_PAUSE].icon = PAUSE_ICON update() } -function onPlayerUpdate (state) { +export function onPlayerUpdate (state) { if (!isEnabled()) return buttons[PREV].flags = [state.hasPrevious ? 'enabled' : 'disabled'] buttons[NEXT].flags = [state.hasNext ? 'enabled' : 'disabled'] diff --git a/src/main/tray.js b/src/main/tray.js index 937eb9e9..e03a88fd 100644 --- a/src/main/tray.js +++ b/src/main/tray.js @@ -1,17 +1,10 @@ -module.exports = { - hasTray, - init, - setWindowFocus -} - -const { app, Tray, Menu } = require('electron') - -const config = require('../config') -const windows = require('./windows') +import { app, Tray, Menu } from 'electron' +import config from '../config.js' +import * as windows from './windows' let tray -function init () { +export function init () { if (process.platform === 'linux') { initLinux() } @@ -24,11 +17,11 @@ function init () { /** * Returns true if there a tray icon is active. */ -function hasTray () { +export function hasTray () { return !!tray } -function setWindowFocus (flag) { +export function setWindowFocus (flag) { if (!tray) return updateTrayMenu() } @@ -46,8 +39,8 @@ function initWin32 () { /** * Check for libappindicator support before creating tray icon. */ -function checkLinuxTraySupport (cb) { - const cp = require('child_process') +async function checkLinuxTraySupport (cb) { + const cp = await import('child_process') // Check that libappindicator libraries are installed in system. cp.exec('ldconfig -p | grep libappindicator', (err, stdout) => { diff --git a/src/main/updater.js b/src/main/updater.js index f0d1da8a..6d6d9abe 100644 --- a/src/main/updater.js +++ b/src/main/updater.js @@ -1,13 +1,10 @@ -module.exports = { - init -} +import electron from '../../electron.cjs' +import get from 'simple-get' +import config from '../config.js' +import log from './log.js' +import * as windows from './windows/index.js' -const { autoUpdater } = require('electron') -const get = require('simple-get') - -const config = require('../config') -const log = require('./log') -const windows = require('./windows') +const { autoUpdater } = electron const AUTO_UPDATE_URL = config.AUTO_UPDATE_URL + '?version=' + config.APP_VERSION + @@ -22,6 +19,8 @@ function init () { } } +export default { init } + // The Electron auto-updater does not support Linux yet, so manually check for // updates and show the user a modal notification. function initLinux () { @@ -49,7 +48,7 @@ function onResponse (err, res, data) { function initDarwinWin32 () { autoUpdater.on( 'error', - (err) => log.error(`Update error: ${err.message}`) + (err) => log(`Update error: ${err.message}`) ) autoUpdater.on( diff --git a/src/main/user-tasks.js b/src/main/user-tasks.js index 2458731c..c6624a7e 100644 --- a/src/main/user-tasks.js +++ b/src/main/user-tasks.js @@ -1,13 +1,9 @@ -module.exports = { - init -} - -const { app } = require('electron') +import { app } from 'electron' /** * Add a user task menu to the app icon on right-click. (Windows) */ -function init () { +export function init () { if (process.platform !== 'win32') return app.setUserTasks(getUserTasks()) } diff --git a/src/main/windows/about.js b/src/main/windows/about.js index 0f097036..37ffb06d 100644 --- a/src/main/windows/about.js +++ b/src/main/windows/about.js @@ -1,17 +1,18 @@ -const about = module.exports = { +import config from '../../config.js' +import electron from '../../../electron.cjs' +import * as RemoteMain from '@electron/remote/main/index.js' + +export const about = { init, win: null } -const config = require('../../config') -const { BrowserWindow } = require('electron') - function init () { if (about.win) { return about.win.show() } - const win = about.win = new BrowserWindow({ + const win = about.win = new electron.BrowserWindow({ backgroundColor: '#ECECEC', center: true, fullscreen: false, @@ -33,8 +34,7 @@ function init () { }, width: 300 }) - require('@electron/remote/main').enable(win.webContents) - + RemoteMain.enable(win.webContents) win.loadURL(config.WINDOW_ABOUT) win.once('ready-to-show', () => { diff --git a/src/main/windows/index.js b/src/main/windows/index.js index bee0c1ec..f1a60a4d 100644 --- a/src/main/windows/index.js +++ b/src/main/windows/index.js @@ -1,3 +1,3 @@ -exports.about = require('./about') -exports.main = require('./main') -exports.webtorrent = require('./webtorrent') +export * from './about.js' +export * from './main.js' +export * from './webtorrent.js' diff --git a/src/main/windows/main.js b/src/main/windows/main.js index dc31ba5d..f31ac0be 100644 --- a/src/main/windows/main.js +++ b/src/main/windows/main.js @@ -1,4 +1,13 @@ -const main = module.exports = { +import debounce from 'debounce' +import electron from '../../../electron.cjs' +import config from '../../config.js' +import log from '../log.js' +import menu from '../menu.js' +import * as RemoteMain from '@electron/remote/main/index.js' + +const { app, BrowserWindow, screen } = electron + +export const main = { dispatch, hide, init, @@ -14,13 +23,6 @@ const main = module.exports = { win: null } -const { app, BrowserWindow, screen } = require('electron') -const debounce = require('debounce') - -const config = require('../../config') -const log = require('../log') -const menu = require('../menu') - function init (state, options) { if (main.win) { return main.win.show() @@ -50,8 +52,8 @@ function init (state, options) { x: initialBounds.x, y: initialBounds.y }) - require('@electron/remote/main').enable(win.webContents) - + RemoteMain.enable(win.webContents) + console.log(config.WINDOW_MAIN) win.loadURL(config.WINDOW_MAIN) win.once('ready-to-show', () => { @@ -98,10 +100,10 @@ function init (state, options) { send('windowBoundsChanged', e.sender.getBounds()) }, 1000)) - win.on('close', e => { + win.on('close', async e => { if (process.platform !== 'darwin') { - const tray = require('../tray') - if (!tray.hasTray()) { + const { hasTray } = await import('../tray.js') + if (!hasTray()) { app.quit() return } diff --git a/src/main/windows/webtorrent.js b/src/main/windows/webtorrent.js index b93af68d..7e396f74 100644 --- a/src/main/windows/webtorrent.js +++ b/src/main/windows/webtorrent.js @@ -1,4 +1,8 @@ -const webtorrent = module.exports = { +import electron from '../../../electron.cjs' +import config from '../../config.js' +import * as RemoteMain from '@electron/remote/main/index.js' + +export const webtorrent = { init, send, show, @@ -6,12 +10,8 @@ const webtorrent = module.exports = { win: null } -const { app, BrowserWindow } = require('electron') - -const config = require('../../config') - function init () { - const win = webtorrent.win = new BrowserWindow({ + const win = webtorrent.win = new electron.BrowserWindow({ backgroundColor: '#1E1E1E', center: true, fullscreen: false, @@ -33,13 +33,11 @@ function init () { }, width: 150 }) - require('@electron/remote/main').enable(win.webContents) - + RemoteMain.enable(win.webContents) win.loadURL(config.WINDOW_WEBTORRENT) - // Prevent killing the WebTorrent process win.on('close', e => { - if (app.isQuitting) { + if (electron.app.isQuitting) { return } e.preventDefault() diff --git a/src/renderer/components/create-torrent-error-page.js b/src/renderer/components/create-torrent-error-page.js index ea78c811..210045a8 100644 --- a/src/renderer/components/create-torrent-error-page.js +++ b/src/renderer/components/create-torrent-error-page.js @@ -1,8 +1,7 @@ -const React = require('react') +import * as React from 'react' +import { dispatcher } from '../lib/dispatcher.js' -const { dispatcher } = require('../lib/dispatcher') - -module.exports = class CreateTorrentErrorPage extends React.Component { +export default class CreateTorrentErrorPage extends React.Component { render () { return (
diff --git a/src/renderer/components/delete-all-torrents-modal.js b/src/renderer/components/delete-all-torrents-modal.js index f3424dc0..b14f8bd0 100644 --- a/src/renderer/components/delete-all-torrents-modal.js +++ b/src/renderer/components/delete-all-torrents-modal.js @@ -1,9 +1,8 @@ -const React = require('react') +import * as React from 'react' +import ModalOKCancel from './modal-ok-cancel.js' +import { dispatch, dispatcher } from '../lib/dispatcher.js' -const ModalOKCancel = require('./modal-ok-cancel') -const { dispatch, dispatcher } = require('../lib/dispatcher') - -module.exports = class DeleteAllTorrentsModal extends React.Component { +export default class DeleteAllTorrentsModal extends React.Component { render () { const { state: { modal: { deleteData } } } = this.props const message = deleteData diff --git a/src/renderer/components/header.js b/src/renderer/components/header.js index 4210424a..139e1f6c 100644 --- a/src/renderer/components/header.js +++ b/src/renderer/components/header.js @@ -1,8 +1,7 @@ -const React = require('react') +import * as React from 'react' +import { dispatcher } from '../lib/dispatcher.js' -const { dispatcher } = require('../lib/dispatcher') - -class Header extends React.Component { +export default class Header extends React.Component { render () { const loc = this.props.state.location return ( @@ -56,5 +55,3 @@ class Header extends React.Component { ) } } - -module.exports = Header diff --git a/src/renderer/components/heading.js b/src/renderer/components/heading.js index 43e78de0..5cee19ed 100644 --- a/src/renderer/components/heading.js +++ b/src/renderer/components/heading.js @@ -1,9 +1,8 @@ -const React = require('react') -const PropTypes = require('prop-types') +import * as React from 'react' +import PropTypes from 'prop-types' +import * as colors from 'material-ui/styles/colors' -const colors = require('material-ui/styles/colors') - -class Heading extends React.Component { +export default class Heading extends React.Component { static get propTypes () { return { level: PropTypes.number @@ -31,5 +30,3 @@ class Heading extends React.Component { ) } } - -module.exports = Heading diff --git a/src/renderer/components/modal-ok-cancel.js b/src/renderer/components/modal-ok-cancel.js index 52f4b40f..7e6bdb42 100644 --- a/src/renderer/components/modal-ok-cancel.js +++ b/src/renderer/components/modal-ok-cancel.js @@ -1,8 +1,10 @@ -const React = require('react') -const FlatButton = require('material-ui/FlatButton').default -const RaisedButton = require('material-ui/RaisedButton').default +import * as React from 'react' +import flatButton from 'material-ui/FlatButton' +import raisedButton from 'material-ui/RaisedButton' -module.exports = class ModalOKCancel extends React.Component { +const FlatButton = flatButton.default +const RaisedButton = raisedButton.default +export default class ModalOKCancel extends React.Component { render () { const cancelStyle = { marginRight: 10, color: 'black' } const { cancelText, onCancel, okText, onOK } = this.props diff --git a/src/renderer/components/open-torrent-address-modal.js b/src/renderer/components/open-torrent-address-modal.js index 4e478736..37a98dd6 100644 --- a/src/renderer/components/open-torrent-address-modal.js +++ b/src/renderer/components/open-torrent-address-modal.js @@ -1,12 +1,14 @@ -const React = require('react') -const TextField = require('material-ui/TextField').default -const { clipboard } = require('electron') +import * as React from 'react' +import textField from 'material-ui/TextField' +import electron from 'electron' +import ModalOKCancel from './modal-ok-cancel.js' +import { dispatch, dispatcher } from '../lib/dispatcher.js' +import { isMagnetLink } from '../lib/torrent-player.js' -const ModalOKCancel = require('./modal-ok-cancel') -const { dispatch, dispatcher } = require('../lib/dispatcher') -const { isMagnetLink } = require('../lib/torrent-player') +const TextField = textField.default +const { clipboard } = electron -module.exports = class OpenTorrentAddressModal extends React.Component { +export default class OpenTorrentAddressModal extends React.Component { render () { return (
diff --git a/src/renderer/components/path-selector.js b/src/renderer/components/path-selector.js index 0f8dd5bd..511116fe 100644 --- a/src/renderer/components/path-selector.js +++ b/src/renderer/components/path-selector.js @@ -1,17 +1,17 @@ -const path = require('path') - -const colors = require('material-ui/styles/colors') -const remote = require('@electron/remote') -const React = require('react') -const PropTypes = require('prop-types') - -const RaisedButton = require('material-ui/RaisedButton').default -const TextField = require('material-ui/TextField').default +import path from 'path' +import * as colors from 'material-ui/styles/colors' +import remote from '@electron/remote' +import * as React from 'react' +import PropTypes from 'prop-types' +import raisedButton from 'material-ui/RaisedButton' +import textField from 'material-ui/TextField' +const RaisedButton = raisedButton.default +const TextField = textField.default // Lets you pick a file or directory. // Uses the system Open File dialog. // You can't edit the text field directly. -class PathSelector extends React.Component { +export default class PathSelector extends React.Component { static propTypes () { return { className: PropTypes.string, @@ -81,5 +81,3 @@ class PathSelector extends React.Component { ) } } - -module.exports = PathSelector diff --git a/src/renderer/components/remove-torrent-modal.js b/src/renderer/components/remove-torrent-modal.js index 4913f59d..772626e9 100644 --- a/src/renderer/components/remove-torrent-modal.js +++ b/src/renderer/components/remove-torrent-modal.js @@ -1,9 +1,8 @@ -const React = require('react') +import * as React from 'react' +import ModalOKCancel from './modal-ok-cancel.js' +import { dispatch, dispatcher } from '../lib/dispatcher.js' -const ModalOKCancel = require('./modal-ok-cancel') -const { dispatch, dispatcher } = require('../lib/dispatcher') - -module.exports = class RemoveTorrentModal extends React.Component { +export default class RemoveTorrentModal extends React.Component { render () { const state = this.props.state const message = state.modal.deleteData diff --git a/src/renderer/components/show-more.js b/src/renderer/components/show-more.js index d26de36f..eb877763 100644 --- a/src/renderer/components/show-more.js +++ b/src/renderer/components/show-more.js @@ -1,9 +1,10 @@ -const React = require('react') -const PropTypes = require('prop-types') +import * as React from 'react' +import PropTypes from 'prop-types' +import raisedButton from 'material-ui/RaisedButton' -const RaisedButton = require('material-ui/RaisedButton').default +const RaisedButton = raisedButton.default -class ShowMore extends React.Component { +export default class ShowMore extends React.Component { static get propTypes () { return { defaultExpanded: PropTypes.bool, @@ -21,11 +22,9 @@ class ShowMore extends React.Component { constructor (props) { super(props) - this.state = { expanded: !!this.props.defaultExpanded } - this.handleClick = this.handleClick.bind(this) } @@ -51,5 +50,3 @@ class ShowMore extends React.Component { ) } } - -module.exports = ShowMore diff --git a/src/renderer/components/unsupported-media-modal.js b/src/renderer/components/unsupported-media-modal.js index f4d27891..5641ab2c 100644 --- a/src/renderer/components/unsupported-media-modal.js +++ b/src/renderer/components/unsupported-media-modal.js @@ -1,10 +1,9 @@ -const React = require('react') -const { shell } = require('electron') +import * as React from 'react' +import { shell } from 'electron' +import ModalOKCancel from './modal-ok-cancel.js' +import { dispatcher } from '../lib/dispatcher.js' -const ModalOKCancel = require('./modal-ok-cancel') -const { dispatcher } = require('../lib/dispatcher') - -module.exports = class UnsupportedMediaModal extends React.Component { +export default class UnsupportedMediaModal extends React.Component { render () { const state = this.props.state const err = state.modal.error diff --git a/src/renderer/components/update-available-modal.js b/src/renderer/components/update-available-modal.js index 914bb39f..2eec9514 100644 --- a/src/renderer/components/update-available-modal.js +++ b/src/renderer/components/update-available-modal.js @@ -1,10 +1,9 @@ -const React = require('react') -const { shell } = require('electron') +import * as React from 'react' +import { shell } from 'electron' +import ModalOKCancel from './modal-ok-cancel.js' +import { dispatch } from '../lib/dispatcher.js' -const ModalOKCancel = require('./modal-ok-cancel') -const { dispatch } = require('../lib/dispatcher') - -module.exports = class UpdateAvailableModal extends React.Component { +export default class UpdateAvailableModal extends React.Component { render () { const state = this.props.state return ( diff --git a/src/renderer/controllers/audio-tracks-controller.js b/src/renderer/controllers/audio-tracks-controller.js index e7044161..682ae81d 100644 --- a/src/renderer/controllers/audio-tracks-controller.js +++ b/src/renderer/controllers/audio-tracks-controller.js @@ -1,6 +1,6 @@ -const { dispatch } = require('../lib/dispatcher') +import { dispatch } from '../lib/dispatcher.js' -module.exports = class AudioTracksController { +export default class AudioTracksController { constructor (state) { this.state = state } diff --git a/src/renderer/controllers/folder-watcher-controller.js b/src/renderer/controllers/folder-watcher-controller.js index 35cf1066..5aa54921 100644 --- a/src/renderer/controllers/folder-watcher-controller.js +++ b/src/renderer/controllers/folder-watcher-controller.js @@ -1,6 +1,6 @@ -const { ipcRenderer } = require('electron') +import { ipcRenderer } from 'electron' -module.exports = class FolderWatcherController { +export default class FolderWatcherController { start () { console.log('-- IPC: start folder watcher') ipcRenderer.send('startFolderWatcher') diff --git a/src/renderer/controllers/media-controller.js b/src/renderer/controllers/media-controller.js index 0ad6f73f..d8219da2 100644 --- a/src/renderer/controllers/media-controller.js +++ b/src/renderer/controllers/media-controller.js @@ -1,10 +1,8 @@ -const { ipcRenderer } = require('electron') -const telemetry = require('../lib/telemetry') -const Playlist = require('../lib/playlist') +import { ipcRenderer } from 'electron' +import telemetry from '../lib/telemetry.js' +import Playlist from '../lib/playlist.js' -// Controls local play back: the