Use ES6 import/export for modules

This commit is contained in:
Yuya Ochiai 2018-04-10 01:16:44 +09:00
parent 7af4a139ec
commit 60e6058869
46 changed files with 238 additions and 287 deletions

View file

@ -3,7 +3,11 @@
"parserOptions": { "parserOptions": {
"ecmaVersion": 2017 "ecmaVersion": 2017
}, },
"settings": {
"import/resolver": "node"
},
"rules": { "rules": {
"import/no-commonjs": 2,
"indent": [2, 2, {"SwitchCase": 0}], "indent": [2, 2, {"SwitchCase": 0}],
"no-console": 0, "no-console": 0,
"no-process-env": 0, "no-process-env": 0,

5
scripts/.eslintrc.json Normal file
View file

@ -0,0 +1,5 @@
{
"rules": {
"import/no-commonjs": 0
}
}

View file

@ -1,6 +1,6 @@
const React = require('react'); import React from 'react';
const PropTypes = require('prop-types'); import PropTypes from 'prop-types';
const {Alert} = require('react-bootstrap'); import {Alert} from 'react-bootstrap';
const baseClassName = 'AutoSaveIndicator'; const baseClassName = 'AutoSaveIndicator';
const leaveClassName = `${baseClassName}-Leave`; 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 {savingState, errorMessage, ...rest} = props;
const {className, message} = getClassNameAndMessage(savingState, errorMessage); const {className, message} = getClassNameAndMessage(savingState, errorMessage);
return ( return (
@ -50,5 +50,3 @@ Object.assign(AutoSaveIndicator, {
SAVING_STATE_ERROR, SAVING_STATE_ERROR,
SAVING_STATE_DONE, SAVING_STATE_DONE,
}); });
module.exports = AutoSaveIndicator;

View file

@ -1,8 +1,8 @@
const React = require('react'); import React from 'react';
const PropTypes = require('prop-types'); import PropTypes from 'prop-types';
const {Button, Modal} = require('react-bootstrap'); import {Button, Modal} from 'react-bootstrap';
function DestructiveConfirmationModal(props) { export default function DestructiveConfirmationModal(props) {
const { const {
title, title,
body, body,
@ -39,5 +39,3 @@ DestructiveConfirmationModal.propTypes = {
onAccept: PropTypes.func.isRequired, onAccept: PropTypes.func.isRequired,
onCancel: PropTypes.func.isRequired, onCancel: PropTypes.func.isRequired,
}; };
module.exports = DestructiveConfirmationModal;

View file

@ -1,11 +1,11 @@
// ErrorCode: https://code.google.com/p/chromium/codesearch#chromium/src/net/base/net_error_list.h // ErrorCode: https://code.google.com/p/chromium/codesearch#chromium/src/net/base/net_error_list.h
const React = require('react'); import React from 'react';
const PropTypes = require('prop-types'); import PropTypes from 'prop-types';
const {Grid, Row, Col} = require('react-bootstrap'); import {Grid, Row, Col} from 'react-bootstrap';
const {shell, remote} = require('electron'); import {shell, remote} from 'electron';
function ErrorView(props) { export default function ErrorView(props) {
const classNames = ['container', 'ErrorView']; const classNames = ['container', 'ErrorView'];
if (!props.active) { if (!props.active) {
classNames.push('ErrorView-hidden'); classNames.push('ErrorView-hidden');
@ -82,5 +82,3 @@ ErrorView.propTypes = {
active: PropTypes.bool, active: PropTypes.bool,
withTab: PropTypes.bool, withTab: PropTypes.bool,
}; };
module.exports = ErrorView;

View file

@ -1,7 +1,7 @@
const React = require('react'); import React from 'react';
const PropTypes = require('prop-types'); import PropTypes from 'prop-types';
function HoveringURL(props) { export default function HoveringURL(props) {
return ( return (
<div className='HoveringURL HoveringURL-left'> <div className='HoveringURL HoveringURL-left'>
{props.targetURL} {props.targetURL}
@ -12,5 +12,3 @@ function HoveringURL(props) {
HoveringURL.propTypes = { HoveringURL.propTypes = {
targetURL: PropTypes.string, targetURL: PropTypes.string,
}; };
module.exports = HoveringURL;

View file

@ -1,9 +1,9 @@
const React = require('react'); import React from 'react';
const PropTypes = require('prop-types'); import PropTypes from 'prop-types';
const ReactDOM = require('react-dom'); import {findDOMNode} from 'react-dom';
const {Button, Col, ControlLabel, Form, FormGroup, FormControl, Modal} = require('react-bootstrap'); 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) { constructor(props) {
super(props); super(props);
this.handleSubmit = this.handleSubmit.bind(this); this.handleSubmit = this.handleSubmit.bind(this);
@ -11,8 +11,8 @@ class LoginModal extends React.Component {
handleSubmit(event) { handleSubmit(event) {
event.preventDefault(); event.preventDefault();
const usernameNode = ReactDOM.findDOMNode(this.refs.username); const usernameNode = findDOMNode(this.refs.username);
const passwordNode = ReactDOM.findDOMNode(this.refs.password); const passwordNode = findDOMNode(this.refs.password);
this.props.onLogin(this.props.request, usernameNode.value, passwordNode.value); this.props.onLogin(this.props.request, usernameNode.value, passwordNode.value);
usernameNode.value = ''; usernameNode.value = '';
passwordNode.value = ''; passwordNode.value = '';
@ -94,5 +94,3 @@ LoginModal.propTypes = {
request: PropTypes.object, request: PropTypes.object,
show: PropTypes.bool, show: PropTypes.bool,
}; };
module.exports = LoginModal;

View file

@ -1,22 +1,22 @@
const url = require('url'); import url from 'url';
const React = require('react'); import React from 'react';
const PropTypes = require('prop-types'); import PropTypes from 'prop-types';
const createReactClass = require('create-react-class'); import createReactClass from 'create-react-class';
const {CSSTransition, TransitionGroup} = require('react-transition-group'); import {CSSTransition, TransitionGroup} from 'react-transition-group';
const {Grid, Row} = require('react-bootstrap'); 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'); import LoginModal from './LoginModal.jsx';
const MattermostView = require('./MattermostView.jsx'); import MattermostView from './MattermostView.jsx';
const TabBar = require('./TabBar.jsx'); import TabBar from './TabBar.jsx';
const HoveringURL = require('./HoveringURL.jsx'); import HoveringURL from './HoveringURL.jsx';
const PermissionRequestDialog = require('./PermissionRequestDialog.jsx'); import PermissionRequestDialog from './PermissionRequestDialog.jsx';
const NewTeamModal = require('./NewTeamModal.jsx'); import NewTeamModal from './NewTeamModal.jsx';
const MainPage = createReactClass({ const MainPage = createReactClass({
propTypes: { propTypes: {
@ -386,4 +386,4 @@ const MainPage = createReactClass({
}, },
}); });
module.exports = MainPage; export default MainPage;

View file

@ -1,18 +1,18 @@
/* eslint-disable react/no-set-state */ /* eslint-disable react/no-set-state */
// setState() is necessary for this component // setState() is necessary for this component
const url = require('url'); import url from 'url';
const React = require('react'); import React from 'react';
const PropTypes = require('prop-types'); import PropTypes from 'prop-types';
const createReactClass = require('create-react-class'); import createReactClass from 'create-react-class';
const {findDOMNode} = require('react-dom'); import {findDOMNode} from 'react-dom';
const {ipcRenderer, remote, shell} = require('electron'); import {ipcRenderer, remote, shell} from 'electron';
const contextMenu = require('../js/contextMenu'); import contextMenu from '../js/contextMenu';
const {protocols} = require('../../../electron-builder.json'); import {protocols} from '../../../electron-builder.json';
const scheme = protocols[0].schemes[0]; 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`; const preloadJS = `file://${remote.app.getAppPath()}/browser/webview/mattermost_bundle.js`;
@ -312,4 +312,4 @@ const MattermostView = createReactClass({
}, },
}); });
module.exports = MattermostView; export default MattermostView;

View file

@ -1,8 +1,8 @@
const React = require('react'); import React from 'react';
const PropTypes = require('prop-types'); import PropTypes from 'prop-types';
const {Modal, Button, FormGroup, FormControl, ControlLabel, HelpBlock} = require('react-bootstrap'); import {Modal, Button, FormGroup, FormControl, ControlLabel, HelpBlock} from 'react-bootstrap';
class NewTeamModal extends React.Component { export default class NewTeamModal extends React.Component {
constructor() { constructor() {
super(); super();
@ -201,5 +201,3 @@ NewTeamModal.propTypes = {
editMode: PropTypes.bool, editMode: PropTypes.bool,
show: PropTypes.bool, show: PropTypes.bool,
}; };
module.exports = NewTeamModal;

View file

@ -1,6 +1,6 @@
const React = require('react'); import React from 'react';
const PropTypes = require('prop-types'); import PropTypes from 'prop-types';
const {Button, Glyphicon, Popover} = require('react-bootstrap'); import {Button, Glyphicon, Popover} from 'react-bootstrap';
const PERMISSIONS = { const PERMISSIONS = {
media: { media: {
@ -49,7 +49,7 @@ function description(permission) {
return `Be granted "${permission}" permission`; return `Be granted "${permission}" permission`;
} }
function PermissionRequestDialog(props) { export default function PermissionRequestDialog(props) {
const {origin, permission, onClickAllow, onClickBlock, onClickClose, ...reft} = props; const {origin, permission, onClickAllow, onClickBlock, onClickClose, ...reft} = props;
return ( return (
<Popover <Popover
@ -85,5 +85,3 @@ PermissionRequestDialog.propTypes = {
onClickBlock: PropTypes.func, onClickBlock: PropTypes.func,
onClickClose: PropTypes.func, onClickClose: PropTypes.func,
}; };
module.exports = PermissionRequestDialog;

View file

@ -1,10 +1,10 @@
const React = require('react'); import React from 'react';
const PropTypes = require('prop-types'); import PropTypes from 'prop-types';
const {Modal} = require('react-bootstrap'); import {Modal} from 'react-bootstrap';
const DestructiveConfirmationModal = require('./DestructiveConfirmModal.jsx'); import DestructiveConfirmationModal from './DestructiveConfirmModal.jsx';
function RemoveServerModal(props) { export default function RemoveServerModal(props) {
const {serverName, ...rest} = props; const {serverName, ...rest} = props;
return ( return (
<DestructiveConfirmationModal <DestructiveConfirmationModal
@ -30,5 +30,3 @@ function RemoveServerModal(props) {
RemoveServerModal.propTypes = { RemoveServerModal.propTypes = {
serverName: PropTypes.string.isRequired, serverName: PropTypes.string.isRequired,
}; };
module.exports = RemoveServerModal;

View file

@ -1,18 +1,18 @@
const React = require('react'); import React from 'react';
const PropTypes = require('prop-types'); import PropTypes from 'prop-types';
const createReactClass = require('create-react-class'); import createReactClass from 'create-react-class';
const ReactDOM = require('react-dom'); import ReactDOM from 'react-dom';
const {Button, Checkbox, Col, FormGroup, Grid, HelpBlock, Navbar, Radio, Row} = require('react-bootstrap'); import {Button, Checkbox, Col, FormGroup, Grid, HelpBlock, Navbar, Radio, Row} from 'react-bootstrap';
const {ipcRenderer, remote} = require('electron'); import {ipcRenderer, remote} from 'electron';
const AutoLaunch = require('auto-launch'); import AutoLaunch from 'auto-launch';
const {debounce} = require('underscore'); import {debounce} from 'underscore';
const buildConfig = require('../../common/config/buildConfig'); import buildConfig from '../../common/config/buildConfig';
const settings = require('../../common/settings'); import settings from '../../common/settings';
const TeamList = require('./TeamList.jsx'); import TeamList from './TeamList.jsx';
const AutoSaveIndicator = require('./AutoSaveIndicator.jsx'); import AutoSaveIndicator from './AutoSaveIndicator.jsx';
const appLauncher = new AutoLaunch({ const appLauncher = new AutoLaunch({
name: remote.app.getName(), name: remote.app.getName(),
@ -625,4 +625,4 @@ const SettingsPage = createReactClass({
}, },
}); });
module.exports = SettingsPage; export default SettingsPage;

View file

@ -1,10 +1,10 @@
const React = require('react'); import React from 'react';
const PropTypes = require('prop-types'); import PropTypes from 'prop-types';
const {Glyphicon, Nav, NavItem, Overlay} = require('react-bootstrap'); import {Glyphicon, Nav, NavItem, Overlay} from 'react-bootstrap';
const PermissionRequestDialog = require('./PermissionRequestDialog.jsx'); import PermissionRequestDialog from './PermissionRequestDialog.jsx';
class TabBar extends React.Component { // need "this" export default class TabBar extends React.Component { // need "this"
render() { render() {
const tabs = this.props.teams.map((team, index) => { const tabs = this.props.teams.map((team, index) => {
let unreadCount = 0; let unreadCount = 0;
@ -118,5 +118,3 @@ TabBar.propTypes = {
onAddServer: PropTypes.func, onAddServer: PropTypes.func,
onClickPermissionDialog: PropTypes.func, onClickPermissionDialog: PropTypes.func,
}; };
module.exports = TabBar;

View file

@ -1,11 +1,11 @@
const React = require('react'); import React from 'react';
const PropTypes = require('prop-types'); import PropTypes from 'prop-types';
const createReactClass = require('create-react-class'); import createReactClass from 'create-react-class';
const {ListGroup} = require('react-bootstrap'); import {ListGroup} from 'react-bootstrap';
const TeamListItem = require('./TeamListItem.jsx'); import TeamListItem from './TeamListItem.jsx';
const NewTeamModal = require('./NewTeamModal.jsx'); import NewTeamModal from './NewTeamModal.jsx';
const RemoveServerModal = require('./RemoveServerModal.jsx'); import RemoveServerModal from './RemoveServerModal.jsx';
const TeamList = createReactClass({ const TeamList = createReactClass({
propTypes: { propTypes: {
@ -171,4 +171,4 @@ const TeamList = createReactClass({
}, },
}); });
module.exports = TeamList; export default TeamList;

View file

@ -1,7 +1,7 @@
const React = require('react'); import React from 'react';
const PropTypes = require('prop-types'); import PropTypes from 'prop-types';
class TeamListItem extends React.Component { export default class TeamListItem extends React.Component {
constructor(props) { constructor(props) {
super(props); super(props);
this.handleTeamRemove = this.handleTeamRemove.bind(this); this.handleTeamRemove = this.handleTeamRemove.bind(this);
@ -49,5 +49,3 @@ TeamListItem.propTypes = {
onTeamClick: PropTypes.func, onTeamClick: PropTypes.func,
url: PropTypes.string, url: PropTypes.string,
}; };
module.exports = TeamListItem;

View file

@ -1,6 +1,6 @@
const {remote} = require('electron'); import {remote} from 'electron';
const settings = require('../../common/settings'); import settings from '../../common/settings';
class AppConfig { class AppConfig {
constructor(file) { 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');

View file

@ -1,24 +1,24 @@
'use strict'; 'use strict';
require('./css/index.css'); import './css/index.css';
window.eval = global.eval = () => { // eslint-disable-line no-multi-assign, no-eval 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.'); 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'); import React from 'react';
const ReactDOM = require('react-dom'); import ReactDOM from 'react-dom';
const {remote, ipcRenderer} = require('electron'); import {remote, ipcRenderer} from 'electron';
const buildConfig = require('../common/config/buildConfig'); import buildConfig from '../common/config/buildConfig';
const settings = require('../common/settings'); import settings from '../common/settings';
const utils = require('../utils/util'); import utils from '../utils/util';
const MainPage = require('./components/MainPage.jsx'); import MainPage from './components/MainPage.jsx';
const AppConfig = require('./config/AppConfig.js'); import AppConfig from './config/AppConfig.js';
const badge = require('./js/badge'); import {createDataURL as createBadgeDataURL} from './js/badge';
const teams = settings.mergeDefaultTeams(AppConfig.data.teams); const teams = settings.mergeDefaultTeams(AppConfig.data.teams);
@ -41,10 +41,10 @@ function showUnreadBadgeWindows(unreadCount, mentionCount) {
} }
if (mentionCount > 0) { if (mentionCount > 0) {
const dataURL = badge.createDataURL(mentionCount.toString()); const dataURL = createBadgeDataURL(mentionCount.toString());
sendBadge(dataURL, 'You have unread mentions (' + mentionCount + ')'); sendBadge(dataURL, 'You have unread mentions (' + mentionCount + ')');
} else if (unreadCount > 0 && AppConfig.data.showUnreadBadge) { } else if (unreadCount > 0 && AppConfig.data.showUnreadBadge) {
const dataURL = badge.createDataURL('•'); const dataURL = createBadgeDataURL('•');
sendBadge(dataURL, 'You have unread channels (' + unreadCount + ')'); sendBadge(dataURL, 'You have unread channels (' + unreadCount + ')');
} else { } else {
sendBadge(null, 'You have no unread messages'); sendBadge(null, 'You have no unread messages');

View file

@ -1,6 +1,6 @@
'use strict'; 'use strict';
function createDataURL(text) { export function createDataURL(text) {
const scale = 2; // should rely display dpi const scale = 2; // should rely display dpi
const size = 16 * scale; const size = 16 * scale;
const canvas = document.createElement('canvas'); const canvas = document.createElement('canvas');
@ -23,7 +23,3 @@ function createDataURL(text) {
return canvas.toDataURL(); return canvas.toDataURL();
} }
module.exports = {
createDataURL,
};

View file

@ -1,5 +1,5 @@
const {ipcRenderer} = require('electron'); import {ipcRenderer} from 'electron';
const electronContextMenu = require('electron-context-menu'); import electronContextMenu from 'electron-context-menu';
function getSuggestionsMenus(win, suggestions) { function getSuggestionsMenus(win, suggestions) {
if (suggestions.length === 0) { if (suggestions.length === 0) {
@ -37,7 +37,7 @@ function getSpellCheckerLocaleMenus(onSelectSpellCheckerLocale) {
})); }));
} }
module.exports = { export default {
setup(win, options) { setup(win, options) {
const defaultOptions = { const defaultOptions = {
useSpellChecker: false, useSpellChecker: false,

View file

@ -1,11 +1,12 @@
'use strict'; 'use strict';
const OriginalNotification = Notification; const OriginalNotification = Notification;
const {ipcRenderer, remote} = require('electron'); import {throttle} from 'underscore';
const {throttle} = require('underscore');
const osVersion = require('../../common/osVersion'); import {ipcRenderer, remote} from 'electron';
const dingDataURL = require('../../assets/ding.mp3'); // https://github.com/mattermost/platform/blob/v3.7.3/webapp/images/ding.mp3
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`; const appIconURL = `file:///${remote.app.getAppPath()}/assets/appicon.png`;
@ -14,7 +15,7 @@ const playDing = throttle(() => {
ding.play(); ding.play();
}, 3000, {trailing: false}); }, 3000, {trailing: false});
class EnhancedNotification extends OriginalNotification { export default class EnhancedNotification extends OriginalNotification {
constructor(title, options) { constructor(title, options) {
if (process.platform === 'win32') { if (process.platform === 'win32') {
// Replace with application icon. // Replace with application icon.
@ -64,5 +65,3 @@ class EnhancedNotification extends OriginalNotification {
return super.onclick; return super.onclick;
} }
} }
module.exports = EnhancedNotification;

View file

@ -1,17 +1,17 @@
'use strict'; 'use strict';
const {remote} = require('electron'); import {remote} from 'electron';
window.eval = global.eval = () => { // eslint-disable-line no-multi-assign, no-eval 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.`); throw new Error(`Sorry, ${remote.app.getName()} does not support window.eval() for security reasons.`);
}; };
const React = require('react'); import React from 'react';
const ReactDOM = require('react-dom'); import ReactDOM from 'react-dom';
const buildConfig = require('../common/config/buildConfig'); import buildConfig from '../common/config/buildConfig';
const SettingsPage = require('./components/SettingsPage.jsx'); import SettingsPage from './components/SettingsPage.jsx';
const contextMenu = require('./js/contextMenu'); import contextMenu from './js/contextMenu';
const configFile = remote.app.getPath('userData') + '/config.json'; const configFile = remote.app.getPath('userData') + '/config.json';

View file

@ -1,10 +1,8 @@
'use strict'; 'use strict';
const electron = require('electron'); import {ipcRenderer, webFrame} from 'electron';
const ipc = electron.ipcRenderer;
const webFrame = electron.webFrame;
const EnhancedNotification = require('../js/notification'); import EnhancedNotification from '../js/notification';
const UNREAD_COUNT_INTERVAL = 1000; const UNREAD_COUNT_INTERVAL = 1000;
//eslint-disable-next-line no-magic-numbers //eslint-disable-next-line no-magic-numbers
@ -41,11 +39,11 @@ function watchReactAppUntilInitialized(callback) {
window.addEventListener('load', () => { window.addEventListener('load', () => {
if (document.getElementById('root') === null) { if (document.getElementById('root') === null) {
console.log('The guest is not assumed as mattermost-webapp'); console.log('The guest is not assumed as mattermost-webapp');
ipc.sendToHost('onGuestInitialized'); ipcRenderer.sendToHost('onGuestInitialized');
return; return;
} }
watchReactAppUntilInitialized(() => { watchReactAppUntilInitialized(() => {
ipc.sendToHost('onGuestInitialized'); ipcRenderer.sendToHost('onGuestInitialized');
}); });
}); });
@ -67,7 +65,7 @@ function getUnreadCount() {
// LHS not found => Log out => Count should be 0. // LHS not found => Log out => Count should be 0.
if (document.getElementById('sidebar-left') === null) { if (document.getElementById('sidebar-left') === null) {
ipc.sendToHost('onUnreadCountChange', 0, 0, false, false); ipcRenderer.sendToHost('onUnreadCountChange', 0, 0, false, false);
this.unreadCount = 0; this.unreadCount = 0;
this.mentionCount = 0; this.mentionCount = 0;
setTimeout(getUnreadCount, UNREAD_COUNT_INTERVAL); setTimeout(getUnreadCount, UNREAD_COUNT_INTERVAL);
@ -152,7 +150,7 @@ function getUnreadCount() {
} }
if (this.unreadCount !== unreadCount || this.mentionCount !== mentionCount || isUnread || isMentioned) { 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.unreadCount = unreadCount;
this.mentionCount = mentionCount; this.mentionCount = mentionCount;
@ -165,28 +163,28 @@ function isElementVisible(elem) {
} }
function resetMisspelledState() { function resetMisspelledState() {
ipc.once('spellchecker-is-ready', () => { ipcRenderer.once('spellchecker-is-ready', () => {
const element = document.activeElement; const element = document.activeElement;
if (element) { if (element) {
element.blur(); element.blur();
element.focus(); element.focus();
} }
}); });
ipc.send('reply-on-spellchecker-is-ready'); ipcRenderer.send('reply-on-spellchecker-is-ready');
} }
function setSpellChecker() { function setSpellChecker() {
const spellCheckerLocale = ipc.sendSync('get-spellchecker-locale'); const spellCheckerLocale = ipcRenderer.sendSync('get-spellchecker-locale');
webFrame.setSpellCheckProvider(spellCheckerLocale, false, { webFrame.setSpellCheckProvider(spellCheckerLocale, false, {
spellCheck(text) { spellCheck(text) {
const res = ipc.sendSync('checkspell', text); const res = ipcRenderer.sendSync('checkspell', text);
return res === null ? true : res; return res === null ? true : res;
}, },
}); });
resetMisspelledState(); resetMisspelledState();
} }
setSpellChecker(); setSpellChecker();
ipc.on('set-spellcheker', setSpellChecker); ipcRenderer.on('set-spellcheker', setSpellChecker);
// mattermost-webapp is SPA. So cache is not cleared due to no navigation. // 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. // We needed to manually clear cache to free memory in long-term-use.

View file

@ -1,6 +1,6 @@
const fs = require('fs'); import fs from 'fs';
class JsonFileManager { export default class JsonFileManager {
constructor(file) { constructor(file) {
this.jsonFile = file; this.jsonFile = file;
try { try {
@ -32,5 +32,3 @@ class JsonFileManager {
return this.json[key]; return this.json[key];
} }
} }
module.exports = JsonFileManager;

View file

@ -22,4 +22,4 @@ const buildConfig = {
enableServerManagement: true, enableServerManagement: true,
}; };
module.exports = buildConfig; export default buildConfig;

View file

@ -18,4 +18,4 @@ const defaultPreferences = {
enableHardwareAcceleration: false, enableHardwareAcceleration: false,
}; };
module.exports = defaultPreferences; export default defaultPreferences;

View file

@ -1,4 +1,4 @@
const defaultPreferences = require('./defaultPreferences'); import defaultPreferences from './defaultPreferences';
const pastDefaultPreferences = { const pastDefaultPreferences = {
0: { 0: {
@ -8,4 +8,4 @@ const pastDefaultPreferences = {
pastDefaultPreferences[`${defaultPreferences.version}`] = defaultPreferences; pastDefaultPreferences[`${defaultPreferences.version}`] = defaultPreferences;
module.exports = pastDefaultPreferences; export default pastDefaultPreferences;

View file

@ -1,4 +1,4 @@
const pastDefaultPreferences = require('./pastDefaultPreferences'); import pastDefaultPreferences from './pastDefaultPreferences';
function deepCopy(object) { function deepCopy(object) {
return JSON.parse(JSON.stringify(object)); return JSON.parse(JSON.stringify(object));
@ -16,7 +16,7 @@ function upgradeV0toV1(configV0) {
return config; return config;
} }
function upgradeToLatest(config) { export default function upgradeToLatest(config) {
var configVersion = config.version ? config.version : 0; var configVersion = config.version ? config.version : 0;
switch (configVersion) { switch (configVersion) {
case 0: case 0:
@ -25,5 +25,3 @@ function upgradeToLatest(config) {
return config; return config;
} }
} }
module.exports = upgradeToLatest;

View file

@ -1,10 +1,5 @@
const deepmerge = require('deepmerge'); import deepmerge from 'deepmerge';
function deepMergeProxy(x, y, options) { export default function deepMergeProxy(x, y, options) {
if (process.env.TEST) { return deepmerge(x, y, options); // due to webpack conversion
return deepmerge(x, y, options);
}
return deepmerge.default(x, y, options); // due to webpack conversion
} }
module.exports = deepMergeProxy;

View file

@ -1,9 +1,9 @@
'use strict'; 'use strict';
var os = require('os'); import os from 'os';
var releaseSplit = os.release().split('.'); var releaseSplit = os.release().split('.');
module.exports = { export default {
major: parseInt(releaseSplit[0], 10), major: parseInt(releaseSplit[0], 10),
minor: parseInt(releaseSplit[1], 10), minor: parseInt(releaseSplit[1], 10),
isLowerThanOrEqualWindows8_1() { isLowerThanOrEqualWindows8_1() {

View file

@ -1,16 +1,16 @@
'use strict'; 'use strict';
const fs = require('fs'); import fs from 'fs';
const path = require('path'); import path from 'path';
const buildConfig = require('./config/buildConfig'); import buildConfig from './config/buildConfig';
function merge(base, target) { function merge(base, target) {
return Object.assign({}, base, target); return Object.assign({}, base, target);
} }
const defaultPreferences = require('./config/defaultPreferences'); import defaultPreferences from './config/defaultPreferences';
const upgradePreferences = require('./config/upgradePreferences'); import upgradePreferences from './config/upgradePreferences';
function loadDefault() { function loadDefault() {
return JSON.parse(JSON.stringify(defaultPreferences)); return JSON.parse(JSON.stringify(defaultPreferences));
@ -24,7 +24,7 @@ function upgrade(config) {
return upgradePreferences(config); return upgradePreferences(config);
} }
module.exports = { export default {
version: defaultPreferences.version, version: defaultPreferences.version,
upgrade, upgrade,

View file

@ -1,8 +1,9 @@
'use strict'; 'use strict';
const os = require('os'); import os from 'os';
const path = require('path'); import path from 'path';
import electron from 'electron';
const { const {
app, app,
Menu, Menu,
@ -12,15 +13,15 @@ const {
dialog, dialog,
systemPreferences, systemPreferences,
session, session,
} = require('electron'); } = electron;
const isDev = require('electron-is-dev'); import isDev from 'electron-is-dev';
const installExtension = require('electron-devtools-installer'); import installExtension, {REACT_DEVELOPER_TOOLS} from 'electron-devtools-installer';
const parseArgv = require('yargs').parse; import {parse as parseArgv} from 'yargs';
const protocols = require('../electron-builder.json').protocols; import {protocols} from '../electron-builder.json';
const squirrelStartup = require('./main/squirrelStartup'); import squirrelStartup from './main/squirrelStartup';
const CriticalErrorHandler = require('./main/CriticalErrorHandler'); import CriticalErrorHandler from './main/CriticalErrorHandler';
const criticalErrorHandler = new CriticalErrorHandler(); const criticalErrorHandler = new CriticalErrorHandler();
@ -32,19 +33,19 @@ app.setAppUserModelId('com.squirrel.mattermost.Mattermost'); // Use explicit App
if (squirrelStartup()) { if (squirrelStartup()) {
global.willAppQuit = true; 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'); import SpellChecker from './main/SpellChecker';
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');
const assetsDir = path.resolve(app.getAppPath(), 'assets'); const assetsDir = path.resolve(app.getAppPath(), 'assets');
@ -267,7 +268,7 @@ function handleScreenResize(screen, browserWindow) {
app.on('browser-window-created', (e, newWindow) => { app.on('browser-window-created', (e, newWindow) => {
// Screen cannot be required before app is ready // 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); handleScreenResize(screen, newWindow);
}); });
@ -403,7 +404,7 @@ app.on('ready', () => {
appState.lastAppVersion = app.getVersion(); appState.lastAppVersion = app.getVersion();
if (global.isDev) { if (global.isDev) {
installExtension.default(installExtension.REACT_DEVELOPER_TOOLS). installExtension(REACT_DEVELOPER_TOOLS).
then((name) => console.log(`Added Extension: ${name}`)). then((name) => console.log(`Added Extension: ${name}`)).
catch((err) => console.log('An error occurred: ', err)); catch((err) => console.log('An error occurred: ', err));
} }

View file

@ -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) { set lastAppVersion(version) {
this.setValue('lastAppVersion', version); this.setValue('lastAppVersion', version);
} }
@ -9,5 +9,3 @@ class AppStateManager extends JsonFileManager {
return this.getValue('lastAppVersion'); return this.getValue('lastAppVersion');
} }
} }
module.exports = AppStateManager;

View file

@ -1,9 +1,9 @@
const {spawn} = require('child_process'); import {spawn} from 'child_process';
const fs = require('fs'); import fs from 'fs';
const os = require('os'); import os from 'os';
const path = require('path'); import path from 'path';
const {app, dialog} = require('electron'); import {app, dialog} from 'electron';
const BUTTON_OK = 'OK'; const BUTTON_OK = 'OK';
const BUTTON_SHOW_DETAILS = 'Show Details'; const BUTTON_SHOW_DETAILS = 'Show Details';
@ -36,7 +36,7 @@ function bindWindowToShowMessageBox(win) {
return dialog.showMessageBox; return dialog.showMessageBox;
} }
class CriticalErrorHandler { export default class CriticalErrorHandler {
constructor() { constructor() {
this.mainWindow = null; this.mainWindow = null;
} }
@ -97,5 +97,3 @@ class CriticalErrorHandler {
throw err; throw err;
} }
} }
module.exports = CriticalErrorHandler;

View file

@ -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_GRANTED = 'granted';
const PERMISSION_DENIED = 'denied'; const PERMISSION_DENIED = 'denied';
class PermissionManager { export default class PermissionManager {
constructor(file, trustedURLs = []) { constructor(file, trustedURLs = []) {
this.file = file; this.file = file;
this.setTrustedURLs(trustedURLs); this.setTrustedURLs(trustedURLs);
@ -70,5 +70,3 @@ class PermissionManager {
} }
} }
} }
module.exports = PermissionManager;

View file

@ -1,8 +1,8 @@
'use strict'; '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. /// Following approach for contractions is derived from electron-spellchecker.
@ -28,7 +28,7 @@ const contractionMap = contractions.reduce((acc, word) => {
/// End: derived from electron-spellchecker. /// End: derived from electron-spellchecker.
class SpellChecker extends EventEmitter { export default class SpellChecker extends EventEmitter {
constructor(locale, dictDir, callback) { constructor(locale, dictDir, callback) {
super(); super();
this.dict = null; this.dict = null;
@ -89,5 +89,3 @@ SpellChecker.getSpellCheckerLocale = (electronLocale) => {
} }
return 'en-US'; return 'en-US';
}; };
module.exports = SpellChecker;

View file

@ -1,14 +1,9 @@
'use strict'; 'use strict';
const path = require('path'); import path from 'path';
const fs = require('fs'); import fs from 'fs';
const { import {app, dialog, ipcMain, shell} from 'electron';
app,
dialog,
ipcMain,
shell,
} = require('electron');
const allowedProtocolFile = path.resolve(app.getPath('userData'), 'allowedProtocols.json'); const allowedProtocolFile = path.resolve(app.getPath('userData'), 'allowedProtocols.json');
var allowedProtocols = []; var allowedProtocols = [];
@ -63,6 +58,6 @@ function initDialogEvent(mainWindow) {
}); });
} }
module.exports = { export default {
init, init,
}; };

View file

@ -1,7 +1,7 @@
'use strict'; 'use strict';
const fs = require('fs'); import fs from 'fs';
const url = require('url'); import url from 'url';
function comparableCertificate(certificate) { function comparableCertificate(certificate) {
return { return {
@ -60,7 +60,7 @@ CertificateStore.prototype.isTrusted = function isTrusted(targetURL, certificate
return areEqual(this.data[host], comparableCertificate(certificate)); return areEqual(this.data[host], comparableCertificate(certificate));
}; };
module.exports = { export default {
load(storeFile) { load(storeFile) {
return new CertificateStore(storeFile); return new CertificateStore(storeFile);
}, },

View file

@ -1,11 +1,11 @@
const fs = require('fs'); import fs from 'fs';
const path = require('path'); import path from 'path';
const zlib = require('zlib'); import zlib from 'zlib';
const electron = require('electron'); import electron from 'electron';
const {app, dialog} = electron; const {app, dialog} = electron;
function downloadURL(browserWindow, URL, callback) { export default function downloadURL(browserWindow, URL, callback) {
const {net} = electron; const {net} = electron;
const request = net.request(URL); const request = net.request(URL);
request.setHeader('Accept-Encoding', 'gzip,deflate'); request.setHeader('Accept-Encoding', 'gzip,deflate');
@ -49,5 +49,3 @@ function saveResponseBody(response, filename, callback) {
break; break;
} }
} }
module.exports = downloadURL;

View file

@ -1,7 +1,7 @@
const fs = require('fs'); import fs from 'fs';
const path = require('path'); import path from 'path';
const {app, BrowserWindow} = require('electron'); import {app, BrowserWindow} from 'electron';
function saveWindowState(file, window) { function saveWindowState(file, window) {
var windowState = window.getBounds(); var windowState = window.getBounds();
@ -135,4 +135,4 @@ function createMainWindow(config, options) {
return mainWindow; return mainWindow;
} }
module.exports = {createMainWindow}; export default createMainWindow;

View file

@ -1,20 +1,18 @@
'use strict'; 'use strict';
const electron = require('electron'); import {app, dialog, Menu, shell} from 'electron';
const settings = require('../../common/settings'); import settings from '../../common/settings';
const buildConfig = require('../../common/config/buildConfig'); import buildConfig from '../../common/config/buildConfig';
const Menu = electron.Menu;
function createTemplate(mainWindow, config, isDev) { 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 = { const separatorItem = {
type: 'separator', type: 'separator',
}; };
var appName = electron.app.getName(); var appName = app.getName();
var firstMenuName = (process.platform === 'darwin') ? appName : 'File'; var firstMenuName = (process.platform === 'darwin') ? appName : 'File';
var template = []; var template = [];
@ -22,9 +20,9 @@ function createTemplate(mainWindow, config, isDev) {
label: 'About ' + appName, label: 'About ' + appName,
role: 'about', role: 'about',
click() { click() {
electron.dialog.showMessageBox(mainWindow, { dialog.showMessageBox(mainWindow, {
buttons: ['OK'], buttons: ['OK'],
message: `${appName} Desktop ${electron.app.getVersion()}`, message: `${appName} Desktop ${app.getVersion()}`,
}); });
}, },
}, separatorItem, { }, separatorItem, {
@ -64,7 +62,7 @@ function createTemplate(mainWindow, config, isDev) {
role: 'quit', role: 'quit',
accelerator: 'CmdOrCtrl+Q', accelerator: 'CmdOrCtrl+Q',
click() { click() {
electron.app.quit(); app.quit();
}, },
}] }]
); );
@ -215,13 +213,13 @@ function createTemplate(mainWindow, config, isDev) {
submenu.push({ submenu.push({
label: 'Learn More...', label: 'Learn More...',
click() { click() {
electron.shell.openExternal(buildConfig.helpLink); shell.openExternal(buildConfig.helpLink);
}, },
}); });
submenu.push(separatorItem); submenu.push(separatorItem);
} }
submenu.push({ submenu.push({
label: `Version ${electron.app.getVersion()}`, label: `Version ${app.getVersion()}`,
enabled: false, enabled: false,
}); });
template.push({label: '&Help', submenu}); template.push({label: '&Help', submenu});
@ -232,6 +230,6 @@ function createMenu(mainWindow, config, isDev) {
return Menu.buildFromTemplate(createTemplate(mainWindow, config, isDev)); return Menu.buildFromTemplate(createTemplate(mainWindow, config, isDev));
} }
module.exports = { export default {
createMenu, createMenu,
}; };

View file

@ -1,11 +1,8 @@
'use strict'; 'use strict';
const { import {app, Menu} from 'electron';
app,
Menu,
} = require('electron');
const settings = require('../../common/settings'); import settings from '../../common/settings';
function createTemplate(mainWindow, config, isDev) { function createTemplate(mainWindow, config, isDev) {
const settingsURL = isDev ? 'http://localhost:8080/browser/settings.html' : `file://${app.getAppPath()}/browser/settings.html`; 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, createMenu,
}; };

View file

@ -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) { function dequeueRequests(requestQueue, permissionManager, origin, permission, status) {
switch (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 = []; const requestQueue = [];
ipcMain.on('update-permission', (event, origin, permission, status) => { ipcMain.on('update-permission', (event, origin, permission, status) => {
dequeueRequests(requestQueue, permissionManager, 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); mainWindow.webContents.send('request-permission', targetURL.origin, permission);
}; };
} }
module.exports = permissionRequestHandler;

View file

@ -1,5 +1,5 @@
const AutoLaunch = require('auto-launch'); import AutoLaunch from 'auto-launch';
const {app} = require('electron'); import {app} from 'electron';
function shouldQuitApp(cmd) { function shouldQuitApp(cmd) {
if (process.platform !== 'win32') { if (process.platform !== 'win32') {
@ -26,7 +26,7 @@ async function setupAutoLaunch(cmd) {
return async () => true; return async () => true;
} }
function squirrelStartup() { export default function squirrelStartup() {
if (process.platform === 'win32') { if (process.platform === 'win32') {
const cmd = process.argv[1]; const cmd = process.argv[1];
setupAutoLaunch(cmd).then(() => { setupAutoLaunch(cmd).then(() => {
@ -36,5 +36,3 @@ function squirrelStartup() {
} }
return false; return false;
} }
module.exports = squirrelStartup;

View file

@ -1,8 +1,8 @@
const url = require('url'); import url from 'url';
function getDomain(inputURL) { function getDomain(inputURL) {
const parsedURL = url.parse(inputURL); const parsedURL = url.parse(inputURL);
return `${parsedURL.protocol}//${parsedURL.host}`; return `${parsedURL.protocol}//${parsedURL.host}`;
} }
module.exports = {getDomain}; export default {getDomain};

View file

@ -6,6 +6,7 @@
"open_window": true "open_window": true
}, },
"rules": { "rules": {
"import/no-commonjs": 0,
"func-names": 0, "func-names": 0,
"global-require": 0, "global-require": 0,
"max-nested-callbacks": 0, "max-nested-callbacks": 0,