diff --git a/.gitignore b/.gitignore index 86a34a7b..0293f91f 100644 --- a/.gitignore +++ b/.gitignore @@ -27,7 +27,7 @@ vendor/ruby .ruby-gemset # Generated js bundles -/app/assets/javascripts/generated/* +/app/assets/webpack/ # Rubymine/IntelliJ .idea diff --git a/.scss-lint.yml b/.scss-lint.yml index 52b2a854..7371ca3e 100644 --- a/.scss-lint.yml +++ b/.scss-lint.yml @@ -2,7 +2,9 @@ scss_files: - 'app/assets/stylesheets/**/*.scss' - - 'client/assets/stylesheets/**/*.scss' + - 'client/app/**/*.scss' + +exclude: 'client/node_modules/**' linters: # BangFormat: @@ -132,8 +134,8 @@ linters: # enabled: true # max_depth: 3 # -# SelectorFormat: -# enabled: true + SelectorFormat: + enabled: false # convention: hyphenated_lowercase # or 'strict_BEM', or 'hyphenated_BEM', or 'snake_case', or 'camel_case', or a regex pattern # # Shorthand: diff --git a/.travis.yml b/.travis.yml index f38d2cd2..c8ab4a53 100644 --- a/.travis.yml +++ b/.travis.yml @@ -18,8 +18,6 @@ install: - nvm install 5.0 - nvm use 5.0 - npm install - - cd client && npm run build:client - - npm run build:server before_script: - export DISPLAY=:99.0 - sh -e /etc/init.d/xvfb start diff --git a/Gemfile b/Gemfile index 9a4d81a9..ad9797db 100644 --- a/Gemfile +++ b/Gemfile @@ -87,6 +87,7 @@ end group :test do gem "coveralls", require: false gem "rspec-rails" + gem "rspec-retry" gem "capybara" gem "capybara-screenshot" gem "selenium-webdriver" diff --git a/Gemfile.lock b/Gemfile.lock index 99870124..8c16e6f0 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -229,6 +229,8 @@ GEM rspec-expectations (~> 3.4.0) rspec-mocks (~> 3.4.0) rspec-support (~> 3.4.0) + rspec-retry (0.4.5) + rspec-core rspec-support (3.4.1) rubocop (0.35.1) astrolabe (~> 1.3) @@ -350,6 +352,7 @@ DEPENDENCIES rails_12factor react_on_rails rspec-rails + rspec-retry rubocop ruby-lint sass-rails diff --git a/Procfile.dev b/Procfile.dev index 6fb953b3..7912102b 100644 --- a/Procfile.dev +++ b/Procfile.dev @@ -1,4 +1,11 @@ web: rails s -client: sh -c 'rm app/assets/javascripts/generated/* || true && cd client && npm run build:dev:client' + +# Run the hot reload server for client development +client: sh -c 'rm app/assets/webpack/* || true && cd client && HOT_RAILS_PORT=3500 npm run build:dev:client' + +# Keep the JS fresh for specs +client-spec: sh -c 'cd client && npm run build:test:client' + +# Keep the JS fresh for server rendering server: sh -c 'cd client && npm run build:dev:server' -hot: sh -c 'cd client && npm start' +hot: sh -c 'cd client && HOT_PORT=4000 npm start' diff --git a/README.md b/README.md index 6fb8b75c..3b8a0a6d 100644 --- a/README.md +++ b/README.md @@ -127,11 +127,14 @@ Note that it's important to run the Rails server on a different port than the no # Webpack configuration ## Config Files + - `webpack.client.base.config.js`: Common configuration file to minimize code duplication for client.rails and client.hot. -- `webpack.client.rails.config.js`: Used to generate the Rails bundles for Rails use. -- `webpack.client.hot.config.js`: Used by server.js to run the Webpack Dev server. -- `webpack.server.rails.config.js`: Common configuration file to minimize code duplication -between the HMR and Rails configurations. +- `webpack.client.rails.build.config.js`: Client side js bundle. +- `webpack.server.rails.build.config.js`: Server side js bundle + +These are used for hot reloading (Webpack Dev Server): +- `webpack.client.rails.hot.config.js`: Used to generate the Rails bundles for Rails use so you get hot reloading within your Rails app. +- `webpack.client.hot.config.js`: Used by server.js to run the Webpack Dev server for stubbing the api end points ## Webpack Resources - Good overview: [Pete Hunt's Webpack Howto](https://github.com/petehunt/webpack-howto) diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application_dev.js similarity index 66% rename from app/assets/javascripts/application.js rename to app/assets/javascripts/application_dev.js index 8bba0bba..45981e68 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application_dev.js @@ -10,15 +10,14 @@ // Read Sprockets README (https://github.com/sstephenson/sprockets#sprockets-directives) for details // about supported directives. -// CRITICAL that generated/vendor-bundle must be BEFORE bootstrap-sprockets and turbolinks since it is -// exposing jQuery and jQuery-ujs -//= require generated/vendor-bundle -//= require generated/app-bundle +// All webpack assets in development will be loaded via webpack dev server +// It's important to include them in layout view above this asset +// b/c it exposes jQuery for turbolinks and another non-webpack JS (if any) -// Next two depend on jQuery +// This one depends on jQuery //= require turbolinks -//= require bootstrap-sprockets +// This will soon be removed as it will be in vendor-bundle with react_on_rails 2.0 //= require react_on_rails //= require rails_startup diff --git a/app/assets/javascripts/application_prod.js b/app/assets/javascripts/application_prod.js new file mode 100644 index 00000000..9ca7530a --- /dev/null +++ b/app/assets/javascripts/application_prod.js @@ -0,0 +1,13 @@ +// This file is used in production to server generated JS assets. In development mode, we use the Webpack Dev Server +// to provide assets. This allows for hot reloading of the JS and CSS. +// See app/helpers/application_helper.rb for how the correct assets file is picked based on the Rails environment. +// Those helpers are used here: app/views/layouts/application.html.erb + +// These assets are located in app/assets/webpack directory +// CRITICAL that webpack/vendor-bundle must be BEFORE turbolinks +// since it is exposing jQuery and jQuery-ujs +//= require vendor-bundle +//= require app-bundle + +// Non-webpack assets incl turbolinks +//= require application_dev diff --git a/app/assets/stylesheets/_bootstrap-custom.scss b/app/assets/stylesheets/_bootstrap-custom.scss deleted file mode 100644 index f2708cb7..00000000 --- a/app/assets/stylesheets/_bootstrap-custom.scss +++ /dev/null @@ -1,59 +0,0 @@ -// Customizations - needs to be imported first! -// The _bootstrap-variables-customization.scss file is located under -// client/assets/stylesheets, which has been added to the Rails asset -// pipeline search path. See config/application.rb. -@import 'bootstrap-variables-customization'; - -// Core variables and mixins -@import 'bootstrap/variables'; -@import 'bootstrap/mixins'; - -// Reset and dependencies -@import 'bootstrap/normalize'; -@import 'bootstrap/print'; -@import 'bootstrap/glyphicons'; - -// Core CSS -@import 'bootstrap/scaffolding'; -@import 'bootstrap/type'; -@import 'bootstrap/code'; -@import 'bootstrap/grid'; -@import 'bootstrap/tables'; -@import 'bootstrap/forms'; -@import 'bootstrap/buttons'; - -// Components -@import 'bootstrap/component-animations'; -@import 'bootstrap/dropdowns'; -@import 'bootstrap/button-groups'; -@import 'bootstrap/input-groups'; -@import 'bootstrap/navs'; -@import 'bootstrap/navbar'; -@import 'bootstrap/breadcrumbs'; -@import 'bootstrap/pagination'; -@import 'bootstrap/pager'; -@import 'bootstrap/labels'; -@import 'bootstrap/badges'; -//@import 'bootstrap/jumbotron'; // excluding as an example -@import 'bootstrap/thumbnails'; -@import 'bootstrap/alerts'; -//@import 'bootstrap/progress-bars'; // excluding as an example -@import 'bootstrap/media'; -@import 'bootstrap/list-group'; -@import 'bootstrap/panels'; -@import 'bootstrap/responsive-embed'; -@import 'bootstrap/wells'; -@import 'bootstrap/close'; - -// Components w/ JavaScript -@import 'bootstrap/modals'; // excluding as an example -@import 'bootstrap/tooltip'; -@import 'bootstrap/popovers'; -@import 'bootstrap/carousel'; // excluding as an example - -// Utility classes -@import 'bootstrap/utilities'; -@import 'bootstrap/responsive-utilities'; - -// This must come after all the boostrap styles are loaded so that these styles can override those. -@import 'app-styling-post-bootstrap-loading'; diff --git a/app/assets/stylesheets/application.css.scss b/app/assets/stylesheets/application.css.scss deleted file mode 100644 index e2670123..00000000 --- a/app/assets/stylesheets/application.css.scss +++ /dev/null @@ -1,12 +0,0 @@ -// This variable $rails is used by bootstrap-custom so that fonts are loaded slightly differently -// with Rails vs. the Webpack Dev Server -$rails: true; - -// Those scss files are located under client/assets/stylesheets, -// which has been added to the Rails asset pipeline search path. -// See config/application.rb. -@import 'bootstrap-custom'; -@import 'test-stylesheet'; -@import 'test-sass-stylesheet'; - -@import 'bootstrap-sprockets'; diff --git a/app/assets/stylesheets/application_dev.css.scss b/app/assets/stylesheets/application_dev.css.scss new file mode 100644 index 00000000..d880a065 --- /dev/null +++ b/app/assets/stylesheets/application_dev.css.scss @@ -0,0 +1,2 @@ +// Any non webpack assets can be imported here +// Others will be served via webpack-dev-server diff --git a/app/assets/stylesheets/application_prod.css.scss b/app/assets/stylesheets/application_prod.css.scss new file mode 100644 index 00000000..8de4dcc0 --- /dev/null +++ b/app/assets/stylesheets/application_prod.css.scss @@ -0,0 +1,6 @@ +// These assets are located in app/assets/webpack directory +@import 'vendor-bundle'; +@import 'app-bundle'; + +// Non-webpack assets +@import 'application_dev'; diff --git a/app/assets/stylesheets/scaffolds.css.scss b/app/assets/stylesheets/scaffolds.css.scss deleted file mode 100644 index 5bb34c9a..00000000 --- a/app/assets/stylesheets/scaffolds.css.scss +++ /dev/null @@ -1,77 +0,0 @@ -// scss-lint:disable SelectorFormat, IdSelector -body { - background-color: #FFFFFF; - color: #333333; - font-family: verdana, arial, helvetica, sans-serif; - font-size: 13px; - line-height: 18px; -} - -p, -ol, -ul, -td { - font-family: verdana, arial, helvetica, sans-serif; - font-size: 13px; - line-height: 18px; -} - -pre { - background-color: #EEEEEE; - font-size: 11px; - padding: 10px; -} - -a { - color: #000000; - - &:visited { - color: #666666; - } - - &:hover { - background-color: #000000; - color: #FFFFFF; - } -} - -div { - &.field, - &.actions { - margin-bottom: 10px; - } -} - -#notice { - color: green; -} - -.field_with_errors { - background-color: red; - display: table; - padding: 2px; -} - -#error_explanation { - background-color: #F0F0F0; - border: 2px solid red; - margin-bottom: 20px; - padding: 7px 7px 0; - width: 450px; - - h2 { - background-color: #CC0000; - color: #FFFFFF; - font-size: 12px; - font-weight: bold; - margin: -7px; - margin-bottom: 0; - padding: 5px 5px 5px 15px; - text-align: left; - } - - ul li { - font-size: 12px; - list-style: square; - } -} diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index de6be794..5c79a21d 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -1,2 +1,14 @@ module ApplicationHelper + # TODO: MOVE TO helper in react_on_rails + # See application.html.erb for usage example + def env_javascript_include_tag(prod_asset, dev_asset, params = {}) + asset_file = !Rails.env.development? ? prod_asset : dev_asset + return javascript_include_tag(asset_file, params) if asset_file + end + + # TODO: MOVE TO helper in react_on_rails + def env_stylesheet_link_tag(prod_asset, dev_asset, params = {}) + asset_file = !Rails.env.development? ? prod_asset : dev_asset + return stylesheet_link_tag(asset_file, params) if asset_file + end end diff --git a/app/views/comments/show.html.erb b/app/views/comments/show.html.erb index 64ddc735..2e77ff5e 100644 --- a/app/views/comments/show.html.erb +++ b/app/views/comments/show.html.erb @@ -1,12 +1,12 @@

<%= notice %>

-

+

Author: <%= @comment.author %>

-

+

Text: <%= @comment.text %>

diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 07b15239..92c9568b 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -2,8 +2,10 @@ RailsReactTutorial - <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track' => true %> - <%= javascript_include_tag 'application', 'data-turbolinks-track' => true %> + <%= env_stylesheet_link_tag 'application_prod', 'application_dev', media: 'all', 'data-turbolinks-track' => true %> + <%= env_javascript_include_tag nil, 'http://localhost:3500/vendor-bundle.js' %> + <%= env_javascript_include_tag nil, 'http://localhost:3500/app-bundle.js' %> + <%= env_javascript_include_tag 'application_prod', 'application_dev', 'data-turbolinks-track' => true %> <%= csrf_meta_tags %> diff --git a/app/views/pages/no_router.html.erb b/app/views/pages/no_router.html.erb index eaaf3a4b..4537ac8b 100644 --- a/app/views/pages/no_router.html.erb +++ b/app/views/pages/no_router.html.erb @@ -3,4 +3,4 @@ <%= render "header" %> <%= react_component('App', render(template: "/comments/index.json.jbuilder"), - generator_function: true, prerender: true) %> + generator_function: true, prerender: false) %> diff --git a/client/.babelrc b/client/.babelrc index b0b9a96e..9b7d435a 100644 --- a/client/.babelrc +++ b/client/.babelrc @@ -1,3 +1,3 @@ { - "stage": 0 + "presets": ["es2015", "stage-0", "react"] } diff --git a/client/.bootstraprc b/client/.bootstraprc new file mode 100644 index 00000000..5286126b --- /dev/null +++ b/client/.bootstraprc @@ -0,0 +1,123 @@ +--- +# Output debugging info +# loglevel: debug + +# Major version of Bootstrap: 3 or 4 +bootstrapVersion: 3 + +# Webpack loaders, order matters +styleLoaders: + - style + - css + - sass + +# Extract styles to stand-alone css file +# Different settings for different environments can be used, +# It depends on value of NODE_ENV environment variable +# This param can also be set in webpack config: +# entry: 'bootstrap-loader/extractStyles' +extractStyles: false +# env: +# development: +# extractStyles: false +# production: +# extractStyles: true + +# Customize Bootstrap variables that get imported before the original Bootstrap variables. +# Thus original Bootstrap variables can depend on values from here. All the bootstrap +# variables are configured with !default, and thus, if you define the variable here, then +# that value is used, rather than the default. However, many bootstrap variables are derived +# from other bootstrap variables, and thus, you want to set this up before we load the +# official bootstrap versions. +# For example, _variables.scss contains: +# $input-color: $gray !default; +# This means you can define $input-color before we load _variables.scss +preBootstrapCustomizations: ./app/assets/styles/bootstrap-pre-customizations.scss + +# This gets loaded after bootstrap/variables is loaded and before bootstrap is loaded. +# A good example of this is when you want to override a bootstrap variable to be based +# on the default value of bootstrap. This is pretty specialized case. Thus, you normally +# just override bootrap variables in preBootstrapCustomizations so that derived +# variables will use your definition. +# +# For example, in _variables.scss: +# $input-height: (($font-size-base * $line-height) + ($input-padding-y * 2) + ($border-width * 2)) !default; +# This means that you could define this yourself in preBootstrapCustomizations. Or you can do +# this in bootstrapCustomizations to make the input height 10% bigger than the default calculation. +# Thus you can leverage the default calculations. +# $input-height: $input-height * 1.10; +# bootstrapCustomizations: ./app/assets/styles/bootstrap-customizations.scss + +# Import your custom styles here. You have access to all the bootstrap variables. If you require +# your sass files separately, you will not have access to the bootstrap variables, mixins, clases, etc. +# Usually this endpoint-file contains list of @imports of your application styles. +# But since we use CSS Modules, we don't need it - every module gets imported from JS component. +# appStyles: ./app/styles/app.scss + +### Bootstrap styles +styles: + + # Mixins + mixins: true + + # Reset and dependencies + normalize: true + print: true + glyphicons: true + + # Core CSS + scaffolding: true + type: true + code: true + grid: true + tables: true + forms: true + buttons: true + + # Components + component-animations: true + dropdowns: true + button-groups: true + input-groups: true + navs: true + navbar: true + breadcrumbs: true + pagination: true + pager: true + labels: true + badges: true + jumbotron: true + thumbnails: true + alerts: true + progress-bars: true + media: true + list-group: true + panels: true + wells: true + responsive-embed: true + close: true + + # Components w/ JavaScript + modals: true + tooltip: true + popovers: true + carousel: true + + # Utility classes + utilities: true + responsive-utilities: true + +### Bootstrap scripts +scripts: + transition: true + alert: true + button: true + carousel: true + collapse: true + dropdown: true + modal: true + tooltip: true + popover: true + scrollspy: true + tab: true + affix: true diff --git a/client/.eslintrc b/client/.eslintrc.yml similarity index 96% rename from client/.eslintrc rename to client/.eslintrc.yml index d73a8c02..6100a38e 100644 --- a/client/.eslintrc +++ b/client/.eslintrc.yml @@ -23,6 +23,7 @@ rules: ### Stylistic issues indent: [1, 2, { SwitchCase: 1, VariableDeclarator: 2 }] id-length: [1, { min: 2, exceptions: [_, e, i, k, v] }] + space-before-function-paren: [1, "never"] ### React jsx-quotes: [1, prefer-double] diff --git a/app/assets/fonts/OpenSans-Bold.eot b/client/app/assets/fonts/OpenSans-Bold.eot similarity index 100% rename from app/assets/fonts/OpenSans-Bold.eot rename to client/app/assets/fonts/OpenSans-Bold.eot diff --git a/app/assets/fonts/OpenSans-Bold.svg b/client/app/assets/fonts/OpenSans-Bold.svg similarity index 100% rename from app/assets/fonts/OpenSans-Bold.svg rename to client/app/assets/fonts/OpenSans-Bold.svg diff --git a/app/assets/fonts/OpenSans-Bold.ttf b/client/app/assets/fonts/OpenSans-Bold.ttf similarity index 100% rename from app/assets/fonts/OpenSans-Bold.ttf rename to client/app/assets/fonts/OpenSans-Bold.ttf diff --git a/app/assets/fonts/OpenSans-Bold.woff b/client/app/assets/fonts/OpenSans-Bold.woff similarity index 100% rename from app/assets/fonts/OpenSans-Bold.woff rename to client/app/assets/fonts/OpenSans-Bold.woff diff --git a/app/assets/fonts/OpenSans-Light.eot b/client/app/assets/fonts/OpenSans-Light.eot similarity index 100% rename from app/assets/fonts/OpenSans-Light.eot rename to client/app/assets/fonts/OpenSans-Light.eot diff --git a/app/assets/fonts/OpenSans-Light.svg b/client/app/assets/fonts/OpenSans-Light.svg similarity index 100% rename from app/assets/fonts/OpenSans-Light.svg rename to client/app/assets/fonts/OpenSans-Light.svg diff --git a/app/assets/fonts/OpenSans-Light.ttf b/client/app/assets/fonts/OpenSans-Light.ttf similarity index 100% rename from app/assets/fonts/OpenSans-Light.ttf rename to client/app/assets/fonts/OpenSans-Light.ttf diff --git a/app/assets/fonts/OpenSans-Light.woff b/client/app/assets/fonts/OpenSans-Light.woff similarity index 100% rename from app/assets/fonts/OpenSans-Light.woff rename to client/app/assets/fonts/OpenSans-Light.woff diff --git a/client/app/assets/styles/app-variables.scss b/client/app/assets/styles/app-variables.scss new file mode 100644 index 00000000..e3516f20 --- /dev/null +++ b/client/app/assets/styles/app-variables.scss @@ -0,0 +1,10 @@ +// Defining application SASS variables in stand-alone file, +// so we can use them in bootstrap-loader and CSS Modules via sass-resources-loader +$body-bg: #EFF8FB; // background w/ character +$navbar-default-bg: #FFFFE0; // fancy yellow navbar +$font-size-base: 15px; // make it bigger! +$font-family-sans-serif: 'OpenSans-Light'; // apply custom font + +// It will be used in SASS components imported as CSS Modules +$comment-author-color: blue; +$comment-text-color: purple; diff --git a/client/app/assets/styles/bootstrap-pre-customizations.scss b/client/app/assets/styles/bootstrap-pre-customizations.scss new file mode 100644 index 00000000..2003b430 --- /dev/null +++ b/client/app/assets/styles/bootstrap-pre-customizations.scss @@ -0,0 +1,10 @@ +// These variables get loaded BEFORE Bootstrap thus overriding them in Bootstrap. +@import './app-variables'; + +// This path is relative to this file! +$fonts-url-path: '../fonts'; + +@font-face { + font-family: 'OpenSans-Light'; + src: url('#{$fonts-url-path}/OpenSans-Light.ttf') format('truetype'); +} diff --git a/client/app/bundles/Comments/components/CommentScreen.jsx b/client/app/bundles/Comments/components/CommentScreen.jsx deleted file mode 100644 index 79e6ce97..00000000 --- a/client/app/bundles/Comments/components/CommentScreen.jsx +++ /dev/null @@ -1,38 +0,0 @@ -import React, { PropTypes } from 'react'; -import CommentBox from './CommentBox'; - -class CommentScreen extends React.Component { - static propTypes = { - actions: PropTypes.object.isRequired, - data: PropTypes.object.isRequired, - }; - - render() { - const { data, actions } = this.props; - - return ( -
- -
- -

