Indent with tabs!

This commit is contained in:
Timothy Warren 2017-04-06 15:23:47 -04:00
parent cc1ca7f645
commit ee50422200
24 changed files with 1036 additions and 886 deletions

View File

@ -8,11 +8,11 @@ trim_trailing_whitespace = true
insert_final_newline = true insert_final_newline = true
[*.{json,js,jsx,html,css}] [*.{json,js,jsx,html,css}]
indent_style = space indent_style = tab
indent_size = 2 indent_size = 2
[.eslintrc] [.eslintrc]
indent_style = space indent_style = tab
indent_size = 2 indent_size = 2
[*.md] [*.md]

110
.eslintrc
View File

@ -1,43 +1,71 @@
{ {
"parser": "babel-eslint", "parser": "babel-eslint",
"extends": "airbnb", "extends": "airbnb",
"env": { "env": {
"browser": true, "browser": true,
"node": true "node": true
}, },
"rules": { "rules": {
"arrow-parens": ["off"], "arrow-parens": [
"compat/compat": "error", "off"
"consistent-return": "off", ],
"comma-dangle": "off", "compat/compat": "error",
"generator-star-spacing": "off", "consistent-return": "off",
"import/no-unresolved": "error", "comma-dangle": "off",
"import/no-extraneous-dependencies": "off", "generator-star-spacing": "off",
"no-console": "off", "import/no-unresolved": "error",
"no-use-before-define": "off", "import/no-extraneous-dependencies": "off",
"no-multi-assign": "off", "indent": [
"promise/param-names": "error", "error",
"promise/always-return": "error", "tab"
"promise/catch-or-return": "error", ],
"promise/no-native": "off", "no-console": "off",
"react/sort-comp": ["error", { "no-tabs": "off",
"order": ["type-annotations", "static-methods", "lifecycle", "everything-else", "render"] "no-use-before-define": "off",
}], "no-multi-assign": "off",
"react/prop-types": "off", "promise/param-names": "error",
"react/jsx-filename-extension": ["error", { "extensions": [".js", ".jsx"] }], "promise/always-return": "error",
"react/prefer-stateless-function": "off" "promise/catch-or-return": "error",
}, "promise/no-native": "off",
"plugins": [ "react/sort-comp": [
"import", "error",
"promise", {
"compat", "order": [
"react" "type-annotations",
], "static-methods",
"settings": { "lifecycle",
"import/resolver": { "everything-else",
"webpack": { "render"
"config": "webpack.config.eslint.js" ]
} }
} ],
} "react/prop-types": "off",
"react/jsx-indent": [
2,
'tab'
],
"react/jsx-filename-extension": [
"error",
{
"extensions": [
".js",
".jsx"
]
}
],
"react/prefer-stateless-function": "off"
},
"plugins": [
"import",
"promise",
"compat",
"react"
],
"settings": {
"import/resolver": {
"webpack": {
"config": "webpack.config.eslint.js"
}
}
}
} }

View File

@ -1,4 +0,0 @@
{
"rules": {
}
}

View File

@ -1,12 +1,12 @@
import React, { Component } from 'react'; import React, { Component } from 'react';
export default class Home extends Component { export default class Home extends Component {
render() { render() {
return ( return (
<div> <div>
<h1>Home</h1> <h1>Home</h1>
<h3>...is where the heart is</h3> <h3>...is where the heart is</h3>
</div> </div>
); );
} }
} }

View File

@ -1,19 +1,19 @@
import React, { PureComponent } from 'react'; import React, { PureComponent } from 'react';
export default class App extends PureComponent { export default class App extends PureComponent {
render() { render() {
return ( return (
<div className="window"> <div className="window">
<header className="toolbar toolbar-header"> <header className="toolbar toolbar-header">
<h1 className="title">Header</h1> <h1 className="title">Header</h1>
</header> </header>
<main className="window-content"> <main className="window-content">
{this.props.children} {this.props.children}
</main> </main>
<footer className="toolbar toolbar-footer"> <footer className="toolbar toolbar-footer">
<h1 className="title">Footer</h1> <h1 className="title">Footer</h1>
</footer> </footer>
</div> </div>
); );
} }
} }

View File

@ -2,9 +2,9 @@ import React, { Component } from 'react';
import Home from '../components/Home'; import Home from '../components/Home';
export default class HomePage extends Component { export default class HomePage extends Component {
render() { render() {
return ( return (
<Home /> <Home />
); );
} }
} }

View File

@ -4,9 +4,9 @@ import { Router } from 'react-router';
import routes from '../routes'; import routes from '../routes';
export default function Root({ store, history }) { export default function Root({ store, history }) {
return ( return (
<Provider store={store}> <Provider store={store}>
<Router key={Math.random()} history={history} routes={routes} /> <Router key={Math.random()} history={history} routes={routes} />
</Provider> </Provider>
); );
} }

View File

@ -11,20 +11,20 @@ const store = configureStore();
const history = syncHistoryWithStore(hashHistory, store); const history = syncHistoryWithStore(hashHistory, store);
render( render(
<AppContainer> <AppContainer>
<Root store={store} history={history} /> <Root store={store} history={history} />
</AppContainer>, </AppContainer>,
document.getElementById('root') document.getElementById('root')
); );
if (module.hot) { if (module.hot) {
module.hot.accept('./containers/Root', () => { module.hot.accept('./containers/Root', () => {
const NextRoot = require('./containers/Root'); // eslint-disable-line global-require const NextRoot = require('./containers/Root'); // eslint-disable-line global-require
render( render(
<AppContainer> <AppContainer>
<NextRoot store={store} history={history} /> <NextRoot store={store} history={history} />
</AppContainer>, </AppContainer>,
document.getElementById('root') document.getElementById('root')
); );
}); });
} }

View File

