diff --git a/.eslintrc.json b/.eslintrc.json index 449b3338..f7c11e92 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -3,7 +3,11 @@ "parserOptions": { "ecmaVersion": 2017 }, + "settings": { + "import/resolver": "node" + }, "rules": { + "import/no-commonjs": 2, "indent": [2, 2, {"SwitchCase": 0}], "no-console": 0, "no-process-env": 0, diff --git a/scripts/.eslintrc.json b/scripts/.eslintrc.json new file mode 100644 index 00000000..a3eec10c --- /dev/null +++ b/scripts/.eslintrc.json @@ -0,0 +1,5 @@ +{ + "rules": { + "import/no-commonjs": 0 + } +} diff --git a/src/browser/components/AutoSaveIndicator.jsx b/src/browser/components/AutoSaveIndicator.jsx index 99b93175..c9a06032 100644 --- a/src/browser/components/AutoSaveIndicator.jsx +++ b/src/browser/components/AutoSaveIndicator.jsx @@ -1,6 +1,6 @@ -const React = require('react'); -const PropTypes = require('prop-types'); -const {Alert} = require('react-bootstrap'); +import React from 'react'; +import PropTypes from 'prop-types'; +import {Alert} from 'react-bootstrap'; const baseClassName = 'AutoSaveIndicator'; const leaveClassName = `${baseClassName}-Leave`; @@ -25,7 +25,7 @@ function getClassNameAndMessage(savingState, errorMessage) { } } -function AutoSaveIndicator(props) { +export default function AutoSaveIndicator(props) { const {savingState, errorMessage, ...rest} = props; const {className, message} = getClassNameAndMessage(savingState, errorMessage); return ( @@ -50,5 +50,3 @@ Object.assign(AutoSaveIndicator, { SAVING_STATE_ERROR, SAVING_STATE_DONE, }); - -module.exports = AutoSaveIndicator; diff --git a/src/browser/components/DestructiveConfirmModal.jsx b/src/browser/components/DestructiveConfirmModal.jsx index c33ed46f..1cc87054 100644 --- a/src/browser/components/DestructiveConfirmModal.jsx +++ b/src/browser/components/DestructiveConfirmModal.jsx @@ -1,8 +1,8 @@ -const React = require('react'); -const PropTypes = require('prop-types'); -const {Button, Modal} = require('react-bootstrap'); +import React from 'react'; +import PropTypes from 'prop-types'; +import {Button, Modal} from 'react-bootstrap'; -function DestructiveConfirmationModal(props) { +export default function DestructiveConfirmationModal(props) { const { title, body, @@ -39,5 +39,3 @@ DestructiveConfirmationModal.propTypes = { onAccept: PropTypes.func.isRequired, onCancel: PropTypes.func.isRequired, }; - -module.exports = DestructiveConfirmationModal; diff --git a/src/browser/components/ErrorView.jsx b/src/browser/components/ErrorView.jsx index 9d1c3a4f..c6ef4643 100644 --- a/src/browser/components/ErrorView.jsx +++ b/src/browser/components/ErrorView.jsx @@ -1,11 +1,11 @@ // ErrorCode: https://code.google.com/p/chromium/codesearch#chromium/src/net/base/net_error_list.h -const React = require('react'); -const PropTypes = require('prop-types'); -const {Grid, Row, Col} = require('react-bootstrap'); -const {shell, remote} = require('electron'); +import React from 'react'; +import PropTypes from 'prop-types'; +import {Grid, Row, Col} from 'react-bootstrap'; +import {shell, remote} from 'electron'; -function ErrorView(props) { +export default function ErrorView(props) { const classNames = ['container', 'ErrorView']; if (!props.active) { classNames.push('ErrorView-hidden'); @@ -82,5 +82,3 @@ ErrorView.propTypes = { active: PropTypes.bool, withTab: PropTypes.bool, }; - -module.exports = ErrorView; diff --git a/src/browser/components/HoveringURL.jsx b/src/browser/components/HoveringURL.jsx index f6c3526b..23baa45a 100644 --- a/src/browser/components/HoveringURL.jsx +++ b/src/browser/components/HoveringURL.jsx @@ -1,7 +1,7 @@ -const React = require('react'); -const PropTypes = require('prop-types'); +import React from 'react'; +import PropTypes from 'prop-types'; -function HoveringURL(props) { +export default function HoveringURL(props) { return (
{props.targetURL} @@ -12,5 +12,3 @@ function HoveringURL(props) { HoveringURL.propTypes = { targetURL: PropTypes.string, }; - -module.exports = HoveringURL; diff --git a/src/browser/components/LoginModal.jsx b/src/browser/components/LoginModal.jsx index a00fdf96..78edb173 100644 --- a/src/browser/components/LoginModal.jsx +++ b/src/browser/components/LoginModal.jsx @@ -1,9 +1,9 @@ -const React = require('react'); -const PropTypes = require('prop-types'); -const ReactDOM = require('react-dom'); -const {Button, Col, ControlLabel, Form, FormGroup, FormControl, Modal} = require('react-bootstrap'); +import React from 'react'; +import PropTypes from 'prop-types'; +import {findDOMNode} from 'react-dom'; +import {Button, Col, ControlLabel, Form, FormGroup, FormControl, Modal} from 'react-bootstrap'; -class LoginModal extends React.Component { +export default class LoginModal extends React.Component { constructor(props) { super(props); this.handleSubmit = this.handleSubmit.bind(this); @@ -11,8 +11,8 @@ class LoginModal extends React.Component { handleSubmit(event) { event.preventDefault(); - const usernameNode = ReactDOM.findDOMNode(this.refs.username); - const passwordNode = ReactDOM.findDOMNode(this.refs.password); + const usernameNode = findDOMNode(this.refs.username); + const passwordNode = findDOMNode(this.refs.password); this.props.onLogin(this.props.request, usernameNode.value, passwordNode.value); usernameNode.value = ''; passwordNode.value = ''; @@ -94,5 +94,3 @@ LoginModal.propTypes = { request: PropTypes.object, show: PropTypes.bool, }; - -module.exports = LoginModal; diff --git a/src/browser/components/MainPage.jsx b/src/browser/components/MainPage.jsx index 85e26e60..6c40c9a6 100644 --- a/src/browser/components/MainPage.jsx +++ b/src/browser/components/MainPage.jsx @@ -1,22 +1,22 @@ -const url = require('url'); +import url from 'url'; -const React = require('react'); -const PropTypes = require('prop-types'); -const createReactClass = require('create-react-class'); -const {CSSTransition, TransitionGroup} = require('react-transition-group'); -const {Grid, Row} = require('react-bootstrap'); +import React from 'react'; +import PropTypes from 'prop-types'; +import createReactClass from 'create-react-class'; +import {CSSTransition, TransitionGroup} from 'react-transition-group'; +import {Grid, Row} from 'react-bootstrap'; -const {ipcRenderer, remote} = require('electron'); +import {ipcRenderer, remote} from 'electron'; -const Utils = require('../../utils/util.js'); +import Utils from '../../utils/util.js'; -const LoginModal = require('./LoginModal.jsx'); -const MattermostView = require('./MattermostView.jsx'); -const TabBar = require('./TabBar.jsx'); -const HoveringURL = require('./HoveringURL.jsx'); -const PermissionRequestDialog = require('./PermissionRequestDialog.jsx'); +import LoginModal from './LoginModal.jsx'; +import MattermostView from './MattermostView.jsx'; +import TabBar from './TabBar.jsx'; +import HoveringURL from './HoveringURL.jsx'; +import PermissionRequestDialog from './PermissionRequestDialog.jsx'; -const NewTeamModal = require('./NewTeamModal.jsx'); +import NewTeamModal from './NewTeamModal.jsx'; const MainPage = createReactClass({ propTypes: { @@ -386,4 +386,4 @@ const MainPage = createReactClass({ }, }); -module.exports = MainPage; +export default MainPage; diff --git a/src/browser/components/MattermostView.jsx b/src/browser/components/MattermostView.jsx index 99024811..32a15c2c 100644 --- a/src/browser/components/MattermostView.jsx +++ b/src/browser/components/MattermostView.jsx @@ -1,18 +1,18 @@ /* eslint-disable react/no-set-state */ // setState() is necessary for this component -const url = require('url'); +import url from 'url'; -const React = require('react'); -const PropTypes = require('prop-types'); -const createReactClass = require('create-react-class'); -const {findDOMNode} = require('react-dom'); -const {ipcRenderer, remote, shell} = require('electron'); +import React from 'react'; +import PropTypes from 'prop-types'; +import createReactClass from 'create-react-class'; +import {findDOMNode} from 'react-dom'; +import {ipcRenderer, remote, shell} from 'electron'; -const contextMenu = require('../js/contextMenu'); -const {protocols} = require('../../../electron-builder.json'); +import contextMenu from '../js/contextMenu'; +import {protocols} from '../../../electron-builder.json'; const scheme = protocols[0].schemes[0]; -const ErrorView = require('./ErrorView.jsx'); +import ErrorView from './ErrorView.jsx'; const preloadJS = `file://${remote.app.getAppPath()}/browser/webview/mattermost_bundle.js`; @@ -312,4 +312,4 @@ const MattermostView = createReactClass({ }, }); -module.exports = MattermostView; +export default MattermostView; diff --git a/src/browser/components/NewTeamModal.jsx b/src/browser/components/NewTeamModal.jsx index 42c12c64..b5f34083 100644 --- a/src/browser/components/NewTeamModal.jsx +++ b/src/browser/components/NewTeamModal.jsx @@ -1,8 +1,8 @@ -const React = require('react'); -const PropTypes = require('prop-types'); -const {Modal, Button, FormGroup, FormControl, ControlLabel, HelpBlock} = require('react-bootstrap'); +import React from 'react'; +import PropTypes from 'prop-types'; +import {Modal, Button, FormGroup, FormControl, ControlLabel, HelpBlock} from 'react-bootstrap'; -class NewTeamModal extends React.Component { +export default class NewTeamModal extends React.Component { constructor() { super(); @@ -201,5 +201,3 @@ NewTeamModal.propTypes = { editMode: PropTypes.bool, show: PropTypes.bool, }; - -module.exports = NewTeamModal; diff --git a/src/browser/components/PermissionRequestDialog.jsx b/src/browser/components/PermissionRequestDialog.jsx index 7d9b4528..0fc5eec4 100644 --- a/src/browser/components/PermissionRequestDialog.jsx +++ b/src/browser/components/PermissionRequestDialog.jsx @@ -1,6 +1,6 @@ -const React = require('react'); -const PropTypes = require('prop-types'); -const {Button, Glyphicon, Popover} = require('react-bootstrap'); +import React from 'react'; +import PropTypes from 'prop-types'; +import {Button, Glyphicon, Popover} from 'react-bootstrap'; const PERMISSIONS = { media: { @@ -49,7 +49,7 @@ function description(permission) { return `Be granted "${permission}" permission`; } -function PermissionRequestDialog(props) { +export default function PermissionRequestDialog(props) { const {origin, permission, onClickAllow, onClickBlock, onClickClose, ...reft} = props; return ( { let unreadCount = 0; @@ -118,5 +118,3 @@ TabBar.propTypes = { onAddServer: PropTypes.func, onClickPermissionDialog: PropTypes.func, }; - -module.exports = TabBar; diff --git a/src/browser/components/TeamList.jsx b/src/browser/components/TeamList.jsx index 9f05f19e..0a936ee8 100644 --- a/src/browser/components/TeamList.jsx +++ b/src/browser/components/TeamList.jsx @@ -1,11 +1,11 @@ -const React = require('react'); -const PropTypes = require('prop-types'); -const createReactClass = require('create-react-class'); -const {ListGroup} = require('react-bootstrap'); +import React from 'react'; +import PropTypes from 'prop-types'; +import createReactClass from 'create-react-class'; +import {ListGroup} from 'react-bootstrap'; -const TeamListItem = require('./TeamListItem.jsx'); -const NewTeamModal = require('./NewTeamModal.jsx'); -const RemoveServerModal = require('./RemoveServerModal.jsx'); +import TeamListItem from './TeamListItem.jsx'; +import NewTeamModal from './NewTeamModal.jsx'; +import RemoveServerModal from './RemoveServerModal.jsx'; const TeamList = createReactClass({ propTypes: { @@ -171,4 +171,4 @@ const TeamList = createReactClass({ }, }); -module.exports = TeamList; +export default TeamList; diff --git a/src/browser/components/TeamListItem.jsx b/src/browser/components/TeamListItem.jsx index 980cb287..5e2d448e 100644 --- a/src/browser/components/TeamListItem.jsx +++ b/src/browser/components/TeamListItem.jsx @@ -1,7 +1,7 @@ -const React = require('react'); -const PropTypes = require('prop-types'); +import React from 'react'; +import PropTypes from 'prop-types'; -class TeamListItem extends React.Component { +export default class TeamListItem extends React.Component { constructor(props) { super(props); this.handleTeamRemove = this.handleTeamRemove.bind(this); @@ -49,5 +49,3 @@ TeamListItem.propTypes = { onTeamClick: PropTypes.func, url: PropTypes.string, }; - -module.exports = TeamListItem; diff --git a/src/browser/config/AppConfig.js b/src/browser/config/AppConfig.js index 4f202571..b569ad76 100644 --- a/src/browser/config/AppConfig.js +++ b/src/browser/config/AppConfig.js @@ -1,6 +1,6 @@ -const {remote} = require('electron'); +import {remote} from 'electron'; -const settings = require('../../common/settings'); +import settings from '../../common/settings'; class AppConfig { constructor(file) { @@ -20,4 +20,4 @@ class AppConfig { } } -module.exports = new AppConfig(remote.app.getPath('userData') + '/config.json'); +export default new AppConfig(remote.app.getPath('userData') + '/config.json'); diff --git a/src/browser/index.jsx b/src/browser/index.jsx index 3988742d..da568923 100644 --- a/src/browser/index.jsx +++ b/src/browser/index.jsx @@ -1,24 +1,24 @@ 'use strict'; -require('./css/index.css'); +import './css/index.css'; window.eval = global.eval = () => { // eslint-disable-line no-multi-assign, no-eval throw new Error('Sorry, Mattermost does not support window.eval() for security reasons.'); }; -const url = require('url'); +import url from 'url'; -const React = require('react'); -const ReactDOM = require('react-dom'); -const {remote, ipcRenderer} = require('electron'); +import React from 'react'; +import ReactDOM from 'react-dom'; +import {remote, ipcRenderer} from 'electron'; -const buildConfig = require('../common/config/buildConfig'); -const settings = require('../common/settings'); -const utils = require('../utils/util'); +import buildConfig from '../common/config/buildConfig'; +import settings from '../common/settings'; +import utils from '../utils/util'; -const MainPage = require('./components/MainPage.jsx'); -const AppConfig = require('./config/AppConfig.js'); -const badge = require('./js/badge'); +import MainPage from './components/MainPage.jsx'; +import AppConfig from './config/AppConfig.js'; +import {createDataURL as createBadgeDataURL} from './js/badge'; const teams = settings.mergeDefaultTeams(AppConfig.data.teams); @@ -41,10 +41,10 @@ function showUnreadBadgeWindows(unreadCount, mentionCount) { } if (mentionCount > 0) { - const dataURL = badge.createDataURL(mentionCount.toString()); + const dataURL = createBadgeDataURL(mentionCount.toString()); sendBadge(dataURL, 'You have unread mentions (' + mentionCount + ')'); } else if (unreadCount > 0 && AppConfig.data.showUnreadBadge) { - const dataURL = badge.createDataURL('•'); + const dataURL = createBadgeDataURL('•'); sendBadge(dataURL, 'You have unread channels (' + unreadCount + ')'); } else { sendBadge(null, 'You have no unread messages'); diff --git a/src/browser/js/badge.js b/src/browser/js/badge.js index 575984ff..de2242c4 100644 --- a/src/browser/js/badge.js +++ b/src/browser/js/badge.js @@ -1,6 +1,6 @@ 'use strict'; -function createDataURL(text) { +export function createDataURL(text) { const scale = 2; // should rely display dpi const size = 16 * scale; const canvas = document.createElement('canvas'); @@ -23,7 +23,3 @@ function createDataURL(text) { return canvas.toDataURL(); } - -module.exports = { - createDataURL, -}; diff --git a/src/browser/js/contextMenu.js b/src/browser/js/contextMenu.js index 380f74d8..c4568b80 100644 --- a/src/browser/js/contextMenu.js +++ b/src/browser/js/contextMenu.js @@ -1,5 +1,5 @@ -const {ipcRenderer} = require('electron'); -const electronContextMenu = require('electron-context-menu'); +import {ipcRenderer} from 'electron'; +import electronContextMenu from 'electron-context-menu'; function getSuggestionsMenus(win, suggestions) { if (suggestions.length === 0) { @@ -37,7 +37,7 @@ function getSpellCheckerLocaleMenus(onSelectSpellCheckerLocale) { })); } -module.exports = { +export default { setup(win, options) { const defaultOptions = { useSpellChecker: false, diff --git a/src/browser/js/notification.js b/src/browser/js/notification.js index 64aad8ac..366efa1d 100644 --- a/src/browser/js/notification.js +++ b/src/browser/js/notification.js @@ -1,11 +1,12 @@ 'use strict'; const OriginalNotification = Notification; -const {ipcRenderer, remote} = require('electron'); -const {throttle} = require('underscore'); +import {throttle} from 'underscore'; -const osVersion = require('../../common/osVersion'); -const dingDataURL = require('../../assets/ding.mp3'); // https://github.com/mattermost/platform/blob/v3.7.3/webapp/images/ding.mp3 +import {ipcRenderer, remote} from 'electron'; + +import osVersion from '../../common/osVersion'; +import dingDataURL from '../../assets/ding.mp3'; // https://github.com/mattermost/platform/blob/v3.7.3/webapp/images/ding.mp3 const appIconURL = `file:///${remote.app.getAppPath()}/assets/appicon.png`; @@ -14,7 +15,7 @@ const playDing = throttle(() => { ding.play(); }, 3000, {trailing: false}); -class EnhancedNotification extends OriginalNotification { +export default class EnhancedNotification extends OriginalNotification { constructor(title, options) { if (process.platform === 'win32') { // Replace with application icon. @@ -64,5 +65,3 @@ class EnhancedNotification extends OriginalNotification { return super.onclick; } } - -module.exports = EnhancedNotification; diff --git a/src/browser/settings.jsx b/src/browser/settings.jsx index ce372267..ce6a9310 100644 --- a/src/browser/settings.jsx +++ b/src/browser/settings.jsx @@ -1,17 +1,17 @@ 'use strict'; -const {remote} = require('electron'); +import {remote} from 'electron'; window.eval = global.eval = () => { // eslint-disable-line no-multi-assign, no-eval throw new Error(`Sorry, ${remote.app.getName()} does not support window.eval() for security reasons.`); }; -const React = require('react'); -const ReactDOM = require('react-dom'); +import React from 'react'; +import ReactDOM from 'react-dom'; -const buildConfig = require('../common/config/buildConfig'); +import buildConfig from '../common/config/buildConfig'; -const SettingsPage = require('./components/SettingsPage.jsx'); -const contextMenu = require('./js/contextMenu'); +import SettingsPage from './components/SettingsPage.jsx'; +import contextMenu from './js/contextMenu'; const configFile = remote.app.getPath('userData') + '/config.json'; diff --git a/src/browser/webview/mattermost.js b/src/browser/webview/mattermost.js index d2f44931..acd9a72a 100644 --- a/src/browser/webview/mattermost.js +++ b/src/browser/webview/mattermost.js @@ -1,10 +1,8 @@ 'use strict'; -const electron = require('electron'); -const ipc = electron.ipcRenderer; -const webFrame = electron.webFrame; +import {ipcRenderer, webFrame} from 'electron'; -const EnhancedNotification = require('../js/notification'); +import EnhancedNotification from '../js/notification'; const UNREAD_COUNT_INTERVAL = 1000; //eslint-disable-next-line no-magic-numbers @@ -41,11 +39,11 @@ function watchReactAppUntilInitialized(callback) { window.addEventListener('load', () => { if (document.getElementById('root') === null) { console.log('The guest is not assumed as mattermost-webapp'); - ipc.sendToHost('onGuestInitialized'); + ipcRenderer.sendToHost('onGuestInitialized'); return; } watchReactAppUntilInitialized(() => { - ipc.sendToHost('onGuestInitialized'); + ipcRenderer.sendToHost('onGuestInitialized'); }); }); @@ -67,7 +65,7 @@ function getUnreadCount() { // LHS not found => Log out => Count should be 0. if (document.getElementById('sidebar-left') === null) { - ipc.sendToHost('onUnreadCountChange', 0, 0, false, false); + ipcRenderer.sendToHost('onUnreadCountChange', 0, 0, false, false); this.unreadCount = 0; this.mentionCount = 0; setTimeout(getUnreadCount, UNREAD_COUNT_INTERVAL); @@ -152,7 +150,7 @@ function getUnreadCount() { } if (this.unreadCount !== unreadCount || this.mentionCount !== mentionCount || isUnread || isMentioned) { - ipc.sendToHost('onUnreadCountChange', unreadCount, mentionCount, isUnread, isMentioned); + ipcRenderer.sendToHost('onUnreadCountChange', unreadCount, mentionCount, isUnread, isMentioned); } this.unreadCount = unreadCount; this.mentionCount = mentionCount; @@ -165,28 +163,28 @@ function isElementVisible(elem) { } function resetMisspelledState() { - ipc.once('spellchecker-is-ready', () => { + ipcRenderer.once('spellchecker-is-ready', () => { const element = document.activeElement; if (element) { element.blur(); element.focus(); } }); - ipc.send('reply-on-spellchecker-is-ready'); + ipcRenderer.send('reply-on-spellchecker-is-ready'); } function setSpellChecker() { - const spellCheckerLocale = ipc.sendSync('get-spellchecker-locale'); + const spellCheckerLocale = ipcRenderer.sendSync('get-spellchecker-locale'); webFrame.setSpellCheckProvider(spellCheckerLocale, false, { spellCheck(text) { - const res = ipc.sendSync('checkspell', text); + const res = ipcRenderer.sendSync('checkspell', text); return res === null ? true : res; }, }); resetMisspelledState(); } setSpellChecker(); -ipc.on('set-spellcheker', setSpellChecker); +ipcRenderer.on('set-spellcheker', setSpellChecker); // mattermost-webapp is SPA. So cache is not cleared due to no navigation. // We needed to manually clear cache to free memory in long-term-use. diff --git a/src/common/JsonFileManager.js b/src/common/JsonFileManager.js index 16a2048c..a8d110bd 100644 --- a/src/common/JsonFileManager.js +++ b/src/common/JsonFileManager.js @@ -1,6 +1,6 @@ -const fs = require('fs'); +import fs from 'fs'; -class JsonFileManager { +export default class JsonFileManager { constructor(file) { this.jsonFile = file; try { @@ -32,5 +32,3 @@ class JsonFileManager { return this.json[key]; } } - -module.exports = JsonFileManager; diff --git a/src/common/config/buildConfig.js b/src/common/config/buildConfig.js index b614abfb..c372b9f3 100644 --- a/src/common/config/buildConfig.js +++ b/src/common/config/buildConfig.js @@ -22,4 +22,4 @@ const buildConfig = { enableServerManagement: true, }; -module.exports = buildConfig; +export default buildConfig; diff --git a/src/common/config/defaultPreferences.js b/src/common/config/defaultPreferences.js index fe8fa13f..3a8669c0 100644 --- a/src/common/config/defaultPreferences.js +++ b/src/common/config/defaultPreferences.js @@ -18,4 +18,4 @@ const defaultPreferences = { enableHardwareAcceleration: false, }; -module.exports = defaultPreferences; +export default defaultPreferences; diff --git a/src/common/config/pastDefaultPreferences.js b/src/common/config/pastDefaultPreferences.js index 45d48fc2..01d2edde 100644 --- a/src/common/config/pastDefaultPreferences.js +++ b/src/common/config/pastDefaultPreferences.js @@ -1,4 +1,4 @@ -const defaultPreferences = require('./defaultPreferences'); +import defaultPreferences from './defaultPreferences'; const pastDefaultPreferences = { 0: { @@ -8,4 +8,4 @@ const pastDefaultPreferences = { pastDefaultPreferences[`${defaultPreferences.version}`] = defaultPreferences; -module.exports = pastDefaultPreferences; +export default pastDefaultPreferences; diff --git a/src/common/config/upgradePreferences.js b/src/common/config/upgradePreferences.js index 2fea75c5..c1e0e508 100644 --- a/src/common/config/upgradePreferences.js +++ b/src/common/config/upgradePreferences.js @@ -1,4 +1,4 @@ -const pastDefaultPreferences = require('./pastDefaultPreferences'); +import pastDefaultPreferences from './pastDefaultPreferences'; function deepCopy(object) { return JSON.parse(JSON.stringify(object)); @@ -16,7 +16,7 @@ function upgradeV0toV1(configV0) { return config; } -function upgradeToLatest(config) { +export default function upgradeToLatest(config) { var configVersion = config.version ? config.version : 0; switch (configVersion) { case 0: @@ -25,5 +25,3 @@ function upgradeToLatest(config) { return config; } } - -module.exports = upgradeToLatest; diff --git a/src/common/deepmerge.js b/src/common/deepmerge.js index 4b5a649c..905b4749 100644 --- a/src/common/deepmerge.js +++ b/src/common/deepmerge.js @@ -1,10 +1,5 @@ -const deepmerge = require('deepmerge'); +import deepmerge from 'deepmerge'; -function deepMergeProxy(x, y, options) { - if (process.env.TEST) { - return deepmerge(x, y, options); - } - return deepmerge.default(x, y, options); // due to webpack conversion +export default function deepMergeProxy(x, y, options) { + return deepmerge(x, y, options); // due to webpack conversion } - -module.exports = deepMergeProxy; diff --git a/src/common/osVersion.js b/src/common/osVersion.js index 352d9121..048fc74e 100644 --- a/src/common/osVersion.js +++ b/src/common/osVersion.js @@ -1,9 +1,9 @@ 'use strict'; -var os = require('os'); +import os from 'os'; var releaseSplit = os.release().split('.'); -module.exports = { +export default { major: parseInt(releaseSplit[0], 10), minor: parseInt(releaseSplit[1], 10), isLowerThanOrEqualWindows8_1() { diff --git a/src/common/settings.js b/src/common/settings.js index 28cf7785..13704e31 100644 --- a/src/common/settings.js +++ b/src/common/settings.js @@ -1,16 +1,16 @@ 'use strict'; -const fs = require('fs'); -const path = require('path'); +import fs from 'fs'; +import path from 'path'; -const buildConfig = require('./config/buildConfig'); +import buildConfig from './config/buildConfig'; function merge(base, target) { return Object.assign({}, base, target); } -const defaultPreferences = require('./config/defaultPreferences'); -const upgradePreferences = require('./config/upgradePreferences'); +import defaultPreferences from './config/defaultPreferences'; +import upgradePreferences from './config/upgradePreferences'; function loadDefault() { return JSON.parse(JSON.stringify(defaultPreferences)); @@ -24,7 +24,7 @@ function upgrade(config) { return upgradePreferences(config); } -module.exports = { +export default { version: defaultPreferences.version, upgrade, diff --git a/src/main.js b/src/main.js index 8dded718..1502eb9d 100644 --- a/src/main.js +++ b/src/main.js @@ -1,8 +1,9 @@ 'use strict'; -const os = require('os'); -const path = require('path'); +import os from 'os'; +import path from 'path'; +import electron from 'electron'; const { app, Menu, @@ -12,15 +13,15 @@ const { dialog, systemPreferences, session, -} = require('electron'); -const isDev = require('electron-is-dev'); -const installExtension = require('electron-devtools-installer'); -const parseArgv = require('yargs').parse; +} = electron; +import isDev from 'electron-is-dev'; +import installExtension, {REACT_DEVELOPER_TOOLS} from 'electron-devtools-installer'; +import {parse as parseArgv} from 'yargs'; -const protocols = require('../electron-builder.json').protocols; +import {protocols} from '../electron-builder.json'; -const squirrelStartup = require('./main/squirrelStartup'); -const CriticalErrorHandler = require('./main/CriticalErrorHandler'); +import squirrelStartup from './main/squirrelStartup'; +import CriticalErrorHandler from './main/CriticalErrorHandler'; const criticalErrorHandler = new CriticalErrorHandler(); @@ -32,19 +33,19 @@ app.setAppUserModelId('com.squirrel.mattermost.Mattermost'); // Use explicit App if (squirrelStartup()) { global.willAppQuit = true; } +import settings from './common/settings'; +import CertificateStore from './main/certificateStore'; +const certificateStore = CertificateStore.load(path.resolve(app.getPath('userData'), 'certificate.json')); +import createMainWindow from './main/mainWindow'; +import appMenu from './main/menus/app'; +import trayMenu from './main/menus/tray'; +import downloadURL from './main/downloadURL'; +import allowProtocolDialog from './main/allowProtocolDialog'; +import PermissionManager from './main/PermissionManager'; +import permissionRequestHandler from './main/permissionRequestHandler'; +import AppStateManager from './main/AppStateManager'; -var settings = require('./common/settings'); -var certificateStore = require('./main/certificateStore').load(path.resolve(app.getPath('userData'), 'certificate.json')); -const {createMainWindow} = require('./main/mainWindow'); -const appMenu = require('./main/menus/app'); -const trayMenu = require('./main/menus/tray'); -const downloadURL = require('./main/downloadURL'); -const allowProtocolDialog = require('./main/allowProtocolDialog'); -const PermissionManager = require('./main/PermissionManager'); -const permissionRequestHandler = require('./main/permissionRequestHandler'); -const AppStateManager = require('./main/AppStateManager'); - -const SpellChecker = require('./main/SpellChecker'); +import SpellChecker from './main/SpellChecker'; const assetsDir = path.resolve(app.getAppPath(), 'assets'); @@ -267,7 +268,7 @@ function handleScreenResize(screen, browserWindow) { app.on('browser-window-created', (e, newWindow) => { // Screen cannot be required before app is ready - const {screen} = require('electron'); // eslint-disable-line global-require + const {screen} = electron; // eslint-disable-line global-require handleScreenResize(screen, newWindow); }); @@ -403,7 +404,7 @@ app.on('ready', () => { appState.lastAppVersion = app.getVersion(); if (global.isDev) { - installExtension.default(installExtension.REACT_DEVELOPER_TOOLS). + installExtension(REACT_DEVELOPER_TOOLS). then((name) => console.log(`Added Extension: ${name}`)). catch((err) => console.log('An error occurred: ', err)); } diff --git a/src/main/AppStateManager.js b/src/main/AppStateManager.js index 7a0bdca2..c35e421d 100644 --- a/src/main/AppStateManager.js +++ b/src/main/AppStateManager.js @@ -1,6 +1,6 @@ -const JsonFileManager = require('../common/JsonFileManager'); +import JsonFileManager from '../common/JsonFileManager'; -class AppStateManager extends JsonFileManager { +export default class AppStateManager extends JsonFileManager { set lastAppVersion(version) { this.setValue('lastAppVersion', version); } @@ -9,5 +9,3 @@ class AppStateManager extends JsonFileManager { return this.getValue('lastAppVersion'); } } - -module.exports = AppStateManager; diff --git a/src/main/CriticalErrorHandler.js b/src/main/CriticalErrorHandler.js index 305ccef1..6789bb43 100644 --- a/src/main/CriticalErrorHandler.js +++ b/src/main/CriticalErrorHandler.js @@ -1,9 +1,9 @@ -const {spawn} = require('child_process'); -const fs = require('fs'); -const os = require('os'); -const path = require('path'); +import {spawn} from 'child_process'; +import fs from 'fs'; +import os from 'os'; +import path from 'path'; -const {app, dialog} = require('electron'); +import {app, dialog} from 'electron'; const BUTTON_OK = 'OK'; const BUTTON_SHOW_DETAILS = 'Show Details'; @@ -36,7 +36,7 @@ function bindWindowToShowMessageBox(win) { return dialog.showMessageBox; } -class CriticalErrorHandler { +export default class CriticalErrorHandler { constructor() { this.mainWindow = null; } @@ -97,5 +97,3 @@ class CriticalErrorHandler { throw err; } } - -module.exports = CriticalErrorHandler; diff --git a/src/main/PermissionManager.js b/src/main/PermissionManager.js index 49c9deed..e78639d3 100644 --- a/src/main/PermissionManager.js +++ b/src/main/PermissionManager.js @@ -1,11 +1,11 @@ -const fs = require('fs'); +import fs from 'fs'; -const utils = require('../utils/util'); +import utils from '../utils/util'; const PERMISSION_GRANTED = 'granted'; const PERMISSION_DENIED = 'denied'; -class PermissionManager { +export default class PermissionManager { constructor(file, trustedURLs = []) { this.file = file; this.setTrustedURLs(trustedURLs); @@ -70,5 +70,3 @@ class PermissionManager { } } } - -module.exports = PermissionManager; diff --git a/src/main/SpellChecker.js b/src/main/SpellChecker.js index 10176be0..2ef77f36 100644 --- a/src/main/SpellChecker.js +++ b/src/main/SpellChecker.js @@ -1,8 +1,8 @@ 'use strict'; -const EventEmitter = require('events'); +import EventEmitter from 'events'; -const simpleSpellChecker = require('simple-spellchecker'); +import simpleSpellChecker from 'simple-spellchecker'; /// Following approach for contractions is derived from electron-spellchecker. @@ -28,7 +28,7 @@ const contractionMap = contractions.reduce((acc, word) => { /// End: derived from electron-spellchecker. -class SpellChecker extends EventEmitter { +export default class SpellChecker extends EventEmitter { constructor(locale, dictDir, callback) { super(); this.dict = null; @@ -89,5 +89,3 @@ SpellChecker.getSpellCheckerLocale = (electronLocale) => { } return 'en-US'; }; - -module.exports = SpellChecker; diff --git a/src/main/allowProtocolDialog.js b/src/main/allowProtocolDialog.js index 0670a46c..1fee8ed8 100644 --- a/src/main/allowProtocolDialog.js +++ b/src/main/allowProtocolDialog.js @@ -1,14 +1,9 @@ 'use strict'; -const path = require('path'); -const fs = require('fs'); +import path from 'path'; +import fs from 'fs'; -const { - app, - dialog, - ipcMain, - shell, -} = require('electron'); +import {app, dialog, ipcMain, shell} from 'electron'; const allowedProtocolFile = path.resolve(app.getPath('userData'), 'allowedProtocols.json'); var allowedProtocols = []; @@ -63,6 +58,6 @@ function initDialogEvent(mainWindow) { }); } -module.exports = { +export default { init, }; diff --git a/src/main/certificateStore.js b/src/main/certificateStore.js index e0bf7db2..069f6350 100644 --- a/src/main/certificateStore.js +++ b/src/main/certificateStore.js @@ -1,7 +1,7 @@ 'use strict'; -const fs = require('fs'); -const url = require('url'); +import fs from 'fs'; +import url from 'url'; function comparableCertificate(certificate) { return { @@ -60,7 +60,7 @@ CertificateStore.prototype.isTrusted = function isTrusted(targetURL, certificate return areEqual(this.data[host], comparableCertificate(certificate)); }; -module.exports = { +export default { load(storeFile) { return new CertificateStore(storeFile); }, diff --git a/src/main/downloadURL.js b/src/main/downloadURL.js index b89a1f8e..3fa27699 100644 --- a/src/main/downloadURL.js +++ b/src/main/downloadURL.js @@ -1,11 +1,11 @@ -const fs = require('fs'); -const path = require('path'); -const zlib = require('zlib'); +import fs from 'fs'; +import path from 'path'; +import zlib from 'zlib'; -const electron = require('electron'); +import electron from 'electron'; const {app, dialog} = electron; -function downloadURL(browserWindow, URL, callback) { +export default function downloadURL(browserWindow, URL, callback) { const {net} = electron; const request = net.request(URL); request.setHeader('Accept-Encoding', 'gzip,deflate'); @@ -49,5 +49,3 @@ function saveResponseBody(response, filename, callback) { break; } } - -module.exports = downloadURL; diff --git a/src/main/mainWindow.js b/src/main/mainWindow.js index 06f5137b..e34ccc27 100644 --- a/src/main/mainWindow.js +++ b/src/main/mainWindow.js @@ -1,7 +1,7 @@ -const fs = require('fs'); -const path = require('path'); +import fs from 'fs'; +import path from 'path'; -const {app, BrowserWindow} = require('electron'); +import {app, BrowserWindow} from 'electron'; function saveWindowState(file, window) { var windowState = window.getBounds(); @@ -135,4 +135,4 @@ function createMainWindow(config, options) { return mainWindow; } -module.exports = {createMainWindow}; +export default createMainWindow; diff --git a/src/main/menus/app.js b/src/main/menus/app.js index 2a28fdf9..8e53dd8f 100644 --- a/src/main/menus/app.js +++ b/src/main/menus/app.js @@ -1,20 +1,18 @@ 'use strict'; -const electron = require('electron'); +import {app, dialog, Menu, shell} from 'electron'; -const settings = require('../../common/settings'); -const buildConfig = require('../../common/config/buildConfig'); - -const Menu = electron.Menu; +import settings from '../../common/settings'; +import buildConfig from '../../common/config/buildConfig'; function createTemplate(mainWindow, config, isDev) { - const settingsURL = isDev ? 'http://localhost:8080/browser/settings.html' : `file://${electron.app.getAppPath()}/browser/settings.html`; + const settingsURL = isDev ? 'http://localhost:8080/browser/settings.html' : `file://${app.getAppPath()}/browser/settings.html`; const separatorItem = { type: 'separator', }; - var appName = electron.app.getName(); + var appName = app.getName(); var firstMenuName = (process.platform === 'darwin') ? appName : 'File'; var template = []; @@ -22,9 +20,9 @@ function createTemplate(mainWindow, config, isDev) { label: 'About ' + appName, role: 'about', click() { - electron.dialog.showMessageBox(mainWindow, { + dialog.showMessageBox(mainWindow, { buttons: ['OK'], - message: `${appName} Desktop ${electron.app.getVersion()}`, + message: `${appName} Desktop ${app.getVersion()}`, }); }, }, separatorItem, { @@ -64,7 +62,7 @@ function createTemplate(mainWindow, config, isDev) { role: 'quit', accelerator: 'CmdOrCtrl+Q', click() { - electron.app.quit(); + app.quit(); }, }] ); @@ -215,13 +213,13 @@ function createTemplate(mainWindow, config, isDev) { submenu.push({ label: 'Learn More...', click() { - electron.shell.openExternal(buildConfig.helpLink); + shell.openExternal(buildConfig.helpLink); }, }); submenu.push(separatorItem); } submenu.push({ - label: `Version ${electron.app.getVersion()}`, + label: `Version ${app.getVersion()}`, enabled: false, }); template.push({label: '&Help', submenu}); @@ -232,6 +230,6 @@ function createMenu(mainWindow, config, isDev) { return Menu.buildFromTemplate(createTemplate(mainWindow, config, isDev)); } -module.exports = { +export default { createMenu, }; diff --git a/src/main/menus/tray.js b/src/main/menus/tray.js index c3a15f33..25126f42 100644 --- a/src/main/menus/tray.js +++ b/src/main/menus/tray.js @@ -1,11 +1,8 @@ 'use strict'; -const { - app, - Menu, -} = require('electron'); +import {app, Menu} from 'electron'; -const settings = require('../../common/settings'); +import settings from '../../common/settings'; function createTemplate(mainWindow, config, isDev) { const settingsURL = isDev ? 'http://localhost:8080/browser/settings.html' : `file://${app.getAppPath()}/browser/settings.html`; @@ -58,6 +55,6 @@ function showOrRestore(window) { } } -module.exports = { +export default { createMenu, }; diff --git a/src/main/permissionRequestHandler.js b/src/main/permissionRequestHandler.js index 94a799cf..6ca03758 100644 --- a/src/main/permissionRequestHandler.js +++ b/src/main/permissionRequestHandler.js @@ -1,6 +1,6 @@ -const {URL} = require('url'); +import {URL} from 'url'; -const {ipcMain} = require('electron'); +import {ipcMain} from 'electron'; function dequeueRequests(requestQueue, permissionManager, origin, permission, status) { switch (status) { @@ -31,7 +31,7 @@ function dequeueRequests(requestQueue, permissionManager, origin, permission, st } } -function permissionRequestHandler(mainWindow, permissionManager) { +export default function permissionRequestHandler(mainWindow, permissionManager) { const requestQueue = []; ipcMain.on('update-permission', (event, origin, permission, status) => { dequeueRequests(requestQueue, permissionManager, origin, permission, status); @@ -55,5 +55,3 @@ function permissionRequestHandler(mainWindow, permissionManager) { mainWindow.webContents.send('request-permission', targetURL.origin, permission); }; } - -module.exports = permissionRequestHandler; diff --git a/src/main/squirrelStartup.js b/src/main/squirrelStartup.js index 64356dd9..d6736584 100644 --- a/src/main/squirrelStartup.js +++ b/src/main/squirrelStartup.js @@ -1,5 +1,5 @@ -const AutoLaunch = require('auto-launch'); -const {app} = require('electron'); +import AutoLaunch from 'auto-launch'; +import {app} from 'electron'; function shouldQuitApp(cmd) { if (process.platform !== 'win32') { @@ -26,7 +26,7 @@ async function setupAutoLaunch(cmd) { return async () => true; } -function squirrelStartup() { +export default function squirrelStartup() { if (process.platform === 'win32') { const cmd = process.argv[1]; setupAutoLaunch(cmd).then(() => { @@ -36,5 +36,3 @@ function squirrelStartup() { } return false; } - -module.exports = squirrelStartup; diff --git a/src/utils/util.js b/src/utils/util.js index 4c756682..e2da78a3 100644 --- a/src/utils/util.js +++ b/src/utils/util.js @@ -1,8 +1,8 @@ -const url = require('url'); +import url from 'url'; function getDomain(inputURL) { const parsedURL = url.parse(inputURL); return `${parsedURL.protocol}//${parsedURL.host}`; } -module.exports = {getDomain}; +export default {getDomain}; diff --git a/test/.eslintrc.json b/test/.eslintrc.json index 79cfccb7..edad852d 100644 --- a/test/.eslintrc.json +++ b/test/.eslintrc.json @@ -6,6 +6,7 @@ "open_window": true }, "rules": { + "import/no-commonjs": 0, "func-names": 0, "global-require": 0, "max-nested-callbacks": 0,