-
- Example of styling using image-url and Open Sans Light custom font -

-
- -
- Rails On Maui on Twitter - -
-
- ); - } -} - -export default CommentScreen; diff --git a/client/app/bundles/Comments/utils/metaTagsManager.js b/client/app/bundles/Comments/utils/metaTagsManager.js deleted file mode 100644 index 524903aa..00000000 --- a/client/app/bundles/Comments/utils/metaTagsManager.js +++ /dev/null @@ -1,16 +0,0 @@ -import _find from 'lodash/collection/find'; - -const MetaTagsManager = { - - /** - * Get CSRF Token from the DOM. - * - * @returns {String} - CSRF Token. - */ - getCSRFToken() { - const token = _find(document.querySelectorAll('meta'), 'name', 'csrf-token'); - return token ? token.content : null; - }, -}; - -export default MetaTagsManager; diff --git a/client/app/bundles/Comments/actions/commentsActionCreators.js b/client/app/bundles/comments/actions/commentsActionCreators.js similarity index 88% rename from client/app/bundles/Comments/actions/commentsActionCreators.js rename to client/app/bundles/comments/actions/commentsActionCreators.js index 06c2ad79..97028c74 100644 --- a/client/app/bundles/Comments/actions/commentsActionCreators.js +++ b/client/app/bundles/comments/actions/commentsActionCreators.js @@ -1,4 +1,4 @@ -import commentsManager from '../utils/commentsManager'; +import requestsManager from 'libs/requestsManager'; import * as actionTypes from '../constants/commentsConstants'; export function setIsFetching() { @@ -45,8 +45,8 @@ export function fetchComments() { return dispatch => { dispatch(setIsFetching()); return ( - commentsManager - .fetchComments() + requestsManager + .fetchEntities() .then(res => dispatch(fetchCommentsSuccess(res.data))) .catch(res => dispatch(fetchCommentsFailure(res.data))) ); @@ -57,8 +57,8 @@ export function submitComment(comment) { return dispatch => { dispatch(setIsSaving()); return ( - commentsManager - .submitComment(comment) + requestsManager + .submitEntity({ comment }) .then(res => dispatch(submitCommentSuccess(res.data))) .catch(res => dispatch(submitCommentFailure(res.data))) ); diff --git a/client/app/bundles/Comments/components/CommentBox.jsx b/client/app/bundles/comments/components/CommentBox/CommentBox.jsx similarity index 67% rename from client/app/bundles/Comments/components/CommentBox.jsx rename to client/app/bundles/comments/components/CommentBox/CommentBox.jsx index 1544ec6c..88d22982 100644 --- a/client/app/bundles/Comments/components/CommentBox.jsx +++ b/client/app/bundles/comments/components/CommentBox/CommentBox.jsx @@ -1,15 +1,12 @@ import React, { PropTypes } from 'react'; -import CommentForm from './CommentForm'; -import CommentList from './CommentList'; +import CommentForm from './CommentForm/CommentForm'; +import CommentList from './CommentList/CommentList'; -class CommentBox extends React.Component { - constructor(props, context) { - super(props, context); - this.state = {}; - } +import css from './CommentBox.scss'; + +export default class CommentBox extends React.Component { - static displayName = 'CommentBox'; static propTypes = { pollInterval: PropTypes.number.isRequired, actions: PropTypes.object.isRequired, @@ -28,6 +25,12 @@ class CommentBox extends React.Component { render() { const { actions, data } = this.props; + const cssTransitionGroupClassNames = { + enter: css.elementEnter, + enterActive: css.elementEnterActive, + leave: css.elementLeave, + leaveActive: css.elementLeaveActive, + }; return (
@@ -42,14 +45,14 @@ class CommentBox extends React.Component { isSaving={data.get('isSaving')} error={data.get('submitCommentError')} actions={actions} + cssTransitionGroupClassNames={cssTransitionGroupClassNames} />
); } } - -export default CommentBox; diff --git a/client/app/bundles/comments/components/CommentBox/CommentBox.scss b/client/app/bundles/comments/components/CommentBox/CommentBox.scss new file mode 100644 index 00000000..8cfd2d06 --- /dev/null +++ b/client/app/bundles/comments/components/CommentBox/CommentBox.scss @@ -0,0 +1,17 @@ +.elementEnter { + opacity: 0.01; + + &.elementEnterActive { + opacity: 1; + transition: opacity 0.5s ease-in; + } +} + +.elementLeave { + opacity: 1; + + &.elementLeaveActive { + opacity: 0.01; + transition: opacity 0.5s ease-in; + } +} diff --git a/client/app/bundles/Comments/components/CommentForm.jsx b/client/app/bundles/comments/components/CommentBox/CommentForm/CommentForm.jsx similarity index 94% rename from client/app/bundles/Comments/components/CommentForm.jsx rename to client/app/bundles/comments/components/CommentBox/CommentForm/CommentForm.jsx index fccdf60c..23413b24 100644 --- a/client/app/bundles/Comments/components/CommentForm.jsx +++ b/client/app/bundles/comments/components/CommentBox/CommentForm/CommentForm.jsx @@ -11,7 +11,15 @@ import _ from 'lodash'; const emptyComment = { author: '', text: '' }; const textPlaceholder = 'Say something using markdown...'; -class CommentForm extends React.Component { +export default class CommentForm extends React.Component { + + static propTypes = { + isSaving: PropTypes.bool.isRequired, + actions: PropTypes.object.isRequired, + error: PropTypes.any, + cssTransitionGroupClassNames: PropTypes.object.isRequired, + }; + constructor(props, context) { super(props, context); this.state = { @@ -19,17 +27,14 @@ class CommentForm extends React.Component { comment: emptyComment, }; - _.bindAll(this, '_handleSelect', '_handleChange', '_handleSubmit', '_resetAndFocus'); + _.bindAll(this, [ + '_handleSelect', + '_handleChange', + '_handleSubmit', + '_resetAndFocus', + ]); } - static displayName = 'CommentForm'; - - static propTypes = { - isSaving: PropTypes.bool.isRequired, - actions: PropTypes.object.isRequired, - error: PropTypes.any, - }; - _handleSelect(selectedKey) { this.setState({ formMode: selectedKey }); } @@ -201,7 +206,7 @@ class CommentForm extends React.Component { _errorWarning() { // If there is no error, there is nothing to add to the DOM - if (!this.props.error) return undefined; + if (!this.props.error) return null; return ( Your comment was not saved! @@ -225,10 +230,13 @@ class CommentForm extends React.Component { default: throw new Error(`Unknown form mode: ${this.state.formMode}.`); } + + const { cssTransitionGroupClassNames } = this.props; + return (
@@ -245,5 +253,3 @@ class CommentForm extends React.Component { ); } } - -export default CommentForm; diff --git a/client/app/bundles/Comments/components/Comment.jsx b/client/app/bundles/comments/components/CommentBox/CommentList/Comment/Comment.jsx similarity index 54% rename from client/app/bundles/Comments/components/Comment.jsx rename to client/app/bundles/comments/components/CommentBox/CommentList/Comment/Comment.jsx index b05816ac..44e84569 100644 --- a/client/app/bundles/Comments/components/Comment.jsx +++ b/client/app/bundles/comments/components/CommentBox/CommentList/Comment/Comment.jsx @@ -1,8 +1,10 @@ import React, { PropTypes } from 'react'; import marked from 'marked'; -class Comment extends React.Component { - static displayName = 'Comment'; +import css from './Comment.scss'; + +export default class Comment extends React.Component { + static propTypes = { author: PropTypes.string.isRequired, text: PropTypes.string.isRequired, @@ -11,15 +13,17 @@ class Comment extends React.Component { render() { const { author, text } = this.props; const rawMarkup = marked(text, { gfm: true, sanitize: true }); + return ( -
-

+
+

{author}

- +
); } } - -export default Comment; diff --git a/client/app/bundles/comments/components/CommentBox/CommentList/Comment/Comment.scss b/client/app/bundles/comments/components/CommentBox/CommentList/Comment/Comment.scss new file mode 100644 index 00000000..9d156501 --- /dev/null +++ b/client/app/bundles/comments/components/CommentBox/CommentList/Comment/Comment.scss @@ -0,0 +1,11 @@ +.comment { + + .commentAuthor { + color: $comment-author-color; // <--- Loaded via sass-resources-loader + } + + p { + color: $comment-text-color; // <-- This one also + } + +} diff --git a/client/test/components/Comment_spec.jsx b/client/app/bundles/comments/components/CommentBox/CommentList/Comment/Comment.spec.jsx similarity index 64% rename from client/test/components/Comment_spec.jsx rename to client/app/bundles/comments/components/CommentBox/CommentList/Comment/Comment.spec.jsx index 5efb21e4..2f91f68b 100644 --- a/client/test/components/Comment_spec.jsx +++ b/client/app/bundles/comments/components/CommentBox/CommentList/Comment/Comment.spec.jsx @@ -1,5 +1,6 @@ -import { React, expect, TestUtils } from '../test_helper'; -import Comment from '../../app/bundles/Comments/components/Comment'; +import { React, expect, TestUtils } from 'libs/testHelper'; + +import Comment from './Comment'; const { renderIntoDocument, @@ -13,12 +14,13 @@ describe('Comment', () => { ); - const comment = findRenderedDOMComponentWithTag(component, 'div'); - expect(comment.className).to.equal('comment'); - const author = findRenderedDOMComponentWithTag(component, 'h2'); - expect(author.className).to.equal('comment-author'); + // TODO: Setup testing of CSS Modules classNames + // const comment = findRenderedDOMComponentWithTag(component, 'div'); + // expect(comment.className).to.equal('comment'); + // const author = findRenderedDOMComponentWithTag(component, 'h2'); + // expect(author.className).to.equal('comment-author'); const text = findRenderedDOMComponentWithTag(component, 'span'); - expect(text.className).to.equal('comment-text'); + expect(text.className).to.equal('js-comment-text'); }); it('shows the author', () => { @@ -26,7 +28,7 @@ describe('Comment', () => { ); - const author = findRenderedDOMComponentWithClass(component, 'comment-author'); + const author = findRenderedDOMComponentWithClass(component, 'js-comment-author'); expect(author.textContent).to.equal('Frank'); }); @@ -35,7 +37,7 @@ describe('Comment', () => { ); - const comment = findRenderedDOMComponentWithClass(component, 'comment-text'); + const comment = findRenderedDOMComponentWithClass(component, 'js-comment-text'); expect(comment.textContent).to.equal('Hi!\n'); }); }); diff --git a/client/app/bundles/Comments/components/CommentList.jsx b/client/app/bundles/comments/components/CommentBox/CommentList/CommentList.jsx similarity index 72% rename from client/app/bundles/Comments/components/CommentList.jsx rename to client/app/bundles/comments/components/CommentBox/CommentList/CommentList.jsx index d1e6157b..a889525a 100644 --- a/client/app/bundles/Comments/components/CommentList.jsx +++ b/client/app/bundles/comments/components/CommentBox/CommentList/CommentList.jsx @@ -2,27 +2,27 @@ import React, { PropTypes } from 'react'; import Immutable from 'immutable'; import Alert from 'react-bootstrap/lib/Alert'; import ReactCSSTransitionGroup from 'react/lib/ReactCSSTransitionGroup'; +import _ from 'lodash'; -import Comment from './Comment'; +import Comment from './Comment/Comment'; -class CommentList extends React.Component { - constructor(props, context) { - super(props, context); - this.state = {}; - - this._errorWarning = this._errorWarning.bind(this); - } - - static displayName = 'CommentList'; +export default class CommentList extends React.Component { static propTypes = { $$comments: PropTypes.instanceOf(Immutable.List).isRequired, error: PropTypes.any, + cssTransitionGroupClassNames: PropTypes.object.isRequired, }; + constructor(props, context) { + super(props, context); + this.state = {}; + _.bindAll(this, '_errorWarning'); + } + _errorWarning() { // If there is no error, there is nothing to add to the DOM - if (!this.props.error) return undefined; + if (!this.props.error) return null; return ( Comments could not be retrieved. @@ -32,7 +32,7 @@ class CommentList extends React.Component { } render() { - const { $$comments } = this.props; + const { $$comments, cssTransitionGroupClassNames } = this.props; const commentNodes = $$comments.reverse().map($$comment => { // `key` is a React-specific concept and is not mandatory for the // purpose of this tutorial. if you're curious, see more here: @@ -49,7 +49,7 @@ class CommentList extends React.Component { return (
@@ -57,11 +57,11 @@ class CommentList extends React.Component { {commentNodes} @@ -69,5 +69,3 @@ class CommentList extends React.Component { ); } } - -export default CommentList; diff --git a/client/test/components/CommentList_spec.jsx b/client/app/bundles/comments/components/CommentBox/CommentList/CommentList.spec.jsx similarity index 83% rename from client/test/components/CommentList_spec.jsx rename to client/app/bundles/comments/components/CommentBox/CommentList/CommentList.spec.jsx index 82c0bd7c..35e45f91 100644 --- a/client/test/components/CommentList_spec.jsx +++ b/client/app/bundles/comments/components/CommentBox/CommentList/CommentList.spec.jsx @@ -1,7 +1,8 @@ -import { React, expect, TestUtils } from '../test_helper'; +import { React, expect, TestUtils } from 'libs/testHelper'; import { List, Map } from 'immutable'; -import CommentList from '../../app/bundles/Comments/components/CommentList'; -import Comment from '../../app/bundles/Comments/components/Comment'; + +import CommentList from './CommentList'; +import Comment from './Comment/Comment'; const { renderIntoDocument, diff --git a/client/app/bundles/comments/components/CommentScreen/CommentScreen.jsx b/client/app/bundles/comments/components/CommentScreen/CommentScreen.jsx new file mode 100644 index 00000000..b83bd07f --- /dev/null +++ b/client/app/bundles/comments/components/CommentScreen/CommentScreen.jsx @@ -0,0 +1,56 @@ +import React, { PropTypes } from 'react'; + +import CommentBox from '../CommentBox/CommentBox'; + +import css from './CommentScreen.scss'; + +export default class CommentScreen extends React.Component { + + static propTypes = { + actions: PropTypes.object.isRequired, + data: PropTypes.object.isRequired, + locationState: PropTypes.object, + }; + + _renderNotification() { + const { locationState } = this.props; + + if (!locationState || !locationState.redirectFrom) return null; + + return ( +
+ You've been redirected from {locationState.redirectFrom} +
+ ); + } + + render() { + const { data, actions } = this.props; + + return ( +
+ {this._renderNotification()} + + ); + } +} diff --git a/client/app/bundles/comments/components/CommentScreen/CommentScreen.scss b/client/app/bundles/comments/components/CommentScreen/CommentScreen.scss new file mode 100644 index 00000000..1dc5a1eb --- /dev/null +++ b/client/app/bundles/comments/components/CommentScreen/CommentScreen.scss @@ -0,0 +1,17 @@ +.notification { + padding: 1em 1.5em; +} + +.logo { + background: url('./images/railsonmaui.png') no-repeat left bottom; + display: inline-block; + height: 40px; + margin-right: 10px; + width: 146px; +} + +.twitterImage { + background: url('./images/twitter_64.png') no-repeat; + height: 64px; + width: 64px; +} diff --git a/app/assets/images/railsonmaui.png b/client/app/bundles/comments/components/CommentScreen/images/railsonmaui.png similarity index 100% rename from app/assets/images/railsonmaui.png rename to client/app/bundles/comments/components/CommentScreen/images/railsonmaui.png diff --git a/app/assets/images/twitter_64.png b/client/app/bundles/comments/components/CommentScreen/images/twitter_64.png similarity index 100% rename from app/assets/images/twitter_64.png rename to client/app/bundles/comments/components/CommentScreen/images/twitter_64.png diff --git a/client/app/bundles/Comments/components/SimpleCommentScreen.jsx b/client/app/bundles/comments/components/SimpleCommentScreen/SimpleCommentScreen.jsx similarity index 54% rename from client/app/bundles/Comments/components/SimpleCommentScreen.jsx rename to client/app/bundles/comments/components/SimpleCommentScreen/SimpleCommentScreen.jsx index f8e00576..bda4baa5 100644 --- a/client/app/bundles/Comments/components/SimpleCommentScreen.jsx +++ b/client/app/bundles/comments/components/SimpleCommentScreen/SimpleCommentScreen.jsx @@ -1,12 +1,14 @@ import React from 'react'; import Immutable from 'immutable'; import request from 'axios'; -import CommentForm from './CommentForm'; -import CommentList from './CommentList'; -import metaTagsManager from '../utils/metaTagsManager'; import _ from 'lodash'; -class SimpleCommentScreen extends React.Component { +import metaTagsManager from 'libs/metaTagsManager'; +import CommentForm from '../CommentBox/CommentForm/CommentForm'; +import CommentList from '../CommentBox/CommentList/CommentList'; + +export default class SimpleCommentScreen extends React.Component { + constructor(props, context) { super(props, context); this.state = { @@ -19,16 +21,17 @@ class SimpleCommentScreen extends React.Component { _.bindAll(this, '_fetchComments', '_handleCommentSubmit'); } - static displayName = 'SimpleCommentScreen'; - componentDidMount() { this._fetchComments(); } _fetchComments() { - return request.get('comments.json', { responseType: 'json' }) - .then(res => this.setState({ $$comments: Immutable.fromJS(res.data) })) - .catch(error => this.setState({ fetchCommentsError: error })); + return ( + request + .get('comments.json', { responseType: 'json' }) + .then(res => this.setState({ $$comments: Immutable.fromJS(res.data) })) + .catch(error => this.setState({ fetchCommentsError: error })) + ); } _handleCommentSubmit(comment) { @@ -41,22 +44,25 @@ class SimpleCommentScreen extends React.Component { }, }; - return request.post('comments.json', { comment }, requestConfig) - .then(() => { - const { $$comments } = this.state; - const $$comment = Immutable.fromJS(comment); + return ( + request + .post('comments.json', { comment }, requestConfig) + .then(() => { + const { $$comments } = this.state; + const $$comment = Immutable.fromJS(comment); - this.setState({ - $$comments: $$comments.push($$comment), - ajaxSending: false, - }); - }) - .catch(error => { - this.setState({ - submitCommentError: error, - ajaxSending: false, - }); - }); + this.setState({ + $$comments: $$comments.push($$comment), + ajaxSending: false, + }); + }) + .catch(error => { + this.setState({ + submitCommentError: error, + ajaxSending: false, + }); + }) + ); } render() { @@ -69,7 +75,7 @@ class SimpleCommentScreen extends React.Component {

+ ); } } // Don't forget to actually use connect! -export default connect(select)(NonRouterCommentScreen); +export default connect(select)(NonRouterCommentsContainer); diff --git a/client/app/bundles/Comments/components/RouterCommentScreen.jsx b/client/app/bundles/comments/containers/RouterCommentsContainer.jsx similarity index 60% rename from client/app/bundles/Comments/components/RouterCommentScreen.jsx rename to client/app/bundles/comments/containers/RouterCommentsContainer.jsx index bc50004a..fead43dc 100644 --- a/client/app/bundles/Comments/components/RouterCommentScreen.jsx +++ b/client/app/bundles/comments/containers/RouterCommentsContainer.jsx @@ -1,5 +1,5 @@ import React, { PropTypes } from 'react'; -import CommentScreen from './CommentScreen'; +import CommentScreen from '../components/CommentScreen/CommentScreen'; import { connect } from 'react-redux'; import { bindActionCreators } from 'redux'; import * as commentsActionCreators from '../actions/commentsActionCreators'; @@ -9,7 +9,8 @@ function select(state) { return { data: state.$$commentsStore }; } -class RouterCommentScreen extends React.Component { +class RouterCommentsContainer extends React.Component { + static propTypes = { dispatch: PropTypes.func.isRequired, data: PropTypes.object.isRequired, @@ -18,29 +19,16 @@ class RouterCommentScreen extends React.Component { }).isRequired, }; - _renderNotification() { - const locationState = this.props.location.state; - if (!locationState || !locationState.redirectFrom) return null; - - return ( -
- You've been redirected from {locationState.redirectFrom} -
- ); - } - render() { const { dispatch, data } = this.props; const actions = bindActionCreators(commentsActionCreators, dispatch); + const locationState = this.props.location.state; return ( -
- {this._renderNotification()} - -
+ ); } } // Don't forget to actually use connect! -export default connect(select)(RouterCommentScreen); +export default connect(select)(RouterCommentsContainer); diff --git a/client/app/bundles/Comments/layout/Layout.jsx b/client/app/bundles/comments/layout/Layout.jsx similarity index 63% rename from client/app/bundles/Comments/layout/Layout.jsx rename to client/app/bundles/comments/layout/Layout.jsx index db4a0769..cb24ceaf 100644 --- a/client/app/bundles/Comments/layout/Layout.jsx +++ b/client/app/bundles/comments/layout/Layout.jsx @@ -1,6 +1,8 @@ import React, { PropTypes } from 'react'; import { IndexLink, Link } from 'react-router'; +import './Layout.scss'; + export default class Layout extends React.Component { static propTypes = { @@ -13,13 +15,20 @@ export default class Layout extends React.Component {
  • - Comments (Root URL) + + Comments (Root URL) +
  • - Test React Router ('/react-router') + + Test React Router ('/react-router') +
  • - Test Redirect (url to '/react-router/redirect' which goes to root '/') + + Test Redirect + (url to '/react-router/redirect' which goes to root '/') +
diff --git a/client/app/bundles/comments/layout/Layout.scss b/client/app/bundles/comments/layout/Layout.scss new file mode 100644 index 00000000..fa3ff596 --- /dev/null +++ b/client/app/bundles/comments/layout/Layout.scss @@ -0,0 +1,23 @@ +// This way we turn CSS Modules off and apply these css rules globaly +:global { + + body { + padding-top: 20px; + } + + .active:visited, + .active { + color: purple; + font-weight: bold; + text-decoration: underline; + } + + // scss-lint:disable IdSelector + #nav.affix { + position: fixed; + top: 3px; + width: 80%; + z-index: 10; + } + +} diff --git a/client/app/bundles/Comments/reducers/commentsReducer.js b/client/app/bundles/comments/reducers/commentsReducer.js similarity index 100% rename from client/app/bundles/Comments/reducers/commentsReducer.js rename to client/app/bundles/comments/reducers/commentsReducer.js diff --git a/client/app/bundles/Comments/reducers/index.js b/client/app/bundles/comments/reducers/index.js similarity index 100% rename from client/app/bundles/Comments/reducers/index.js rename to client/app/bundles/comments/reducers/index.js diff --git a/client/app/bundles/Comments/routes/routes.jsx b/client/app/bundles/comments/routes/routes.jsx similarity index 68% rename from client/app/bundles/Comments/routes/routes.jsx rename to client/app/bundles/comments/routes/routes.jsx index eea009ea..8ae88e9e 100644 --- a/client/app/bundles/Comments/routes/routes.jsx +++ b/client/app/bundles/comments/routes/routes.jsx @@ -1,14 +1,14 @@ import React from 'react'; import { Route, IndexRoute } from 'react-router'; import Layout from '../layout/Layout'; -import TestReactRouter from '../components/TestReactRouter'; -import TestReactRouterRedirect from '../components/TestReactRouterRedirect'; -import RouterCommentScreen from '../components/RouterCommentScreen'; +import TestReactRouter from '../components/TestReactRouter/TestReactRouter'; +import TestReactRouterRedirect from '../components/TestReactRouterRedirect/TestReactRouterRedirect'; +import RouterCommentsContainer from '../containers/RouterCommentsContainer'; export default ( { +export default props => { const store = createStore(props); return ( - + ); }; - -// Export is needed for the hot reload server -export default App; diff --git a/client/app/bundles/Comments/startup/ClientRouterApp.jsx b/client/app/bundles/comments/startup/ClientRouterApp.jsx similarity index 79% rename from client/app/bundles/Comments/startup/ClientRouterApp.jsx rename to client/app/bundles/comments/startup/ClientRouterApp.jsx index f31baf22..8faf1a28 100644 --- a/client/app/bundles/Comments/startup/ClientRouterApp.jsx +++ b/client/app/bundles/comments/startup/ClientRouterApp.jsx @@ -6,7 +6,7 @@ import createHistory from 'history/lib/createBrowserHistory'; import createStore from '../store/commentsStore'; import routes from '../routes/routes'; -const RouterApp = (props, location) => { +export default (props, location) => { const store = createStore(props); const history = createHistory(); @@ -16,6 +16,3 @@ const RouterApp = (props, location) => { ); }; - -// Export is needed for the hot reload server -export default RouterApp; diff --git a/client/app/bundles/Comments/startup/ServerApp.jsx b/client/app/bundles/comments/startup/ServerApp.jsx similarity index 59% rename from client/app/bundles/Comments/startup/ServerApp.jsx rename to client/app/bundles/comments/startup/ServerApp.jsx index 38664e8b..22b32b2f 100644 --- a/client/app/bundles/Comments/startup/ServerApp.jsx +++ b/client/app/bundles/comments/startup/ServerApp.jsx @@ -2,15 +2,13 @@ import React from 'react'; import { Provider } from 'react-redux'; import createStore from '../store/commentsStore'; -import NonRouterCommentScreen from '../components/NonRouterCommentScreen'; +import NonRouterCommentsContainer from '../containers/NonRouterCommentsContainer'; -const App = props => { +export default props => { const store = createStore(props); return ( - + ); }; - -export default App; diff --git a/client/app/bundles/Comments/startup/ServerRouterApp.jsx b/client/app/bundles/comments/startup/ServerRouterApp.jsx similarity index 94% rename from client/app/bundles/Comments/startup/ServerRouterApp.jsx rename to client/app/bundles/comments/startup/ServerRouterApp.jsx index f89e4dcc..8cf27bfa 100644 --- a/client/app/bundles/Comments/startup/ServerRouterApp.jsx +++ b/client/app/bundles/comments/startup/ServerRouterApp.jsx @@ -5,7 +5,7 @@ import { match, RoutingContext } from 'react-router'; import createStore from '../store/commentsStore'; import routes from '../routes/routes'; -const RouterApp = (props, location) => { +export default (props, location) => { const store = createStore(props); let error; @@ -33,5 +33,3 @@ const RouterApp = (props, location) => { ); }; - -export default RouterApp; diff --git a/client/app/bundles/Comments/startup/clientGlobals.jsx b/client/app/bundles/comments/startup/clientGlobals.jsx similarity index 90% rename from client/app/bundles/Comments/startup/clientGlobals.jsx rename to client/app/bundles/comments/startup/clientGlobals.jsx index 8ef55c54..ce05dbd5 100644 --- a/client/app/bundles/Comments/startup/clientGlobals.jsx +++ b/client/app/bundles/comments/startup/clientGlobals.jsx @@ -1,6 +1,6 @@ import App from './ClientApp'; import RouterApp from './ClientRouterApp'; -import SimpleCommentScreen from '../components/SimpleCommentScreen'; +import SimpleCommentScreen from '../components/SimpleCommentScreen/SimpleCommentScreen'; window.App = App; window.RouterApp = RouterApp; diff --git a/client/app/bundles/Comments/startup/serverGlobals.jsx b/client/app/bundles/comments/startup/serverGlobals.jsx similarity index 100% rename from client/app/bundles/Comments/startup/serverGlobals.jsx rename to client/app/bundles/comments/startup/serverGlobals.jsx diff --git a/client/app/bundles/Comments/store/commentsStore.js b/client/app/bundles/comments/store/commentsStore.js similarity index 90% rename from client/app/bundles/Comments/store/commentsStore.js rename to client/app/bundles/comments/store/commentsStore.js index 7a71ad8e..c7e7516a 100644 --- a/client/app/bundles/Comments/store/commentsStore.js +++ b/client/app/bundles/comments/store/commentsStore.js @@ -1,6 +1,6 @@ import { compose, createStore, applyMiddleware, combineReducers } from 'redux'; import thunkMiddleware from 'redux-thunk'; -import loggerMiddleware from 'lib/middlewares/loggerMiddleware'; +import loggerMiddleware from 'libs/middlewares/loggerMiddleware'; import reducers from '../reducers'; import { initalStates } from '../reducers'; diff --git a/client/app/libs/metaTagsManager.js b/client/app/libs/metaTagsManager.js new file mode 100644 index 00000000..9a64e58d --- /dev/null +++ b/client/app/libs/metaTagsManager.js @@ -0,0 +1,15 @@ +import _ from 'lodash'; + +export default { + + /** + * Get CSRF Token from the DOM. + * + * @returns {String} - CSRF Token. + */ + getCSRFToken() { + const token = _.find(document.querySelectorAll('meta'), 'name', 'csrf-token'); + return token ? token.content : null; + }, + +}; diff --git a/client/app/lib/middlewares/loggerMiddleware.js b/client/app/libs/middlewares/loggerMiddleware.js similarity index 100% rename from client/app/lib/middlewares/loggerMiddleware.js rename to client/app/libs/middlewares/loggerMiddleware.js diff --git a/client/app/bundles/Comments/utils/commentsManager.js b/client/app/libs/requestsManager.js similarity index 53% rename from client/app/bundles/Comments/utils/commentsManager.js rename to client/app/libs/requestsManager.js index 41f7c8a1..2b865103 100644 --- a/client/app/bundles/Comments/utils/commentsManager.js +++ b/client/app/libs/requestsManager.js @@ -3,14 +3,14 @@ import metaTagsManager from './metaTagsManager'; const API_URL = 'comments.json'; -const CommentsManager = { +export default { /** - * Retrieve comments from server using AJAX call. + * Retrieve list of entities from server using AJAX call. * - * @returns {Promise} - result of ajax call. + * @returns {Promise} - Result of ajax call. */ - fetchComments() { + fetchEntities() { return request({ method: 'GET', url: API_URL, @@ -19,12 +19,12 @@ const CommentsManager = { }, /** - * Submit new comment to server using AJAX call. + * Submit new entity to server using AJAX call. * - * @param {Object} comment - Comment body to post. - * @returns {Promise} - result of ajax call. + * @param {Object} entity - Request body to post. + * @returns {Promise} - Result of ajax call. */ - submitComment(comment) { + submitEntity(entity) { return request({ method: 'POST', url: API_URL, @@ -32,10 +32,8 @@ const CommentsManager = { headers: { 'X-CSRF-Token': metaTagsManager.getCSRFToken(), }, - data: { comment }, + data: entity, }); }, }; - -export default CommentsManager; diff --git a/client/test/test_helper.js b/client/app/libs/testHelper.js similarity index 100% rename from client/test/test_helper.js rename to client/app/libs/testHelper.js diff --git a/client/app/libs/testNullCompiler.js b/client/app/libs/testNullCompiler.js new file mode 100644 index 00000000..c2826127 --- /dev/null +++ b/client/app/libs/testNullCompiler.js @@ -0,0 +1,8 @@ +const noop = () => null; + +require.extensions['.css'] = noop; +require.extensions['.scss'] = noop; +require.extensions['.png'] = noop; +require.extensions['.jpg'] = noop; +require.extensions['.jpeg'] = noop; +require.extensions['.gif'] = noop; diff --git a/client/assets/fonts b/client/assets/fonts deleted file mode 120000 index 7a488174..00000000 --- a/client/assets/fonts +++ /dev/null @@ -1 +0,0 @@ -../../app/assets/fonts \ No newline at end of file diff --git a/client/assets/images b/client/assets/images deleted file mode 120000 index 67b6dd19..00000000 --- a/client/assets/images +++ /dev/null @@ -1 +0,0 @@ -../../app/assets/images \ No newline at end of file diff --git a/client/assets/stylesheets/_app-styling-post-bootstrap-loading.scss b/client/assets/stylesheets/_app-styling-post-bootstrap-loading.scss deleted file mode 100644 index f27addf0..00000000 --- a/client/assets/stylesheets/_app-styling-post-bootstrap-loading.scss +++ /dev/null @@ -1,65 +0,0 @@ -// This file is used as part of the bootstrap-sass-loader customization -// ## Baseline - -// Included from bootstrap-sass.config.js -body { - padding-top: 20px; -} - -.doc-content { - padding-top: 10px; -} - -.logo { - background: img-url('railsonmaui.png') no-repeat left bottom; - display: inline-block; - height: 40px; - margin-right: 10px; - width: 146px; -} - -.twitter-image { - background: img-url('twitter_64.png') no-repeat; - height: 64px; - width: 64px; -} - -.open-sans-light { - font-family: 'OpenSans-Light', sans-serif; // making use of custom fonts -} - -// ## Nav -// When nav is affixed, set it's position and size. - -// scss-lint:disable IdSelector -#nav.affix { - position: fixed; - top: 3px; - width: 80%; - z-index: 10; -} - -.element-enter { - opacity: 0.01; - - &.element-enter-active { - opacity: 1; - transition: opacity 0.5s ease-in; - } -} - -.element-leave { - opacity: 1; - - &.element-leave-active { - opacity: 0.01; - transition: opacity 0.5s ease-in; - } -} - -.active:visited, -.active { - color: purple; - font-weight: bold; - text-decoration: underline; -} diff --git a/client/assets/stylesheets/_bootstrap-variables-customization.scss b/client/assets/stylesheets/_bootstrap-variables-customization.scss deleted file mode 100644 index 003f0b6d..00000000 --- a/client/assets/stylesheets/_bootstrap-variables-customization.scss +++ /dev/null @@ -1,34 +0,0 @@ -$rails: false !default; -// defaults to false (e.g. webpack environment) - -// These variables get loaded BEFORE Bootstrap thus overriding them in Bootstrap. -$body-bg: #EFF8FB; -// background w/ character -$navbar-default-bg: #FFFFE0; -// fancy yellow navbar -$font-size-base: 15px; -// make it bigger! - -// Define a custom font. -// Libsass, which is used by the webpack sass loader, does not support font-url() -// so we use url() instead. This is a known issue. -@font-face { - font-family: 'OpenSans-Light'; - @if $rails { - src: font-url('OpenSans-Light.ttf') format('truetype'); - } @else { - src: url('assets/fonts/OpenSans-Light.ttf') format('truetype'); - } -} - -// Sass 3 removes image-url helper -// https://github.com/sass/libsass/issues/489 -$image-url-path: '/assets/images/' !default; - -@function img-url($image) { - @if $rails { - @return image-url($image); - } @else { - @return url('#{$image-url-path}#{$image}'); - } -} diff --git a/client/assets/stylesheets/_test-sass-stylesheet-partial.scss b/client/assets/stylesheets/_test-sass-stylesheet-partial.scss deleted file mode 100644 index c85f5f2f..00000000 --- a/client/assets/stylesheets/_test-sass-stylesheet-partial.scss +++ /dev/null @@ -1,5 +0,0 @@ -// Example of a partial setting a variable - -$comment-text-color: purple; - - diff --git a/client/assets/stylesheets/test-sass-stylesheet.scss b/client/assets/stylesheets/test-sass-stylesheet.scss deleted file mode 100644 index 97929ac6..00000000 --- a/client/assets/stylesheets/test-sass-stylesheet.scss +++ /dev/null @@ -1,13 +0,0 @@ -// Proof of concept of loading css from webpack -// partial defines the $comment-text-color -@import 'test-sass-stylesheet-partial'; - -.comment { - p { - color: $comment-text-color; - } -} - -.notification { - padding: 1em 1.5em; -} diff --git a/client/assets/stylesheets/test-stylesheet.css b/client/assets/stylesheets/test-stylesheet.css deleted file mode 100644 index b5f69e62..00000000 --- a/client/assets/stylesheets/test-stylesheet.css +++ /dev/null @@ -1,5 +0,0 @@ -// Proof of concept of loading css from webpack - -.comment-author { - color: blue; -} diff --git a/client/bootstrap-sass.config.js b/client/bootstrap-sass.config.js deleted file mode 100644 index f7718848..00000000 --- a/client/bootstrap-sass.config.js +++ /dev/null @@ -1,88 +0,0 @@ -// IMPORTANT: Make sure to keep the customizations defined in this file -// in-sync with the ones defined in app/assets/stylesheets/_bootstrap-custom.scss. - -module.exports = { - bootstrapCustomizations: './assets/stylesheets/_bootstrap-variables-customization.scss', - mainSass: './assets/stylesheets/_app-styling-post-bootstrap-loading.scss', - - // Default for the style loading is to put in your js files - // styleLoader: 'style-loader!css-loader!sass-loader', - - // See: https://github.com/sass/node-sass#outputstyle - // https://github.com/sass/node-sass#imagepath - styleLoader: 'style-loader!css-loader!sass-loader?imagePath=/assets/images', - - // ### Scripts - // Any scripts here set to false will never make it to the client, - // i.e. it's not packaged by webpack. - scripts: { - transition: true, - alert: true, - button: true, - - // excluding as an example - carousel: false, - collapse: true, - dropdown: true, - - // excluding as an example - modal: false, - tooltip: true, - popover: true, - scrollspy: true, - tab: true, - affix: true, - }, - - // ### Styles - // Enable or disable certain less components and thus remove - // the css for them from the build. - styles: { - mixins: true, - - normalize: true, - print: true, - - scaffolding: true, - type: true, - code: true, - grid: true, - tables: true, - forms: true, - buttons: true, - - 'component-animations': true, - glyphicons: true, - dropdowns: true, - 'button-groups': true, - 'input-groups': true, - navs: true, - navbar: true, - breadcrumbs: true, - pagination: true, - pager: true, - labels: true, - badges: true, - - // excluding as an example - jumbotron: false, - thumbnails: true, - alerts: true, - - // excluding as an example - 'progress-bars': false, - media: true, - 'list-group': true, - panels: true, - wells: true, - close: true, - - modals: true, - tooltip: true, - popovers: true, - carousel: true, - - utilities: true, - 'responsive-utilities': true, - }, -}; diff --git a/client/npm-shrinkwrap.json b/client/npm-shrinkwrap.json index a87699dc..5b61c525 100644 --- a/client/npm-shrinkwrap.json +++ b/client/npm-shrinkwrap.json @@ -18,26 +18,31 @@ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.2.13.tgz" }, "acorn": { - "version": "1.2.2", - "from": "acorn@>=1.0.3 <2.0.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-1.2.2.tgz" + "version": "2.6.4", + "from": "acorn@>=2.1.0 <3.0.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-2.6.4.tgz" }, "acorn-globals": { "version": "1.0.9", "from": "acorn-globals@>=1.0.3 <2.0.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-1.0.9.tgz", - "dependencies": { - "acorn": { - "version": "2.6.4", - "from": "acorn@>=2.1.0 <3.0.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-2.6.4.tgz" - } - } + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-1.0.9.tgz" + }, + "acorn-to-esprima": { + "version": "2.0.4", + "from": "acorn-to-esprima@>=2.0.4 <3.0.0", + "resolved": "https://registry.npmjs.org/acorn-to-esprima/-/acorn-to-esprima-2.0.4.tgz" }, "align-text": { "version": "0.1.3", "from": "align-text@>=0.1.0 <0.2.0", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.3.tgz" + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.3.tgz", + "dependencies": { + "kind-of": { + "version": "2.0.1", + "from": "kind-of@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-2.0.1.tgz" + } + } }, "alphanum-sort": { "version": "1.0.2", @@ -90,32 +95,37 @@ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.0.tgz" }, "are-we-there-yet": { - "version": "1.0.4", + "version": "1.0.5", "from": "are-we-there-yet@>=1.0.0 <1.1.0", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.0.4.tgz", - "dependencies": { - "readable-stream": { - "version": "1.1.13", - "from": "readable-stream@>=1.1.13 <2.0.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.13.tgz" - } - } + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.0.5.tgz" }, "argparse": { "version": "1.0.3", "from": "argparse@>=1.0.2 <1.1.0", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.3.tgz" + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.3.tgz", + "dependencies": { + "lodash": { + "version": "3.10.1", + "from": "lodash@>=3.2.0 <4.0.0", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz" + } + } }, "arr-diff": { - "version": "1.1.0", - "from": "arr-diff@>=1.1.0 <2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz" + "version": "2.0.0", + "from": "arr-diff@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz" }, "arr-flatten": { "version": "1.0.1", "from": "arr-flatten@>=1.0.1 <2.0.0", "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.0.1.tgz" }, + "array-find": { + "version": "1.0.0", + "from": "array-find@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/array-find/-/array-find-1.0.0.tgz" + }, "array-flatten": { "version": "1.1.1", "from": "array-flatten@1.1.1", @@ -126,11 +136,6 @@ "from": "array-index@>=0.1.0 <0.2.0", "resolved": "https://registry.npmjs.org/array-index/-/array-index-0.1.1.tgz" }, - "array-slice": { - "version": "0.2.3", - "from": "array-slice@>=0.2.3 <0.3.0", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz" - }, "array-union": { "version": "1.0.1", "from": "array-union@>=1.0.1 <2.0.0", @@ -138,7 +143,7 @@ }, "array-uniq": { "version": "1.0.2", - "from": "array-uniq@>=1.0.1 <2.0.0", + "from": "array-uniq@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.2.tgz" }, "array-unique": { @@ -147,9 +152,9 @@ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz" }, "arrify": { - "version": "1.0.0", + "version": "1.0.1", "from": "arrify@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.0.tgz" + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz" }, "asap": { "version": "2.0.3", @@ -188,7 +193,7 @@ }, "async": { "version": "1.5.0", - "from": "async@>=1.3.0 <2.0.0", + "from": "async@>=1.4.0 <2.0.0", "resolved": "https://registry.npmjs.org/async/-/async-1.5.0.tgz" }, "async-each": { @@ -201,9 +206,14 @@ "from": "async-foreach@>=0.1.3 <0.2.0", "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz" }, + "atob": { + "version": "1.1.3", + "from": "atob@>=1.1.0 <1.2.0", + "resolved": "https://registry.npmjs.org/atob/-/atob-1.1.3.tgz" + }, "autoprefixer": { "version": "6.1.2", - "from": "autoprefixer@>=6.0.3 <7.0.0", + "from": "autoprefixer@*", "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-6.1.2.tgz" }, "aws-sign2": { @@ -216,31 +226,194 @@ "from": "axios@>=0.7.0 <0.8.0", "resolved": "https://registry.npmjs.org/axios/-/axios-0.7.0.tgz" }, + "babel": { + "version": "6.3.13", + "from": "babel@latest", + "resolved": "https://registry.npmjs.org/babel/-/babel-6.3.13.tgz" + }, + "babel-cli": { + "version": "6.3.17", + "from": "babel-cli@latest", + "resolved": "https://registry.npmjs.org/babel-cli/-/babel-cli-6.3.17.tgz", + "dependencies": { + "lodash": { + "version": "3.10.1", + "from": "lodash@>=3.2.0 <4.0.0", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz" + } + } + }, "babel-code-frame": { "version": "6.3.13", "from": "babel-code-frame@>=6.3.13 <7.0.0", "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.3.13.tgz" }, "babel-core": { - "version": "5.8.34", - "from": "babel-core@>=5.8.25 <6.0.0", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-5.8.34.tgz" + "version": "6.3.17", + "from": "babel-core@latest", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.3.17.tgz", + "dependencies": { + "lodash": { + "version": "3.10.1", + "from": "lodash@>=3.10.0 <4.0.0" + } + } + }, + "babel-generator": { + "version": "6.3.17", + "from": "babel-generator@>=6.3.17 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.3.17.tgz", + "dependencies": { + "lodash": { + "version": "3.10.1", + "from": "lodash@>=3.10.1 <4.0.0" + } + } + }, + "babel-helper-bindify-decorators": { + "version": "6.3.13", + "from": "babel-helper-bindify-decorators@>=6.3.13 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.3.13.tgz" + }, + "babel-helper-builder-binary-assignment-operator-visitor": { + "version": "6.3.13", + "from": "babel-helper-builder-binary-assignment-operator-visitor@>=6.3.13 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.3.13.tgz" + }, + "babel-helper-builder-react-jsx": { + "version": "6.3.13", + "from": "babel-helper-builder-react-jsx@>=6.3.13 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.3.13.tgz", + "dependencies": { + "lodash": { + "version": "3.10.1", + "from": "lodash@>=3.10.0 <4.0.0" + } + } + }, + "babel-helper-call-delegate": { + "version": "6.3.13", + "from": "babel-helper-call-delegate@>=6.3.13 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.3.13.tgz" + }, + "babel-helper-define-map": { + "version": "6.3.13", + "from": "babel-helper-define-map@>=6.3.13 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.3.13.tgz", + "dependencies": { + "lodash": { + "version": "3.10.1", + "from": "lodash@>=3.10.0 <4.0.0" + } + } + }, + "babel-helper-explode-assignable-expression": { + "version": "6.3.13", + "from": "babel-helper-explode-assignable-expression@>=6.3.13 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.3.13.tgz" + }, + "babel-helper-explode-class": { + "version": "6.3.13", + "from": "babel-helper-explode-class@>=6.3.13 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-helper-explode-class/-/babel-helper-explode-class-6.3.13.tgz" + }, + "babel-helper-function-name": { + "version": "6.3.15", + "from": "babel-helper-function-name@>=6.3.15 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.3.15.tgz" + }, + "babel-helper-get-function-arity": { + "version": "6.3.13", + "from": "babel-helper-get-function-arity@>=6.3.13 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.3.13.tgz" + }, + "babel-helper-hoist-variables": { + "version": "6.3.13", + "from": "babel-helper-hoist-variables@>=6.3.13 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.3.13.tgz" + }, + "babel-helper-optimise-call-expression": { + "version": "6.3.13", + "from": "babel-helper-optimise-call-expression@>=6.3.13 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.3.13.tgz" + }, + "babel-helper-regex": { + "version": "6.3.13", + "from": "babel-helper-regex@>=6.3.13 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.3.13.tgz", + "dependencies": { + "lodash": { + "version": "3.10.1", + "from": "lodash@>=3.10.0 <4.0.0" + } + } + }, + "babel-helper-remap-async-to-generator": { + "version": "6.3.13", + "from": "babel-helper-remap-async-to-generator@>=6.3.13 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.3.13.tgz" + }, + "babel-helper-replace-supers": { + "version": "6.3.13", + "from": "babel-helper-replace-supers@>=6.3.13 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.3.13.tgz" + }, + "babel-helpers": { + "version": "6.3.13", + "from": "babel-helpers@>=6.3.13 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.3.13.tgz" }, "babel-jscs": { "version": "2.0.5", "from": "babel-jscs@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/babel-jscs/-/babel-jscs-2.0.5.tgz" + "resolved": "https://registry.npmjs.org/babel-jscs/-/babel-jscs-2.0.5.tgz", + "dependencies": { + "babel-core": { + "version": "5.8.34", + "from": "babel-core@>=5.8.3 <5.9.0", + "dependencies": { + "lodash": { + "version": "3.10.1", + "from": "lodash@>=3.10.0 <4.0.0" + } + } + }, + "babylon": { + "version": "5.8.34", + "from": "babylon@>=5.8.34 <6.0.0" + }, + "globals": { + "version": "6.4.1", + "from": "globals@>=6.4.0 <7.0.0" + }, + "js-tokens": { + "version": "1.0.1", + "from": "js-tokens@1.0.1" + } + } }, "babel-loader": { - "version": "5.4.0", - "from": "babel-loader@>=5.3.2 <6.0.0", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-5.4.0.tgz" + "version": "6.2.0", + "from": "babel-loader@latest", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-6.2.0.tgz", + "dependencies": { + "loader-utils": { + "version": "0.2.12", + "from": "loader-utils@>=0.2.11 <0.3.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.12.tgz" + } + } }, "babel-messages": { "version": "6.3.13", "from": "babel-messages@>=6.3.13 <7.0.0", "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.3.13.tgz" }, + "babel-plugin-check-es2015-constants": { + "version": "6.3.13", + "from": "babel-plugin-check-es2015-constants@>=6.3.13 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.3.13.tgz" + }, "babel-plugin-constant-folding": { "version": "1.0.1", "from": "babel-plugin-constant-folding@>=1.0.1 <2.0.0", @@ -279,7 +452,13 @@ "babel-plugin-proto-to-assign": { "version": "1.0.4", "from": "babel-plugin-proto-to-assign@>=1.0.3 <2.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-proto-to-assign/-/babel-plugin-proto-to-assign-1.0.4.tgz" + "resolved": "https://registry.npmjs.org/babel-plugin-proto-to-assign/-/babel-plugin-proto-to-assign-1.0.4.tgz", + "dependencies": { + "lodash": { + "version": "3.10.1", + "from": "lodash@>=3.9.3 <4.0.0" + } + } }, "babel-plugin-react-constant-elements": { "version": "1.0.3", @@ -306,6 +485,237 @@ "from": "babel-plugin-runtime@>=1.0.7 <2.0.0", "resolved": "https://registry.npmjs.org/babel-plugin-runtime/-/babel-plugin-runtime-1.0.7.tgz" }, + "babel-plugin-syntax-async-functions": { + "version": "6.3.13", + "from": "babel-plugin-syntax-async-functions@>=6.3.13 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.3.13.tgz" + }, + "babel-plugin-syntax-class-constructor-call": { + "version": "6.3.13", + "from": "babel-plugin-syntax-class-constructor-call@>=6.3.13 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-constructor-call/-/babel-plugin-syntax-class-constructor-call-6.3.13.tgz" + }, + "babel-plugin-syntax-class-properties": { + "version": "6.3.13", + "from": "babel-plugin-syntax-class-properties@>=6.3.13 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.3.13.tgz" + }, + "babel-plugin-syntax-decorators": { + "version": "6.3.13", + "from": "babel-plugin-syntax-decorators@>=6.3.13 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.3.13.tgz" + }, + "babel-plugin-syntax-do-expressions": { + "version": "6.3.13", + "from": "babel-plugin-syntax-do-expressions@>=6.3.13 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-do-expressions/-/babel-plugin-syntax-do-expressions-6.3.13.tgz" + }, + "babel-plugin-syntax-exponentiation-operator": { + "version": "6.3.13", + "from": "babel-plugin-syntax-exponentiation-operator@>=6.3.13 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.3.13.tgz" + }, + "babel-plugin-syntax-export-extensions": { + "version": "6.3.13", + "from": "babel-plugin-syntax-export-extensions@>=6.3.13 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.3.13.tgz" + }, + "babel-plugin-syntax-flow": { + "version": "6.3.13", + "from": "babel-plugin-syntax-flow@>=6.3.13 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.3.13.tgz" + }, + "babel-plugin-syntax-function-bind": { + "version": "6.3.13", + "from": "babel-plugin-syntax-function-bind@>=6.3.13 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-function-bind/-/babel-plugin-syntax-function-bind-6.3.13.tgz" + }, + "babel-plugin-syntax-jsx": { + "version": "6.3.13", + "from": "babel-plugin-syntax-jsx@>=6.3.13 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.3.13.tgz" + }, + "babel-plugin-syntax-object-rest-spread": { + "version": "6.3.13", + "from": "babel-plugin-syntax-object-rest-spread@>=6.3.13 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.3.13.tgz" + }, + "babel-plugin-syntax-trailing-function-commas": { + "version": "6.3.13", + "from": "babel-plugin-syntax-trailing-function-commas@>=6.3.13 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.3.13.tgz" + }, + "babel-plugin-transform-async-to-generator": { + "version": "6.3.13", + "from": "babel-plugin-transform-async-to-generator@>=6.3.13 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.3.13.tgz" + }, + "babel-plugin-transform-class-constructor-call": { + "version": "6.3.13", + "from": "babel-plugin-transform-class-constructor-call@>=6.3.13 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-constructor-call/-/babel-plugin-transform-class-constructor-call-6.3.13.tgz" + }, + "babel-plugin-transform-class-properties": { + "version": "6.3.13", + "from": "babel-plugin-transform-class-properties@>=6.3.13 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.3.13.tgz" + }, + "babel-plugin-transform-decorators": { + "version": "6.3.13", + "from": "babel-plugin-transform-decorators@>=6.3.13 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.3.13.tgz" + }, + "babel-plugin-transform-do-expressions": { + "version": "6.3.13", + "from": "babel-plugin-transform-do-expressions@>=6.3.13 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-do-expressions/-/babel-plugin-transform-do-expressions-6.3.13.tgz" + }, + "babel-plugin-transform-es2015-arrow-functions": { + "version": "6.3.13", + "from": "babel-plugin-transform-es2015-arrow-functions@>=6.3.13 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.3.13.tgz" + }, + "babel-plugin-transform-es2015-block-scoped-functions": { + "version": "6.3.13", + "from": "babel-plugin-transform-es2015-block-scoped-functions@>=6.3.13 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.3.13.tgz" + }, + "babel-plugin-transform-es2015-block-scoping": { + "version": "6.3.13", + "from": "babel-plugin-transform-es2015-block-scoping@>=6.3.13 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.3.13.tgz", + "dependencies": { + "lodash": { + "version": "3.10.1", + "from": "lodash@>=3.10.0 <4.0.0" + } + } + }, + "babel-plugin-transform-es2015-classes": { + "version": "6.3.15", + "from": "babel-plugin-transform-es2015-classes@>=6.3.13 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.3.15.tgz" + }, + "babel-plugin-transform-es2015-computed-properties": { + "version": "6.3.13", + "from": "babel-plugin-transform-es2015-computed-properties@>=6.3.13 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.3.13.tgz" + }, + "babel-plugin-transform-es2015-destructuring": { + "version": "6.3.15", + "from": "babel-plugin-transform-es2015-destructuring@>=6.3.13 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.3.15.tgz" + }, + "babel-plugin-transform-es2015-for-of": { + "version": "6.3.13", + "from": "babel-plugin-transform-es2015-for-of@>=6.3.13 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.3.13.tgz" + }, + "babel-plugin-transform-es2015-function-name": { + "version": "6.3.13", + "from": "babel-plugin-transform-es2015-function-name@>=6.3.13 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.3.13.tgz" + }, + "babel-plugin-transform-es2015-literals": { + "version": "6.3.13", + "from": "babel-plugin-transform-es2015-literals@>=6.3.13 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.3.13.tgz" + }, + "babel-plugin-transform-es2015-modules-commonjs": { + "version": "6.3.16", + "from": "babel-plugin-transform-es2015-modules-commonjs@>=6.3.13 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.3.16.tgz" + }, + "babel-plugin-transform-es2015-object-super": { + "version": "6.3.13", + "from": "babel-plugin-transform-es2015-object-super@>=6.3.13 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.3.13.tgz" + }, + "babel-plugin-transform-es2015-parameters": { + "version": "6.3.13", + "from": "babel-plugin-transform-es2015-parameters@>=6.3.13 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.3.13.tgz" + }, + "babel-plugin-transform-es2015-shorthand-properties": { + "version": "6.3.13", + "from": "babel-plugin-transform-es2015-shorthand-properties@>=6.3.13 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.3.13.tgz" + }, + "babel-plugin-transform-es2015-spread": { + "version": "6.3.14", + "from": "babel-plugin-transform-es2015-spread@>=6.3.13 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.3.14.tgz" + }, + "babel-plugin-transform-es2015-sticky-regex": { + "version": "6.3.13", + "from": "babel-plugin-transform-es2015-sticky-regex@>=6.3.13 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.3.13.tgz" + }, + "babel-plugin-transform-es2015-template-literals": { + "version": "6.3.13", + "from": "babel-plugin-transform-es2015-template-literals@>=6.3.13 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.3.13.tgz" + }, + "babel-plugin-transform-es2015-typeof-symbol": { + "version": "6.3.13", + "from": "babel-plugin-transform-es2015-typeof-symbol@>=6.3.13 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.3.13.tgz" + }, + "babel-plugin-transform-es2015-unicode-regex": { + "version": "6.3.13", + "from": "babel-plugin-transform-es2015-unicode-regex@>=6.3.13 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.3.13.tgz" + }, + "babel-plugin-transform-exponentiation-operator": { + "version": "6.3.13", + "from": "babel-plugin-transform-exponentiation-operator@>=6.3.13 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.3.13.tgz" + }, + "babel-plugin-transform-export-extensions": { + "version": "6.3.13", + "from": "babel-plugin-transform-export-extensions@>=6.3.13 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-export-extensions/-/babel-plugin-transform-export-extensions-6.3.13.tgz" + }, + "babel-plugin-transform-flow-strip-types": { + "version": "6.3.15", + "from": "babel-plugin-transform-flow-strip-types@>=6.3.13 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.3.15.tgz" + }, + "babel-plugin-transform-function-bind": { + "version": "6.3.13", + "from": "babel-plugin-transform-function-bind@>=6.3.13 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-function-bind/-/babel-plugin-transform-function-bind-6.3.13.tgz" + }, + "babel-plugin-transform-object-rest-spread": { + "version": "6.3.13", + "from": "babel-plugin-transform-object-rest-spread@>=6.3.13 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.3.13.tgz" + }, + "babel-plugin-transform-react-display-name": { + "version": "6.3.13", + "from": "babel-plugin-transform-react-display-name@>=6.3.13 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.3.13.tgz" + }, + "babel-plugin-transform-react-jsx": { + "version": "6.3.13", + "from": "babel-plugin-transform-react-jsx@>=6.3.13 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.3.13.tgz" + }, + "babel-plugin-transform-react-jsx-source": { + "version": "6.3.13", + "from": "babel-plugin-transform-react-jsx-source@>=6.3.13 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.3.13.tgz" + }, + "babel-plugin-transform-regenerator": { + "version": "6.3.13", + "from": "babel-plugin-transform-regenerator@>=6.3.13 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.3.13.tgz" + }, + "babel-plugin-transform-strict-mode": { + "version": "6.3.13", + "from": "babel-plugin-transform-strict-mode@>=6.3.13 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.3.13.tgz" + }, "babel-plugin-undeclared-variables-check": { "version": "1.0.2", "from": "babel-plugin-undeclared-variables-check@>=1.0.2 <2.0.0", @@ -316,36 +726,99 @@ "from": "babel-plugin-undefined-to-void@>=1.1.6 <2.0.0", "resolved": "https://registry.npmjs.org/babel-plugin-undefined-to-void/-/babel-plugin-undefined-to-void-1.1.6.tgz" }, + "babel-polyfill": { + "version": "6.3.14", + "from": "babel-polyfill@latest", + "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.3.14.tgz" + }, + "babel-preset-es2015": { + "version": "6.3.13", + "from": "babel-preset-es2015@latest", + "resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.3.13.tgz" + }, + "babel-preset-react": { + "version": "6.3.13", + "from": "babel-preset-react@latest", + "resolved": "https://registry.npmjs.org/babel-preset-react/-/babel-preset-react-6.3.13.tgz" + }, + "babel-preset-stage-0": { + "version": "6.3.13", + "from": "babel-preset-stage-0@latest", + "resolved": "https://registry.npmjs.org/babel-preset-stage-0/-/babel-preset-stage-0-6.3.13.tgz" + }, + "babel-preset-stage-1": { + "version": "6.3.13", + "from": "babel-preset-stage-1@>=6.3.13 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-preset-stage-1/-/babel-preset-stage-1-6.3.13.tgz" + }, + "babel-preset-stage-2": { + "version": "6.3.13", + "from": "babel-preset-stage-2@>=6.3.13 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-preset-stage-2/-/babel-preset-stage-2-6.3.13.tgz" + }, + "babel-preset-stage-3": { + "version": "6.3.13", + "from": "babel-preset-stage-3@>=6.3.13 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-preset-stage-3/-/babel-preset-stage-3-6.3.13.tgz" + }, + "babel-regenerator-runtime": { + "version": "6.3.13", + "from": "babel-regenerator-runtime@>=6.3.13 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-regenerator-runtime/-/babel-regenerator-runtime-6.3.13.tgz" + }, + "babel-register": { + "version": "6.3.13", + "from": "babel-register@>=6.3.13 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.3.13.tgz", + "dependencies": { + "lodash": { + "version": "3.10.1", + "from": "lodash@>=3.10.0 <4.0.0" + } + } + }, "babel-runtime": { "version": "5.8.34", - "from": "babel-runtime@>=5.8.25 <6.0.0", + "from": "babel-runtime@>=5.0.0 <6.0.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-5.8.34.tgz" }, + "babel-template": { + "version": "6.3.13", + "from": "babel-template@>=6.3.13 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.3.13.tgz", + "dependencies": { + "lodash": { + "version": "3.10.1", + "from": "lodash@>=3.10.1 <4.0.0" + } + } + }, "babel-traverse": { - "version": "6.3.15", - "from": "babel-traverse@>=6.0.20 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.3.15.tgz", + "version": "6.3.17", + "from": "babel-traverse@>=6.3.17 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.3.17.tgz", "dependencies": { - "babylon": { - "version": "6.3.15", - "from": "babylon@>=6.3.15 <7.0.0" - }, - "globals": { - "version": "8.14.0", - "from": "globals@>=8.3.0 <9.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-8.14.0.tgz" + "lodash": { + "version": "3.10.1", + "from": "lodash@>=3.10.1 <4.0.0" } } }, "babel-types": { - "version": "6.3.14", - "from": "babel-types@>=6.0.19 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.3.14.tgz" + "version": "6.3.17", + "from": "babel-types@>=6.3.17 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.3.17.tgz", + "dependencies": { + "lodash": { + "version": "3.10.1", + "from": "lodash@>=3.10.1 <4.0.0" + } + } }, "babylon": { - "version": "5.8.34", - "from": "babylon@>=5.8.34 <6.0.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-5.8.34.tgz" + "version": "6.3.15", + "from": "babylon@>=6.3.15 <7.0.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.3.15.tgz" }, "balanced-match": { "version": "0.3.0", @@ -377,6 +850,16 @@ "from": "big.js@>=3.0.2 <4.0.0", "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.1.3.tgz" }, + "bin-version": { + "version": "1.0.4", + "from": "bin-version@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/bin-version/-/bin-version-1.0.4.tgz" + }, + "bin-version-check": { + "version": "2.1.0", + "from": "bin-version-check@>=2.1.0 <3.0.0", + "resolved": "https://registry.npmjs.org/bin-version-check/-/bin-version-check-2.1.0.tgz" + }, "binary-extensions": { "version": "1.4.0", "from": "binary-extensions@>=1.0.0 <2.0.0", @@ -397,23 +880,33 @@ "from": "bluebird@>=2.9.33 <3.0.0", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.10.2.tgz" }, - "body-parser": { - "version": "1.14.1", - "from": "body-parser@>=1.14.1 <2.0.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.14.1.tgz", - "dependencies": { - "iconv-lite": { - "version": "0.4.12", - "from": "iconv-lite@0.4.12", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.12.tgz" - } - } - }, "boom": { "version": "2.10.1", "from": "boom@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz" }, + "bootstrap-loader": { + "version": "1.0.0-rc", + "from": "bootstrap-loader@latest", + "resolved": "https://registry.npmjs.org/bootstrap-loader/-/bootstrap-loader-1.0.0-rc.tgz", + "dependencies": { + "js-yaml": { + "version": "3.4.6", + "from": "js-yaml@>=3.4.3 <4.0.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.4.6.tgz" + }, + "semver": { + "version": "5.1.0", + "from": "semver@>=5.0.3 <6.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.1.0.tgz" + } + } + }, + "bootstrap-sass": { + "version": "3.3.6", + "from": "bootstrap-sass@>=3.3.5 <4.0.0", + "resolved": "https://registry.npmjs.org/bootstrap-sass/-/bootstrap-sass-3.3.6.tgz" + }, "brace-expansion": { "version": "1.1.2", "from": "brace-expansion@>=1.0.0 <2.0.0", @@ -440,9 +933,16 @@ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.0.1.tgz" }, "buffer": { - "version": "3.5.3", + "version": "3.5.5", "from": "buffer@>=3.0.3 <4.0.0", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-3.5.3.tgz" + "resolved": "https://registry.npmjs.org/buffer/-/buffer-3.5.5.tgz", + "dependencies": { + "isarray": { + "version": "1.0.0", + "from": "isarray@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" + } + } }, "builtin-modules": { "version": "1.1.0", @@ -455,26 +955,19 @@ "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.1.0.tgz" }, "camelcase": { - "version": "1.2.1", - "from": "camelcase@>=1.2.1 <2.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz" + "version": "2.0.1", + "from": "camelcase@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.0.1.tgz" }, "camelcase-keys": { "version": "2.0.0", "from": "camelcase-keys@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.0.0.tgz", - "dependencies": { - "camelcase": { - "version": "2.0.1", - "from": "camelcase@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.0.1.tgz" - } - } + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.0.0.tgz" }, "caniuse-db": { - "version": "1.0.30000372", + "version": "1.0.30000377", "from": "caniuse-db@>=1.0.30000372 <2.0.0", - "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000372.tgz" + "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000377.tgz" }, "caseless": { "version": "0.11.0", @@ -488,7 +981,7 @@ }, "chalk": { "version": "1.1.1", - "from": "chalk@>=1.0.0 <2.0.0", + "from": "chalk@1.1.1", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.1.tgz" }, "character-parser": { @@ -497,9 +990,9 @@ "resolved": "https://registry.npmjs.org/character-parser/-/character-parser-1.2.1.tgz" }, "chokidar": { - "version": "1.3.0", + "version": "1.4.1", "from": "chokidar@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.3.0.tgz" + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.4.1.tgz" }, "classnames": { "version": "2.2.1", @@ -546,9 +1039,9 @@ "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-1.1.0.tgz" }, "cliui": { - "version": "2.1.0", - "from": "cliui@>=2.1.0 <3.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz" + "version": "3.1.0", + "from": "cliui@>=3.0.3 <4.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.1.0.tgz" }, "clone": { "version": "1.0.2", @@ -582,13 +1075,13 @@ }, "commander": { "version": "2.9.0", - "from": "commander@>=2.5.0 <3.0.0", + "from": "commander@>=2.8.1 <3.0.0", "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz" }, "comment-parser": { - "version": "0.3.0", - "from": "comment-parser@0.3.0", - "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-0.3.0.tgz" + "version": "0.3.1", + "from": "comment-parser@>=0.3.1 <0.4.0", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-0.3.1.tgz" }, "commoner": { "version": "0.10.4", @@ -629,7 +1122,7 @@ }, "concat-stream": { "version": "1.5.1", - "from": "concat-stream@>=1.4.6 <2.0.0", + "from": "concat-stream@>=1.4.7 <2.0.0", "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.5.1.tgz" }, "config-chain": { @@ -650,14 +1143,7 @@ "constantinople": { "version": "3.0.2", "from": "constantinople@>=3.0.1 <3.1.0", - "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-3.0.2.tgz", - "dependencies": { - "acorn": { - "version": "2.6.4", - "from": "acorn@>=2.1.0 <3.0.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-2.6.4.tgz" - } - } + "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-3.0.2.tgz" }, "constants-browserify": { "version": "0.0.1", @@ -700,21 +1186,14 @@ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" }, "cross-spawn": { - "version": "2.0.1", + "version": "2.1.0", "from": "cross-spawn@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-2.0.1.tgz" + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-2.1.0.tgz" }, "cross-spawn-async": { - "version": "2.0.1", + "version": "2.1.1", "from": "cross-spawn-async@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/cross-spawn-async/-/cross-spawn-async-2.0.1.tgz", - "dependencies": { - "lru-cache": { - "version": "3.2.0", - "from": "lru-cache@>=3.2.0 <4.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-3.2.0.tgz" - } - } + "resolved": "https://registry.npmjs.org/cross-spawn-async/-/cross-spawn-async-2.1.1.tgz" }, "cryptiles": { "version": "2.0.5", @@ -736,6 +1215,17 @@ "from": "css-color-names@0.0.2", "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.2.tgz" }, + "css-loader": { + "version": "0.23.0", + "from": "css-loader@>=0.23.0 <0.24.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-0.23.0.tgz", + "dependencies": { + "loader-utils": { + "version": "0.2.12", + "from": "loader-utils@>=0.2.2 <0.3.0" + } + } + }, "css-parse": { "version": "1.0.4", "from": "css-parse@1.0.4", @@ -757,16 +1247,9 @@ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz" }, "cssnano": { - "version": "3.3.2", + "version": "3.4.0", "from": "cssnano@>=2.6.1 <4.0.0", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-3.3.2.tgz", - "dependencies": { - "object-assign": { - "version": "4.0.1", - "from": "object-assign@>=4.0.1 <5.0.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.0.1.tgz" - } - } + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-3.4.0.tgz" }, "cssom": { "version": "0.3.0", @@ -805,7 +1288,7 @@ }, "decamelize": { "version": "1.1.1", - "from": "decamelize@>=1.0.0 <2.0.0", + "from": "decamelize@>=1.1.0 <2.0.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.1.1.tgz" }, "deep-eql": { @@ -838,20 +1321,39 @@ "defs": { "version": "1.1.1", "from": "defs@>=1.1.0 <1.2.0", - "resolved": "https://registry.npmjs.org/defs/-/defs-1.1.1.tgz" - }, - "del": { - "version": "2.1.0", - "from": "del@>=2.0.2 <3.0.0", - "resolved": "https://registry.npmjs.org/del/-/del-2.1.0.tgz", + "resolved": "https://registry.npmjs.org/defs/-/defs-1.1.1.tgz", "dependencies": { - "object-assign": { - "version": "4.0.1", - "from": "object-assign@>=4.0.1 <5.0.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.0.1.tgz" + "camelcase": { + "version": "1.2.1", + "from": "camelcase@>=1.2.1 <2.0.0" + }, + "cliui": { + "version": "2.1.0", + "from": "cliui@>=2.1.0 <3.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz" + }, + "esprima-fb": { + "version": "15001.1001.0-dev-harmony-fb", + "from": "esprima-fb@>=15001.1001.0-dev-harmony-fb <15001.1002.0", + "resolved": "https://registry.npmjs.org/esprima-fb/-/esprima-fb-15001.1001.0-dev-harmony-fb.tgz" + }, + "wordwrap": { + "version": "0.0.2", + "from": "wordwrap@0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz" + }, + "yargs": { + "version": "3.27.0", + "from": "yargs@>=3.27.0 <3.28.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.27.0.tgz" } } }, + "del": { + "version": "2.2.0", + "from": "del@>=2.0.2 <3.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.0.tgz" + }, "delayed-stream": { "version": "1.0.0", "from": "delayed-stream@>=1.0.0 <1.1.0", @@ -874,13 +1376,20 @@ }, "detect-indent": { "version": "3.0.1", - "from": "detect-indent@>=3.0.0 <4.0.0", + "from": "detect-indent@>=3.0.1 <4.0.0", "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-3.0.1.tgz" }, "detective": { "version": "4.3.1", "from": "detective@>=4.3.1 <5.0.0", - "resolved": "https://registry.npmjs.org/detective/-/detective-4.3.1.tgz" + "resolved": "https://registry.npmjs.org/detective/-/detective-4.3.1.tgz", + "dependencies": { + "acorn": { + "version": "1.2.2", + "from": "acorn@>=1.0.3 <2.0.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-1.2.2.tgz" + } + } }, "diff": { "version": "1.4.0", @@ -927,9 +1436,9 @@ "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.1.tgz" }, "domain-browser": { - "version": "1.1.4", + "version": "1.1.7", "from": "domain-browser@>=1.1.1 <2.0.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.4.tgz" + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz" }, "domelementtype": { "version": "1.3.0", @@ -989,14 +1498,14 @@ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.0.tgz" }, "es5-ext": { - "version": "0.10.9", + "version": "0.10.10", "from": "es5-ext@>=0.10.8 <0.11.0", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.9.tgz" + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.10.tgz" }, "es5-shim": { - "version": "4.3.1", + "version": "4.4.0", "from": "es5-shim@>=4.3.1 <5.0.0", - "resolved": "https://registry.npmjs.org/es5-shim/-/es5-shim-4.3.1.tgz" + "resolved": "https://registry.npmjs.org/es5-shim/-/es5-shim-4.4.0.tgz" }, "es6-iterator": { "version": "2.0.0", @@ -1033,6 +1542,11 @@ "from": "escape-html@1.0.2", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.2.tgz" }, + "escape-regexp": { + "version": "0.0.1", + "from": "escape-regexp@0.0.1", + "resolved": "https://registry.npmjs.org/escape-regexp/-/escape-regexp-0.0.1.tgz" + }, "escape-string-regexp": { "version": "1.0.3", "from": "escape-string-regexp@>=1.0.2 <2.0.0", @@ -1070,10 +1584,10 @@ "from": "escope@>=3.3.0 <4.0.0", "resolved": "https://registry.npmjs.org/escope/-/escope-3.3.0.tgz" }, - "esprima-fb": { - "version": "15001.1001.0-dev-harmony-fb", - "from": "esprima-fb@>=15001.1001.0-dev-harmony-fb <15001.1002.0", - "resolved": "https://registry.npmjs.org/esprima-fb/-/esprima-fb-15001.1001.0-dev-harmony-fb.tgz" + "esprima": { + "version": "2.7.1", + "from": "esprima@>=2.6.0 <3.0.0", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.1.tgz" }, "esrecurse": { "version": "3.1.1", @@ -1099,7 +1613,7 @@ }, "esutils": { "version": "2.0.2", - "from": "esutils@>=2.0.0 <3.0.0", + "from": "esutils@>=2.0.2 <3.0.0", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz" }, "etag": { @@ -1179,6 +1693,11 @@ "from": "extglob@>=0.3.1 <0.4.0", "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.1.tgz" }, + "extract-text-webpack-plugin": { + "version": "0.9.1", + "from": "extract-text-webpack-plugin@*", + "resolved": "https://registry.npmjs.org/extract-text-webpack-plugin/-/extract-text-webpack-plugin-0.9.1.tgz" + }, "extsprintf": { "version": "1.0.2", "from": "extsprintf@1.0.2", @@ -1217,12 +1736,16 @@ "file-entry-cache": { "version": "1.2.4", "from": "file-entry-cache@>=1.1.1 <2.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-1.2.4.tgz", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-1.2.4.tgz" + }, + "file-loader": { + "version": "0.8.5", + "from": "file-loader@>=0.8.4 <0.9.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-0.8.5.tgz", "dependencies": { - "object-assign": { - "version": "4.0.1", - "from": "object-assign@>=4.0.1 <5.0.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.0.1.tgz" + "loader-utils": { + "version": "0.2.12", + "from": "loader-utils@>=0.2.5 <0.3.0" } } }, @@ -1232,9 +1755,9 @@ "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.0.tgz" }, "fill-range": { - "version": "2.2.2", + "version": "2.2.3", "from": "fill-range@>=2.1.0 <3.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.2.tgz" + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz" }, "finalhandler": { "version": "0.4.0", @@ -1253,6 +1776,11 @@ } } }, + "find-versions": { + "version": "1.2.1", + "from": "find-versions@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-1.2.1.tgz" + }, "flat-cache": { "version": "1.0.10", "from": "flat-cache@>=1.0.9 <2.0.0", @@ -1304,15 +1832,10 @@ "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-0.1.2.tgz" }, "fsevents": { - "version": "1.0.5", + "version": "1.0.6", "from": "fsevents@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.0.5.tgz", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.0.6.tgz", "dependencies": { - "abbrev": { - "version": "1.0.7", - "from": "abbrev@1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.7.tgz" - }, "ansi": { "version": "0.3.0", "from": "ansi@~0.3.0", @@ -1334,9 +1857,9 @@ "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.0.4.tgz" }, "asn1": { - "version": "0.1.11", - "from": "asn1@0.1.11", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.1.11.tgz" + "version": "0.2.3", + "from": "asn1@>=0.2.3 <0.3.0", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz" }, "assert-plus": { "version": "0.1.5", @@ -1353,11 +1876,6 @@ "from": "aws-sign2@~0.6.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz" }, - "balanced-match": { - "version": "0.2.1", - "from": "balanced-match@>=0.2.0 <0.3.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.2.1.tgz" - }, "bl": { "version": "1.0.0", "from": "bl@~1.0.0", @@ -1369,9 +1887,9 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.4.tgz", "dependencies": { "core-util-is": { - "version": "1.0.1", + "version": "1.0.2", "from": "core-util-is@~1.0.0", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.1.tgz" + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" }, "inherits": { "version": "2.0.1", @@ -1409,14 +1927,9 @@ }, "boom": { "version": "2.10.1", - "from": "boom@^2.8.x", + "from": "boom@2.x.x", "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz" }, - "brace-expansion": { - "version": "1.1.1", - "from": "brace-expansion@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.1.tgz" - }, "caseless": { "version": "0.11.0", "from": "caseless@~0.11.0", @@ -1434,28 +1947,23 @@ }, "commander": { "version": "2.9.0", - "from": "commander@^2.8.1", + "from": "commander@^2.9.0", "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz" }, - "concat-map": { - "version": "0.0.1", - "from": "concat-map@0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" - }, "core-util-is": { - "version": "1.0.1", + "version": "1.0.2", "from": "core-util-is@~1.0.0", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.1.tgz" + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" }, "cryptiles": { "version": "2.0.5", "from": "cryptiles@2.x.x", "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz" }, - "ctype": { - "version": "0.5.3", - "from": "ctype@0.5.3", - "resolved": "https://registry.npmjs.org/ctype/-/ctype-0.5.3.tgz" + "dashdash": { + "version": "1.10.1", + "from": "dashdash@>=1.10.1 <2.0.0", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.10.1.tgz" }, "debug": { "version": "0.7.4", @@ -1463,9 +1971,9 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-0.7.4.tgz" }, "deep-extend": { - "version": "0.2.11", - "from": "deep-extend@~0.2.5", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.2.11.tgz" + "version": "0.4.0", + "from": "deep-extend@~0.4.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.0.tgz" }, "delayed-stream": { "version": "1.0.0", @@ -1477,6 +1985,11 @@ "from": "delegates@^0.1.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-0.1.0.tgz" }, + "ecc-jsbn": { + "version": "0.1.1", + "from": "ecc-jsbn@>=0.0.1 <1.0.0", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz" + }, "escape-string-regexp": { "version": "1.0.3", "from": "escape-string-regexp@^1.0.2", @@ -1487,6 +2000,11 @@ "from": "extend@~3.0.0", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz" }, + "extsprintf": { + "version": "1.0.2", + "from": "extsprintf@1.0.2", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz" + }, "forever-agent": { "version": "0.6.1", "from": "forever-agent@~0.6.1", @@ -1509,7 +2027,27 @@ "dependencies": { "minimatch": { "version": "3.0.0", - "from": "minimatch@>=3.0.0 <4.0.0" + "from": "minimatch@^3.0.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.0.tgz", + "dependencies": { + "brace-expansion": { + "version": "1.1.1", + "from": "brace-expansion@^1.0.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.1.tgz", + "dependencies": { + "balanced-match": { + "version": "0.2.1", + "from": "balanced-match@^0.2.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.2.1.tgz" + }, + "concat-map": { + "version": "0.0.1", + "from": "concat-map@0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + } + } + } + } } } }, @@ -1539,9 +2077,9 @@ "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz" }, "har-validator": { - "version": "2.0.2", + "version": "2.0.3", "from": "har-validator@~2.0.2", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.2.tgz" + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.3.tgz" }, "has-ansi": { "version": "2.0.0", @@ -1554,9 +2092,9 @@ "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-1.0.1.tgz" }, "hawk": { - "version": "3.1.0", + "version": "3.1.2", "from": "hawk@~3.1.0", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.0.tgz" + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.2.tgz" }, "hoek": { "version": "2.16.3", @@ -1564,20 +2102,9 @@ "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz" }, "http-signature": { - "version": "0.11.0", - "from": "http-signature@~0.11.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-0.11.0.tgz" - }, - "inflight": { - "version": "1.0.4", - "from": "inflight@>=1.0.4 <2.0.0", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.4.tgz", - "dependencies": { - "once": { - "version": "1.3.2", - "from": "once@>=1.3.0 <2.0.0" - } - } + "version": "1.1.0", + "from": "http-signature@~1.1.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.0.tgz" }, "inherits": { "version": "2.0.1", @@ -1590,15 +2117,20 @@ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz" }, "is-my-json-valid": { - "version": "2.12.2", - "from": "is-my-json-valid@^2.12.2", - "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.12.2.tgz" + "version": "2.12.3", + "from": "is-my-json-valid@^2.12.3", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.12.3.tgz" }, "is-property": { "version": "1.0.2", "from": "is-property@^1.0.0", "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz" }, + "is-typedarray": { + "version": "1.0.0", + "from": "is-typedarray@~1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" + }, "isarray": { "version": "0.0.1", "from": "isarray@0.0.1", @@ -1609,6 +2141,21 @@ "from": "isstream@~0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz" }, + "jodid25519": { + "version": "1.0.2", + "from": "jodid25519@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/jodid25519/-/jodid25519-1.0.2.tgz" + }, + "jsbn": { + "version": "0.1.0", + "from": "jsbn@>=0.1.0 <0.2.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.0.tgz" + }, + "json-schema": { + "version": "0.2.2", + "from": "json-schema@0.2.2", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.2.tgz" + }, "json-stringify-safe": { "version": "5.0.1", "from": "json-stringify-safe@~5.0.1", @@ -1619,6 +2166,11 @@ "from": "jsonpointer@2.0.0", "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-2.0.0.tgz" }, + "jsprim": { + "version": "1.2.2", + "from": "jsprim@^1.2.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.2.2.tgz" + }, "lodash._basetostring": { "version": "3.0.1", "from": "lodash._basetostring@^3.0.0", @@ -1670,26 +2222,33 @@ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz" }, "node-pre-gyp": { - "version": "0.6.15", - "from": "node-pre-gyp@latest", - "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.6.15.tgz", + "version": "0.6.17", + "from": "node-pre-gyp@>=0.6.17 <0.7.0", + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.6.17.tgz", "dependencies": { "nopt": { - "version": "3.0.4", - "from": "nopt@>=3.0.1 <3.1.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.4.tgz" + "version": "3.0.6", + "from": "nopt@~3.0.1", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "dependencies": { + "abbrev": { + "version": "1.0.7", + "from": "abbrev@1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.7.tgz" + } + } } } }, "node-uuid": { - "version": "1.4.3", - "from": "node-uuid@~1.4.3", - "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.3.tgz" + "version": "1.4.7", + "from": "node-uuid@~1.4.7", + "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.7.tgz" }, "npmlog": { - "version": "1.2.1", - "from": "npmlog@~1.2.0", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-1.2.1.tgz" + "version": "2.0.0", + "from": "npmlog@~2.0.0", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-2.0.0.tgz" }, "oauth-sign": { "version": "0.8.0", @@ -1701,20 +2260,15 @@ "from": "once@~1.1.1", "resolved": "https://registry.npmjs.org/once/-/once-1.1.1.tgz" }, - "path-is-absolute": { - "version": "1.0.0", - "from": "path-is-absolute@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz" - }, "pinkie": { - "version": "1.0.0", - "from": "pinkie@^1.0.0", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-1.0.0.tgz" + "version": "2.0.1", + "from": "pinkie@^2.0.0", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.1.tgz" }, "pinkie-promise": { - "version": "1.0.0", - "from": "pinkie-promise@^1.0.0", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-1.0.0.tgz" + "version": "2.0.0", + "from": "pinkie-promise@^2.0.0", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.0.tgz" }, "qs": { "version": "5.2.0", @@ -1722,13 +2276,13 @@ "resolved": "https://registry.npmjs.org/qs/-/qs-5.2.0.tgz" }, "rc": { - "version": "1.1.2", + "version": "1.1.5", "from": "rc@~1.1.0", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.1.2.tgz", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.1.5.tgz", "dependencies": { "minimist": { "version": "1.2.0", - "from": "minimist@^1.1.2", + "from": "minimist@^1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz" } } @@ -1739,42 +2293,104 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.13.tgz" }, "request": { - "version": "2.65.0", + "version": "2.67.0", "from": "request@2.x", - "resolved": "https://registry.npmjs.org/request/-/request-2.65.0.tgz" + "resolved": "https://registry.npmjs.org/request/-/request-2.67.0.tgz" }, "rimraf": { - "version": "2.4.3", + "version": "2.4.4", "from": "rimraf@~2.4.0", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.3.tgz", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.4.tgz", "dependencies": { "glob": { "version": "5.0.15", - "from": "glob@>=5.0.14 <6.0.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz" - }, - "minimatch": { - "version": "3.0.0", - "from": "minimatch@>=2.0.0 <3.0.0||>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.0.tgz" - }, - "once": { - "version": "1.3.2", - "from": "once@>=1.3.0 <2.0.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.3.2.tgz" + "from": "glob@^5.0.14", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "dependencies": { + "inflight": { + "version": "1.0.4", + "from": "inflight@^1.0.4", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.4.tgz", + "dependencies": { + "wrappy": { + "version": "1.0.1", + "from": "wrappy@1", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz" + } + } + }, + "inherits": { + "version": "2.0.1", + "from": "inherits@2", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + }, + "minimatch": { + "version": "3.0.0", + "from": "minimatch@2 || 3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.0.tgz", + "dependencies": { + "brace-expansion": { + "version": "1.1.1", + "from": "brace-expansion@^1.0.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.1.tgz", + "dependencies": { + "balanced-match": { + "version": "0.2.1", + "from": "balanced-match@^0.2.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.2.1.tgz" + }, + "concat-map": { + "version": "0.0.1", + "from": "concat-map@0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + } + } + } + } + }, + "once": { + "version": "1.3.3", + "from": "once@^1.3.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", + "dependencies": { + "wrappy": { + "version": "1.0.1", + "from": "wrappy@1", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz" + } + } + }, + "path-is-absolute": { + "version": "1.0.0", + "from": "path-is-absolute@^1.0.0", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz" + } + } } } }, "semver": { - "version": "5.0.3", - "from": "semver@~5.0.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.0.3.tgz" + "version": "5.1.0", + "from": "semver@~5.1.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.1.0.tgz" }, "sntp": { "version": "1.0.9", "from": "sntp@1.x.x", "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz" }, + "sshpk": { + "version": "1.7.0", + "from": "sshpk@^1.7.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.7.0.tgz", + "dependencies": { + "assert-plus": { + "version": "0.2.0", + "from": "assert-plus@>=0.2.0 <0.3.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz" + } + } + }, "string_decoder": { "version": "0.10.31", "from": "string_decoder@~0.10.x", @@ -1791,9 +2407,9 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.0.tgz" }, "strip-json-comments": { - "version": "0.1.3", - "from": "strip-json-comments@0.1.x", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-0.1.3.tgz" + "version": "1.0.4", + "from": "strip-json-comments@~1.0.4", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz" }, "supports-color": { "version": "2.0.0", @@ -1816,13 +2432,13 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.33.tgz", "dependencies": { "core-util-is": { - "version": "1.0.1", + "version": "1.0.2", "from": "core-util-is@~1.0.0", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.1.tgz" + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" }, "inherits": { "version": "2.0.1", - "from": "inherits@~2.0.1", + "from": "inherits@~2.0.0", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" }, "isarray": { @@ -1845,24 +2461,29 @@ } }, "tough-cookie": { - "version": "2.2.0", + "version": "2.2.1", "from": "tough-cookie@~2.2.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.2.0.tgz" + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.2.1.tgz" }, "tunnel-agent": { "version": "0.4.1", "from": "tunnel-agent@~0.4.1", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.1.tgz" }, + "tweetnacl": { + "version": "0.13.2", + "from": "tweetnacl@>=0.13.0 <1.0.0", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.13.2.tgz" + }, "uid-number": { "version": "0.0.3", "from": "uid-number@0.0.3", "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.3.tgz" }, - "wrappy": { - "version": "1.0.1", - "from": "wrappy@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz" + "verror": { + "version": "1.3.6", + "from": "verror@1.3.6", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz" }, "xtend": { "version": "4.0.1", @@ -1903,7 +2524,7 @@ }, "glob": { "version": "5.0.15", - "from": "glob@>=5.0.15 <6.0.0", + "from": "glob@>=5.0.5 <6.0.0", "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz" }, "glob-base": { @@ -1929,24 +2550,19 @@ } }, "globals": { - "version": "6.4.1", - "from": "globals@>=6.4.0 <7.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-6.4.1.tgz" + "version": "8.14.0", + "from": "globals@>=8.3.0 <9.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-8.14.0.tgz" }, "globby": { - "version": "3.0.1", - "from": "globby@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-3.0.1.tgz", + "version": "4.0.0", + "from": "globby@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-4.0.0.tgz", "dependencies": { - "object-assign": { - "version": "4.0.1", - "from": "object-assign@>=4.0.1 <5.0.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.0.1.tgz" - }, - "pinkie-promise": { - "version": "1.0.0", - "from": "pinkie-promise@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-1.0.0.tgz" + "glob": { + "version": "6.0.1", + "from": "glob@>=6.0.1 <7.0.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.1.tgz" } } }, @@ -1975,6 +2591,11 @@ "from": "lodash@>=1.0.1 <1.1.0", "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.0.2.tgz" }, + "lru-cache": { + "version": "2.7.3", + "from": "lru-cache@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz" + }, "minimatch": { "version": "0.2.14", "from": "minimatch@>=0.2.11 <0.3.0", @@ -2046,7 +2667,7 @@ }, "history": { "version": "1.13.1", - "from": "history@>=1.12.5 <2.0.0", + "from": "history@>=1.13.0 <1.14.0", "resolved": "https://registry.npmjs.org/history/-/history-1.13.1.tgz", "dependencies": { "qs": { @@ -2083,8 +2704,7 @@ "dependencies": { "readable-stream": { "version": "1.1.13", - "from": "readable-stream@>=1.1.0 <1.2.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.13.tgz" + "from": "readable-stream@>=1.1.0 <1.2.0" } } }, @@ -2119,9 +2739,9 @@ "resolved": "https://registry.npmjs.org/i/-/i-0.3.3.tgz" }, "iconv-lite": { - "version": "0.4.13", - "from": "iconv-lite@>=0.4.5 <0.5.0", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz" + "version": "0.4.12", + "from": "iconv-lite@0.4.12", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.12.tgz" }, "icss-replace-symbols": { "version": "1.0.2", @@ -2143,6 +2763,10 @@ "from": "imports-loader@>=0.6.5 <0.7.0", "resolved": "https://registry.npmjs.org/imports-loader/-/imports-loader-0.6.5.tgz", "dependencies": { + "loader-utils": { + "version": "0.2.12", + "from": "loader-utils@>=0.2.0 <0.3.0" + }, "source-map": { "version": "0.1.43", "from": "source-map@>=0.1.0 <0.2.0", @@ -2184,7 +2808,7 @@ }, "inherits": { "version": "2.0.1", - "from": "inherits@>=2.0.0 <3.0.0", + "from": "inherits@>=2.0.1 <3.0.0", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" }, "ini": { @@ -2195,7 +2819,13 @@ "inquirer": { "version": "0.11.0", "from": "inquirer@>=0.11.0 <0.12.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.11.0.tgz" + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.11.0.tgz", + "dependencies": { + "lodash": { + "version": "3.10.1", + "from": "lodash@>=3.3.1 <4.0.0" + } + } }, "interpret": { "version": "0.6.6", @@ -2204,7 +2834,7 @@ }, "invariant": { "version": "2.2.0", - "from": "invariant@>=2.0.0 <3.0.0", + "from": "invariant@>=2.2.0 <3.0.0", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.0.tgz" }, "invert-kv": { @@ -2213,9 +2843,9 @@ "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz" }, "ipaddr.js": { - "version": "1.0.4", - "from": "ipaddr.js@1.0.4", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.0.4.tgz" + "version": "1.0.5", + "from": "ipaddr.js@1.0.5", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.0.5.tgz" }, "is-absolute": { "version": "0.1.7", @@ -2227,11 +2857,6 @@ "from": "is-absolute-url@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.0.0.tgz" }, - "is-array": { - "version": "1.0.1", - "from": "is-array@>=1.0.1 <2.0.0", - "resolved": "https://registry.npmjs.org/is-array/-/is-array-1.0.1.tgz" - }, "is-arrayish": { "version": "0.2.1", "from": "is-arrayish@>=0.2.1 <0.3.0", @@ -2294,13 +2919,13 @@ }, "is-my-json-valid": { "version": "2.12.3", - "from": "is-my-json-valid@>=2.10.0 <3.0.0", + "from": "is-my-json-valid@>=2.12.3 <3.0.0", "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.12.3.tgz" }, "is-number": { - "version": "1.1.2", - "from": "is-number@>=1.1.2 <2.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-1.1.2.tgz" + "version": "2.1.0", + "from": "is-number@>=2.1.0 <3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz" }, "is-path-cwd": { "version": "1.0.0", @@ -2368,13 +2993,13 @@ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" }, "isobject": { - "version": "1.0.2", - "from": "isobject@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-1.0.2.tgz" + "version": "2.0.0", + "from": "isobject@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.0.0.tgz" }, "isstream": { "version": "0.1.2", - "from": "isstream@>=0.1.0 <0.2.0", + "from": "isstream@>=0.1.2 <0.2.0", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz" }, "jodid25519": { @@ -2398,9 +3023,9 @@ "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz" }, "js-tokens": { - "version": "1.0.1", - "from": "js-tokens@1.0.1", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-1.0.1.tgz" + "version": "1.0.2", + "from": "js-tokens@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-1.0.2.tgz" }, "js-yaml": { "version": "3.3.1", @@ -2420,9 +3045,9 @@ "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.0.tgz" }, "jscs-jsdoc": { - "version": "1.2.0", - "from": "jscs-jsdoc@1.2.0", - "resolved": "https://registry.npmjs.org/jscs-jsdoc/-/jscs-jsdoc-1.2.0.tgz" + "version": "1.3.1", + "from": "jscs-jsdoc@>=1.3.1 <2.0.0", + "resolved": "https://registry.npmjs.org/jscs-jsdoc/-/jscs-jsdoc-1.3.1.tgz" }, "jscs-preset-wikimedia": { "version": "1.0.0", @@ -2432,7 +3057,13 @@ "jsdoctypeparser": { "version": "1.2.0", "from": "jsdoctypeparser@>=1.2.0 <1.3.0", - "resolved": "https://registry.npmjs.org/jsdoctypeparser/-/jsdoctypeparser-1.2.0.tgz" + "resolved": "https://registry.npmjs.org/jsdoctypeparser/-/jsdoctypeparser-1.2.0.tgz", + "dependencies": { + "lodash": { + "version": "3.10.1", + "from": "lodash@>=3.7.0 <4.0.0" + } + } }, "jsesc": { "version": "0.5.0", @@ -2529,14 +3160,14 @@ "resolved": "https://registry.npmjs.org/keycode/-/keycode-2.1.0.tgz" }, "kind-of": { - "version": "2.0.1", - "from": "kind-of@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-2.0.1.tgz" + "version": "3.0.2", + "from": "kind-of@>=3.0.2 <4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.0.2.tgz" }, "lazy-cache": { - "version": "0.2.4", - "from": "lazy-cache@>=0.2.4 <0.3.0", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.4.tgz" + "version": "0.2.7", + "from": "lazy-cache@>=0.2.3 <0.3.0", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz" }, "lcid": { "version": "1.0.0", @@ -2560,7 +3191,7 @@ }, "line-numbers": { "version": "0.2.0", - "from": "line-numbers@0.2.0", + "from": "line-numbers@>=0.2.0 <0.3.0", "resolved": "https://registry.npmjs.org/line-numbers/-/line-numbers-0.2.0.tgz" }, "load-json-file": { @@ -2708,6 +3339,11 @@ "from": "lodash.deburr@>=3.0.0 <4.0.0", "resolved": "https://registry.npmjs.org/lodash.deburr/-/lodash.deburr-3.0.2.tgz" }, + "lodash.defaults": { + "version": "3.1.2", + "from": "lodash.defaults@>=3.1.2 <4.0.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-3.1.2.tgz" + }, "lodash.isarguments": { "version": "3.0.4", "from": "lodash.isarguments@>=3.0.0 <4.0.0", @@ -2788,6 +3424,11 @@ "from": "lodash.words@>=3.0.0 <4.0.0", "resolved": "https://registry.npmjs.org/lodash.words/-/lodash.words-3.0.2.tgz" }, + "log-symbols": { + "version": "1.0.2", + "from": "log-symbols@>=1.0.2 <2.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz" + }, "longest": { "version": "1.0.1", "from": "longest@>=1.0.1 <2.0.0", @@ -2804,9 +3445,9 @@ "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.2.0.tgz" }, "lru-cache": { - "version": "2.7.3", - "from": "lru-cache@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz" + "version": "3.2.0", + "from": "lru-cache@>=3.2.0 <4.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-3.2.0.tgz" }, "map-obj": { "version": "1.0.1", @@ -2830,15 +3471,8 @@ }, "meow": { "version": "3.6.0", - "from": "meow@>=3.3.0 <4.0.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.6.0.tgz", - "dependencies": { - "object-assign": { - "version": "4.0.1", - "from": "object-assign@>=4.0.1 <5.0.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.0.1.tgz" - } - } + "from": "meow@>=3.5.0 <4.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.6.0.tgz" }, "merge-descriptors": { "version": "1.0.0", @@ -2851,14 +3485,14 @@ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.1.tgz" }, "micromatch": { - "version": "2.3.3", + "version": "2.3.5", "from": "micromatch@>=2.1.5 <3.0.0", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.3.tgz" + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.5.tgz" }, "mime": { - "version": "1.3.4", - "from": "mime@1.3.4", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz" + "version": "1.2.11", + "from": "mime@>=1.2.0 <1.3.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz" }, "mime-db": { "version": "1.20.0", @@ -2867,7 +3501,7 @@ }, "mime-types": { "version": "2.1.8", - "from": "mime-types@>=2.1.8 <2.2.0", + "from": "mime-types@>=2.1.7 <2.2.0", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.8.tgz" }, "min-document": { @@ -2909,7 +3543,7 @@ }, "nan": { "version": "2.1.0", - "from": "nan@>=2.0.0", + "from": "nan@>=2.1.0 <3.0.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.1.0.tgz" }, "natural-compare": { @@ -2928,9 +3562,9 @@ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.5.3.tgz" }, "node-gyp": { - "version": "3.2.0", + "version": "3.2.1", "from": "node-gyp@>=3.0.1 <4.0.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.2.0.tgz", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.2.1.tgz", "dependencies": { "glob": { "version": "4.5.3", @@ -2939,10 +3573,16 @@ "dependencies": { "minimatch": { "version": "2.0.10", - "from": "minimatch@>=2.0.1 <3.0.0" + "from": "minimatch@>=2.0.1 <3.0.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz" } } }, + "lru-cache": { + "version": "2.7.3", + "from": "lru-cache@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz" + }, "minimatch": { "version": "1.0.0", "from": "minimatch@>=1.0.0 <2.0.0", @@ -2962,9 +3602,14 @@ } } }, + "node-sass": { + "version": "3.4.2", + "from": "node-sass@>=3.4.2 <4.0.0", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-3.4.2.tgz" + }, "node-uuid": { "version": "1.4.7", - "from": "node-uuid@>=1.4.2 <2.0.0", + "from": "node-uuid@>=1.4.7 <2.0.0", "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.7.tgz" }, "nomnom": { @@ -3007,26 +3652,12 @@ "normalize-url": { "version": "1.4.0", "from": "normalize-url@>=1.3.1 <2.0.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.4.0.tgz", - "dependencies": { - "object-assign": { - "version": "4.0.1", - "from": "object-assign@>=4.0.1 <5.0.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.0.1.tgz" - } - } + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.4.0.tgz" }, "npmconf": { "version": "2.1.2", "from": "npmconf@>=2.1.2 <3.0.0", - "resolved": "https://registry.npmjs.org/npmconf/-/npmconf-2.1.2.tgz", - "dependencies": { - "semver": { - "version": "4.3.6", - "from": "semver@>=2.0.0 <3.0.0||>=3.0.0 <4.0.0||>=4.0.0 <5.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz" - } - } + "resolved": "https://registry.npmjs.org/npmconf/-/npmconf-2.1.2.tgz" }, "npmlog": { "version": "1.2.1", @@ -3054,9 +3685,9 @@ "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.0.tgz" }, "object-assign": { - "version": "3.0.0", - "from": "object-assign@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz" + "version": "4.0.1", + "from": "object-assign@>=4.0.1 <5.0.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.0.1.tgz" }, "object.omit": { "version": "2.0.0", @@ -3157,7 +3788,7 @@ }, "parse5": { "version": "1.5.1", - "from": "parse5@>=1.4.2 <2.0.0", + "from": "parse5@>=1.5.1 <2.0.0", "resolved": "https://registry.npmjs.org/parse5/-/parse5-1.5.1.tgz" }, "parseurl": { @@ -3190,11 +3821,6 @@ "from": "path-is-inside@>=1.0.1 <2.0.0", "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.1.tgz" }, - "path-parse": { - "version": "1.0.5", - "from": "path-parse@>=1.0.5 <2.0.0", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz" - }, "path-to-regexp": { "version": "0.1.7", "from": "path-to-regexp@0.1.7", @@ -3221,21 +3847,14 @@ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" }, "pinkie": { - "version": "1.0.0", - "from": "pinkie@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-1.0.0.tgz" + "version": "2.0.1", + "from": "pinkie@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.1.tgz" }, "pinkie-promise": { "version": "2.0.0", "from": "pinkie-promise@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.0.tgz", - "dependencies": { - "pinkie": { - "version": "2.0.1", - "from": "pinkie@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.1.tgz" - } - } + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.0.tgz" }, "pkginfo": { "version": "0.3.1", @@ -3294,6 +3913,11 @@ "from": "postcss-filter-plugins@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/postcss-filter-plugins/-/postcss-filter-plugins-2.0.0.tgz" }, + "postcss-loader": { + "version": "0.8.0", + "from": "postcss-loader@*", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-0.8.0.tgz" + }, "postcss-merge-idents": { "version": "2.1.3", "from": "postcss-merge-idents@>=2.1.3 <3.0.0", @@ -3305,9 +3929,9 @@ "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-2.0.1.tgz" }, "postcss-merge-rules": { - "version": "2.0.2", + "version": "2.0.3", "from": "postcss-merge-rules@>=2.0.1 <3.0.0", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-2.0.2.tgz" + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-2.0.3.tgz" }, "postcss-message-helpers": { "version": "2.0.0", @@ -3317,14 +3941,12 @@ "postcss-minify-font-values": { "version": "1.0.2", "from": "postcss-minify-font-values@>=1.0.2 <2.0.0", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-1.0.2.tgz", - "dependencies": { - "object-assign": { - "version": "4.0.1", - "from": "object-assign@>=4.0.1 <5.0.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.0.1.tgz" - } - } + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-1.0.2.tgz" + }, + "postcss-minify-gradients": { + "version": "1.0.1", + "from": "postcss-minify-gradients@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-1.0.1.tgz" }, "postcss-minify-params": { "version": "1.0.4", @@ -3364,14 +3986,7 @@ "postcss-normalize-url": { "version": "3.0.4", "from": "postcss-normalize-url@>=3.0.4 <4.0.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-3.0.4.tgz", - "dependencies": { - "object-assign": { - "version": "4.0.1", - "from": "object-assign@>=4.0.1 <5.0.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.0.1.tgz" - } - } + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-3.0.4.tgz" }, "postcss-ordered-values": { "version": "2.0.2", @@ -3439,9 +4054,9 @@ "resolved": "https://registry.npmjs.org/process/-/process-0.11.2.tgz" }, "process-nextick-args": { - "version": "1.0.5", + "version": "1.0.6", "from": "process-nextick-args@>=1.0.0 <1.1.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.5.tgz" + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.6.tgz" }, "promise": { "version": "7.0.4", @@ -3459,9 +4074,9 @@ "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz" }, "proxy-addr": { - "version": "1.0.9", + "version": "1.0.10", "from": "proxy-addr@>=1.0.8 <1.1.0", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.0.9.tgz" + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.0.10.tgz" }, "prr": { "version": "0.0.0", @@ -3474,9 +4089,9 @@ "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.1.tgz" }, "punycode": { - "version": "1.3.2", + "version": "1.4.0", "from": "punycode@>=1.2.4 <2.0.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz" + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.0.tgz" }, "q": { "version": "1.4.1", @@ -3484,9 +4099,9 @@ "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz" }, "qs": { - "version": "5.1.0", - "from": "qs@5.1.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-5.1.0.tgz" + "version": "5.2.0", + "from": "qs@>=5.2.0 <5.3.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-5.2.0.tgz" }, "query-string": { "version": "3.0.0", @@ -3509,23 +4124,9 @@ "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-0.0.3.tgz" }, "randomatic": { - "version": "1.1.3", - "from": "randomatic@>=1.1.0 <2.0.0", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.3.tgz", - "dependencies": { - "is-number": { - "version": "2.1.0", - "from": "is-number@>=2.0.2 <3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "dependencies": { - "kind-of": { - "version": "3.0.2", - "from": "kind-of@>=3.0.2 <4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.0.2.tgz" - } - } - } - } + "version": "1.1.5", + "from": "randomatic@>=1.1.3 <2.0.0", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.5.tgz" }, "range-parser": { "version": "1.0.3", @@ -3541,6 +4142,11 @@ "version": "2.2.0", "from": "bytes@2.2.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.2.0.tgz" + }, + "iconv-lite": { + "version": "0.4.13", + "from": "iconv-lite@0.4.13", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz" } } }, @@ -3584,7 +4190,13 @@ "react-proxy": { "version": "1.1.1", "from": "react-proxy@>=1.1.1 <2.0.0", - "resolved": "https://registry.npmjs.org/react-proxy/-/react-proxy-1.1.1.tgz" + "resolved": "https://registry.npmjs.org/react-proxy/-/react-proxy-1.1.1.tgz", + "dependencies": { + "lodash": { + "version": "3.10.1", + "from": "lodash@>=3.7.0 <4.0.0" + } + } }, "react-redux": { "version": "4.0.0", @@ -3592,9 +4204,9 @@ "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-4.0.0.tgz" }, "react-router": { - "version": "1.0.0", + "version": "1.0.2", "from": "react-router@>=1.0.0-rc3 <2.0.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-1.0.0.tgz" + "resolved": "https://registry.npmjs.org/react-router/-/react-router-1.0.2.tgz" }, "read": { "version": "1.0.7", @@ -3602,16 +4214,9 @@ "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz" }, "read-json-sync": { - "version": "1.1.0", + "version": "1.1.1", "from": "read-json-sync@>=1.1.0 <2.0.0", - "resolved": "https://registry.npmjs.org/read-json-sync/-/read-json-sync-1.1.0.tgz", - "dependencies": { - "graceful-fs": { - "version": "3.0.8", - "from": "graceful-fs@>=3.0.5 <4.0.0", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.8.tgz" - } - } + "resolved": "https://registry.npmjs.org/read-json-sync/-/read-json-sync-1.1.1.tgz" }, "read-pkg": { "version": "1.1.0", @@ -3625,7 +4230,7 @@ }, "readable-stream": { "version": "2.0.4", - "from": "readable-stream@>=2.0.1 <3.0.0", + "from": "readable-stream@>=2.0.2 <3.0.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.4.tgz" }, "readdirp": { @@ -3639,9 +4244,16 @@ "resolved": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz" }, "recast": { - "version": "0.10.33", - "from": "recast@0.10.33", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.10.33.tgz" + "version": "0.10.39", + "from": "recast@>=0.10.10 <0.11.0", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.10.39.tgz", + "dependencies": { + "esprima-fb": { + "version": "15001.1001.0-dev-harmony-fb", + "from": "esprima-fb@>=15001.1001.0-dev-harmony-fb <15001.1002.0", + "resolved": "https://registry.npmjs.org/esprima-fb/-/esprima-fb-15001.1001.0-dev-harmony-fb.tgz" + } + } }, "redent": { "version": "1.0.0", @@ -3667,8 +4279,7 @@ "dependencies": { "balanced-match": { "version": "0.1.0", - "from": "balanced-match@>=0.1.0 <0.2.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.1.0.tgz" + "from": "balanced-match@>=0.1.0 <0.2.0" } } }, @@ -3695,7 +4306,19 @@ "regenerator": { "version": "0.8.40", "from": "regenerator@0.8.40", - "resolved": "https://registry.npmjs.org/regenerator/-/regenerator-0.8.40.tgz" + "resolved": "https://registry.npmjs.org/regenerator/-/regenerator-0.8.40.tgz", + "dependencies": { + "esprima-fb": { + "version": "15001.1001.0-dev-harmony-fb", + "from": "esprima-fb@>=15001.1001.0-dev-harmony-fb <15001.1002.0", + "resolved": "https://registry.npmjs.org/esprima-fb/-/esprima-fb-15001.1001.0-dev-harmony-fb.tgz" + }, + "recast": { + "version": "0.10.33", + "from": "recast@0.10.33", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.10.33.tgz" + } + } }, "regex-cache": { "version": "0.4.2", @@ -3704,15 +4327,8 @@ }, "regexpu": { "version": "1.3.0", - "from": "regexpu@>=1.3.0 <2.0.0", - "resolved": "https://registry.npmjs.org/regexpu/-/regexpu-1.3.0.tgz", - "dependencies": { - "esprima": { - "version": "2.7.0", - "from": "esprima@>=2.6.0 <3.0.0", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.0.tgz" - } - } + "from": "regexpu@>=1.1.2 <2.0.0", + "resolved": "https://registry.npmjs.org/regexpu/-/regexpu-1.3.0.tgz" }, "regjsgen": { "version": "0.2.0", @@ -3736,18 +4352,18 @@ }, "repeating": { "version": "1.1.3", - "from": "repeating@>=1.1.2 <2.0.0", + "from": "repeating@>=1.1.3 <2.0.0", "resolved": "https://registry.npmjs.org/repeating/-/repeating-1.1.3.tgz" }, "request": { "version": "2.67.0", - "from": "request@>=2.55.0 <3.0.0", + "from": "request@>=2.65.0 <3.0.0", "resolved": "https://registry.npmjs.org/request/-/request-2.67.0.tgz", "dependencies": { - "qs": { - "version": "5.2.0", - "from": "qs@>=5.2.0 <5.3.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-5.2.0.tgz" + "node-uuid": { + "version": "1.4.7", + "from": "node-uuid@>=1.4.7 <1.5.0", + "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.7.tgz" } } }, @@ -3766,6 +4382,28 @@ "from": "resolve@>=1.1.6 <2.0.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.6.tgz" }, + "resolve-url": { + "version": "0.2.1", + "from": "resolve-url@>=0.2.1 <0.3.0", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz" + }, + "resolve-url-loader": { + "version": "1.4.3", + "from": "resolve-url-loader@latest", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-1.4.3.tgz", + "dependencies": { + "camelcase": { + "version": "1.2.1", + "from": "camelcase@>=1.2.1 <2.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz" + }, + "source-map": { + "version": "0.1.43", + "from": "source-map@>=0.1.43 <0.2.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz" + } + } + }, "restore-cursor": { "version": "1.0.1", "from": "restore-cursor@>=1.0.1 <2.0.0", @@ -3776,6 +4414,32 @@ "from": "revalidator@>=0.1.0 <0.2.0", "resolved": "https://registry.npmjs.org/revalidator/-/revalidator-0.1.8.tgz" }, + "rework": { + "version": "1.0.1", + "from": "rework@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/rework/-/rework-1.0.1.tgz", + "dependencies": { + "convert-source-map": { + "version": "0.3.5", + "from": "convert-source-map@>=0.3.3 <0.4.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-0.3.5.tgz" + }, + "css": { + "version": "2.2.1", + "from": "css@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/css/-/css-2.2.1.tgz" + }, + "source-map": { + "version": "0.1.43", + "from": "source-map@>=0.1.38 <0.2.0" + } + } + }, + "rework-visit": { + "version": "1.0.0", + "from": "rework-visit@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/rework-visit/-/rework-visit-1.0.0.tgz" + }, "right-align": { "version": "0.1.3", "from": "right-align@>=0.1.1 <0.2.0", @@ -3783,7 +4447,7 @@ }, "rimraf": { "version": "2.4.4", - "from": "rimraf@>=2.2.8 <3.0.0", + "from": "rimraf@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.4.tgz" }, "ripemd160": { @@ -3804,7 +4468,29 @@ "sass-graph": { "version": "2.0.1", "from": "sass-graph@>=2.0.1 <3.0.0", - "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.0.1.tgz" + "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.0.1.tgz", + "dependencies": { + "lodash": { + "version": "3.10.1", + "from": "lodash@>=3.8.0 <4.0.0" + } + } + }, + "sass-loader": { + "version": "3.1.2", + "from": "sass-loader@>=3.1.1 <4.0.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-3.1.2.tgz", + "dependencies": { + "loader-utils": { + "version": "0.2.12", + "from": "loader-utils@>=0.2.5 <0.3.0" + } + } + }, + "sass-resources-loader": { + "version": "0.0.2", + "from": "sass-resources-loader@latest", + "resolved": "https://registry.npmjs.org/sass-resources-loader/-/sass-resources-loader-0.0.2.tgz" }, "sax": { "version": "1.1.4", @@ -3812,9 +4498,26 @@ "resolved": "https://registry.npmjs.org/sax/-/sax-1.1.4.tgz" }, "semver": { - "version": "5.1.0", - "from": "semver@>=2.0.0 <3.0.0||>=3.0.0 <4.0.0||>=4.0.0 <5.0.0||>=5.0.0 <6.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.1.0.tgz" + "version": "4.3.6", + "from": "semver@>=4.0.3 <5.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz" + }, + "semver-regex": { + "version": "1.0.0", + "from": "semver-regex@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-1.0.0.tgz" + }, + "semver-truncate": { + "version": "1.1.0", + "from": "semver-truncate@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/semver-truncate/-/semver-truncate-1.1.0.tgz", + "dependencies": { + "semver": { + "version": "5.1.0", + "from": "semver@>=5.0.3 <6.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.1.0.tgz" + } + } }, "send": { "version": "0.13.0", @@ -3825,6 +4528,11 @@ "version": "1.0.1", "from": "depd@>=1.0.1 <1.1.0", "resolved": "https://registry.npmjs.org/depd/-/depd-1.0.1.tgz" + }, + "mime": { + "version": "1.3.4", + "from": "mime@1.3.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz" } } }, @@ -3878,11 +4586,6 @@ "from": "slash@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz" }, - "sleep": { - "version": "3.0.0", - "from": "sleep@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/sleep/-/sleep-3.0.0.tgz" - }, "sntp": { "version": "1.0.9", "from": "sntp@>=1.0.0 <2.0.0", @@ -3912,7 +4615,7 @@ }, "source-list-map": { "version": "0.1.5", - "from": "source-list-map@>=0.1.0 <0.2.0", + "from": "source-list-map@>=0.1.4 <0.2.0", "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-0.1.5.tgz" }, "source-map": { @@ -3920,6 +4623,11 @@ "from": "source-map@>=0.5.0 <0.6.0", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.3.tgz" }, + "source-map-resolve": { + "version": "0.3.1", + "from": "source-map-resolve@>=0.3.0 <0.4.0", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.3.1.tgz" + }, "source-map-support": { "version": "0.2.10", "from": "source-map-support@>=0.2.10 <0.3.0", @@ -3932,6 +4640,11 @@ } } }, + "source-map-url": { + "version": "0.3.0", + "from": "source-map-url@>=0.3.0 <0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.3.0.tgz" + }, "spawn-sync": { "version": "1.0.13", "from": "spawn-sync@1.0.13", @@ -3996,8 +4709,7 @@ "dependencies": { "readable-stream": { "version": "1.1.13", - "from": "readable-stream@>=1.0.27-1 <2.0.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.13.tgz" + "from": "readable-stream@>=1.0.27-1 <2.0.0" } } }, @@ -4016,6 +4728,11 @@ "from": "string_decoder@>=0.10.0 <0.11.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" }, + "string-width": { + "version": "1.0.1", + "from": "string-width@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.1.tgz" + }, "stringmap": { "version": "0.2.2", "from": "stringmap@>=0.2.2 <0.3.0", @@ -4051,6 +4768,17 @@ "from": "strip-json-comments@>=1.0.1 <1.1.0", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz" }, + "style-loader": { + "version": "0.13.0", + "from": "style-loader@>=0.13.0 <0.14.0", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.13.0.tgz", + "dependencies": { + "loader-utils": { + "version": "0.2.12", + "from": "loader-utils@>=0.2.7 <0.3.0" + } + } + }, "success-symbol": { "version": "0.1.0", "from": "success-symbol@>=0.1.0 <0.2.0", @@ -4088,13 +4816,13 @@ }, "through": { "version": "2.3.8", - "from": "through@>=2.3.8 <2.4.0", + "from": "through@>=2.3.4 <2.4.0", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz" }, "timers-browserify": { - "version": "1.4.1", + "version": "1.4.2", "from": "timers-browserify@>=1.0.1 <2.0.0", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.1.tgz" + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz" }, "to-double-quotes": { "version": "2.0.0", @@ -4103,7 +4831,7 @@ }, "to-fast-properties": { "version": "1.0.1", - "from": "to-fast-properties@>=1.0.0 <2.0.0", + "from": "to-fast-properties@>=1.0.1 <2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.1.tgz" }, "to-single-quotes": { @@ -4113,7 +4841,7 @@ }, "tough-cookie": { "version": "2.2.1", - "from": "tough-cookie@>=2.2.0 <3.0.0", + "from": "tough-cookie@>=2.2.0 <2.3.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.2.1.tgz" }, "tr46": { @@ -4143,8 +4871,7 @@ }, "source-map": { "version": "0.1.43", - "from": "source-map@>=0.1.7 <0.2.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz" + "from": "source-map@>=0.1.7 <0.2.0" }, "uglify-js": { "version": "2.2.5", @@ -4160,7 +4887,7 @@ }, "trim-right": { "version": "1.0.1", - "from": "trim-right@>=1.0.0 <2.0.0", + "from": "trim-right@>=1.0.1 <2.0.0", "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz" }, "try-resolve": { @@ -4184,9 +4911,9 @@ "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz" }, "tunnel-agent": { - "version": "0.4.1", + "version": "0.4.2", "from": "tunnel-agent@>=0.4.1 <0.5.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.1.tgz" + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.2.tgz" }, "tweetnacl": { "version": "0.13.2", @@ -4228,11 +4955,26 @@ "from": "async@>=0.2.6 <0.3.0", "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz" }, + "camelcase": { + "version": "1.2.1", + "from": "camelcase@>=1.0.2 <2.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz" + }, + "cliui": { + "version": "2.1.0", + "from": "cliui@>=2.1.0 <3.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz" + }, "window-size": { "version": "0.1.0", "from": "window-size@0.1.0", "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz" }, + "wordwrap": { + "version": "0.0.2", + "from": "wordwrap@0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz" + }, "yargs": { "version": "3.10.0", "from": "yargs@>=3.10.0 <3.11.0", @@ -4251,9 +4993,9 @@ "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.5.tgz" }, "uncontrollable": { - "version": "3.1.4", + "version": "3.2.0", "from": "uncontrollable@>=3.1.3 <4.0.0", - "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-3.1.4.tgz" + "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-3.2.0.tgz" }, "underscore": { "version": "1.6.0", @@ -4280,10 +5022,33 @@ "from": "unpipe@1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" }, + "urix": { + "version": "0.1.0", + "from": "urix@>=0.1.0 <0.2.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz" + }, "url": { "version": "0.10.3", "from": "url@>=0.10.1 <0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz" + "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", + "dependencies": { + "punycode": { + "version": "1.3.2", + "from": "punycode@1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz" + } + } + }, + "url-loader": { + "version": "0.5.7", + "from": "url-loader@>=0.5.6 <0.6.0", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-0.5.7.tgz", + "dependencies": { + "loader-utils": { + "version": "0.2.12", + "from": "loader-utils@>=0.2.0 <0.3.0" + } + } }, "url-parse": { "version": "1.0.5", @@ -4319,8 +5084,7 @@ "dependencies": { "async": { "version": "0.2.10", - "from": "async@>=0.2.9 <0.3.0", - "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz" + "from": "async@>=0.2.9 <0.3.0" } } }, @@ -4329,6 +5093,11 @@ "from": "utils-merge@1.0.0", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz" }, + "v8flags": { + "version": "2.0.10", + "from": "v8flags@>=2.0.10 <3.0.0", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.0.10.tgz" + }, "validate-npm-package-license": { "version": "3.0.1", "from": "validate-npm-package-license@>=3.0.1 <4.0.0", @@ -4403,14 +5172,13 @@ "from": "webpack@>=1.12.8 <2.0.0", "resolved": "https://registry.npmjs.org/webpack/-/webpack-1.12.9.tgz", "dependencies": { - "esprima": { - "version": "2.7.0", - "from": "esprima@>=2.5.0 <3.0.0" + "loader-utils": { + "version": "0.2.12", + "from": "loader-utils@>=0.2.11 <0.3.0" }, "supports-color": { "version": "3.1.2", - "from": "supports-color@>=3.1.0 <4.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz" + "from": "supports-color@>=3.1.0 <4.0.0" } } }, @@ -4429,7 +5197,14 @@ "webpack-dev-middleware": { "version": "1.4.0", "from": "webpack-dev-middleware@>=1.4.0 <2.0.0", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-1.4.0.tgz" + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-1.4.0.tgz", + "dependencies": { + "mime": { + "version": "1.3.4", + "from": "mime@>=1.3.4 <2.0.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz" + } + } }, "websocket-driver": { "version": "0.6.3", @@ -4463,7 +5238,7 @@ }, "window-size": { "version": "0.1.4", - "from": "window-size@>=0.1.2 <0.2.0", + "from": "window-size@>=0.1.4 <0.2.0", "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz" }, "winston": { @@ -4473,8 +5248,7 @@ "dependencies": { "async": { "version": "0.2.10", - "from": "async@>=0.2.0 <0.3.0", - "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz" + "from": "async@>=0.2.0 <0.3.0" }, "colors": { "version": "0.6.2", @@ -4486,12 +5260,24 @@ "with": { "version": "4.0.3", "from": "with@>=4.0.0 <4.1.0", - "resolved": "https://registry.npmjs.org/with/-/with-4.0.3.tgz" + "resolved": "https://registry.npmjs.org/with/-/with-4.0.3.tgz", + "dependencies": { + "acorn": { + "version": "1.2.2", + "from": "acorn@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-1.2.2.tgz" + } + } }, "wordwrap": { - "version": "0.0.2", - "from": "wordwrap@0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz" + "version": "0.0.3", + "from": "wordwrap@>=0.0.2 <0.1.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz" + }, + "wrap-ansi": { + "version": "1.0.0", + "from": "wrap-ansi@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-1.0.0.tgz" }, "wrappy": { "version": "1.0.1", @@ -4516,7 +5302,13 @@ "xmlbuilder": { "version": "3.1.0", "from": "xmlbuilder@>=3.1.0 <4.0.0", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-3.1.0.tgz" + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-3.1.0.tgz", + "dependencies": { + "lodash": { + "version": "3.10.1", + "from": "lodash@>=3.5.0 <4.0.0" + } + } }, "xtend": { "version": "4.0.1", @@ -4529,9 +5321,9 @@ "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.0.tgz" }, "yargs": { - "version": "3.27.0", - "from": "yargs@>=3.27.0 <3.28.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.27.0.tgz" + "version": "3.31.0", + "from": "yargs@>=3.8.0 <4.0.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.31.0.tgz" } } } diff --git a/client/package.json b/client/package.json index ad6a80a2..3b00cad0 100644 --- a/client/package.json +++ b/client/package.json @@ -24,26 +24,38 @@ }, "homepage": "https://github.com/shakacode/react-webpack-rails-tutorial", "scripts": { - "test": "mocha --compilers js:babel-core/register --require ./test/test_helper.js 'test/**/*.@(js|jsx)'", + "test": "NODE_PATH=./app mocha --compilers js:babel-core/register --require ./app/libs/testHelper.js --require ./app/libs/testNullCompiler.js 'app/**/*.spec.@(js|jsx)'", "test:debug": "npm run test -- --debug-brk", "start": "node server.js", - "build:client": "NODE_ENV=production webpack --config webpack.client.rails.config.js", - "build:server": "NODE_ENV=production webpack --config webpack.server.rails.config.js", - "build:dev:client": "webpack -w --config webpack.client.rails.config.js", - "build:dev:server": "webpack -w --config webpack.server.rails.config.js", + "build:client": "NODE_ENV=production webpack --config webpack.client.rails.build.config.js", + "build:server": "NODE_ENV=production webpack --config webpack.server.rails.build.config.js", + "build:dev:client": "babel-node server.rails.hot.js", + "build:dev:server": "webpack -w --config webpack.server.rails.build.config.js", + "build:test:client": "webpack -w --config webpack.client.rails.build.config.js", "lint": "npm run eslint && npm run jscs", "eslint": "eslint --ext .js,.jsx .", "jscs": "jscs --verbose ." }, "dependencies": { + "autoprefixer": "^6.1.2", "axios": "^0.7.0", - "babel-core": "^5.8.25", - "babel-loader": "^5.3.2", - "body-parser": "^1.14.1", + "babel": "^6.3.13", + "babel-cli": "^6.3.17", + "babel-core": "^6.3.17", + "babel-loader": "^6.2.0", + "babel-polyfill": "^6.3.14", + "babel-preset-es2015": "^6.3.13", + "babel-preset-react": "^6.3.13", + "babel-preset-stage-0": "^6.3.13", + "bootstrap-loader": "^1.0.0-rc", + "bootstrap-sass": "^3.3.5", + "css-loader": "^0.23.0", "es5-shim": "^4.3.1", "es6-promise": "^3.0.2", "expose-loader": "^0.7.1", - "history": "^1.12.5", + "extract-text-webpack-plugin": "^0.9.1", + "file-loader": "^0.8.4", + "history": "^1.13.1", "immutable": "^3.7.5", "imports-loader": "^0.6.5", "jquery": "^2.1.4", @@ -51,7 +63,9 @@ "loader-utils": "^0.2.11", "lodash": "^3.10.1", "marked": "^0.3.5", + "node-sass": "^3.4.2", "node-uuid": "^1.4.7", + "postcss-loader": "^0.8.0", "react": "^0.14.3", "react-bootstrap": "^0.28.1", "react-dom": "^0.14.3", @@ -60,33 +74,30 @@ "redux": "^3.0.4", "redux-promise": "^0.5.0", "redux-thunk": "^1.0.0", - "sleep": "^3.0.0", + "resolve-url-loader": "^1.4.3", + "sass-loader": "^3.1.1", + "sass-resources-loader": "0.0.2", + "style-loader": "^0.13.0", + "url-loader": "^0.5.6", "webpack": "^1.12.8" }, "devDependencies": { - "babel-eslint": "^4.1.6", - "babel-plugin-react-transform": "^1.1.1", - "bootstrap-sass": "^3.3.5", - "bootstrap-sass-loader": "^1.0.9", + "babel-eslint": "^5.0.0-beta6", + "babel-plugin-react-transform": "^2.0.0-beta1", + "body-parser": "^1.14.1", "chai": "^3.4.1", "chai-immutable": "^1.5.3", - "css-loader": "^0.23.0", - "eslint": "^1.10.1", - "eslint-config-airbnb": "1.0.2", + "eslint": "^1.10.3", + "eslint-config-airbnb": "^2.0.0", "eslint-plugin-react": "^3.11.3", - "esprima-fb": "^15001.1001.0-dev-harmony-fb", "express": "^4.13.3", - "file-loader": "^0.8.4", "jade": "^1.11.0", - "jscs": "^2.6.0", + "jscs": "^2.7.0", "jsdom": "^7.0.2", "mocha": "^2.3.4", - "node-sass": "^3.4.2", "react-addons-test-utils": "^0.14.3", "react-transform-hmr": "^1.0.1", - "sass-loader": "^3.1.1", - "style-loader": "^0.13.0", - "url-loader": "^0.5.6", + "sleep": "^3.0.0", "webpack-dev-server": "^1.12.1" } } diff --git a/client/server.js b/client/server.js index b619e47d..46784410 100644 --- a/client/server.js +++ b/client/server.js @@ -26,7 +26,7 @@ var server = new WebpackDevServer(webpack(config), { }); server.app.use(bodyParser.json(null)); -server.app.use(bodyParser.urlencoded({extended: true})); +server.app.use(bodyParser.urlencoded({ extended: true })); server.app.get('/comments.json', function(req, res) { sleep.sleep(1); diff --git a/client/server.rails.hot.js b/client/server.rails.hot.js new file mode 100644 index 00000000..4194effa --- /dev/null +++ b/client/server.rails.hot.js @@ -0,0 +1,35 @@ +/* eslint no-var: 0, no-console: 0 */ + +import webpack from 'webpack'; +import WebpackDevServer from 'webpack-dev-server'; + +import webpackConfig from './webpack.client.rails.hot.config'; + +const hotRailsPort = process.env.HOT_RAILS_PORT || 3500; + +const compiler = webpack(webpackConfig); + +const devServer = new WebpackDevServer(compiler, { + contentBase: 'http://lvh.me:' + hotRailsPort, + publicPath: webpackConfig.output.publicPath, + hot: true, + inline: true, + historyApiFallback: true, + quiet: false, + noInfo: false, + lazy: false, + stats: { + colors: true, + hash: false, + version: false, + chunks: false, + children: false, + }, +}); + +devServer.listen(3500, 'localhost', err => { + if (err) console.error(err); + console.log( + '=> 🔥 Webpack development server is running on port ' + hotRailsPort + ); +}); diff --git a/client/webpack.client.base.config.js b/client/webpack.client.base.config.js index d572563e..5c0ad1e9 100644 --- a/client/webpack.client.base.config.js +++ b/client/webpack.client.base.config.js @@ -2,6 +2,7 @@ const webpack = require('webpack'); const path = require('path'); +const autoprefixer = require('autoprefixer'); const devBuild = process.env.NODE_ENV !== 'production'; const nodeEnv = devBuild ? 'development' : 'production'; @@ -14,7 +15,7 @@ module.exports = { // See use of 'vendor' in the CommonsChunkPlugin inclusion below. vendor: [ - 'babel-core/polyfill', + 'babel-polyfill', 'jquery', 'react', 'react-dom', @@ -22,13 +23,13 @@ module.exports = { // This will contain the app entry points defined by webpack.hot.config and webpack.rails.config app: [ - './app/bundles/Comments/startup/clientGlobals', + './app/bundles/comments/startup/clientGlobals', ], }, resolve: { - extensions: ['', '.webpack.js', '.web.js', '.js', '.jsx', '.scss', '.css', 'config.js'], + extensions: ['', '.js', '.jsx'], alias: { - lib: path.join(process.cwd(), 'app', 'lib'), + libs: path.join(process.cwd(), 'app', 'libs'), }, }, plugins: [ @@ -54,12 +55,34 @@ module.exports = { ], module: { loaders: [ + { test: /\.(woff2?|svg)$/, loader: 'url?limit=10000' }, + { test: /\.(ttf|eot)$/, loader: 'file' }, + { test: /\.(jpe?g|png|gif|svg|ico)$/, loader: 'url?limit=10000' }, - // React is necessary for the client rendering: + // React is necessary for the client rendering { test: require.resolve('react'), loader: 'expose?React' }, { test: require.resolve('react-dom'), loader: 'expose?ReactDOM' }, + { test: require.resolve('jquery-ujs'), loader: 'imports?jQuery=jquery' }, { test: require.resolve('jquery'), loader: 'expose?jQuery' }, { test: require.resolve('jquery'), loader: 'expose?$' }, + + // Use one of these to serve jQuery for Bootstrap scripts: + + // Bootstrap 3 + { test: /bootstrap-sass\/assets\/javascripts\//, loader: 'imports?jQuery=jquery' }, + + // Bootstrap 4 + { test: /bootstrap\/dist\/js\/umd\//, loader: 'imports?jQuery=jquery' }, ], }, + + // Place here all postCSS plugins here, so postcss-loader will apply them + postcss: [autoprefixer], + + // Place here all SASS files with variables, mixins etc. + // And sass-resources-loader will load them in every CSS Module (SASS file) for you + // (so don't need to @import them explicitly) + // https://github.com/shakacode/sass-resources-loader + sassResources: ['./app/assets/styles/app-variables.scss'], + }; diff --git a/client/webpack.client.hot.config.js b/client/webpack.client.hot.config.js index 825aceff..78d4d507 100644 --- a/client/webpack.client.hot.config.js +++ b/client/webpack.client.hot.config.js @@ -2,21 +2,17 @@ // cd client && node server.js const webpack = require('webpack'); -const path = require('path'); + const config = require('./webpack.client.base.config'); -// We're using the bootstrap-sass loader. -// See: https://github.com/shakacode/bootstrap-sass-loader -config.entry.vendor.push('bootstrap-sass!./bootstrap-sass.config.js'); +const hotPort = process.env.HOT_PORT || 4000; + +config.entry.vendor.push('bootstrap-loader'); config.entry.app.push( // Webpack dev server - 'webpack-dev-server/client?http://localhost:4000', - 'webpack/hot/dev-server', - - // Test out Css & Sass - './assets/stylesheets/test-stylesheet.css', - './assets/stylesheets/test-sass-stylesheet.scss' + 'webpack-dev-server/client?http://localhost:' + hotPort, + 'webpack/hot/dev-server' ); config.output = { @@ -25,7 +21,10 @@ config.output = { filename: '[name]-bundle.js', path: __dirname, }; -config.plugins.unshift(new webpack.HotModuleReplacementPlugin()); +config.plugins.unshift( + new webpack.HotModuleReplacementPlugin(), + new webpack.NoErrorsPlugin() +); config.devtool = 'eval-source-map'; // All the styling loaders only apply to hot-reload, not rails @@ -35,33 +34,40 @@ config.module.loaders.push( loader: 'babel', exclude: /node_modules/, query: { - plugins: ['react-transform'], - extra: { - 'react-transform': { - transforms: [ - { - transform: 'react-transform-hmr', - imports: ['react'], - locals: ['module'], - }, - ], - }, - }, + plugins: [ + [ + 'react-transform', + { + transforms: [ + { + transform: 'react-transform-hmr', + imports: ['react'], + locals: ['module'], + }, + ], + }, + ], + ], }, }, - { test: /\.css$/, loader: 'style-loader!css-loader' }, { - test: /\.scss$/, - loader: 'style!css!sass?outputStyle=expanded&imagePath=/assets/images&includePaths[]=' + - path.resolve(__dirname, './assets/stylesheets'), + test: /\.css$/, + loaders: [ + 'style', + 'css?modules&importLoaders=1&localIdentName=[name]__[local]__[hash:base64:5]', + 'postcss', + ], }, - - // The url-loader uses DataUrls. The file-loader emits files. - { test: /\.woff$/, loader: 'url-loader?limit=10000&mimetype=application/font-woff' }, - { test: /\.woff2$/, loader: 'url-loader?limit=10000&mimetype=application/font-woff' }, - { test: /\.ttf$/, loader: 'file-loader' }, - { test: /\.eot$/, loader: 'file-loader' }, - { test: /\.svg$/, loader: 'file-loader' } + { + test: /\.scss$/, + loaders: [ + 'style', + 'css?modules&importLoaders=3&localIdentName=[name]__[local]__[hash:base64:5]', + 'postcss', + 'sass', + 'sass-resources', + ], + } ); module.exports = config; diff --git a/client/webpack.client.rails.config.js b/client/webpack.client.rails.build.config.js similarity index 53% rename from client/webpack.client.rails.config.js rename to client/webpack.client.rails.build.config.js index bd1ce725..5dfdc0b9 100644 --- a/client/webpack.client.rails.config.js +++ b/client/webpack.client.rails.build.config.js @@ -1,43 +1,62 @@ // Run like this: -// cd client && npm run build:dev +// cd client && npm run build:client // Note that Foreman (Procfile.dev) has also been configured to take care of this. -// NOTE: All style sheets handled by the asset pipeline in rails - const webpack = require('webpack'); +const ExtractTextPlugin = require('extract-text-webpack-plugin'); + const config = require('./webpack.client.base.config'); const devBuild = process.env.NODE_ENV !== 'production'; config.output = { filename: '[name]-bundle.js', - path: '../app/assets/javascripts/generated', + path: '../app/assets/webpack', }; // You can add entry points specific to rails here config.entry.vendor.unshift( 'es5-shim/es5-shim', - 'es5-shim/es5-sham' + 'es5-shim/es5-sham', + 'jquery-ujs', + 'bootstrap-loader/extractStyles' ); -// jquery-ujs MUST GO AFTER jquery, so must use 'push' -config.entry.app.push('jquery-ujs'); - // See webpack.common.config for adding modules common to both the webpack dev server and rails config.module.loaders.push( { test: /\.jsx?$/, loader: 'babel-loader', exclude: /node_modules/ }, + { + test: /\.css$/, + loader: ExtractTextPlugin.extract( + 'style', + 'css?minimize&modules&importLoaders=1&localIdentName=[name]__[local]__[hash:base64:5]' + + '!postcss' + ), + }, + { + test: /\.scss$/, + loader: ExtractTextPlugin.extract( + 'style', + 'css?minimize&modules&importLoaders=3&localIdentName=[name]__[local]__[hash:base64:5]' + + '!postcss' + + '!sass' + + '!sass-resources' + ), + }, { test: require.resolve('react'), loader: 'imports?shim=es5-shim/es5-shim&sham=es5-shim/es5-sham' } ); -module.exports = config; +config.plugins.push( + new ExtractTextPlugin('[name]-bundle.css', { allChunks: true }), + new webpack.optimize.DedupePlugin() +); if (devBuild) { console.log('Webpack dev build for Rails'); // eslint-disable-line no-console - module.exports.devtool = 'eval-source-map'; + config.devtool = 'eval-source-map'; } else { - config.plugins.push( - new webpack.optimize.DedupePlugin() - ); console.log('Webpack production build for Rails'); // eslint-disable-line no-console } + +module.exports = config; diff --git a/client/webpack.client.rails.hot.config.js b/client/webpack.client.rails.hot.config.js new file mode 100644 index 00000000..e42fb7b8 --- /dev/null +++ b/client/webpack.client.rails.hot.config.js @@ -0,0 +1,82 @@ +// Run with Rails server like this: +// rails s +// cd client && babel-node server.rails.hot.js +// Note that Foreman (Procfile.dev) has also been configured to take care of this. + +const path = require('path'); +const webpack = require('webpack'); + +const config = require('./webpack.client.base.config'); + +const hotRailsPort = process.env.HOT_RAILS_PORT || 3500; + +config.entry.app.push( + 'webpack-dev-server/client?http://localhost:' + hotRailsPort, + 'webpack/hot/only-dev-server' +); + +config.entry.vendor.push( + 'es5-shim/es5-shim', + 'es5-shim/es5-sham', + 'jquery-ujs', + 'bootstrap-loader' +); + +config.output = { + filename: '[name]-bundle.js', + path: path.join(__dirname, 'public'), + publicPath: `http://localhost:${hotRailsPort}/`, +}; + +config.module.loaders.push( + { + test: /\.jsx?$/, + loader: 'babel', + exclude: /node_modules/, + query: { + plugins: [ + [ + 'react-transform', + { + transforms: [ + { + transform: 'react-transform-hmr', + imports: ['react'], + locals: ['module'], + }, + ], + }, + ], + ], + }, + }, + { + test: /\.css$/, + loaders: [ + 'style', + 'css?modules&importLoaders=1&localIdentName=[name]__[local]__[hash:base64:5]', + 'postcss', + ], + }, + { + test: /\.scss$/, + loaders: [ + 'style', + 'css?modules&importLoaders=3&localIdentName=[name]__[local]__[hash:base64:5]', + 'postcss', + 'sass', + 'sass-resources', + ], + } +); + +config.plugins.push( + new webpack.HotModuleReplacementPlugin(), + new webpack.NoErrorsPlugin() +); + +config.devtool = 'eval-source-map'; + +console.log('Webpack dev build for Rails'); // eslint-disable-line no-console + +module.exports = config; diff --git a/client/webpack.server.rails.config.js b/client/webpack.server.rails.build.config.js similarity index 55% rename from client/webpack.server.rails.config.js rename to client/webpack.server.rails.build.config.js index e5a4458b..35364f76 100644 --- a/client/webpack.server.rails.config.js +++ b/client/webpack.server.rails.build.config.js @@ -10,15 +10,19 @@ module.exports = { // the project dir context: __dirname, - entry: ['./app/bundles/Comments/startup/serverGlobals', 'react-dom/server', 'react'], + entry: [ + 'react', + 'react-dom/server', + './app/bundles/comments/startup/serverGlobals', + ], output: { filename: 'server-bundle.js', - path: '../app/assets/javascripts/generated', + path: '../app/assets/webpack', }, resolve: { - extensions: ['', '.webpack.js', '.web.js', '.js', '.jsx', 'config.js'], + extensions: ['', '.js', '.jsx'], alias: { - lib: path.join(process.cwd(), 'app', 'lib'), + libs: path.join(process.cwd(), 'app', 'libs'), }, }, plugins: [ @@ -31,10 +35,27 @@ module.exports = { module: { loaders: [ { test: /\.jsx?$/, loader: 'babel-loader', exclude: /node_modules/ }, + { + test: /\.css$/, + loaders: [ + 'css/locals?modules&importLoaders=0&localIdentName=[name]__[local]__[hash:base64:5]', + ], + }, + { + test: /\.scss$/, + loaders: [ + 'css/locals?modules&importLoaders=2&localIdentName=[name]__[local]__[hash:base64:5]', + 'sass', + 'sass-resources', + ], + }, // React is necessary for the client rendering: { test: require.resolve('react'), loader: 'expose?React' }, { test: require.resolve('react-dom/server'), loader: 'expose?ReactDOMServer' }, ], }, + + sassResources: ['./app/assets/styles/app-variables.scss'], + }; diff --git a/config/initializers/assets.rb b/config/initializers/assets.rb index 5f3f7d21..af391c3c 100644 --- a/config/initializers/assets.rb +++ b/config/initializers/assets.rb @@ -3,12 +3,12 @@ # Version of your assets, change this if you want to expire all your assets. Rails.application.config.assets.version = "1.0" -# Add additional assets to the asset load path -# Rails.application.config.assets.paths << Emoji.images_path - -# Add client/assets/stylesheets to asset pipeline's search path. -Rails.application.config.assets.paths << Rails.root.join("client", "assets", "stylesheets") +# Add folder with webpack generated assets to assets.paths +Rails.application.config.assets.paths << Rails.root.join("app", "assets", "webpack") # Precompile additional assets. # application.js, application.css, and all non-JS/CSS in app/assets folder are already added. -Rails.application.config.assets.precompile += %w( generated/server-bundle.js ) +Rails.application.config.assets.precompile += %w( + application_*.* + server-bundle.js +) diff --git a/config/initializers/react_on_rails.rb b/config/initializers/react_on_rails.rb index 6e929b29..41d6c24e 100644 --- a/config/initializers/react_on_rails.rb +++ b/config/initializers/react_on_rails.rb @@ -4,7 +4,7 @@ # Server bundle is a single file for all server rendering of components. # If you wish to use render_js in your views without any file, set this to "" to avoid warnings. - config.server_bundle_js_file = "app/assets/javascripts/generated/server-bundle.js" # This is the default + config.server_bundle_js_file = "app/assets/webpack/server-bundle.js" # This is the default # Below options can be overriden by passing to the helper method. config.prerender = true # default is false diff --git a/docs/testing-deployment.md b/docs/testing-deployment.md new file mode 100644 index 00000000..59a16005 --- /dev/null +++ b/docs/testing-deployment.md @@ -0,0 +1,10 @@ +# Testing + +1. `rake` runs the test suite +2. To test production with precompiled assets: + +```sh +export SECRET_KEY_BASE=`rake secret` +alias test-prod='rake assets:clobber && RAILS_ENV=production bin/rake assets:precompile \ + && rails s -e production' +``` diff --git a/lib/tasks/assets.rake b/lib/tasks/assets.rake index 7df4f9b5..24ed3444 100644 --- a/lib/tasks/assets.rake +++ b/lib/tasks/assets.rake @@ -15,10 +15,16 @@ namespace :assets do task :webpack do sh "cd client && npm run build:client" sh "cd client && npm run build:server" + sh "mkdir -p public/assets" + + # Critical to manually copy non js/css assets to public/assets as we don't want to fingerprint them + sh "cp -rf app/assets/webpack/*.woff* app/assets/webpack/*.svg app/assets/webpack/*.ttf "\ + "app/assets/webpack/*.eot* public/assets" + + # TODO: We should be gzipping these end task :clobber do - rm_rf "#{Rails.application.config.root}/app/assets/javascripts/generated/client-bundle.js" - rm_rf "#{Rails.application.config.root}/app/assets/javascripts/generated/server-bundle.js" + rm_rf "#{Rails.application.config.root}/app/assets/webpack" end end diff --git a/lib/tasks/linters.rake b/lib/tasks/linters.rake index 8d3ff029..89bf9196 100644 --- a/lib/tasks/linters.rake +++ b/lib/tasks/linters.rake @@ -33,7 +33,7 @@ if %w(development test).include? Rails.env # end SCSSLint::RakeTask.new do |t| - t.files = ["app/assets/stylesheets/", "client/assets/stylesheets/"] + t.files = ["app/assets/stylesheets/", "client/"] end desc "eslint" diff --git a/package.json b/package.json index fdb06033..06d10dd5 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,13 @@ "postinstall": "cd client && npm install", "test": "rspec && npm run test:client && npm run lint", "test:client": "(cd client && npm run test --silent)", - "lint": "(cd client && npm run lint --silent)" + "lint": "(cd client && npm run lint --silent)", + "build:clean": "rm app/assets/webpack/*", + "build:client": "(cd client && npm run build:client --silent)", + "build:server": "(cd client && npm run build:server --silent)", + "build:dev:client": "(cd client && npm run build:dev:client --silent)", + "build:dev:server": "(cd client && npm run build:dev:server --silent)", + "build:test:client": "(cd client && npm run build:test:client --silent)" }, "repository": { "type": "git", diff --git a/scripts/lint b/scripts/lint index 969ab363..2b1cee45 100755 --- a/scripts/lint +++ b/scripts/lint @@ -9,6 +9,6 @@ ruby-lint app config spec echo Linting with eslint and jscs (cd client && npm run lint) -scss-lint client/assets/stylesheets/*.scss app/assets/stylesheets/*.scss +scss-lint client/**/*.scss app/assets/stylesheets/*.scss echo Done linting with Rubocop, ruby-lint, eslint, jsrc, and slim-lint diff --git a/spec/features/shared/examples.rb b/spec/features/shared/examples.rb index 73438a6b..e0abc411 100644 --- a/spec/features/shared/examples.rb +++ b/spec/features/shared/examples.rb @@ -8,8 +8,8 @@ include_context "Form Submitted", name: :name, text: :text scenario "comment is added" do - expect(page).to have_css(".comment", text: name) - expect(page).to have_css(".comment", text: text) + expect(page).to have_css(".js-comment-author", text: name) + expect(page).to have_css(".js-comment-text", text: text) end end diff --git a/spec/rails_helper.rb b/spec/rails_helper.rb index 8b9e6c4e..e5cb828d 100644 --- a/spec/rails_helper.rb +++ b/spec/rails_helper.rb @@ -37,6 +37,9 @@ config.before(:suite) do DatabaseCleaner.strategy = :transaction DatabaseCleaner.clean_with :truncation + + # Next line will ensure that assets are built if webpack -w is not running + EnsureAssetsCompiled.check_built_assets end config.around(:each) do |example| @@ -71,7 +74,7 @@ end end - Capybara.default_wait_time = 15 + Capybara.default_max_wait_time = 15 puts "Capybara using driver: #{Capybara.javascript_driver}" Capybara::Screenshot.prune_strategy = { keep: 10 } diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 76b33988..d2a1c9dc 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -16,6 +16,9 @@ # users commonly want. # # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration + +require "rspec/retry" + RSpec.configure do |config| # rspec-expectations config goes here. You can use an alternate # assertion/expectation library such as wrong or the stdlib/minitest @@ -29,6 +32,14 @@ # ...rather than: # # => "be bigger than 2" expectations.include_chain_clauses_in_custom_matcher_descriptions = true + + ### Fix Net::ReadTimeout error on first test + # Show retry status in spec process + config.verbose_retry = true + # Try twice (retry once) + config.default_retry_count = 2 + # Only retry when Selenium raises Net::ReadTimeout + config.exceptions_to_retry = [Net::ReadTimeout] end # rspec-mocks config goes here. You can use an alternate test double diff --git a/spec/support/ensure_assets_compiled.rb b/spec/support/ensure_assets_compiled.rb new file mode 100644 index 00000000..3398b058 --- /dev/null +++ b/spec/support/ensure_assets_compiled.rb @@ -0,0 +1,32 @@ +# TODO: Move to react_on_rails +class EnsureAssetsCompiled + def self.check_built_assets + return if @checked_built_assets + build_all_assets + end + + def self.running_webpack_watch?(type) + running = `pgrep -fl '\\-w \\-\\-config webpack\\.#{type}\\.rails\\.build\\.config\\.js'` + if running.present? + puts "Found process, so skipping rebuild => #{running.ai}" + return true + end + end + + def self.build_assets_for_type(type) + unless running_webpack_watch?(type) + build_output = `cd client && npm run build:#{type}` + if build_output =~ /error/i + fail "Error in building assets!\n#{build_output}" + else + puts "Webpack build completed." + end + end + end + + def self.build_all_assets + build_assets_for_type("client") + build_assets_for_type("server") + @checked_built_assets = true + end +end