@ -5,26 +5,26 @@ import MenuBuilder from './menu';
let mainWindow = null; let mainWindow = null;
if (process.env.NODE_ENV === 'production') { if (process.env.NODE_ENV === 'production') {
const sourceMapSupport = require('source-map-support'); const sourceMapSupport = require('source-map-support');
sourceMapSupport.install(); sourceMapSupport.install();
} }
if (process.env.NODE_ENV === 'development') { if (process.env.NODE_ENV === 'development') {
require('electron-debug')(); require('electron-debug')();
const path = require('path'); const path = require('path');
const p = path.join(__dirname, '..', 'app', 'node_modules'); const p = path.join(__dirname, '..', 'app', 'node_modules');
require('module').globalPaths.push(p); require('module').globalPaths.push(p);
} }
const installExtensions = async () => { const installExtensions = async () => {
const installer = require('electron-devtools-installer'); const installer = require('electron-devtools-installer');
const forceDownload = !!process.env.UPGRADE_EXTENSIONS; const forceDownload = !!process.env.UPGRADE_EXTENSIONS;
const extensions = [ const extensions = [
'REACT_DEVELOPER_TOOLS', 'REACT_DEVELOPER_TOOLS',
'REDUX_DEVTOOLS' 'REDUX_DEVTOOLS'
]; ];
return Promise return Promise
.all(extensions.map(name => installer.default(installer[name], forceDownload))) .all(extensions.map(name => installer.default(installer[name], forceDownload)))
.catch(console.log); .catch(console.log);
}; };
@ -33,39 +33,39 @@ const installExtensions = async () => {
app.on('window-all-closed', () => { app.on('window-all-closed', () => {
// Respect the OSX convention of having the application in memory even // Respect the OSX convention of having the application in memory even
// after all windows have been closed // after all windows have been closed
if (process.platform !== 'darwin') { if (process.platform !== 'darwin') {
app.quit(); app.quit();
} }
}); });
app.on('ready', async () => { app.on('ready', async () => {
if (process.env.NODE_ENV === 'development') { if (process.env.NODE_ENV === 'development') {
await installExtensions(); await installExtensions();
} }
mainWindow = new BrowserWindow({ mainWindow = new BrowserWindow({
show: false, show: false,
width: 1024, width: 1024,
height: 728 height: 728
}); });
mainWindow.loadURL(`file://${__dirname}/app.html`); mainWindow.loadURL(`file://${__dirname}/app.html`);
// @TODO: Use 'ready-to-show' event // @TODO: Use 'ready-to-show' event
// https://github.com/electron/electron/blob/master/docs/api/browser-window.md#using-ready-to-show-event // https://github.com/electron/electron/blob/master/docs/api/browser-window.md#using-ready-to-show-event
mainWindow.webContents.on('did-finish-load', () => { mainWindow.webContents.on('did-finish-load', () => {
if (!mainWindow) { if (!mainWindow) {
throw new Error('"mainWindow" is not defined'); throw new Error('"mainWindow" is not defined');
} }
mainWindow.show(); mainWindow.show();
mainWindow.focus(); mainWindow.focus();
}); });
mainWindow.on('closed', () => { mainWindow.on('closed', () => {
mainWindow = null; mainWindow = null;
}); });
const menuBuilder = new MenuBuilder(mainWindow); const menuBuilder = new MenuBuilder(mainWindow);
menuBuilder.buildMenu(); menuBuilder.buildMenu();
}); });

View File

@ -1,51 +1,51 @@
import { app, Menu, shell, BrowserWindow } from 'electron'; import { app, Menu, shell, BrowserWindow } from 'electron';
export default class MenuBuilder { export default class MenuBuilder {
mainWindow: BrowserWindow; mainWindow: BrowserWindow;
constructor(mainWindow: BrowserWindow) { constructor(mainWindow: BrowserWindow) {
this.mainWindow = mainWindow; this.mainWindow = mainWindow;
} }
buildMenu() { buildMenu() {
if (process.env.NODE_ENV === 'development') { if (process.env.NODE_ENV === 'development') {
this.setupDevelopmentEnvironment(); this.setupDevelopmentEnvironment();
} }
let template; let template;
if (process.platform === 'darwin') { if (process.platform === 'darwin') {
template = this.buildDarwinTemplate(); template = this.buildDarwinTemplate();
} else { } else {
template = this.buildDefaultTemplate(); template = this.buildDefaultTemplate();
} }
const menu = Menu.buildFromTemplate(template); const menu = Menu.buildFromTemplate(template);
Menu.setApplicationMenu(menu); Menu.setApplicationMenu(menu);
return menu; return menu;
} }
setupDevelopmentEnvironment() { setupDevelopmentEnvironment() {
this.mainWindow.openDevTools(); this.mainWindow.openDevTools();
this.mainWindow.webContents.on('context-menu', (e, props) => { this.mainWindow.webContents.on('context-menu', (e, props) => {
const { x, y } = props; const { x, y } = props;
Menu Menu
.buildFromTemplate([{ .buildFromTemplate([{
label: 'Inspect element', label: 'Inspect element',
click: () => { click: () => {
this.mainWindow.inspectElement(x, y); this.mainWindow.inspectElement(x, y);
} }
}]) }])
.popup(this.mainWindow); .popup(this.mainWindow);
}); });
} }
buildDarwinTemplate() { buildDarwinTemplate() {
const subMenuAbout = { const subMenuAbout = {
label: 'Electron', label: 'Electron',
submenu: [ submenu: [
{ label: 'About ElectronReact', selector: 'orderFrontStandardAboutPanel:' }, { label: 'About ElectronReact', selector: 'orderFrontStandardAboutPanel:' },
{ type: 'separator' }, { type: 'separator' },
{ label: 'Services', submenu: [] }, { label: 'Services', submenu: [] },
@ -55,11 +55,11 @@ export default class MenuBuilder {
{ label: 'Show All', selector: 'unhideAllApplications:' }, { label: 'Show All', selector: 'unhideAllApplications:' },
{ type: 'separator' }, { type: 'separator' },
{ label: 'Quit', accelerator: 'Command+Q', click: () => { app.quit(); } } { label: 'Quit', accelerator: 'Command+Q', click: () => { app.quit(); } }
] ]
}; };
const subMenuEdit = { const subMenuEdit = {
label: 'Edit', label: 'Edit',
submenu: [ submenu: [
{ label: 'Undo', accelerator: 'Command+Z', selector: 'undo:' }, { label: 'Undo', accelerator: 'Command+Z', selector: 'undo:' },
{ label: 'Redo', accelerator: 'Shift+Command+Z', selector: 'redo:' }, { label: 'Redo', accelerator: 'Shift+Command+Z', selector: 'redo:' },
{ type: 'separator' }, { type: 'separator' },
@ -67,119 +67,119 @@ export default class MenuBuilder {
{ label: 'Copy', accelerator: 'Command+C', selector: 'copy:' }, { label: 'Copy', accelerator: 'Command+C', selector: 'copy:' },
{ label: 'Paste', accelerator: 'Command+V', selector: 'paste:' }, { label: 'Paste', accelerator: 'Command+V', selector: 'paste:' },
{ label: 'Select All', accelerator: 'Command+A', selector: 'selectAll:' } { label: 'Select All', accelerator: 'Command+A', selector: 'selectAll:' }
] ]
}; };
const subMenuViewDev = { const subMenuViewDev = {
label: 'View', label: 'View',
submenu: [ submenu: [
{ label: 'Reload', accelerator: 'Command+R', click: () => { this.mainWindow.webContents.reload(); } }, { label: 'Reload', accelerator: 'Command+R', click: () => { this.mainWindow.webContents.reload(); } },
{ label: 'Toggle Full Screen', accelerator: 'Ctrl+Command+F', click: () => { this.mainWindow.setFullScreen(!this.mainWindow.isFullScreen()); } }, { label: 'Toggle Full Screen', accelerator: 'Ctrl+Command+F', click: () => { this.mainWindow.setFullScreen(!this.mainWindow.isFullScreen()); } },
{ label: 'Toggle Developer Tools', accelerator: 'Alt+Command+I', click: () => { this.mainWindow.toggleDevTools(); } } { label: 'Toggle Developer Tools', accelerator: 'Alt+Command+I', click: () => { this.mainWindow.toggleDevTools(); } }
] ]
}; };
const subMenuViewProd = { const subMenuViewProd = {
label: 'View', label: 'View',
submenu: [ submenu: [
{ label: 'Toggle Full Screen', accelerator: 'Ctrl+Command+F', click: () => { this.mainWindow.setFullScreen(!this.mainWindow.isFullScreen()); } } { label: 'Toggle Full Screen', accelerator: 'Ctrl+Command+F', click: () => { this.mainWindow.setFullScreen(!this.mainWindow.isFullScreen()); } }
] ]
}; };
const subMenuWindow = { const subMenuWindow = {
label: 'Window', label: 'Window',
submenu: [ submenu: [
{ label: 'Minimize', accelerator: 'Command+M', selector: 'performMiniaturize:' }, { label: 'Minimize', accelerator: 'Command+M', selector: 'performMiniaturize:' },
{ label: 'Close', accelerator: 'Command+W', selector: 'performClose:' }, { label: 'Close', accelerator: 'Command+W', selector: 'performClose:' },
{ type: 'separator' }, { type: 'separator' },
{ label: 'Bring All to Front', selector: 'arrangeInFront:' } { label: 'Bring All to Front', selector: 'arrangeInFront:' }
] ]
}; };
const subMenuHelp = { const subMenuHelp = {
label: 'Help', label: 'Help',
submenu: [ submenu: [
{ label: 'Learn More', click() { shell.openExternal('http://electron.atom.io'); } }, { label: 'Learn More', click() { shell.openExternal('http://electron.atom.io'); } },
{ label: 'Documentation', click() { shell.openExternal('https://github.com/atom/electron/tree/master/docs#readme'); } }, { label: 'Documentation', click() { shell.openExternal('https://github.com/atom/electron/tree/master/docs#readme'); } },
{ label: 'Community Discussions', click() { shell.openExternal('https://discuss.atom.io/c/electron'); } }, { label: 'Community Discussions', click() { shell.openExternal('https://discuss.atom.io/c/electron'); } },
{ label: 'Search Issues', click() { shell.openExternal('https://github.com/atom/electron/issues'); } } { label: 'Search Issues', click() { shell.openExternal('https://github.com/atom/electron/issues'); } }
] ]
}; };
const subMenuView = process.env.NODE_ENV === 'development' const subMenuView = process.env.NODE_ENV === 'development'
? subMenuViewDev ? subMenuViewDev
: subMenuViewProd; : subMenuViewProd;
return [ return [
subMenuAbout, subMenuAbout,
subMenuEdit, subMenuEdit,
subMenuView, subMenuView,
subMenuWindow, subMenuWindow,
subMenuHelp subMenuHelp
]; ];
} }
buildDefaultTemplate() { buildDefaultTemplate() {
const templateDefault = [{ const templateDefault = [{
label: '&File', label: '&File',
submenu: [{ submenu: [{
label: '&Open', label: '&Open',
accelerator: 'Ctrl+O' accelerator: 'Ctrl+O'
}, { }, {
label: '&Close', label: '&Close',
accelerator: 'Ctrl+W', accelerator: 'Ctrl+W',
click: () => { click: () => {
this.mainWindow.close(); this.mainWindow.close();
} }
}] }]
}, { }, {
label: '&View', label: '&View',
submenu: (process.env.NODE_ENV === 'development') ? [{ submenu: (process.env.NODE_ENV === 'development') ? [{
label: '&Reload', label: '&Reload',
accelerator: 'Ctrl+R', accelerator: 'Ctrl+R',
click: () => { click: () => {
this.mainWindow.webContents.reload(); this.mainWindow.webContents.reload();
} }
}, { }, {
label: 'Toggle &Full Screen', label: 'Toggle &Full Screen',
accelerator: 'F11', accelerator: 'F11',
click: () => { click: () => {
this.mainWindow.setFullScreen(!this.mainWindow.isFullScreen()); this.mainWindow.setFullScreen(!this.mainWindow.isFullScreen());
} }
}, { }, {
label: 'Toggle &Developer Tools', label: 'Toggle &Developer Tools',
accelerator: 'Alt+Ctrl+I', accelerator: 'Alt+Ctrl+I',
click: () => { click: () => {
this.mainWindow.toggleDevTools(); this.mainWindow.toggleDevTools();
} }
}] : [{ }] : [{
label: 'Toggle &Full Screen', label: 'Toggle &Full Screen',
accelerator: 'F11', accelerator: 'F11',
click: () => { click: () => {
this.mainWindow.setFullScreen(!this.mainWindow.isFullScreen()); this.mainWindow.setFullScreen(!this.mainWindow.isFullScreen());
} }
}] }]
}, { }, {
label: 'Help', label: 'Help',
submenu: [{ submenu: [{
label: 'Learn More', label: 'Learn More',
click() { click() {
shell.openExternal('http://electron.atom.io'); shell.openExternal('http://electron.atom.io');
} }
}, { }, {
label: 'Documentation', label: 'Documentation',
click() { click() {
shell.openExternal('https://github.com/atom/electron/tree/master/docs#readme'); shell.openExternal('https://github.com/atom/electron/tree/master/docs#readme');
} }
}, { }, {
label: 'Community Discussions', label: 'Community Discussions',
click() { click() {
shell.openExternal('https://discuss.atom.io/c/electron'); shell.openExternal('https://discuss.atom.io/c/electron');
} }
}, { }, {
label: 'Search Issues', label: 'Search Issues',
click() { click() {
shell.openExternal('https://github.com/atom/electron/issues'); shell.openExternal('https://github.com/atom/electron/issues');
} }
}] }]
}]; }];
return templateDefault; return templateDefault;
} }
} }

View File

@ -2,7 +2,7 @@ import { combineReducers } from 'redux';
import { routerReducer as routing } from 'react-router-redux'; import { routerReducer as routing } from 'react-router-redux';
const rootReducer = combineReducers({ const rootReducer = combineReducers({
routing routing
}); });
export default rootReducer; export default rootReducer;

View File

@ -5,7 +5,7 @@ import HomePage from './containers/HomePage';
export default ( export default (
<Route path="/" component={App}> <Route path="/" component={App}>
<IndexRoute component={HomePage} /> <IndexRoute component={HomePage} />
</Route> </Route>
); );

View File

@ -7,50 +7,50 @@ import rootReducer from '../reducers';
export default (initialState = {}) => { export default (initialState = {}) => {
// Redux Configuration // Redux Configuration
const middleware = []; const middleware = [];
const enhancers = []; const enhancers = [];
// Thunk Middleware // Thunk Middleware
middleware.push(thunk); middleware.push(thunk);
// Logging Middleware // Logging Middleware
const logger = createLogger({ const logger = createLogger({
level: 'info', level: 'info',
collapsed: true collapsed: true
}); });
middleware.push(logger); middleware.push(logger);
// Router Middleware // Router Middleware
const router = routerMiddleware(hashHistory); const router = routerMiddleware(hashHistory);
middleware.push(router); middleware.push(router);
// Redux DevTools Configuration // Redux DevTools Configuration
const actionCreators = { const actionCreators = {
push, push,
}; };
// If Redux DevTools Extension is installed use it, otherwise use Redux compose // If Redux DevTools Extension is installed use it, otherwise use Redux compose
/* eslint-disable no-underscore-dangle */ /* eslint-disable no-underscore-dangle */
const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__
? window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__({ ? window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__({
// Options: http://zalmoxisus.github.io/redux-devtools-extension/API/Arguments.html // Options: http://zalmoxisus.github.io/redux-devtools-extension/API/Arguments.html
actionCreators, actionCreators,
}) })
: compose; : compose;
/* eslint-enable no-underscore-dangle */ /* eslint-enable no-underscore-dangle */
// Apply Middleware & Compose Enhancers // Apply Middleware & Compose Enhancers
enhancers.push(applyMiddleware(...middleware)); enhancers.push(applyMiddleware(...middleware));
const enhancer = composeEnhancers(...enhancers); const enhancer = composeEnhancers(...enhancers);
// Create Store // Create Store
const store = createStore(rootReducer, initialState, enhancer); const store = createStore(rootReducer, initialState, enhancer);
if (module.hot) { if (module.hot) {
module.hot.accept('../reducers', () => module.hot.accept('../reducers', () =>
store.replaceReducer(require('../reducers')) // eslint-disable-line global-require store.replaceReducer(require('../reducers')) // eslint-disable-line global-require
); );
} }
return store; return store;
}; };

View File

@ -1,5 +1,5 @@
if (process.env.NODE_ENV === 'production') { if (process.env.NODE_ENV === 'production') {
module.exports = require('./configureStore.production'); // eslint-disable-line global-require module.exports = require('./configureStore.production'); // eslint-disable-line global-require
} else { } else {
module.exports = require('./configureStore.development'); // eslint-disable-line global-require module.exports = require('./configureStore.development'); // eslint-disable-line global-require
} }

View File

@ -150,6 +150,7 @@
"html-webpack-plugin": "^2.28.0", "html-webpack-plugin": "^2.28.0",
"identity-obj-proxy": "^3.0.0", "identity-obj-proxy": "^3.0.0",
"jest": "^19.0.2", "jest": "^19.0.2",
"jimp": "^0.2.27",
"jsdom": "^9.12.0", "jsdom": "^9.12.0",
"minimist": "^1.2.0", "minimist": "^1.2.0",
"node-sass": "^4.5.2", "node-sass": "^4.5.2",

View File

@ -12,7 +12,7 @@
module.exports = { module.exports = {
// remove the following files as they are mostly // remove the following files as they are mostly
// related to the sample counter page and functionality // related to the sample counter page and functionality
remove: [ remove: [
{ file: 'app/actions/counter.js' }, { file: 'app/actions/counter.js' },
{ file: 'app/components/Counter.css' }, { file: 'app/components/Counter.css' },
{ file: 'app/components/Counter.js' }, { file: 'app/components/Counter.js' },
@ -25,55 +25,55 @@ module.exports = {
{ file: 'test/reducers/counter.spec.js' }, { file: 'test/reducers/counter.spec.js' },
{ file: 'CHANGELOG.md' }, { file: 'CHANGELOG.md' },
{ file: 'erb-logo.png' } { file: 'erb-logo.png' }
], ],
// clean the following files by either clearing them // clean the following files by either clearing them
// (by specifying {clear: true}) or by removing lines // (by specifying {clear: true}) or by removing lines
// that match a regex pattern // that match a regex pattern
clean: [ clean: [
{ {
file: 'app/reducers/index.js', file: 'app/reducers/index.js',
pattern: /counter/ pattern: /counter/
}, },
{ {
file: 'app/store/configureStore.development.js', file: 'app/store/configureStore.development.js',
replace: [ replace: [
{ pattern: /\?: counterStateType/, substitute: '' }, { pattern: /\?: counterStateType/, substitute: '' },
{ pattern: /^.*import type.*$/, substitute: '' }, { pattern: /^.*import type.*$/, substitute: '' },
{ pattern: /^.*counterActions.*$/, substitute: '' } { pattern: /^.*counterActions.*$/, substitute: '' }
] ]
}, },
{ {
file: 'app/store/configureStore.production.js', file: 'app/store/configureStore.production.js',
replace: [ replace: [
{ pattern: /\?: counterStateType/, substitute: '' }, { pattern: /\?: counterStateType/, substitute: '' },
{ pattern: /^.*import type.*$/, substitute: '' }, { pattern: /^.*import type.*$/, substitute: '' },
] ]
}, },
{ {
file: 'app/app.global.css', file: 'app/app.global.css',
clear: true clear: true
}, },
{ {
file: 'app/routes.js', file: 'app/routes.js',
pattern: /CounterPage/ pattern: /CounterPage/
}, },
{ {
file: 'README.md', file: 'README.md',
clear: true clear: true
}, },
{ {
file: 'app/components/Home.js', file: 'app/components/Home.js',
pattern: /(h2|Link to)/ pattern: /(h2|Link to)/
} }
], ],
// add the following files to the project, mostly // add the following files to the project, mostly
// related to .gitkeep for version control // related to .gitkeep for version control
add: [ add: [
{ file: 'app/actions/.gitkeep' }, { file: 'app/actions/.gitkeep' },
{ file: 'test/actions/.gitkeep' }, { file: 'test/actions/.gitkeep' },
{ file: 'test/components/.gitkeep' }, { file: 'test/components/.gitkeep' },
{ file: 'test/containers/.gitkeep' }, { file: 'test/containers/.gitkeep' },
{ file: 'test/reducers/.gitkeep' }, { file: 'test/reducers/.gitkeep' },
{ file: 'test/e2e/.gitkeep' } { file: 'test/e2e/.gitkeep' }
] ]
}; };

View File

@ -1,7 +1,7 @@
/* eslint-disable func-names */ /* eslint-disable func-names */
describe('description', () => { describe('description', () => {
it('should have description', () => { it('should have description', () => {
expect(1 + 2).toBe(3); expect(1 + 2).toBe(3);
}); });
}); });

View File

@ -4,13 +4,13 @@ global.document = jsdom('<!doctype html><html><body></body></html>');
global.window = document.defaultView; global.window = document.defaultView;
global.navigator = global.window.navigator; global.navigator = global.window.navigator;
window.localStorage = window.sessionStorage = { window.localStorage = window.sessionStorage = {
getItem(key) { getItem(key) {
return this[key]; return this[key];
}, },
setItem(key, value) { setItem(key, value) {
this[key] = value; this[key] = value;
}, },
removeItem(key) { removeItem(key) {
this[key] = undefined; this[key] = undefined;
}, },
}; };

View File

@ -7,40 +7,40 @@ import webpack from 'webpack';
import { dependencies as externals } from './app/package.json'; import { dependencies as externals } from './app/package.json';
export default { export default {
externals: Object.keys(externals || {}), externals: Object.keys(externals || {}),
module: { module: {
rules: [{ rules: [{
test: /\.jsx?$/, test: /\.jsx?$/,
exclude: /node_modules/, exclude: /node_modules/,
use: { use: {
loader: 'babel-loader', loader: 'babel-loader',
options: { options: {
cacheDirectory: true cacheDirectory: true
} }
} }
}] }]
}, },
output: { output: {
path: path.join(__dirname, 'app'), path: path.join(__dirname, 'app'),
filename: 'bundle.js', filename: 'bundle.js',
// https://github.com/webpack/webpack/issues/1114 // https://github.com/webpack/webpack/issues/1114
libraryTarget: 'commonjs2' libraryTarget: 'commonjs2'
}, },
/** /**
* Determine the array of extensions that should be used to resolve modules. * Determine the array of extensions that should be used to resolve modules.
*/ */
resolve: { resolve: {
extensions: ['.js', '.jsx', '.json'], extensions: ['.js', '.jsx', '.json'],
modules: [ modules: [
path.join(__dirname, 'app'), path.join(__dirname, 'app'),
'node_modules', 'node_modules',
], ],
}, },
plugins: [ plugins: [
new webpack.NamedModulesPlugin(), new webpack.NamedModulesPlugin(),
], ],
}; };

View File

@ -8,23 +8,23 @@ import BabiliPlugin from 'babili-webpack-plugin';
import baseConfig from './webpack.config.base'; import baseConfig from './webpack.config.base';
export default merge.smart(baseConfig, { export default merge.smart(baseConfig, {
devtool: 'source-map', devtool: 'source-map',
target: 'electron-main', target: 'electron-main',
entry: ['babel-polyfill', './app/main.development'], entry: ['babel-polyfill', './app/main.development'],
// 'main.js' in root // 'main.js' in root
output: { output: {
path: __dirname, path: __dirname,
filename: './app/main.js' filename: './app/main.js'
}, },
plugins: [ plugins: [
/** /**
* Babli is an ES6+ aware minifier based on the Babel toolchain (beta) * Babli is an ES6+ aware minifier based on the Babel toolchain (beta)
*/ */
new BabiliPlugin(), new BabiliPlugin(),
/** /**
* Create global constants which can be configured at compile time. * Create global constants which can be configured at compile time.
@ -35,18 +35,18 @@ export default merge.smart(baseConfig, {
* NODE_ENV should be production so that modules do not perform certain * NODE_ENV should be production so that modules do not perform certain
* development checks * development checks
*/ */
new webpack.DefinePlugin({ new webpack.DefinePlugin({
'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV || 'production') 'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV || 'production')
}) })
], ],
/** /**
* Disables webpack processing of __dirname and __filename. * Disables webpack processing of __dirname and __filename.
* If you run the bundle in node.js it falls back to these values of node.js. * If you run the bundle in node.js it falls back to these values of node.js.
* https://github.com/webpack/webpack/issues/2010 * https://github.com/webpack/webpack/issues/2010
*/ */
node: { node: {
__dirname: false, __dirname: false,
__filename: false __filename: false
}, },
}); });

View File

@ -11,174 +11,174 @@ import { dependencies } from './package.json';
const dist = path.resolve(process.cwd(), 'dll'); const dist = path.resolve(process.cwd(), 'dll');
export default merge.smart(baseConfig, { export default merge.smart(baseConfig, {
context: process.cwd(), context: process.cwd(),
devtool: 'eval', devtool: 'eval',
target: 'electron-renderer', target: 'electron-renderer',
externals: ['fsevents', 'crypto-browserify'], externals: ['fsevents', 'crypto-browserify'],
/** /**
* @HACK: Copy and pasted from renderer dev config. Consider merging these * @HACK: Copy and pasted from renderer dev config. Consider merging these
* rules into the base config. May cause breaking changes. * rules into the base config. May cause breaking changes.
*/ */
module: { module: {
rules: [ rules: [
{ {
test: /\.global\.css$/, test: /\.global\.css$/,
use: [ use: [
{ {
loader: 'style-loader' loader: 'style-loader'
}, },
{ {
loader: 'css-loader', loader: 'css-loader',
options: { options: {
sourceMap: true, sourceMap: true,
}, },
} }
] ]
}, },
{ {
test: /^((?!\.global).)*\.css$/, test: /^((?!\.global).)*\.css$/,
use: [ use: [
{ {
loader: 'style-loader' loader: 'style-loader'
}, },
{ {
loader: 'css-loader', loader: 'css-loader',
options: { options: {
modules: true, modules: true,
sourceMap: true, sourceMap: true,
importLoaders: 1, importLoaders: 1,
localIdentName: '[name]__[local]__[hash:base64:5]', localIdentName: '[name]__[local]__[hash:base64:5]',
} }
}, },
] ]
}, },
// Add SASS support - compile all .global.scss files and pipe it to style.css // Add SASS support - compile all .global.scss files and pipe it to style.css
{ {
test: /\.global\.scss$/, test: /\.global\.scss$/,
use: [ use: [
{ {
loader: 'style-loader' loader: 'style-loader'
}, },
{ {
loader: 'css-loader', loader: 'css-loader',
options: { options: {
sourceMap: true, sourceMap: true,
}, },
}, },
{ {
loader: 'sass-loader' loader: 'sass-loader'
} }
] ]
}, },
// Add SASS support - compile all other .scss files and pipe it to style.css // Add SASS support - compile all other .scss files and pipe it to style.css
{ {
test: /^((?!\.global).)*\.scss$/, test: /^((?!\.global).)*\.scss$/,
use: [ use: [
{ {
loader: 'style-loader' loader: 'style-loader'
}, },
{ {
loader: 'css-loader', loader: 'css-loader',
options: { options: {
modules: true, modules: true,
sourceMap: true, sourceMap: true,
importLoaders: 1, importLoaders: 1,
localIdentName: '[name]__[local]__[hash:base64:5]', localIdentName: '[name]__[local]__[hash:base64:5]',
} }
}, },
{ {
loader: 'sass-loader' loader: 'sass-loader'
} }
] ]
}, },
// WOFF Font // WOFF Font
{ {
test: /\.woff(\?v=\d+\.\d+\.\d+)?$/, test: /\.woff(\?v=\d+\.\d+\.\d+)?$/,
use: { use: {
loader: 'url-loader', loader: 'url-loader',
options: { options: {
limit: 10000, limit: 10000,
mimetype: 'application/font-woff', mimetype: 'application/font-woff',
} }
}, },
}, },
// WOFF2 Font // WOFF2 Font
{ {
test: /\.woff2(\?v=\d+\.\d+\.\d+)?$/, test: /\.woff2(\?v=\d+\.\d+\.\d+)?$/,
use: { use: {
loader: 'url-loader', loader: 'url-loader',
options: { options: {
limit: 10000, limit: 10000,
mimetype: 'application/font-woff', mimetype: 'application/font-woff',
} }
} }
}, },
// TTF Font // TTF Font
{ {
test: /\.ttf(\?v=\d+\.\d+\.\d+)?$/, test: /\.ttf(\?v=\d+\.\d+\.\d+)?$/,
use: { use: {
loader: 'url-loader', loader: 'url-loader',
options: { options: {
limit: 10000, limit: 10000,
mimetype: 'application/octet-stream' mimetype: 'application/octet-stream'
} }
} }
}, },
// EOT Font // EOT Font
{ {
test: /\.eot(\?v=\d+\.\d+\.\d+)?$/, test: /\.eot(\?v=\d+\.\d+\.\d+)?$/,
use: 'file-loader', use: 'file-loader',
}, },
// SVG Font // SVG Font
{ {
test: /\.svg(\?v=\d+\.\d+\.\d+)?$/, test: /\.svg(\?v=\d+\.\d+\.\d+)?$/,
use: { use: {
loader: 'url-loader', loader: 'url-loader',
options: { options: {
limit: 10000, limit: 10000,
mimetype: 'image/svg+xml', mimetype: 'image/svg+xml',
} }
} }
}, },
// Common Image Formats // Common Image Formats
{ {
test: /\.(?:ico|gif|png|jpg|jpeg|webp)$/, test: /\.(?:ico|gif|png|jpg|jpeg|webp)$/,
use: 'url-loader', use: 'url-loader',
} }
] ]
}, },
resolve: { resolve: {
modules: [ modules: [
'app', 'app',
'node_modules', 'node_modules',
], ],
}, },
entry: { entry: {
vendor: [ vendor: [
'babel-polyfill', 'babel-polyfill',
...Object.keys(dependencies) ...Object.keys(dependencies)
] ]
.filter(dependency => dependency !== 'font-awesome'), .filter(dependency => dependency !== 'font-awesome'),
}, },
output: { output: {
library: 'vendor', library: 'vendor',
path: dist, path: dist,
filename: '[name].dll.js', filename: '[name].dll.js',
libraryTarget: 'var' libraryTarget: 'var'
}, },
plugins: [ plugins: [
new webpack.DllPlugin({ new webpack.DllPlugin({
path: path.join(dist, '[name].json'), path: path.join(dist, '[name].json'),
name: '[name]', name: '[name]',
}), }),
/** /**
* Create global constants which can be configured at compile time. * Create global constants which can be configured at compile time.
@ -189,18 +189,18 @@ export default merge.smart(baseConfig, {
* NODE_ENV should be production so that modules do not perform certain * NODE_ENV should be production so that modules do not perform certain
* development checks * development checks
*/ */
new webpack.DefinePlugin({ new webpack.DefinePlugin({
'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV || 'development') 'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV || 'development')
}), }),
new webpack.LoaderOptionsPlugin({ new webpack.LoaderOptionsPlugin({
debug: true, debug: true,
options: { options: {
context: path.resolve(process.cwd(), 'app'), context: path.resolve(process.cwd(), 'app'),
output: { output: {
path: path.resolve(process.cwd(), 'dll'), path: path.resolve(process.cwd(), 'dll'),
}, },
}, },
}) })
], ],
}); });

View File

@ -25,172 +25,172 @@ const manifest = path.resolve(dll, 'vendor.json');
* Warn if the DLL is not built * Warn if the DLL is not built
*/ */
if (!(fs.existsSync(dll) && fs.existsSync(manifest))) { if (!(fs.existsSync(dll) && fs.existsSync(manifest))) {
console.log(chalk.black.bgYellow.bold( console.log(chalk.black.bgYellow.bold(
'The DLL files are missing. Sit back while we build them for you with "npm run build-dll"' 'The DLL files are missing. Sit back while we build them for you with "npm run build-dll"'
)); ));
execSync('npm run build-dll'); execSync('npm run build-dll');
} }
export default merge.smart(baseConfig, { export default merge.smart(baseConfig, {
devtool: 'inline-source-map', devtool: 'inline-source-map',
target: 'electron-renderer', target: 'electron-renderer',
entry: [ entry: [
'react-hot-loader/patch', 'react-hot-loader/patch',
`webpack-dev-server/client?http://localhost:${port}/`, `webpack-dev-server/client?http://localhost:${port}/`,
'webpack/hot/only-dev-server', 'webpack/hot/only-dev-server',
path.join(__dirname, 'app/index.js'), path.join(__dirname, 'app/index.js'),
], ],
output: { output: {
publicPath: `http://localhost:${port}/dist/` publicPath: `http://localhost:${port}/dist/`
}, },
module: { module: {
rules: [ rules: [
{ {
test: /\.global\.css$/, test: /\.global\.css$/,
use: [ use: [
{ {
loader: 'style-loader' loader: 'style-loader'
}, },
{ {
loader: 'css-loader', loader: 'css-loader',
options: { options: {
sourceMap: true, sourceMap: true,
}, },
} }
] ]
}, },
{ {
test: /^((?!\.global).)*\.css$/, test: /^((?!\.global).)*\.css$/,
use: [ use: [
{ {
loader: 'style-loader' loader: 'style-loader'
}, },
{ {
loader: 'css-loader', loader: 'css-loader',
options: { options: {
modules: true, modules: true,
sourceMap: true, sourceMap: true,
importLoaders: 1, importLoaders: 1,
localIdentName: '[name]__[local]__[hash:base64:5]', localIdentName: '[name]__[local]__[hash:base64:5]',
} }
}, },
] ]
}, },
// Add SASS support - compile all .global.scss files and pipe it to style.css // Add SASS support - compile all .global.scss files and pipe it to style.css
{ {
test: /\.global\.scss$/, test: /\.global\.scss$/,
use: [ use: [
{ {
loader: 'style-loader' loader: 'style-loader'
}, },
{ {
loader: 'css-loader', loader: 'css-loader',
options: { options: {
sourceMap: true, sourceMap: true,
}, },
}, },
{ {
loader: 'sass-loader' loader: 'sass-loader'
} }
] ]
}, },
// Add SASS support - compile all other .scss files and pipe it to style.css // Add SASS support - compile all other .scss files and pipe it to style.css
{ {
test: /^((?!\.global).)*\.scss$/, test: /^((?!\.global).)*\.scss$/,
use: [ use: [
{ {
loader: 'style-loader' loader: 'style-loader'
}, },
{ {
loader: 'css-loader', loader: 'css-loader',
options: { options: {
modules: true, modules: true,
sourceMap: true, sourceMap: true,
importLoaders: 1, importLoaders: 1,
localIdentName: '[name]__[local]__[hash:base64:5]', localIdentName: '[name]__[local]__[hash:base64:5]',
} }
}, },
{ {
loader: 'sass-loader' loader: 'sass-loader'
} }
] ]
}, },
// WOFF Font // WOFF Font
{ {
test: /\.woff(\?v=\d+\.\d+\.\d+)?$/, test: /\.woff(\?v=\d+\.\d+\.\d+)?$/,
use: { use: {
loader: 'url-loader', loader: 'url-loader',
options: { options: {
limit: 10000, limit: 10000,
mimetype: 'application/font-woff', mimetype: 'application/font-woff',
} }
}, },
}, },
// WOFF2 Font // WOFF2 Font
{ {
test: /\.woff2(\?v=\d+\.\d+\.\d+)?$/, test: /\.woff2(\?v=\d+\.\d+\.\d+)?$/,
use: { use: {
loader: 'url-loader', loader: 'url-loader',
options: { options: {
limit: 10000, limit: 10000,
mimetype: 'application/font-woff', mimetype: 'application/font-woff',
} }
} }
}, },
// TTF Font // TTF Font
{ {
test: /\.ttf(\?v=\d+\.\d+\.\d+)?$/, test: /\.ttf(\?v=\d+\.\d+\.\d+)?$/,
use: { use: {
loader: 'url-loader', loader: 'url-loader',
options: { options: {
limit: 10000, limit: 10000,
mimetype: 'application/octet-stream' mimetype: 'application/octet-stream'
} }
} }
}, },
// EOT Font // EOT Font
{ {
test: /\.eot(\?v=\d+\.\d+\.\d+)?$/, test: /\.eot(\?v=\d+\.\d+\.\d+)?$/,
use: 'file-loader', use: 'file-loader',
}, },
// SVG Font // SVG Font
{ {
test: /\.svg(\?v=\d+\.\d+\.\d+)?$/, test: /\.svg(\?v=\d+\.\d+\.\d+)?$/,
use: { use: {
loader: 'url-loader', loader: 'url-loader',
options: { options: {
limit: 10000, limit: 10000,
mimetype: 'image/svg+xml', mimetype: 'image/svg+xml',
} }
} }
}, },
// Common Image Formats // Common Image Formats
{ {
test: /\.(?:ico|gif|png|jpg|jpeg|webp)$/, test: /\.(?:ico|gif|png|jpg|jpeg|webp)$/,
use: 'url-loader', use: 'url-loader',
} }
] ]
}, },
plugins: [ plugins: [
new webpack.DllReferencePlugin({ new webpack.DllReferencePlugin({
context: process.cwd(), context: process.cwd(),
manifest: require(manifest), manifest: require(manifest),
sourceType: 'var', sourceType: 'var',
}), }),
/** /**
* https://webpack.js.org/concepts/hot-module-replacement/ * https://webpack.js.org/concepts/hot-module-replacement/
*/ */
new webpack.HotModuleReplacementPlugin({ new webpack.HotModuleReplacementPlugin({
multiStep: true multiStep: true
}), }),
new webpack.NoEmitOnErrorsPlugin(), new webpack.NoEmitOnErrorsPlugin(),
/** /**
* Create global constants which can be configured at compile time. * Create global constants which can be configured at compile time.
@ -204,48 +204,48 @@ export default merge.smart(baseConfig, {
* By default, use 'development' as NODE_ENV. This can be overriden with * By default, use 'development' as NODE_ENV. This can be overriden with
* 'staging', for example, by changing the ENV variables in the npm scripts * 'staging', for example, by changing the ENV variables in the npm scripts
*/ */
new webpack.DefinePlugin({ new webpack.DefinePlugin({
'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV || 'development') 'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV || 'development')
}), }),
new webpack.LoaderOptionsPlugin({ new webpack.LoaderOptionsPlugin({
debug: true debug: true
}), }),
new ExtractTextPlugin({ new ExtractTextPlugin({
filename: '[name].css' filename: '[name].css'
}) })
], ],
devServer: { devServer: {
port, port,
publicPath, publicPath,
compress: true, compress: true,
noInfo: true, noInfo: true,
stats: 'errors-only', stats: 'errors-only',
inline: true, inline: true,
lazy: false, lazy: false,
hot: true, hot: true,
headers: { 'Access-Control-Allow-Origin': '*' }, headers: { 'Access-Control-Allow-Origin': '*' },
contentBase: path.join(__dirname, 'dist'), contentBase: path.join(__dirname, 'dist'),
watchOptions: { watchOptions: {
aggregateTimeout: 300, aggregateTimeout: 300,
poll: 100 poll: 100
}, },
historyApiFallback: { historyApiFallback: {
verbose: true, verbose: true,
disableDotRule: false, disableDotRule: false,
}, },
setup() { setup() {
if (process.env.START_HOT) { if (process.env.START_HOT) {
spawn( spawn(
'npm', 'npm',
['run', 'start-hot-renderer'], ['run', 'start-hot-renderer'],
{ shell: true, env: process.env, stdio: 'inherit' } { shell: true, env: process.env, stdio: 'inherit' }
) )
.on('close', code => process.exit(code)) .on('close', code => process.exit(code))
.on('error', spawnError => console.error(spawnError)); .on('error', spawnError => console.error(spawnError));
} }
} }
}, },
}); });

View File

@ -11,131 +11,131 @@ import BabiliPlugin from 'babili-webpack-plugin';
import baseConfig from './webpack.config.base'; import baseConfig from './webpack.config.base';
export default merge.smart(baseConfig, { export default merge.smart(baseConfig, {
devtool: 'source-map', devtool: 'source-map',
target: 'electron-renderer', target: 'electron-renderer',
entry: ['babel-polyfill', './app/index'], entry: ['babel-polyfill', './app/index'],
output: { output: {
path: path.join(__dirname, 'app/dist'), path: path.join(__dirname, 'app/dist'),
publicPath: '../dist/' publicPath: '../dist/'
}, },
module: { module: {
rules: [ rules: [
// Extract all .global.css to style.css as is // Extract all .global.css to style.css as is
{ {
test: /\.global\.css$/, test: /\.global\.css$/,
use: ExtractTextPlugin.extract({ use: ExtractTextPlugin.extract({
use: 'css-loader', use: 'css-loader',
fallback: 'style-loader', fallback: 'style-loader',
}) })
}, },
// Pipe other styles through css modules and append to style.css // Pipe other styles through css modules and append to style.css
{ {
test: /^((?!\.global).)*\.css$/, test: /^((?!\.global).)*\.css$/,
use: ExtractTextPlugin.extract({ use: ExtractTextPlugin.extract({
use: { use: {
loader: 'css-loader', loader: 'css-loader',
options: { options: {
modules: true, modules: true,
importLoaders: 1, importLoaders: 1,
localIdentName: '[name]__[local]__[hash:base64:5]', localIdentName: '[name]__[local]__[hash:base64:5]',
} }
} }
}), }),
}, },
// Add SASS support - compile all .global.scss files and pipe it to style.css // Add SASS support - compile all .global.scss files and pipe it to style.css
{ {
test: /\.global\.scss$/, test: /\.global\.scss$/,
use: ExtractTextPlugin.extract({ use: ExtractTextPlugin.extract({
use: [ use: [
{ {
loader: 'css-loader' loader: 'css-loader'
}, },
{ {
loader: 'sass-loader' loader: 'sass-loader'
} }
], ],
fallback: 'style-loader', fallback: 'style-loader',
}) })
}, },
// Add SASS support - compile all other .scss files and pipe it to style.css // Add SASS support - compile all other .scss files and pipe it to style.css
{ {
test: /^((?!\.global).)*\.scss$/, test: /^((?!\.global).)*\.scss$/,
use: ExtractTextPlugin.extract({ use: ExtractTextPlugin.extract({
use: [{ use: [{
loader: 'css-loader', loader: 'css-loader',
options: { options: {
modules: true, modules: true,
importLoaders: 1, importLoaders: 1,
localIdentName: '[name]__[local]__[hash:base64:5]', localIdentName: '[name]__[local]__[hash:base64:5]',
} }
}, },
{ {
loader: 'sass-loader' loader: 'sass-loader'
}] }]
}), }),
}, },
// WOFF Font // WOFF Font
{ {
test: /\.woff(\?v=\d+\.\d+\.\d+)?$/, test: /\.woff(\?v=\d+\.\d+\.\d+)?$/,
use: { use: {
loader: 'url-loader', loader: 'url-loader',
options: { options: {
limit: 10000, limit: 10000,
mimetype: 'application/font-woff', mimetype: 'application/font-woff',
} }
}, },
}, },
// WOFF2 Font // WOFF2 Font
{ {
test: /\.woff2(\?v=\d+\.\d+\.\d+)?$/, test: /\.woff2(\?v=\d+\.\d+\.\d+)?$/,
use: { use: {
loader: 'url-loader', loader: 'url-loader',
options: { options: {
limit: 10000, limit: 10000,
mimetype: 'application/font-woff', mimetype: 'application/font-woff',
} }
} }
}, },
// TTF Font // TTF Font
{ {
test: /\.ttf(\?v=\d+\.\d+\.\d+)?$/, test: /\.ttf(\?v=\d+\.\d+\.\d+)?$/,
use: { use: {
loader: 'url-loader', loader: 'url-loader',
options: { options: {
limit: 10000, limit: 10000,
mimetype: 'application/octet-stream' mimetype: 'application/octet-stream'
} }
} }
}, },
// EOT Font // EOT Font
{ {
test: /\.eot(\?v=\d+\.\d+\.\d+)?$/, test: /\.eot(\?v=\d+\.\d+\.\d+)?$/,
use: 'file-loader', use: 'file-loader',
}, },
// SVG Font // SVG Font
{ {
test: /\.svg(\?v=\d+\.\d+\.\d+)?$/, test: /\.svg(\?v=\d+\.\d+\.\d+)?$/,
use: { use: {
loader: 'url-loader', loader: 'url-loader',
options: { options: {
limit: 10000, limit: 10000,
mimetype: 'image/svg+xml', mimetype: 'image/svg+xml',
} }
} }
}, },
// Common Image Formats // Common Image Formats
{ {
test: /\.(?:ico|gif|png|jpg|jpeg|webp)$/, test: /\.(?:ico|gif|png|jpg|jpeg|webp)$/,
use: 'url-loader', use: 'url-loader',
} }
] ]
}, },
plugins: [ plugins: [
/** /**
* Create global constants which can be configured at compile time. * Create global constants which can be configured at compile time.
* *
@ -145,24 +145,24 @@ export default merge.smart(baseConfig, {
* NODE_ENV should be production so that modules do not perform certain * NODE_ENV should be production so that modules do not perform certain
* development checks * development checks
*/ */
new webpack.DefinePlugin({ new webpack.DefinePlugin({
'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV || 'production') 'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV || 'production')
}), }),
/** /**
* Babli is an ES6+ aware minifier based on the Babel toolchain (beta) * Babli is an ES6+ aware minifier based on the Babel toolchain (beta)
*/ */
new BabiliPlugin(), new BabiliPlugin(),
new ExtractTextPlugin('style.css'), new ExtractTextPlugin('style.css'),
/** /**
* Dynamically generate index.html page * Dynamically generate index.html page
*/ */
new HtmlWebpackPlugin({ new HtmlWebpackPlugin({
filename: '../app.html', filename: '../app.html',
template: 'app/app.html', template: 'app/app.html',
inject: false inject: false
}) })
], ],
}); });

