[
  {
    "path": ".editorconfig",
    "content": "# http://editorconfig.org\n\n# A special property that should be specified at the top of the file outside of\n# any sections. Set to true to stop .editor config file search on current file\nroot = true\n\n[*]\n# Indentation style\n# Possible values - tab, space\nindent_style = space\n\n# Indentation size in single-spaced characters\n# Possible values - an integer, tab\nindent_size = 2\n\n# Line ending file format\n# Possible values - lf, crlf, cr\nend_of_line = lf\n\n# File character encoding\n# Possible values - latin1, utf-8, utf-16be, utf-16le\ncharset = utf-8\n\n# Denotes whether to trim whitespace at the end of lines\n# Possible values - true, false\ntrim_trailing_whitespace = true\n\n# Denotes whether file should end with a newline\n# Possible values - true, false\ninsert_final_newline = true\n"
  },
  {
    "path": ".eslintignore",
    "content": "coverage/**\nnode_modules/**\ndist/**\nsrc/index.html\n"
  },
  {
    "path": ".eslintrc",
    "content": "{\n  \"parser\": \"babel-eslint\",\n  \"extends\": [\n    \"standard\",\n    \"standard-react\"\n  ],\n  \"plugins\": [\n    \"babel\",\n    \"react\",\n    \"promise\"\n  ],\n  \"env\": {\n    \"browser\" : true\n  },\n  \"globals\": {\n    \"__DEV__\"      : false,\n    \"__TEST__\"     : false,\n    \"__PROD__\"     : false,\n    \"__COVERAGE__\" : false\n  },\n  \"rules\": {\n    \"key-spacing\"          : \"off\",\n    \"jsx-quotes\"           : [2, \"prefer-single\"],\n    \"max-len\"              : [2, 120, 2],\n    \"object-curly-spacing\" : [2, \"always\"],\n    \"comma-dangle\"         : \"off\"\n  }\n}\n"
  },
  {
    "path": ".gitignore",
    "content": ".DS_STORE\n*.log\nnode_modules\ndist\ncoverage\n.idea/\n.yarn-cache\n"
  },
  {
    "path": ".travis.yml",
    "content": "sudo: false\nlanguage: node_js\nnode_js:\n  - \"5\"\n  - \"6\"\n\ncache:\n  yarn: true\n  directories:\n    - node_modules\n\nscript:\n  - yarn lint\n  - yarn test\n  - yarn build\n\nafter_success:\n  - yarn codecov\n"
  },
  {
    "path": "CHANGELOG.md",
    "content": "Changelog\n=========\n\n3.0.1\n-------------\n\n### Improvements\n* Added Node `^5.0.0` to CI build\n\n### Fixes\n* Removed usage of the spread operator for function arguments\n* Added missing `fs-extra` dependency\n\n3.0.0\n-------------\n\n### Features\n* Upgraded webpack to `^2.0.0` (along with all associated dependencies)\n* Upgraded react to `^15.5.4`\n* Upgraded react-dom to `^15.5.4`\n* Upgraded react-redux to `^5.0.4`\n* Upgraded redbox-react to `^5.0.4`\n* Upgraded bootstrap to `^4.0.0-alpha`\n* Replaced 3rd-party bootstrap import with local dependency\n* Replaced `babel-preset-stage-1` and friends with `babel-preset-env`\n* Added normalizer bundler for JavaScript (`Promise`, `fetch`, and `Object.assign`)\n* Added `dirty-chai`\n\n### Improvements\n* Replaced PropTypes usage with `prop-types` package\n* Simplified project structure and configuration\n* Replaced postcss-loader usage with css-loader builtins\n* Webpack manifest is now bundled separately from vendor bundle (improves caching)\n* Replaced `file-loader` with `url-loader`\n* Moved all build-related dependencies back to `devDependencies`\n* Replaced `better-npm-run` with `cross-env`\n* Cleaned up some sloppy tests\n\n### Fixes\n* `console.log` now works correctly inside of Karma\n\n### Deprecations\n* Code coverage reporting has been temporarily removed\n* Support for `.css` files has been temporarily removed (use `.scss` or `.sass`)\n* Removed `normalize.css` since this is now provided by bootstrap\n\n3.0.0-alpha.0\n-------------\n\n### Improvements\n* Migrated to Fractal Project Structure, huge thanks to [justingreenberg](https://github.com/justingreenberg). See https://github.com/davezuko/react-redux-starter-kit/pull/684 for details and discussion.\n\n2.0.0\n-----\n\n### Features\n* Upgraded `eslint-plugin-react` to `^5.0.0`\n* Upgraded `fs-extra` to `^0.28.0`\n\n### Improvements\n* Updated syntax used for `createStore` to match `redux@^3.1.0`\n* Cleaned up `connect` decorator in `HomeView`\n* Cleaned up flow types in `HomeView`\n\n2.0.0-alpha.5\n-------------\n\n### Features\n* Upgraded `flow-bin` to `0.23.0`\n* Upgraded `fs-extra` to `^0.27.0`\n\n### Improvements\n* Minor cleanup in Karma configuration\n* Added missing node-style index files in blueprints\n\n### Fixes\n* Modified webpack manifest initialization to prevent syntax errors in some environments (https://github.com/davezuko/react-redux-starter-kit/issues/572)\n\n2.0.0-alpha.4\n-------------\n\n### Features\n* Upgraded `react` to `^15.0.0`\n* Upgraded `react-dom` to `^15.0.0`\n* Upgraded `react-addons-test-utils` to `^15.0.0`\n* Upgraded `eslint-plugin-flow-vars` to `^0.3.0`\n\n### Improvements\n* Updated `npm run deploy` to be environment agnostic (no longer forces `production`)\n* Added `npm run deploy:prod` (forces `production`, acts as old `npm run deploy`)\n* Added `npm run deploy:dev` (forces `development`)\n\n### Fixes\n* Removed `strip_root` option in Flow to support Nuclide\n* Updated webpack development configuration to use correct `public_path`\n\n\n2.0.0-alpha.3\n-------------\n\n### Features\n* Upgraded `flow-interfaces` to `^0.6.0`\n\n### Improvements\n* Moved dependencies needed for production builds from devDependencies to regular dependencies\n\n### Fixes\n* Production configuration now generates assets with absolute rather than relative paths\n\n### Deprecations\n* Removed `eslint-loader` for performance reasons\n\n2.0.0-alpha.2\n-------------\n\n### Features\n* Upgraded `eslint` to `^2.4.0`\n* Upgraded `babel-eslint` to `^6.0.0-beta.6`\n* Upgraded `better-npm-run` to `0.0.8`\n* Upgraded `phantomjs-polyfill` to `0.0.2`\n* Upgraded `karma-mocha-reporter` to `^2.0.0`\n* Upgraded `webpack` to `^1.12.14`\n* Upgraded `redux-thunk` to `^2.0.0`\n\n### Improvements\n* Added `index.js` files for blueprints for convenient imports\n\n### Fixes\n* Removed some `cssnano` options that caused potential conflicts with css modules\n* Updated flow to understand global webpack definitions\n\n2.0.0-alpha.1\n-------------\n\n### Features\n* Upgraded `react-router-redux` from `^4.0.0-beta` to `^4.0.0`\n\n2.0.0-alpha.0\n-------------\n\n### Features\n* Integrated with [redux-cli](https://github.com/SpencerCDixon/redux-cli)\n* Added support for [Flowtype](http://flowtype.org/)\n* Added `npm run flow:check` script\n* Added [chai-enzyme](https://github.com/producthunt/chai-enzyme)\n* Added `babel-plugin-transform-react-constant-elements` in production\n* Added `babel-plugin-transform-react-remove-prop-types` in production\n* Added `eslint-plugin-flowvars`\n* Added `better-npm-run`\n* Added loader for `.otf` files\n* Added `nodemon` for local server development\n* Added placeholder favicon, `humans.txt`, and `robots.txt`\n* Replaced `express` with `koa@^2.0.0-alpha`\n* Added `koa-proxy` with config support\n* Added `koa-conntect-history-api-fallback`\n* Upgraded `eslint` to `^2.0.0`\n* Upgraded `babel-eslint` to `^5.0.0`\n* Upgraded `eslint-plugin-react` to `^4.0.0`\n* Upgraded `yargs` to `^4.0.0`\n* Upgraded `html-webpack-plugin` from `^1.6.1` to `^2.7.1`\n* Upgraded `react-router` to `^2.0.0`\n* Replaced `redux-simple-router` with `react-router-redux`\n* Replaced `phantomjs` with `phantomjs-prebuilt`\n* Replaced Karma spec reporter with mocha reporter\n\n### Improvements\n* Webpack optimization plugins are now correctly used only in production\n* Added ability to simultaneously use CSS modules and regular CSS\n* Added `karma-webpack-with-fast-source-maps` for selective and faster test rebuilds\n* Simplified environment-based webpack configuration\n* Fixed CSS being minified twice with both `cssnano` and `css-loader`\n* Updated `cssnano` to not use unsafe options by default\n* Redux devtools now looks for the browser extension if available\n* Added webpack entry point for tests to replace file globs in Karma\n* Made Webpack compiler script generic so it can accept any webpack configuration file\n* Added sample tests for counter redux module\n* Replaced `react-hmre` with `redbox-react` and `react-transform-hmr`\n* Disabled verbose uglify warnings during compilation\n* Updated route definition file to have access to the redux store\n* Updated server start message so link is clickable\n* `ExtractTextPlugin` is now correctly used whenever HMR is disabled\n* `npm run deploy` now cleans out `~/dist` directory\n* Miscellaneous folder structure improvements\n* Removed unnecessary `bin` file for Karma\n* Removed unnecessary `NotFoundView`\n* Re-enabled support for `.jsx` files\n* Specified compatible Node and NPM engines\n\n### Fixes\n* Fixed some development-only code not being stripped from production bundles\n* Added rimraf for `~/dist` clearing to support Windows users\n* Fixed miscellaneous path issues for Windows users\n* Fixed source maps for Sass files\n* Updated server start debug message to display correct host\n\n### Deprecations\n* Removed `redux-actions`\n* Removed `dotenv`\n* Removed `add-module-exports` babel plugin\n\n1.0.0\n-----\n\n### Features\n* Upgraded from Babel 5 to Babel 6 :tada:\n* Added script to copy static assets from ~src/assets to ~/dist during compilation\n* Added CSS Modules (can be toggled on/off in config file)\n* Enabled source maps for CSS\n* Added `postcss-loader`\n* Added `debug` module to replace `console.log`\n* Added `json-loader`\n* Added `url-loader` for `(png|jpg)` files\n* Added `redux-actions` with demo\n* Upgraded `redux-devtools` from `^3.0.0-beta` to `^3.0.0`\n* Upgraded `redux-simple-router` from `^0.0.10` to `^1.0.0`\n* Upgraded `isparta` from `^2.0.0` to `^3.0.0`\n* Replaced `karma-sinon-chai` with `karma-chai-sinon` for peerDependencies fix\n* Added sample asynchronous action\n* Added example `composes` style to demo CSS modules in `HomeView`\n* Added `lint:fix` npm script\n* Added CONTRIBUTING document\n* Added placeholder favicon\n\n### Improvements\n* Refactored application to follow ducks-like architecture\n* Improved how configuration determines when to apply HMR-specific Babel transforms\n* Replaced explicit aliases with `resolve.root`\n* Renamed karma configuration file to more widely-known `karma.conf`\n* Made `CoreLayout` a pure (stateless) component\n* Renamed debug namespace from `kit:*` to `app:*`\n* Standardized coding conventions\n* Added ability to easily specify environment-specific configuration overrides\n* Extended available configuration options\n* Improved miscellaneous documentation\n* Refactored webpack middleware in express server into separate files\n\n### Fixes\n* Fixed DevTools imports so they are longer included in production builds\n* Added CSS best practices to root tag, node, and `core.scss` file\n* Disabled manifest extraction due to broken production builds\n* Updated Webpack dev server uses explicit publicPath during live development\n* Fixed Karma running tests twice after file change during watch mode\n\n### Deprecations\n* Removed `eslint-config-airbnb`\n* Deprecated support for Node `^4.0.0`\n\n0.18.0\n-----\n\n### Features\n* Replaces `webpack-dev-server` with `Express` and webpack middleware\n* Replaces `redux-router` with `redux-simple-router`\n* Use `postcss-loader` for autoprefixing rather than autoprefixer-loader\n* Configuration will now warn you of missing dependencies for vendor bundle\n* Upgrade `react-router` from `1.0.0-rc1` -> `^1.0.0`\n* Upgrade `css-loader` from `0.21.0` -> `0.23.0`\n* Upgrade `eslint-config-airbnb` from `0.1.0` to `^1.0.0`\n* Upgrade `karma-spec-reporter` from `0.0.21` to `0.0.22`\n* Upgrade `extract-text-webpack-plugin` from `^0.8.0` to `^0.9.0`\n\n### Improvements\n* Compiled `index.html` is now minified\n* Content hashes are now injected directly into the filename rather than appended as query strings\n* Better reporting of webpack build status\n* Use object-style configuration for `sass-loader` rather than inline query string\n* Rename `test:lint` task to `lint:tests`\n* Various documentation improvements\n\n### Fixes\n* Content hash is now longer duplicated in CSS bundle\n* Karma plugins are autoloaded now, rather than explicitly defined\n* Removes extraneous wrapping div in `Root` container\n* Fixes awkwardly named arguments to `createReducer` utility\n* Add missing alias to `~/src/store`\n\n0.17.0\n------\n\n### Features\n* Karma coverage now generates proper coverage reports\n* Added chai-as-promised\n* Added `npm run lint` script to lint all `~/src` code\n* Added `npm run test:lint` script to lint all `*.spec.js` files in `~/tests`\n* Updated `npm run deploy` to explicitly run linter on source code\n* Added `dotenv` (thanks [dougvk](https://github.com/dougvk))\n\n### Improvements\n* Renamed application entry point from `index.js` -> `app.js` (clarifies intent and helps with coverage reports)\n* Refactored sample counter constants and actions to their appropriate locations (thanks [kyleect](https://github.com/kyleect))\n* Devtools in `npm run dev:nw` now take up the full window (thanks [jhgg](https://github.com/jhgg))\n* Webpack no longer runs an eslint pre-loader (cleans up console messages while developing)\n* Moved tests into their own directory (alleviates lint/organization issues)\n* Renamed `stores` to `store` to be more intuitive\n* Webpack-dev-server now uses a configurable host (thanks [waynelkh](https://github.com/waynelkh))\n* Sass-loader is now configured independently of its loader definition\n* Upgraded `redux-devtools` from `^2.0.0` -> `^3.0.0`\n* Upgraded `react-transform-catch-errors` from `^0.1.0` -> `^1.0.0`\n\n### Fixes\n* Fix .editorconfig missing a setting that caused it to not be picked up in all IDE's\n* Cleans up miscellaneous lint errors.\n\n\n0.16.0\n------\n\n### Features\n* Adds redux-router (thanks to [dougvk](https://github.com/dougvk))\n* Adds redux-thunk middleware\n* Adds loaders for font files (thanks to [nodkz](https://github.com/nodkz))\n* Adds url loader\n* Upgrades React dependencies to stable `^0.14.0`\n* Upgrades react-redux to `^4.0.0`\n\n### Improvements\n* Cleans up unused configuration settings\n* configureStore no longer relies on a global variable to determine whether or not to enable devtool middleware\n* Removes unused invariant and ImmutableJS vendor dependencies\n* Removes unused webpack-clean plugin\n* Tweaks .js loader configuration to make it easier to add json-loader\n* Updates counter example to demonstrate `mapDispatchToProps`\n* Force `components` directory inclusion\n* Documentation improvements\n\n0.15.2\n------\n\n### Fixes\n* Remove unused/broken \"minify\" property provided to HtmlWebpackPlugin configuration.\n\n0.15.1\n------\n\n### Fixes\n* Dev server now loads the correct Webpack configuration with HMR enabled.\n* Redbox-React error catcher is now loaded correctly in development.\n\n0.15.0\n------\n\n### Fixes\n* HMR is now longer enabled for simple compilations. You can now compile development builds that won't constantly ping a non-existent dev server.\n* react-transform-hmr now only runs when HMR is enabled.\n\n### Improvements\n* Unit tests now only run in watch mode when explicitly requested. This makes it much more convenient to run tests on any environment without having to struggle with the `singleRun` flag in Karma.\n* There is now only a single webpack configuration (rather than one for the client and one for the server). As a result, configuration has once again been split into a base configuration which is then extended based on the current `NODE_ENV`.\n\n### Deprecations\n* Removed Koa server (sad days).\n\n0.14.0\n------\n\n#### Features\n* Replaces `react-transform-webpack-hmr` with its replacement `react-transform-hmr`. Thanks to [daviferreira](https://github.com/daviferreira).\n* Replaces `delicate-error-reporter` with `redbox-react`. Thanks to [bulby97](https://github.com/bulby97).\n* Created a `no-server` branch [here](https://github.com/davezuko/react-redux-starter-kit/tree/no-server) to make it easier for users who don't care about Koa.\n\n#### Improvements\n* Renames `client` directory to `src` to be more intuitive.\n* `inline-source-map` has been replaced by `source-map` as the default webpack devTool to reduce build sizes.\n* Refactors configuration file to focus on commonly-configured options rather than mixing them with internal configuration.\n* Swaps `dev` and `dev:debug` so debug tools are now enabled by default and can be disabled instead with `dev:no-debug`.\n* Repositions Redux devtools so they no longer block errors displayed by `redbox-react`.\n* Adds explicit directory references to some `import` statements to clarify which are from from `npm` and which are local.\n\n#### Fixes\n* Fixes naming in `HomeView` where `mapStateToProps` was incorrectly written as `mapDispatchToProps`.\n\n#### Deprecations\n* Removes local test utilities (in `~/src/utils/test`).\n\n0.13.0\n------\n\n#### Features\n* Adds `react-transform-catch-errors` along with `delicate-error-reporter`. Thanks [bulby97](https://github.com/bulby97) for this!\n\n#### Fixes\n* ExtractTextPlugin is once again production only. This fixes an issue where styles wouldn't be hot reloaded with Webpack.\n\n0.12.0\n------\n\n#### Features\n* Upgrades react-router to `^3.0.0`. This is the only reason for the minor-level version  bump.\n* Webpack now uses OccurrenceOrderPlugin to produce consistent bundle hashes.\n\n#### Fixes\n* Adds `history` to vendor dependencies to fix HMR caused by upgrade to react-router `1.0.0-rc`\n\n#### Improvements\n* Server no longer modifies initial counter state by default.\n* Adds invariant error in route rendering method to enforce router state definition through props.\n\n0.11.0\n------\n\n#### Features\n* Upgrades all React dependencies to `0.14.0-rc1`\n* Upgrades react-router to `1.0.0-rc`\n  * Updates client and server rendering accordingly\n* Adds Sinon-Chai for improved assertions and function spies\n* Adds option to disable eslint when in development\n\n#### Improvements\n* Improved example unit tests using react-addons-test-utils and Sinon Chai\n\n0.10.0\n------\n\n#### Features\n* Initial state can now be injected from the server (still WIP).\n* Adds react-addons-test-utils as a devDependency.\n\n#### Improvements\n* Eslint no longer prevents webpack from bundling in development mode if an error is emitted.\n  * See: https://github.com/MoOx/eslint-loader/issues/23\n* Updates all `.jsx` files to `.js`. (https://github.com/davezuko/react-redux-starter-kit/issues/37)\n* Updates all React component file names to be ProperCased.\n\n0.9.0\n-----\n\n#### Features\n* Koa server now uses gzip middleware.\n\n#### Improvements\n* Switches out react-hot-loader in favor of [react-transform-webpack-hmr](https://github.com/gaearon/react-transform-webpack-hmr).\n* Eslint configuration now uses Airbnb's configuration (slightly softened).\n* Migrates all actual development dependencies to devDependencies in `package.json`.\n* Example store and view are now more intuitive (simple counter display).\n* CSS-loader dependency upgraded from `0.16.0` to `0.17.0`.\n\n#### Deprecations\n* Removes unnecessary object-assign dependency.\n\n0.8.0\n-----\n\n#### Improvements\n* All build-, server-, and client-related code is now ES6.\n* Significantly refactors how client and server webpack configs are built.\n* `reducers/index.js` now exports combined root reducer.\n* Client application code now lives in `~/client` instead of `~/src` in order to conform to Redux standards.\n\n#### Fixes\n* Redux store now explicitly handles HMR.\n\n#### Changes\n* Webpack compiler configurations are no longer merged on top of a base default configuration. This can become unwieldy and even though explicitly writing each configuration file out is more verbose, it ends up being more maintainable.\n\n#### Deprecations\n* Quiet mode has been removed (`npm run dev:quiet`).\n\n0.7.0\n-----\n#### New Features\n* Support for redux-devtools in separate window with `dev:debugnw`\n  - Thanks to [mlusetti](https://github.com/mlusetti)\n\n#### Improvements\n* Upgrades react to `0.14.0-beta3`\n* Upgrades react to `0.14.0-beta3`\n* Upgrades redux to `^2.0.0`\n* Upgrades redux-devtools to `^2.0.0`\n* Upgrades react-redux to `^2.0.0`\n\n#### Fixes\n* Configuration file name trimming on Windows machines\n  - Thanks to [nuragic](https://github.com/nuragic)\n\n0.6.0\n-----\n\n#### Fixes\n* Fixes potential spacing issues when Webpack tries to load a config file.\n  - Thanks to [nuragic](https://github.com/nuragic) for his [PR](https://github.com/davezuko/react-redux-starter-kit/pull/32)\n\n#### Improvements\n* Upgrades koa to `1.0.0`\n* Upgrades react-redux to `1.0.0`\n* Upgrades object-assign to `0.4.0`\n\n0.5.0\n-----\n\n#### Improvements\n* Restructures src directory so filenames are more identifiable.\n\n#### Breaking Changes\n* Removes action-creators alias as it's unlikely to be used.\n\n0.4.0\n-----\n\n#### Improvements\n* Cleans up/removes example code per https://github.com/davezuko/react-redux-starter-kit/issues/20\n\n0.3.1\n-----\n\n#### Fixes\n* https://github.com/davezuko/react-redux-starter-kit/issues/19\n  - Invalid initialStates from server-side router will now yield to the next middleware.\n\n0.3.0\n-----\n\n#### Improvements\n* Bumps Redux version to first major release.\n* Bumps Redux-devtools version to first major release.\n\n#### Fixes\n* Fixes broken hot-reload in `:debug` mode.\n  - Temporarily fixed by moving `redux-devtools` into the vendor bundle.\n\n0.2.0\n-----\n\n#### Improvements\n* Weakens various eslint rules that were too opinionated.\n  - notable: `one-var` and `key-spacing`.\n\nThanks to [StevenLangbroek](https://github.com/StevenLangbroek) for the following:\n* Adds alias `utils` to reference `~/src/utils`\n* Adds `createConstants` utility.\n* Adds `createReducer` utility.\n* Refactors `todos` reducer to use a function map rather than switch statements.\n\n#### Fixes\n* Nested routes are now loaded correctly in react-router when using BrowserHistory.\n* Bundle compilation now fails if an eslint error is encountered when running a production build.\n  - Thanks [clearjs](https://github.com/clearjs)\n* Upgrades all outdated dependencies.\n  - Karma, eslint, babel, sass-loader, and a handful more.\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# Contributing Guidelines\n\nSome basic conventions for contributing to this project.\n\n### General\n\nPlease make sure that there aren't existing pull requests attempting to address the issue mentioned. Likewise, please check for issues related to update, as someone else may be working on the issue in a branch or fork.\n\n* Non-trivial changes should be discussed in an issue first\n* Develop in a topic branch, not master\n* Squash your commits\n\n### Linting\n\nPlease check your code using `npm run lint` before submitting your pull requests, as the CI build will fail if `eslint` fails.\n\n### Commit Message Format\n\nEach commit message should include a **type**, a **scope** and a **subject**:\n\n```\n <type>(<scope>): <subject>\n```\n\nLines should not exceed 100 characters. This allows the message to be easier to read on github as well as in various git tools and produces a nice, neat commit log ie:\n\n```\n #271 feat(standard): add style config and refactor to match\n #270 fix(config): only override publicPath when served by webpack \n #269 feat(eslint-config-defaults): replace eslint-config-airbnb \n #268 feat(config): allow user to configure webpack stats output \n``` \n\n#### Type\n\nMust be one of the following:\n\n* **feat**: A new feature\n* **fix**: A bug fix\n* **docs**: Documentation only changes\n* **style**: Changes that do not affect the meaning of the code (white-space, formatting, missing\n  semi-colons, etc)\n* **refactor**: A code change that neither fixes a bug or adds a feature\n* **test**: Adding missing tests\n* **chore**: Changes to the build process or auxiliary tools and libraries such as documentation\n  generation\n\n#### Scope\n\nThe scope could be anything specifying place of the commit change. For example `webpack`,\n`babel`, `redux` etc...\n\n#### Subject\n\nThe subject contains succinct description of the change:\n\n* use the imperative, present tense: \"change\" not \"changed\" nor \"changes\"\n* don't capitalize first letter\n* no dot (.) at the end\n"
  },
  {
    "path": "LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2015 David Zukowski\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "# Deprecation Warning\n\nThis project was started at the advent of the Redux ecosystem, and was intended to help users get up and running quickly. Since then, tooling and best practices have evolved tremendously. In order to get the most modern experience possible, I recommend checking out something like [create-react-app](https://github.com/facebookincubator/create-react-app) which is supported by many core React and Redux developers.\n\nYou are welcome to use this project if it is a better fit for your needs, but if you are brand new to the ecosystem I highly recommend checking out something that has received more recent updates.\n\nThank you to everyone who made this project possible over the past year(s).\n\n# React Redux Starter Kit\n\n[![Build Status](https://travis-ci.org/davezuko/react-redux-starter-kit.svg?branch=master)](https://travis-ci.org/davezuko/react-redux-starter-kit?branch=master)\n[![dependencies](https://david-dm.org/davezuko/react-redux-starter-kit.svg)](https://david-dm.org/davezuko/react-redux-starter-kit)\n[![devDependency Status](https://david-dm.org/davezuko/react-redux-starter-kit/dev-status.svg)](https://david-dm.org/davezuko/react-redux-starter-kit#info=devDependencies)\n[![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg)](http://standardjs.com/)\n\nThis starter kit is designed to get you up and running with a bunch of awesome front-end technologies.\n\nThe primary goal of this project is to provide a stable foundation upon which to build modern web appliications. Its purpose is not to dictate your project structure or to demonstrate a complete real-world application, but to provide a set of tools intended to make front-end development robust, easy, and, most importantly, fun. Check out the full feature list below!\n\nFinally, This project wouldn't be possible without the help of our many contributors. What you see today is the product of hundreds changes made to keep up with an ever-evolving ecosystem. [Thank you](#thank-you) for all of your help.\n\n## Table of Contents\n1. [Requirements](#requirements)\n1. [Installation](#getting-started)\n1. [Running the Project](#running-the-project)\n1. [Project Structure](#project-structure)\n1. [Live Development](#local-development)\n    * [Hot Reloading](#hot-reloading)\n    * [Redux DevTools](#redux-devtools)\n1. [Routing](#routing)\n1. [Testing](#testing)\n    * [dirty-chai](#dirty-chai)\n1. [Building for Production](#building-for-production)\n1. [Deployment](#deployment)\n1. [Thank You](#thank-you)\n\n## Requirements\n* node `^5.0.0`\n* yarn `^0.23.0` or npm `^3.0.0`\n\n## Installation\n\nAfter confirming that your environment meets the above [requirements](#requirements), you can create a new project based on `react-redux-starter-kit` by doing the following:\n\n```bash\n$ git clone https://github.com/davezuko/react-redux-starter-kit.git <my-project-name>\n$ cd <my-project-name>\n```\n\nWhen that's done, install the project dependencies. It is recommended that you use [Yarn](https://yarnpkg.com/) for deterministic dependency management, but `npm install` will suffice.\n\n```bash\n$ yarn  # Install project dependencies (or `npm install`)\n```\n\n## Running the Project\n\nAfter completing the [installation](#installation) step, you're ready to start the project!\n\n```bash\n$ yarn start  # Start the development server (or `npm start`)\n```\n\nWhile developing, you will probably rely mostly on `yarn start`; however, there are additional scripts at your disposal:\n\n|`yarn <script>`    |Description|\n|-------------------|-----------|\n|`start`            |Serves your app at `localhost:3000`|\n|`build`            |Builds the application to ./dist|\n|`test`             |Runs unit tests with Karma. See [testing](#testing)|\n|`test:watch`       |Runs `test` in watch mode to re-run tests when changed|\n|`lint`             |[Lints](http://stackoverflow.com/questions/8503559/what-is-linting) the project for potential errors|\n|`lint:fix`         |Lints the project and [fixes all correctable errors](http://eslint.org/docs/user-guide/command-line-interface.html#fix)|\n\n## Project Structure\n\nThe project structure presented in this boilerplate is **fractal**, where functionality is grouped primarily by feature rather than file type. This structure is only meant to serve as a guide, it is by no means prescriptive. That said, it aims to represent generally accepted guidelines and patterns for building scalable applications. If you wish to read more about this pattern, please check out this [awesome writeup](https://github.com/davezuko/react-redux-starter-kit/wiki/Fractal-Project-Structure) by [Justin Greenberg](https://github.com/justingreenberg).\n\n```\n.\n├── build                    # All build-related code\n├── public                   # Static public assets (not imported anywhere in source code)\n├── server                   # Express application that provides webpack middleware\n│   └── main.js              # Server application entry point\n├── src                      # Application source code\n│   ├── index.html           # Main HTML page container for app\n│   ├── main.js              # Application bootstrap and rendering\n│   ├── normalize.js         # Browser normalization and polyfills\n│   ├── components           # Global Reusable Components\n│   ├── containers           # Global Reusable Container Components\n│   ├── layouts              # Components that dictate major page structure\n│   │   └── PageLayout       # Global application layout in which to render routes\n│   ├── routes               # Main route definitions and async split points\n│   │   ├── index.js         # Bootstrap main application routes with store\n│   │   ├── Home             # Fractal route\n│   │   │   ├── index.js     # Route definitions and async split points\n│   │   │   ├── assets       # Assets required to render components\n│   │   │   ├── components   # Presentational React Components\n│   │   │   └── routes **    # Fractal sub-routes (** optional)\n│   │   └── Counter          # Fractal route\n│   │       ├── index.js     # Counter route definition\n│   │       ├── container    # Connect components to actions and store\n│   │       ├── modules      # Collections of reducers/constants/actions\n│   │       └── routes **    # Fractal sub-routes (** optional)\n│   ├── store                # Redux-specific pieces\n│   │   ├── createStore.js   # Create and instrument redux store\n│   │   └── reducers.js      # Reducer registry and injection\n│   └── styles               # Application-wide styles (generally settings)\n└── tests                    # Unit tests\n```\n\n## Live Development\n\n### Hot Reloading\n\nHot reloading is enabled by default when the application is running in development mode (`yarn start`). This feature is implemented with webpack's [Hot Module Replacement](https://webpack.github.io/docs/hot-module-replacement.html) capabilities, where code updates can be injected to the application while it's running, no full reload required. Here's how it works:\n\n* For **JavaScript** modules, a code change will trigger the application to re-render from the top of the tree. **Global state is preserved (i.e. redux), but any local component state is reset**. This differs from React Hot Loader, but we've found that performing a full re-render helps avoid subtle bugs caused by RHL patching.\n\n* For **Sass**, any change will update the styles in realtime, no additional configuration or reload needed.\n\n### Redux DevTools\n\n**We recommend using the [Redux DevTools Chrome Extension](https://chrome.google.com/webstore/detail/redux-devtools/lmhkpmbekcpmknklioeibfkpmmfibljd).**\nUsing the chrome extension allows your monitors to run on a separate thread and affords better performance and functionality. It comes with several of the most popular monitors, is easy to configure, filters actions, and doesn't require installing any packages in your project.\n\nHowever, it's easy to bundle these developer tools locally should you choose to do so. First, grab the packages from npm:\n\n```bash\nyarn add --dev redux-devtools redux-devtools-log-monitor redux-devtools-dock-monitor\n```\n\nThen follow the [manual integration walkthrough](https://github.com/gaearon/redux-devtools/blob/master/docs/Walkthrough.md).\n\n## Routing\nWe use `react-router` [route definitions](https://github.com/ReactTraining/react-router/blob/v3/docs/API.md#plainroute) (`<route>/index.js`) to define units of logic within our application. See the [project structure](#project-structure) section for more information.\n\n## Testing\nTo add a unit test, create a `.spec.js` file anywhere inside of `./tests`. Karma and webpack will automatically find these files, and Mocha and Chai will be available within your test without the need to import them. Here are a few important plugins and packages available to you during testing:\n\n### dirty-chai\n\nSome of the assertions available from [chai](chaijs.com) use [magical getters](http://chaijs.com/api/bdd/#method_true). These are problematic for a few reasons:\n\n1) If you mistype a property name (e.g. `expect(false).to.be.tru`) then the expression evaluates to undefined, the magical getter on the `true` is never run, and so your test silently passes.\n2) By default, linters don't understand them and therefore mark them as unused expressions, which can be annoying.\n\n[Dirty Chai](https://github.com/prodatakey/dirty-chai) fixes this by converting these getters into callable functions. This way, if mistype an assertion, our attempt to invoke it will throw due to the property being undefined.\n\n```js\n// This silently passes because the getter on `true` is never invoked!\nit('should be true', () => {\n  expect(false).to.be.tru // evalutes to undefined :(\n})\n\n// Much better! Our assertion is invalid, so it throws rather than implicitly passing.\nit('should be true', () => {\n  expect(false).to.be.tru() // `tru` is not defined!\n})\n```\n\n## Building for Production\n\n## Deployment\n\nOut of the box, this starter kit is deployable by serving the `./dist` folder generated by `yarn build`. This project does not concern itself with the details of server-side rendering or API structure, since that demands a more opinionated structure that makes it difficult to extend the starter kit. The simplest deployment strategy is a [static deployment](#static-deployments).\n\n### Static Deployments\n\nServe the application with a web server such as nginx by pointing it at your `./dist` folder. Make sure to direct incoming route requests to the root `./dist/index.html` file so that the client application will be loaded; react-router will take care of the rest. If you are unsure of how to do this, you might find [this documentation](https://github.com/reactjs/react-router/blob/master/docs/guides/Histories.md#configuring-your-server) helpful. The Express server that comes with the starter kit is able to be extended to serve as an API and more, but is not required for a static deployment.\n\n## Thank You\n\nThis project wouldn't be possible without help from the community, so I'd like to highlight some of its biggest contributors. Thank you all for your hard work, you've made my life a lot easier and taught me a lot in the process.\n\n* [Justin Greenberg](https://github.com/justingreenberg) - For all of your PR's, getting us to Babel 6, and constant work improving our patterns.\n* [Roman Pearah](https://github.com/neverfox) - For your bug reports, help in triaging issues, and PR contributions.\n* [Spencer Dixon](https://github.com/SpencerCDixon) - For your creation of [redux-cli](https://github.com/SpencerCDixon/redux-cli).\n* [Jonas Matser](https://github.com/mtsr) - For your help in triaging issues and unending support in our Gitter channel.\n\nAnd to everyone else who has contributed, even if you are not listed here your work is appreciated.\n"
  },
  {
    "path": "build/karma.config.js",
    "content": "const argv = require('yargs').argv\nconst webpackConfig = require('./webpack.config')\n\nconst TEST_BUNDLER = './tests/test-bundler.js'\n\nconst karmaConfig = {\n  basePath: '../',\n  browsers: ['PhantomJS'],\n  singleRun: !argv.watch,\n  coverageReporter: {\n    reporters: [\n      { type: 'text-summary' },\n    ],\n  },\n  files: [{\n    pattern  : TEST_BUNDLER,\n    watched  : false,\n    served   : true,\n    included : true\n  }],\n  frameworks: ['mocha'],\n  reporters: ['mocha'],\n  preprocessors: {\n    [TEST_BUNDLER]: ['webpack'],\n  },\n  logLevel: 'WARN',\n  browserConsoleLogOptions: {\n    terminal: true,\n    format: '%b %T: %m',\n    level: '',\n  },\n  webpack: {\n    entry: TEST_BUNDLER,\n    devtool: 'cheap-module-source-map',\n    module: webpackConfig.module,\n    plugins: webpackConfig.plugins,\n    resolve: webpackConfig.resolve,\n    externals: {\n      'react/addons': 'react',\n      'react/lib/ExecutionEnvironment': 'react',\n      'react/lib/ReactContext': 'react',\n    },\n  },\n  webpackMiddleware: {\n    stats: 'errors-only',\n    noInfo: true,\n  },\n}\n\nmodule.exports = (cfg) => cfg.set(karmaConfig)\n"
  },
  {
    "path": "build/lib/logger.js",
    "content": "const chalk = require('chalk')\nconst figures = require('figures')\n\n// Need to support Node versions that don't support spreading function arguments\nconst spread = (fn) => function () {\n  return fn([].slice.call(arguments))\n}\n\nexports.log = console.log.bind(console)\n\nexports.error = spread((messages) => {\n  console.error(chalk.red.apply(chalk, [figures.cross].concat(messages)))\n})\n\nexports.info = spread((messages) => {\n  console.info(chalk.cyan.apply(chalk, [figures.info].concat(messages)))\n})\n\nexports.success = spread((messages) => {\n  console.log(chalk.green.apply(chalk, [figures.tick].concat(messages)))\n})\n\nexports.warn = spread((messages) => {\n  console.warn(chalk.yellow.apply(chalk, [figures.warning].concat(messages)))\n})\n"
  },
  {
    "path": "build/scripts/compile.js",
    "content": "const fs = require('fs-extra')\nconst path = require('path')\nconst chalk = require('chalk')\nconst webpack = require('webpack')\nconst logger = require('../lib/logger')\nconst webpackConfig = require('../webpack.config')\nconst project = require('../../project.config')\n\nconst runWebpackCompiler = (webpackConfig) =>\n  new Promise((resolve, reject) => {\n    webpack(webpackConfig).run((err, stats) => {\n      if (err) {\n        logger.error('Webpack compiler encountered a fatal error.', err)\n        return reject(err)\n      }\n\n      const jsonStats = stats.toJson()\n      if (jsonStats.errors.length > 0) {\n        logger.error('Webpack compiler encountered errors.')\n        logger.log(jsonStats.errors.join('\\n'))\n        return reject(new Error('Webpack compiler encountered errors'))\n      } else if (jsonStats.warnings.length > 0) {\n        logger.warn('Webpack compiler encountered warnings.')\n        logger.log(jsonStats.warnings.join('\\n'))\n      }\n      resolve(stats)\n    })\n  })\n\nconst compile = () => Promise.resolve()\n  .then(() => logger.info('Starting compiler...'))\n  .then(() => logger.info('Target application environment: ' + chalk.bold(project.env)))\n  .then(() => runWebpackCompiler(webpackConfig))\n  .then((stats) => {\n    logger.info(`Copying static assets from ./public to ./${project.outDir}.`)\n    fs.copySync(\n      path.resolve(project.basePath, 'public'),\n      path.resolve(project.basePath, project.outDir)\n    )\n    return stats\n  })\n  .then((stats) => {\n    if (project.verbose) {\n      logger.log(stats.toString({\n        colors: true,\n        chunks: false,\n      }))\n    }\n    logger.success(`Compiler finished successfully! See ./${project.outDir}.`)\n  })\n  .catch((err) => logger.error('Compiler encountered errors.', err))\n\ncompile()\n"
  },
  {
    "path": "build/scripts/start.js",
    "content": "const logger = require('../lib/logger')\n\nlogger.info('Starting server...')\nrequire('../../server/main').listen(3000, () => {\n  logger.success('Server is running at http://localhost:3000')\n})\n"
  },
  {
    "path": "build/webpack.config.js",
    "content": "const path = require('path')\nconst webpack = require('webpack')\nconst HtmlWebpackPlugin = require('html-webpack-plugin')\nconst ExtractTextPlugin = require('extract-text-webpack-plugin')\nconst project = require('../project.config')\n\nconst inProject = path.resolve.bind(path, project.basePath)\nconst inProjectSrc = (file) => inProject(project.srcDir, file)\n\nconst __DEV__ = project.env === 'development'\nconst __TEST__ = project.env === 'test'\nconst __PROD__ = project.env === 'production'\n\nconst config = {\n  entry: {\n    normalize: [\n      inProjectSrc('normalize'),\n    ],\n    main: [\n      inProjectSrc(project.main),\n    ],\n  },\n  devtool: project.sourcemaps ? 'source-map' : false,\n  output: {\n    path: inProject(project.outDir),\n    filename: __DEV__ ? '[name].js' : '[name].[chunkhash].js',\n    publicPath: project.publicPath,\n  },\n  resolve: {\n    modules: [\n      inProject(project.srcDir),\n      'node_modules',\n    ],\n    extensions: ['*', '.js', '.jsx', '.json'],\n  },\n  externals: project.externals,\n  module: {\n    rules: [],\n  },\n  plugins: [\n    new webpack.DefinePlugin(Object.assign({\n      'process.env': { NODE_ENV: JSON.stringify(project.env) },\n      __DEV__,\n      __TEST__,\n      __PROD__,\n    }, project.globals))\n  ],\n}\n\n// JavaScript\n// ------------------------------------\nconfig.module.rules.push({\n  test: /\\.(js|jsx)$/,\n  exclude: /node_modules/,\n  use: [{\n    loader: 'babel-loader',\n    query: {\n      cacheDirectory: true,\n      plugins: [\n        'babel-plugin-transform-class-properties',\n        'babel-plugin-syntax-dynamic-import',\n        [\n          'babel-plugin-transform-runtime',\n          {\n            helpers: true,\n            polyfill: false, // we polyfill needed features in src/normalize.js\n            regenerator: true,\n          },\n        ],\n        [\n          'babel-plugin-transform-object-rest-spread',\n          {\n            useBuiltIns: true // we polyfill Object.assign in src/normalize.js\n          },\n        ],\n      ],\n      presets: [\n        'babel-preset-react',\n        ['babel-preset-env', {\n          modules: false,\n          targets: {\n            ie9: true,\n          },\n          uglify: true,\n        }],\n      ]\n    },\n  }],\n})\n\n// Styles\n// ------------------------------------\nconst extractStyles = new ExtractTextPlugin({\n  filename: 'styles/[name].[contenthash].css',\n  allChunks: true,\n  disable: __DEV__,\n})\n\nconfig.module.rules.push({\n  test: /\\.(sass|scss)$/,\n  loader: extractStyles.extract({\n    fallback: 'style-loader',\n    use: [\n      {\n        loader: 'css-loader',\n        options: {\n          sourceMap: project.sourcemaps,\n          minimize: {\n            autoprefixer: {\n              add: true,\n              remove: true,\n              browsers: ['last 2 versions'],\n            },\n            discardComments: {\n              removeAll : true,\n            },\n            discardUnused: false,\n            mergeIdents: false,\n            reduceIdents: false,\n            safe: true,\n            sourcemap: project.sourcemaps,\n          },\n        },\n      },\n      {\n        loader: 'sass-loader',\n        options: {\n          sourceMap: project.sourcemaps,\n          includePaths: [\n            inProjectSrc('styles'),\n          ],\n        },\n      }\n    ],\n  })\n})\nconfig.plugins.push(extractStyles)\n\n// Images\n// ------------------------------------\nconfig.module.rules.push({\n  test    : /\\.(png|jpg|gif)$/,\n  loader  : 'url-loader',\n  options : {\n    limit : 8192,\n  },\n})\n\n// Fonts\n// ------------------------------------\n;[\n  ['woff', 'application/font-woff'],\n  ['woff2', 'application/font-woff2'],\n  ['otf', 'font/opentype'],\n  ['ttf', 'application/octet-stream'],\n  ['eot', 'application/vnd.ms-fontobject'],\n  ['svg', 'image/svg+xml'],\n].forEach((font) => {\n  const extension = font[0]\n  const mimetype = font[1]\n\n  config.module.rules.push({\n    test    : new RegExp(`\\\\.${extension}$`),\n    loader  : 'url-loader',\n    options : {\n      name  : 'fonts/[name].[ext]',\n      limit : 10000,\n      mimetype,\n    },\n  })\n})\n\n// HTML Template\n// ------------------------------------\nconfig.plugins.push(new HtmlWebpackPlugin({\n  template: inProjectSrc('index.html'),\n  inject: true,\n  minify: {\n    collapseWhitespace: true,\n  },\n}))\n\n// Development Tools\n// ------------------------------------\nif (__DEV__) {\n  config.entry.main.push(\n    `webpack-hot-middleware/client.js?path=${config.output.publicPath}__webpack_hmr`\n  )\n  config.plugins.push(\n    new webpack.HotModuleReplacementPlugin(),\n    new webpack.NamedModulesPlugin()\n  )\n}\n\n// Bundle Splitting\n// ------------------------------------\nif (!__TEST__) {\n  const bundles = ['normalize', 'manifest']\n\n  if (project.vendors && project.vendors.length) {\n    bundles.unshift('vendor')\n    config.entry.vendor = project.vendors\n  }\n  config.plugins.push(new webpack.optimize.CommonsChunkPlugin({ names: bundles }))\n}\n\n// Production Optimizations\n// ------------------------------------\nif (__PROD__) {\n  config.plugins.push(\n    new webpack.LoaderOptionsPlugin({\n      minimize: true,\n      debug: false,\n    }),\n    new webpack.optimize.UglifyJsPlugin({\n      sourceMap: !!config.devtool,\n      comments: false,\n      compress: {\n        warnings: false,\n        screw_ie8: true,\n        conditionals: true,\n        unused: true,\n        comparisons: true,\n        sequences: true,\n        dead_code: true,\n        evaluate: true,\n        if_return: true,\n        join_vars: true,\n      },\n    })\n  )\n}\n\nmodule.exports = config\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"react-redux-starter-kit\",\n  \"version\": \"3.0.1\",\n  \"description\": \"Get started with React, Redux, and React-Router!\",\n  \"main\": \"index.js\",\n  \"scripts\": {\n    \"clean\": \"rimraf dist\",\n    \"compile\": \"node build/scripts/compile\",\n    \"build\": \"npm run clean && cross-env NODE_ENV=production npm run compile\",\n    \"start\": \"cross-env NODE_ENV=development node build/scripts/start\",\n    \"test\": \"cross-env NODE_ENV=test karma start build/karma.config\",\n    \"test:watch\": \"npm test -- --watch\",\n    \"lint\": \"eslint .\",\n    \"lint:fix\": \"npm run lint -- --fix\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/davezuko/react-redux-starter-kit.git\"\n  },\n  \"author\": \"David Zukowski <david@zuko.me> (http://zuko.me)\",\n  \"license\": \"MIT\",\n  \"dependencies\": {\n    \"bootstrap\": \"^4.0.0-alpha\",\n    \"compression\": \"^1.6.2\",\n    \"express\": \"^4.14.0\",\n    \"object-assign\": \"^4.1.1\",\n    \"promise\": \"^7.1.1\",\n    \"prop-types\": \"^15.5.10\",\n    \"react\": \"^15.5.4\",\n    \"react-dom\": \"^15.5.4\",\n    \"react-redux\": \"^5.0.4\",\n    \"react-router\": \"^3.0.0\",\n    \"redbox-react\": \"^1.3.6\",\n    \"redux\": \"^3.6.0\",\n    \"redux-thunk\": \"^2.2.0\",\n    \"whatwg-fetch\": \"^2.0.3\"\n  },\n  \"devDependencies\": {\n    \"babel-core\": \"^6.24.1\",\n    \"babel-eslint\": \"^7.2.3\",\n    \"babel-loader\": \"^7.0.0\",\n    \"babel-plugin-syntax-dynamic-import\": \"^6.18.0\",\n    \"babel-plugin-transform-class-properties\": \"^6.24.1\",\n    \"babel-plugin-transform-object-rest-spread\": \"^6.23.0\",\n    \"babel-plugin-transform-runtime\": \"^6.15.0\",\n    \"babel-preset-env\": \"^1.4.0\",\n    \"babel-preset-react\": \"^6.24.1\",\n    \"babel-runtime\": \"^6.20.0\",\n    \"chai\": \"^3.5.0\",\n    \"chai-as-promised\": \"^6.0.0\",\n    \"chai-enzyme\": \"^0.6.1\",\n    \"chalk\": \"^1.1.3\",\n    \"codecov\": \"^2.2.0\",\n    \"connect-history-api-fallback\": \"^1.3.0\",\n    \"cross-env\": \"^5.0.0\",\n    \"css-loader\": \"^0.28.1\",\n    \"dirty-chai\": \"^1.2.2\",\n    \"enzyme\": \"^2.8.2\",\n    \"eslint\": \"^3.19.0\",\n    \"eslint-config-standard\": \"^10.2.1\",\n    \"eslint-config-standard-react\": \"^5.0.0\",\n    \"eslint-plugin-babel\": \"^4.1.1\",\n    \"eslint-plugin-import\": \"^2.2.0\",\n    \"eslint-plugin-node\": \"^4.2.2\",\n    \"eslint-plugin-promise\": \"^3.5.0\",\n    \"eslint-plugin-react\": \"^7.0.1\",\n    \"eslint-plugin-standard\": \"^3.0.1\",\n    \"extract-text-webpack-plugin\": \"^2.1.0\",\n    \"figures\": \"^2.0.0\",\n    \"file-loader\": \"^0.11.1\",\n    \"fs-extra\": \"^3.0.1\",\n    \"html-webpack-plugin\": \"^2.24.1\",\n    \"karma\": \"^1.7.0\",\n    \"karma-coverage\": \"^1.1.1\",\n    \"karma-mocha\": \"^1.3.0\",\n    \"karma-mocha-reporter\": \"^2.2.1\",\n    \"karma-phantomjs-launcher\": \"^1.0.4\",\n    \"karma-webpack-with-fast-source-maps\": \"^1.10.0\",\n    \"mocha\": \"^3.2.0\",\n    \"node-sass\": \"^4.5.3\",\n    \"phantomjs-prebuilt\": \"^2.1.14\",\n    \"react-addons-test-utils\": \"^15.5.1\",\n    \"react-test-renderer\": \"^15.5.4\",\n    \"rimraf\": \"^2.6.1\",\n    \"sass-loader\": \"^6.0.5\",\n    \"sinon\": \"^2.2.0\",\n    \"sinon-chai\": \"^2.10.0\",\n    \"style-loader\": \"^0.17.0\",\n    \"url-loader\": \"^0.5.8\",\n    \"webpack\": \"^2.5.1\",\n    \"webpack-dev-middleware\": \"^1.8.4\",\n    \"webpack-hot-middleware\": \"^2.13.2\",\n    \"yargs\": \"^8.0.1\"\n  }\n}\n"
  },
  {
    "path": "project.config.js",
    "content": "const NODE_ENV = process.env.NODE_ENV || 'development'\n\nmodule.exports = {\n  /** The environment to use when building the project */\n  env: NODE_ENV,\n  /** The full path to the project's root directory */\n  basePath: __dirname,\n  /** The name of the directory containing the application source code */\n  srcDir: 'src',\n  /** The file name of the application's entry point */\n  main: 'main',\n  /** The name of the directory in which to emit compiled assets */\n  outDir: 'dist',\n  /** The base path for all projects assets (relative to the website root) */\n  publicPath: '/',\n  /** Whether to generate sourcemaps */\n  sourcemaps: true,\n  /** A hash map of keys that the compiler should treat as external to the project */\n  externals: {},\n  /** A hash map of variables and their values to expose globally */\n  globals: {},\n  /** Whether to enable verbose logging */\n  verbose: false,\n  /** The list of modules to bundle separately from the core application code */\n  vendors: [\n    'react',\n    'react-dom',\n    'redux',\n    'react-redux',\n    'redux-thunk',\n    'react-router',\n  ],\n}\n"
  },
  {
    "path": "public/humans.txt",
    "content": "# Check it out: http://humanstxt.org/\n\n# TEAM\n\n    <name> -- <role> -- <twitter>\n\n# THANKS\n\n    <name>\n"
  },
  {
    "path": "public/robots.txt",
    "content": "User-agent: *\nDisallow:\n"
  },
  {
    "path": "server/main.js",
    "content": "const express = require('express')\nconst path = require('path')\nconst webpack = require('webpack')\nconst logger = require('../build/lib/logger')\nconst webpackConfig = require('../build/webpack.config')\nconst project = require('../project.config')\nconst compress = require('compression')\n\nconst app = express()\napp.use(compress())\n\n// ------------------------------------\n// Apply Webpack HMR Middleware\n// ------------------------------------\nif (project.env === 'development') {\n  const compiler = webpack(webpackConfig)\n\n  logger.info('Enabling webpack development and HMR middleware')\n  app.use(require('webpack-dev-middleware')(compiler, {\n    publicPath  : webpackConfig.output.publicPath,\n    contentBase : path.resolve(project.basePath, project.srcDir),\n    hot         : true,\n    quiet       : false,\n    noInfo      : false,\n    lazy        : false,\n    stats       : 'normal',\n  }))\n  app.use(require('webpack-hot-middleware')(compiler, {\n    path: '/__webpack_hmr'\n  }))\n\n  // Serve static assets from ~/public since Webpack is unaware of\n  // these files. This middleware doesn't need to be enabled outside\n  // of development since this directory will be copied into ~/dist\n  // when the application is compiled.\n  app.use(express.static(path.resolve(project.basePath, 'public')))\n\n  // This rewrites all routes requests to the root /index.html file\n  // (ignoring file requests). If you want to implement universal\n  // rendering, you'll want to remove this middleware.\n  app.use('*', function (req, res, next) {\n    const filename = path.join(compiler.outputPath, 'index.html')\n    compiler.outputFileSystem.readFile(filename, (err, result) => {\n      if (err) {\n        return next(err)\n      }\n      res.set('content-type', 'text/html')\n      res.send(result)\n      res.end()\n    })\n  })\n} else {\n  logger.warn(\n    'Server is being run outside of live development mode, meaning it will ' +\n    'only serve the compiled application bundle in ~/dist. Generally you ' +\n    'do not need an application server for this and can instead use a web ' +\n    'server such as nginx to serve your static files. See the \"deployment\" ' +\n    'section in the README for more information on deployment strategies.'\n  )\n\n  // Serving ~/dist by default. Ideally these files should be served by\n  // the web server and not the app server, but this helps to demo the\n  // server in production.\n  app.use(express.static(path.resolve(project.basePath, project.outDir)))\n}\n\nmodule.exports = app\n"
  },
  {
    "path": "src/components/App.js",
    "content": "import React from 'react'\nimport { browserHistory, Router } from 'react-router'\nimport { Provider } from 'react-redux'\nimport PropTypes from 'prop-types'\n\nclass App extends React.Component {\n  static propTypes = {\n    store: PropTypes.object.isRequired,\n    routes: PropTypes.object.isRequired,\n  }\n\n  shouldComponentUpdate () {\n    return false\n  }\n\n  render () {\n    return (\n      <Provider store={this.props.store}>\n        <div style={{ height: '100%' }}>\n          <Router history={browserHistory} children={this.props.routes} />\n        </div>\n      </Provider>\n    )\n  }\n}\n\nexport default App\n"
  },
  {
    "path": "src/index.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n<head>\n  <title>React Redux Starter Kit</title>\n  <meta charset=\"utf-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n</head>\n<body>\n  <div id=\"root\" style=\"height: 100%\"></div>\n</body>\n</html>\n"
  },
  {
    "path": "src/layouts/PageLayout/PageLayout.js",
    "content": "import React from 'react'\nimport { IndexLink, Link } from 'react-router'\nimport PropTypes from 'prop-types'\nimport './PageLayout.scss'\n\nexport const PageLayout = ({ children }) => (\n  <div className='container text-center'>\n    <h1>React Redux Starter Kit</h1>\n    <IndexLink to='/' activeClassName='page-layout__nav-item--active'>Home</IndexLink>\n    {' · '}\n    <Link to='/counter' activeClassName='page-layout__nav-item--active'>Counter</Link>\n    <div className='page-layout__viewport'>\n      {children}\n    </div>\n  </div>\n)\nPageLayout.propTypes = {\n  children: PropTypes.node,\n}\n\nexport default PageLayout\n"
  },
  {
    "path": "src/layouts/PageLayout/PageLayout.scss",
    "content": ".page-layout__viewport {\n  padding-top: 4rem;\n}\n\n.page-layout__nav-item--active {\n  font-weight: bold;\n  text-decoration: underline;\n}\n"
  },
  {
    "path": "src/main.js",
    "content": "import React from 'react'\nimport ReactDOM from 'react-dom'\nimport createStore from './store/createStore'\nimport './styles/main.scss'\n\n// Store Initialization\n// ------------------------------------\nconst store = createStore(window.__INITIAL_STATE__)\n\n// Render Setup\n// ------------------------------------\nconst MOUNT_NODE = document.getElementById('root')\n\nlet render = () => {\n  const App = require('./components/App').default\n  const routes = require('./routes/index').default(store)\n\n  ReactDOM.render(\n    <App store={store} routes={routes} />,\n    MOUNT_NODE\n  )\n}\n\n// Development Tools\n// ------------------------------------\nif (__DEV__) {\n  if (module.hot) {\n    const renderApp = render\n    const renderError = (error) => {\n      const RedBox = require('redbox-react').default\n\n      ReactDOM.render(<RedBox error={error} />, MOUNT_NODE)\n    }\n\n    render = () => {\n      try {\n        renderApp()\n      } catch (e) {\n        console.error(e)\n        renderError(e)\n      }\n    }\n\n    // Setup hot module replacement\n    module.hot.accept([\n      './components/App',\n      './routes/index',\n    ], () =>\n      setImmediate(() => {\n        ReactDOM.unmountComponentAtNode(MOUNT_NODE)\n        render()\n      })\n    )\n  }\n}\n\n// Let's Go!\n// ------------------------------------\nif (!__TEST__) render()\n"
  },
  {
    "path": "src/normalize.js",
    "content": "/* ========================================================\n\n   ** Browser Normalizer **\n\n   This file is responsible for normalizing the browser environment before\n   the application starts. Doing this allows us to safely use modern language\n   features even when the end user is running an older browser.\n\n   The following polyfills are included by default:\n\n   1) Object.assign\n   2) Promise\n   3) Fetch\n\n   ====================================================== */\n\n// 1) Object.assign\n// ------------------------------------\n// We can't rely on Object.assign being a function since it may be buggy, so\n// defer to `object-assign`. If our Object.assign implementation is correct\n// (determined by `object-assign` internally) the polyfill will be discarded\n// and the native implementation used.\nObject.assign = require('object-assign')\n\n// 2) Promise\n// ------------------------------------\nif (typeof Promise === 'undefined') {\n  require('promise/lib/rejection-tracking').enable()\n  window.Promise = require('promise/lib/es6-extensions.js')\n}\n\n// 3) Fetch\n// ------------------------------------\n// Fetch polyfill depends on a Promise implementation, so it must come after\n// the feature check / polyfill above.\nif (typeof window.fetch === 'undefined') {\n  require('whatwg-fetch')\n}\n"
  },
  {
    "path": "src/routes/Counter/components/Counter.js",
    "content": "import React from 'react'\nimport PropTypes from 'prop-types'\n\nexport const Counter = ({ counter, increment, doubleAsync }) => (\n  <div style={{ margin: '0 auto' }} >\n    <h2>Counter: {counter}</h2>\n    <button className='btn btn-primary' onClick={increment}>\n      Increment\n    </button>\n    {' '}\n    <button className='btn btn-secondary' onClick={doubleAsync}>\n      Double (Async)\n    </button>\n  </div>\n)\nCounter.propTypes = {\n  counter: PropTypes.number.isRequired,\n  increment: PropTypes.func.isRequired,\n  doubleAsync: PropTypes.func.isRequired,\n}\n\nexport default Counter\n"
  },
  {
    "path": "src/routes/Counter/containers/CounterContainer.js",
    "content": "import { connect } from 'react-redux'\nimport { increment, doubleAsync } from '../modules/counter'\n\n/*  This is a container component. Notice it does not contain any JSX,\n    nor does it import React. This component is **only** responsible for\n    wiring in the actions and state necessary to render a presentational\n    component - in this case, the counter:   */\n\nimport Counter from '../components/Counter'\n\n/*  Object of action creators (can also be function that returns object).\n    Keys will be passed as props to presentational components. Here we are\n    implementing our wrapper around increment; the component doesn't care   */\n\nconst mapDispatchToProps = {\n  increment : () => increment(1),\n  doubleAsync\n}\n\nconst mapStateToProps = (state) => ({\n  counter : state.counter\n})\n\n/*  Note: mapStateToProps is where you should use `reselect` to create selectors, ie:\n\n    import { createSelector } from 'reselect'\n    const counter = (state) => state.counter\n    const tripleCount = createSelector(counter, (count) => count * 3)\n    const mapStateToProps = (state) => ({\n      counter: tripleCount(state)\n    })\n\n    Selectors can compute derived data, allowing Redux to store the minimal possible state.\n    Selectors are efficient. A selector is not recomputed unless one of its arguments change.\n    Selectors are composable. They can be used as input to other selectors.\n    https://github.com/reactjs/reselect    */\n\nexport default connect(mapStateToProps, mapDispatchToProps)(Counter)\n"
  },
  {
    "path": "src/routes/Counter/index.js",
    "content": "import { injectReducer } from '../../store/reducers'\n\nexport default (store) => ({\n  path : 'counter',\n  /*  Async getComponent is only invoked when route matches   */\n  getComponent (nextState, cb) {\n    /*  Webpack - use 'require.ensure' to create a split point\n        and embed an async module loader (jsonp) when bundling   */\n    require.ensure([], (require) => {\n      /*  Webpack - use require callback to define\n          dependencies for bundling   */\n      const Counter = require('./containers/CounterContainer').default\n      const reducer = require('./modules/counter').default\n\n      /*  Add the reducer to the store on key 'counter'  */\n      injectReducer(store, { key: 'counter', reducer })\n\n      /*  Return getComponent   */\n      cb(null, Counter)\n\n    /* Webpack named bundle   */\n    }, 'counter')\n  }\n})\n"
  },
  {
    "path": "src/routes/Counter/modules/counter.js",
    "content": "// ------------------------------------\n// Constants\n// ------------------------------------\nexport const COUNTER_INCREMENT = 'COUNTER_INCREMENT'\nexport const COUNTER_DOUBLE_ASYNC = 'COUNTER_DOUBLE_ASYNC'\n\n// ------------------------------------\n// Actions\n// ------------------------------------\nexport function increment (value = 1) {\n  return {\n    type    : COUNTER_INCREMENT,\n    payload : value\n  }\n}\n\n/*  This is a thunk, meaning it is a function that immediately\n    returns a function for lazy evaluation. It is incredibly useful for\n    creating async actions, especially when combined with redux-thunk! */\n\nexport const doubleAsync = () => {\n  return (dispatch, getState) => {\n    return new Promise((resolve) => {\n      setTimeout(() => {\n        dispatch({\n          type    : COUNTER_DOUBLE_ASYNC,\n          payload : getState().counter\n        })\n        resolve()\n      }, 200)\n    })\n  }\n}\n\nexport const actions = {\n  increment,\n  doubleAsync\n}\n\n// ------------------------------------\n// Action Handlers\n// ------------------------------------\nconst ACTION_HANDLERS = {\n  [COUNTER_INCREMENT]    : (state, action) => state + action.payload,\n  [COUNTER_DOUBLE_ASYNC] : (state, action) => state * 2\n}\n\n// ------------------------------------\n// Reducer\n// ------------------------------------\nconst initialState = 0\nexport default function counterReducer (state = initialState, action) {\n  const handler = ACTION_HANDLERS[action.type]\n\n  return handler ? handler(state, action) : state\n}\n"
  },
  {
    "path": "src/routes/Home/components/HomeView.js",
    "content": "import React from 'react'\nimport DuckImage from '../assets/Duck.jpg'\nimport './HomeView.scss'\n\nexport const HomeView = () => (\n  <div>\n    <h4>Welcome!</h4>\n    <img alt='This is a duck, because Redux!' className='duck' src={DuckImage} />\n  </div>\n)\n\nexport default HomeView\n"
  },
  {
    "path": "src/routes/Home/components/HomeView.scss",
    "content": ".duck {\n  display: block;\n  width: 120px;\n  margin: 1.5rem auto;\n}\n"
  },
  {
    "path": "src/routes/Home/index.js",
    "content": "import HomeView from './components/HomeView'\n\n// Sync route definition\nexport default {\n  component : HomeView\n}\n"
  },
  {
    "path": "src/routes/index.js",
    "content": "// We only need to import the modules necessary for initial render\nimport CoreLayout from '../layouts/PageLayout/PageLayout'\nimport Home from './Home'\nimport CounterRoute from './Counter'\n\n/*  Note: Instead of using JSX, we recommend using react-router\n    PlainRoute objects to build route definitions.   */\n\nexport const createRoutes = (store) => ({\n  path        : '/',\n  component   : CoreLayout,\n  indexRoute  : Home,\n  childRoutes : [\n    CounterRoute(store)\n  ]\n})\n\n/*  Note: childRoutes can be chunked or otherwise loaded programmatically\n    using getChildRoutes with the following signature:\n\n    getChildRoutes (location, cb) {\n      require.ensure([], (require) => {\n        cb(null, [\n          // Remove imports!\n          require('./Counter').default(store)\n        ])\n      })\n    }\n\n    However, this is not necessary for code-splitting! It simply provides\n    an API for async route definitions. Your code splitting should occur\n    inside the route `getComponent` function, since it is only invoked\n    when the route exists and matches.\n*/\n\nexport default createRoutes\n"
  },
  {
    "path": "src/store/createStore.js",
    "content": "import { applyMiddleware, compose, createStore as createReduxStore } from 'redux'\nimport thunk from 'redux-thunk'\nimport { browserHistory } from 'react-router'\nimport makeRootReducer from './reducers'\nimport { updateLocation } from './location'\n\nconst createStore = (initialState = {}) => {\n  // ======================================================\n  // Middleware Configuration\n  // ======================================================\n  const middleware = [thunk]\n\n  // ======================================================\n  // Store Enhancers\n  // ======================================================\n  const enhancers = []\n  let composeEnhancers = compose\n\n  if (__DEV__) {\n    if (typeof window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ === 'function') {\n      composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__\n    }\n  }\n\n  // ======================================================\n  // Store Instantiation and HMR Setup\n  // ======================================================\n  const store = createReduxStore(\n    makeRootReducer(),\n    initialState,\n    composeEnhancers(\n      applyMiddleware(...middleware),\n      ...enhancers\n    )\n  )\n  store.asyncReducers = {}\n\n  // To unsubscribe, invoke `store.unsubscribeHistory()` anytime\n  store.unsubscribeHistory = browserHistory.listen(updateLocation(store))\n\n  if (module.hot) {\n    module.hot.accept('./reducers', () => {\n      const reducers = require('./reducers').default\n      store.replaceReducer(reducers(store.asyncReducers))\n    })\n  }\n\n  return store\n}\n\nexport default createStore\n"
  },
  {
    "path": "src/store/location.js",
    "content": "import browserHistory from 'react-router/lib/browserHistory'\n\n// ------------------------------------\n// Constants\n// ------------------------------------\nexport const LOCATION_CHANGE = 'LOCATION_CHANGE'\n\n// ------------------------------------\n// Actions\n// ------------------------------------\nexport function locationChange (location = '/') {\n  return {\n    type    : LOCATION_CHANGE,\n    payload : location\n  }\n}\n\n// ------------------------------------\n// Specialized Action Creator\n// ------------------------------------\nexport const updateLocation = ({ dispatch }) => {\n  return (nextLocation) => dispatch(locationChange(nextLocation))\n}\n\n// ------------------------------------\n// Reducer\n// ------------------------------------\nconst initialState = browserHistory.getCurrentLocation()\nexport default function locationReducer (state = initialState, action) {\n  return action.type === LOCATION_CHANGE\n    ? action.payload\n    : state\n}\n"
  },
  {
    "path": "src/store/reducers.js",
    "content": "import { combineReducers } from 'redux'\nimport locationReducer from './location'\n\nexport const makeRootReducer = (asyncReducers) => {\n  return combineReducers({\n    location: locationReducer,\n    ...asyncReducers\n  })\n}\n\nexport const injectReducer = (store, { key, reducer }) => {\n  if (Object.hasOwnProperty.call(store.asyncReducers, key)) return\n\n  store.asyncReducers[key] = reducer\n  store.replaceReducer(makeRootReducer(store.asyncReducers))\n}\n\nexport default makeRootReducer\n"
  },
  {
    "path": "src/styles/_base.scss",
    "content": "/*\nApplication Settings Go Here\n------------------------------------\nThis file acts as a bundler for all variables/mixins/themes, so they\ncan easily be swapped out without `core.scss` ever having to know.\n\nFor example:\n\n@import './variables/colors';\n@import './variables/components';\n@import './themes/default';\n*/\n"
  },
  {
    "path": "src/styles/main.scss",
    "content": "@import 'base';\n@import '~bootstrap/scss/bootstrap.scss';\n\n// Some best-practice CSS that's useful for most apps\n// Just remove them if they're not what you want\nhtml {\n  box-sizing: border-box;\n}\n\nhtml,\nbody {\n  margin: 0;\n  padding: 0;\n  height: 100%;\n}\n\n*,\n*:before,\n*:after {\n  box-sizing: inherit;\n}\n"
  },
  {
    "path": "tests/.eslintrc",
    "content": "{\n  \"extends\" : \"../.eslintrc\",\n  \"env\"     : {\n    \"mocha\" : true\n  },\n  \"globals\" : {\n    \"expect\" : false,\n    \"should\" : false,\n    \"sinon\"  : false\n  }\n}\n"
  },
  {
    "path": "tests/layouts/PageLayout.spec.js",
    "content": "import React from 'react'\nimport PageLayout from 'layouts/PageLayout/PageLayout'\nimport { shallow } from 'enzyme'\n\ndescribe('(Layout) PageLayout', () => {\n  it('renders as a <div>', () => {\n    shallow(<PageLayout />).should.have.tagName('div')\n  })\n\n  it('renders a project title', () => {\n    shallow(<PageLayout />).find('h1').should.have.text('React Redux Starter Kit')\n  })\n\n  it('renders its children inside of the viewport', () => {\n    const Child = () => <h2>child</h2>\n    shallow(\n      <PageLayout>\n        <Child />\n      </PageLayout>\n    )\n      .find('.page-layout__viewport')\n      .should.contain(<Child />)\n  })\n})\n"
  },
  {
    "path": "tests/routes/Counter/components/Counter.spec.js",
    "content": "import React from 'react'\nimport { bindActionCreators } from 'redux'\nimport { Counter } from 'routes/Counter/components/Counter'\nimport { shallow } from 'enzyme'\n\ndescribe('(Component) Counter', () => {\n  let _props, _spies, _wrapper\n\n  beforeEach(() => {\n    _spies = {}\n    _props = {\n      counter : 5,\n      ...bindActionCreators({\n        doubleAsync : (_spies.doubleAsync = sinon.spy()),\n        increment   : (_spies.increment = sinon.spy())\n      }, _spies.dispatch = sinon.spy())\n    }\n    _wrapper = shallow(<Counter {..._props} />)\n  })\n\n  it('renders as a <div>.', () => {\n    expect(_wrapper.is('div')).to.equal(true)\n  })\n\n  it('renders with an <h2> that includes Counter label.', () => {\n    expect(_wrapper.find('h2').text()).to.match(/Counter:/)\n  })\n\n  it('renders {props.counter} at the end of the sample counter <h2>.', () => {\n    expect(_wrapper.find('h2').text()).to.match(/5$/)\n    _wrapper.setProps({ counter: 8 })\n    expect(_wrapper.find('h2').text()).to.match(/8$/)\n  })\n\n  it('renders exactly two buttons.', () => {\n    expect(_wrapper.find('button')).to.have.length(2)\n  })\n\n  describe('Increment', () => {\n    let _button\n\n    beforeEach(() => {\n      _button = _wrapper.find('button').filterWhere(a => a.text() === 'Increment')\n    })\n\n    it('exists', () => {\n      expect(_button).to.exist()\n    })\n\n    it('is a primary button', () => {\n      expect(_button.hasClass('btn btn-primary')).to.be.true()\n    })\n\n    it('Calls props.increment when clicked', () => {\n      _spies.dispatch.should.have.not.been.called()\n\n      _button.simulate('click')\n\n      _spies.dispatch.should.have.been.called()\n      _spies.increment.should.have.been.called()\n    })\n  })\n\n  describe('Double Async Button', () => {\n    let _button\n\n    beforeEach(() => {\n      _button = _wrapper.find('button').filterWhere(a => a.text() === 'Double (Async)')\n    })\n\n    it('exists', () => {\n      expect(_button).to.exist()\n    })\n\n    it('is a secondary button', () => {\n      expect(_button.hasClass('btn btn-secondary')).to.be.true()\n    })\n\n    it('Calls props.doubleAsync when clicked', () => {\n      _spies.dispatch.should.have.not.been.called()\n\n      _button.simulate('click')\n\n      _spies.dispatch.should.have.been.called()\n      _spies.doubleAsync.should.have.been.called()\n    })\n  })\n})\n"
  },
  {
    "path": "tests/routes/Counter/index.spec.js",
    "content": "import CounterRoute from 'routes/Counter'\n\ndescribe('(Route) Counter', () => {\n  it('returns a route configuration object', () => {\n    expect(typeof CounterRoute({})).to.equal('object')\n  })\n\n  it('has a path \\'counter\\'', () => {\n    expect(CounterRoute({}).path).to.equal('counter')\n  })\n})\n"
  },
  {
    "path": "tests/routes/Counter/modules/counter.spec.js",
    "content": "import {\n  COUNTER_INCREMENT,\n  increment,\n  doubleAsync,\n  default as counterReducer\n} from 'routes/Counter/modules/counter'\n\ndescribe('(Redux Module) Counter', () => {\n  it('Should export a constant COUNTER_INCREMENT.', () => {\n    expect(COUNTER_INCREMENT).to.equal('COUNTER_INCREMENT')\n  })\n\n  describe('(Reducer)', () => {\n    it('Should be a function.', () => {\n      expect(counterReducer).to.be.a('function')\n    })\n\n    it('Should initialize with a state of 0 (Number).', () => {\n      expect(counterReducer(undefined, {})).to.equal(0)\n    })\n\n    it('Should return the previous state if an action was not matched.', () => {\n      let state = counterReducer(undefined, {})\n      expect(state).to.equal(0)\n      state = counterReducer(state, { type: '@@@@@@@' })\n      expect(state).to.equal(0)\n      state = counterReducer(state, increment(5))\n      expect(state).to.equal(5)\n      state = counterReducer(state, { type: '@@@@@@@' })\n      expect(state).to.equal(5)\n    })\n  })\n\n  describe('(Action Creator) increment', () => {\n    it('Should be exported as a function.', () => {\n      expect(increment).to.be.a('function')\n    })\n\n    it('Should return an action with type \"COUNTER_INCREMENT\".', () => {\n      expect(increment()).to.have.property('type', COUNTER_INCREMENT)\n    })\n\n    it('Should assign the first argument to the \"payload\" property.', () => {\n      expect(increment(5)).to.have.property('payload', 5)\n    })\n\n    it('Should default the \"payload\" property to 1 if not provided.', () => {\n      expect(increment()).to.have.property('payload', 1)\n    })\n  })\n\n  describe('(Action Creator) doubleAsync', () => {\n    let _globalState\n    let _dispatchSpy\n    let _getStateSpy\n\n    beforeEach(() => {\n      _globalState = {\n        counter : counterReducer(undefined, {})\n      }\n      _dispatchSpy = sinon.spy((action) => {\n        _globalState = {\n          ..._globalState,\n          counter : counterReducer(_globalState.counter, action)\n        }\n      })\n      _getStateSpy = sinon.spy(() => {\n        return _globalState\n      })\n    })\n\n    it('Should be exported as a function.', () => {\n      expect(doubleAsync).to.be.a('function')\n    })\n\n    it('Should return a function (is a thunk).', () => {\n      expect(doubleAsync()).to.be.a('function')\n    })\n\n    it('Should return a promise from that thunk that gets fulfilled.', () => {\n      return doubleAsync()(_dispatchSpy, _getStateSpy).should.eventually.be.fulfilled\n    })\n\n    it('Should call dispatch and getState exactly once.', () => {\n      return doubleAsync()(_dispatchSpy, _getStateSpy)\n        .then(() => {\n          _dispatchSpy.should.have.been.calledOnce()\n          _getStateSpy.should.have.been.calledOnce()\n        })\n    })\n\n    it('Should produce a state that is double the previous state.', () => {\n      _globalState = { counter: 2 }\n\n      return doubleAsync()(_dispatchSpy, _getStateSpy)\n        .then(() => {\n          _dispatchSpy.should.have.been.calledOnce()\n          _getStateSpy.should.have.been.calledOnce()\n          expect(_globalState.counter).to.equal(4)\n          return doubleAsync()(_dispatchSpy, _getStateSpy)\n        })\n        .then(() => {\n          _dispatchSpy.should.have.been.calledTwice()\n          _getStateSpy.should.have.been.calledTwice()\n          expect(_globalState.counter).to.equal(8)\n        })\n    })\n  })\n\n  // NOTE: if you have a more complex state, you will probably want to verify\n  // that you did not mutate the state. In this case our state is just a number\n  // (which cannot be mutated).\n  describe('(Action Handler) COUNTER_INCREMENT', () => {\n    it('Should increment the state by the action payload\\'s \"value\" property.', () => {\n      let state = counterReducer(undefined, {})\n      expect(state).to.equal(0)\n      state = counterReducer(state, increment(1))\n      expect(state).to.equal(1)\n      state = counterReducer(state, increment(2))\n      expect(state).to.equal(3)\n      state = counterReducer(state, increment(-3))\n      expect(state).to.equal(0)\n    })\n  })\n})\n"
  },
  {
    "path": "tests/routes/Home/components/HomeView.spec.js",
    "content": "import React from 'react'\nimport { HomeView } from 'routes/Home/components/HomeView'\nimport { render } from 'enzyme'\n\ndescribe('(View) Home', () => {\n  let _component\n\n  beforeEach(() => {\n    _component = render(<HomeView />)\n  })\n\n  it('Renders a welcome message', () => {\n    const welcome = _component.find('h4')\n    expect(welcome).to.exist()\n    expect(welcome.text()).to.match(/Welcome!/)\n  })\n\n  it('Renders an awesome duck image', () => {\n    const duck = _component.find('img')\n    expect(duck).to.exist()\n    expect(duck.attr('alt')).to.match(/This is a duck, because Redux!/)\n  })\n})\n"
  },
  {
    "path": "tests/routes/Home/index.spec.js",
    "content": "import HomeRoute from 'routes/Home'\n\ndescribe('(Route) Home', () => {\n  let _component\n\n  beforeEach(() => {\n    _component = HomeRoute.component()\n  })\n\n  it('Should return a route configuration object', () => {\n    expect(typeof HomeRoute).to.equal('object')\n  })\n\n  it('Should define a route component', () => {\n    expect(_component.type).to.equal('div')\n  })\n})\n"
  },
  {
    "path": "tests/store/createStore.spec.js",
    "content": "import {\n  default as createStore\n} from 'store/createStore'\n\ndescribe('(Store) createStore', () => {\n  let store\n\n  before(() => {\n    store = createStore()\n  })\n\n  it('should have an empty asyncReducers object', () => {\n    expect(store.asyncReducers).to.be.an('object')\n    expect(store.asyncReducers).to.be.empty()\n  })\n\n  describe('(Location)', () => {\n    it('store should be initialized with Location state', () => {\n      const location = {\n        pathname : '/echo'\n      }\n      store.dispatch({\n        type    : 'LOCATION_CHANGE',\n        payload : location\n      })\n      expect(store.getState().location).to.deep.equal(location)\n    })\n  })\n})\n"
  },
  {
    "path": "tests/store/location.spec.js",
    "content": "import {\n  LOCATION_CHANGE,\n  locationChange,\n  updateLocation,\n  default as locationReducer\n} from 'store/location'\n\ndescribe('(Internal Module) Location', () => {\n  it('Should export a constant LOCATION_CHANGE.', () => {\n    expect(LOCATION_CHANGE).to.equal('LOCATION_CHANGE')\n  })\n\n  describe('(Reducer)', () => {\n    it('Should be a function.', () => {\n      expect(locationReducer).to.be.a('function')\n    })\n\n    it('Should initialize with a location object.', () => {\n      expect(locationReducer(undefined, {})).to.be.an('object')\n      expect(locationReducer(undefined, {})).to.have.property('pathname')\n    })\n\n    it('Should return the previous state if an action was not matched.', () => {\n      let state = locationReducer(undefined, {})\n      expect(state).to.be.an('object')\n      expect(state).to.have.property('pathname')\n      expect(state).to.have.property('pathname', '/context.html')\n      state = locationReducer(state, { type: '@@@@@@@' })\n      expect(state).to.have.property('pathname', '/context.html')\n\n      const locationState = { pathname: '/yup' }\n      state = locationReducer(state, locationChange(locationState))\n      expect(state).to.equal(locationState)\n      expect(state).to.have.property('pathname', '/yup')\n      state = locationReducer(state, { type: '@@@@@@@' })\n      expect(state).to.equal(locationState)\n      expect(state).to.have.property('pathname', '/yup')\n    })\n  })\n\n  describe('(Action Creator) locationChange', () => {\n    it('Should be exported as a function.', () => {\n      expect(locationChange).to.be.a('function')\n    })\n\n    it('Should return an action with type \"LOCATION_CHANGE\".', () => {\n      expect(locationChange()).to.have.property('type', LOCATION_CHANGE)\n    })\n\n    it('Should assign the first argument to the \"payload\" property.', () => {\n      const locationState = { pathname: '/yup' }\n      expect(locationChange(locationState)).to.have.property('payload', locationState)\n    })\n\n    it('Should default the \"payload\" property to \"/\" if not provided.', () => {\n      expect(locationChange()).to.have.property('payload', '/')\n    })\n  })\n\n  describe('(Specialized Action Creator) updateLocation', () => {\n    let _globalState\n    let _dispatchSpy\n\n    beforeEach(() => {\n      _globalState = {\n        location : locationReducer(undefined, {})\n      }\n      _dispatchSpy = sinon.spy((action) => {\n        _globalState = {\n          ..._globalState,\n          location : locationReducer(_globalState.location, action)\n        }\n      })\n    })\n\n    it('Should be exported as a function.', () => {\n      expect(updateLocation).to.be.a('function')\n    })\n\n    it('Should return a function (is a thunk).', () => {\n      expect(updateLocation({ dispatch: _dispatchSpy })).to.be.a('function')\n    })\n\n    it('Should call dispatch exactly once.', () => {\n      updateLocation({ dispatch: _dispatchSpy })('/')\n      expect(_dispatchSpy.should.have.been.calledOnce)\n    })\n  })\n})\n"
  },
  {
    "path": "tests/test-bundler.js",
    "content": "import 'normalize.js'\nimport chai from 'chai'\nimport sinon from 'sinon'\nimport dirtyChai from 'dirty-chai'\nimport chaiAsPromised from 'chai-as-promised'\nimport sinonChai from 'sinon-chai'\nimport chaiEnzyme from 'chai-enzyme'\n\n// Mocha / Chai\n// ------------------------------------\nmocha.setup({ ui: 'bdd' })\nchai.should()\n\nglobal.chai = chai\nglobal.expect = chai.expect\nglobal.sinon = sinon\n\n// Chai Plugins\n// ------------------------------------\nchai.use(chaiEnzyme())\nchai.use(dirtyChai)\nchai.use(chaiAsPromised)\nchai.use(sinonChai)\n\n// Test Importer\n// ------------------------------------\n// We use a Webpack global here as it is replaced with a string during compile.\n// Using a regular JS variable is not statically analyzable so webpack will throw warnings.\nconst testsContext = require.context('./', true, /\\.(spec|test)\\.(js|ts|tsx)$/)\n\n// When a test file changes, only rerun that spec file. If something outside of a\n// test file changed, rerun all tests.\n// https://www.npmjs.com/package/karma-webpack-with-fast-source-maps\nconst __karmaWebpackManifest__ = []\nconst allTests = testsContext.keys()\nconst changedTests = allTests.filter(path => {\n  return __karmaWebpackManifest__.indexOf(path) !== -1\n})\n\n;(changedTests.length ? changedTests : allTests).forEach(testsContext)\n"
  }
]