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