diff --git a/.editorconfig b/.editorconfig index 1addde2..5fdb115 100644 --- a/.editorconfig +++ b/.editorconfig @@ -8,11 +8,11 @@ trim_trailing_whitespace = true insert_final_newline = true [*.{json,js,jsx,html,css}] -indent_style = space +indent_style = tab indent_size = 2 [.eslintrc] -indent_style = space +indent_style = tab indent_size = 2 [*.md] diff --git a/.eslintrc b/.eslintrc index 49f1729..f791f70 100644 --- a/.eslintrc +++ b/.eslintrc @@ -1,43 +1,71 @@ { - "parser": "babel-eslint", - "extends": "airbnb", - "env": { - "browser": true, - "node": true - }, - "rules": { - "arrow-parens": ["off"], - "compat/compat": "error", - "consistent-return": "off", - "comma-dangle": "off", - "generator-star-spacing": "off", - "import/no-unresolved": "error", - "import/no-extraneous-dependencies": "off", - "no-console": "off", - "no-use-before-define": "off", - "no-multi-assign": "off", - "promise/param-names": "error", - "promise/always-return": "error", - "promise/catch-or-return": "error", - "promise/no-native": "off", - "react/sort-comp": ["error", { - "order": ["type-annotations", "static-methods", "lifecycle", "everything-else", "render"] - }], - "react/prop-types": "off", - "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" - } - } - } + "parser": "babel-eslint", + "extends": "airbnb", + "env": { + "browser": true, + "node": true + }, + "rules": { + "arrow-parens": [ + "off" + ], + "compat/compat": "error", + "consistent-return": "off", + "comma-dangle": "off", + "generator-star-spacing": "off", + "import/no-unresolved": "error", + "import/no-extraneous-dependencies": "off", + "indent": [ + "error", + "tab" + ], + "no-console": "off", + "no-tabs": "off", + "no-use-before-define": "off", + "no-multi-assign": "off", + "promise/param-names": "error", + "promise/always-return": "error", + "promise/catch-or-return": "error", + "promise/no-native": "off", + "react/sort-comp": [ + "error", + { + "order": [ + "type-annotations", + "static-methods", + "lifecycle", + "everything-else", + "render" + ] + } + ], + "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" + } + } + } } diff --git a/app/.eslintrc b/app/.eslintrc deleted file mode 100644 index 531712e..0000000 --- a/app/.eslintrc +++ /dev/null @@ -1,4 +0,0 @@ -{ - "rules": { - } -} diff --git a/app/components/Home.js b/app/components/Home.js index bad84f0..4a9cfcc 100644 --- a/app/components/Home.js +++ b/app/components/Home.js @@ -1,12 +1,12 @@ import React, { Component } from 'react'; export default class Home extends Component { - render() { - return ( -
-

Home

-

...is where the heart is

-
- ); - } + render() { + return ( +
+

Home

+

...is where the heart is

+
+ ); + } } diff --git a/app/containers/App.js b/app/containers/App.js index 0824d64..70037c2 100644 --- a/app/containers/App.js +++ b/app/containers/App.js @@ -1,19 +1,19 @@ import React, { PureComponent } from 'react'; export default class App extends PureComponent { - render() { - return ( -
-
-

Header

-
-
- {this.props.children} -
- -
- ); - } + render() { + return ( +
+
+

Header

+
+
+ {this.props.children} +
+ +
+ ); + } } diff --git a/app/containers/HomePage.js b/app/containers/HomePage.js index b938e37..ffd157b 100644 --- a/app/containers/HomePage.js +++ b/app/containers/HomePage.js @@ -2,9 +2,9 @@ import React, { Component } from 'react'; import Home from '../components/Home'; export default class HomePage extends Component { - render() { - return ( - - ); - } + render() { + return ( + + ); + } } diff --git a/app/containers/Root.js b/app/containers/Root.js index 29d8fe7..54c1de9 100644 --- a/app/containers/Root.js +++ b/app/containers/Root.js @@ -4,9 +4,9 @@ import { Router } from 'react-router'; import routes from '../routes'; export default function Root({ store, history }) { - return ( - - - - ); + return ( + + + + ); } diff --git a/app/index.js b/app/index.js index 247c128..e28c79c 100644 --- a/app/index.js +++ b/app/index.js @@ -11,20 +11,20 @@ const store = configureStore(); const history = syncHistoryWithStore(hashHistory, store); render( - - - , + + + , document.getElementById('root') ); if (module.hot) { - module.hot.accept('./containers/Root', () => { - const NextRoot = require('./containers/Root'); // eslint-disable-line global-require - render( - - - , + module.hot.accept('./containers/Root', () => { + const NextRoot = require('./containers/Root'); // eslint-disable-line global-require + render( + + + , document.getElementById('root') ); - }); + }); } diff --git a/app/main.development.js b/app/main.development.js index 2cd8df0..3693221 100644 --- a/app/main.development.js +++ b/app/main.development.js @@ -5,26 +5,26 @@ import MenuBuilder from './menu'; let mainWindow = null; if (process.env.NODE_ENV === 'production') { - const sourceMapSupport = require('source-map-support'); - sourceMapSupport.install(); + const sourceMapSupport = require('source-map-support'); + sourceMapSupport.install(); } if (process.env.NODE_ENV === 'development') { - require('electron-debug')(); - const path = require('path'); - const p = path.join(__dirname, '..', 'app', 'node_modules'); - require('module').globalPaths.push(p); + require('electron-debug')(); + const path = require('path'); + const p = path.join(__dirname, '..', 'app', 'node_modules'); + require('module').globalPaths.push(p); } const installExtensions = async () => { - const installer = require('electron-devtools-installer'); - const forceDownload = !!process.env.UPGRADE_EXTENSIONS; - const extensions = [ - 'REACT_DEVELOPER_TOOLS', - 'REDUX_DEVTOOLS' - ]; + const installer = require('electron-devtools-installer'); + const forceDownload = !!process.env.UPGRADE_EXTENSIONS; + const extensions = [ + 'REACT_DEVELOPER_TOOLS', + 'REDUX_DEVTOOLS' + ]; - return Promise + return Promise .all(extensions.map(name => installer.default(installer[name], forceDownload))) .catch(console.log); }; @@ -33,39 +33,39 @@ const installExtensions = async () => { app.on('window-all-closed', () => { // Respect the OSX convention of having the application in memory even // after all windows have been closed - if (process.platform !== 'darwin') { - app.quit(); - } + if (process.platform !== 'darwin') { + app.quit(); + } }); app.on('ready', async () => { - if (process.env.NODE_ENV === 'development') { - await installExtensions(); - } + if (process.env.NODE_ENV === 'development') { + await installExtensions(); + } - mainWindow = new BrowserWindow({ - show: false, - width: 1024, - height: 728 - }); + mainWindow = new BrowserWindow({ + show: false, + width: 1024, + height: 728 + }); - mainWindow.loadURL(`file://${__dirname}/app.html`); + mainWindow.loadURL(`file://${__dirname}/app.html`); // @TODO: Use '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', () => { - if (!mainWindow) { - throw new Error('"mainWindow" is not defined'); - } - mainWindow.show(); - mainWindow.focus(); - }); + mainWindow.webContents.on('did-finish-load', () => { + if (!mainWindow) { + throw new Error('"mainWindow" is not defined'); + } + mainWindow.show(); + mainWindow.focus(); + }); - mainWindow.on('closed', () => { - mainWindow = null; - }); + mainWindow.on('closed', () => { + mainWindow = null; + }); - const menuBuilder = new MenuBuilder(mainWindow); - menuBuilder.buildMenu(); + const menuBuilder = new MenuBuilder(mainWindow); + menuBuilder.buildMenu(); }); diff --git a/app/menu.js b/app/menu.js index 7c77bc6..b617771 100644 --- a/app/menu.js +++ b/app/menu.js @@ -1,51 +1,51 @@ import { app, Menu, shell, BrowserWindow } from 'electron'; export default class MenuBuilder { - mainWindow: BrowserWindow; + mainWindow: BrowserWindow; - constructor(mainWindow: BrowserWindow) { - this.mainWindow = mainWindow; - } + constructor(mainWindow: BrowserWindow) { + this.mainWindow = mainWindow; + } - buildMenu() { - if (process.env.NODE_ENV === 'development') { - this.setupDevelopmentEnvironment(); - } + buildMenu() { + if (process.env.NODE_ENV === 'development') { + this.setupDevelopmentEnvironment(); + } - let template; + let template; - if (process.platform === 'darwin') { - template = this.buildDarwinTemplate(); - } else { - template = this.buildDefaultTemplate(); - } + if (process.platform === 'darwin') { + template = this.buildDarwinTemplate(); + } else { + template = this.buildDefaultTemplate(); + } - const menu = Menu.buildFromTemplate(template); - Menu.setApplicationMenu(menu); + const menu = Menu.buildFromTemplate(template); + Menu.setApplicationMenu(menu); - return menu; - } + return menu; + } - setupDevelopmentEnvironment() { - this.mainWindow.openDevTools(); - this.mainWindow.webContents.on('context-menu', (e, props) => { - const { x, y } = props; + setupDevelopmentEnvironment() { + this.mainWindow.openDevTools(); + this.mainWindow.webContents.on('context-menu', (e, props) => { + const { x, y } = props; - Menu + Menu .buildFromTemplate([{ - label: 'Inspect element', - click: () => { - this.mainWindow.inspectElement(x, y); - } - }]) + label: 'Inspect element', + click: () => { + this.mainWindow.inspectElement(x, y); + } +}]) .popup(this.mainWindow); - }); - } + }); + } - buildDarwinTemplate() { - const subMenuAbout = { - label: 'Electron', - submenu: [ + buildDarwinTemplate() { + const subMenuAbout = { + label: 'Electron', + submenu: [ { label: 'About ElectronReact', selector: 'orderFrontStandardAboutPanel:' }, { type: 'separator' }, { label: 'Services', submenu: [] }, @@ -55,11 +55,11 @@ export default class MenuBuilder { { label: 'Show All', selector: 'unhideAllApplications:' }, { type: 'separator' }, { label: 'Quit', accelerator: 'Command+Q', click: () => { app.quit(); } } - ] - }; - const subMenuEdit = { - label: 'Edit', - submenu: [ + ] + }; + const subMenuEdit = { + label: 'Edit', + submenu: [ { label: 'Undo', accelerator: 'Command+Z', selector: 'undo:' }, { label: 'Redo', accelerator: 'Shift+Command+Z', selector: 'redo:' }, { type: 'separator' }, @@ -67,119 +67,119 @@ export default class MenuBuilder { { label: 'Copy', accelerator: 'Command+C', selector: 'copy:' }, { label: 'Paste', accelerator: 'Command+V', selector: 'paste:' }, { label: 'Select All', accelerator: 'Command+A', selector: 'selectAll:' } - ] - }; - const subMenuViewDev = { - label: 'View', - submenu: [ + ] + }; + const subMenuViewDev = { + label: 'View', + submenu: [ { 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 Developer Tools', accelerator: 'Alt+Command+I', click: () => { this.mainWindow.toggleDevTools(); } } - ] - }; - const subMenuViewProd = { - label: 'View', - submenu: [ + ] + }; + const subMenuViewProd = { + label: 'View', + submenu: [ { label: 'Toggle Full Screen', accelerator: 'Ctrl+Command+F', click: () => { this.mainWindow.setFullScreen(!this.mainWindow.isFullScreen()); } } - ] - }; - const subMenuWindow = { - label: 'Window', - submenu: [ + ] + }; + const subMenuWindow = { + label: 'Window', + submenu: [ { label: 'Minimize', accelerator: 'Command+M', selector: 'performMiniaturize:' }, { label: 'Close', accelerator: 'Command+W', selector: 'performClose:' }, { type: 'separator' }, { label: 'Bring All to Front', selector: 'arrangeInFront:' } - ] - }; - const subMenuHelp = { - label: 'Help', - submenu: [ + ] + }; + const subMenuHelp = { + label: 'Help', + submenu: [ { 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: 'Community Discussions', click() { shell.openExternal('https://discuss.atom.io/c/electron'); } }, { 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 : subMenuViewProd; - return [ - subMenuAbout, - subMenuEdit, - subMenuView, - subMenuWindow, - subMenuHelp - ]; - } + return [ + subMenuAbout, + subMenuEdit, + subMenuView, + subMenuWindow, + subMenuHelp + ]; + } - buildDefaultTemplate() { - const templateDefault = [{ - label: '&File', - submenu: [{ - label: '&Open', - accelerator: 'Ctrl+O' - }, { - label: '&Close', - accelerator: 'Ctrl+W', - click: () => { - this.mainWindow.close(); - } - }] - }, { - label: '&View', - submenu: (process.env.NODE_ENV === 'development') ? [{ - label: '&Reload', - accelerator: 'Ctrl+R', - click: () => { - this.mainWindow.webContents.reload(); - } - }, { - label: 'Toggle &Full Screen', - accelerator: 'F11', - click: () => { - this.mainWindow.setFullScreen(!this.mainWindow.isFullScreen()); - } - }, { - label: 'Toggle &Developer Tools', - accelerator: 'Alt+Ctrl+I', - click: () => { - this.mainWindow.toggleDevTools(); - } - }] : [{ - label: 'Toggle &Full Screen', - accelerator: 'F11', - click: () => { - this.mainWindow.setFullScreen(!this.mainWindow.isFullScreen()); - } - }] - }, { - label: 'Help', - submenu: [{ - 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: 'Community Discussions', - click() { - shell.openExternal('https://discuss.atom.io/c/electron'); - } - }, { - label: 'Search Issues', - click() { - shell.openExternal('https://github.com/atom/electron/issues'); - } - }] - }]; + buildDefaultTemplate() { + const templateDefault = [{ + label: '&File', + submenu: [{ + label: '&Open', + accelerator: 'Ctrl+O' + }, { + label: '&Close', + accelerator: 'Ctrl+W', + click: () => { + this.mainWindow.close(); + } + }] + }, { + label: '&View', + submenu: (process.env.NODE_ENV === 'development') ? [{ + label: '&Reload', + accelerator: 'Ctrl+R', + click: () => { + this.mainWindow.webContents.reload(); + } + }, { + label: 'Toggle &Full Screen', + accelerator: 'F11', + click: () => { + this.mainWindow.setFullScreen(!this.mainWindow.isFullScreen()); + } + }, { + label: 'Toggle &Developer Tools', + accelerator: 'Alt+Ctrl+I', + click: () => { + this.mainWindow.toggleDevTools(); + } + }] : [{ + label: 'Toggle &Full Screen', + accelerator: 'F11', + click: () => { + this.mainWindow.setFullScreen(!this.mainWindow.isFullScreen()); + } + }] + }, { + label: 'Help', + submenu: [{ + 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: 'Community Discussions', + click() { + shell.openExternal('https://discuss.atom.io/c/electron'); + } + }, { + label: 'Search Issues', + click() { + shell.openExternal('https://github.com/atom/electron/issues'); + } + }] + }]; - return templateDefault; - } + return templateDefault; + } } diff --git a/app/reducers/index.js b/app/reducers/index.js index 7ce1cd0..30064ba 100644 --- a/app/reducers/index.js +++ b/app/reducers/index.js @@ -2,7 +2,7 @@ import { combineReducers } from 'redux'; import { routerReducer as routing } from 'react-router-redux'; const rootReducer = combineReducers({ - routing + routing }); export default rootReducer; diff --git a/app/routes.js b/app/routes.js index a5ae039..a826533 100644 --- a/app/routes.js +++ b/app/routes.js @@ -5,7 +5,7 @@ import HomePage from './containers/HomePage'; export default ( - - - + + + ); diff --git a/app/store/configureStore.development.js b/app/store/configureStore.development.js index 7491ed4..3d62b06 100644 --- a/app/store/configureStore.development.js +++ b/app/store/configureStore.development.js @@ -7,50 +7,50 @@ import rootReducer from '../reducers'; export default (initialState = {}) => { // Redux Configuration - const middleware = []; - const enhancers = []; + const middleware = []; + const enhancers = []; // Thunk Middleware - middleware.push(thunk); + middleware.push(thunk); // Logging Middleware - const logger = createLogger({ - level: 'info', - collapsed: true - }); - middleware.push(logger); + const logger = createLogger({ + level: 'info', + collapsed: true + }); + middleware.push(logger); // Router Middleware - const router = routerMiddleware(hashHistory); - middleware.push(router); + const router = routerMiddleware(hashHistory); + middleware.push(router); // Redux DevTools Configuration - const actionCreators = { + const actionCreators = { - push, - }; + push, + }; // If Redux DevTools Extension is installed use it, otherwise use Redux compose /* eslint-disable no-underscore-dangle */ - const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ + const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ ? window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__({ // Options: http://zalmoxisus.github.io/redux-devtools-extension/API/Arguments.html - actionCreators, - }) + actionCreators, +}) : compose; /* eslint-enable no-underscore-dangle */ // Apply Middleware & Compose Enhancers - enhancers.push(applyMiddleware(...middleware)); - const enhancer = composeEnhancers(...enhancers); + enhancers.push(applyMiddleware(...middleware)); + const enhancer = composeEnhancers(...enhancers); // Create Store - const store = createStore(rootReducer, initialState, enhancer); + const store = createStore(rootReducer, initialState, enhancer); - if (module.hot) { - module.hot.accept('../reducers', () => + if (module.hot) { + module.hot.accept('../reducers', () => store.replaceReducer(require('../reducers')) // eslint-disable-line global-require ); - } + } - return store; + return store; }; diff --git a/app/store/configureStore.js b/app/store/configureStore.js index eca511f..a56feae 100644 --- a/app/store/configureStore.js +++ b/app/store/configureStore.js @@ -1,5 +1,5 @@ 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 { - module.exports = require('./configureStore.development'); // eslint-disable-line global-require + module.exports = require('./configureStore.development'); // eslint-disable-line global-require } diff --git a/package.json b/package.json index 1994039..e509549 100644 --- a/package.json +++ b/package.json @@ -150,6 +150,7 @@ "html-webpack-plugin": "^2.28.0", "identity-obj-proxy": "^3.0.0", "jest": "^19.0.2", + "jimp": "^0.2.27", "jsdom": "^9.12.0", "minimist": "^1.2.0", "node-sass": "^4.5.2", diff --git a/setup.js b/setup.js index cfffc85..8601ccf 100644 --- a/setup.js +++ b/setup.js @@ -12,7 +12,7 @@ module.exports = { // remove the following files as they are mostly // related to the sample counter page and functionality - remove: [ + remove: [ { file: 'app/actions/counter.js' }, { file: 'app/components/Counter.css' }, { file: 'app/components/Counter.js' }, @@ -25,55 +25,55 @@ module.exports = { { file: 'test/reducers/counter.spec.js' }, { file: 'CHANGELOG.md' }, { file: 'erb-logo.png' } - ], + ], // clean the following files by either clearing them // (by specifying {clear: true}) or by removing lines // that match a regex pattern - clean: [ - { - file: 'app/reducers/index.js', - pattern: /counter/ - }, - { - file: 'app/store/configureStore.development.js', - replace: [ + clean: [ + { + file: 'app/reducers/index.js', + pattern: /counter/ + }, + { + file: 'app/store/configureStore.development.js', + replace: [ { pattern: /\?: counterStateType/, substitute: '' }, { pattern: /^.*import type.*$/, substitute: '' }, { pattern: /^.*counterActions.*$/, substitute: '' } - ] - }, - { - file: 'app/store/configureStore.production.js', - replace: [ + ] + }, + { + file: 'app/store/configureStore.production.js', + replace: [ { pattern: /\?: counterStateType/, substitute: '' }, { pattern: /^.*import type.*$/, substitute: '' }, - ] - }, - { - file: 'app/app.global.css', - clear: true - }, - { - file: 'app/routes.js', - pattern: /CounterPage/ - }, - { - file: 'README.md', - clear: true - }, - { - file: 'app/components/Home.js', - pattern: /(h2|Link to)/ - } - ], + ] + }, + { + file: 'app/app.global.css', + clear: true + }, + { + file: 'app/routes.js', + pattern: /CounterPage/ + }, + { + file: 'README.md', + clear: true + }, + { + file: 'app/components/Home.js', + pattern: /(h2|Link to)/ + } + ], // add the following files to the project, mostly // related to .gitkeep for version control - add: [ + add: [ { file: 'app/actions/.gitkeep' }, { file: 'test/actions/.gitkeep' }, { file: 'test/components/.gitkeep' }, { file: 'test/containers/.gitkeep' }, { file: 'test/reducers/.gitkeep' }, { file: 'test/e2e/.gitkeep' } - ] + ] }; diff --git a/test/example.js b/test/example.js index f71bd77..3b6e147 100644 --- a/test/example.js +++ b/test/example.js @@ -1,7 +1,7 @@ /* eslint-disable func-names */ describe('description', () => { - it('should have description', () => { - expect(1 + 2).toBe(3); - }); + it('should have description', () => { + expect(1 + 2).toBe(3); + }); }); diff --git a/test/setup.js b/test/setup.js index efc3e13..2982c1c 100644 --- a/test/setup.js +++ b/test/setup.js @@ -4,13 +4,13 @@ global.document = jsdom(''); global.window = document.defaultView; global.navigator = global.window.navigator; window.localStorage = window.sessionStorage = { - getItem(key) { - return this[key]; - }, - setItem(key, value) { - this[key] = value; - }, - removeItem(key) { - this[key] = undefined; - }, + getItem(key) { + return this[key]; + }, + setItem(key, value) { + this[key] = value; + }, + removeItem(key) { + this[key] = undefined; + }, }; diff --git a/webpack.config.base.js b/webpack.config.base.js index 7e5b79b..82c5dc4 100644 --- a/webpack.config.base.js +++ b/webpack.config.base.js @@ -7,40 +7,40 @@ import webpack from 'webpack'; import { dependencies as externals } from './app/package.json'; export default { - externals: Object.keys(externals || {}), + externals: Object.keys(externals || {}), - module: { - rules: [{ - test: /\.jsx?$/, - exclude: /node_modules/, - use: { - loader: 'babel-loader', - options: { - cacheDirectory: true - } - } - }] - }, + module: { + rules: [{ + test: /\.jsx?$/, + exclude: /node_modules/, + use: { + loader: 'babel-loader', + options: { + cacheDirectory: true + } + } + }] + }, - output: { - path: path.join(__dirname, 'app'), - filename: 'bundle.js', + output: { + path: path.join(__dirname, 'app'), + filename: 'bundle.js', // https://github.com/webpack/webpack/issues/1114 - libraryTarget: 'commonjs2' - }, + libraryTarget: 'commonjs2' + }, /** * Determine the array of extensions that should be used to resolve modules. */ - resolve: { - extensions: ['.js', '.jsx', '.json'], - modules: [ - path.join(__dirname, 'app'), - 'node_modules', - ], - }, + resolve: { + extensions: ['.js', '.jsx', '.json'], + modules: [ + path.join(__dirname, 'app'), + 'node_modules', + ], + }, - plugins: [ - new webpack.NamedModulesPlugin(), - ], + plugins: [ + new webpack.NamedModulesPlugin(), + ], }; diff --git a/webpack.config.main.prod.js b/webpack.config.main.prod.js index 0567da2..929c4cf 100644 --- a/webpack.config.main.prod.js +++ b/webpack.config.main.prod.js @@ -8,23 +8,23 @@ import BabiliPlugin from 'babili-webpack-plugin'; import baseConfig from './webpack.config.base'; 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 - output: { - path: __dirname, - filename: './app/main.js' - }, + output: { + path: __dirname, + filename: './app/main.js' + }, - plugins: [ + plugins: [ /** * 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. @@ -35,18 +35,18 @@ export default merge.smart(baseConfig, { * NODE_ENV should be production so that modules do not perform certain * development checks */ - new webpack.DefinePlugin({ - 'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV || 'production') - }) - ], + new webpack.DefinePlugin({ + 'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV || 'production') + }) + ], /** * Disables webpack processing of __dirname and __filename. * If you run the bundle in node.js it falls back to these values of node.js. * https://github.com/webpack/webpack/issues/2010 */ - node: { - __dirname: false, - __filename: false - }, + node: { + __dirname: false, + __filename: false + }, }); diff --git a/webpack.config.renderer.dev.dll.js b/webpack.config.renderer.dev.dll.js index 8faa7c0..d1e039f 100644 --- a/webpack.config.renderer.dev.dll.js +++ b/webpack.config.renderer.dev.dll.js @@ -11,174 +11,174 @@ import { dependencies } from './package.json'; const dist = path.resolve(process.cwd(), 'dll'); 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 * rules into the base config. May cause breaking changes. */ - module: { - rules: [ - { - test: /\.global\.css$/, - use: [ - { - loader: 'style-loader' - }, - { - loader: 'css-loader', - options: { - sourceMap: true, - }, - } - ] - }, - { - test: /^((?!\.global).)*\.css$/, - use: [ - { - loader: 'style-loader' - }, - { - loader: 'css-loader', - options: { - modules: true, - sourceMap: true, - importLoaders: 1, - localIdentName: '[name]__[local]__[hash:base64:5]', - } - }, - ] - }, + module: { + rules: [ + { + test: /\.global\.css$/, + use: [ + { + loader: 'style-loader' + }, + { + loader: 'css-loader', + options: { + sourceMap: true, + }, + } + ] + }, + { + test: /^((?!\.global).)*\.css$/, + use: [ + { + loader: 'style-loader' + }, + { + loader: 'css-loader', + options: { + modules: true, + sourceMap: true, + importLoaders: 1, + localIdentName: '[name]__[local]__[hash:base64:5]', + } + }, + ] + }, // Add SASS support - compile all .global.scss files and pipe it to style.css - { - test: /\.global\.scss$/, - use: [ - { - loader: 'style-loader' - }, - { - loader: 'css-loader', - options: { - sourceMap: true, - }, - }, - { - loader: 'sass-loader' - } - ] - }, + { + test: /\.global\.scss$/, + use: [ + { + loader: 'style-loader' + }, + { + loader: 'css-loader', + options: { + sourceMap: true, + }, + }, + { + loader: 'sass-loader' + } + ] + }, // Add SASS support - compile all other .scss files and pipe it to style.css - { - test: /^((?!\.global).)*\.scss$/, - use: [ - { - loader: 'style-loader' - }, - { - loader: 'css-loader', - options: { - modules: true, - sourceMap: true, - importLoaders: 1, - localIdentName: '[name]__[local]__[hash:base64:5]', - } - }, - { - loader: 'sass-loader' - } - ] - }, + { + test: /^((?!\.global).)*\.scss$/, + use: [ + { + loader: 'style-loader' + }, + { + loader: 'css-loader', + options: { + modules: true, + sourceMap: true, + importLoaders: 1, + localIdentName: '[name]__[local]__[hash:base64:5]', + } + }, + { + loader: 'sass-loader' + } + ] + }, // WOFF Font - { - test: /\.woff(\?v=\d+\.\d+\.\d+)?$/, - use: { - loader: 'url-loader', - options: { - limit: 10000, - mimetype: 'application/font-woff', - } - }, - }, + { + test: /\.woff(\?v=\d+\.\d+\.\d+)?$/, + use: { + loader: 'url-loader', + options: { + limit: 10000, + mimetype: 'application/font-woff', + } + }, + }, // WOFF2 Font - { - test: /\.woff2(\?v=\d+\.\d+\.\d+)?$/, - use: { - loader: 'url-loader', - options: { - limit: 10000, - mimetype: 'application/font-woff', - } - } - }, + { + test: /\.woff2(\?v=\d+\.\d+\.\d+)?$/, + use: { + loader: 'url-loader', + options: { + limit: 10000, + mimetype: 'application/font-woff', + } + } + }, // TTF Font - { - test: /\.ttf(\?v=\d+\.\d+\.\d+)?$/, - use: { - loader: 'url-loader', - options: { - limit: 10000, - mimetype: 'application/octet-stream' - } - } - }, + { + test: /\.ttf(\?v=\d+\.\d+\.\d+)?$/, + use: { + loader: 'url-loader', + options: { + limit: 10000, + mimetype: 'application/octet-stream' + } + } + }, // EOT Font - { - test: /\.eot(\?v=\d+\.\d+\.\d+)?$/, - use: 'file-loader', - }, + { + test: /\.eot(\?v=\d+\.\d+\.\d+)?$/, + use: 'file-loader', + }, // SVG Font - { - test: /\.svg(\?v=\d+\.\d+\.\d+)?$/, - use: { - loader: 'url-loader', - options: { - limit: 10000, - mimetype: 'image/svg+xml', - } - } - }, + { + test: /\.svg(\?v=\d+\.\d+\.\d+)?$/, + use: { + loader: 'url-loader', + options: { + limit: 10000, + mimetype: 'image/svg+xml', + } + } + }, // Common Image Formats - { - test: /\.(?:ico|gif|png|jpg|jpeg|webp)$/, - use: 'url-loader', - } - ] - }, + { + test: /\.(?:ico|gif|png|jpg|jpeg|webp)$/, + use: 'url-loader', + } + ] + }, - resolve: { - modules: [ - 'app', - 'node_modules', - ], - }, + resolve: { + modules: [ + 'app', + 'node_modules', + ], + }, - entry: { - vendor: [ - 'babel-polyfill', - ...Object.keys(dependencies) - ] + entry: { + vendor: [ + 'babel-polyfill', + ...Object.keys(dependencies) + ] .filter(dependency => dependency !== 'font-awesome'), - }, + }, - output: { - library: 'vendor', - path: dist, - filename: '[name].dll.js', - libraryTarget: 'var' - }, + output: { + library: 'vendor', + path: dist, + filename: '[name].dll.js', + libraryTarget: 'var' + }, - plugins: [ - new webpack.DllPlugin({ - path: path.join(dist, '[name].json'), - name: '[name]', - }), + plugins: [ + new webpack.DllPlugin({ + path: path.join(dist, '[name].json'), + name: '[name]', + }), /** * 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 * development checks */ - new webpack.DefinePlugin({ - 'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV || 'development') - }), + new webpack.DefinePlugin({ + 'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV || 'development') + }), - new webpack.LoaderOptionsPlugin({ - debug: true, - options: { - context: path.resolve(process.cwd(), 'app'), - output: { - path: path.resolve(process.cwd(), 'dll'), - }, - }, - }) - ], + new webpack.LoaderOptionsPlugin({ + debug: true, + options: { + context: path.resolve(process.cwd(), 'app'), + output: { + path: path.resolve(process.cwd(), 'dll'), + }, + }, + }) + ], }); diff --git a/webpack.config.renderer.dev.js b/webpack.config.renderer.dev.js index 4b20996..0611040 100644 --- a/webpack.config.renderer.dev.js +++ b/webpack.config.renderer.dev.js @@ -25,172 +25,172 @@ const manifest = path.resolve(dll, 'vendor.json'); * Warn if the DLL is not built */ 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"' )); - execSync('npm run build-dll'); + execSync('npm run build-dll'); } export default merge.smart(baseConfig, { - devtool: 'inline-source-map', + devtool: 'inline-source-map', - target: 'electron-renderer', + target: 'electron-renderer', - entry: [ - 'react-hot-loader/patch', - `webpack-dev-server/client?http://localhost:${port}/`, - 'webpack/hot/only-dev-server', - path.join(__dirname, 'app/index.js'), - ], + entry: [ + 'react-hot-loader/patch', + `webpack-dev-server/client?http://localhost:${port}/`, + 'webpack/hot/only-dev-server', + path.join(__dirname, 'app/index.js'), + ], - output: { - publicPath: `http://localhost:${port}/dist/` - }, + output: { + publicPath: `http://localhost:${port}/dist/` + }, - module: { - rules: [ - { - test: /\.global\.css$/, - use: [ - { - loader: 'style-loader' - }, - { - loader: 'css-loader', - options: { - sourceMap: true, - }, - } - ] - }, - { - test: /^((?!\.global).)*\.css$/, - use: [ - { - loader: 'style-loader' - }, - { - loader: 'css-loader', - options: { - modules: true, - sourceMap: true, - importLoaders: 1, - localIdentName: '[name]__[local]__[hash:base64:5]', - } - }, - ] - }, + module: { + rules: [ + { + test: /\.global\.css$/, + use: [ + { + loader: 'style-loader' + }, + { + loader: 'css-loader', + options: { + sourceMap: true, + }, + } + ] + }, + { + test: /^((?!\.global).)*\.css$/, + use: [ + { + loader: 'style-loader' + }, + { + loader: 'css-loader', + options: { + modules: true, + sourceMap: true, + importLoaders: 1, + localIdentName: '[name]__[local]__[hash:base64:5]', + } + }, + ] + }, // Add SASS support - compile all .global.scss files and pipe it to style.css - { - test: /\.global\.scss$/, - use: [ - { - loader: 'style-loader' - }, - { - loader: 'css-loader', - options: { - sourceMap: true, - }, - }, - { - loader: 'sass-loader' - } - ] - }, + { + test: /\.global\.scss$/, + use: [ + { + loader: 'style-loader' + }, + { + loader: 'css-loader', + options: { + sourceMap: true, + }, + }, + { + loader: 'sass-loader' + } + ] + }, // Add SASS support - compile all other .scss files and pipe it to style.css - { - test: /^((?!\.global).)*\.scss$/, - use: [ - { - loader: 'style-loader' - }, - { - loader: 'css-loader', - options: { - modules: true, - sourceMap: true, - importLoaders: 1, - localIdentName: '[name]__[local]__[hash:base64:5]', - } - }, - { - loader: 'sass-loader' - } - ] - }, + { + test: /^((?!\.global).)*\.scss$/, + use: [ + { + loader: 'style-loader' + }, + { + loader: 'css-loader', + options: { + modules: true, + sourceMap: true, + importLoaders: 1, + localIdentName: '[name]__[local]__[hash:base64:5]', + } + }, + { + loader: 'sass-loader' + } + ] + }, // WOFF Font - { - test: /\.woff(\?v=\d+\.\d+\.\d+)?$/, - use: { - loader: 'url-loader', - options: { - limit: 10000, - mimetype: 'application/font-woff', - } - }, - }, + { + test: /\.woff(\?v=\d+\.\d+\.\d+)?$/, + use: { + loader: 'url-loader', + options: { + limit: 10000, + mimetype: 'application/font-woff', + } + }, + }, // WOFF2 Font - { - test: /\.woff2(\?v=\d+\.\d+\.\d+)?$/, - use: { - loader: 'url-loader', - options: { - limit: 10000, - mimetype: 'application/font-woff', - } - } - }, + { + test: /\.woff2(\?v=\d+\.\d+\.\d+)?$/, + use: { + loader: 'url-loader', + options: { + limit: 10000, + mimetype: 'application/font-woff', + } + } + }, // TTF Font - { - test: /\.ttf(\?v=\d+\.\d+\.\d+)?$/, - use: { - loader: 'url-loader', - options: { - limit: 10000, - mimetype: 'application/octet-stream' - } - } - }, + { + test: /\.ttf(\?v=\d+\.\d+\.\d+)?$/, + use: { + loader: 'url-loader', + options: { + limit: 10000, + mimetype: 'application/octet-stream' + } + } + }, // EOT Font - { - test: /\.eot(\?v=\d+\.\d+\.\d+)?$/, - use: 'file-loader', - }, + { + test: /\.eot(\?v=\d+\.\d+\.\d+)?$/, + use: 'file-loader', + }, // SVG Font - { - test: /\.svg(\?v=\d+\.\d+\.\d+)?$/, - use: { - loader: 'url-loader', - options: { - limit: 10000, - mimetype: 'image/svg+xml', - } - } - }, + { + test: /\.svg(\?v=\d+\.\d+\.\d+)?$/, + use: { + loader: 'url-loader', + options: { + limit: 10000, + mimetype: 'image/svg+xml', + } + } + }, // Common Image Formats - { - test: /\.(?:ico|gif|png|jpg|jpeg|webp)$/, - use: 'url-loader', - } - ] - }, + { + test: /\.(?:ico|gif|png|jpg|jpeg|webp)$/, + use: 'url-loader', + } + ] + }, - plugins: [ - new webpack.DllReferencePlugin({ - context: process.cwd(), - manifest: require(manifest), - sourceType: 'var', - }), + plugins: [ + new webpack.DllReferencePlugin({ + context: process.cwd(), + manifest: require(manifest), + sourceType: 'var', + }), /** * https://webpack.js.org/concepts/hot-module-replacement/ */ - new webpack.HotModuleReplacementPlugin({ - multiStep: true - }), + new webpack.HotModuleReplacementPlugin({ + multiStep: true + }), - new webpack.NoEmitOnErrorsPlugin(), + new webpack.NoEmitOnErrorsPlugin(), /** * 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 * 'staging', for example, by changing the ENV variables in the npm scripts */ - new webpack.DefinePlugin({ - 'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV || 'development') - }), + new webpack.DefinePlugin({ + 'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV || 'development') + }), - new webpack.LoaderOptionsPlugin({ - debug: true - }), + new webpack.LoaderOptionsPlugin({ + debug: true + }), - new ExtractTextPlugin({ - filename: '[name].css' - }) - ], + new ExtractTextPlugin({ + filename: '[name].css' + }) + ], - devServer: { - port, - publicPath, - compress: true, - noInfo: true, - stats: 'errors-only', - inline: true, - lazy: false, - hot: true, - headers: { 'Access-Control-Allow-Origin': '*' }, - contentBase: path.join(__dirname, 'dist'), - watchOptions: { - aggregateTimeout: 300, - poll: 100 - }, - historyApiFallback: { - verbose: true, - disableDotRule: false, - }, - setup() { - if (process.env.START_HOT) { - spawn( + devServer: { + port, + publicPath, + compress: true, + noInfo: true, + stats: 'errors-only', + inline: true, + lazy: false, + hot: true, + headers: { 'Access-Control-Allow-Origin': '*' }, + contentBase: path.join(__dirname, 'dist'), + watchOptions: { + aggregateTimeout: 300, + poll: 100 + }, + historyApiFallback: { + verbose: true, + disableDotRule: false, + }, + setup() { + if (process.env.START_HOT) { + spawn( 'npm', ['run', 'start-hot-renderer'], { shell: true, env: process.env, stdio: 'inherit' } ) .on('close', code => process.exit(code)) .on('error', spawnError => console.error(spawnError)); - } - } - }, + } + } + }, }); diff --git a/webpack.config.renderer.prod.js b/webpack.config.renderer.prod.js index 02fc001..20672da 100644 --- a/webpack.config.renderer.prod.js +++ b/webpack.config.renderer.prod.js @@ -11,131 +11,131 @@ import BabiliPlugin from 'babili-webpack-plugin'; import baseConfig from './webpack.config.base'; 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: { - path: path.join(__dirname, 'app/dist'), - publicPath: '../dist/' - }, + output: { + path: path.join(__dirname, 'app/dist'), + publicPath: '../dist/' + }, - module: { - rules: [ + module: { + rules: [ // Extract all .global.css to style.css as is - { - test: /\.global\.css$/, - use: ExtractTextPlugin.extract({ - use: 'css-loader', - fallback: 'style-loader', - }) - }, + { + test: /\.global\.css$/, + use: ExtractTextPlugin.extract({ + use: 'css-loader', + fallback: 'style-loader', + }) + }, // Pipe other styles through css modules and append to style.css - { - test: /^((?!\.global).)*\.css$/, - use: ExtractTextPlugin.extract({ - use: { - loader: 'css-loader', - options: { - modules: true, - importLoaders: 1, - localIdentName: '[name]__[local]__[hash:base64:5]', - } - } - }), - }, + { + test: /^((?!\.global).)*\.css$/, + use: ExtractTextPlugin.extract({ + use: { + loader: 'css-loader', + options: { + modules: true, + importLoaders: 1, + localIdentName: '[name]__[local]__[hash:base64:5]', + } + } + }), + }, // Add SASS support - compile all .global.scss files and pipe it to style.css - { - test: /\.global\.scss$/, - use: ExtractTextPlugin.extract({ - use: [ - { - loader: 'css-loader' - }, - { - loader: 'sass-loader' - } - ], - fallback: 'style-loader', - }) - }, + { + test: /\.global\.scss$/, + use: ExtractTextPlugin.extract({ + use: [ + { + loader: 'css-loader' + }, + { + loader: 'sass-loader' + } + ], + fallback: 'style-loader', + }) + }, // Add SASS support - compile all other .scss files and pipe it to style.css - { - test: /^((?!\.global).)*\.scss$/, - use: ExtractTextPlugin.extract({ - use: [{ - loader: 'css-loader', - options: { - modules: true, - importLoaders: 1, - localIdentName: '[name]__[local]__[hash:base64:5]', - } - }, - { - loader: 'sass-loader' - }] - }), - }, + { + test: /^((?!\.global).)*\.scss$/, + use: ExtractTextPlugin.extract({ + use: [{ + loader: 'css-loader', + options: { + modules: true, + importLoaders: 1, + localIdentName: '[name]__[local]__[hash:base64:5]', + } + }, + { + loader: 'sass-loader' + }] + }), + }, // WOFF Font - { - test: /\.woff(\?v=\d+\.\d+\.\d+)?$/, - use: { - loader: 'url-loader', - options: { - limit: 10000, - mimetype: 'application/font-woff', - } - }, - }, + { + test: /\.woff(\?v=\d+\.\d+\.\d+)?$/, + use: { + loader: 'url-loader', + options: { + limit: 10000, + mimetype: 'application/font-woff', + } + }, + }, // WOFF2 Font - { - test: /\.woff2(\?v=\d+\.\d+\.\d+)?$/, - use: { - loader: 'url-loader', - options: { - limit: 10000, - mimetype: 'application/font-woff', - } - } - }, + { + test: /\.woff2(\?v=\d+\.\d+\.\d+)?$/, + use: { + loader: 'url-loader', + options: { + limit: 10000, + mimetype: 'application/font-woff', + } + } + }, // TTF Font - { - test: /\.ttf(\?v=\d+\.\d+\.\d+)?$/, - use: { - loader: 'url-loader', - options: { - limit: 10000, - mimetype: 'application/octet-stream' - } - } - }, + { + test: /\.ttf(\?v=\d+\.\d+\.\d+)?$/, + use: { + loader: 'url-loader', + options: { + limit: 10000, + mimetype: 'application/octet-stream' + } + } + }, // EOT Font - { - test: /\.eot(\?v=\d+\.\d+\.\d+)?$/, - use: 'file-loader', - }, + { + test: /\.eot(\?v=\d+\.\d+\.\d+)?$/, + use: 'file-loader', + }, // SVG Font - { - test: /\.svg(\?v=\d+\.\d+\.\d+)?$/, - use: { - loader: 'url-loader', - options: { - limit: 10000, - mimetype: 'image/svg+xml', - } - } - }, + { + test: /\.svg(\?v=\d+\.\d+\.\d+)?$/, + use: { + loader: 'url-loader', + options: { + limit: 10000, + mimetype: 'image/svg+xml', + } + } + }, // Common Image Formats - { - test: /\.(?:ico|gif|png|jpg|jpeg|webp)$/, - use: 'url-loader', - } - ] - }, + { + test: /\.(?:ico|gif|png|jpg|jpeg|webp)$/, + use: 'url-loader', + } + ] + }, - plugins: [ + plugins: [ /** * 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 * development checks */ - new webpack.DefinePlugin({ - 'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV || 'production') - }), + new webpack.DefinePlugin({ + 'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV || 'production') + }), /** * 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 */ - new HtmlWebpackPlugin({ - filename: '../app.html', - template: 'app/app.html', - inject: false - }) - ], + new HtmlWebpackPlugin({ + filename: '../app.html', + template: 'app/app.html', + inject: false + }) + ], }); diff --git a/yarn.lock b/yarn.lock index 6f819cd..d9d7865 100644 --- a/yarn.lock +++ b/yarn.lock @@ -397,7 +397,7 @@ babel-eslint@^7.2.1: babel-types "^6.23.0" 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" resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.24.0.tgz#eba270a8cc4ce6e09a61be43465d7c62c1f87c56" dependencies: @@ -606,17 +606,6 @@ babel-plugin-dev-expression@^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" -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: version "4.1.1" 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" 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: 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" @@ -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" 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" resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.23.1.tgz#d3cb59010ecd06a97d81310065f966b699e14f48" 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" 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" resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.23.0.tgz#bb17179d7538bad38cd0c9e115d340f77e7e9acf" dependencies: @@ -1410,6 +1393,10 @@ big.js@^3.1.3: version "3.1.3" 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: version "1.8.0" 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" 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: version "4.11.6" 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" 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: version "1.0.0" 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" 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: version "4.1.0" 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" 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: version "2.2.0" 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" 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: version "1.1.1" resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8" @@ -3316,6 +3305,10 @@ file-loader@^0.11.0: dependencies: 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: version "2.0.0" 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" 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: version "4.7.0" 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: version "0.1.8" 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" path-is-absolute "^1.0.0" -global@^4.3.0: +global@^4.3.0, global@~4.3.0: version "4.3.1" resolved "https://registry.yarnpkg.com/global/-/global-4.3.1.tgz#5f757908c7cbabce54f386ae440e11e26b7916df" dependencies: @@ -4054,6 +4049,10 @@ invert-kv@^1.0.0: version "1.0.0" 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: version "1.3.0" 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" 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: version "2.0.1" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" @@ -4589,12 +4592,36 @@ jest@^19.0.2: dependencies: 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: version "1.0.2" resolved "https://registry.yarnpkg.com/jodid25519/-/jodid25519-1.0.2.tgz#06d4912255093419477d425633606e0e90782967" dependencies: 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: version "2.1.9" 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" 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: version "1.1.0" 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" 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" 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" 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: version "1.0.0" 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-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: version "2.2.0" 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" 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: version "1.0.0" 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" 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: version "1.0.13" 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" 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: version "1.0.1" 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" 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" 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" 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" resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.7.7.tgz#b2f5c77ef97148f4b4f6e22682e10bba8667cff1" dependencies: @@ -7073,6 +7148,16 @@ stream-http@^2.3.1: to-arraybuffer "^1.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: version "1.1.0" 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: 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: version "0.0.28" 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" 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: version "1.0.2" 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" 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: version "0.11.0" 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" 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: version "1.0.0" 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" 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: version "8.2.2" 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: version "0.1.27" resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.27.tgz#d501f97b3bdb403af8ef9ecc20573187aadac0e9"