209
yarn.lock
View File

@ -397,7 +397,7 @@ babel-eslint@^7.2.1:
babel-types "^6.23.0" babel-types "^6.23.0"
babylon "^6.16.1" babylon "^6.16.1"
babel-generator@^6.18.0, babel-generator@^6.21.0, babel-generator@^6.24.0: babel-generator@^6.18.0, babel-generator@^6.24.0:
version "6.24.0" version "6.24.0"
resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.24.0.tgz#eba270a8cc4ce6e09a61be43465d7c62c1f87c56" resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.24.0.tgz#eba270a8cc4ce6e09a61be43465d7c62c1f87c56"
dependencies: dependencies:
@ -606,17 +606,6 @@ babel-plugin-dev-expression@^0.2.1:
version "0.2.1" version "0.2.1"
resolved "https://registry.yarnpkg.com/babel-plugin-dev-expression/-/babel-plugin-dev-expression-0.2.1.tgz#d4a7beefefbb50e3f2734990a82a2486cf9eb9ee" resolved "https://registry.yarnpkg.com/babel-plugin-dev-expression/-/babel-plugin-dev-expression-0.2.1.tgz#d4a7beefefbb50e3f2734990a82a2486cf9eb9ee"
babel-plugin-flow-runtime@^0.10.0:
version "0.10.0"
resolved "https://registry.yarnpkg.com/babel-plugin-flow-runtime/-/babel-plugin-flow-runtime-0.10.0.tgz#de60b8c64ce0eec6b13663a129d79ec46b97cb2d"
dependencies:
babel-generator "^6.21.0"
babel-traverse "^6.20.0"
babel-types "^6.16.0"
babylon "^6.16.1"
camelcase "^3.0.0"
flow-config-parser "^0.3.0"
babel-plugin-istanbul@^4.0.0: babel-plugin-istanbul@^4.0.0:
version "4.1.1" version "4.1.1"
resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.1.tgz#c12de0fc6fe42adfb16be56f1ad11e4a9782eca9" resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.1.tgz#c12de0fc6fe42adfb16be56f1ad11e4a9782eca9"
@ -1116,12 +1105,6 @@ babel-plugin-transform-remove-undefined@^0.0.5:
version "0.0.5" version "0.0.5"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-remove-undefined/-/babel-plugin-transform-remove-undefined-0.0.5.tgz#12ef11805e06e861dd2eb0c7cc041d2184b8f410" resolved "https://registry.yarnpkg.com/babel-plugin-transform-remove-undefined/-/babel-plugin-transform-remove-undefined-0.0.5.tgz#12ef11805e06e861dd2eb0c7cc041d2184b8f410"
babel-plugin-transform-runtime@^6.23.0:
version "6.23.0"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.23.0.tgz#88490d446502ea9b8e7efb0fe09ec4d99479b1ee"
dependencies:
babel-runtime "^6.22.0"
babel-plugin-transform-simplify-comparison-operators@^6.8.1: babel-plugin-transform-simplify-comparison-operators@^6.8.1:
version "6.8.1" version "6.8.1"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-simplify-comparison-operators/-/babel-plugin-transform-simplify-comparison-operators-6.8.1.tgz#a307088e0d1c728081777fba568f4107396ab25c" resolved "https://registry.yarnpkg.com/babel-plugin-transform-simplify-comparison-operators/-/babel-plugin-transform-simplify-comparison-operators-6.8.1.tgz#a307088e0d1c728081777fba568f4107396ab25c"
@ -1349,7 +1332,7 @@ babel-template@^6.16.0, babel-template@^6.22.0, babel-template@^6.23.0, babel-te
babylon "^6.11.0" babylon "^6.11.0"
lodash "^4.2.0" lodash "^4.2.0"
babel-traverse@^6.18.0, babel-traverse@^6.20.0, babel-traverse@^6.22.0, babel-traverse@^6.23.0, babel-traverse@^6.23.1: babel-traverse@^6.18.0, babel-traverse@^6.22.0, babel-traverse@^6.23.0, babel-traverse@^6.23.1:
version "6.23.1" version "6.23.1"
resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.23.1.tgz#d3cb59010ecd06a97d81310065f966b699e14f48" resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.23.1.tgz#d3cb59010ecd06a97d81310065f966b699e14f48"
dependencies: dependencies:
@ -1363,7 +1346,7 @@ babel-traverse@^6.18.0, babel-traverse@^6.20.0, babel-traverse@^6.22.0, babel-tr
invariant "^2.2.0" invariant "^2.2.0"
lodash "^4.2.0" lodash "^4.2.0"
babel-types@^6.16.0, babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.22.0, babel-types@^6.23.0: babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.22.0, babel-types@^6.23.0:
version "6.23.0" version "6.23.0"
resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.23.0.tgz#bb17179d7538bad38cd0c9e115d340f77e7e9acf" resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.23.0.tgz#bb17179d7538bad38cd0c9e115d340f77e7e9acf"
dependencies: dependencies:
@ -1410,6 +1393,10 @@ big.js@^3.1.3:
version "3.1.3" version "3.1.3"
resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.1.3.tgz#4cada2193652eb3ca9ec8e55c9015669c9806978" resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.1.3.tgz#4cada2193652eb3ca9ec8e55c9015669c9806978"
bignumber.js@^2.1.0:
version "2.4.0"
resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-2.4.0.tgz#838a992da9f9d737e0f4b2db0be62bb09dd0c5e8"
binary-extensions@^1.0.0: binary-extensions@^1.0.0:
version "1.8.0" version "1.8.0"
resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.8.0.tgz#48ec8d16df4377eae5fa5884682480af4d95c774" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.8.0.tgz#48ec8d16df4377eae5fa5884682480af4d95c774"
@ -1443,6 +1430,10 @@ bluebird@^3.1.1, bluebird@^3.4.7, bluebird@^3.5.0:
version "3.5.0" version "3.5.0"
resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.0.tgz#791420d7f551eea2897453a8a77653f96606d67c" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.0.tgz#791420d7f551eea2897453a8a77653f96606d67c"
bmp-js@0.0.1:
version "0.0.1"
resolved "https://registry.yarnpkg.com/bmp-js/-/bmp-js-0.0.1.tgz#5ad0147099d13a9f38aa7b99af1d6e78666ed37f"
bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0:
version "4.11.6" version "4.11.6"
resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215"
@ -1583,6 +1574,10 @@ buffer-crc32@^0.2.1:
version "0.2.13" version "0.2.13"
resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242"
buffer-equal@0.0.1:
version "0.0.1"
resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-0.0.1.tgz#91bc74b11ea405bc916bc6aa908faafa5b4aac4b"
buffer-shims@^1.0.0: buffer-shims@^1.0.0:
version "1.0.0" version "1.0.0"
resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51"
@ -2829,6 +2824,10 @@ es6-map@^0.1.3:
es6-symbol "~3.1.1" es6-symbol "~3.1.1"
event-emitter "~0.3.5" event-emitter "~0.3.5"
es6-promise@^3.0.2:
version "3.3.1"
resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613"
es6-promise@^4.0.5: es6-promise@^4.0.5:
version "4.1.0" version "4.1.0"
resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.1.0.tgz#dda03ca8f9f89bc597e689842929de7ba8cebdf0" resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.1.0.tgz#dda03ca8f9f89bc597e689842929de7ba8cebdf0"
@ -2947,20 +2946,6 @@ eslint-plugin-compat@^1.0.2:
caniuse-db "1.0.30000626" caniuse-db "1.0.30000626"
requireindex "^1.1.0" requireindex "^1.1.0"
eslint-plugin-flowtype-errors@^3.0.3:
version "3.0.3"
resolved "https://registry.yarnpkg.com/eslint-plugin-flowtype-errors/-/eslint-plugin-flowtype-errors-3.0.3.tgz#6c1d8874b91ffc65115a4744cf85020fb126725f"
dependencies:
babel-plugin-transform-runtime "^6.23.0"
shelljs "^0.7.7"
slash "^1.0.0"
eslint-plugin-flowtype@^2.30.4:
version "2.30.4"
resolved "https://registry.yarnpkg.com/eslint-plugin-flowtype/-/eslint-plugin-flowtype-2.30.4.tgz#771d6bb4578ab8598e9c58018fea2e1a22946249"
dependencies:
lodash "^4.15.0"
eslint-plugin-import@^2.2.0: eslint-plugin-import@^2.2.0:
version "2.2.0" version "2.2.0"
resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.2.0.tgz#72ba306fad305d67c4816348a4699a4229ac8b4e" resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.2.0.tgz#72ba306fad305d67c4816348a4699a4229ac8b4e"
@ -3137,6 +3122,10 @@ execa@^0.4.0:
path-key "^1.0.0" path-key "^1.0.0"
strip-eof "^1.0.0" strip-eof "^1.0.0"
exif-parser@^0.1.9:
version "0.1.9"
resolved "https://registry.yarnpkg.com/exif-parser/-/exif-parser-0.1.9.tgz#1d087e05fd2b079e3a8eaf8ff249978cb5f6fba7"
exit-hook@^1.0.0: exit-hook@^1.0.0:
version "1.1.1" version "1.1.1"
resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8" resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8"
@ -3316,6 +3305,10 @@ file-loader@^0.11.0:
dependencies: dependencies:
loader-utils "^1.0.2" loader-utils "^1.0.2"
file-type@^3.1.0:
version "3.9.0"
resolved "https://registry.yarnpkg.com/file-type/-/file-type-3.9.0.tgz#257a078384d1db8087bc449d107d52a52672b9e9"
filename-regex@^2.0.0: filename-regex@^2.0.0:
version "2.0.0" version "2.0.0"
resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.0.tgz#996e3e80479b98b9897f15a8a58b3d084e926775" resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.0.tgz#996e3e80479b98b9897f15a8a58b3d084e926775"
@ -3387,14 +3380,16 @@ flatten@^1.0.2:
version "1.0.2" version "1.0.2"
resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782" resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782"
flow-config-parser@^0.3.0:
version "0.3.0"
resolved "https://registry.yarnpkg.com/flow-config-parser/-/flow-config-parser-0.3.0.tgz#704916efba88cd2518ab4d8f933079571276138f"
font-awesome@^4.7.0: font-awesome@^4.7.0:
version "4.7.0" version "4.7.0"
resolved "https://registry.yarnpkg.com/font-awesome/-/font-awesome-4.7.0.tgz#8fa8cf0411a1a31afd07b06d2902bb9fc815a133" resolved "https://registry.yarnpkg.com/font-awesome/-/font-awesome-4.7.0.tgz#8fa8cf0411a1a31afd07b06d2902bb9fc815a133"
for-each@^0.3.2:
version "0.3.2"
resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.2.tgz#2c40450b9348e97f281322593ba96704b9abd4d4"
dependencies:
is-function "~1.0.0"
for-in@^0.1.3: for-in@^0.1.3:
version "0.1.8" version "0.1.8"
resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.8.tgz#d8773908e31256109952b1fdb9b3fa867d2775e1" resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.8.tgz#d8773908e31256109952b1fdb9b3fa867d2775e1"
@ -3594,7 +3589,7 @@ glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@~7.1.1:
once "^1.3.0" once "^1.3.0"
path-is-absolute "^1.0.0" path-is-absolute "^1.0.0"
global@^4.3.0: global@^4.3.0, global@~4.3.0:
version "4.3.1" version "4.3.1"
resolved "https://registry.yarnpkg.com/global/-/global-4.3.1.tgz#5f757908c7cbabce54f386ae440e11e26b7916df" resolved "https://registry.yarnpkg.com/global/-/global-4.3.1.tgz#5f757908c7cbabce54f386ae440e11e26b7916df"
dependencies: dependencies:
@ -4054,6 +4049,10 @@ invert-kv@^1.0.0:
version "1.0.0" version "1.0.0"
resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6"
ip-regex@^1.0.1:
version "1.0.3"
resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-1.0.3.tgz#dc589076f659f419c222039a33316f1c7387effd"
ipaddr.js@1.3.0: ipaddr.js@1.3.0:
version "1.3.0" version "1.3.0"
resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.3.0.tgz#1e03a52fdad83a8bbb2b25cbf4998b4cffcd3dec" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.3.0.tgz#1e03a52fdad83a8bbb2b25cbf4998b4cffcd3dec"
@ -4145,6 +4144,10 @@ is-fullwidth-code-point@^2.0.0:
version "2.0.0" version "2.0.0"
resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
is-function@^1.0.1, is-function@~1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.1.tgz#12cfb98b65b57dd3d193a3121f5f6e2f437602b5"
is-glob@^2.0.0, is-glob@^2.0.1: is-glob@^2.0.0, is-glob@^2.0.1:
version "2.0.1" version "2.0.1"
resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863"
@ -4589,12 +4592,36 @@ jest@^19.0.2:
dependencies: dependencies:
jest-cli "^19.0.2" jest-cli "^19.0.2"
jimp@^0.2.27:
version "0.2.27"
resolved "https://registry.yarnpkg.com/jimp/-/jimp-0.2.27.tgz#41ef5082d8b63201d54747e04fe8bcacbaf25474"
dependencies:
bignumber.js "^2.1.0"
bmp-js "0.0.1"
es6-promise "^3.0.2"
exif-parser "^0.1.9"
file-type "^3.1.0"
jpeg-js "^0.2.0"
load-bmfont "^1.2.3"
mime "^1.3.4"
pixelmatch "^4.0.0"
pngjs "^3.0.0"
read-chunk "^1.0.1"
request "^2.65.0"
stream-to-buffer "^0.1.0"
tinycolor2 "^1.1.2"
url-regex "^3.0.0"
jodid25519@^1.0.0: jodid25519@^1.0.0:
version "1.0.2" version "1.0.2"
resolved "https://registry.yarnpkg.com/jodid25519/-/jodid25519-1.0.2.tgz#06d4912255093419477d425633606e0e90782967" resolved "https://registry.yarnpkg.com/jodid25519/-/jodid25519-1.0.2.tgz#06d4912255093419477d425633606e0e90782967"
dependencies: dependencies:
jsbn "~0.1.0" jsbn "~0.1.0"
jpeg-js@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/jpeg-js/-/jpeg-js-0.2.0.tgz#53e448ec9d263e683266467e9442d2c5a2ef5482"
js-base64@^2.1.9: js-base64@^2.1.9:
version "2.1.9" version "2.1.9"
resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.1.9.tgz#f0e80ae039a4bd654b5f281fc93f04a914a7fcce" resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.1.9.tgz#f0e80ae039a4bd654b5f281fc93f04a914a7fcce"
@ -4771,6 +4798,18 @@ levn@^0.3.0, levn@~0.3.0:
prelude-ls "~1.1.2" prelude-ls "~1.1.2"
type-check "~0.3.2" type-check "~0.3.2"
load-bmfont@^1.2.3:
version "1.3.0"
resolved "https://registry.yarnpkg.com/load-bmfont/-/load-bmfont-1.3.0.tgz#bb7e7c710de6bcafcb13cb3b8c81e0c0131ecbc9"
dependencies:
buffer-equal "0.0.1"
mime "^1.3.4"
parse-bmfont-ascii "^1.0.3"
parse-bmfont-binary "^1.0.5"
parse-bmfont-xml "^1.1.0"
xhr "^2.0.1"
xtend "^4.0.0"
load-json-file@^1.0.0: load-json-file@^1.0.0:
version "1.1.0" version "1.1.0"
resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0"
@ -4997,7 +5036,7 @@ lodash.uniq@^4.3.0:
version "4.5.0" version "4.5.0"
resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773"
lodash@^4.0.0, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.2, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0, lodash@^4.5.1, lodash@^4.6.1, lodash@^4.8.0: lodash@^4.0.0, lodash@^4.14.0, lodash@^4.17.2, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0, lodash@^4.5.1, lodash@^4.6.1, lodash@^4.8.0:
version "4.17.4" version "4.17.4"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae"
@ -5678,6 +5717,21 @@ parse-asn1@^5.0.0:
evp_bytestokey "^1.0.0" evp_bytestokey "^1.0.0"
pbkdf2 "^3.0.3" pbkdf2 "^3.0.3"
parse-bmfont-ascii@^1.0.3:
version "1.0.6"
resolved "https://registry.yarnpkg.com/parse-bmfont-ascii/-/parse-bmfont-ascii-1.0.6.tgz#11ac3c3ff58f7c2020ab22769079108d4dfa0285"
parse-bmfont-binary@^1.0.5:
version "1.0.6"
resolved "https://registry.yarnpkg.com/parse-bmfont-binary/-/parse-bmfont-binary-1.0.6.tgz#d038b476d3e9dd9db1e11a0b0e53a22792b69006"
parse-bmfont-xml@^1.1.0:
version "1.1.3"
resolved "https://registry.yarnpkg.com/parse-bmfont-xml/-/parse-bmfont-xml-1.1.3.tgz#d6b66a371afd39c5007d9f0eeb262a4f2cce7b7c"
dependencies:
xml-parse-from-string "^1.0.0"
xml2js "^0.4.5"
parse-color@^1.0.0: parse-color@^1.0.0:
version "1.0.0" version "1.0.0"
resolved "https://registry.yarnpkg.com/parse-color/-/parse-color-1.0.0.tgz#7b748b95a83f03f16a94f535e52d7f3d94658619" resolved "https://registry.yarnpkg.com/parse-color/-/parse-color-1.0.0.tgz#7b748b95a83f03f16a94f535e52d7f3d94658619"
@ -5693,6 +5747,13 @@ parse-glob@^3.0.4:
is-extglob "^1.0.0" is-extglob "^1.0.0"
is-glob "^2.0.0" is-glob "^2.0.0"
parse-headers@^2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.1.tgz#6ae83a7aa25a9d9b700acc28698cd1f1ed7e9536"
dependencies:
for-each "^0.3.2"
trim "0.0.1"
parse-json@^2.2.0: parse-json@^2.2.0:
version "2.2.0" version "2.2.0"
resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9"
@ -5783,6 +5844,12 @@ pinkie@^2.0.0:
version "2.0.4" version "2.0.4"
resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870"
pixelmatch@^4.0.0:
version "4.0.2"
resolved "https://registry.yarnpkg.com/pixelmatch/-/pixelmatch-4.0.2.tgz#8f47dcec5011b477b67db03c243bc1f3085e8854"
dependencies:
pngjs "^3.0.0"
pkg-dir@^1.0.0: pkg-dir@^1.0.0:
version "1.0.0" version "1.0.0"
resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4"
@ -5813,6 +5880,10 @@ pluralize@^1.2.1:
version "1.2.1" version "1.2.1"
resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-1.2.1.tgz#d1a21483fd22bb41e58a12fa3421823140897c45" resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-1.2.1.tgz#d1a21483fd22bb41e58a12fa3421823140897c45"
pngjs@^3.0.0:
version "3.0.1"
resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-3.0.1.tgz#b15086ac1ac47298c8fd3f9cdf364fa9879c4db6"
portfinder@^1.0.9: portfinder@^1.0.9:
version "1.0.13" version "1.0.13"
resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.13.tgz#bb32ecd87c27104ae6ee44b5a3ccbf0ebb1aede9" resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.13.tgz#bb32ecd87c27104ae6ee44b5a3ccbf0ebb1aede9"
@ -6309,6 +6380,10 @@ react@^15.4.2:
loose-envify "^1.1.0" loose-envify "^1.1.0"
object-assign "^4.1.0" object-assign "^4.1.0"
read-chunk@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/read-chunk/-/read-chunk-1.0.1.tgz#5f68cab307e663f19993527d9b589cace4661194"
read-pkg-up@^1.0.1: read-pkg-up@^1.0.1:
version "1.0.1" version "1.0.1"
resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02"
@ -6720,7 +6795,7 @@ sass-loader@^6.0.3:
lodash.tail "^4.1.1" lodash.tail "^4.1.1"
pify "^2.3.0" pify "^2.3.0"
sax@^1.2.1, sax@~1.2.1: sax@>=0.6.0, sax@^1.2.1, sax@~1.2.1:
version "1.2.2" version "1.2.2"
resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.2.tgz#fd8631a23bc7826bef5d871bdb87378c95647828" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.2.tgz#fd8631a23bc7826bef5d871bdb87378c95647828"
@ -6822,7 +6897,7 @@ shebang-regex@^1.0.0:
version "1.0.0" version "1.0.0"
resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
shelljs@^0.7.5, shelljs@^0.7.7: shelljs@^0.7.5:
version "0.7.7" version "0.7.7"
resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.7.7.tgz#b2f5c77ef97148f4b4f6e22682e10bba8667cff1" resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.7.7.tgz#b2f5c77ef97148f4b4f6e22682e10bba8667cff1"
dependencies: dependencies:
@ -7073,6 +7148,16 @@ stream-http@^2.3.1:
to-arraybuffer "^1.0.0" to-arraybuffer "^1.0.0"
xtend "^4.0.0" xtend "^4.0.0"
stream-to-buffer@^0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/stream-to-buffer/-/stream-to-buffer-0.1.0.tgz#26799d903ab2025c9bd550ac47171b00f8dd80a9"
dependencies:
stream-to "~0.2.0"
stream-to@~0.2.0:
version "0.2.2"
resolved "https://registry.yarnpkg.com/stream-to/-/stream-to-0.2.2.tgz#84306098d85fdb990b9fa300b1b3ccf55e8ef01d"
strict-uri-encode@^1.0.0: strict-uri-encode@^1.0.0:
version "1.1.0" version "1.1.0"
resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713"
@ -7320,6 +7405,10 @@ timers-browserify@^2.0.2:
dependencies: dependencies:
setimmediate "^1.0.4" setimmediate "^1.0.4"
tinycolor2@^1.1.2:
version "1.4.1"
resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.4.1.tgz#f4fad333447bc0b07d4dc8e9209d8f39a8ac77e8"
tmp@0.0.28: tmp@0.0.28:
version "0.0.28" version "0.0.28"
resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.28.tgz#172735b7f614ea7af39664fa84cf0de4e515d120" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.28.tgz#172735b7f614ea7af39664fa84cf0de4e515d120"
@ -7380,6 +7469,10 @@ trim-right@^1.0.1:
version "1.0.1" version "1.0.1"
resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003"
trim@0.0.1:
version "0.0.1"
resolved "https://registry.yarnpkg.com/trim/-/trim-0.0.1.tgz#5858547f6b290757ee95cccc666fb50084c460dd"
truncate-utf8-bytes@^1.0.0: truncate-utf8-bytes@^1.0.0:
version "1.0.2" version "1.0.2"
resolved "https://registry.yarnpkg.com/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz#405923909592d56f78a5818434b0b78489ca5f2b" resolved "https://registry.yarnpkg.com/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz#405923909592d56f78a5818434b0b78489ca5f2b"
@ -7534,6 +7627,12 @@ url-parse@^1.1.1:
querystringify "0.0.x" querystringify "0.0.x"
requires-port "1.0.x" requires-port "1.0.x"
url-regex@^3.0.0:
version "3.2.0"
resolved "https://registry.yarnpkg.com/url-regex/-/url-regex-3.2.0.tgz#dbad1e0c9e29e105dd0b1f09f6862f7fdb482724"
dependencies:
ip-regex "^1.0.1"
url@^0.11.0: url@^0.11.0:
version "0.11.0" version "0.11.0"
resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1"
@ -7881,6 +7980,15 @@ xdg-basedir@^3.0.0:
version "3.0.0" version "3.0.0"
resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4"
xhr@^2.0.1:
version "2.4.0"
resolved "https://registry.yarnpkg.com/xhr/-/xhr-2.4.0.tgz#e16e66a45f869861eeefab416d5eff722dc40993"
dependencies:
global "~4.3.0"
is-function "^1.0.1"
parse-headers "^2.0.0"
xtend "^4.0.0"
xml-char-classes@^1.0.0: xml-char-classes@^1.0.0:
version "1.0.0" version "1.0.0"
resolved "https://registry.yarnpkg.com/xml-char-classes/-/xml-char-classes-1.0.0.tgz#64657848a20ffc5df583a42ad8a277b4512bbc4d" resolved "https://registry.yarnpkg.com/xml-char-classes/-/xml-char-classes-1.0.0.tgz#64657848a20ffc5df583a42ad8a277b4512bbc4d"
@ -7889,10 +7997,27 @@ xml-name-validator@^2.0.1:
version "2.0.1" version "2.0.1"
resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-2.0.1.tgz#4d8b8f1eccd3419aa362061becef515e1e559635" resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-2.0.1.tgz#4d8b8f1eccd3419aa362061becef515e1e559635"
xml-parse-from-string@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/xml-parse-from-string/-/xml-parse-from-string-1.0.0.tgz#feba5809f3cd2d17d2e4239fa810cd0319fc5da5"
xml2js@^0.4.5:
version "0.4.17"
resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.17.tgz#17be93eaae3f3b779359c795b419705a8817e868"
dependencies:
sax ">=0.6.0"
xmlbuilder "^4.1.0"
xmlbuilder@8.2.2: xmlbuilder@8.2.2:
version "8.2.2" version "8.2.2"
resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-8.2.2.tgz#69248673410b4ba42e1a6136551d2922335aa773" resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-8.2.2.tgz#69248673410b4ba42e1a6136551d2922335aa773"
xmlbuilder@^4.1.0:
version "4.2.1"
resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-4.2.1.tgz#aa58a3041a066f90eaa16c2f5389ff19f3f461a5"
dependencies:
lodash "^4.0.0"
xmldom@0.1.x: xmldom@0.1.x:
version "0.1.27" version "0.1.27"
resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.27.tgz#d501f97b3bdb403af8ef9ecc20573187aadac0e9" resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.27.tgz#d501f97b3bdb403af8ef9ecc20573187aadac0e9"