Repository: uber-web/baseui
Pull request #161 (2018-08-29 17:40:57)

build(components): remove rollup
https://github.com/uber-web/baseui/issues/104


Patch:
diff --git a/.eslintignore b/.eslintignore
index 584e9c917..cdc4115df 100644
--- a/.eslintignore
+++ b/.eslintignore
@@ -4,3 +4,4 @@ flow-typed
 storybook-static
 coverage
 docs
+webpack.e2e.config.js
diff --git a/.storybook/config.js b/.storybook/config.js
index da26eca9e..656b25ab6 100644
--- a/.storybook/config.js
+++ b/.storybook/config.js
@@ -16,7 +16,7 @@ setOptions({
 const engine = new Styletron();
 
 // automatically import all files ending in *.stories.js
-const req = require.context('../src/components', true, /.stories.js$/);
+const req = require.context('../src', true, /.stories.js$/);
 function loadStories() {
   require('../src/welcome.stories.js');
   req.keys().forEach(filename => req(filename));
diff --git a/flow-typed/npm/rollup-plugin-babel_vx.x.x.js b/flow-typed/npm/rollup-plugin-babel_vx.x.x.js
deleted file mode 100644
index d1a76d206..000000000
--- a/flow-typed/npm/rollup-plugin-babel_vx.x.x.js
+++ /dev/null
@@ -1,78 +0,0 @@
-// flow-typed signature: adf9f11ee630b4812a46efc11559e324
-// flow-typed version: <<STUB>>/rollup-plugin-babel_v^3.0.3/flow_v0.67.1
-
-/**
- * This is an autogenerated libdef stub for:
- *
- *   'rollup-plugin-babel'
- *
- * Fill this stub out by replacing all the `any` types.
- *
- * Once filled out, we encourage you to share your work with the
- * community by sending a pull request to:
- * https://github.com/flowtype/flow-typed
- */
-
-declare module 'rollup-plugin-babel' {
-  declare module.exports: any;
-}
-
-/**
- * We include stubs for each file inside this npm package in case you need to
- * require those files directly. Feel free to delete any files that aren't
- * needed.
- */
-declare module 'rollup-plugin-babel/dist/rollup-plugin-babel.cjs' {
-  declare module.exports: any;
-}
-
-declare module 'rollup-plugin-babel/dist/rollup-plugin-babel.es' {
-  declare module.exports: any;
-}
-
-declare module 'rollup-plugin-babel/src/constants' {
-  declare module.exports: any;
-}
-
-declare module 'rollup-plugin-babel/src/helperPlugin' {
-  declare module.exports: any;
-}
-
-declare module 'rollup-plugin-babel/src/index' {
-  declare module.exports: any;
-}
-
-declare module 'rollup-plugin-babel/src/preflightCheck' {
-  declare module.exports: any;
-}
-
-declare module 'rollup-plugin-babel/src/utils' {
-  declare module.exports: any;
-}
-
-// Filename aliases
-declare module 'rollup-plugin-babel/dist/rollup-plugin-babel.cjs.js' {
-  declare module.exports: $Exports<
-    'rollup-plugin-babel/dist/rollup-plugin-babel.cjs'
-  >;
-}
-declare module 'rollup-plugin-babel/dist/rollup-plugin-babel.es.js' {
-  declare module.exports: $Exports<
-    'rollup-plugin-babel/dist/rollup-plugin-babel.es'
-  >;
-}
-declare module 'rollup-plugin-babel/src/constants.js' {
-  declare module.exports: $Exports<'rollup-plugin-babel/src/constants'>;
-}
-declare module 'rollup-plugin-babel/src/helperPlugin.js' {
-  declare module.exports: $Exports<'rollup-plugin-babel/src/helperPlugin'>;
-}
-declare module 'rollup-plugin-babel/src/index.js' {
-  declare module.exports: $Exports<'rollup-plugin-babel/src/index'>;
-}
-declare module 'rollup-plugin-babel/src/preflightCheck.js' {
-  declare module.exports: $Exports<'rollup-plugin-babel/src/preflightCheck'>;
-}
-declare module 'rollup-plugin-babel/src/utils.js' {
-  declare module.exports: $Exports<'rollup-plugin-babel/src/utils'>;
-}
diff --git a/flow-typed/npm/rollup-plugin-filesize_vx.x.x.js b/flow-typed/npm/rollup-plugin-filesize_vx.x.x.js
deleted file mode 100644
index 0b7b88b8b..000000000
--- a/flow-typed/npm/rollup-plugin-filesize_vx.x.x.js
+++ /dev/null
@@ -1,39 +0,0 @@
-// flow-typed signature: 7c0c6f34194627ac12478be467a12656
-// flow-typed version: <<STUB>>/rollup-plugin-filesize_v^1.5.0/flow_v0.67.1
-
-/**
- * This is an autogenerated libdef stub for:
- *
- *   'rollup-plugin-filesize'
- *
- * Fill this stub out by replacing all the `any` types.
- *
- * Once filled out, we encourage you to share your work with the
- * community by sending a pull request to:
- * https://github.com/flowtype/flow-typed
- */
-
-declare module 'rollup-plugin-filesize' {
-  declare module.exports: any;
-}
-
-/**
- * We include stubs for each file inside this npm package in case you need to
- * require those files directly. Feel free to delete any files that aren't
- * needed.
- */
-declare module 'rollup-plugin-filesize/dist/index' {
-  declare module.exports: any;
-}
-
-declare module 'rollup-plugin-filesize/src/index' {
-  declare module.exports: any;
-}
-
-// Filename aliases
-declare module 'rollup-plugin-filesize/dist/index.js' {
-  declare module.exports: $Exports<'rollup-plugin-filesize/dist/index'>;
-}
-declare module 'rollup-plugin-filesize/src/index.js' {
-  declare module.exports: $Exports<'rollup-plugin-filesize/src/index'>;
-}
diff --git a/flow-typed/npm/rollup-plugin-node-resolve_vx.x.x.js b/flow-typed/npm/rollup-plugin-node-resolve_vx.x.x.js
deleted file mode 100644
index c7f7839f8..000000000
--- a/flow-typed/npm/rollup-plugin-node-resolve_vx.x.x.js
+++ /dev/null
@@ -1,57 +0,0 @@
-// flow-typed signature: 16611b0387935bf52dd8d3dab50a1907
-// flow-typed version: <<STUB>>/rollup-plugin-node-resolve_v^3.3.0/flow_v0.67.1
-
-/**
- * This is an autogenerated libdef stub for:
- *
- *   'rollup-plugin-node-resolve'
- *
- * Fill this stub out by replacing all the `any` types.
- *
- * Once filled out, we encourage you to share your work with the
- * community by sending a pull request to:
- * https://github.com/flowtype/flow-typed
- */
-
-declare module 'rollup-plugin-node-resolve' {
-  declare module.exports: any;
-}
-
-/**
- * We include stubs for each file inside this npm package in case you need to
- * require those files directly. Feel free to delete any files that aren't
- * needed.
- */
-declare module 'rollup-plugin-node-resolve/dist/rollup-plugin-node-resolve.cjs' {
-  declare module.exports: any;
-}
-
-declare module 'rollup-plugin-node-resolve/dist/rollup-plugin-node-resolve.es' {
-  declare module.exports: any;
-}
-
-declare module 'rollup-plugin-node-resolve/src/empty' {
-  declare module.exports: any;
-}
-
-declare module 'rollup-plugin-node-resolve/src/index' {
-  declare module.exports: any;
-}
-
-// Filename aliases
-declare module 'rollup-plugin-node-resolve/dist/rollup-plugin-node-resolve.cjs.js' {
-  declare module.exports: $Exports<
-    'rollup-plugin-node-resolve/dist/rollup-plugin-node-resolve.cjs'
-  >;
-}
-declare module 'rollup-plugin-node-resolve/dist/rollup-plugin-node-resolve.es.js' {
-  declare module.exports: $Exports<
-    'rollup-plugin-node-resolve/dist/rollup-plugin-node-resolve.es'
-  >;
-}
-declare module 'rollup-plugin-node-resolve/src/empty.js' {
-  declare module.exports: $Exports<'rollup-plugin-node-resolve/src/empty'>;
-}
-declare module 'rollup-plugin-node-resolve/src/index.js' {
-  declare module.exports: $Exports<'rollup-plugin-node-resolve/src/index'>;
-}
diff --git a/flow-typed/npm/rollup-plugin-progress_vx.x.x.js b/flow-typed/npm/rollup-plugin-progress_vx.x.x.js
deleted file mode 100644
index acfd4b1cf..000000000
--- a/flow-typed/npm/rollup-plugin-progress_vx.x.x.js
+++ /dev/null
@@ -1,43 +0,0 @@
-// flow-typed signature: 7ead1fab12205547712fb9302cbab520
-// flow-typed version: <<STUB>>/rollup-plugin-progress_v^0.4.0/flow_v0.67.1
-
-/**
- * This is an autogenerated libdef stub for:
- *
- *   'rollup-plugin-progress'
- *
- * Fill this stub out by replacing all the `any` types.
- *
- * Once filled out, we encourage you to share your work with the
- * community by sending a pull request to:
- * https://github.com/flowtype/flow-typed
- */
-
-declare module 'rollup-plugin-progress' {
-  declare module.exports: any;
-}
-
-/**
- * We include stubs for each file inside this npm package in case you need to
- * require those files directly. Feel free to delete any files that aren't
- * needed.
- */
-declare module 'rollup-plugin-progress/dist/rollup-plugin-progress.esm' {
-  declare module.exports: any;
-}
-
-declare module 'rollup-plugin-progress/dist/rollup-plugin-progress' {
-  declare module.exports: any;
-}
-
-// Filename aliases
-declare module 'rollup-plugin-progress/dist/rollup-plugin-progress.esm.js' {
-  declare module.exports: $Exports<
-    'rollup-plugin-progress/dist/rollup-plugin-progress.esm'
-  >;
-}
-declare module 'rollup-plugin-progress/dist/rollup-plugin-progress.js' {
-  declare module.exports: $Exports<
-    'rollup-plugin-progress/dist/rollup-plugin-progress'
-  >;
-}
diff --git a/flow-typed/npm/rollup-plugin-visualizer_vx.x.x.js b/flow-typed/npm/rollup-plugin-visualizer_vx.x.x.js
deleted file mode 100644
index ccb66285c..000000000
--- a/flow-typed/npm/rollup-plugin-visualizer_vx.x.x.js
+++ /dev/null
@@ -1,39 +0,0 @@
-// flow-typed signature: 6f24d229d9b6b42fcef09c680ed5469f
-// flow-typed version: <<STUB>>/rollup-plugin-visualizer_v^0.4.0/flow_v0.67.1
-
-/**
- * This is an autogenerated libdef stub for:
- *
- *   'rollup-plugin-visualizer'
- *
- * Fill this stub out by replacing all the `any` types.
- *
- * Once filled out, we encourage you to share your work with the
- * community by sending a pull request to:
- * https://github.com/flowtype/flow-typed
- */
-
-declare module 'rollup-plugin-visualizer' {
-  declare module.exports: any;
-}
-
-/**
- * We include stubs for each file inside this npm package in case you need to
- * require those files directly. Feel free to delete any files that aren't
- * needed.
- */
-declare module 'rollup-plugin-visualizer/lib/pluginmain' {
-  declare module.exports: any;
-}
-
-declare module 'rollup-plugin-visualizer/plugin' {
-  declare module.exports: any;
-}
-
-// Filename aliases
-declare module 'rollup-plugin-visualizer/lib/pluginmain.js' {
-  declare module.exports: $Exports<'rollup-plugin-visualizer/lib/pluginmain'>;
-}
-declare module 'rollup-plugin-visualizer/plugin.js' {
-  declare module.exports: $Exports<'rollup-plugin-visualizer/plugin'>;
-}
diff --git a/flow-typed/npm/rollup_vx.x.x.js b/flow-typed/npm/rollup_vx.x.x.js
deleted file mode 100644
index f94a941e6..000000000
--- a/flow-typed/npm/rollup_vx.x.x.js
+++ /dev/null
@@ -1,46 +0,0 @@
-// flow-typed signature: 549fe5e5b86abb53032539fa3ad47a26
-// flow-typed version: <<STUB>>/rollup_v^0.57.1/flow_v0.67.1
-
-/**
- * This is an autogenerated libdef stub for:
- *
- *   'rollup'
- *
- * Fill this stub out by replacing all the `any` types.
- *
- * Once filled out, we encourage you to share your work with the
- * community by sending a pull request to:
- * https://github.com/flowtype/flow-typed
- */
-
-declare module 'rollup' {
-  declare module.exports: any;
-}
-
-/**
- * We include stubs for each file inside this npm package in case you need to
- * require those files directly. Feel free to delete any files that aren't
- * needed.
- */
-declare module 'rollup/dist/rollup.browser' {
-  declare module.exports: any;
-}
-
-declare module 'rollup/dist/rollup.es' {
-  declare module.exports: any;
-}
-
-declare module 'rollup/dist/rollup' {
-  declare module.exports: any;
-}
-
-// Filename aliases
-declare module 'rollup/dist/rollup.browser.js' {
-  declare module.exports: $Exports<'rollup/dist/rollup.browser'>;
-}
-declare module 'rollup/dist/rollup.es.js' {
-  declare module.exports: $Exports<'rollup/dist/rollup.es'>;
-}
-declare module 'rollup/dist/rollup.js' {
-  declare module.exports: $Exports<'rollup/dist/rollup'>;
-}
diff --git a/package.json b/package.json
index 0ab517eac..b0ffcfd1e 100644
--- a/package.json
+++ b/package.json
@@ -27,11 +27,15 @@
     "storybook": "start-storybook -p 6006",
     "build-storybook": "build-storybook -o docs",
     "precommit": "pretty-quick --staged && yarn run test",
-    "copy-dist-files": "cp package.json dist/package.json && cp README.md dist/README.md",
-    "build": "rm -rf dist && rollup -c rollup.config.js && node ./scripts/flow-copy-src.js && yarn copy-dist-files",
+    "prebuild": "rimraf dist",
+    "build:copy-files": "cp package.json dist/package.json && cp README.md dist/README.md",
+    "build:es2015": "cross-env NODE_ENV=production babel ./src --out-dir ./dist --ignore *.test.js",
+    "build:es2015modules": "cross-env NODE_ENV=production BABEL_ENV=modules babel ./src/index.js --out-file ./dist/index.es.js",
+    "build:es": "cross-env NODE_ENV=production BABEL_ENV=es babel ./src --out-dir ./dist/es --ignore *.test.js",
+    "build": "yarn build:es2015 && yarn build:es2015modules && yarn build:es && yarn build:copy-files",
     "unit-test": "yarn jest --coverage",
     "e2e": "node ./e2e/e2e.js",
-    "build-e2e": "rollup -c rollup.config_e2e.js",
+    "build-e2e": "webpack --config webpack.e2e.config.js --mode=production",
     "serve-e2e": "node e2e/serve.js",
     "release": "yarn build && npm publish dist",
     "test-e2e": "jest --config=jest-e2e.config.js",
@@ -52,6 +56,7 @@
     "babel-core": "^6.26.0",
     "babel-eslint": "^9.0.0",
     "babel-jest": "^23.4.0",
+    "babel-loader": "7",
     "babel-plugin-external-helpers": "^6.22.0",
     "babel-plugin-transform-flow-strip-types": "^6.22.0",
     "babel-plugin-webpack-loaders": "^0.9.0",
@@ -62,6 +67,7 @@
     "babel-preset-stage-1": "^6.24.1",
     "chromedriver": "^2.40.0",
     "connect": "^3.6.6",
+    "cross-env": "^5.2.0",
     "enzyme": "^3.3.0",
     "enzyme-adapter-react-16": "npm:enzyme-react-adapter-future",
     "enzyme-to-json": "^3.3.4",
@@ -84,22 +90,16 @@
     "pretty-quick": "^1.4.1",
     "react": "^16.4.0",
     "react-dom": "^16.4.0",
-    "rollup": "^0.65.0",
-    "rollup-plugin-babel": "^3.0.7",
-    "rollup-plugin-commonjs": "^9.1.4",
-    "rollup-plugin-filesize": "^4.0.1",
-    "rollup-plugin-json": "^3.0.0",
-    "rollup-plugin-node-resolve": "^3.3.0",
-    "rollup-plugin-progress": "^0.4.0",
-    "rollup-plugin-replace": "^2.0.0",
-    "rollup-plugin-visualizer": "^0.9.0",
+    "rimraf": "^2.6.2",
     "selenium-webdriver": "^4.0.0-alpha.1",
     "serve-static": "^1.13.2",
     "storybook-readme": "^3.3.0",
     "styletron-engine-atomic": "^1.0.5",
     "styletron-react": "^4.3.0",
     "styletron-react-core": "^1.3.1",
-    "styletron-standard": "^1.0.3"
+    "styletron-standard": "^1.0.3",
+    "webpack": "^4.17.1",
+    "webpack-cli": "^3.1.0"
   },
   "dependencies": {
     "popper.js": "^1.14.3",
diff --git a/rollup.config.js b/rollup.config.js
deleted file mode 100644
index bf6220210..000000000
--- a/rollup.config.js
+++ /dev/null
@@ -1,88 +0,0 @@
-// @flow
-import babel from 'rollup-plugin-babel';
-import filesize from 'rollup-plugin-filesize';
-import nodeResolve from 'rollup-plugin-node-resolve';
-import progress from 'rollup-plugin-progress';
-import visualizer from 'rollup-plugin-visualizer';
-import commonjs from 'rollup-plugin-commonjs';
-
-import fs from 'fs';
-import path from 'path';
-
-import flowEntry from './scripts/rollup-plugin-flow-entry';
-
-function getComponents() {
-  return fs.readdirSync('./src/components').filter(filename => {
-    const {ext, name} = path.parse(filename);
-    return ext === '' && !name.startsWith('.');
-  });
-}
-
-function getConfig() {
-  return getComponents().map(component => {
-    const filePath = `${component}/index`;
-    const name = `baseui.${component}`;
-    return {
-      input: `src/components/${component}/index.js`,
-      ...getSharedConfig({filePath, name}),
-    };
-  });
-}
-
-function getSharedConfig({filePath, name}) {
-  return {
-    output: [
-      {
-        file: `dist/${filePath}.js`,
-        format: 'umd',
-        name: name,
-        exports: 'named',
-        globals: {
-          react: 'React',
-          'react-dom': 'ReactDOM',
-        },
-        sourcemap: 'inline',
-      },
-      {
-        file: `dist/${filePath}.es.js`,
-        format: 'es',
-        name: name,
-        exports: 'named',
-        globals: {
-          react: 'React',
-          'react-dom': 'ReactDOM',
-        },
-        sourcemap: 'inline',
-      },
-    ],
-    plugins: [
-      progress(),
-      nodeResolve({
-        // https://github.com/rollup/rollup-plugin-node-resolve/issues/77#issuecomment-383964286
-        only: [/^\.{0,2}\//],
-      }),
-      commonjs({
-        include: 'node_modules/**',
-        namedExports: {
-          'node_modules/create-react-context/index.js': ['createReactContext'],
-        },
-      }),
-      babel({
-        babelrc: false,
-        presets: [['es2015', {modules: false}], 'stage-1', 'react'],
-        plugins: ['external-helpers', require.resolve('./babel/cup.js')],
-      }),
-      visualizer(),
-      filesize(),
-      flowEntry(),
-    ],
-  };
-}
-
-export default [
-  {
-    input: 'src/index.js',
-    ...getSharedConfig({filePath: 'baseui', name: 'baseui'}),
-  },
-  ...getConfig(),
-];
diff --git a/scripts/rollup-plugin-flow-entry.js b/scripts/rollup-plugin-flow-entry.js
deleted file mode 100644
index 47baa13ce..000000000
--- a/scripts/rollup-plugin-flow-entry.js
+++ /dev/null
@@ -1,87 +0,0 @@
-// @flow
-import fs from 'fs';
-import path from 'path';
-
-/*
-We can consider this as well:
-https://github.com/RichieAHB/rollup-plugin-flow-defs/blob/master/src/index.js
-This code is inspired by that npm package anyway.
-
-The reason why we don't use that is because:
-* Package depends on `mkdirp`. It's just one dependency, but it's an extra dep for such a simple thing to do.
-* We cannot override the output path for the flow entry file content
-
-Hence, it's easier to write our own so we can do full modifications as needed.
- */
-
-function getFlowFileContent(filePath) {
-  /*
-  Since we're running this during rollup process, it will be relative to the main `src` directory.
-  We do not want that.
-  We want to make it point to the `src` directory that will be created with our scripts later in the build process
-  from `flow-copy-src.js`.
-
-  Hence, instead of `../src` and `../../src`, they will become `./src` and `../src` respectively.
-  */
-
-  // Find `../` pattern in the `filePath`
-  const regex = new RegExp(/\.\.\//, 'g');
-  // We want to know how many `../` is inside the file path
-  const matched = filePath.match(regex);
-  if (matched && matched.length > 0) {
-    // Check whether it's only one `../`
-    if (matched.length === 1) {
-      // Only 1, replace it with `./`
-      filePath = filePath.replace('../', './');
-    } else {
-      // Must be more than 1, then just remove one `../`
-      filePath = filePath.replace('../', '');
-    }
-  }
-  // Remove the `.js` extension, if any, so that it could point to `.js.flow` automatically
-  filePath = filePath.replace('.js', '');
-  return `// @flow
-export * from '${filePath}';`;
-}
-
-export default function flowEntry() {
-  let input;
-  return {
-    name: 'rollup-plugin-flow-entry',
-    // $FlowFixMe can't have annotations here since it's for rollup
-    options(opts) {
-      input = opts.input;
-    },
-    // $FlowFixMe can't have annotations here since it's for rollup
-    async generateBundle(opts) {
-      const {file = ''} = opts || {};
-
-      // Create file path if does not exist
-      await new Promise(resolve => {
-        const dirname = path.dirname(file);
-        if (!fs.existsSync(dirname)) {
-          fs.mkdirSync(dirname);
-        }
-        resolve('ok');
-      });
-
-      await new Promise((resolve, reject) => {
-        /*
-        path.dirname(input); // src/components/popover
-        path.basename(input); // index.js
-        path.dirname(file); // this is output, `dist/popover`
-         */
-        const relativePath = path.join(
-          path.relative(path.dirname(file), path.dirname(input)),
-          path.basename(input),
-        );
-        fs.writeFile(`${file}.flow`, getFlowFileContent(relativePath), err => {
-          if (err) {
-            reject(err);
-          }
-          resolve('ok');
-        });
-      });
-    },
-  };
-}
diff --git a/src/components/checkbox/__tests__/__snapshots__/styled-components.test.js.snap b/src/checkbox/__tests__/__snapshots__/styled-components.test.js.snap
similarity index 100%
rename from src/components/checkbox/__tests__/__snapshots__/styled-components.test.js.snap
rename to src/checkbox/__tests__/__snapshots__/styled-components.test.js.snap
diff --git a/src/components/checkbox/__tests__/checkbox.test.js b/src/checkbox/__tests__/checkbox.test.js
similarity index 100%
rename from src/components/checkbox/__tests__/checkbox.test.js
rename to src/checkbox/__tests__/checkbox.test.js
diff --git a/src/components/checkbox/__tests__/stateful-checkbox-container.test.js b/src/checkbox/__tests__/stateful-checkbox-container.test.js
similarity index 100%
rename from src/components/checkbox/__tests__/stateful-checkbox-container.test.js
rename to src/checkbox/__tests__/stateful-checkbox-container.test.js
diff --git a/src/components/checkbox/__tests__/stateful-checkbox.test.js b/src/checkbox/__tests__/stateful-checkbox.test.js
similarity index 100%
rename from src/components/checkbox/__tests__/stateful-checkbox.test.js
rename to src/checkbox/__tests__/stateful-checkbox.test.js
diff --git a/src/components/checkbox/__tests__/styled-components.test.js b/src/checkbox/__tests__/styled-components.test.js
similarity index 100%
rename from src/components/checkbox/__tests__/styled-components.test.js
rename to src/checkbox/__tests__/styled-components.test.js
diff --git a/src/components/checkbox/checkbox.js b/src/checkbox/checkbox.js
similarity index 98%
rename from src/components/checkbox/checkbox.js
rename to src/checkbox/checkbox.js
index 595c9f869..e092993a8 100644
--- a/src/components/checkbox/checkbox.js
+++ b/src/checkbox/checkbox.js
@@ -23,7 +23,7 @@ THE SOFTWARE.
 */
 // @flow
 import React from 'react';
-import {getOverride, getOverrideProps} from '../../helpers/overrides';
+import {getOverride, getOverrideProps} from '../helpers/overrides';
 import type {PropsT, DefaultPropsT, StatelessStateT} from './types';
 import {
   Checkmark as StyledCheckmark,
diff --git a/src/components/checkbox/examples.js b/src/checkbox/examples.js
similarity index 100%
rename from src/components/checkbox/examples.js
rename to src/checkbox/examples.js
diff --git a/src/components/checkbox/index.js b/src/checkbox/index.js
similarity index 100%
rename from src/components/checkbox/index.js
rename to src/checkbox/index.js
diff --git a/src/components/checkbox/stateful-checkbox-container.js b/src/checkbox/stateful-checkbox-container.js
similarity index 100%
rename from src/components/checkbox/stateful-checkbox-container.js
rename to src/checkbox/stateful-checkbox-container.js
diff --git a/src/components/checkbox/stateful-checkbox.js b/src/checkbox/stateful-checkbox.js
similarity index 100%
rename from src/components/checkbox/stateful-checkbox.js
rename to src/checkbox/stateful-checkbox.js
diff --git a/src/components/checkbox/stories.js b/src/checkbox/stories.js
similarity index 95%
rename from src/components/checkbox/stories.js
rename to src/checkbox/stories.js
index 9bcf6a27b..f841c70bd 100644
--- a/src/components/checkbox/stories.js
+++ b/src/checkbox/stories.js
@@ -26,7 +26,7 @@ THE SOFTWARE.
 import {storiesOf} from '@storybook/react';
 import {withReadme} from 'storybook-readme';
 //$FlowFixMe
-import CheckboxReadme from '../../../rfcs/checkbox-component.md';
+import CheckboxReadme from '../../rfcs/checkbox-component.md';
 import examples from './examples';
 
 //$FlowFixMe
diff --git a/src/components/checkbox/styled-components.js b/src/checkbox/styled-components.js
similarity index 99%
rename from src/components/checkbox/styled-components.js
rename to src/checkbox/styled-components.js
index ecc7099ea..24b8bc638 100644
--- a/src/components/checkbox/styled-components.js
+++ b/src/checkbox/styled-components.js
@@ -22,7 +22,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 THE SOFTWARE.
 */
 // @flow
-import {styled} from '../../styles';
+import {styled} from '../styles';
 
 function getBorderColor(props) {
   const {$disabled, $checked, $isError, $isIndeterminate, $theme} = props;
diff --git a/src/components/checkbox/types.js b/src/checkbox/types.js
similarity index 98%
rename from src/components/checkbox/types.js
rename to src/checkbox/types.js
index e4d51d37d..dc7d7e726 100644
--- a/src/components/checkbox/types.js
+++ b/src/checkbox/types.js
@@ -23,7 +23,7 @@ THE SOFTWARE.
 */
 // @flow
 
-import type {OverrideT} from '../../helpers/overrides';
+import type {OverrideT} from '../helpers/overrides';
 
 export type LabelPlacementT = 'top' | 'right' | 'bottom' | 'left';
 
diff --git a/src/components/input/__tests__/__snapshots__/base-input.test.js.snap b/src/input/__tests__/__snapshots__/base-input.test.js.snap
similarity index 100%
rename from src/components/input/__tests__/__snapshots__/base-input.test.js.snap
rename to src/input/__tests__/__snapshots__/base-input.test.js.snap
diff --git a/src/components/input/__tests__/__snapshots__/input.test.js.snap b/src/input/__tests__/__snapshots__/input.test.js.snap
similarity index 100%
rename from src/components/input/__tests__/__snapshots__/input.test.js.snap
rename to src/input/__tests__/__snapshots__/input.test.js.snap
diff --git a/src/components/input/__tests__/__snapshots__/stateful-container.test.js.snap b/src/input/__tests__/__snapshots__/stateful-container.test.js.snap
similarity index 100%
rename from src/components/input/__tests__/__snapshots__/stateful-container.test.js.snap
rename to src/input/__tests__/__snapshots__/stateful-container.test.js.snap
diff --git a/src/components/input/__tests__/__snapshots__/stateful-input.test.js.snap b/src/input/__tests__/__snapshots__/stateful-input.test.js.snap
similarity index 100%
rename from src/components/input/__tests__/__snapshots__/stateful-input.test.js.snap
rename to src/input/__tests__/__snapshots__/stateful-input.test.js.snap
diff --git a/src/components/input/__tests__/__snapshots__/styled-components.test.js.snap b/src/input/__tests__/__snapshots__/styled-components.test.js.snap
similarity index 100%
rename from src/components/input/__tests__/__snapshots__/styled-components.test.js.snap
rename to src/input/__tests__/__snapshots__/styled-components.test.js.snap
diff --git a/src/components/input/__tests__/__snapshots__/utils.test.js.snap b/src/input/__tests__/__snapshots__/utils.test.js.snap
similarity index 100%
rename from src/components/input/__tests__/__snapshots__/utils.test.js.snap
rename to src/input/__tests__/__snapshots__/utils.test.js.snap
diff --git a/src/components/input/__tests__/base-input.test.js b/src/input/__tests__/base-input.test.js
similarity index 100%
rename from src/components/input/__tests__/base-input.test.js
rename to src/input/__tests__/base-input.test.js
diff --git a/src/components/input/__tests__/input.test.js b/src/input/__tests__/input.test.js
similarity index 100%
rename from src/components/input/__tests__/input.test.js
rename to src/input/__tests__/input.test.js
diff --git a/src/components/input/__tests__/stateful-container.test.js b/src/input/__tests__/stateful-container.test.js
similarity index 100%
rename from src/components/input/__tests__/stateful-container.test.js
rename to src/input/__tests__/stateful-container.test.js
diff --git a/src/components/input/__tests__/stateful-input.test.js b/src/input/__tests__/stateful-input.test.js
similarity index 100%
rename from src/components/input/__tests__/stateful-input.test.js
rename to src/input/__tests__/stateful-input.test.js
diff --git a/src/components/input/__tests__/styled-components.test.js b/src/input/__tests__/styled-components.test.js
similarity index 100%
rename from src/components/input/__tests__/styled-components.test.js
rename to src/input/__tests__/styled-components.test.js
diff --git a/src/components/input/__tests__/utils.test.js b/src/input/__tests__/utils.test.js
similarity index 100%
rename from src/components/input/__tests__/utils.test.js
rename to src/input/__tests__/utils.test.js
diff --git a/src/components/input/base-input.js b/src/input/base-input.js
similarity index 97%
rename from src/components/input/base-input.js
rename to src/input/base-input.js
index 2472389a9..3fd14b15f 100644
--- a/src/components/input/base-input.js
+++ b/src/input/base-input.js
@@ -23,8 +23,8 @@ THE SOFTWARE.
 */
 // @flow
 import * as React from 'react';
-import getBuiId from '../../utils/get-bui-id';
-import {getOverride, getOverrideProps} from '../../helpers/overrides';
+import getBuiId from '../utils/get-bui-id';
+import {getOverride, getOverrideProps} from '../helpers/overrides';
 import type {BaseInputPropsT, InternalStateT} from './types';
 import {getSharedProps} from './utils';
 import {ADJOINED, SIZE, CUSTOM_INPUT_TYPE} from './constants';
diff --git a/src/components/input/constants.js b/src/input/constants.js
similarity index 100%
rename from src/components/input/constants.js
rename to src/input/constants.js
diff --git a/src/components/input/index.js b/src/input/index.js
similarity index 100%
rename from src/components/input/index.js
rename to src/input/index.js
diff --git a/src/components/input/input.js b/src/input/input.js
similarity index 97%
rename from src/components/input/input.js
rename to src/input/input.js
index 4989b6f20..2e6739bdf 100644
--- a/src/components/input/input.js
+++ b/src/input/input.js
@@ -23,8 +23,8 @@ THE SOFTWARE.
 */
 // @flow
 import * as React from 'react';
-import getBuiId from '../../utils/get-bui-id';
-import {getOverride, getOverrideProps} from '../../helpers/overrides';
+import getBuiId from '../utils/get-bui-id';
+import {getOverride, getOverrideProps} from '../helpers/overrides';
 import type {InputPropsT, InternalStateT, AdjoinedT} from './types';
 import {getSharedProps} from './utils';
 import BaseInput from './base-input';
diff --git a/src/components/input/stateful-container.js b/src/input/stateful-container.js
similarity index 100%
rename from src/components/input/stateful-container.js
rename to src/input/stateful-container.js
diff --git a/src/components/input/stateful-input.js b/src/input/stateful-input.js
similarity index 100%
rename from src/components/input/stateful-input.js
rename to src/input/stateful-input.js
diff --git a/src/components/input/stories.js b/src/input/stories.js
similarity index 98%
rename from src/components/input/stories.js
rename to src/input/stories.js
index 5b0b8d43c..8bc8c8e06 100644
--- a/src/components/input/stories.js
+++ b/src/input/stories.js
@@ -26,11 +26,11 @@ THE SOFTWARE.
 import * as React from 'react';
 import {storiesOf} from '@storybook/react';
 import {withStyle} from 'styletron-react';
-import {styled} from '../../styles';
-import {withProps} from '../../helpers';
+import {styled} from '../styles';
+import {withProps} from '../helpers';
 import {withReadme} from 'storybook-readme';
 //$FlowFixMe
-import InputReadme from '../../../rfcs/input-component.md';
+import InputReadme from '../../rfcs/input-component.md';
 import {
   Input as ControlledInput,
   StatefulInput as Input,
diff --git a/src/components/input/styled-components.js b/src/input/styled-components.js
similarity index 99%
rename from src/components/input/styled-components.js
rename to src/input/styled-components.js
index a89b968c3..13bfab2a5 100644
--- a/src/components/input/styled-components.js
+++ b/src/input/styled-components.js
@@ -22,7 +22,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 THE SOFTWARE.
 */
 // @flow
-import {styled} from '../../styles';
+import {styled} from '../styles';
 import {ADJOINED, SIZE, ENHANCER_POSITION} from './constants';
 import type {SharedPropsT} from './types';
 
diff --git a/src/components/input/types.js b/src/input/types.js
similarity index 97%
rename from src/components/input/types.js
rename to src/input/types.js
index e11369f57..75c571f23 100644
--- a/src/components/input/types.js
+++ b/src/input/types.js
@@ -23,8 +23,8 @@ THE SOFTWARE.
 */
 // @flow
 import * as React from 'react';
-import type {OverrideT} from '../../helpers/overrides';
-import type {ThemeT} from '../../styles';
+import type {OverrideT} from '../helpers/overrides';
+import type {ThemeT} from '../styles';
 import {STATE_CHANGE_TYPE, ADJOINED, SIZE} from './constants';
 
 type SyntheticEventT = SyntheticEvent<HTMLElement>;
diff --git a/src/components/input/utils.js b/src/input/utils.js
similarity index 100%
rename from src/components/input/utils.js
rename to src/input/utils.js
diff --git a/src/components/menu/__tests__/__snapshots__/styled-components.test.js.snap b/src/menu/__tests__/__snapshots__/styled-components.test.js.snap
similarity index 100%
rename from src/components/menu/__tests__/__snapshots__/styled-components.test.js.snap
rename to src/menu/__tests__/__snapshots__/styled-components.test.js.snap
diff --git a/src/components/menu/__tests__/menu.test.js b/src/menu/__tests__/menu.test.js
similarity index 100%
rename from src/components/menu/__tests__/menu.test.js
rename to src/menu/__tests__/menu.test.js
diff --git a/src/components/menu/__tests__/stateful-container.test.js b/src/menu/__tests__/stateful-container.test.js
similarity index 100%
rename from src/components/menu/__tests__/stateful-container.test.js
rename to src/menu/__tests__/stateful-container.test.js
diff --git a/src/components/menu/__tests__/stateful-menu.test.js b/src/menu/__tests__/stateful-menu.test.js
similarity index 100%
rename from src/components/menu/__tests__/stateful-menu.test.js
rename to src/menu/__tests__/stateful-menu.test.js
diff --git a/src/components/menu/__tests__/styled-components.test.js b/src/menu/__tests__/styled-components.test.js
similarity index 100%
rename from src/components/menu/__tests__/styled-components.test.js
rename to src/menu/__tests__/styled-components.test.js
diff --git a/src/components/menu/__tests__/utils.test.js b/src/menu/__tests__/utils.test.js
similarity index 100%
rename from src/components/menu/__tests__/utils.test.js
rename to src/menu/__tests__/utils.test.js
diff --git a/src/components/menu/constants.js b/src/menu/constants.js
similarity index 100%
rename from src/components/menu/constants.js
rename to src/menu/constants.js
diff --git a/src/components/menu/index.js b/src/menu/index.js
similarity index 100%
rename from src/components/menu/index.js
rename to src/menu/index.js
diff --git a/src/components/menu/menu.js b/src/menu/menu.js
similarity index 95%
rename from src/components/menu/menu.js
rename to src/menu/menu.js
index d0cbde578..d1b0663b5 100644
--- a/src/components/menu/menu.js
+++ b/src/menu/menu.js
@@ -7,7 +7,7 @@ import {
 } from './styled-components';
 import {STYLETRON_PROP_MAPPER} from './constants';
 import {mapStyletronProps} from './utils';
-import {getOverride} from '../../helpers/overrides';
+import {getOverride} from '../helpers/overrides';
 // Types
 import type {StatelessMenuPropsT} from './types';
 
diff --git a/src/components/menu/stateful-container.js b/src/menu/stateful-container.js
similarity index 100%
rename from src/components/menu/stateful-container.js
rename to src/menu/stateful-container.js
diff --git a/src/components/menu/stateful-menu.js b/src/menu/stateful-menu.js
similarity index 100%
rename from src/components/menu/stateful-menu.js
rename to src/menu/stateful-menu.js
diff --git a/src/components/menu/stories.js b/src/menu/stories.js
similarity index 100%
rename from src/components/menu/stories.js
rename to src/menu/stories.js
diff --git a/src/components/menu/styled-components.js b/src/menu/styled-components.js
similarity index 93%
rename from src/components/menu/styled-components.js
rename to src/menu/styled-components.js
index 6a5f8bd1b..5e595848c 100644
--- a/src/components/menu/styled-components.js
+++ b/src/menu/styled-components.js
@@ -1,7 +1,7 @@
 // @flow
-import {styled} from '../../styles';
+import {styled} from '../styles';
 
-import type {ThemeT} from '../../styles';
+import type {ThemeT} from '../styles';
 
 type StyledPropsT = {
   $theme: ThemeT,
diff --git a/src/components/menu/types.js b/src/menu/types.js
similarity index 97%
rename from src/components/menu/types.js
rename to src/menu/types.js
index 35f1f101a..e3ba31381 100644
--- a/src/components/menu/types.js
+++ b/src/menu/types.js
@@ -1,7 +1,7 @@
 // @flow
 /* eslint-disable import/prefer-default-export */
 import * as React from 'react';
-import type {OverrideT} from '../../helpers/overrides';
+import type {OverrideT} from '../helpers/overrides';
 import {STATE_CHANGE_TYPES} from './constants';
 
 export type ItemsT = Array<*>;
diff --git a/src/components/popover/examples.js b/src/popover/examples.js
similarity index 99%
rename from src/components/popover/examples.js
rename to src/popover/examples.js
index 111e2d448..5eba79173 100644
--- a/src/components/popover/examples.js
+++ b/src/popover/examples.js
@@ -25,7 +25,7 @@ THE SOFTWARE.
 import React from 'react';
 import {boolean, number} from '@storybook/addon-knobs';
 
-import {styled} from '../../styles';
+import {styled} from '../styles';
 import {
   PLACEMENT,
   TRIGGER_TYPE,
diff --git a/src/components/popover/index.js b/src/popover/index.js
similarity index 100%
rename from src/components/popover/index.js
rename to src/popover/index.js
diff --git a/src/components/popover/popover.js b/src/popover/popover.js
similarity index 99%
rename from src/components/popover/popover.js
rename to src/popover/popover.js
index b40c5bf63..8dbb4a9b7 100644
--- a/src/components/popover/popover.js
+++ b/src/popover/popover.js
@@ -27,8 +27,8 @@ import * as React from 'react';
 import ReactDOM from 'react-dom';
 
 import Popper from 'popper.js';
-import {getOverride, getOverrideProps} from '../../helpers/overrides';
-import getBuiId from '../../utils/get-bui-id';
+import {getOverride, getOverrideProps} from '../helpers/overrides';
+import getBuiId from '../utils/get-bui-id';
 import {ACCESSIBILITY_TYPE, PLACEMENT, TRIGGER_TYPE} from './constants';
 import {
   Arrow as StyledArrow,
diff --git a/src/components/popover/stateful-container.js b/src/popover/stateful-container.js
similarity index 100%
rename from src/components/popover/stateful-container.js
rename to src/popover/stateful-container.js
diff --git a/src/components/popover/stateful-popover.js b/src/popover/stateful-popover.js
similarity index 100%
rename from src/components/popover/stateful-popover.js
rename to src/popover/stateful-popover.js
diff --git a/src/components/popover/stories.js b/src/popover/stories.js
similarity index 95%
rename from src/components/popover/stories.js
rename to src/popover/stories.js
index 6045ebff0..7ad55d9ed 100644
--- a/src/components/popover/stories.js
+++ b/src/popover/stories.js
@@ -28,7 +28,7 @@ import {withReadme} from 'storybook-readme';
 import examples from './examples';
 
 //$FlowFixMe
-import PopoverReadme from '../../../rfcs/popover-component.md';
+import PopoverReadme from '../../rfcs/popover-component.md';
 
 Object.entries(examples).forEach(([description, example]) =>
   storiesOf('Popover', module)
diff --git a/src/components/popover/styled-components.js b/src/popover/styled-components.js
similarity index 99%
rename from src/components/popover/styled-components.js
rename to src/popover/styled-components.js
index 8ed078823..3b0402efc 100644
--- a/src/components/popover/styled-components.js
+++ b/src/popover/styled-components.js
@@ -22,7 +22,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 THE SOFTWARE.
 */
 // @flow
-import {styled} from '../../styles';
+import {styled} from '../styles';
 import {ARROW_WIDTH} from './constants';
 import {
   getPopoverMarginStyles,
diff --git a/src/components/popover/types.js b/src/popover/types.js
similarity index 98%
rename from src/components/popover/types.js
rename to src/popover/types.js
index c682a55ab..02aab909e 100644
--- a/src/components/popover/types.js
+++ b/src/popover/types.js
@@ -24,8 +24,8 @@ THE SOFTWARE.
 // @flow
 /* eslint-disable flowtype/generic-spacing */
 import * as React from 'react';
-import type {ThemeT} from '../../styles/types';
-import type {OverrideT} from '../../helpers/overrides';
+import type {ThemeT} from '../styles/types';
+import type {OverrideT} from '../helpers/overrides';
 import {
   ACCESSIBILITY_TYPE,
   PLACEMENT,
diff --git a/src/components/popover/utils.js b/src/popover/utils.js
similarity index 100%
rename from src/components/popover/utils.js
rename to src/popover/utils.js
diff --git a/src/components/radio/__tests__/__snapshots__/styled-components.test.js.snap b/src/radio/__tests__/__snapshots__/styled-components.test.js.snap
similarity index 100%
rename from src/components/radio/__tests__/__snapshots__/styled-components.test.js.snap
rename to src/radio/__tests__/__snapshots__/styled-components.test.js.snap
diff --git a/src/components/radio/__tests__/stateful-radiogroup-container.test.js b/src/radio/__tests__/stateful-radiogroup-container.test.js
similarity index 100%
rename from src/components/radio/__tests__/stateful-radiogroup-container.test.js
rename to src/radio/__tests__/stateful-radiogroup-container.test.js
diff --git a/src/components/radio/__tests__/stateful-radiogroup.test.js b/src/radio/__tests__/stateful-radiogroup.test.js
similarity index 100%
rename from src/components/radio/__tests__/stateful-radiogroup.test.js
rename to src/radio/__tests__/stateful-radiogroup.test.js
diff --git a/src/components/radio/__tests__/styled-components.test.js b/src/radio/__tests__/styled-components.test.js
similarity index 100%
rename from src/components/radio/__tests__/styled-components.test.js
rename to src/radio/__tests__/styled-components.test.js
diff --git a/src/components/radio/constants.js b/src/radio/constants.js
similarity index 100%
rename from src/components/radio/constants.js
rename to src/radio/constants.js
diff --git a/src/components/radio/examples.js b/src/radio/examples.js
similarity index 100%
rename from src/components/radio/examples.js
rename to src/radio/examples.js
diff --git a/src/components/radio/index.js b/src/radio/index.js
similarity index 100%
rename from src/components/radio/index.js
rename to src/radio/index.js
diff --git a/src/components/radio/radio.js b/src/radio/radio.js
similarity index 100%
rename from src/components/radio/radio.js
rename to src/radio/radio.js
diff --git a/src/components/radio/radiogroup.js b/src/radio/radiogroup.js
similarity index 100%
rename from src/components/radio/radiogroup.js
rename to src/radio/radiogroup.js
diff --git a/src/components/radio/radiogroup.test.js b/src/radio/radiogroup.test.js
similarity index 100%
rename from src/components/radio/radiogroup.test.js
rename to src/radio/radiogroup.test.js
diff --git a/src/components/radio/radiogroup1.test.js b/src/radio/radiogroup1.test.js
similarity index 100%
rename from src/components/radio/radiogroup1.test.js
rename to src/radio/radiogroup1.test.js
diff --git a/src/components/radio/stateful-radiogroup-container.js b/src/radio/stateful-radiogroup-container.js
similarity index 100%
rename from src/components/radio/stateful-radiogroup-container.js
rename to src/radio/stateful-radiogroup-container.js
diff --git a/src/components/radio/stateful-radiogroup.js b/src/radio/stateful-radiogroup.js
similarity index 100%
rename from src/components/radio/stateful-radiogroup.js
rename to src/radio/stateful-radiogroup.js
diff --git a/src/components/radio/stories.js b/src/radio/stories.js
similarity index 95%
rename from src/components/radio/stories.js
rename to src/radio/stories.js
index 6f05baa40..11dcf1a3e 100644
--- a/src/components/radio/stories.js
+++ b/src/radio/stories.js
@@ -26,7 +26,7 @@ THE SOFTWARE.
 import {storiesOf} from '@storybook/react';
 import {withReadme} from 'storybook-readme';
 //$FlowFixMe
-import RadioGroupReadme from '../../../rfcs/radiogroup-component.md';
+import RadioGroupReadme from '../../rfcs/radiogroup-component.md';
 import examples from './examples';
 
 //$FlowFixMe
diff --git a/src/components/radio/styled-components.js b/src/radio/styled-components.js
similarity index 98%
rename from src/components/radio/styled-components.js
rename to src/radio/styled-components.js
index 45dd6ba76..3ab27d5df 100644
--- a/src/components/radio/styled-components.js
+++ b/src/radio/styled-components.js
@@ -22,7 +22,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 THE SOFTWARE.
 */
 // @flow
-import {styled} from '../../styles/index';
+import {styled} from '../styles/index';
 
 function getBorderColor(props) {
   const {$checked, $isError, $theme} = props;
diff --git a/src/components/radio/types.js b/src/radio/types.js
similarity index 96%
rename from src/components/radio/types.js
rename to src/radio/types.js
index 7c3a648a3..f97c95fed 100644
--- a/src/components/radio/types.js
+++ b/src/radio/types.js
@@ -23,8 +23,8 @@ THE SOFTWARE.
 */
 // @flow
 
-import type {OverrideT} from '../../helpers/overrides';
-import type {ThemeT} from '../../styles/types';
+import type {OverrideT} from '../helpers/overrides';
+import type {ThemeT} from '../styles/types';
 
 export type LabelPlacementT = 'top' | 'right' | 'bottom' | 'left';
 
diff --git a/src/components/textarea/__tests__/__snapshots__/stateful-textarea.test.js.snap b/src/textarea/__tests__/__snapshots__/stateful-textarea.test.js.snap
similarity index 100%
rename from src/components/textarea/__tests__/__snapshots__/stateful-textarea.test.js.snap
rename to src/textarea/__tests__/__snapshots__/stateful-textarea.test.js.snap
diff --git a/src/components/textarea/__tests__/__snapshots__/styled-components.test.js.snap b/src/textarea/__tests__/__snapshots__/styled-components.test.js.snap
similarity index 100%
rename from src/components/textarea/__tests__/__snapshots__/styled-components.test.js.snap
rename to src/textarea/__tests__/__snapshots__/styled-components.test.js.snap
diff --git a/src/components/textarea/__tests__/__snapshots__/textarea.test.js.snap b/src/textarea/__tests__/__snapshots__/textarea.test.js.snap
similarity index 100%
rename from src/components/textarea/__tests__/__snapshots__/textarea.test.js.snap
rename to src/textarea/__tests__/__snapshots__/textarea.test.js.snap
diff --git a/src/components/textarea/__tests__/stateful-textarea.test.js b/src/textarea/__tests__/stateful-textarea.test.js
similarity index 100%
rename from src/components/textarea/__tests__/stateful-textarea.test.js
rename to src/textarea/__tests__/stateful-textarea.test.js
diff --git a/src/components/textarea/__tests__/styled-components.test.js b/src/textarea/__tests__/styled-components.test.js
similarity index 100%
rename from src/components/textarea/__tests__/styled-components.test.js
rename to src/textarea/__tests__/styled-components.test.js
diff --git a/src/components/textarea/__tests__/textarea.test.js b/src/textarea/__tests__/textarea.test.js
similarity index 100%
rename from src/components/textarea/__tests__/textarea.test.js
rename to src/textarea/__tests__/textarea.test.js
diff --git a/src/components/textarea/constants.js b/src/textarea/constants.js
similarity index 100%
rename from src/components/textarea/constants.js
rename to src/textarea/constants.js
diff --git a/src/components/textarea/examples.js b/src/textarea/examples.js
similarity index 97%
rename from src/components/textarea/examples.js
rename to src/textarea/examples.js
index f49b7b8ee..56b6081ac 100644
--- a/src/components/textarea/examples.js
+++ b/src/textarea/examples.js
@@ -1,8 +1,8 @@
 // @flow
 import * as React from 'react';
 import {withStyle} from 'styletron-react';
-import {styled} from '../../styles';
-import {withProps} from '../../helpers';
+import {styled} from '../styles';
+import {withProps} from '../helpers';
 import {
   StatefulTextarea as Textarea,
   Textarea as ControlledTextarea,
diff --git a/src/components/textarea/index.js b/src/textarea/index.js
similarity index 100%
rename from src/components/textarea/index.js
rename to src/textarea/index.js
diff --git a/src/components/textarea/stateful-container.js b/src/textarea/stateful-container.js
similarity index 100%
rename from src/components/textarea/stateful-container.js
rename to src/textarea/stateful-container.js
diff --git a/src/components/textarea/stateful-textarea.js b/src/textarea/stateful-textarea.js
similarity index 100%
rename from src/components/textarea/stateful-textarea.js
rename to src/textarea/stateful-textarea.js
diff --git a/src/components/textarea/stories.js b/src/textarea/stories.js
similarity index 84%
rename from src/components/textarea/stories.js
rename to src/textarea/stories.js
index 7e8e179db..046696af9 100644
--- a/src/components/textarea/stories.js
+++ b/src/textarea/stories.js
@@ -5,7 +5,7 @@ import {withReadme} from 'storybook-readme';
 import examples from './examples';
 
 //$FlowFixMe
-import TextareaReadme from '../../../rfcs/textarea-component.md';
+import TextareaReadme from '../../rfcs/textarea-component.md';
 
 Object.entries(examples).forEach(([description, example]) =>
   storiesOf('Textarea', module)
diff --git a/src/components/textarea/styled-components.js b/src/textarea/styled-components.js
similarity index 89%
rename from src/components/textarea/styled-components.js
rename to src/textarea/styled-components.js
index cdc8a841f..dd0ed3c2b 100644
--- a/src/components/textarea/styled-components.js
+++ b/src/textarea/styled-components.js
@@ -1,5 +1,5 @@
 // @flow
-import {styled} from '../../styles';
+import {styled} from '../styles';
 import {
   getInputStyles,
   getInputContainerStyles,
diff --git a/src/components/textarea/textarea.js b/src/textarea/textarea.js
similarity index 90%
rename from src/components/textarea/textarea.js
rename to src/textarea/textarea.js
index 339ee2382..ceac7e5c9 100644
--- a/src/components/textarea/textarea.js
+++ b/src/textarea/textarea.js
@@ -1,8 +1,8 @@
 // @flow
 import * as React from 'react';
 import type {TextareaPropsT} from './types';
-import {mergeOverrides} from '../../helpers/overrides';
-import getBuiId from '../../utils/get-bui-id';
+import {mergeOverrides} from '../helpers/overrides';
+import getBuiId from '../utils/get-bui-id';
 import {BaseInput, SIZE, CUSTOM_INPUT_TYPE} from '../input';
 import {
   Textarea as StyledTextarea,
diff --git a/src/components/textarea/types.js b/src/textarea/types.js
similarity index 90%
rename from src/components/textarea/types.js
rename to src/textarea/types.js
index e8705ec62..5506f3c7d 100644
--- a/src/components/textarea/types.js
+++ b/src/textarea/types.js
@@ -2,8 +2,8 @@
 import * as React from 'react';
 import type {BaseInputPropsT, StateReducerT, StateT} from '../input/types';
 import {SIZE} from '../input/constants';
-import type {OverrideT} from '../../helpers/overrides';
-import type {ThemeT} from '../../styles/types';
+import type {OverrideT} from '../helpers/overrides';
+import type {ThemeT} from '../styles/types';
 
 type SyntheticTextareaEvent = SyntheticEvent<HTMLElement>;
 
diff --git a/src/components/tooltip/__tests__/__snapshots__/stateful-tooltip.test.js.snap b/src/tooltip/__tests__/__snapshots__/stateful-tooltip.test.js.snap
similarity index 100%
rename from src/components/tooltip/__tests__/__snapshots__/stateful-tooltip.test.js.snap
rename to src/tooltip/__tests__/__snapshots__/stateful-tooltip.test.js.snap
diff --git a/src/components/tooltip/__tests__/__snapshots__/styled-components.test.js.snap b/src/tooltip/__tests__/__snapshots__/styled-components.test.js.snap
similarity index 100%
rename from src/components/tooltip/__tests__/__snapshots__/styled-components.test.js.snap
rename to src/tooltip/__tests__/__snapshots__/styled-components.test.js.snap
diff --git a/src/components/tooltip/__tests__/stateful-tooltip-container.test.js b/src/tooltip/__tests__/stateful-tooltip-container.test.js
similarity index 100%
rename from src/components/tooltip/__tests__/stateful-tooltip-container.test.js
rename to src/tooltip/__tests__/stateful-tooltip-container.test.js
diff --git a/src/components/tooltip/__tests__/stateful-tooltip.test.js b/src/tooltip/__tests__/stateful-tooltip.test.js
similarity index 100%
rename from src/components/tooltip/__tests__/stateful-tooltip.test.js
rename to src/tooltip/__tests__/stateful-tooltip.test.js
diff --git a/src/components/tooltip/__tests__/styled-components.test.js b/src/tooltip/__tests__/styled-components.test.js
similarity index 100%
rename from src/components/tooltip/__tests__/styled-components.test.js
rename to src/tooltip/__tests__/styled-components.test.js
diff --git a/src/components/tooltip/__tests__/tooltip.test.js b/src/tooltip/__tests__/tooltip.test.js
similarity index 100%
rename from src/components/tooltip/__tests__/tooltip.test.js
rename to src/tooltip/__tests__/tooltip.test.js
diff --git a/src/components/tooltip/constants.js b/src/tooltip/constants.js
similarity index 100%
rename from src/components/tooltip/constants.js
rename to src/tooltip/constants.js
diff --git a/src/components/tooltip/default-props.js b/src/tooltip/default-props.js
similarity index 100%
rename from src/components/tooltip/default-props.js
rename to src/tooltip/default-props.js
diff --git a/src/components/tooltip/examples.js b/src/tooltip/examples.js
similarity index 99%
rename from src/components/tooltip/examples.js
rename to src/tooltip/examples.js
index c4bb9b01f..9a72ff296 100644
--- a/src/components/tooltip/examples.js
+++ b/src/tooltip/examples.js
@@ -23,7 +23,7 @@ THE SOFTWARE.
 */
 // @flow
 import React from 'react';
-import {styled} from '../../styles';
+import {styled} from '../styles';
 import {Button} from '../popover/examples';
 import {StatefulTooltip, TRIGGER_TYPE, PLACEMENT} from './index';
 
diff --git a/src/components/tooltip/index.js b/src/tooltip/index.js
similarity index 100%
rename from src/components/tooltip/index.js
rename to src/tooltip/index.js
diff --git a/src/components/tooltip/stateful-tooltip-container.js b/src/tooltip/stateful-tooltip-container.js
similarity index 100%
rename from src/components/tooltip/stateful-tooltip-container.js
rename to src/tooltip/stateful-tooltip-container.js
diff --git a/src/components/tooltip/stateful-tooltip.js b/src/tooltip/stateful-tooltip.js
similarity index 100%
rename from src/components/tooltip/stateful-tooltip.js
rename to src/tooltip/stateful-tooltip.js
diff --git a/src/components/tooltip/stories.js b/src/tooltip/stories.js
similarity index 95%
rename from src/components/tooltip/stories.js
rename to src/tooltip/stories.js
index 20da489eb..6a8e90a6e 100644
--- a/src/components/tooltip/stories.js
+++ b/src/tooltip/stories.js
@@ -28,7 +28,7 @@ import {withReadme} from 'storybook-readme';
 import examples from './examples';
 
 //$FlowFixMe
-import TooltipReadme from '../../../rfcs/tooltip-component.md';
+import TooltipReadme from '../../rfcs/tooltip-component.md';
 
 examples.forEach(({description, example}) =>
   storiesOf('Tooltip', module)
diff --git a/src/components/tooltip/styled-components.js b/src/tooltip/styled-components.js
similarity index 98%
rename from src/components/tooltip/styled-components.js
rename to src/tooltip/styled-components.js
index 8caa9d373..0f8a9789d 100644
--- a/src/components/tooltip/styled-components.js
+++ b/src/tooltip/styled-components.js
@@ -22,7 +22,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 THE SOFTWARE.
 */
 // @flow
-import {styled} from '../../styles';
+import {styled} from '../styles';
 import {
   getBodyStyles,
   getArrowStyles,
diff --git a/src/components/tooltip/tooltip.js b/src/tooltip/tooltip.js
similarity index 97%
rename from src/components/tooltip/tooltip.js
rename to src/tooltip/tooltip.js
index 14538a20c..e01de2138 100644
--- a/src/components/tooltip/tooltip.js
+++ b/src/tooltip/tooltip.js
@@ -25,7 +25,7 @@ THE SOFTWARE.
 /* eslint-disable react/no-find-dom-node */
 import * as React from 'react';
 import {Popover} from '../popover/index';
-import {mergeOverrides} from '../../helpers/overrides';
+import {mergeOverrides} from '../helpers/overrides';
 import baseDefaultProps from './default-props';
 import type {TooltipPropsT} from './types';
 import {
diff --git a/yarn.lock b/yarn.lock
index 0ed2e38d2..5ab20edb2 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -467,14 +467,146 @@
     react-split-pane "^0.1.77"
     react-treebeard "^2.1.0"
 
-"@types/estree@0.0.39":
-  version "0.0.39"
-  resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f"
-
 "@types/node@*":
   version "10.5.7"
   resolved "https://registry.yarnpkg.com/@types/node/-/node-10.5.7.tgz#960d9feb3ade2233bcc9843c918d740b4f78a7cf"
 
+"@webassemblyjs/ast@1.5.13":
+  version "1.5.13"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.5.13.tgz#81155a570bd5803a30ec31436bc2c9c0ede38f25"
+  dependencies:
+    "@webassemblyjs/helper-module-context" "1.5.13"
+    "@webassemblyjs/helper-wasm-bytecode" "1.5.13"
+    "@webassemblyjs/wast-parser" "1.5.13"
+    debug "^3.1.0"
+    mamacro "^0.0.3"
+
+"@webassemblyjs/floating-point-hex-parser@1.5.13":
+  version "1.5.13"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.5.13.tgz#29ce0baa97411f70e8cce68ce9c0f9d819a4e298"
+
+"@webassemblyjs/helper-api-error@1.5.13":
+  version "1.5.13"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.5.13.tgz#e49b051d67ee19a56e29b9aa8bd949b5b4442a59"
+
+"@webassemblyjs/helper-buffer@1.5.13":
+  version "1.5.13"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.5.13.tgz#873bb0a1b46449231137c1262ddfd05695195a1e"
+  dependencies:
+    debug "^3.1.0"
+
+"@webassemblyjs/helper-code-frame@1.5.13":
+  version "1.5.13"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.5.13.tgz#1bd2181b6a0be14e004f0fe9f5a660d265362b58"
+  dependencies:
+    "@webassemblyjs/wast-printer" "1.5.13"
+
+"@webassemblyjs/helper-fsm@1.5.13":
+  version "1.5.13"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.5.13.tgz#cdf3d9d33005d543a5c5e5adaabf679ffa8db924"
+
+"@webassemblyjs/helper-module-context@1.5.13":
+  version "1.5.13"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.5.13.tgz#dc29ddfb51ed657655286f94a5d72d8a489147c5"
+  dependencies:
+    debug "^3.1.0"
+    mamacro "^0.0.3"
+
+"@webassemblyjs/helper-wasm-bytecode@1.5.13":
+  version "1.5.13"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.5.13.tgz#03245817f0a762382e61733146f5773def15a747"
+
+"@webassemblyjs/helper-wasm-section@1.5.13":
+  version "1.5.13"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.5.13.tgz#efc76f44a10d3073b584b43c38a179df173d5c7d"
+  dependencies:
+    "@webassemblyjs/ast" "1.5.13"
+    "@webassemblyjs/helper-buffer" "1.5.13"
+    "@webassemblyjs/helper-wasm-bytecode" "1.5.13"
+    "@webassemblyjs/wasm-gen" "1.5.13"
+    debug "^3.1.0"
+
+"@webassemblyjs/ieee754@1.5.13":
+  version "1.5.13"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.5.13.tgz#573e97c8c12e4eebb316ca5fde0203ddd90b0364"
+  dependencies:
+    ieee754 "^1.1.11"
+
+"@webassemblyjs/leb128@1.5.13":
+  version "1.5.13"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.5.13.tgz#ab52ebab9cec283c1c1897ac1da833a04a3f4cee"
+  dependencies:
+    long "4.0.0"
+
+"@webassemblyjs/utf8@1.5.13":
+  version "1.5.13"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.5.13.tgz#6b53d2cd861cf94fa99c1f12779dde692fbc2469"
+
+"@webassemblyjs/wasm-edit@1.5.13":
+  version "1.5.13"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.5.13.tgz#c9cef5664c245cf11b3b3a73110c9155831724a8"
+  dependencies:
+    "@webassemblyjs/ast" "1.5.13"
+    "@webassemblyjs/helper-buffer" "1.5.13"
+    "@webassemblyjs/helper-wasm-bytecode" "1.5.13"
+    "@webassemblyjs/helper-wasm-section" "1.5.13"
+    "@webassemblyjs/wasm-gen" "1.5.13"
+    "@webassemblyjs/wasm-opt" "1.5.13"
+    "@webassemblyjs/wasm-parser" "1.5.13"
+    "@webassemblyjs/wast-printer" "1.5.13"
+    debug "^3.1.0"
+
+"@webassemblyjs/wasm-gen@1.5.13":
+  version "1.5.13"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.5.13.tgz#8e6ea113c4b432fa66540189e79b16d7a140700e"
+  dependencies:
+    "@webassemblyjs/ast" "1.5.13"
+    "@webassemblyjs/helper-wasm-bytecode" "1.5.13"
+    "@webassemblyjs/ieee754" "1.5.13"
+    "@webassemblyjs/leb128" "1.5.13"
+    "@webassemblyjs/utf8" "1.5.13"
+
+"@webassemblyjs/wasm-opt@1.5.13":
+  version "1.5.13"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.5.13.tgz#147aad7717a7ee4211c36b21a5f4c30dddf33138"
+  dependencies:
+    "@webassemblyjs/ast" "1.5.13"
+    "@webassemblyjs/helper-buffer" "1.5.13"
+    "@webassemblyjs/wasm-gen" "1.5.13"
+    "@webassemblyjs/wasm-parser" "1.5.13"
+    debug "^3.1.0"
+
+"@webassemblyjs/wasm-parser@1.5.13":
+  version "1.5.13"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.5.13.tgz#6f46516c5bb23904fbdf58009233c2dd8a54c72f"
+  dependencies:
+    "@webassemblyjs/ast" "1.5.13"
+    "@webassemblyjs/helper-api-error" "1.5.13"
+    "@webassemblyjs/helper-wasm-bytecode" "1.5.13"
+    "@webassemblyjs/ieee754" "1.5.13"
+    "@webassemblyjs/leb128" "1.5.13"
+    "@webassemblyjs/utf8" "1.5.13"
+
+"@webassemblyjs/wast-parser@1.5.13":
+  version "1.5.13"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.5.13.tgz#5727a705d397ae6a3ae99d7f5460acf2ec646eea"
+  dependencies:
+    "@webassemblyjs/ast" "1.5.13"
+    "@webassemblyjs/floating-point-hex-parser" "1.5.13"
+    "@webassemblyjs/helper-api-error" "1.5.13"
+    "@webassemblyjs/helper-code-frame" "1.5.13"
+    "@webassemblyjs/helper-fsm" "1.5.13"
+    long "^3.2.0"
+    mamacro "^0.0.3"
+
+"@webassemblyjs/wast-printer@1.5.13":
+  version "1.5.13"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.5.13.tgz#bb34d528c14b4f579e7ec11e793ec50ad7cd7c95"
+  dependencies:
+    "@webassemblyjs/ast" "1.5.13"
+    "@webassemblyjs/wast-parser" "1.5.13"
+    long "^3.2.0"
+
 JSONStream@^1.0.4:
   version "1.3.3"
   resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.3.tgz#27b4b8fbbfeab4e71bcf551e7f27be8d952239bf"
@@ -507,6 +639,12 @@ acorn-dynamic-import@^2.0.0:
   dependencies:
     acorn "^4.0.3"
 
+acorn-dynamic-import@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz#901ceee4c7faaef7e07ad2a47e890675da50a278"
+  dependencies:
+    acorn "^5.0.0"
+
 acorn-globals@^4.1.0:
   version "4.1.0"
   resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.1.0.tgz#ab716025dbe17c54d3ef81d32ece2b2d99fe2538"
@@ -527,6 +665,10 @@ acorn@^5.0.0, acorn@^5.0.3, acorn@^5.5.3, acorn@^5.6.0:
   version "5.7.1"
   resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.1.tgz#f095829297706a7c9776958c0afc8930a9b9d9d8"
 
+acorn@^5.6.2:
+  version "5.7.2"
+  resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.2.tgz#91fa871883485d06708800318404e72bfb26dcc5"
+
 address@1.0.3, address@^1.0.1:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/address/-/address-1.0.3.tgz#b5f50631f8d6cec8bd20c963963afb55e06cbce9"
@@ -594,12 +736,6 @@ amdefine@>=0.0.4:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5"
 
-ansi-align@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f"
-  dependencies:
-    string-width "^2.0.0"
-
 ansi-escapes@^3.0.0:
   version "3.1.0"
   resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.1.0.tgz#f73207bb81207d75fd6c83f125af26eea378ca30"
@@ -1132,7 +1268,7 @@ babel-jest@^23.4.0, babel-jest@^23.4.2:
     babel-plugin-istanbul "^4.1.6"
     babel-preset-jest "^23.2.0"
 
-babel-loader@^7.1.4:
+babel-loader@7, babel-loader@^7.1.4:
   version "7.1.5"
   resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-7.1.5.tgz#e3ee0cd7394aa557e013b02d3e492bfd07aa6d68"
   dependencies:
@@ -1927,13 +2063,6 @@ binary-extensions@^1.0.0:
   version "1.11.0"
   resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz#46aa1751fb6a2f93ee5e689bb1087d4b14c6c205"
 
-bl@^1.0.0:
-  version "1.2.2"
-  resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.2.tgz#a160911717103c07410cef63ef51b397c025af9c"
-  dependencies:
-    readable-stream "^2.3.5"
-    safe-buffer "^5.1.1"
-
 bluebird@3.4.6:
   version "3.4.6"
   resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.4.6.tgz#01da8d821d87813d158967e743d5fe6c62cf8c0f"
@@ -1969,18 +2098,6 @@ bowser@^1.0.0, bowser@^1.7.3:
   version "1.9.4"
   resolved "https://registry.yarnpkg.com/bowser/-/bowser-1.9.4.tgz#890c58a2813a9d3243704334fa81b96a5c150c9a"
 
-boxen@^1.1.0:
-  version "1.3.0"
-  resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b"
-  dependencies:
-    ansi-align "^2.0.0"
-    camelcase "^4.0.0"
-    chalk "^2.0.1"
-    cli-boxes "^1.0.0"
-    string-width "^2.0.0"
-    term-size "^1.2.0"
-    widest-line "^2.0.0"
-
 brace-expansion@^1.0.0, brace-expansion@^1.1.7:
   version "1.1.11"
   resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
@@ -2019,13 +2136,6 @@ brorand@^1.0.1:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
 
-brotli-size@0.0.2:
-  version "0.0.2"
-  resolved "https://registry.yarnpkg.com/brotli-size/-/brotli-size-0.0.2.tgz#5a0bf4282201c9fb78afb414182e50f53bcc5e1b"
-  dependencies:
-    duplexer "^0.1.1"
-    iltorb "^2.0.5"
-
 browser-process-hrtime@^0.1.2:
   version "0.1.2"
   resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.2.tgz#425d68a58d3447f02a04aa894187fce8af8b7b8e"
@@ -2116,21 +2226,6 @@ bser@^2.0.0:
   dependencies:
     node-int64 "^0.4.0"
 
-buffer-alloc-unsafe@^1.1.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0"
-
-buffer-alloc@^1.1.0:
-  version "1.2.0"
-  resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec"
-  dependencies:
-    buffer-alloc-unsafe "^1.1.0"
-    buffer-fill "^1.0.0"
-
-buffer-fill@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c"
-
 buffer-from@^1.0.0:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
@@ -2151,10 +2246,6 @@ builtin-modules@^1.0.0:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f"
 
-builtin-modules@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-2.0.0.tgz#60b7ef5ae6546bd7deefa74b08b62a43a232648e"
-
 builtin-status-codes@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8"
@@ -2228,7 +2319,7 @@ camelcase@^1.0.2:
   version "1.2.1"
   resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39"
 
-camelcase@^4.0.0, camelcase@^4.1.0:
+camelcase@^4.1.0:
   version "4.1.0"
   resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd"
 
@@ -2304,6 +2395,10 @@ chardet@^0.4.0:
   version "0.4.2"
   resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2"
 
+chardet@^0.5.0:
+  version "0.5.0"
+  resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.5.0.tgz#fe3ac73c00c3d865ffcc02a0682e2c20b6a06029"
+
 cheerio@^1.0.0-rc.2:
   version "1.0.0-rc.2"
   resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.2.tgz#4b9f53a81b27e4d5dac31c0ffd0cfa03cc6830db"
@@ -2353,6 +2448,12 @@ chownr@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181"
 
+chrome-trace-event@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz#45a91bd2c20c9411f0963b5aaeb9a1b95e09cc48"
+  dependencies:
+    tslib "^1.9.0"
+
 chromedriver@^2.40.0:
   version "2.41.0"
   resolved "https://registry.yarnpkg.com/chromedriver/-/chromedriver-2.41.0.tgz#2709d3544bc0c288b4738a6925a64c02a98a921f"
@@ -2407,10 +2508,6 @@ clean-css@4.1.x:
   dependencies:
     source-map "0.5.x"
 
-cli-boxes@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143"
-
 cli-cursor@^2.1.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5"
@@ -2743,6 +2840,13 @@ create-react-context@^0.2.2:
     fbjs "^0.8.0"
     gud "^1.0.0"
 
+cross-env@^5.2.0:
+  version "5.2.0"
+  resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-5.2.0.tgz#6ecd4c015d5773e614039ee529076669b9d126f2"
+  dependencies:
+    cross-spawn "^6.0.5"
+    is-windows "^1.0.0"
+
 cross-spawn@5.1.0, cross-spawn@^5.0.1:
   version "5.1.0"
   resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449"
@@ -2967,18 +3071,6 @@ decode-uri-component@^0.2.0:
   version "0.2.0"
   resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
 
-decompress-response@^3.3.0:
-  version "3.3.0"
-  resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3"
-  dependencies:
-    mimic-response "^1.0.0"
-
-deep-assign@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/deep-assign/-/deep-assign-2.0.0.tgz#ebe06b1f07f08dae597620e3dd1622f371a1c572"
-  dependencies:
-    is-obj "^1.0.0"
-
 deep-equal-ident@^1.1.1:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/deep-equal-ident/-/deep-equal-ident-1.1.1.tgz#06f4b89e53710cd6cea4a7781c7a956642de8dc9"
@@ -3093,7 +3185,7 @@ detect-indent@^4.0.0:
   dependencies:
     repeating "^2.0.0"
 
-detect-libc@^1.0.2, detect-libc@^1.0.3:
+detect-libc@^1.0.2:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b"
 
@@ -3312,6 +3404,14 @@ enhanced-resolve@^3.4.0:
     object-assign "^4.0.1"
     tapable "^0.2.7"
 
+enhanced-resolve@^4.0.0, enhanced-resolve@^4.1.0:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz#41c7e0bfdfe74ac1ffe1e57ad6a5c6c9f3742a7f"
+  dependencies:
+    graceful-fs "^4.1.2"
+    memory-fs "^0.4.0"
+    tapable "^1.0.0"
+
 entities@^1.1.1, entities@~1.1.1:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0"
@@ -3701,14 +3801,6 @@ estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0:
   version "4.2.0"
   resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13"
 
-estree-walker@^0.2.1:
-  version "0.2.1"
-  resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.2.1.tgz#bdafe8095383d8414d5dc2ecf4c9173b6db9412e"
-
-estree-walker@^0.5.1, estree-walker@^0.5.2:
-  version "0.5.2"
-  resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.5.2.tgz#d3850be7529c9580d815600b53126515e146dd39"
-
 esutils@^2.0.2:
   version "2.0.2"
   resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b"
@@ -3807,10 +3899,6 @@ expand-range@^1.8.1:
   dependencies:
     fill-range "^2.1.0"
 
-expand-template@^1.0.2:
-  version "1.1.1"
-  resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-1.1.1.tgz#981f188c0c3a87d2e28f559bc541426ff94f21dd"
-
 expand-tilde@^2.0.0, expand-tilde@^2.0.2:
   version "2.0.2"
   resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502"
@@ -3888,6 +3976,14 @@ external-editor@^2.0.4, external-editor@^2.1.0:
     iconv-lite "^0.4.17"
     tmp "^0.0.33"
 
+external-editor@^3.0.0:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.0.1.tgz#fc9638c4d7cde4f0bb82b12307a1a23912c492e3"
+  dependencies:
+    chardet "^0.5.0"
+    iconv-lite "^0.4.22"
+    tmp "^0.0.33"
+
 extglob@^0.3.1:
   version "0.3.2"
   resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1"
@@ -4017,10 +4113,6 @@ filesize@3.5.11:
   version "3.5.11"
   resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.5.11.tgz#1919326749433bb3cf77368bd158caabcc19e9ee"
 
-filesize@^3.5.6:
-  version "3.6.1"
-  resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.6.1.tgz#090bb3ee01b6f801a8a8be99d31710b3422bb317"
-
 fill-range@^2.1.0:
   version "2.2.4"
   resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565"
@@ -4172,10 +4264,6 @@ from2@^2.1.0:
     inherits "^2.0.1"
     readable-stream "^2.0.0"
 
-fs-constants@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad"
-
 fs-extra@^7.0.0:
   version "7.0.0"
   resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.0.tgz#8cc3f47ce07ef7b3593a11b9fb245f7e34c041d6"
@@ -4288,10 +4376,6 @@ git-raw-commits@^1.3.0:
     split2 "^2.0.0"
     through2 "^2.0.0"
 
-github-from-package@0.0.0:
-  version "0.0.0"
-  resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce"
-
 glamor@^2.20.40:
   version "2.20.40"
   resolved "https://registry.yarnpkg.com/glamor/-/glamor-2.20.40.tgz#f606660357b7cf18dface731ad1a2cfa93817f05"
@@ -4352,6 +4436,10 @@ global-dirs@^0.1.0:
   dependencies:
     ini "^1.3.4"
 
+global-modules-path@^2.1.0:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/global-modules-path/-/global-modules-path-2.3.0.tgz#b0e2bac6beac39745f7db5c59d26a36a0b94f7dc"
+
 global-modules@1.0.0, global-modules@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea"
@@ -4445,7 +4533,7 @@ gud@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/gud/-/gud-1.0.0.tgz#a489581b17e6a70beca9abe3ae57de7a499852c0"
 
-gzip-size@3.0.0, gzip-size@^3.0.0:
+gzip-size@3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-3.0.0.tgz#546188e9bdc337f673772f81660464b389dce520"
   dependencies:
@@ -4709,6 +4797,12 @@ iconv-lite@^0.4.17, iconv-lite@^0.4.4, iconv-lite@~0.4.13:
   dependencies:
     safer-buffer ">= 2.1.2 < 3"
 
+iconv-lite@^0.4.22:
+  version "0.4.24"
+  resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
+  dependencies:
+    safer-buffer ">= 2.1.2 < 3"
+
 icss-replace-symbols@^1.1.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded"
@@ -4719,7 +4813,7 @@ icss-utils@^2.1.0:
   dependencies:
     postcss "^6.0.1"
 
-ieee754@^1.1.4:
+ieee754@^1.1.11, ieee754@^1.1.4:
   version "1.1.12"
   resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.12.tgz#50bf24e5b9c8bb98af4964c941cdb0918da7b60b"
 
@@ -4741,15 +4835,6 @@ ignore@^4.0.2:
   version "4.0.3"
   resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.3.tgz#e2d58c9654d75b542529fa28d80ac95b29e4f467"
 
-iltorb@^2.0.5:
-  version "2.4.0"
-  resolved "https://registry.yarnpkg.com/iltorb/-/iltorb-2.4.0.tgz#befef47a5aea0cee46767731cb63859b57e58327"
-  dependencies:
-    detect-libc "^1.0.3"
-    npmlog "^4.1.2"
-    prebuild-install "^5.0.0"
-    which-pm-runs "^1.0.0"
-
 immediate@~3.0.5:
   version "3.0.6"
   resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b"
@@ -4870,11 +4955,29 @@ inquirer@^5.2.0:
     strip-ansi "^4.0.0"
     through "^2.3.6"
 
+inquirer@^6.0.0:
+  version "6.2.0"
+  resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.2.0.tgz#51adcd776f661369dc1e894859c2560a224abdd8"
+  dependencies:
+    ansi-escapes "^3.0.0"
+    chalk "^2.0.0"
+    cli-cursor "^2.1.0"
+    cli-width "^2.0.0"
+    external-editor "^3.0.0"
+    figures "^2.0.0"
+    lodash "^4.17.10"
+    mute-stream "0.0.7"
+    run-async "^2.2.0"
+    rxjs "^6.1.0"
+    string-width "^2.1.0"
+    strip-ansi "^4.0.0"
+    through "^2.3.6"
+
 insert-css@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/insert-css/-/insert-css-2.0.0.tgz#eb5d1097b7542f4c79ea3060d3aee07d053880f4"
 
-interpret@^1.0.0:
+interpret@^1.0.0, interpret@^1.1.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614"
 
@@ -5052,10 +5155,6 @@ is-glob@^4.0.0:
   dependencies:
     is-extglob "^2.1.1"
 
-is-module@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591"
-
 is-number-object@^1.0.3:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.3.tgz#f265ab89a9f445034ef6aff15a8f00b00f551799"
@@ -5176,7 +5275,7 @@ is-utf8@^0.2.0:
   version "0.2.1"
   resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72"
 
-is-windows@^1.0.1, is-windows@^1.0.2:
+is-windows@^1.0.0, is-windows@^1.0.1, is-windows@^1.0.2:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
 
@@ -5698,7 +5797,7 @@ json-loader@^0.5.4, json-loader@^0.5.7:
   version "0.5.7"
   resolved "https://registry.yarnpkg.com/json-loader/-/json-loader-0.5.7.tgz#dca14a70235ff82f0ac9a3abeb60d337a365185d"
 
-json-parse-better-errors@^1.0.1:
+json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9"
 
@@ -6047,6 +6146,14 @@ lodash@^4.0.1, lodash@^4.13.1, lodash@^4.15.0, lodash@^4.17.0, lodash@^4.17.10,
   version "4.17.10"
   resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7"
 
+long@4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28"
+
+long@^3.2.0:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/long/-/long-3.2.0.tgz#d821b7138ca1cb581c172990ef14db200b5c474b"
+
 longest@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097"
@@ -6079,12 +6186,6 @@ lru-cache@^4.0.1, lru-cache@^4.1.1:
     pseudomap "^1.0.2"
     yallist "^2.1.2"
 
-magic-string@^0.22.4:
-  version "0.22.5"
-  resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.22.5.tgz#8e9cf5afddf44385c1da5bc2a6a0dbd10b03657e"
-  dependencies:
-    vlq "^0.2.2"
-
 make-dir@^1.0.0:
   version "1.3.0"
   resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c"
@@ -6101,6 +6202,10 @@ makeerror@1.0.x:
   dependencies:
     tmpl "1.0.x"
 
+mamacro@^0.0.3:
+  version "0.0.3"
+  resolved "https://registry.yarnpkg.com/mamacro/-/mamacro-0.0.3.tgz#ad2c9576197c9f1abf308d0787865bd975a3f3e4"
+
 map-cache@^0.2.2:
   version "0.2.2"
   resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf"
@@ -6292,10 +6397,6 @@ mimic-fn@^1.0.0:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022"
 
-mimic-response@^1.0.0:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b"
-
 min-document@^2.19.0:
   version "2.19.0"
   resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685"
@@ -6485,12 +6586,6 @@ no-case@^2.2.0:
   dependencies:
     lower-case "^1.1.1"
 
-node-abi@^2.2.0:
-  version "2.4.3"
-  resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.4.3.tgz#43666b7b17e57863e572409edbb82115ac7af28b"
-  dependencies:
-    semver "^5.4.1"
-
 node-dir@^0.1.10:
   version "0.1.17"
   resolved "https://registry.yarnpkg.com/node-dir/-/node-dir-0.1.17.tgz#5f5665d93351335caabef8f1c554516cf5f1e4e5"
@@ -6571,10 +6666,6 @@ nomnom@~1.6.2:
     colors "0.5.x"
     underscore "~1.4.4"
 
-noop-logger@^0.1.1:
-  version "0.1.1"
-  resolved "https://registry.yarnpkg.com/noop-logger/-/noop-logger-0.1.1.tgz#94a2b1633c4f1317553007d8966fd0e841b6a4c2"
-
 nopt@^4.0.1:
   version "4.0.1"
   resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d"
@@ -6631,7 +6722,7 @@ npm-run-path@^2.0.0:
   dependencies:
     path-key "^2.0.0"
 
-npmlog@^4.0.1, npmlog@^4.0.2, npmlog@^4.1.2:
+npmlog@^4.0.2, npmlog@^4.1.2:
   version "4.1.2"
   resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b"
   dependencies:
@@ -6776,12 +6867,6 @@ opn@5.2.0:
   dependencies:
     is-wsl "^1.1.0"
 
-opn@^5.3.0:
-  version "5.3.0"
-  resolved "https://registry.yarnpkg.com/opn/-/opn-5.3.0.tgz#64871565c863875f052cfdf53d3e3cb5adb53b1c"
-  dependencies:
-    is-wsl "^1.1.0"
-
 optimist@^0.6.1:
   version "0.6.1"
   resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686"
@@ -6810,7 +6895,7 @@ os-browserify@^0.3.0:
   version "0.3.0"
   resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27"
 
-os-homedir@^1.0.0, os-homedir@^1.0.1:
+os-homedir@^1.0.0:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
 
@@ -7351,26 +7436,6 @@ postcss@^6.0.0, postcss@^6.0.1, postcss@^6.0.17:
     source-map "^0.6.1"
     supports-color "^5.4.0"
 
-prebuild-install@^5.0.0:
-  version "5.0.0"
-  resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-5.0.0.tgz#bc1a24636beaf0af7945c0a84d4b9249bf191b6b"
-  dependencies:
-    detect-libc "^1.0.3"
-    expand-template "^1.0.2"
-    github-from-package "0.0.0"
-    minimist "^1.2.0"
-    mkdirp "^0.5.1"
-    node-abi "^2.2.0"
-    noop-logger "^0.1.1"
-    npmlog "^4.0.1"
-    os-homedir "^1.0.1"
-    pump "^2.0.1"
-    rc "^1.2.7"
-    simple-get "^2.7.0"
-    tar-fs "^1.13.0"
-    tunnel-agent "^0.6.0"
-    which-pm-runs "^1.0.0"
-
 prelude-ls@~1.1.2:
   version "1.1.2"
   resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
@@ -7502,13 +7567,6 @@ public-encrypt@^4.0.0:
     parse-asn1 "^5.0.0"
     randombytes "^2.0.1"
 
-pump@^1.0.0:
-  version "1.0.3"
-  resolved "https://registry.yarnpkg.com/pump/-/pump-1.0.3.tgz#5dfe8311c33bbf6fc18261f9f34702c47c08a954"
-  dependencies:
-    end-of-stream "^1.1.0"
-    once "^1.3.1"
-
 pump@^2.0.0, pump@^2.0.1:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909"
@@ -7894,7 +7952,7 @@ read-pkg@^3.0.0:
     normalize-package-data "^2.3.2"
     path-type "^3.0.0"
 
-"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.0, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6:
+"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6:
   version "2.3.6"
   resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf"
   dependencies:
@@ -8239,91 +8297,6 @@ ripemd160@^2.0.0, ripemd160@^2.0.1:
     hash-base "^3.0.0"
     inherits "^2.0.1"
 
-rollup-plugin-babel@^3.0.7:
-  version "3.0.7"
-  resolved "https://registry.yarnpkg.com/rollup-plugin-babel/-/rollup-plugin-babel-3.0.7.tgz#5b13611f1ab8922497e9d15197ae5d8a23fe3b1e"
-  dependencies:
-    rollup-pluginutils "^1.5.0"
-
-rollup-plugin-commonjs@^9.1.4:
-  version "9.1.4"
-  resolved "https://registry.yarnpkg.com/rollup-plugin-commonjs/-/rollup-plugin-commonjs-9.1.4.tgz#525b701adfd40e314b5bb6888d88edc28e10442f"
-  dependencies:
-    estree-walker "^0.5.1"
-    magic-string "^0.22.4"
-    resolve "^1.5.0"
-    rollup-pluginutils "^2.0.1"
-
-rollup-plugin-filesize@^4.0.1:
-  version "4.0.1"
-  resolved "https://registry.yarnpkg.com/rollup-plugin-filesize/-/rollup-plugin-filesize-4.0.1.tgz#9c5e682716cea026025ebf99720b4e603b20545c"
-  dependencies:
-    boxen "^1.1.0"
-    brotli-size "0.0.2"
-    colors "^1.1.2"
-    deep-assign "^2.0.0"
-    filesize "^3.5.6"
-    gzip-size "^3.0.0"
-    terser "^3.8.0"
-
-rollup-plugin-json@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/rollup-plugin-json/-/rollup-plugin-json-3.0.0.tgz#aeed2ff36e6c4fd0c60c4a8fc3d0884479e9dfce"
-  dependencies:
-    rollup-pluginutils "^2.2.0"
-
-rollup-plugin-node-resolve@^3.3.0:
-  version "3.3.0"
-  resolved "https://registry.yarnpkg.com/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-3.3.0.tgz#c26d110a36812cbefa7ce117cadcd3439aa1c713"
-  dependencies:
-    builtin-modules "^2.0.0"
-    is-module "^1.0.0"
-    resolve "^1.1.6"
-
-rollup-plugin-progress@^0.4.0:
-  version "0.4.0"
-  resolved "https://registry.yarnpkg.com/rollup-plugin-progress/-/rollup-plugin-progress-0.4.0.tgz#ec0b4ee3396434645412327292628b87b3b44f1e"
-  dependencies:
-    chalk "^1.1.3"
-    rollup-pluginutils "^1.5.1"
-
-rollup-plugin-replace@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/rollup-plugin-replace/-/rollup-plugin-replace-2.0.0.tgz#19074089c8ed57184b8cc64e967a03d095119277"
-  dependencies:
-    magic-string "^0.22.4"
-    minimatch "^3.0.2"
-    rollup-pluginutils "^2.0.1"
-
-rollup-plugin-visualizer@^0.9.0:
-  version "0.9.0"
-  resolved "https://registry.yarnpkg.com/rollup-plugin-visualizer/-/rollup-plugin-visualizer-0.9.0.tgz#6b55ab07765e9fd95fd43fb9aae5541c7cf49f67"
-  dependencies:
-    mkdirp "^0.5.1"
-    opn "^5.3.0"
-    source-map "^0.7.3"
-
-rollup-pluginutils@^1.5.0, rollup-pluginutils@^1.5.1:
-  version "1.5.2"
-  resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-1.5.2.tgz#1e156e778f94b7255bfa1b3d0178be8f5c552408"
-  dependencies:
-    estree-walker "^0.2.1"
-    minimatch "^3.0.2"
-
-rollup-pluginutils@^2.0.1, rollup-pluginutils@^2.2.0:
-  version "2.3.1"
-  resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.3.1.tgz#760d185ccc237dedc12d7ae48c6bcd127b4892d0"
-  dependencies:
-    estree-walker "^0.5.2"
-    micromatch "^2.3.11"
-
-rollup@^0.65.0:
-  version "0.65.0"
-  resolved "https://registry.yarnpkg.com/rollup/-/rollup-0.65.0.tgz#280db1252169b68fc3043028346b337dde453fba"
-  dependencies:
-    "@types/estree" "0.0.39"
-    "@types/node" "*"
-
 rst-selector-parser@^2.2.3:
   version "2.2.3"
   resolved "https://registry.yarnpkg.com/rst-selector-parser/-/rst-selector-parser-2.2.3.tgz#81b230ea2fcc6066c89e3472de794285d9b03d91"
@@ -8363,6 +8336,12 @@ rxjs@^5.5.2:
   dependencies:
     symbol-observable "1.0.1"
 
+rxjs@^6.1.0:
+  version "6.2.2"
+  resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.2.2.tgz#eb75fa3c186ff5289907d06483a77884586e1cf9"
+  dependencies:
+    tslib "^1.9.0"
+
 safe-buffer@5.1.1:
   version "5.1.1"
   resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853"
@@ -8406,7 +8385,7 @@ schema-utils@^0.3.0:
   dependencies:
     ajv "^5.0.0"
 
-schema-utils@^0.4.0, schema-utils@^0.4.5:
+schema-utils@^0.4.0, schema-utils@^0.4.4, schema-utils@^0.4.5:
   version "0.4.7"
   resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.7.tgz#ba74f597d2be2ea880131746ee17d0a093c68187"
   dependencies:
@@ -8557,18 +8536,6 @@ signal-exit@^3.0.0, signal-exit@^3.0.2:
   version "3.0.2"
   resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
 
-simple-concat@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.0.tgz#7344cbb8b6e26fb27d66b2fc86f9f6d5997521c6"
-
-simple-get@^2.7.0:
-  version "2.8.1"
-  resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-2.8.1.tgz#0e22e91d4575d87620620bc91308d57a77f44b5d"
-  dependencies:
-    decompress-response "^3.3.0"
-    once "^1.3.1"
-    simple-concat "^1.0.0"
-
 sisteransi@^0.1.1:
   version "0.1.1"
   resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-0.1.1.tgz#5431447d5f7d1675aac667ccd0b865a4994cb3ce"
@@ -8651,7 +8618,7 @@ source-map-support@^0.4.15:
   dependencies:
     source-map "^0.5.6"
 
-source-map-support@^0.5.6, source-map-support@~0.5.6:
+source-map-support@^0.5.6:
   version "0.5.6"
   resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.6.tgz#4435cee46b1aab62b8e8610ce60f788091c51c13"
   dependencies:
@@ -8676,10 +8643,6 @@ source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1:
   version "0.6.1"
   resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
 
-source-map@^0.7.3:
-  version "0.7.3"
-  resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383"
-
 spdx-correct@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.0.tgz#05a5b4d7153a195bc92c3c425b69f3b2a9524c82"
@@ -9027,26 +8990,9 @@ tapable@^0.2.3, tapable@^0.2.7:
   version "0.2.8"
   resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.2.8.tgz#99372a5c999bf2df160afc0d74bed4f47948cd22"
 
-tar-fs@^1.13.0:
-  version "1.16.3"
-  resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-1.16.3.tgz#966a628841da2c4010406a82167cbd5e0c72d509"
-  dependencies:
-    chownr "^1.0.1"
-    mkdirp "^0.5.1"
-    pump "^1.0.0"
-    tar-stream "^1.1.2"
-
-tar-stream@^1.1.2:
-  version "1.6.1"
-  resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.1.tgz#f84ef1696269d6223ca48f6e1eeede3f7e81f395"
-  dependencies:
-    bl "^1.0.0"
-    buffer-alloc "^1.1.0"
-    end-of-stream "^1.0.0"
-    fs-constants "^1.0.0"
-    readable-stream "^2.3.0"
-    to-buffer "^1.1.0"
-    xtend "^4.0.0"
+tapable@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.0.0.tgz#cbb639d9002eed9c6b5975eb20598d7936f1f9f2"
 
 tar@4.0.2:
   version "4.0.2"
@@ -9070,20 +9016,6 @@ tar@^4:
     safe-buffer "^5.1.2"
     yallist "^3.0.2"
 
-term-size@^1.2.0:
-  version "1.2.0"
-  resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69"
-  dependencies:
-    execa "^0.7.0"
-
-terser@^3.8.0:
-  version "3.8.1"
-  resolved "https://registry.yarnpkg.com/terser/-/terser-3.8.1.tgz#cb70070ac9e0a71add169dfb63c0a64fca2738ac"
-  dependencies:
-    commander "~2.16.0"
-    source-map "~0.6.1"
-    source-map-support "~0.5.6"
-
 test-exclude@^4.2.1:
   version "4.2.1"
   resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-4.2.1.tgz#dfa222f03480bca69207ca728b37d74b45f724fa"
@@ -9159,10 +9091,6 @@ to-arraybuffer@^1.0.0:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43"
 
-to-buffer@^1.1.0:
-  version "1.1.1"
-  resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.1.1.tgz#493bd48f62d7c43fcded313a03dcadb2e1213a80"
-
 to-fast-properties@^1.0.3:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47"
@@ -9228,6 +9156,10 @@ trim-right@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003"
 
+tslib@^1.9.0:
+  version "1.9.3"
+  resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286"
+
 tty-browserify@0.0.0:
   version "0.0.0"
   resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6"
@@ -9456,6 +9388,10 @@ uuid@^3.1.0, uuid@^3.2.1:
   version "3.3.2"
   resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131"
 
+v8-compile-cache@^2.0.0:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.0.2.tgz#a428b28bb26790734c4fc8bc9fa106fccebf6a6c"
+
 v8flags@^2.1.1:
   version "2.1.1"
   resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4"
@@ -9498,10 +9434,6 @@ verror@1.10.0:
     core-util-is "1.0.2"
     extsprintf "^1.2.0"
 
-vlq@^0.2.2:
-  version "0.2.3"
-  resolved "https://registry.yarnpkg.com/vlq/-/vlq-0.2.3.tgz#8f3e4328cf63b1540c0d67e1b2778386f8975b26"
-
 vm-browserify@0.0.4:
   version "0.0.4"
   resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73"
@@ -9533,7 +9465,7 @@ watch@~0.18.0:
     exec-sh "^0.2.0"
     minimist "^1.2.0"
 
-watchpack@^1.4.0:
+watchpack@^1.4.0, watchpack@^1.5.0:
   version "1.6.0"
   resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00"
   dependencies:
@@ -9545,6 +9477,22 @@ webidl-conversions@^4.0.2:
   version "4.0.2"
   resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad"
 
+webpack-cli@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.1.0.tgz#d71a83687dcfeb758fdceeb0fe042f96bcf62994"
+  dependencies:
+    chalk "^2.4.1"
+    cross-spawn "^6.0.5"
+    enhanced-resolve "^4.0.0"
+    global-modules-path "^2.1.0"
+    import-local "^1.0.0"
+    inquirer "^6.0.0"
+    interpret "^1.1.0"
+    loader-utils "^1.1.0"
+    supports-color "^5.4.0"
+    v8-compile-cache "^2.0.0"
+    yargs "^12.0.1"
+
 webpack-dev-middleware@^1.12.2:
   version "1.12.2"
   resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-1.12.2.tgz#f8fc1120ce3b4fc5680ceecb43d777966b21105e"
@@ -9598,6 +9546,36 @@ webpack@^3.11.0:
     webpack-sources "^1.0.1"
     yargs "^8.0.2"
 
+webpack@^4.17.1:
+  version "4.17.1"
+  resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.17.1.tgz#0f026e3d823f3fc604f811ed3ea8f0d9b267fb1e"
+  dependencies:
+    "@webassemblyjs/ast" "1.5.13"
+    "@webassemblyjs/helper-module-context" "1.5.13"
+    "@webassemblyjs/wasm-edit" "1.5.13"
+    "@webassemblyjs/wasm-opt" "1.5.13"
+    "@webassemblyjs/wasm-parser" "1.5.13"
+    acorn "^5.6.2"
+    acorn-dynamic-import "^3.0.0"
+    ajv "^6.1.0"
+    ajv-keywords "^3.1.0"
+    chrome-trace-event "^1.0.0"
+    enhanced-resolve "^4.1.0"
+    eslint-scope "^4.0.0"
+    json-parse-better-errors "^1.0.2"
+    loader-runner "^2.3.0"
+    loader-utils "^1.1.0"
+    memory-fs "~0.4.1"
+    micromatch "^3.1.8"
+    mkdirp "~0.5.0"
+    neo-async "^2.5.0"
+    node-libs-browser "^2.0.0"
+    schema-utils "^0.4.4"
+    tapable "^1.0.0"
+    uglifyjs-webpack-plugin "^1.2.4"
+    watchpack "^1.5.0"
+    webpack-sources "^1.0.1"
+
 websocket-driver@>=0.5.1:
   version "0.7.0"
   resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.0.tgz#0caf9d2d755d93aee049d4bdd0d3fe2cca2a24eb"
@@ -9639,10 +9617,6 @@ which-module@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
 
-which-pm-runs@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/which-pm-runs/-/which-pm-runs-1.0.0.tgz#670b3afbc552e0b55df6b7780ca74615f23ad1cb"
-
 which@^1.2.12, which@^1.2.14, which@^1.2.9, which@^1.3.0:
   version "1.3.1"
   resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
@@ -9655,12 +9629,6 @@ wide-align@^1.1.0:
   dependencies:
     string-width "^1.0.2 || 2"
 
-widest-line@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.0.tgz#0142a4e8a243f8882c0233aa0e0281aa76152273"
-  dependencies:
-    string-width "^2.1.1"
-
 window-size@0.1.0:
   version "0.1.0"
   resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d"


Test patch:
diff --git a/e2e/tests.js b/e2e/tests.js
index 3ea4440d1..cfeb082d2 100644
--- a/e2e/tests.js
+++ b/e2e/tests.js
@@ -2,8 +2,8 @@
 /* eslint-env browser */
 
 import React from 'react';
-import PopoverExamples from '../src/components/popover/examples';
-import CheckboxExamples from '../src/components/checkbox/examples';
+import PopoverExamples from '../src/popover/examples';
+import CheckboxExamples from '../src/checkbox/examples';
 
 const Examples = [PopoverExamples, CheckboxExamples];
 
diff --git a/rollup.config_e2e.js b/rollup.config_e2e.js
deleted file mode 100644
index 334629e6e..000000000
--- a/rollup.config_e2e.js
+++ /dev/null
@@ -1,59 +0,0 @@
-// @flow
-
-import babel from 'rollup-plugin-babel';
-import filesize from 'rollup-plugin-filesize';
-import nodeResolve from 'rollup-plugin-node-resolve';
-import progress from 'rollup-plugin-progress';
-import visualizer from 'rollup-plugin-visualizer';
-import commonjs from 'rollup-plugin-commonjs';
-import json from 'rollup-plugin-json';
-import replace from 'rollup-plugin-replace';
-
-export default {
-  input: `e2e/index.js`,
-  output: [
-    {
-      file: 'e2e/dist/index.js',
-      format: 'umd',
-      sourcemap: 'inline',
-    },
-  ],
-  external: ['htmlparser2'],
-  plugins: [
-    progress(),
-    nodeResolve({
-      browser: true,
-      preferBuiltins: false,
-    }),
-    json(),
-    commonjs({
-      include: ['node_modules/**'],
-      exclude: ['node_modules/process-es6/**'],
-      namedExports: {
-        'node_modules/react/index.js': [
-          'Children',
-          'Component',
-          'Fragment',
-          'PropTypes',
-          'createElement',
-          'cloneElement',
-          'isValidElement',
-          'createContext',
-          'createRef',
-        ],
-        'node_modules/react-dom/index.js': ['render'],
-        'node_modules/@storybook/addon-knobs/dist/index.js': ['boolean'],
-      },
-    }),
-    babel({
-      babelrc: false,
-      presets: [['es2015', {modules: false}], 'stage-1', 'react'],
-      plugins: ['external-helpers', require.resolve('./babel/cup.js')],
-    }),
-    visualizer(),
-    filesize(),
-    replace({
-      'process.env.NODE_ENV': JSON.stringify('production'),
-    }),
-  ],
-};
diff --git a/src/components/checkbox/constants.js b/src/checkbox/constants.js
similarity index 100%
rename from src/components/checkbox/constants.js
rename to src/checkbox/constants.js
diff --git a/src/components/checkbox/e2e.js b/src/checkbox/e2e.js
similarity index 98%
rename from src/components/checkbox/e2e.js
rename to src/checkbox/e2e.js
index 3100cc83a..f0c50df7b 100644
--- a/src/components/checkbox/e2e.js
+++ b/src/checkbox/e2e.js
@@ -22,7 +22,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 THE SOFTWARE.
 */
 // @flow
-import e2e from '../../utils/e2e-test-utils';
+import e2e from '../utils/e2e-test-utils';
 
 const {run, By, goToUrl, runBrowserAccecibilityTest, getElement} = e2e;
 import {suite, tests} from './examples';
diff --git a/src/components/menu/utils.js b/src/menu/utils.js
similarity index 100%
rename from src/components/menu/utils.js
rename to src/menu/utils.js
diff --git a/src/components/popover/__mocks__/popper.js.js b/src/popover/__mocks__/popper.js.js
similarity index 100%
rename from src/components/popover/__mocks__/popper.js.js
rename to src/popover/__mocks__/popper.js.js
diff --git a/src/components/popover/__tests__/__snapshots__/popover.test.js.snap b/src/popover/__tests__/__snapshots__/popover.test.js.snap
similarity index 100%
rename from src/components/popover/__tests__/__snapshots__/popover.test.js.snap
rename to src/popover/__tests__/__snapshots__/popover.test.js.snap
diff --git a/src/components/popover/__tests__/__snapshots__/stateful-container.test.js.snap b/src/popover/__tests__/__snapshots__/stateful-container.test.js.snap
similarity index 100%
rename from src/components/popover/__tests__/__snapshots__/stateful-container.test.js.snap
rename to src/popover/__tests__/__snapshots__/stateful-container.test.js.snap
diff --git a/src/components/popover/__tests__/__snapshots__/stateful-popover.test.js.snap b/src/popover/__tests__/__snapshots__/stateful-popover.test.js.snap
similarity index 100%
rename from src/components/popover/__tests__/__snapshots__/stateful-popover.test.js.snap
rename to src/popover/__tests__/__snapshots__/stateful-popover.test.js.snap
diff --git a/src/components/popover/__tests__/__snapshots__/styled-components.test.js.snap b/src/popover/__tests__/__snapshots__/styled-components.test.js.snap
similarity index 100%
rename from src/components/popover/__tests__/__snapshots__/styled-components.test.js.snap
rename to src/popover/__tests__/__snapshots__/styled-components.test.js.snap
diff --git a/src/components/popover/__tests__/popover.test.js b/src/popover/__tests__/popover.test.js
similarity index 100%
rename from src/components/popover/__tests__/popover.test.js
rename to src/popover/__tests__/popover.test.js
diff --git a/src/components/popover/__tests__/stateful-container.test.js b/src/popover/__tests__/stateful-container.test.js
similarity index 100%
rename from src/components/popover/__tests__/stateful-container.test.js
rename to src/popover/__tests__/stateful-container.test.js
diff --git a/src/components/popover/__tests__/stateful-popover.test.js b/src/popover/__tests__/stateful-popover.test.js
similarity index 100%
rename from src/components/popover/__tests__/stateful-popover.test.js
rename to src/popover/__tests__/stateful-popover.test.js
diff --git a/src/components/popover/__tests__/styled-components.test.js b/src/popover/__tests__/styled-components.test.js
similarity index 100%
rename from src/components/popover/__tests__/styled-components.test.js
rename to src/popover/__tests__/styled-components.test.js
diff --git a/src/components/popover/__tests__/utils.test.js b/src/popover/__tests__/utils.test.js
similarity index 100%
rename from src/components/popover/__tests__/utils.test.js
rename to src/popover/__tests__/utils.test.js
diff --git a/src/components/popover/constants.js b/src/popover/constants.js
similarity index 100%
rename from src/components/popover/constants.js
rename to src/popover/constants.js
diff --git a/src/components/popover/default-props.js b/src/popover/default-props.js
similarity index 100%
rename from src/components/popover/default-props.js
rename to src/popover/default-props.js
diff --git a/src/components/popover/e2e.js b/src/popover/e2e.js
similarity index 97%
rename from src/components/popover/e2e.js
rename to src/popover/e2e.js
index cedbf45c1..4d9c9b367 100644
--- a/src/components/popover/e2e.js
+++ b/src/popover/e2e.js
@@ -22,7 +22,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 THE SOFTWARE.
 */
 // @flow
-import e2e from '../../utils/e2e-test-utils';
+import e2e from '../utils/e2e-test-utils';
 
 const {run, By, runBrowserAccecibilityTest, goToUrl} = e2e;
 import {suite, tests} from './examples';
diff --git a/src/components/tooltip/types.js b/src/tooltip/types.js
similarity index 100%
rename from src/components/tooltip/types.js
rename to src/tooltip/types.js
diff --git a/webpack.e2e.config.js b/webpack.e2e.config.js
new file mode 100644
index 000000000..12eb8809b
--- /dev/null
+++ b/webpack.e2e.config.js
@@ -0,0 +1,35 @@
+const path = require('path');
+
+// This module is used by the visual regression tests to run the demos.
+module.exports = {
+  entry: './e2e/index.js',
+  context: path.resolve(__dirname),
+  resolve: {
+    modules: [__dirname, 'node_modules'],
+  },
+  output: {
+    path: path.join(__dirname, 'e2e/dist'),
+    filename: 'index.js',
+    publicPath: '/dist/',
+  },
+  module: {
+    rules: [
+      {
+        test: /\.js$/,
+        exclude: /node_modules/,
+        loader: 'babel-loader',
+        query: {
+          cacheDirectory: true,
+        },
+      },
+      {
+        test: /\.svg$/,
+        loader: 'file-loader',
+      },
+      {
+        test: /\.css$/,
+        loader: 'style-loader!css-loader',
+      },
+    ],
+  },
+};