diff --git a/.eslintignore b/.eslintignore index f8728b70e..837991e7f 100644 --- a/.eslintignore +++ b/.eslintignore @@ -6,6 +6,7 @@ node_package/lib/ node_package/tests/node_modules node_package/webpack.config.js **/node_modules/** +**/assets/webpack/** **/generated/** **/app/assets/javascripts/application.js **/coverage/** diff --git a/.gitignore b/.gitignore index 22f6214a2..a9a2ff05c 100644 --- a/.gitignore +++ b/.gitignore @@ -10,8 +10,9 @@ *.gem /vendor/ +/spec/examples.txt /spec/dummy/client/node_modules -/spec/dummy/app/assets/javascripts/generated/ +/spec/dummy/app/assets/webpack/ /spec/dummy/coverage/ /spec/react_on_rails/dummy-for-generators/ diff --git a/.jscsrc b/.jscsrc index 6b70ae311..be5be1190 100644 --- a/.jscsrc +++ b/.jscsrc @@ -7,6 +7,7 @@ "excludeFiles": [ "**/build/**", "**/node_modules/**", + "**/assets/webpack/**", "**/generated/**", "**/docs/**", "**/tmp/**", diff --git a/.rubocop.yml b/.rubocop.yml index 97697e0ff..c8a65eff1 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -2,9 +2,13 @@ # Check out: https://github.com/bbatsov/rubocop AllCops: + DisplayCopNames: true + TargetRubyVersion: 2.1 + Include: - '**/Rakefile' - '**/config.ru' + Exclude: - 'vendor/**/*' - 'spec/fixtures/**/*' diff --git a/CHANGELOG.md b/CHANGELOG.md index dfb9ecd23..216c31099 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,34 @@ All notable changes to this project will be documented in this file. Items under Contributors: please follow the recommendations outlined at [keepachangelog.com](http://keepachangelog.com/). Please use the existing headings and styling as a guide, and add a link for the version diff at the bottom of the file. Also, please update the `Unreleased` link to compare to the latest release version. ## [Unreleased] +## [4.0.0.beta.3] - 2016-03-14 +##### Added +- Added optional parameter for ReactOnRails.getStore(name, throwIfMissing = true) so that you can check if a store is defined easily. +- Added controller `module ReactOnRails::Controller`. Adds method `redux_store` to setup redux stores in the view. +- Added option `defer: true` for view helper `redux_store`. This allows the view helper to specify the props for store hydration, yet still render the props at the bottom of the view. +- Added view helper `redux_store_hydration_data` to render the props on the application's layout, near the bottom. This allows for the client hydration data to be parsed after the server rendering, which may result in a faster load time. +- Added helpers `env_stylesheet_link_tag` and `env_javascript_include_tag` to support hot reloading Rails. See the [README.md](./README.md) for more details and see the example application in `spec/dummy`. +- The checker for outdated bundles before running tests will default to including the directory with `server_bundle_js_file`. +- Better support for Turbolinks 5! +- Fixed generator check of uncommitted code for foreign languages. See [#303](https://github.com/shakacode/react_on_rails/pull/303) by [nmatyukov](https://github.com/nmatyukov). +- Added several parameters used for ensuring webpack assets are built for running tests: + - `config.generated_assets_dir`: Directory where your generated webpack assets go. You can have only **one** directory for this. + - `config.webpack_generated_files`: List of files that will get created in the `generated_assets_dir`. The test runner helper will ensure these generated files are newer than any of the files in the client directory. + +##### Changed + - Generator default for webpack generated assets is now `app/assets/webpack` as we use this for both JavaScript and CSS generated assets. + +##### Fixed +- The test runner "assets up to date checker" is greatly improved. +- Lots of doc updates! +- Improved the **spec/dummy** sample app so that it supports CSS modules, hot reloading, etc, and it can server as a template for a new ReactOnRails installation. + +##### Breaking Changes +- Deprecated calling `redux_store(store_name, props)`. The API has changed. Use `redux_store(store_name, props: props, defer: false)` A new option called `defer` allows the rendering of store hydration at the bottom of the your layout. Place `redux_store_hydration_data` on your layout. +- `config.server_bundle_js_file` has changed. The default value is now blank, meaning no server rendering. Addtionally, if you specify the file name, you should not include the path, as that should be specified in the `config.generated_assets_dir`. +- `config.generated_assets_dirs` has been renamed to `config.generated_assets_dir` (singular) and it only takes one directory. + + ## [3.0.6] - 2016-03-01 ##### Fixed - Improved errors when registered store is not found. See [#301](https://github.com/shakacode/react_on_rails/pull/301) by [justin808](https://github.com/justin808). @@ -192,7 +220,8 @@ Best done with Object destructing: ##### Fixed - Fix several generator related issues. -[Unreleased]: https://github.com/shakacode/react_on_rails/compare/3.0.6...master +[Unreleased]: https://github.com/shakacode/react_on_rails/compare/4.0.0.beta.3...master +[4.0.0.beta.3]: https://github.com/shakacode/react_on_rails/compare/3.0.6...4.0.0-beta.3 [3.0.6]: https://github.com/shakacode/react_on_rails/compare/3.0.5...3.0.6 [3.0.5]: https://github.com/shakacode/react_on_rails/compare/3.0.4...3.0.5 [3.0.4]: https://github.com/shakacode/react_on_rails/compare/3.0.3...3.0.4 diff --git a/Gemfile b/Gemfile index 361712648..a671db35a 100644 --- a/Gemfile +++ b/Gemfile @@ -8,24 +8,17 @@ gemspec # bundle install from a single Gemfile. Therefore, all gems that we will need for any dummy/example # app have to be manually added to this file. gem "bootstrap-sass" -gem "capybara" -gem "capybara-screenshot" -gem "chromedriver-helper" gem "coffee-rails", "~> 4.1.0" gem "jbuilder", "~> 2.0" gem "jquery-rails" -gem "launchy" -gem "poltergeist" gem "puma" gem "rails", "4.2.5" gem "rails_12factor" -gem "rspec-rails" gem "rubocop", require: false gem "ruby-lint", require: false gem "sass-rails", "~> 5.0" gem "scss_lint", require: false gem "sdoc", "~> 0.4.0", group: :doc -gem "selenium-webdriver" gem "spring" gem "sqlite3" gem "therubyracer" @@ -36,3 +29,13 @@ else end gem "uglifier", ">= 2.7.2" gem "web-console", "~> 2.0", group: :development + +# below are copied from spec/dummy/Gemfile +gem "rspec-rails" +gem "capybara" +gem "capybara-screenshot" +gem "capybara-webkit" +gem "chromedriver-helper" +gem "launchy" +gem "poltergeist" +gem "selenium-webdriver" diff --git a/README.md b/README.md index 6c85ccad5..2b7a2443d 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,11 @@ [![Build Status](https://travis-ci.org/shakacode/react_on_rails.svg?branch=master)](https://travis-ci.org/shakacode/react_on_rails) [![Dependency Status](https://gemnasium.com/shakacode/react_on_rails.svg)](https://gemnasium.com/shakacode/react_on_rails) [![Gem Version](https://badge.fury.io/rb/react_on_rails.svg)](https://badge.fury.io/rb/react_on_rails) [![npm version](https://badge.fury.io/js/react-on-rails.svg)](https://badge.fury.io/js/react-on-rails) [![Code Climate](https://codeclimate.com/github/shakacode/react_on_rails/badges/gpa.svg)](https://codeclimate.com/github/shakacode/react_on_rails) [![Coverage Status](https://coveralls.io/repos/shakacode/react_on_rails/badge.svg?branch=master&service=github)](https://coveralls.io/github/shakacode/react_on_rails?branch=master) # NEWS -* 2016-03-14: 4.0.0.beta.3 is released! Please try it out. There are a number of **BREAKING** changes and I'd like to get feedback before releasing. See [CHANGELOG.md](https://github.com/shakacode/react_on_rails/blob/new-api-shared-redux-stores/CHANGELOG.md) and [PR 311](https://github.com/shakacode/react_on_rails/pull/311/files). +* 4.0.0 Highlights + * Better support for Turbolinks 5. + * Controller rendering of shared redux stores and ability to render store data at bottom of HTML page. + * See [#311](https://github.com/shakacode/react_on_rails/pull/311/files). + * See [CHANGELOG.md](CHANGELOG.md) for full details. * 2016-02-28: We added a [Projects page](PROJECTS.md). Please edit the page your project or [email us](mailto:contact@shakacode.com) and we'll add you. We also love stars as it helps us attract new users and contributors. [jbhatab](https://github.com/jbhatab) is leading an effort to ease the onboarding process for newbies with simpler project generators. See [#245](https://github.com/shakacode/react_on_rails/issues/245). * 3.0.6 shipped on Tuesday, 2016-03-01. Please see the [Changelog](CHANGELOG.md) for details, and let us know if you see any issues! [Migration steps from 1.x](https://github.com/shakacode/react_on_rails/blob/master/CHANGELOG.md#migration-steps-v1-to-v2). [Migration steps from 2.x](https://github.com/shakacode/react_on_rails/blob/master/CHANGELOG.md#migration-steps-v2-to-v3). * [RubyGems](https://rubygems.org/gems/react_on_rails/) @@ -76,7 +80,8 @@ Please see [Getting Started](#getting-started) for how to set up your Rails proj - [Client-Side Rendering vs. Server-Side Rendering](#client-side-rendering-vs-server-side-rendering) - [Building the Bundles](#building-the-bundles) - [Globally Exposing Your React Components](#globally-exposing-your-react-components) - - [Rails View Helpers In-Depth](#rails-view-helpers-in-depth) + - [ReactOnRails View Helpers API](#reactonrails-view-helpers-api) + - [ReactOnRails JavaScript API](#reactonrails-javascript-api) - [Redux](#redux) - [React-Router](#react-router) - [Bootstrap Integration](#bootstrap-integration) @@ -172,7 +177,7 @@ cd client && npm i --saveDev react-on-rails That will install the latest version and update your package.json. ## How it Works -The generator installs your webpack files in the `client` folder. Foreman uses webpack to compile your code and output the bundled results to `app/assets/javascripts/generated`, which are then loaded by sprockets. These generated bundle files have been added to your `.gitignore` for your convenience. +The generator installs your webpack files in the `client` folder. Foreman uses webpack to compile your code and output the bundled results to `app/assets/webpack`, which are then loaded by sprockets. These generated bundle files have been added to your `.gitignore` for your convenience. Inside your Rails views, you can now use the `react_component` helper method provided by React on Rails. You can pass props directly to the react component helper. You can also initialize a Redux store with view helper `redux_store` so that the store can be shared amongst multiple React components. Your best bet is to scan the code inside of the [/spec/dummy](spec/dummy) sample app. @@ -222,12 +227,12 @@ Place your JavaScript code inside of the provided `client/app` folder. Use modul In general, you may want different initialization for your server rendered components. -### Rails View Helpers In-Depth -Once the bundled files have been generated in your `app/assets/javascripts/generated` folder and you have exposed your components globally, you will want to run your code in your Rails views using the included helper method. +## ReactOnRails View Helpers API +Once the bundled files have been generated in your `app/assets/webpack` folder and you have exposed your components globally, you will want to run your code in your Rails views using the included helper method. This is how you actually render the React components you exposed to `window` inside of `clientRegistration` (and `global` inside of `serverRegistration` if you are server rendering). -#### react_component +### react_component `react_component(component_name, options = {})` + **component_name:** Can be a React component, created using a ES6 class, or `React.createClass`, or a generator function that returns a React component. @@ -240,7 +245,10 @@ This is how you actually render the React components you exposed to `window` ins + **raise_on_prerender_error:** Default is false. True will throw an error on the server side rendering. Your controller will have to handle the error. + Any other options are passed to the content tag, including the id -#### redux_store +### redux_store +#### Controller Extension +Include the module ReactOnRails::Controller in your controller, probably in ApplicationController. This will provide the following controller method, which you can call in your controller actions: + `redux_store(store_name, props = {})` + **store_name:** A name for the store. You'll refer to this name in 2 places in your JavaScript: @@ -248,10 +256,23 @@ This is how you actually render the React components you exposed to `window` ins 2. In your component definition, you'll call `ReactOnRails.getStore('storeName')` to get the hydrated Redux store to attach to your components. + **props:** ReactOnRails takes care of setting up the hydration of your store with props from the view. -#### Generator Functions +For an example, see [spec/dummy/app/controllers/pages_controller.rb](spec/dummy/app/controllers/pages_controller.rb). + +#### View Helper +`redux_store_hydration_data` + +Place this view helper (no parameters) at the end of your shared layout. This tell ReactOnRails where to client render the redux store hydration data. Since we're going to be setting up the stores in the controllers, we need to know where on the view to put the client side rendering of this hydration data, which is a hidden div with a matching class that contains a data props. For an example, see [spec/dummy/app/views/layouts/application.html.erb](spec/dummy/app/views/layouts/application.html.erb). + +#### Redux Store Notes +Note, you don't need to separately initialize your redux store. However, it's recommended for the two following use cases: + +1. You want to have multiple components that access the same store. +2. You want to place the props to hydrate the client side stores at the very end of your HTML, so the browser can render all earlier HTML first. This is particularly useful if your props will be large. + +### Generator Functions Why would you create a function that returns a React compnent? For example, you may want the ability to use the passed-in props to initialize a redux store or setup react-router. Or you may want to return different components depending on what's in the props. ReactOnRails will automatically detect a registered generator function. -#### server_render_js +### server_render_js `server_render_js(js_expression, options = {})` + js_expression, like 2 + 3, and not a block of js code. If you have more than one line that needs to be executed, wrap it in an [IIFE](https://en.wikipedia.org/wiki/Immediately-invoked_function_expression). JS exceptions will be caught and console messages handled properly @@ -259,6 +280,91 @@ Why would you create a function that returns a React compnent? For example, you This is a helper method that takes any JavaScript expression and returns the output from evaluating it. If you have more than one line that needs to be executed, wrap it in an IIFE. JS exceptions will be caught and console messages handled properly. +## ReactOnRails JavaScript API +The best source of docs is the main [ReactOnRails.js](node_package/src/ReactOnRails.js) file. Here's a quick summary. No guarantees that this won't be outdated! + +```js + /** + * Main entry point to using the react-on-rails npm package. This is how Rails will be able to + * find you components for rendering. + * @param components (key is component name, value is component) + */ + register(components) + + /** + * Allows registration of store generators to be used by multiple react components on one Rails + * view. store generators are functions that take one arg, props, and return a store. Note that + * the setStore API is different in tha it's the actual store hydrated with props. + * @param stores (key is store name, value is the store generator) + */ + registerStore(stores) + + /** + * Allows retrieval of the store by name. This store will be hydrated by any Rails form props. + * Pass optional param throwIfMissing = false if you want to use this call to get back null if the + * store with name is not registered. + * @param name + * @param throwIfMissing Defaults to true. Set to false to have this call return undefined if + * there is no store with the given name. + * @returns Redux Store, possibly hydrated + */ + getStore(name, throwIfMissing = true ) + + /** + * Set options for ReactOnRails, typically before you call ReactOnRails.register + * Available Options: + * `traceTurbolinks: true|false Gives you debugging messages on Turbolinks events + */ + setOptions(options) +``` + +## Hot Reloading View Helpers +The `env_javascript_include_tag` and `env_stylesheet_link_tag` support the usage of a webpack dev server for providing the JS and CSS assets during development mode. See the [shakacode/react-webpack-rails-tutorial](https://github.com/shakacode/react-webpack-rails-tutorial/) for a working example. + +The key options are `static` and `hot` which specify what you want for static vs. hot. Both of these params are optional, and support either a single value, or an array. + +static vs. hot is picked based on whether ENV["REACT_ON_RAILS_ENV"] == "HOT" + +```erb + <%= env_stylesheet_link_tag(static: 'application_static', + hot: 'application_non_webpack', + media: 'all', + 'data-turbolinks-track' => true) %> + + + + <%= env_javascript_include_tag(hot: ['http://localhost:3500/vendor-bundle.js', + 'http://localhost:3500/app-bundle.js']) %> + + + <%= env_javascript_include_tag(static: 'application_static', + hot: 'application_non_webpack', + 'data-turbolinks-track' => true) %> +``` + +See application.html.erb for usage example and [application.html.erb](https://github.com/shakacode/react-webpack-rails-tutorial/blob/master/app%2Fviews%2Flayouts%2Fapplication.html.erb) + +**env_javascript_include_tag(args = {})** + +Helper to set CSS assets depending on if we want static or "hot", which means from the Webpack dev server. + +In this example, application_non_webpack is simply a CSS asset pipeline file which includes styles not placed in the webpack build. + +We don't need styles from the webpack build, as those will come via the JavaScript include tags. + +The key options are `static` and `hot` which specify what you want for static vs. hot. Both of +these params are optional, and support either a single value, or an array. + +```erb + <%= env_stylesheet_link_tag(static: 'application_static', + hot: 'application_non_webpack', + media: 'all', + 'data-turbolinks-track' => true) %> +``` + +**env_stylesheet_link_tag(args = {})** + + ## Generator The `react_on_rails:install` generator combined with the example pull requests of generator runs will get you up and running efficiently. There's a fair bit of setup with integrating Webpack with Rails. Defaults for options are such that the default is for the flag to be off. For example, the default for `-R` is that `redux` is off, and the default of `-b` is that `skip-bootstrap` is off. @@ -477,6 +583,11 @@ Note: If you have components from react-rails you want to use, then you will nee foreman start ``` +## Dependencies ++ Ruby 2.1 or greater ++ Rails 3.2 or greater ++ Node 5.5 or great + ## Contributing Bug reports and pull requests are welcome. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to our version of the [Contributor Covenant Code of Conduct](docs/code_of_conduct.md)). diff --git a/Rakefile b/Rakefile index 908a18cc5..9ec826951 100644 --- a/Rakefile +++ b/Rakefile @@ -5,3 +5,6 @@ Coveralls::RakeTask.new desc "Run all tests and linting" task default: ["run_rspec", "lint", "coveralls:push"] + +desc "All actions but no examples. Good for local developer run." +task all_but_examples: ["run_rspec:all_but_examples", "lint"] diff --git a/app/helpers/react_on_rails_helper.rb b/app/helpers/react_on_rails_helper.rb index 626b84ec1..66e95cde5 100644 --- a/app/helpers/react_on_rails_helper.rb +++ b/app/helpers/react_on_rails_helper.rb @@ -1,3 +1,4 @@ +# rubocop:disable Metrics/ModuleLength # NOTE: # For any heredoc JS: # 1. The white spacing in this file matters! @@ -5,6 +6,59 @@ require "react_on_rails/prerender_error" module ReactOnRailsHelper + # The env_javascript_include_tag and env_stylesheet_link_tag support the usage of a webpack + # dev server for providing the JS and CSS assets during development mode. See + # https://github.com/shakacode/react-webpack-rails-tutorial/ for a working example. + # + # The key options are `static` and `hot` which specify what you want for static vs. hot. Both of + # these params are optional, and support either a single value, or an array. + # + # static vs. hot is picked based on whether + # ENV["REACT_ON_RAILS_ENV"] == "HOT" + # + # <%= env_stylesheet_link_tag(static: 'application_static', + # hot: 'application_non_webpack', + # media: 'all', + # 'data-turbolinks-track' => "reload") %> + # + # + # + # <%= env_javascript_include_tag(hot: ['http://localhost:3500/vendor-bundle.js', + # 'http://localhost:3500/app-bundle.js']) %> + # + # + # <%= env_javascript_include_tag(static: 'application_static', + # hot: 'application_non_webpack', + # 'data-turbolinks-track' => "reload") %> + # + # NOTE: for Turbolinks 2.x, use 'data-turbolinks-track' => true + # See application.html.erb for usage example + # https://github.com/shakacode/react-webpack-rails-tutorial/blob/master/app%2Fviews%2Flayouts%2Fapplication.html.erb + def env_javascript_include_tag(args = {}) + send_tag_method(:javascript_include_tag, args) + end + + # Helper to set CSS assets depending on if we want static or "hot", which means from the + # Webpack dev server. + # + # In this example, application_non_webpack is simply a CSS asset pipeline file which includes + # styles not placed in the webpack build. + # + # We don't need styles from the webpack build, as those will come via the JavaScript include + # tags. + # + # The key options are `static` and `hot` which specify what you want for static vs. hot. Both of + # these params are optional, and support either a single value, or an array. + # + # <%= env_stylesheet_link_tag(static: 'application_static', + # hot: 'application_non_webpack', + # media: 'all', + # 'data-turbolinks-track' => true) %> + # + def env_stylesheet_link_tag(args = {}) + send_tag_method(:stylesheet_link_tag, args) + end + # react_component_name: can be a React component, created using a ES6 class, or # React.createClass, or a # `generator function` that returns a React component @@ -52,7 +106,6 @@ def react_component(component_name, options = {}, other_options = nil) # Setup the page_loaded_js, which is the same regardless of prerendering or not! # The reason is that React is smart about not doing extra work if the server rendering did its job. - turbolinks_loaded = Object.const_defined?(:Turbolinks) props = {} if props.nil? @@ -60,7 +113,6 @@ def react_component(component_name, options = {}, other_options = nil) component_name: react_component_name, props: props, trace: trace(options), - expect_turbolinks: turbolinks_loaded, dom_id: dom_id } @@ -89,8 +141,8 @@ def react_component(component_name, options = {}, other_options = nil) # IMPORTANT: Ensure that we mark string as html_safe to avoid escaping. <<-HTML.html_safe #{component_specification_tag} -#{rendered_output} -#{replay_console(options) ? console_script : ''} + #{rendered_output} + #{replay_console(options) ? console_script : ''} HTML end @@ -99,18 +151,34 @@ def react_component(component_name, options = {}, other_options = nil) # # store_name: name of the store, corresponding to your call to ReactOnRails.registerStores in your # JavaScript code. - # props: Ruby Hash or JSON string which contains the properties to pass to the redux storea. - def redux_store(store_name, props = {}) + # props: Ruby Hash or JSON string which contains the properties to pass to the redux store. + # Options + # defer: false -- pass as true if you wish to render this below your component. + def redux_store(store_name, props: {}, defer: false) redux_store_data = { store_name: store_name, props: props } - @registered_stores ||= [] - @registered_stores << redux_store_data + if defer + @registered_stores_defer_render ||= [] + @registered_stores_defer_render << redux_store_data + "YOU SHOULD NOT SEE THIS ON YOUR VIEW -- Uses as a code block, like <% redux_store %> "\ + "and not <%= redux store %>" + else + @registered_stores ||= [] + @registered_stores << redux_store_data + render_redux_store_data(redux_store_data) + end + end - content_tag(:div, - "", - class: "js-react-on-rails-store", - style: ReactOnRails.configuration.skip_display_none ? nil : "display:none", - data: redux_store_data) + # Place this view helper (no parameters) at the end of your shared layout. This tell + # ReactOnRails where to client render the redux store hydration data. Since we're going + # to be setting up the stores in the controllers, we need to know where on the view to put the + # client side rendering of this hydration data, which is a hidden div with a matching class + # that contains a data props. + def redux_store_hydration_data + return if @registered_stores_defer_render.blank? + @registered_stores_defer_render.reduce("") do |accum, redux_store_data| + accum << render_redux_store_data(redux_store_data) + end.html_safe end def sanitized_props_string(props) @@ -165,6 +233,14 @@ def server_render_js(js_expression, options = {}) private + def render_redux_store_data(redux_store_data) + content_tag(:div, + "", + class: "js-react-on-rails-store", + style: ReactOnRails.configuration.skip_display_none ? nil : "display:none", + data: redux_store_data) + end + def next_react_component_index @react_component_index ||= -1 @react_component_index += 1 @@ -206,12 +282,12 @@ def server_rendered_react_component_html(options, props, react_component_name, d if result["hasErrors"] && raise_on_prerender_error(options) # We caught this exception on our backtrace handler # rubocop:disable Style/RaiseArgs - fail ReactOnRails::PrerenderError.new(component_name: react_component_name, - # Sanitize as this might be browser logged - props: sanitized_props_string(props), - err: nil, - js_code: wrapper_js, - console_messages: result["consoleReplayScript"]) + raise ReactOnRails::PrerenderError.new(component_name: react_component_name, + # Sanitize as this might be browser logged + props: sanitized_props_string(props), + err: nil, + js_code: wrapper_js, + console_messages: result["consoleReplayScript"]) # rubocop:enable Style/RaiseArgs end result @@ -227,9 +303,12 @@ def server_rendered_react_component_html(options, props, react_component_name, d end def initialize_redux_stores - return "" unless @registered_stores.present? + return "" unless @registered_stores.present? || @registered_stores_defer_render.present? declarations = "var reduxProps, store, storeGenerator;\n" - result = @registered_stores.each_with_object(declarations) do |redux_store_data, memo| + + all_stores = (@registered_stores || []) + (@registered_stores_defer_render || []) + + result = all_stores.each_with_object(declarations) do |redux_store_data, memo| store_name = redux_store_data[:store_name] props = props_string(redux_store_data[:props]) memo << <<-JS @@ -290,4 +369,15 @@ def parse_options_props(component_name, options, other_options) end [final_options, props] end + + def use_hot_reloading? + ENV["REACT_ON_RAILS_ENV"] == "HOT" + end + + def send_tag_method(tag_method_name, args) + asset_type = use_hot_reloading? ? :hot : :static + assets = Array(args[asset_type]) + options = args.delete_if { |key, _value| %i(hot static).include?(key) } + send(tag_method_name, *assets, options) unless assets.empty? + end end diff --git a/docs/additional_reading/hot-reloading-rails-development.md b/docs/additional_reading/hot-reloading-rails-development.md new file mode 100644 index 000000000..a95177349 --- /dev/null +++ b/docs/additional_reading/hot-reloading-rails-development.md @@ -0,0 +1,32 @@ +# Hot Reloading of Assets For Rails Development + +This document outlines the steps to setup your React On Rails Environment so that you can experience the pleasure of hot reloading of JavaScript and Sass during your Rails development work. There are 2 examples of this setup: +1. [spec/dummy](../spec/dummy): Simpler setup used for integration testing this gem. +1. [shakacode/react-webpack-rails-tutorial](https://github.com/shakacode/react-webpack-rails-tutorial/). Full featured setup using Twitter bootstrap. + +## High Level Strategy + +We'll use a Webpack Dev server on port 3500 to provide the assets to Rails, rather than the asset pipeline, and only during development mode. This is configured via the `Procfile.hot`. + +`Procfile.static` provides an alternative that uses "static" assets, similar to a production deployment. + +The secret sauce is in the [app/views/layouts/application.html.erb](spec/dummy/app/views/layouts/application.html.erb) where it uses view helpes to configure the correct assets to load, being either the "hot" assets or the "static" assets. + +## Places to Configure (Files to Examine) + +1. See the Webpack config files. Note, these examples are now setup for using [CSS Modules](https://github.com/css-modules/css-modules). + 1. [client/webpack.client.base.config.js](spec/dummy/client/webpack.client.base.config.js): Common configuration for hot or static assets. + 1. [client/webpack.client.hot.config.js](spec/dummy/client/webpack.client.hot.config.js): Setup for hot loading, using react-transform-hmr. + 1. [client/webpack.client.static.config.js](spec/dummy/client/webpack.client.static.config.js): Setup for static loading, as is done in a production deployment. +1. [app/views/layouts/application.html.erb](spec/dummy/app/views/layouts/application.html.erb): Uses the view helpers `env_stylesheet_link_tag` and `env_javascript_include_tag` which will either do the hot reloading or the static loading. +1. See the Procfiles: [Procfile.hot](spec/dummy/Procfile.hot) and [Procfile.static](spec/dummy/Procfile.static). These: + 1. Start the webpack processes, depending on the mode or HOT or not. + 2. Start the rails server, setting an ENV value of REACT_ON_RAILS_ENV to HOT if we're hot loading or else setting this to blank. +1. Configure the file Rails asset pipeline files: + 1. [app/assets/javascripts/application_static.js.erb](spec/dummy/app/assets/javascripts/application_static.js.erb): We have to only specify the `vendor-bundle` and `app-bundle` if we're not HOT loading, as Sprockets will throw an error if that is the case. Note the use of `require_asset`. + 1. [app/assets/stylesheets/application_static.js.erb](spec/dummy/app/assets/stylesheets/application_static.scss.erb): We have to only specify the `vendor-bundle` and `app-bundle` if we're not HOT loading, as Sprockets will throw an error if that is the case. Note the conditional around the @import. +1. Be sure your [config/initializers/assets.rb](spec/dummy/config/initializers/assets.rb) is configured to include the webpack generated files. +1. Copy the [client/server-rails-hot.js](spec/dummy/client/server-rails-hot.js) to the [client](client) directory. +1. Copy the scripts in the top level and client level `package.json` files: + 1. Top Level: [package.json](spec/dummy/package.json) + 1. Client Level: [package.json](spec/dummy/client/package.json) diff --git a/docs/additional_reading/manual_installation.md b/docs/additional_reading/manual_installation.md index f18c084ad..bcf532b32 100644 --- a/docs/additional_reading/manual_installation.md +++ b/docs/additional_reading/manual_installation.md @@ -43,7 +43,7 @@ See the next section for a sample webpack.server.rails.config.js. ```javascript entry: ['./app/startup/serverRegistration'], ``` -3. Ensure the name of your ouput file (shown [here](https://github.com/shakacode/react-webpack-rails-tutorial/blob/537c985dc82faee333d80509343ca32a3965f9dd/client/webpack.server.rails.config.js#L9)) of your server bundle corresponds to the configuration of the gem. The default path is `app/assets/javascripts/generated`. See below for customization of configuration variables. +3. Ensure the name of your ouput file (shown [here](https://github.com/shakacode/react-webpack-rails-tutorial/blob/537c985dc82faee333d80509343ca32a3965f9dd/client/webpack.server.rails.config.js#L9)) of your server bundle corresponds to the configuration of the gem. The default path is `app/assets/webpack`. See below for customization of configuration variables. 4. Expose `React` in your webpack config, like [this](https://github.com/shakacode/react-webpack-rails-tutorial/blob/master/client/webpack.server.rails.build.config.js#L54-L55) ```javascript @@ -65,7 +65,7 @@ module.exports = { entry: ['./app/startup/serverRegistration'], output: { filename: 'server-bundle.js', - path: '../app/assets/javascripts/generated', + path: '../app/assets/webpack', // CRITICAL to set libraryTarget: 'this' for enabling Rails to find the exposed modules IF you // use the "expose" webpackfunctionality. See startup/serverRegistration.jsx. diff --git a/docs/additional_reading/optional_configuration.md b/docs/additional_reading/optional_configuration.md index 83a0464f8..e5824e560 100644 --- a/docs/additional_reading/optional_configuration.md +++ b/docs/additional_reading/optional_configuration.md @@ -10,7 +10,7 @@ ReactOnRails.configure do |config| # Client bundles are configured in application.js # Server bundle is a single file for all server rendering of components. # Set the server_bundle_js_file to "" if you know that you will not be server rendering. - config.server_bundle_js_file = "app/assets/javascripts/generated/server.js" # This is the default + config.server_bundle_js_file = "server-bundle.js" # This is the default # Below options can be overriden by passing to the helper method. config.prerender = false # default is false diff --git a/docs/additional_reading/rspec_configuration.md b/docs/additional_reading/rspec_configuration.md index 9d60bc81e..70018c776 100644 --- a/docs/additional_reading/rspec_configuration.md +++ b/docs/additional_reading/rspec_configuration.md @@ -13,10 +13,12 @@ You can pass an RSpec metatag as an optional second parameter to this helper met Please take note of the following: - This utility assumes your build tasks for the static generated files are `npm run build:client` and `npm run build:server` and do not have the `--watch` option enabled. -- By default, the webpack processes look for the `app/assets/javascripts/generated` and `app/assets/stylesheets/generated` folders. If these folders are missing, are empty, or contain files with `mtime`s older than any of the files in your `client` folder, the helper will recompile your assets. You can override this inside of `config/initializers/react_on_rails.rb` by passing an array of filepaths (relative to the root of the app) to the `generated_assets_dirs` configuration option. +- By default, the webpack processes look for the `app/assets/webpack` folders. If this folder is missing, is empty, or contains files with `mtime`s older than any of the files in your `client` folder, the helper will recompile your assets. You can override this inside of `config/initializers/react_on_rails.rb` by passing a filepath (relative to the root of the app) to the `generated_assets_dir` configuration option. If you want to speed up the re-compiling process, you can call `npm run build:dev:client` (and `npm run build:dev:server` if doing server rendering) to have webpack run in "watch" mode and recompile these files in the background, which will be much faster when making incremental changes than compiling from scratch. +[spec/dummy](../../spec/dummy) contains examples of how to set the proc files for this purpose. + If you want to use a testing framework other than RSpec, please submit let us know on the changes you need to do and we'll update the docs. ![2016-01-27_02-36-43](https://cloud.githubusercontent.com/assets/1118459/12611951/7c56d070-c4a4-11e5-8a80-9615f99960d9.png) diff --git a/docs/additional_reading/turbolinks.md b/docs/additional_reading/turbolinks.md index 2343c4c27..0b1212f66 100644 --- a/docs/additional_reading/turbolinks.md +++ b/docs/additional_reading/turbolinks.md @@ -13,14 +13,15 @@ the JavaScript and stylesheets are cached by the browser, as they will still req 1. Include the gem "turbolinks". 1. Included the proper "track" tags when you include the javascript and stylesheet: ```erb - <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track' => true %> - <%= javascript_include_tag 'application', 'data-turbolinks-track' => true %> + <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track' => 'reload' %> + <%= javascript_include_tag 'application', 'data-turbolinks-track' => 'reload' %> ``` + NOTE: for Turbolinks 2.x, use 'data-turbolinks-track' => true 1. Add turbolinks to your `application.js` file: ```javascript //= require turbolinks ``` -Note, in the future, we might change to installing this via npm. +Note, in the future, we will change to installing this via npm. ## Turbolinks 5 Turbolinks 5 is now being supported. React on Rails will automatically detect which version of Turbolinks you are using and use the correct event handlers. diff --git a/docs/contributing.md b/docs/contributing.md index 67ff3984c..77dcd55ef 100644 --- a/docs/contributing.md +++ b/docs/contributing.md @@ -16,7 +16,7 @@ It's critical to configure your IDE/editor to ignore certain directories. Otherw * /gen-examples * /node_package/lib * /node_modules -* /spec/dummy/app/assets/javascripts/generated +* /spec/dummy/app/assets/webpack * /spec/dummy/log * /spec/dummy/node_modules * /spec/dummy/tmp diff --git a/docs/tutorial-v2.md b/docs/tutorial-v2.md index 2d0282e47..1fbe3f252 100644 --- a/docs/tutorial-v2.md +++ b/docs/tutorial-v2.md @@ -127,7 +127,7 @@ Completed all linting It's super important to exclude certain directories from RubyMine or else it will slow to a crawl as it tries to parse all the npm files. -* `app/assets/javascripts/generated` +* `app/assets/webpack` * `client/node_modules` diff --git a/lib/generators/react_on_rails/base_generator.rb b/lib/generators/react_on_rails/base_generator.rb index ed7ed5f59..38643d1da 100644 --- a/lib/generators/react_on_rails/base_generator.rb +++ b/lib/generators/react_on_rails/base_generator.rb @@ -59,7 +59,7 @@ def update_git_ignore node_modules # Generated js bundles - /app/assets/javascripts/generated/* + /app/assets/webpack/* DATA if dest_file_exists?(".gitignore") @@ -74,11 +74,11 @@ def update_application_js // DO NOT REQUIRE jQuery or jQuery-ujs in this file! // DO NOT REQUIRE TREE! - // CRITICAL that generated/vendor-bundle must be BEFORE bootstrap-sprockets and turbolinks + // CRITICAL that 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 + //= require vendor-bundle + //= require app-bundle DATA @@ -161,22 +161,26 @@ def template_assets_rake_file template("base/base/lib/tasks/assets.rake.tt", "lib/tasks/assets.rake") end + ASSETS_RB_APPEND = <<-DATA.strip_heredoc +# Add client/assets/ folders to asset pipeline's search path. +# If you do not want to move existing images and fonts from your Rails app +# you could also consider creating symlinks there that point to the original +# rails directories. In that case, you would not add these paths here. +Rails.application.config.assets.paths << Rails.root.join("client", "assets", "stylesheets") +Rails.application.config.assets.paths << Rails.root.join("client", "assets", "images") +Rails.application.config.assets.paths << Rails.root.join("client", "assets", "fonts") +Rails.application.config.assets.precompile += %w( server-bundle.js ) + +# Add folder with webpack generated assets to assets.paths +Rails.application.config.assets.paths << Rails.root.join("app", "assets", "webpack") + DATA + def append_to_assets_initializer - data = <<-DATA.strip_heredoc - # Add client/assets/ folders to asset pipeline's search path. - # If you do not want to move existing images and fonts from your Rails app - # you could also consider creating symlinks there that point to the original - # rails directories. In that case, you would not add these paths here. - Rails.application.config.assets.paths << Rails.root.join("client", "assets", "stylesheets") - Rails.application.config.assets.paths << Rails.root.join("client", "assets", "images") - Rails.application.config.assets.paths << Rails.root.join("client", "assets", "fonts") - Rails.application.config.assets.precompile += %w( generated/server-bundle.js ) - DATA assets_intializer = File.join(destination_root, "config/initializers/assets.rb") if File.exist?(assets_intializer) - append_to_file(assets_intializer, data) + append_to_file(assets_intializer, ASSETS_RB_APPEND) else - create_file(assets_intializer, data) + create_file(assets_intializer, ASSETS_RB_APPEND) end end diff --git a/lib/generators/react_on_rails/bootstrap_generator.rb b/lib/generators/react_on_rails/bootstrap_generator.rb index 0c343b89f..9609e5d62 100644 --- a/lib/generators/react_on_rails/bootstrap_generator.rb +++ b/lib/generators/react_on_rails/bootstrap_generator.rb @@ -68,7 +68,7 @@ def add_bootstrap_sprockets_to_gemfile def add_bootstrap_sprockets_to_application_js data = <<-DATA.strip_heredoc - // bootstrap-sprockets depends on generated/vendor-bundle for jQuery. + // bootstrap-sprockets depends on vendor-bundle for jQuery. //= require bootstrap-sprockets DATA diff --git a/lib/generators/react_on_rails/templates/base/base/Procfile.dev-hot.tt b/lib/generators/react_on_rails/templates/base/base/Procfile.dev-hot.tt index cdabc6cc5..d0702a413 100644 --- a/lib/generators/react_on_rails/templates/base/base/Procfile.dev-hot.tt +++ b/lib/generators/react_on_rails/templates/base/base/Procfile.dev-hot.tt @@ -1,4 +1,4 @@ web: rails s # TODO: MIGRATE from tutorial -client: sh -c 'rm app/assets/javascripts/generated/* || true && cd client && npm run build:dev:client' +client: sh -c 'rm app/assets/webpack/* || true && cd client && npm run build:dev:client' <%- if options.server_rendering? %>server: sh -c 'cd client && npm run build:dev:server'<%- end %> diff --git a/lib/generators/react_on_rails/templates/base/base/Procfile.dev.tt b/lib/generators/react_on_rails/templates/base/base/Procfile.dev.tt index e6e942939..27e91f4af 100644 --- a/lib/generators/react_on_rails/templates/base/base/Procfile.dev.tt +++ b/lib/generators/react_on_rails/templates/base/base/Procfile.dev.tt @@ -1,3 +1,3 @@ web: rails s -client: sh -c 'rm app/assets/javascripts/generated/* || true && cd client && npm run build:dev:client' +client: sh -c 'rm app/assets/webpack/* || true && cd client && npm run build:dev:client' <%- if options.server_rendering? %>server: sh -c 'cd client && npm run build:dev:server'<%- end %> diff --git a/lib/generators/react_on_rails/templates/base/base/client/webpack.client.rails.config.js b/lib/generators/react_on_rails/templates/base/base/client/webpack.client.rails.config.js index 876727c52..5e0eb7798 100644 --- a/lib/generators/react_on_rails/templates/base/base/client/webpack.client.rails.config.js +++ b/lib/generators/react_on_rails/templates/base/base/client/webpack.client.rails.config.js @@ -10,7 +10,7 @@ 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 diff --git a/lib/generators/react_on_rails/templates/base/base/config/initializers/react_on_rails.rb.tt b/lib/generators/react_on_rails/templates/base/base/config/initializers/react_on_rails.rb.tt index 479aa053e..2966f1fbb 100644 --- a/lib/generators/react_on_rails/templates/base/base/config/initializers/react_on_rails.rb.tt +++ b/lib/generators/react_on_rails/templates/base/base/config/initializers/react_on_rails.rb.tt @@ -2,11 +2,21 @@ ReactOnRails.configure do |config| # Client bundles are configured in application.js + # Directory where your generated assets go + config.generated_assets_dir = File.join(%w(app assets webpack)) + + # Define the files for we need to check for webpack compilation when running tests + <%- if options.server_rendering? %> + config.webpack_generated_files = %w( client-bundle.js server-bundle.js ) + <% else %> + config.webpack_generated_files = %w( client-bundle.js ) + <%- end %> + # Server rendering: # Server bundle is a single file for all server rendering of components. # Set the server_bundle_js_file to "" if you know that you will not be server rendering. <%- if options.server_rendering? %> - config.server_bundle_js_file = "app/assets/javascripts/generated/server-bundle.js" + config.server_bundle_js_file = "server-bundle.js" <% else %> config.server_bundle_js_file = "" <%- end %> diff --git a/lib/generators/react_on_rails/templates/base/base/lib/tasks/assets.rake.tt b/lib/generators/react_on_rails/templates/base/base/lib/tasks/assets.rake.tt index c074d2b0d..596a20652 100644 --- a/lib/generators/react_on_rails/templates/base/base/lib/tasks/assets.rake.tt +++ b/lib/generators/react_on_rails/templates/base/base/lib/tasks/assets.rake.tt @@ -21,6 +21,6 @@ namespace :assets do end task :clobber do - rm_r Dir.glob(Rails.root.join("app/assets/javascripts/generated/*")) + rm_r Dir.glob(Rails.root.join("app/assets/webpack/*")) end end diff --git a/lib/generators/react_on_rails/templates/base/server_rendering/client/webpack.server.rails.config.js b/lib/generators/react_on_rails/templates/base/server_rendering/client/webpack.server.rails.config.js index 760b46a0b..d0e421245 100644 --- a/lib/generators/react_on_rails/templates/base/server_rendering/client/webpack.server.rails.config.js +++ b/lib/generators/react_on_rails/templates/base/server_rendering/client/webpack.server.rails.config.js @@ -16,7 +16,7 @@ module.exports = { ], output: { filename: 'server-bundle.js', - path: '../app/assets/javascripts/generated', + path: '../app/assets/webpack', }, resolve: { extensions: ['', '.js', '.jsx'], diff --git a/lib/generators/react_on_rails/templates/ruby_linters/.rubocop.yml b/lib/generators/react_on_rails/templates/ruby_linters/.rubocop.yml index ee3c1ccae..8be6efade 100644 --- a/lib/generators/react_on_rails/templates/ruby_linters/.rubocop.yml +++ b/lib/generators/react_on_rails/templates/ruby_linters/.rubocop.yml @@ -2,6 +2,7 @@ # Check out: https://github.com/bbatsov/rubocop AllCops: + DisplayCopNames: true Include: - '**/Rakefile' - '**/config.ru' diff --git a/lib/react_on_rails.rb b/lib/react_on_rails.rb index f4d04d968..22120f698 100644 --- a/lib/react_on_rails.rb +++ b/lib/react_on_rails.rb @@ -1,5 +1,6 @@ require "rails" +require "react_on_rails/controller" require "react_on_rails/version" require "react_on_rails/version_checker" require "react_on_rails/configuration" diff --git a/lib/react_on_rails/configuration.rb b/lib/react_on_rails/configuration.rb index fa79e35bb..97ff10644 100644 --- a/lib/react_on_rails/configuration.rb +++ b/lib/react_on_rails/configuration.rb @@ -1,17 +1,51 @@ module ReactOnRails def self.configure yield(configuration) + setup_config_values end - DEFAULT_GENERATED_ASSETS_DIRS = [ - %w(app assets javascripts generated), - %w(app assets javascripts stylesheets generated) - ].map { |dirs| File.join(*dirs) }.freeze + DEFAULT_GENERATED_ASSETS_DIR = File.join(%w(app assets webpack)).freeze + + def self.setup_config_values + if @configuration.webpack_generated_files.empty? + files = ["client-bundle.js"] + if @configuration.server_bundle_js_file.present? + files << @configuration.server_bundle_js_file + end + @configuration.webpack_generated_files = files + end + + if @configuration.generated_assets_dirs.present? + puts "[DEPRECATION] ReactOnRails: Use config.generated_assets_dir rather than "\ + "generated_assets_dirs" + if @configuration.generated_assets_dir.blank? + @configuration.generated_assets_dir = @configuration.generated_assets_dirs + else + puts "[DEPRECATION] ReactOnRails. You have both generated_assets_dirs and "\ + "generated_assets_dir defined. Define ONLY generated_assets_dir" + end + end + + if @configuration.generated_assets_dir.blank? + @configuration.generated_assets_dir = DEFAULT_GENERATED_ASSETS_DIR + puts "ReactOnRails: Set generated_assets_dir to default: #{DEFAULT_GENERATED_ASSETS_DIR}" + end + + if @configuration.server_bundle_js_file.include?(File::SEPARATOR) + puts "[DEPRECATION] ReactOnRails: remove path from server_bundle_js_file in configuration. "\ + "All generated files must go in #{@configuration.generated_assets_dir}" + @configuration.server_bundle_js_file = File.basename(@configuration.server_bundle_js_file) + end + end def self.configuration @configuration ||= Configuration.new( - generated_assets_dirs: DEFAULT_GENERATED_ASSETS_DIRS, - server_bundle_js_file: File.join(*%w(app assets javascripts generated server.js)), + generated_assets_dirs: nil, + + # generated_assets_dirs is deprecated + generated_assets_dir: "", + + server_bundle_js_file: "", prerender: false, replay_console: true, logging_on_server: true, @@ -20,7 +54,9 @@ def self.configuration development_mode: Rails.env.development?, server_renderer_pool_size: 1, server_renderer_timeout: 20, - skip_display_none: false) + skip_display_none: false, + webpack_generated_files: [] + ) end class Configuration @@ -28,18 +64,19 @@ class Configuration :trace, :development_mode, :logging_on_server, :server_renderer_pool_size, :server_renderer_timeout, :raise_on_prerender_error, - :skip_display_none, :generated_assets_dirs + :skip_display_none, :generated_assets_dirs, :generated_assets_dir, + :webpack_generated_files def initialize(server_bundle_js_file: nil, prerender: nil, replay_console: nil, trace: nil, development_mode: nil, logging_on_server: nil, server_renderer_pool_size: nil, server_renderer_timeout: nil, raise_on_prerender_error: nil, - skip_display_none: nil, generated_assets_dirs: DEFAULT_GENERATED_ASSETS_DIRS) - self.server_bundle_js_file = if File.exist?(server_bundle_js_file) - server_bundle_js_file - end - + skip_display_none: nil, generated_assets_dirs: nil, + generated_assets_dir: nil, webpack_generated_files: nil) + self.server_bundle_js_file = server_bundle_js_file self.generated_assets_dirs = generated_assets_dirs + self.generated_assets_dir = generated_assets_dir + self.prerender = prerender self.replay_console = replay_console self.logging_on_server = logging_on_server @@ -55,6 +92,8 @@ def initialize(server_bundle_js_file: nil, prerender: nil, replay_console: nil, # Server rendering: self.server_renderer_pool_size = self.development_mode ? 1 : server_renderer_pool_size self.server_renderer_timeout = server_renderer_timeout # seconds + + self.webpack_generated_files = webpack_generated_files end end end diff --git a/lib/react_on_rails/controller.rb b/lib/react_on_rails/controller.rb new file mode 100644 index 000000000..895d53262 --- /dev/null +++ b/lib/react_on_rails/controller.rb @@ -0,0 +1,19 @@ +module ReactOnRails + module Controller + # Separate initialization of store from react_component allows multiple react_component calls to + # use the same Redux store. + # + # store_name: name of the store, corresponding to your call to ReactOnRails.registerStores in your + # JavaScript code. + # props: Ruby Hash or JSON string which contains the properties to pass to the redux store. + # + # Be sure to include view helper `redux_store_hydration_data` at the end of your layout or view + # or else there will be no client side hydration of your stores. + def redux_store(store_name, props) + redux_store_data = { store_name: store_name, + props: props } + @registered_stores_defer_render ||= [] + @registered_stores_defer_render << redux_store_data + end + end +end diff --git a/lib/react_on_rails/server_rendering_pool.rb b/lib/react_on_rails/server_rendering_pool.rb index 9c8e77c66..7b8ac9a21 100644 --- a/lib/react_on_rails/server_rendering_pool.rb +++ b/lib/react_on_rails/server_rendering_pool.rb @@ -13,7 +13,7 @@ def self.reset_pool def self.reset_pool_if_server_bundle_was_modified return unless ReactOnRails.configuration.development_mode - file_mtime = File.mtime(ReactOnRails.configuration.server_bundle_js_file) + file_mtime = File.mtime(ReactOnRails::Utils.default_server_bundle_js_file_path) @server_bundle_timestamp ||= file_mtime return if @server_bundle_timestamp == file_mtime ReactOnRails::ServerRenderingPool.reset_pool @@ -70,7 +70,7 @@ def eval_js(js_code) end def create_js_context - server_js_file = ReactOnRails.configuration.server_bundle_js_file + server_js_file = ReactOnRails::Utils.default_server_bundle_js_file_path if server_js_file.present? && File.exist?(server_js_file) bundle_js_code = File.read(server_js_file) base_js_code = <<-JS diff --git a/lib/react_on_rails/test_helper.rb b/lib/react_on_rails/test_helper.rb index 57c67bb3a..d87356caa 100644 --- a/lib/react_on_rails/test_helper.rb +++ b/lib/react_on_rails/test_helper.rb @@ -13,9 +13,10 @@ module TestHelper # RSpec.configure do |config| # ReactOnRails::TestHelper.configure_rspec_to_compile_assets(config) # - # You can pass an RSpec metatag as an optional second parameter to this helper method - # if you want this helper to run on examples other than where `js: true` (default). The helper - # will compile webpack files at most once per test run. + # You can pass an RSpec metatag as an list of parameter to this helper method + # if you want this helper to run on examples other than where `js: true` or + # `server_rendering: true` (default). The helper will compile webpack files at most + # once per test run. # # If you do not want to be slowed down by re-compiling webpack assets from scratch every test # run, you can call `npm run build:client` (and `npm run build:server` if doing server @@ -24,8 +25,17 @@ module TestHelper # to be running. # # See docs/additional_reading/rspec_configuration.md for more info - def self.configure_rspec_to_compile_assets(config, metatag = :js) - config.before(:example, metatag) { ReactOnRails::TestHelper.ensure_assets_compiled } + # + # Params: + # config - config for rspec + # metatags - metatags to add the ensure_assets_compiled check. + # Default is :js, :server_rendering + def self.configure_rspec_to_compile_assets(config, *metatags) + metatags = [:js, :server_rendering] if metatags.empty? + + metatags.each do |metatag| + config.before(:example, metatag) { ReactOnRails::TestHelper.ensure_assets_compiled } + end end # Main entry point to ensuring assets are compiled. See `configure_rspec_to_compile_assets` for @@ -38,20 +48,35 @@ def self.configure_rspec_to_compile_assets(config, metatag = :js) # defaults to ReactOnRails::TestHelper::WebpackProcessChecker # webpack_assets_compiler: provide one method: `def compile` # defaults to ReactOnRails::TestHelper::WebpackAssetsCompiler - # client_dir and compiled_dirs are passed into the default webpack_assets_status_checker if you - # don't provide one. + # client_dir and generated_assets_dir are passed into the default webpack_assets_status_checker if you + # don't provide one. + # webpack_generated_files List of files to check for up-to-date-status, defaulting to + # webpack_generated_files in your configuration def self.ensure_assets_compiled(webpack_assets_status_checker: nil, webpack_assets_compiler: nil, webpack_process_checker: nil, client_dir: nil, - compiled_dirs: nil) + generated_assets_dir: nil, + webpack_generated_files: nil) if webpack_assets_status_checker.nil? client_dir ||= Rails.root.join("client") - compiled_dirs ||= ReactOnRails.configuration.generated_assets_dirs + generated_assets_dir ||= ReactOnRails.configuration.generated_assets_dir + webpack_generated_files ||= ReactOnRails.configuration.webpack_generated_files + webpack_assets_status_checker ||= WebpackAssetsStatusChecker.new(client_dir: client_dir, - compiled_dirs: compiled_dirs) + generated_assets_dir: generated_assets_dir, + webpack_generated_files: webpack_generated_files + ) + + unless @printed_once + puts + puts "====> React On Rails: Checking #{webpack_assets_status_checker.generated_assets_dir} for "\ + "outdated/missing bundles" + puts + @printed_once = true + end end webpack_assets_compiler ||= WebpackAssetsCompiler.new diff --git a/lib/react_on_rails/test_helper/ensure_assets_compiled.rb b/lib/react_on_rails/test_helper/ensure_assets_compiled.rb index 7242306ea..cc4dc5ea9 100644 --- a/lib/react_on_rails/test_helper/ensure_assets_compiled.rb +++ b/lib/react_on_rails/test_helper/ensure_assets_compiled.rb @@ -1,6 +1,8 @@ module ReactOnRails module TestHelper class EnsureAssetsCompiled + SECONDS_TO_WAIT = 10 + class << self attr_accessor :has_been_run @has_been_run = false @@ -20,54 +22,106 @@ def initialize(webpack_assets_status_checker: nil, @webpack_process_checker = webpack_process_checker end + # rubocop:disable Metrics/AbcSize + # rubocop:disable Metrics/CyclomaticComplexity + # rubocop:disable Metrics/PerceivedComplexity + + # Several Scenarios: + # 1. No webpack watch processes for static assets and files are mising or out of date. + # 2. Only webpack watch process for server bundle as we're the hot reloading setup. + # 3. For whatever reason, the watch processes are running, but some clean script removed + # the generated bundles. def call + # Only check this ONCE during a test run return if self.class.has_been_run - loop_count = 0 - loop do - break if webpack_assets_status_checker.up_to_date? + # Be sure we don't do this again. + self.class.has_been_run = true - puts_first_iteration_message(loop_count) + stale_gen_files = webpack_assets_status_checker.stale_generated_webpack_files - if webpack_process_checker.running? && loop_count < MAX_TIME_TO_WAIT - loop_count += 1 - sleep 1 - else - puts_max_iterations_message(loop_count) + # All done if no stale files! + return if stale_gen_files.empty? - webpack_assets_compiler.compile - puts - break - end - end + # Inform the developer that we're ensuring gen assets are ready. + puts_start_compile_check_message(stale_gen_files) - self.class.has_been_run = true - end + hot_running = webpack_process_checker.hot_running? + client_running = webpack_process_checker.client_running? + server_running = webpack_process_checker.server_running? + already_compiled_client_file = false + + # Check if running "hot" and not running a process to statically compile the client files. + if hot_running && !client_running + puts "Appears you're running hot reloading and are not rebuilding client files "\ + "automatically. We'll try rebuilding only your client files first." + webpack_assets_compiler.compile_client(stale_gen_files) + already_compiled_client_file = true - def puts_first_iteration_message(loop_count) - return unless loop_count == 0 + stale_gen_files = webpack_assets_status_checker.stale_generated_webpack_files - puts "\n\nReact on Rails is ensuring your JavaScript generated files are up to date!" + # Return if we're all done! + return if stale_gen_files.empty? + end + + loop_count = 0 + if (already_compiled_client_file && server_running) || + (!already_compiled_client_file && client_running) + puts "Waiting #{SECONDS_TO_WAIT} for webpack watch processes to compile files" + loop do + sleep 1 + stale_gen_files = webpack_assets_status_checker.stale_generated_webpack_files + loop_count += 1 + break if loop_count == SECONDS_TO_WAIT || stale_gen_files.empty? + end + end + + final_compilation_check(already_compiled_client_file, client_running, server_running, stale_gen_files) end - def puts_max_iterations_message(loop_count) - if loop_count == MAX_TIME_TO_WAIT - stale_files = webpack_assets_status_checker.whats_not_up_to_date.join("\n") + # rubocop:enable Metrics/AbcSize + # rubocop:enable Metrics/CyclomaticComplexity + # rubocop:enable Metrics/PerceivedComplexity + def final_compilation_check(already_compiled_client_file, client_running, server_running, stale_gen_files) + return unless stale_gen_files.present? + if client_running || server_running puts <<-MSG +Arghhhhhh! We still have the following stale generated files after waiting for Webpack to compile: +#{stale_gen_files.join("\n")} -Even though we detected the webpack watch processes are running, we found files modified that are -not causing a rebuild of your generated files: +This can happen if you removed the generated files after they've been created by your webpack +watch processes, such by running a clean on your generated bundles before starting your tests. + MSG + end -#{stale_files} + puts <<-MSG -One possibility is that you modified a file in your directory that is not a dependency of -your webpack files: #{webpack_assets_status_checker.client_dir} +If you are frequently running tests, you can run webpack in watch mode for static assets to +speed up this process. See the official documentation: +https://github.com/shakacode/react_on_rails/blob/master/docs/additional_reading/rspec_configuration.md + MSG -To be sure, we will now rebuild your generated files. - MSG + if already_compiled_client_file + # So only do serer file + webpack_assets_compiler.compile_server(stale_gen_files) + else + webpack_assets_compiler.compile_as_necessary(stale_gen_files) end end + + def puts_start_compile_check_message(stale_files) + server_msg = Utils.server_rendering_is_enabled? ? "and `build:server`" : "" + puts <<-MSG + +Detected are the following stale generated files: +#{stale_files.join("\n")} + +React on Rails will ensure your JavaScript generated files are up to date, using your +top level package.json `build:client` #{server_msg} commands. + + MSG + end end end end diff --git a/lib/react_on_rails/test_helper/webpack_assets_compiler.rb b/lib/react_on_rails/test_helper/webpack_assets_compiler.rb index 43347bde9..768e5e329 100644 --- a/lib/react_on_rails/test_helper/webpack_assets_compiler.rb +++ b/lib/react_on_rails/test_helper/webpack_assets_compiler.rb @@ -3,31 +3,39 @@ module ReactOnRails module TestHelper class WebpackAssetsCompiler - def compile - compile_type(:client) - compile_type(:server) if Utils.server_rendering_is_enabled? + def compile_as_necessary(stale_files) + compile_client(stale_files) + compile_server(stale_files) + end + + def compile_client(stale_files) + compile_type(:client) if needs_client_compile?(stale_files) + end + + def compile_server(stale_files) + compile_type(:server) if needs_server_compile?(stale_files) end private def compile_type(type) - unless @printed_msg - puts <<-MSG -If you are frequently running tests, you can run webpack in watch mode to speed up this process. -See the official documentation: -https://github.com/shakacode/react_on_rails/blob/master/docs/additional_reading/rspec_configuration.md - MSG - @printed_msg = true - end - puts "\nBuilding Webpack #{type}-rendering assets..." build_output = `cd client && npm run build:#{type}` - fail "Error in building assets!\n#{build_output}" unless Utils.last_process_completed_successfully? + raise "Error in building assets!\n#{build_output}" unless Utils.last_process_completed_successfully? puts "Completed building Webpack #{type}-rendering assets." end + + def needs_client_compile?(stale_files) + !stale_files.all? { |name| name.include?("server") } + end + + def needs_server_compile?(stale_files) + return false unless Utils.server_rendering_is_enabled? + stale_files.any? { |name| name.include?("server") } + end end end end diff --git a/lib/react_on_rails/test_helper/webpack_assets_status_checker.rb b/lib/react_on_rails/test_helper/webpack_assets_status_checker.rb index 43c829753..a23f1ae74 100644 --- a/lib/react_on_rails/test_helper/webpack_assets_status_checker.rb +++ b/lib/react_on_rails/test_helper/webpack_assets_status_checker.rb @@ -6,47 +6,54 @@ module ReactOnRails module TestHelper class WebpackAssetsStatusChecker - attr_reader :client_dir, :compiled_dirs + # client_dir is typically /client, where all client files go + attr_reader :client_dir, :generated_assets_dir - def initialize(args = {}) - @compiled_dirs = args.fetch(:compiled_dirs) - @client_dir = args.fetch(:client_dir) - @last_stale_files = "" + def initialize(generated_assets_dir:, client_dir:, webpack_generated_files:) + @generated_assets_dir = generated_assets_dir + @client_dir = client_dir + @webpack_generated_files = webpack_generated_files end - def up_to_date? - # binding.pry - return false unless assets_exist? - all_compiled_assets.all? do |asset| - FileUtils.uptodate?(asset, client_files) - end - end - - def whats_not_up_to_date - return [] unless assets_exist? - result = [] - all_compiled_assets.all? do |asset| - result += whats_not_up_to_date_worker(asset, client_files) + def stale_generated_webpack_files + most_recent_mtime = find_most_recent_mtime + all_compiled_assets.each_with_object([]) do |webpack_generated_file, stale_gen_list| + if !File.exist?(webpack_generated_file) || + File.mtime(webpack_generated_file) < most_recent_mtime + stale_gen_list << webpack_generated_file + end + stale_gen_list end - result.uniq end private - def whats_not_up_to_date_worker(new, old_list) - # derived from lib/ruby/2.2.0/fileutils.rb:147 - not_up_to_date = [] - new_time = File.mtime(new) - old_list.each do |old| - if File.exist?(old) - not_up_to_date << old unless new_time > File.mtime(old) - end + def find_most_recent_mtime + client_files.reduce(1.year.ago) do |newest_time, file| + mt = File.mtime(file) + mt > newest_time ? mt : newest_time end - not_up_to_date end def all_compiled_assets - make_file_list(make_globs(compiled_dirs)).to_ary + @all_compiled_assets ||= begin + webpack_generated_files = @webpack_generated_files.map do |file| + File.join(@generated_assets_dir, file) + end + if webpack_generated_files.present? + webpack_generated_files + else + file_list = make_file_list(make_globs(generated_assets_dir)).to_ary + puts "V" * 80 + puts "Please define config.webpack_generated_files (array) so the test helper knows "\ + "which files are required." + puts "Detected the possible following files to check for webpack compilation in "\ + "#{generated_assets_dir}" + puts file_list.join("\n") + puts "^" * 80 + file_list + end + end end def client_files @@ -58,12 +65,12 @@ def make_globs(dirs) end def assets_exist? - all_compiled_assets.to_ary.size > 0 + !all_compiled_assets.empty? end def make_file_list(glob) FileList.new(glob) do |fl| - fl.exclude(%r{/node_modules/}) + fl.exclude(%r{/node_modules}) fl.exclude(".DS_Store") fl.exclude(".keep") fl.exclude("thumbs.db") diff --git a/lib/react_on_rails/test_helper/webpack_process_checker.rb b/lib/react_on_rails/test_helper/webpack_process_checker.rb index 0facc8ece..b52bb5487 100644 --- a/lib/react_on_rails/test_helper/webpack_process_checker.rb +++ b/lib/react_on_rails/test_helper/webpack_process_checker.rb @@ -5,28 +5,32 @@ module TestHelper class WebpackProcessChecker def initialize @printed_once = {} + @needs_client_compile = true + @needs_server_compile = Utils.server_rendering_is_enabled? + @wait_longer = false end - def running? + # Return true if we should keep waiting + # type is either client or server + def client_running? client_running = check_running_for_type("client") - return client_running unless Utils.server_rendering_is_enabled? + return false unless client_running + end - server_running = check_running_for_type("server") - fail_if_only_running_for_one_type(client_running, server_running) + def server_running? + if Utils.server_rendering_is_enabled? + return true if check_running_for_type("server") + end + false + end - client_running && server_running + def hot_running? + _response = `pgrep -fl 'babel-node +server-rails-hot.js'` + Utils.last_process_completed_successfully? end private - # We only want to do this if server rendering is enabled. - def fail_if_only_running_for_one_type(client_running, server_running) - return unless client_running ^ server_running - fail "\n\nError: detected webpack is not running for both types of assets:\n"\ - "***Webpack Client Process Running?: #{client_running}\n"\ - "***Webpack Server Process Running?: #{server_running}" - end - def check_running_for_type(type) type = type.to_sym diff --git a/lib/react_on_rails/utils.rb b/lib/react_on_rails/utils.rb index 0cd38a497..81b37c480 100644 --- a/lib/react_on_rails/utils.rb +++ b/lib/react_on_rails/utils.rb @@ -13,5 +13,10 @@ def self.server_rendering_is_enabled? def self.last_process_completed_successfully? $CHILD_STATUS.exitstatus == 0 end + + def self.default_server_bundle_js_file_path + File.join(ReactOnRails.configuration.generated_assets_dir, + ReactOnRails.configuration.server_bundle_js_file) + end end end diff --git a/lib/react_on_rails/version.rb b/lib/react_on_rails/version.rb index 4efc8eb78..c87049c29 100644 --- a/lib/react_on_rails/version.rb +++ b/lib/react_on_rails/version.rb @@ -1,4 +1,4 @@ # frozen_string_literal: true module ReactOnRails - VERSION = "3.0.6".freeze + VERSION = "4.0.0.beta.3".freeze end diff --git a/node_package/scripts/symlink-node-package b/node_package/scripts/symlink-node-package index 0616e52ec..c8dff0591 100755 --- a/node_package/scripts/symlink-node-package +++ b/node_package/scripts/symlink-node-package @@ -19,6 +19,3 @@ if [ -d $examplesDir ] ; then (cd $d && npm link react-on-rails) done fi - -# Link the spec/dummy app to use react_on_rails node_package -(cd $root_path/spec/dummy/client && npm link react-on-rails) diff --git a/node_package/src/ReactOnRails.js b/node_package/src/ReactOnRails.js index 0e294caf3..7139b09f5 100644 --- a/node_package/src/ReactOnRails.js +++ b/node_package/src/ReactOnRails.js @@ -15,22 +15,6 @@ const DEFAULT_OPTIONS = { }; ctx.ReactOnRails = { - /** - * Set options for ReactOnRails, typically before you call ReactOnRails.register - * Available Options: - * `traceTurbolinks: true|false Gives you debugging messages on Turbolinks events - */ - setOptions(options) { - if (options.hasOwnProperty('traceTurbolinks')) { - this._options.traceTurbolinks = options.traceTurbolinks; - delete options.traceTurbolinks; - } - - if (Object.keys(options).length > 0) { - throw new Error('Invalid options passed to ReactOnRails.options: ', JSON.stringify(options)); - } - }, - /** * Main entry point to using the react-on-rails npm package. This is how Rails will be able to * find you components for rendering. @@ -51,13 +35,32 @@ ctx.ReactOnRails = { }, /** - * Allows retrieval of the store by name. This store will be hydrated by any - * Rails form props. + * Allows retrieval of the store by name. This store will be hydrated by any Rails form props. + * Pass optional param throwIfMissing = false if you want to use this call to get back null if the + * store with name is not registered. * @param name + * @param throwIfMissing Defaults to true. Set to false to have this call return undefined if + * there is no store with the given name. * @returns Redux Store, possibly hydrated */ - getStore(name) { - return StoreRegistry.getStore(name); + getStore(name, throwIfMissing = true) { + return StoreRegistry.getStore(name, throwIfMissing); + }, + + /** + * Set options for ReactOnRails, typically before you call ReactOnRails.register + * Available Options: + * `traceTurbolinks: true|false Gives you debugging messages on Turbolinks events + */ + setOptions(options) { + if (options.hasOwnProperty('traceTurbolinks')) { + this._options.traceTurbolinks = options.traceTurbolinks; + delete options.traceTurbolinks; + } + + if (Object.keys(options).length > 0) { + throw new Error('Invalid options passed to ReactOnRails.options: ', JSON.stringify(options)); + } }, //////////////////////////////////////////////////////////////////////////////// diff --git a/node_package/src/StoreRegistry.js b/node_package/src/StoreRegistry.js index 94af76743..7622296fc 100644 --- a/node_package/src/StoreRegistry.js +++ b/node_package/src/StoreRegistry.js @@ -24,16 +24,22 @@ export default { /** * Used by components to get the hydrated store which contains props. * @param name - * @returns store with given name + * @param throwIfMissing Defaults to true. Set to false to have this call return undefined if + * there is no store with the given name. + * @returns Redux Store, possibly hydrated */ - getStore(name) { + getStore(name, throwIfMissing = true) { if (_stores.has(name)) { return _stores.get(name); } else { - const storeKeys = Array.from(_stores.keys()).join(', '); - console.log('storeKeys', storeKeys); - throw new Error(`Could not find hydrated store with name '${name}'. \ -Hydrated store names include [${storeKeys}].`); + if (throwIfMissing) { + const storeKeys = Array.from(_stores.keys()).join(', '); + console.log('storeKeys', storeKeys); + throw new Error(`Could not find hydrated store with name '${name}'. ` + + `Hydrated store names include [${storeKeys}].`); + } else { + return; + } } }, @@ -47,8 +53,8 @@ Hydrated store names include [${storeKeys}].`); return _storeGenerators.get(name); } else { const storeKeys = Array.from(_storeGenerators.keys()).join(', '); - throw new Error(`Could not find store registered with name '${name}'. \ -Registered store names include [ ${storeKeys} ]. Maybe you forgot to register the store?`); + throw new Error(`Could not find store registered with name '${name}'. Registered store ` + + `names include [ ${storeKeys} ]. Maybe you forgot to register the store?`); } }, diff --git a/node_package/src/clientStartup.js b/node_package/src/clientStartup.js index 337882eed..c2e6ad8e3 100644 --- a/node_package/src/clientStartup.js +++ b/node_package/src/clientStartup.js @@ -57,11 +57,6 @@ function render(el) { const domNodeId = el.getAttribute('data-dom-id'); const props = JSON.parse(el.getAttribute('data-props')); const trace = JSON.parse(el.getAttribute('data-trace')); - const expectTurboLinks = JSON.parse(el.getAttribute('data-expect-turbo-links')); - - if (!turbolinksInstalled() && expectTurboLinks) { - console.warn('WARNING: NO TurboLinks detected in JS, but it is in your Gemfile'); - } try { const domNode = document.getElementById(domNodeId); diff --git a/node_package/tests/StoreRegistry.test.js b/node_package/tests/StoreRegistry.test.js index ed05f23a1..f8a17e1dc 100644 --- a/node_package/tests/StoreRegistry.test.js +++ b/node_package/tests/StoreRegistry.test.js @@ -1,4 +1,3 @@ - import test from 'tape'; import StoreRegistry from '../src/StoreRegistry'; import React from 'react'; @@ -37,6 +36,18 @@ test('StoreRegistry throws error for retrieving unregistered store', (assert) => ); }); +test('StoreRegistry returns undefined for retrieving unregistered store, ' + + 'passing throwIfMissing = false', + (assert) => { + assert.plan(1); + const actual = StoreRegistry.getStore('foobar', false); + const expected = undefined; + assert.equals(actual, expected, 'StoreRegistry.get should return undefined for missing ' + + 'store if throwIfMissing is passed as false' + ); + } +); + test('StoreRegistry getStore, setStore', (assert) => { assert.plan(1); const store = storeGenerator({}); diff --git a/package.json b/package.json index ecde8a933..d9c387918 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "react-on-rails", - "version": "3.0.6", + "version": "4.0.0-beta.3", "description": "react-on-rails JavaScript for react_on_rails Ruby gem", "main": "node_package/lib/ReactOnRails.js", "directories": { @@ -46,7 +46,6 @@ "scripts": { "test": "node_package/scripts/test", "clean": "node_package/scripts/clean", - "symlink-node-package": "node_package/scripts/symlink-node-package", "prepublish": "npm run build", "build": "node_package/scripts/build", "build-watch": "$(npm bin)/babel --watch --out-dir node_package/lib node_package/src", diff --git a/rakelib/node_package.rake b/rakelib/node_package.rake index 51eb7f4a9..e50d77449 100644 --- a/rakelib/node_package.rake +++ b/rakelib/node_package.rake @@ -5,14 +5,7 @@ namespace :node_package do task :build do sh "npm run build" end - - desc "Has all examples and dummy apps use local node_package folder for react-on-rails node dependency" - task :symlink do - sh_in_dir(gem_root, "npm run symlink-node-package") - end end desc "Prepares node_package by building and symlinking any example/dummy apps present" -task node_package: "node_package:build" do - Rake::Task["node_package:symlink"].invoke -end +task node_package: "node_package:build" diff --git a/rakelib/run_rspec.rake b/rakelib/run_rspec.rake index 0d981c9cb..1a82b4634 100644 --- a/rakelib/run_rspec.rake +++ b/rakelib/run_rspec.rake @@ -7,6 +7,8 @@ require_relative "example_type" include ReactOnRails::TaskHelpers namespace :run_rspec do + spec_dummy_dir = File.join("spec", "dummy") + desc "Run RSpec for top level only" task :gem do run_tests_in("", rspec_args: File.join("spec", "react_on_rails")) @@ -14,12 +16,14 @@ namespace :run_rspec do desc "Runs dummy rspec with turbolinks" task dummy: ["dummy_apps:dummy_app"] do - run_tests_in(File.join("spec", "dummy")) + clean_gen_assets(spec_dummy_dir) + run_tests_in(spec_dummy_dir) end desc "Runs dummy rspec without turbolinks" task dummy_no_turbolinks: ["dummy_apps:dummy_app"] do - run_tests_in(File.join("spec", "dummy"), + clean_gen_assets(spec_dummy_dir) + run_tests_in(spec_dummy_dir, env_vars: "DISABLE_TURBOLINKS=TRUE", command_name: "dummy_no_turbolinks") bundle_install_in(dummy_app_dir) @@ -27,7 +31,8 @@ namespace :run_rspec do desc "Runs dummy respec with turbolinks 5" task dummy_turbolinks_5: ["dummy_apps:dummy_app_with_turbolinks_5"] do - run_tests_in(File.join("spec", "dummy"), env_vars: + clean_gen_assets(spec_dummy_dir) + run_tests_in(spec_dummy_dir, env_vars: "ENABLE_TURBOLINKS_5=TRUE BUNDLE_GEMFILE=#{dummy_app_dir}/Gemfile") end @@ -51,8 +56,13 @@ namespace :run_rspec do Coveralls::RakeTask.new + desc "run all tests no examples" + task all_but_examples: [:gem, :dummy, :dummy_no_turbolinks, :dummy_turbolinks_5, :empty, :js_tests] do + puts "Completed all RSpec tests" + end + desc "run all tests" - task run_rspec: [:gem, :dummy, :dummy_no_turbolinks, :dummy_turbolinks_5, :examples, :empty, :js_tests] do + task run_rspec: [:all_but_examples, :examples] do puts "Completed all RSpec tests" end end @@ -66,12 +76,7 @@ desc "Runs all tests. Run `rake -D run_rspec` to see all available test options" task run_rspec: ["run_rspec:run_rspec"] private - -# Runs rspec in the given directory. -# If string is passed and it's not absolute, it's converted relative to root of the gem. -# TEST_ENV_COMMAND_NAME is used to make SimpleCov.command_name unique in order to -# prevent a name collision. Defaults to the given directory's name. -def run_tests_in(dir, options = {}) +def calc_path(dir) if dir.is_a?(String) path = if dir.start_with?(File::SEPARATOR) Pathname.new(dir) @@ -81,9 +86,23 @@ def run_tests_in(dir, options = {}) else path = dir end + path +end + +# Runs rspec in the given directory. +# If string is passed and it's not absolute, it's converted relative to root of the gem. +# TEST_ENV_COMMAND_NAME is used to make SimpleCov.command_name unique in order to +# prevent a name collision. Defaults to the given directory's name. +def run_tests_in(dir, options = {}) + path = calc_path(dir) command_name = options.fetch(:command_name, path.basename) rspec_args = options.fetch(:rspec_args, "") env_vars = %(#{options.fetch(:env_vars, '')} COVERAGE=true TEST_ENV_COMMAND_NAME="#{command_name}") sh_in_dir(path.realpath, "#{env_vars} bundle exec rspec #{rspec_args}") end + +def clean_gen_assets(dir) + path = calc_path(dir) + sh_in_dir(path.realpath, "npm run build:clean") +end diff --git a/spec/dummy/.gitignore b/spec/dummy/.gitignore index 9cb9c7d22..566dce6d9 100644 --- a/spec/dummy/.gitignore +++ b/spec/dummy/.gitignore @@ -17,3 +17,7 @@ /tmp /node_modules + +/app/assets/webpack + +/spec/examples.txt diff --git a/spec/dummy/Gemfile b/spec/dummy/Gemfile index cb01297b4..634731f2c 100644 --- a/spec/dummy/Gemfile +++ b/spec/dummy/Gemfile @@ -68,14 +68,14 @@ end gem 'bootstrap-sass' group :test do - gem "rspec-rails" gem "coveralls", require: false gem "capybara" gem "capybara-screenshot" - gem "selenium-webdriver" + gem "capybara-webkit" gem "chromedriver-helper" - gem "launchy" gem "generator_spec" + gem "launchy" gem "poltergeist" - gem "capybara-webkit" + gem "rspec-rails" + gem "selenium-webdriver" end diff --git a/spec/dummy/Gemfile.lock b/spec/dummy/Gemfile.lock index a6050c251..a66ffd973 100644 --- a/spec/dummy/Gemfile.lock +++ b/spec/dummy/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: ../.. specs: - react_on_rails (3.0.5) + react_on_rails (4.0.0.beta.1) connection_pool execjs (~> 2.5) foreman @@ -51,9 +51,8 @@ GEM io-like (~> 0.3.0) arel (6.0.3) ast (2.2.0) - autoprefixer-rails (6.3.1) + autoprefixer-rails (6.3.3.1) execjs - json awesome_print (1.6.1) binding_of_caller (0.7.2) debug_inspector (>= 0.0.1) @@ -61,7 +60,7 @@ GEM autoprefixer-rails (>= 5.2.1) sass (>= 3.3.4) builder (3.2.2) - byebug (8.2.1) + byebug (8.2.2) capybara (2.6.2) addressable mime-types (>= 1.16) @@ -81,7 +80,7 @@ GEM archive-zip (~> 0.7.0) nokogiri (~> 1.6) cliver (0.3.2) - coderay (1.1.0) + coderay (1.1.1) coffee-rails (4.1.1) coffee-script (>= 2.2.0) railties (>= 4.0.0, < 5.1.x) @@ -89,11 +88,10 @@ GEM coffee-script-source execjs coffee-script-source (1.10.0) - concurrent-ruby (1.0.0) + concurrent-ruby (1.0.1) connection_pool (2.2.0) - coveralls (0.8.10) + coveralls (0.8.13) json (~> 1.8) - rest-client (>= 1.6.8, < 2) simplecov (~> 0.11.0) term-ansicolor (~> 1.3) thor (~> 0.19.1) @@ -101,8 +99,6 @@ GEM debug_inspector (0.0.2) diff-lcs (1.2.5) docile (1.1.5) - domain_name (0.5.20160128) - unf (>= 0.0.5, < 1.0.0) erubis (2.7.0) execjs (2.6.0) ffi (1.9.10) @@ -113,12 +109,10 @@ GEM railties (>= 3.0.0) globalid (0.3.6) activesupport (>= 4.1.0) - http-cookie (1.0.2) - domain_name (~> 0.5) i18n (0.7.0) interception (0.5) io-like (0.3.0) - jbuilder (2.4.0) + jbuilder (2.4.1) activesupport (>= 3.0.0, < 5.1) multi_json (~> 1.2) jquery-rails (4.1.0) @@ -134,16 +128,15 @@ GEM mail (2.6.3) mime-types (>= 1.16, < 3) method_source (0.8.2) - mime-types (2.99) + mime-types (2.99.1) mini_portile2 (2.0.0) minitest (5.8.4) multi_json (1.11.2) - netrc (0.11.0) nokogiri (1.6.7.2) mini_portile2 (~> 2.0.0.rc2) - parser (2.3.0.2) + parser (2.3.0.6) ast (~> 2.2) - poltergeist (1.8.1) + poltergeist (1.9.0) capybara (~> 2.1) cliver (~> 0.3.1) multi_json (~> 1.0) @@ -196,14 +189,10 @@ GEM thor (>= 0.18.1, < 2.0) rainbow (2.1.0) rake (10.5.0) - rdoc (4.2.1) + rdoc (4.2.2) json (~> 1.4) ref (2.0.0) - rest-client (1.8.0) - http-cookie (>= 1.0.2, < 2.0) - mime-types (>= 1.16, < 3.0) - netrc (~> 0.7) - rspec-core (3.4.2) + rspec-core (3.4.3) rspec-support (~> 3.4.0) rspec-expectations (3.4.0) diff-lcs (>= 1.2.0, < 2.0) @@ -211,7 +200,7 @@ GEM rspec-mocks (3.4.1) diff-lcs (>= 1.2.0, < 2.0) rspec-support (~> 3.4.0) - rspec-rails (3.4.1) + rspec-rails (3.4.2) actionpack (>= 3.0, < 4.3) activesupport (>= 3.0, < 4.3) railties (>= 3.0, < 4.3) @@ -220,16 +209,17 @@ GEM rspec-mocks (~> 3.4.0) rspec-support (~> 3.4.0) rspec-support (3.4.1) - rubocop (0.36.0) - parser (>= 2.3.0.0, < 3.0) + rubocop (0.37.2) + parser (>= 2.3.0.4, < 3.0) powerpack (~> 0.1) rainbow (>= 1.99.1, < 3.0) ruby-progressbar (~> 1.7) + unicode-display_width (~> 0.3) ruby-lint (2.1.0) parser (~> 2.2) slop (~> 3.4, >= 3.4.7) ruby-progressbar (1.7.5) - rubyzip (1.1.7) + rubyzip (1.2.0) sass (3.4.21) sass-rails (5.0.4) railties (>= 4.0.0, < 5.0) @@ -237,28 +227,28 @@ GEM sprockets (>= 2.8, < 4.0) sprockets-rails (>= 2.0, < 4.0) tilt (>= 1.1, < 3) - scss_lint (0.44.0) - rake (~> 10.0) + scss_lint (0.47.1) + rake (>= 0.9, < 11) sass (~> 3.4.15) sdoc (0.4.1) json (~> 1.7, >= 1.7.7) rdoc (~> 4.0) - selenium-webdriver (2.50.0) + selenium-webdriver (2.52.0) childprocess (~> 0.5) multi_json (~> 1.0) rubyzip (~> 1.0) websocket (~> 1.0) - simplecov (0.11.1) + simplecov (0.11.2) docile (~> 1.1.0) json (~> 1.8) simplecov-html (~> 0.10.0) simplecov-html (0.10.0) slop (3.6.0) - spring (1.6.2) + spring (1.6.4) sprockets (3.5.2) concurrent-ruby (~> 1.0) rack (> 1, < 3) - sprockets-rails (3.0.1) + sprockets-rails (3.0.4) actionpack (>= 4.0) activesupport (>= 4.0) sprockets (>= 3.0.0) @@ -279,14 +269,11 @@ GEM uglifier (2.7.2) execjs (>= 0.3.0) json (>= 1.8.0) - unf (0.1.4) - unf_ext - unf_ext (0.0.7.1) - web-console (2.3.0) - activemodel (>= 4.0) - binding_of_caller (>= 0.7.2) - railties (>= 4.0) - sprockets-rails (>= 2.0, < 4.0) + unicode-display_width (0.3.1) + web-console (3.1.1) + activemodel (>= 4.2) + debug_inspector + railties (>= 4.2) websocket (1.2.2) websocket-driver (0.6.3) websocket-extensions (>= 0.1.0) diff --git a/spec/dummy/Procfile b/spec/dummy/Procfile index e4ccce6c0..8687b0001 100644 --- a/spec/dummy/Procfile +++ b/spec/dummy/Procfile @@ -1,3 +1 @@ -client: sh -c 'rm app/assets/javascripts/generated/* || true && cd client && npm run build:dev:client' -server: sh -c 'cd client && npm run build:dev:server' -web: bin/rails s +web: bundle exec puma -C config/puma.rb -b 0.0.0.0 diff --git a/spec/dummy/Procfile.dev.no.turbolinks b/spec/dummy/Procfile.dev.no.turbolinks index 8505f5b4b..0f9b219d9 100644 --- a/spec/dummy/Procfile.dev.no.turbolinks +++ b/spec/dummy/Procfile.dev.no.turbolinks @@ -1,3 +1,3 @@ -client: sh -c 'rm app/assets/javascripts/generated/* || true && cd client && npm run build:dev:client' +client: sh -c 'rm app/assets/webpack/* || true && cd client && npm run build:dev:client' server: sh -c 'cd client && npm run build:dev:server' -web: DISABLE_TURBOLINKS=TRUE bin/rails s +web: DISABLE_TURBOLINKS=TRUE bin/rails s -b 0.0.0.0 diff --git a/spec/dummy/Procfile.hot b/spec/dummy/Procfile.hot new file mode 100644 index 000000000..ce29397fe --- /dev/null +++ b/spec/dummy/Procfile.hot @@ -0,0 +1,13 @@ +# Basic procfile for dev work. +# Runs all processes. Development is faster if you pick one of the other Procfiles if you don't need +# some of the processes + +# Development rails requires both rails and rails-assets +# (and rails-server-assets if server rendering) +rails: REACT_ON_RAILS_ENV=HOT rails s -b 0.0.0.0 + +# Run the hot reload server for client development +hot-assets: sh -c 'rm app/assets/webpack/* || true && HOT_RAILS_PORT=3500 npm run hot-assets' + +# Keep the JS fresh for server rendering. Remove if not server rendering +rails-server-assets: sh -c 'npm run build:dev:server' diff --git a/spec/dummy/Procfile.spec b/spec/dummy/Procfile.spec index 2c2700a29..27a1bae7a 100644 --- a/spec/dummy/Procfile.spec +++ b/spec/dummy/Procfile.spec @@ -1,2 +1,9 @@ -client-static-assets: sh -c 'rm app/assets/javascripts/generated/* || true && cd client && npm run build:dev:client' -server-static-assets: sh -c 'cd client && npm run build:dev:server' +# For keeping webpack bundles up-to-date during a testing workflow. +# If you don't keep this process going, you will rebuild the assets per spec run. This is configured +# in rails_helper.rb. + +# Build client assets, watching for changes. +rails-client-assets: npm run build:dev:client + +# Build server assets, watching for changes. Remove if not server rendering. +rails-server-assets: npm run build:dev:server diff --git a/spec/dummy/Procfile.static b/spec/dummy/Procfile.static new file mode 100644 index 000000000..b48bcd1ba --- /dev/null +++ b/spec/dummy/Procfile.static @@ -0,0 +1,8 @@ +# Run Rails without hot reloading (static assets). +rails: REACT_ON_RAILS_ENV= rails s -b 0.0.0.0 + +# Build client assets, watching for changes. +rails-client-assets: sh -c 'npm run build:dev:client' + +# Build server assets, watching for changes. Remove if not server rendering. +rails-server-assets: sh -c 'npm run build:dev:server' diff --git a/spec/dummy/Procfile.static.no.turbolinks b/spec/dummy/Procfile.static.no.turbolinks new file mode 100644 index 000000000..a54d4649d --- /dev/null +++ b/spec/dummy/Procfile.static.no.turbolinks @@ -0,0 +1,8 @@ +# Run Rails without hot reloading (static assets). +rails: DISABLE_TURBOLINKS=TRUE REACT_ON_RAILS_ENV= rails s -b 0.0.0.0 + +# Build client assets, watching for changes. +rails-client-assets: sh -c 'npm run build:dev:client' + +# Build server assets, watching for changes. Remove if not server rendering. +rails-server-assets: sh -c 'npm run build:dev:server' diff --git a/spec/dummy/README.md b/spec/dummy/README.md index 7c10353bf..4be20f0c3 100644 --- a/spec/dummy/README.md +++ b/spec/dummy/README.md @@ -19,8 +19,22 @@ cd react_on_rails npm run dummy:install ``` -## Starting the spec/dummy +# Starting the Sample App + +## Hot Reloading of Rails Assets + +```sh +foreman start -f Procfile.hot +``` + +## Static Loading of Rails Assets ```sh -npm run local +foreman start -f Procfile.static ``` + +## Creating Assets for Tests +```sh +foreman start -f Procfile.spec +``` + diff --git a/spec/dummy/app/assets/javascripts/application.js b/spec/dummy/app/assets/javascripts/application.js deleted file mode 100644 index f186ba137..000000000 --- a/spec/dummy/app/assets/javascripts/application.js +++ /dev/null @@ -1,13 +0,0 @@ -// This is a manifest file that'll be compiled into application.js, which will include all the files -// listed below. -// -// Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts, -// or any plugin's vendor/assets/javascripts directory can be referenced here using a relative path. -// -// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the -// compiled file. -// -// Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details -// about supported directives. -// -//= require generated/client diff --git a/spec/dummy/app/assets/javascripts/application_non_webpack.js.erb b/spec/dummy/app/assets/javascripts/application_non_webpack.js.erb new file mode 100644 index 000000000..64dc1dbcd --- /dev/null +++ b/spec/dummy/app/assets/javascripts/application_non_webpack.js.erb @@ -0,0 +1,7 @@ +// 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) + +<% if ENV["DISABLE_TURBOLINKS"].blank? %> + <% require_asset "turbolinks" %> +<% end %> diff --git a/spec/dummy/app/assets/javascripts/application_static.js.erb b/spec/dummy/app/assets/javascripts/application_static.js.erb new file mode 100644 index 000000000..76c423250 --- /dev/null +++ b/spec/dummy/app/assets/javascripts/application_static.js.erb @@ -0,0 +1,22 @@ +// This file is used in production to server generated JS assets. +// +// In development mode, we use either: +// Procfile.static: Load static assets +// Procfile.hot: Use the Webpack Dev Server to provide assets. This allows for hot reloading of +// the JS and CSS via HMR. +// +// To understand which one is used, see app/views/layouts/application.html.erb + +// These assets are located in app/assets/webpack directory +// Its is CRITICAL for Turbolinks 2.x that webpack/vendor-bundle must be BEFORE turbolinks +// since it is exposing jQuery and jQuery-ujs + +// NOTE: See config/initializers/assets.rb for some critical configuration regarding sprockets. +// Basically, in HOT mode, we do not include this file for +// Rails.application.config.assets.precompile + +//= require vendor-bundle +//= require app-bundle + +// Non-webpack assets include turbolinks and these are loaded in the "hot" mode as well. +//= require application_non_webpack diff --git a/spec/dummy/app/assets/javascripts/application_with_turbolinks.js b/spec/dummy/app/assets/javascripts/application_with_turbolinks.js deleted file mode 100644 index 8ae0e2caf..000000000 --- a/spec/dummy/app/assets/javascripts/application_with_turbolinks.js +++ /dev/null @@ -1,7 +0,0 @@ -// This file is so that we can test the dummy app with turbolinks both enabled -// and disabled via an environment variable (see also: -// Gemfile, layout/application.html.erb, and config/initializers/assets.rb - -//= require application - -//= require turbolinks diff --git a/spec/dummy/app/assets/stylesheets/application.css b/spec/dummy/app/assets/stylesheets/application_non_webpack.scss similarity index 95% rename from spec/dummy/app/assets/stylesheets/application.css rename to spec/dummy/app/assets/stylesheets/application_non_webpack.scss index 216e801f1..841137568 100644 --- a/spec/dummy/app/assets/stylesheets/application.css +++ b/spec/dummy/app/assets/stylesheets/application_non_webpack.scss @@ -10,8 +10,6 @@ * defined in the other CSS/SCSS files in this directory. It is generally better to create a new * file per style scope. * - *= require_tree . - *= require_self */ input[type='text'] { diff --git a/spec/dummy/app/assets/stylesheets/application_static.css.scss.erb b/spec/dummy/app/assets/stylesheets/application_static.css.scss.erb new file mode 100644 index 000000000..74e12cc7f --- /dev/null +++ b/spec/dummy/app/assets/stylesheets/application_static.css.scss.erb @@ -0,0 +1,13 @@ +// These assets are located in app/assets/webpack directory, and are generated ONLY when static +// assets are prepared (not for hot reloading assets). + +// Super important: This file is loaded even for hot loading only, so we need to be sure +// that we don't reference the static generated CSS files. + +// If we were importing bootstrap, we'd have this generated. +// @import 'vendor-bundle' +@import 'app-bundle'; + +// Non-webpack assets +@import 'application_non_webpack'; + diff --git a/spec/dummy/app/controllers/pages_controller.rb b/spec/dummy/app/controllers/pages_controller.rb index 39c9a567e..dcb4fe4ad 100644 --- a/spec/dummy/app/controllers/pages_controller.rb +++ b/spec/dummy/app/controllers/pages_controller.rb @@ -1,16 +1,26 @@ class PagesController < ApplicationController + include ReactOnRails::Controller + before_action :data + before_action :initialize_shared_store, only: [:client_side_hello_world_shared_store_controller, + :server_side_hello_world_shared_store_controller] + rescue_from ReactOnRails::PrerenderError do |err| Rails.logger.error(err.message) Rails.logger.error(err.backtrace.join("\n")) - redirect_to client_side_hello_world_path, flash: { error: "Error prerendering in react_on_rails. See server logs." } + redirect_to client_side_hello_world_path, + flash: { error: "Error prerendering in react_on_rails. See server logs." } end # See files in spec/dummy/app/views/pages private + def initialize_shared_store + redux_store("SharedReduxStore", @app_props_server_render) + end + def data # This is the props used by the React component. @app_props_server_render = { diff --git a/spec/dummy/app/views/layouts/application.html.erb b/spec/dummy/app/views/layouts/application.html.erb index d0fef97ec..202b1dc5c 100644 --- a/spec/dummy/app/views/layouts/application.html.erb +++ b/spec/dummy/app/views/layouts/application.html.erb @@ -2,12 +2,22 @@ Dummy - <%= ENV["DISABLE_TURBOLINKS"].present? ? - stylesheet_link_tag('application', media: 'all') : - stylesheet_link_tag('application', media: 'all', 'data-turbolinks-track' => true) %> - <%= ENV["DISABLE_TURBOLINKS"].present? ? - javascript_include_tag('application') : - javascript_include_tag('application_with_turbolinks', 'data-turbolinks-track' => true) %> + + <%= env_stylesheet_link_tag(static: 'application_static', + hot: 'application_non_webpack', + media: 'all', + 'data-turbolinks-track' => true) %> + + + + <%= env_javascript_include_tag(hot: ['http://localhost:3500/vendor-bundle.js', + 'http://localhost:3500/app-bundle.js']) %> + + + <%= env_javascript_include_tag(static: 'application_static', + hot: 'application_non_webpack', + 'data-turbolinks-track' => true) %> + <%= csrf_meta_tags %> @@ -17,5 +27,9 @@ <%= yield %> + +<%= redux_store_hydration_data %> + diff --git a/spec/dummy/app/views/pages/_header.erb b/spec/dummy/app/views/pages/_header.erb index 3218bca42..9413224a7 100644 --- a/spec/dummy/app/views/pages/_header.erb +++ b/spec/dummy/app/views/pages/_header.erb @@ -3,10 +3,28 @@ <%= link_to "Hello World Component Client Rendered", client_side_hello_world_path %>
  • - <%= link_to "Hello World Shared Redux Components Client Rendered", client_side_hello_world_shared_store_path %> + <%= link_to "Hello World Shared Redux Components Client Rendered", + client_side_hello_world_shared_store_path %>
  • - <%= link_to "Hello World Shared Redux Components Server Rendered", server_side_hello_world_shared_store_path %> + <%= link_to "Hello World Shared Redux Components Client Rendered Controller", + client_side_hello_world_shared_store_controller_path %> +
  • +
  • + <%= link_to "Hello World Shared Redux Components Client Rendered Defer", + client_side_hello_world_shared_store_defer_path %> +
  • +
  • + <%= link_to "Hello World Shared Redux Components Server Rendered", + server_side_hello_world_shared_store_path %> +
  • +
  • + <%= link_to "Hello World Shared Redux Components Server Rendered Controller", + server_side_hello_world_shared_store_controller_path %> +
  • +
  • + <%= link_to "Hello World Shared Redux Components Server Rendered Defer", + server_side_hello_world_shared_store_defer_path %>
  • <%= link_to "Hello World Component Server Rendered", server_side_hello_world_path %> diff --git a/spec/dummy/app/views/pages/client_side_hello_world_shared_store.html.erb b/spec/dummy/app/views/pages/client_side_hello_world_shared_store.html.erb index c35b37a77..4e8476b64 100644 --- a/spec/dummy/app/views/pages/client_side_hello_world_shared_store.html.erb +++ b/spec/dummy/app/views/pages/client_side_hello_world_shared_store.html.erb @@ -1,5 +1,5 @@ <%= render "header" %> -<%= redux_store("SharedReduxStore", @app_props_server_render) %> +<%= redux_store("SharedReduxStore", props: @app_props_server_render) %> <%= react_component("ReduxSharedStoreApp", prerender: false, trace: true) %>
    diff --git a/spec/dummy/app/views/pages/client_side_hello_world_shared_store_controller.html.erb b/spec/dummy/app/views/pages/client_side_hello_world_shared_store_controller.html.erb new file mode 100644 index 000000000..b93553b45 --- /dev/null +++ b/spec/dummy/app/views/pages/client_side_hello_world_shared_store_controller.html.erb @@ -0,0 +1,38 @@ +<%= render "header" %> + +<%= react_component("ReduxSharedStoreApp", prerender: false, trace: true) %> +
    +

    Second Hello World

    +<%= react_component("ReduxSharedStoreApp", prerender: false, trace: true) %> +
    + +

    React Rails Client Side Only Rendering, 2 components, same Redux store

    +

    + This example demonstrates using 2 components attached to the same store.

    +

    + +
    +

    Setup

    +
      +
    1. + Create component source: spec/dummy/client/app/startup/ReduxSharedStoreApp.jsx +
    2. +
    3. + Create store source: spec/dummy/client/app/stores/SharedReduxStore.jsx +
    4. +
    5. + Register the components: spec/dummy/client/app/startup/clientRegistration.jsx +
    6. +
    7. + Place the components and store on the view: spec/dummy/app/views/pages/client_side_hello_world_shared_store.html.erb +
      +
      +<%%= redux_store("SharedReduxStore", @app_props_server_render) %>
      +
      +<%%= react_component("ReduxSharedStoreApp", prerender: false, trace: true) %>
      +
      +Second Hello World
      +<%%= react_component("ReduxSharedStoreApp", prerender: false, trace: true) %>
      +    
      +
    8. +
    diff --git a/spec/dummy/app/views/pages/client_side_hello_world_shared_store_defer.html.erb b/spec/dummy/app/views/pages/client_side_hello_world_shared_store_defer.html.erb new file mode 100644 index 000000000..b22fd69e9 --- /dev/null +++ b/spec/dummy/app/views/pages/client_side_hello_world_shared_store_defer.html.erb @@ -0,0 +1,41 @@ +<%= render "header" %> + +YO +<% redux_store("SharedReduxStore", props: @app_props_server_render, defer: true) %> + +<%= react_component("ReduxSharedStoreApp", prerender: false, trace: true) %> +
    +

    Second Hello World

    +<%= react_component("ReduxSharedStoreApp", prerender: false, trace: true) %> +
    + +

    React Rails Client Side Only Rendering, 2 components, same Redux store

    +

    + This example demonstrates using 2 components attached to the same store.

    +

    + +
    +

    Setup

    +
      +
    1. + Create component source: spec/dummy/client/app/startup/ReduxSharedStoreApp.jsx +
    2. +
    3. + Create store source: spec/dummy/client/app/stores/SharedReduxStore.jsx +
    4. +
    5. + Register the components: spec/dummy/client/app/startup/clientRegistration.jsx +
    6. +
    7. + Place the components and store on the view: spec/dummy/app/views/pages/client_side_hello_world_shared_store.html.erb +
      +
      +<%%= redux_store("SharedReduxStore", @app_props_server_render) %>
      +
      +<%%= react_component("ReduxSharedStoreApp", prerender: false, trace: true) %>
      +
      +Second Hello World
      +<%%= react_component("ReduxSharedStoreApp", prerender: false, trace: true) %>
      +    
      +
    8. +
    diff --git a/spec/dummy/app/views/pages/server_side_hello_world_shared_store.html.erb b/spec/dummy/app/views/pages/server_side_hello_world_shared_store.html.erb index 1a0ef00d0..582d023e6 100644 --- a/spec/dummy/app/views/pages/server_side_hello_world_shared_store.html.erb +++ b/spec/dummy/app/views/pages/server_side_hello_world_shared_store.html.erb @@ -1,5 +1,5 @@ <%= render "header" %> -<%= redux_store("SharedReduxStore", @app_props_server_render) %> +<%= redux_store("SharedReduxStore", props: @app_props_server_render) %> <%= react_component("ReduxSharedStoreApp", prerender: true, trace: true) %>
    diff --git a/spec/dummy/app/views/pages/server_side_hello_world_shared_store_controller.html.erb b/spec/dummy/app/views/pages/server_side_hello_world_shared_store_controller.html.erb new file mode 100644 index 000000000..e47b50234 --- /dev/null +++ b/spec/dummy/app/views/pages/server_side_hello_world_shared_store_controller.html.erb @@ -0,0 +1,38 @@ +<%= render "header" %> + +<%= react_component("ReduxSharedStoreApp", prerender: true, trace: true) %> +
    +

    Second Hello World

    +<%= react_component("ReduxSharedStoreApp", prerender: true, trace: true) %> +
    + +

    React Rails Client Side Only Rendering, 2 components, same Redux store

    +

    + This example demonstrates using 2 components attached to the same store.

    +

    + +
    +

    Setup

    +
      +
    1. + Create component source: spec/dummy/client/app/startup/ReduxSharedStoreApp.jsx +
    2. +
    3. + Create store source: spec/dummy/client/app/stores/SharedReduxStore.jsx +
    4. +
    5. + Register the components: spec/dummy/client/app/startup/clientRegistration.jsx +
    6. +
    7. + Place the components and store on the view: spec/dummy/app/views/pages/client_side_hello_world_shared_store.html.erb +
      +
      +<%%= redux_store("SharedReduxStore", @app_props_server_render) %>
      +
      +<%%= react_component("ReduxSharedStoreApp", prerender: false, trace: true) %>
      +
      +Second Hello World
      +<%%= react_component("ReduxSharedStoreApp", prerender: false, trace: true) %>
      +    
      +
    8. +
    diff --git a/spec/dummy/app/views/pages/server_side_hello_world_shared_store_defer.html.erb b/spec/dummy/app/views/pages/server_side_hello_world_shared_store_defer.html.erb new file mode 100644 index 000000000..3530f1860 --- /dev/null +++ b/spec/dummy/app/views/pages/server_side_hello_world_shared_store_defer.html.erb @@ -0,0 +1,39 @@ +<%= render "header" %> +<% redux_store("SharedReduxStore", props: @app_props_server_render, defer: true) %> + +<%= react_component("ReduxSharedStoreApp", prerender: true, trace: true) %> +
    +

    Second Hello World

    +<%= react_component("ReduxSharedStoreApp", prerender: true, trace: true) %> +
    + +

    React Rails Client Side Only Rendering, 2 components, same Redux store

    +

    + This example demonstrates using 2 components attached to the same store.

    +

    + +
    +

    Setup

    +
      +
    1. + Create component source: spec/dummy/client/app/startup/ReduxSharedStoreApp.jsx +
    2. +
    3. + Create store source: spec/dummy/client/app/stores/SharedReduxStore.jsx +
    4. +
    5. + Register the components: spec/dummy/client/app/startup/clientRegistration.jsx +
    6. +
    7. + Place the components and store on the view: spec/dummy/app/views/pages/client_side_hello_world_shared_store.html.erb +
      +
      +<%%= redux_store("SharedReduxStore", @app_props_server_render) %>
      +
      +<%%= react_component("ReduxSharedStoreApp", prerender: false, trace: true) %>
      +
      +Second Hello World
      +<%%= react_component("ReduxSharedStoreApp", prerender: false, trace: true) %>
      +    
      +
    8. +
    diff --git a/spec/dummy/client/app/assets/styles/app-variables.scss b/spec/dummy/client/app/assets/styles/app-variables.scss new file mode 100644 index 000000000..1fb3f1a16 --- /dev/null +++ b/spec/dummy/client/app/assets/styles/app-variables.scss @@ -0,0 +1,5 @@ +// Defining application SASS variables in stand-alone file, +// so we can use them in bootstrap-loader and CSS Modules via sass-resources-loader +// It will be used in SASS components imported as CSS Modules + +$bright-color: red; diff --git a/spec/dummy/client/app/components/HelloWorld.jsx b/spec/dummy/client/app/components/HelloWorld.jsx index fbb55fb7b..523ab42e3 100644 --- a/spec/dummy/client/app/components/HelloWorld.jsx +++ b/spec/dummy/client/app/components/HelloWorld.jsx @@ -1,5 +1,8 @@ import React, { PropTypes } from 'react'; +// Example of CSS modules. +import css from './HelloWorld.scss'; + // Super simple example of the simplest possible React component class HelloWorld extends React.Component { @@ -36,7 +39,7 @@ spec/dummy/client/app/components/HelloWorld.jsx:18`); return (
    -

    +

    Hello, {name}!

    diff --git a/spec/dummy/client/app/components/HelloWorld.scss b/spec/dummy/client/app/components/HelloWorld.scss new file mode 100644 index 000000000..55339905f --- /dev/null +++ b/spec/dummy/client/app/components/HelloWorld.scss @@ -0,0 +1,3 @@ +.brightColor { + color: $bright-color; +} diff --git a/spec/dummy/client/app/routes/routes.jsx b/spec/dummy/client/app/routes/routes.jsx index 03885e249..259a32384 100644 --- a/spec/dummy/client/app/routes/routes.jsx +++ b/spec/dummy/client/app/routes/routes.jsx @@ -1,5 +1,6 @@ import React from 'react'; import { Route } from 'react-router'; + import RouterLayout from '../components/RouterLayout'; import RouterFirstPage from '../components/RouterFirstPage'; import RouterSecondPage from '../components/RouterSecondPage'; diff --git a/spec/dummy/client/app/startup/ClientRouterApp.jsx b/spec/dummy/client/app/startup/ClientRouterApp.jsx index c7df78f4b..e501e9b67 100644 --- a/spec/dummy/client/app/startup/ClientRouterApp.jsx +++ b/spec/dummy/client/app/startup/ClientRouterApp.jsx @@ -1,5 +1,5 @@ import React from 'react'; -import Router, { browserHistory } from 'react-router'; +import { Router, browserHistory } from 'react-router'; import routes from '../routes/routes'; export default (props) => ( diff --git a/spec/dummy/client/npm-shrinkwrap.json b/spec/dummy/client/npm-shrinkwrap.json index 539922fb1..04c03a62f 100644 --- a/spec/dummy/client/npm-shrinkwrap.json +++ b/spec/dummy/client/npm-shrinkwrap.json @@ -2,10 +2,32 @@ "name": "client", "version": "1.0.0", "dependencies": { + "abbrev": { + "version": "1.0.7", + "from": "abbrev@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.7.tgz" + }, + "accepts": { + "version": "1.3.1", + "from": "accepts@>=1.3.1 <1.4.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.1.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": "3.0.4", + "from": "acorn@>=3.0.4 <4.0.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.0.4.tgz" + }, + "acorn-jsx": { + "version": "2.0.1", + "from": "acorn-jsx@>=2.0.1 <3.0.0", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-2.0.1.tgz", + "dependencies": { + "acorn": { + "version": "2.7.0", + "from": "acorn@>=2.0.1 <3.0.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-2.7.0.tgz" + } + } }, "acorn-to-esprima": { "version": "2.0.8", @@ -13,16 +35,14 @@ "resolved": "https://registry.npmjs.org/acorn-to-esprima/-/acorn-to-esprima-2.0.8.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", - "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" - } - } + "version": "0.1.4", + "from": "align-text@>=0.1.3 <0.2.0", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz" + }, + "alphanum-sort": { + "version": "1.0.2", + "from": "alphanum-sort@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz" }, "alter": { "version": "0.2.0", @@ -34,10 +54,15 @@ "from": "amdefine@>=0.0.4", "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz" }, + "ansi": { + "version": "0.3.1", + "from": "ansi@>=0.3.1 <0.4.0", + "resolved": "https://registry.npmjs.org/ansi/-/ansi-0.3.1.tgz" + }, "ansi-escapes": { - "version": "1.1.0", + "version": "1.2.0", "from": "ansi-escapes@>=1.1.0 <2.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.1.0.tgz" + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.2.0.tgz" }, "ansi-regex": { "version": "2.0.0", @@ -45,26 +70,24 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz" }, "ansi-styles": { - "version": "2.1.0", + "version": "2.2.0", "from": "ansi-styles@>=2.1.0 <3.0.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.1.0.tgz" + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.0.tgz" }, "anymatch": { "version": "1.3.0", "from": "anymatch@>=1.3.0 <2.0.0", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.0.tgz" }, + "are-we-there-yet": { + "version": "1.0.6", + "from": "are-we-there-yet@>=1.0.6 <1.1.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.0.6.tgz" + }, "argparse": { - "version": "1.0.4", + "version": "1.0.6", "from": "argparse@>=1.0.2 <2.0.0", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.4.tgz", - "dependencies": { - "lodash": { - "version": "4.1.0", - "from": "lodash@>=4.0.0 <5.0.0", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.1.0.tgz" - } - } + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.6.tgz" }, "arr-diff": { "version": "2.0.0", @@ -76,6 +99,21 @@ "from": "arr-flatten@>=1.0.1 <2.0.0", "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.0.1.tgz" }, + "array-find-index": { + "version": "1.0.1", + "from": "array-find-index@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.1.tgz" + }, + "array-flatten": { + "version": "1.1.1", + "from": "array-flatten@1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" + }, + "array-index": { + "version": "1.0.0", + "from": "array-index@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/array-index/-/array-index-1.0.0.tgz" + }, "array-union": { "version": "1.0.1", "from": "array-union@>=1.0.1 <2.0.0", @@ -107,9 +145,9 @@ "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz" }, "asn1.js": { - "version": "4.3.0", + "version": "4.5.1", "from": "asn1.js@>=4.0.0 <5.0.0", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.3.0.tgz" + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.5.1.tgz" }, "assert": { "version": "1.3.0", @@ -117,9 +155,9 @@ "resolved": "https://registry.npmjs.org/assert/-/assert-1.3.0.tgz" }, "assert-plus": { - "version": "0.1.5", - "from": "assert-plus@>=0.1.5 <0.2.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz" + "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" }, "ast-traverse": { "version": "0.1.1", @@ -132,255 +170,144 @@ "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.8.12.tgz" }, "async": { - "version": "1.5.0", + "version": "1.5.2", "from": "async@>=1.4.0 <2.0.0", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.0.tgz" + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz" }, "async-each": { - "version": "0.1.6", - "from": "async-each@>=0.1.6 <0.2.0", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-0.1.6.tgz" + "version": "1.0.0", + "from": "async-each@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.0.tgz" + }, + "async-foreach": { + "version": "0.1.3", + "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.3.3", + "from": "autoprefixer@>=6.3.3 <7.0.0", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-6.3.3.tgz" }, "aws-sign2": { "version": "0.6.0", "from": "aws-sign2@>=0.6.0 <0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz" }, + "aws4": { + "version": "1.3.2", + "from": "aws4@>=1.2.1 <2.0.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.3.2.tgz" + }, "babel": { - "version": "6.3.26", - "from": "babel@>=6.3.26 <7.0.0", - "resolved": "https://registry.npmjs.org/babel/-/babel-6.3.26.tgz" + "version": "6.5.2", + "from": "babel@>=6.5.2 <7.0.0", + "resolved": "https://registry.npmjs.org/babel/-/babel-6.5.2.tgz" }, "babel-cli": { - "version": "6.4.5", - "from": "babel-cli@>=6.4.5 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-cli/-/babel-cli-6.4.5.tgz" + "version": "6.6.5", + "from": "babel-cli@>=6.6.5 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-cli/-/babel-cli-6.6.5.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" + "version": "6.6.5", + "from": "babel-code-frame@>=6.6.5 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.6.5.tgz" }, "babel-core": { - "version": "6.4.5", - "from": "babel-core@>=6.4.5 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.4.5.tgz", - "dependencies": { - "babel-traverse": { - "version": "6.4.5", - "from": "babel-traverse@>=6.4.5 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.4.5.tgz" - }, - "babel-types": { - "version": "6.4.5", - "from": "babel-types@>=6.4.5 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.4.5.tgz" - }, - "babylon": { - "version": "6.4.5", - "from": "babylon@>=6.4.5 <7.0.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.4.5.tgz" - } - } + "version": "6.6.5", + "from": "babel-core@>=6.6.5 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.6.5.tgz" + }, + "babel-eslint": { + "version": "5.0.0", + "from": "babel-eslint@>=5.0.0 <6.0.0", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-5.0.0.tgz" }, "babel-generator": { - "version": "6.4.5", - "from": "babel-generator@>=6.4.5 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.4.5.tgz", - "dependencies": { - "babel-traverse": { - "version": "6.4.5", - "from": "babel-traverse@6.4.5", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.4.5.tgz", - "dependencies": { - "invariant": { - "version": "2.2.0", - "from": "invariant@>=2.2.0 <3.0.0", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.0.tgz" - } - } - }, - "babel-types": { - "version": "6.4.5", - "from": "babel-types@6.4.5", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.4.5.tgz" - }, - "babylon": { - "version": "6.4.5", - "from": "babylon@6.4.5", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.4.5.tgz" - } - } + "version": "6.6.5", + "from": "babel-generator@>=6.6.5 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.6.5.tgz" }, "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", - "dependencies": { - "babel-types": { - "version": "6.4.5", - "from": "babel-types@>=6.3.13 <7.0.0" - } - } + "version": "6.6.5", + "from": "babel-helper-bindify-decorators@>=6.6.5 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.6.5.tgz" }, "babel-helper-builder-binary-assignment-operator-visitor": { - "version": "6.3.13", + "version": "6.6.5", "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", - "dependencies": { - "babel-types": { - "version": "6.4.5", - "from": "babel-types@>=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.6.5.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": { - "babel-types": { - "version": "6.4.5", - "from": "babel-types@6.4.5", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.4.5.tgz" - } - } + "version": "6.6.5", + "from": "babel-helper-builder-react-jsx@>=6.6.5 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.6.5.tgz" }, "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", - "dependencies": { - "babel-types": { - "version": "6.4.5", - "from": "babel-types@6.4.5", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.4.5.tgz" - } - } + "version": "6.6.5", + "from": "babel-helper-call-delegate@>=6.6.5 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.6.5.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": { - "babel-types": { - "version": "6.4.5", - "from": "babel-types@6.4.5", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.4.5.tgz" - } - } + "version": "6.6.5", + "from": "babel-helper-define-map@>=6.6.5 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.6.5.tgz" }, "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", - "dependencies": { - "babel-types": { - "version": "6.4.5", - "from": "babel-types@6.4.5", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.4.5.tgz" - } - } + "version": "6.6.5", + "from": "babel-helper-explode-assignable-expression@>=6.6.5 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.6.5.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", - "dependencies": { - "babel-types": { - "version": "6.4.5", - "from": "babel-types@6.4.5", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.4.5.tgz" - } - } + "version": "6.6.5", + "from": "babel-helper-explode-class@>=6.6.5 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-helper-explode-class/-/babel-helper-explode-class-6.6.5.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", - "dependencies": { - "babel-types": { - "version": "6.4.5", - "from": "babel-types@6.4.5", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.4.5.tgz" - } - } + "version": "6.6.0", + "from": "babel-helper-function-name@>=6.6.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.6.0.tgz" }, "babel-helper-get-function-arity": { - "version": "6.3.13", + "version": "6.6.5", "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", - "dependencies": { - "babel-types": { - "version": "6.4.5", - "from": "babel-types@6.4.5", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.4.5.tgz" - } - } + "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.6.5.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", - "dependencies": { - "babel-types": { - "version": "6.4.5", - "from": "babel-types@>=6.3.13 <7.0.0" - } - } + "version": "6.6.5", + "from": "babel-helper-hoist-variables@>=6.6.5 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.6.5.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", - "dependencies": { - "babel-types": { - "version": "6.4.5", - "from": "babel-types@6.4.5", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.4.5.tgz" - } - } + "version": "6.6.0", + "from": "babel-helper-optimise-call-expression@>=6.6.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.6.0.tgz" }, "babel-helper-regex": { - "version": "6.3.13", + "version": "6.6.5", "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": { - "babel-types": { - "version": "6.4.5", - "from": "babel-types@6.4.5", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.4.5.tgz" - } - } + "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.6.5.tgz" }, "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", - "dependencies": { - "babel-types": { - "version": "6.4.5", - "from": "babel-types@6.4.5", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.4.5.tgz" - } - } + "version": "6.6.5", + "from": "babel-helper-remap-async-to-generator@>=6.4.6 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.6.5.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", - "dependencies": { - "babel-types": { - "version": "6.4.5", - "from": "babel-types@6.4.5", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.4.5.tgz" - } - } + "version": "6.6.5", + "from": "babel-helper-replace-supers@>=6.6.5 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.6.5.tgz" }, "babel-helpers": { - "version": "6.4.5", - "from": "babel-helpers@>=6.4.5 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.4.5.tgz" + "version": "6.6.0", + "from": "babel-helpers@>=6.6.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.6.0.tgz" }, "babel-jscs": { "version": "2.0.5", @@ -397,6 +324,11 @@ "from": "babylon@>=5.8.35 <6.0.0", "resolved": "https://registry.npmjs.org/babylon/-/babylon-5.8.35.tgz" }, + "bluebird": { + "version": "2.10.2", + "from": "bluebird@>=2.9.33 <3.0.0", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.10.2.tgz" + }, "globals": { "version": "6.4.1", "from": "globals@>=6.4.0 <7.0.0", @@ -406,28 +338,23 @@ "version": "1.0.1", "from": "js-tokens@1.0.1", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-1.0.1.tgz" - }, - "minimatch": { - "version": "2.0.10", - "from": "minimatch@>=2.0.3 <3.0.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz" } } }, "babel-loader": { - "version": "6.2.1", - "from": "babel-loader@>=6.2.1 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-6.2.1.tgz" + "version": "6.2.4", + "from": "babel-loader@>=6.2.4 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-6.2.4.tgz" }, "babel-messages": { - "version": "6.3.18", - "from": "babel-messages@>=6.3.13 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.3.18.tgz" + "version": "6.6.5", + "from": "babel-messages@>=6.6.5 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.6.5.tgz" }, "babel-plugin-check-es2015-constants": { - "version": "6.3.13", + "version": "6.6.5", "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" + "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.6.5.tgz" }, "babel-plugin-constant-folding": { "version": "1.0.1", @@ -495,296 +422,234 @@ "resolved": "https://registry.npmjs.org/babel-plugin-runtime/-/babel-plugin-runtime-1.0.7.tgz" }, "babel-plugin-syntax-async-functions": { - "version": "6.3.13", + "version": "6.5.0", "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" + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.5.0.tgz" }, "babel-plugin-syntax-class-constructor-call": { - "version": "6.3.13", + "version": "6.5.0", "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" + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-constructor-call/-/babel-plugin-syntax-class-constructor-call-6.5.0.tgz" }, "babel-plugin-syntax-class-properties": { - "version": "6.3.13", + "version": "6.5.0", "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" + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.5.0.tgz" }, "babel-plugin-syntax-decorators": { - "version": "6.3.13", + "version": "6.5.0", "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" + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.5.0.tgz" }, "babel-plugin-syntax-do-expressions": { - "version": "6.3.13", + "version": "6.5.0", "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" + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-do-expressions/-/babel-plugin-syntax-do-expressions-6.5.0.tgz" }, "babel-plugin-syntax-exponentiation-operator": { - "version": "6.3.13", + "version": "6.5.0", "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" + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.5.0.tgz" }, "babel-plugin-syntax-export-extensions": { - "version": "6.3.13", + "version": "6.5.0", "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" + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.5.0.tgz" }, "babel-plugin-syntax-flow": { - "version": "6.3.13", + "version": "6.5.0", "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" + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.5.0.tgz" }, "babel-plugin-syntax-function-bind": { - "version": "6.3.13", + "version": "6.5.0", "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" + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-function-bind/-/babel-plugin-syntax-function-bind-6.5.0.tgz" }, "babel-plugin-syntax-jsx": { - "version": "6.3.13", + "version": "6.5.0", "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" + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.5.0.tgz" }, "babel-plugin-syntax-object-rest-spread": { - "version": "6.3.13", + "version": "6.5.0", "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" + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.5.0.tgz" }, "babel-plugin-syntax-trailing-function-commas": { - "version": "6.3.13", + "version": "6.5.0", "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" + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.5.0.tgz" }, "babel-plugin-transform-async-to-generator": { - "version": "6.3.13", + "version": "6.5.0", "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" + "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.5.0.tgz" }, "babel-plugin-transform-class-constructor-call": { - "version": "6.3.13", + "version": "6.6.5", "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" + "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-constructor-call/-/babel-plugin-transform-class-constructor-call-6.6.5.tgz" }, "babel-plugin-transform-class-properties": { - "version": "6.3.13", + "version": "6.6.0", "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" + "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.6.0.tgz" }, "babel-plugin-transform-decorators": { - "version": "6.3.13", + "version": "6.6.5", "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", - "dependencies": { - "babel-types": { - "version": "6.4.5", - "from": "babel-types@6.4.5", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.4.5.tgz" - } - } + "resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.6.5.tgz" }, "babel-plugin-transform-do-expressions": { - "version": "6.3.13", + "version": "6.5.0", "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" + "resolved": "https://registry.npmjs.org/babel-plugin-transform-do-expressions/-/babel-plugin-transform-do-expressions-6.5.0.tgz" }, "babel-plugin-transform-es2015-arrow-functions": { - "version": "6.3.13", + "version": "6.5.2", "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" + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.5.2.tgz" }, "babel-plugin-transform-es2015-block-scoped-functions": { - "version": "6.3.13", + "version": "6.6.5", "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" + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.6.5.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": { - "babel-types": { - "version": "6.4.5", - "from": "babel-types@6.4.5", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.4.5.tgz" - } - } + "version": "6.6.5", + "from": "babel-plugin-transform-es2015-block-scoping@>=6.6.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.6.5.tgz" }, "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", - "dependencies": { - "babel-types": { - "version": "6.4.5", - "from": "babel-types@6.4.5", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.4.5.tgz" - } - } + "version": "6.6.5", + "from": "babel-plugin-transform-es2015-classes@>=6.6.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.6.5.tgz" }, "babel-plugin-transform-es2015-computed-properties": { - "version": "6.3.13", + "version": "6.6.5", "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" + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.6.5.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" + "version": "6.6.5", + "from": "babel-plugin-transform-es2015-destructuring@>=6.6.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.6.5.tgz" + }, + "babel-plugin-transform-es2015-duplicate-keys": { + "version": "6.6.4", + "from": "babel-plugin-transform-es2015-duplicate-keys@>=6.6.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.6.4.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" + "version": "6.6.0", + "from": "babel-plugin-transform-es2015-for-of@>=6.6.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.6.0.tgz" }, "babel-plugin-transform-es2015-function-name": { - "version": "6.3.21", + "version": "6.5.0", "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.21.tgz", - "dependencies": { - "babel-types": { - "version": "6.4.5", - "from": "babel-types@>=6.3.21 <7.0.0" - } - } + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.5.0.tgz" }, "babel-plugin-transform-es2015-literals": { - "version": "6.3.13", + "version": "6.5.0", "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" + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.5.0.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", - "dependencies": { - "babel-types": { - "version": "6.4.5", - "from": "babel-types@6.4.5", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.4.5.tgz" - } - } + "version": "6.6.5", + "from": "babel-plugin-transform-es2015-modules-commonjs@>=6.6.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.6.5.tgz" }, "babel-plugin-transform-es2015-object-super": { - "version": "6.3.13", + "version": "6.6.5", "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" + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.6.5.tgz" }, "babel-plugin-transform-es2015-parameters": { - "version": "6.3.26", - "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.26.tgz", - "dependencies": { - "babel-types": { - "version": "6.4.5", - "from": "babel-types@6.4.5", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.4.5.tgz" - } - } + "version": "6.6.5", + "from": "babel-plugin-transform-es2015-parameters@>=6.6.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.6.5.tgz" }, "babel-plugin-transform-es2015-shorthand-properties": { - "version": "6.3.13", + "version": "6.5.0", "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", - "dependencies": { - "babel-types": { - "version": "6.4.5", - "from": "babel-types@6.4.5", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.4.5.tgz" - } - } + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.5.0.tgz" }, "babel-plugin-transform-es2015-spread": { - "version": "6.3.14", + "version": "6.6.5", "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" + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.6.5.tgz" }, "babel-plugin-transform-es2015-sticky-regex": { - "version": "6.3.13", + "version": "6.5.0", "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", - "dependencies": { - "babel-types": { - "version": "6.4.5", - "from": "babel-types@6.4.5", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.4.5.tgz" - } - } + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.5.0.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" + "version": "6.6.5", + "from": "babel-plugin-transform-es2015-template-literals@>=6.6.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.6.5.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" + "version": "6.6.0", + "from": "babel-plugin-transform-es2015-typeof-symbol@>=6.6.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.6.0.tgz" }, "babel-plugin-transform-es2015-unicode-regex": { - "version": "6.3.13", + "version": "6.5.0", "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" + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.5.0.tgz" }, "babel-plugin-transform-exponentiation-operator": { - "version": "6.3.13", + "version": "6.5.0", "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" + "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.5.0.tgz" }, "babel-plugin-transform-export-extensions": { - "version": "6.3.13", + "version": "6.5.0", "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" + "resolved": "https://registry.npmjs.org/babel-plugin-transform-export-extensions/-/babel-plugin-transform-export-extensions-6.5.0.tgz" }, "babel-plugin-transform-flow-strip-types": { - "version": "6.3.15", + "version": "6.6.5", "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" + "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.6.5.tgz" }, "babel-plugin-transform-function-bind": { - "version": "6.3.13", + "version": "6.5.2", "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" + "resolved": "https://registry.npmjs.org/babel-plugin-transform-function-bind/-/babel-plugin-transform-function-bind-6.5.2.tgz" }, "babel-plugin-transform-object-rest-spread": { - "version": "6.3.13", + "version": "6.6.5", "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" + "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.6.5.tgz" }, "babel-plugin-transform-react-display-name": { - "version": "6.3.13", + "version": "6.5.0", "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" + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.5.0.tgz" }, "babel-plugin-transform-react-jsx": { - "version": "6.3.13", + "version": "6.6.5", "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" + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.6.5.tgz" }, "babel-plugin-transform-react-jsx-source": { - "version": "6.3.13", + "version": "6.5.0", "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" + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.5.0.tgz" }, "babel-plugin-transform-regenerator": { - "version": "6.3.26", - "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.26.tgz", - "dependencies": { - "babel-types": { - "version": "6.4.5", - "from": "babel-types@>=6.3.18 <7.0.0" - } - } + "version": "6.6.5", + "from": "babel-plugin-transform-regenerator@>=6.6.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.6.5.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", - "dependencies": { - "babel-types": { - "version": "6.4.5", - "from": "babel-types@>=6.3.13 <7.0.0" - } - } + "version": "6.6.5", + "from": "babel-plugin-transform-strict-mode@>=6.6.5 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.6.5.tgz" }, "babel-plugin-undeclared-variables-check": { "version": "1.0.2", @@ -797,49 +662,63 @@ "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@>=6.3.14 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.3.14.tgz" + "version": "6.6.1", + "from": "babel-polyfill@>=6.6.1 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.6.1.tgz", + "dependencies": { + "core-js": { + "version": "2.1.3", + "from": "core-js@>=2.1.0 <3.0.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.1.3.tgz" + } + } }, "babel-preset-es2015": { - "version": "6.3.13", - "from": "babel-preset-es2015@>=6.3.13 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.3.13.tgz" + "version": "6.6.0", + "from": "babel-preset-es2015@>=6.6.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.6.0.tgz" }, "babel-preset-react": { - "version": "6.3.13", - "from": "babel-preset-react@>=6.3.13 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-preset-react/-/babel-preset-react-6.3.13.tgz" + "version": "6.5.0", + "from": "babel-preset-react@>=6.5.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-preset-react/-/babel-preset-react-6.5.0.tgz" }, "babel-preset-stage-0": { - "version": "6.3.13", - "from": "babel-preset-stage-0@>=6.3.13 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-preset-stage-0/-/babel-preset-stage-0-6.3.13.tgz" + "version": "6.5.0", + "from": "babel-preset-stage-0@>=6.5.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-preset-stage-0/-/babel-preset-stage-0-6.5.0.tgz" }, "babel-preset-stage-1": { - "version": "6.3.13", + "version": "6.5.0", "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" + "resolved": "https://registry.npmjs.org/babel-preset-stage-1/-/babel-preset-stage-1-6.5.0.tgz" }, "babel-preset-stage-2": { - "version": "6.3.13", + "version": "6.5.0", "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" + "resolved": "https://registry.npmjs.org/babel-preset-stage-2/-/babel-preset-stage-2-6.5.0.tgz" }, "babel-preset-stage-3": { - "version": "6.3.13", + "version": "6.5.0", "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" + "resolved": "https://registry.npmjs.org/babel-preset-stage-3/-/babel-preset-stage-3-6.5.0.tgz" }, "babel-regenerator-runtime": { - "version": "6.3.13", + "version": "6.5.0", "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" + "resolved": "https://registry.npmjs.org/babel-regenerator-runtime/-/babel-regenerator-runtime-6.5.0.tgz" }, "babel-register": { - "version": "6.4.3", - "from": "babel-register@>=6.3.13 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.4.3.tgz" + "version": "6.6.5", + "from": "babel-register@>=6.6.5 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.6.5.tgz", + "dependencies": { + "core-js": { + "version": "2.1.3", + "from": "core-js@>=2.1.0 <3.0.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.1.3.tgz" + } + } }, "babel-runtime": { "version": "5.8.35", @@ -847,37 +726,24 @@ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-5.8.35.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": { - "babel-types": { - "version": "6.4.5", - "from": "babel-types@>=6.3.13 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.4.5.tgz" - } - } + "version": "6.6.5", + "from": "babel-template@>=6.6.5 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.6.5.tgz" }, "babel-traverse": { - "version": "6.4.5", - "from": "babel-traverse@>=6.0.20 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.4.5.tgz", - "dependencies": { - "babel-types": { - "version": "6.4.5", - "from": "babel-types@>=6.4.5 <7.0.0" - } - } + "version": "6.6.5", + "from": "babel-traverse@>=6.6.5 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.6.5.tgz" }, "babel-types": { - "version": "6.4.5", - "from": "babel-types@>=6.4.5 <7.0.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.4.5.tgz" + "version": "6.6.5", + "from": "babel-types@>=6.6.5 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.6.5.tgz" }, "babylon": { - "version": "6.4.5", - "from": "babylon@>=6.0.18 <7.0.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.4.5.tgz" + "version": "6.6.5", + "from": "babylon@>=6.6.5 <7.0.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.6.5.tgz" }, "balanced-match": { "version": "0.3.0", @@ -895,9 +761,14 @@ "resolved": "https://registry.npmjs.org/Base64/-/Base64-0.2.1.tgz" }, "base64-js": { - "version": "1.0.2", + "version": "1.1.1", "from": "base64-js@>=1.0.2 <2.0.0", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.0.2.tgz" + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.1.1.tgz" + }, + "batch": { + "version": "0.5.3", + "from": "batch@0.5.3", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.5.3.tgz" }, "big.js": { "version": "3.1.3", @@ -912,14 +783,7 @@ "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", - "dependencies": { - "minimist": { - "version": "1.2.0", - "from": "minimist@>=1.1.0 <2.0.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz" - } - } + "resolved": "https://registry.npmjs.org/bin-version-check/-/bin-version-check-2.1.0.tgz" }, "binary-extensions": { "version": "1.4.0", @@ -927,19 +791,24 @@ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.4.0.tgz" }, "bl": { - "version": "1.0.1", + "version": "1.0.3", "from": "bl@>=1.0.0 <1.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.0.1.tgz" + "resolved": "https://registry.npmjs.org/bl/-/bl-1.0.3.tgz" + }, + "block-stream": { + "version": "0.0.8", + "from": "block-stream@*", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.8.tgz" }, "bluebird": { - "version": "2.10.2", - "from": "bluebird@>=2.9.33 <3.0.0", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.10.2.tgz" + "version": "3.3.3", + "from": "bluebird@>=3.1.1 <4.0.0", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.3.3.tgz" }, "bn.js": { - "version": "4.8.0", + "version": "4.10.5", "from": "bn.js@>=4.1.1 <5.0.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.8.0.tgz" + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.10.5.tgz" }, "boom": { "version": "2.10.1", @@ -947,9 +816,9 @@ "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz" }, "brace-expansion": { - "version": "1.1.2", + "version": "1.1.3", "from": "brace-expansion@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.2.tgz" + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.3.tgz" }, "braces": { "version": "1.8.3", @@ -982,9 +851,9 @@ "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.0.tgz" }, "browserify-rsa": { - "version": "4.0.0", + "version": "4.0.1", "from": "browserify-rsa@>=4.0.0 <5.0.0", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.0.tgz" + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz" }, "browserify-sign": { "version": "4.0.0", @@ -996,10 +865,15 @@ "from": "browserify-zlib@>=0.1.4 <0.2.0", "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz" }, + "browserslist": { + "version": "1.1.3", + "from": "browserslist@>=1.1.3 <1.2.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.1.3.tgz" + }, "buffer": { - "version": "4.3.0", + "version": "4.5.0", "from": "buffer@>=4.3.0 <5.0.0", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.3.0.tgz", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.5.0.tgz", "dependencies": { "isarray": { "version": "1.0.0", @@ -1018,6 +892,21 @@ "from": "builtin-modules@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz" }, + "bytes": { + "version": "2.2.0", + "from": "bytes@2.2.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.2.0.tgz" + }, + "caller-path": { + "version": "0.1.0", + "from": "caller-path@>=0.1.0 <0.2.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz" + }, + "callsites": { + "version": "0.2.0", + "from": "callsites@>=0.2.0 <0.3.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz" + }, "camelcase": { "version": "2.1.0", "from": "camelcase@>=2.0.0 <3.0.0", @@ -1028,31 +917,48 @@ "from": "camelcase-keys@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.0.0.tgz" }, + "caniuse-db": { + "version": "1.0.30000419", + "from": "caniuse-db@>=1.0.30000409 <2.0.0", + "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000419.tgz" + }, "caseless": { "version": "0.11.0", "from": "caseless@>=0.11.0 <0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz" }, "center-align": { - "version": "0.1.2", + "version": "0.1.3", "from": "center-align@>=0.1.1 <0.2.0", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.2.tgz" + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz" }, "chalk": { "version": "1.1.1", "from": "chalk@1.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.1.tgz" + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.1.tgz", + "dependencies": { + "supports-color": { + "version": "2.0.0", + "from": "supports-color@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz" + } + } }, "chokidar": { - "version": "1.4.2", + "version": "1.4.3", "from": "chokidar@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.4.2.tgz" + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.4.3.tgz" }, "cipher-base": { "version": "1.0.2", "from": "cipher-base@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.2.tgz" }, + "clap": { + "version": "1.0.10", + "from": "clap@>=1.0.9 <2.0.0", + "resolved": "https://registry.npmjs.org/clap/-/clap-1.0.10.tgz" + }, "cli-cursor": { "version": "1.0.2", "from": "cli-cursor@>=1.0.1 <2.0.0", @@ -1061,12 +967,19 @@ "cli-table": { "version": "0.3.1", "from": "cli-table@>=0.3.1 <0.4.0", - "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.1.tgz" + "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.1.tgz", + "dependencies": { + "colors": { + "version": "1.0.3", + "from": "colors@1.0.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz" + } + } }, "cli-width": { - "version": "1.1.0", - "from": "cli-width@>=1.0.1 <2.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-1.1.0.tgz" + "version": "2.1.0", + "from": "cli-width@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.1.0.tgz" }, "cliui": { "version": "2.1.0", @@ -1085,15 +998,52 @@ "from": "clone@>=1.0.2 <2.0.0", "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.2.tgz" }, + "coa": { + "version": "1.0.1", + "from": "coa@>=1.0.1 <1.1.0", + "resolved": "https://registry.npmjs.org/coa/-/coa-1.0.1.tgz" + }, "code-point-at": { "version": "1.0.0", "from": "code-point-at@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.0.0.tgz" }, + "color": { + "version": "0.11.1", + "from": "color@>=0.11.0 <0.12.0", + "resolved": "https://registry.npmjs.org/color/-/color-0.11.1.tgz", + "dependencies": { + "color-convert": { + "version": "0.5.3", + "from": "color-convert@>=0.5.3 <0.6.0", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-0.5.3.tgz" + } + } + }, + "color-convert": { + "version": "1.0.0", + "from": "color-convert@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.0.0.tgz" + }, + "color-name": { + "version": "1.1.1", + "from": "color-name@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.1.tgz" + }, + "color-string": { + "version": "0.3.0", + "from": "color-string@>=0.3.0 <0.4.0", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-0.3.0.tgz" + }, + "colormin": { + "version": "1.1.0", + "from": "colormin@>=1.0.5 <2.0.0", + "resolved": "https://registry.npmjs.org/colormin/-/colormin-1.1.0.tgz" + }, "colors": { - "version": "1.0.3", - "from": "colors@1.0.3", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz" + "version": "1.1.2", + "from": "colors@>=1.1.2 <1.2.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz" }, "combined-stream": { "version": "1.0.5", @@ -1115,6 +1065,16 @@ "from": "commoner@>=0.10.3 <0.11.0", "resolved": "https://registry.npmjs.org/commoner/-/commoner-0.10.4.tgz" }, + "compressible": { + "version": "2.0.7", + "from": "compressible@>=2.0.7 <2.1.0", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.7.tgz" + }, + "compression": { + "version": "1.6.1", + "from": "compression@>=1.5.2 <2.0.0", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.6.1.tgz" + }, "concat-map": { "version": "0.0.1", "from": "concat-map@0.0.1", @@ -1125,6 +1085,16 @@ "from": "concat-stream@>=1.4.6 <2.0.0", "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.5.1.tgz" }, + "config-chain": { + "version": "1.1.10", + "from": "config-chain@>=1.1.8 <1.2.0", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.10.tgz" + }, + "connect-history-api-fallback": { + "version": "1.1.0", + "from": "connect-history-api-fallback@1.1.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.1.0.tgz" + }, "console-browserify": { "version": "1.1.0", "from": "console-browserify@>=1.1.0 <2.0.0", @@ -1135,10 +1105,30 @@ "from": "constants-browserify@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz" }, + "content-disposition": { + "version": "0.5.1", + "from": "content-disposition@0.5.1", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.1.tgz" + }, + "content-type": { + "version": "1.0.1", + "from": "content-type@>=1.0.1 <1.1.0", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.1.tgz" + }, "convert-source-map": { - "version": "1.1.3", + "version": "1.2.0", "from": "convert-source-map@>=1.1.0 <2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz" + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.2.0.tgz" + }, + "cookie": { + "version": "0.1.5", + "from": "cookie@0.1.5", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.1.5.tgz" + }, + "cookie-signature": { + "version": "1.0.6", + "from": "cookie-signature@1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz" }, "core-js": { "version": "1.2.6", @@ -1165,6 +1155,16 @@ "from": "create-hmac@>=1.1.0 <2.0.0", "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.4.tgz" }, + "cross-spawn": { + "version": "2.1.5", + "from": "cross-spawn@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-2.1.5.tgz" + }, + "cross-spawn-async": { + "version": "2.1.9", + "from": "cross-spawn-async@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/cross-spawn-async/-/cross-spawn-async-2.1.9.tgz" + }, "cryptiles": { "version": "2.0.5", "from": "cryptiles@>=2.0.0 <3.0.0", @@ -1175,6 +1175,48 @@ "from": "crypto-browserify@>=3.11.0 <4.0.0", "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.11.0.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", + "dependencies": { + "source-map": { + "version": "0.1.43", + "from": "source-map@>=0.1.38 <0.2.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz" + } + } + }, + "css-color-names": { + "version": "0.0.3", + "from": "css-color-names@0.0.3", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.3.tgz" + }, + "css-loader": { + "version": "0.23.1", + "from": "css-loader@>=0.23.1 <0.24.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-0.23.1.tgz" + }, + "css-selector-tokenizer": { + "version": "0.5.4", + "from": "css-selector-tokenizer@>=0.5.1 <0.6.0", + "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.5.4.tgz" + }, + "cssesc": { + "version": "0.1.0", + "from": "cssesc@>=0.1.0 <0.2.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz" + }, + "cssnano": { + "version": "3.5.2", + "from": "cssnano@>=2.6.1 <4.0.0", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-3.5.2.tgz" + }, + "csso": { + "version": "1.4.4", + "from": "csso@>=1.4.2 <1.5.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-1.4.4.tgz" + }, "cycle": { "version": "1.0.3", "from": "cycle@>=1.0.0 <1.1.0", @@ -1186,14 +1228,14 @@ "resolved": "https://registry.npmjs.org/d/-/d-0.1.1.tgz" }, "dashdash": { - "version": "1.12.2", + "version": "1.13.0", "from": "dashdash@>=1.10.1 <2.0.0", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.12.2.tgz", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.13.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" + "version": "1.0.0", + "from": "assert-plus@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" } } }, @@ -1208,9 +1250,9 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz" }, "decamelize": { - "version": "1.1.2", - "from": "decamelize@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.1.2.tgz" + "version": "1.2.0", + "from": "decamelize@>=1.1.2 <2.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz" }, "deep-equal": { "version": "1.0.1", @@ -1239,7 +1281,7 @@ }, "esprima-fb": { "version": "15001.1001.0-dev-harmony-fb", - "from": "esprima-fb@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" }, "window-size": { @@ -1264,42 +1306,62 @@ "from": "delayed-stream@>=1.0.0 <1.1.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" }, + "delegates": { + "version": "1.0.0", + "from": "delegates@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz" + }, + "depd": { + "version": "1.1.0", + "from": "depd@>=1.1.0 <1.2.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.0.tgz" + }, "des.js": { "version": "1.0.0", "from": "des.js@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz" }, + "destroy": { + "version": "1.0.4", + "from": "destroy@>=1.0.4 <1.1.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz" + }, "detect-indent": { "version": "3.0.1", "from": "detect-indent@>=3.0.1 <4.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-3.0.1.tgz", - "dependencies": { - "minimist": { - "version": "1.2.0", - "from": "minimist@>=1.1.0 <2.0.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz" - } - } + "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" + } + } }, "diffie-hellman": { - "version": "5.0.1", + "version": "5.0.2", "from": "diffie-hellman@>=5.0.0 <6.0.0", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.1.tgz" + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.2.tgz" }, "doctrine": { - "version": "0.7.2", - "from": "doctrine@>=0.7.1 <0.8.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-0.7.2.tgz", + "version": "1.2.0", + "from": "doctrine@>=1.2.0 <2.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.2.0.tgz", "dependencies": { "esutils": { "version": "1.1.6", "from": "esutils@>=1.1.6 <2.0.0", "resolved": "https://registry.npmjs.org/esutils/-/esutils-1.1.6.tgz" + }, + "isarray": { + "version": "1.0.0", + "from": "isarray@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" } } }, @@ -1320,6 +1382,11 @@ } } }, + "dom-walk": { + "version": "0.1.1", + "from": "dom-walk@>=0.1.0 <0.2.0", + "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.1.tgz" + }, "domain-browser": { "version": "1.1.7", "from": "domain-browser@>=1.1.1 <2.0.0", @@ -1345,10 +1412,15 @@ "from": "ecc-jsbn@>=0.0.1 <1.0.0", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz" }, + "ee-first": { + "version": "1.1.1", + "from": "ee-first@1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" + }, "elliptic": { - "version": "6.2.1", + "version": "6.2.3", "from": "elliptic@>=6.0.0 <7.0.0", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.2.1.tgz" + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.2.3.tgz" }, "enhanced-resolve": { "version": "0.9.1", @@ -1388,9 +1460,9 @@ "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.11.tgz" }, "es5-shim": { - "version": "4.5.2", - "from": "es5-shim@>=4.5.2 <5.0.0", - "resolved": "https://registry.npmjs.org/es5-shim/-/es5-shim-4.5.2.tgz" + "version": "4.5.7", + "from": "es5-shim@>=4.5.7 <5.0.0", + "resolved": "https://registry.npmjs.org/es5-shim/-/es5-shim-4.5.7.tgz" }, "es6-iterator": { "version": "2.0.0", @@ -1399,7 +1471,7 @@ }, "es6-map": { "version": "0.1.3", - "from": "es6-map@>=0.1.2 <0.2.0", + "from": "es6-map@>=0.1.3 <0.2.0", "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.3.tgz" }, "es6-set": { @@ -1417,58 +1489,76 @@ "from": "es6-weak-map@>=2.0.1 <3.0.0", "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.1.tgz" }, + "escape-html": { + "version": "1.0.3", + "from": "escape-html@>=1.0.3 <1.1.0", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" + }, "escape-string-regexp": { - "version": "1.0.4", + "version": "1.0.5", "from": "escape-string-regexp@>=1.0.2 <2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.4.tgz" + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" }, "escope": { - "version": "3.3.0", - "from": "escope@>=3.3.0 <4.0.0", - "resolved": "https://registry.npmjs.org/escope/-/escope-3.3.0.tgz" + "version": "3.5.0", + "from": "escope@>=3.5.0 <4.0.0", + "resolved": "https://registry.npmjs.org/escope/-/escope-3.5.0.tgz" + }, + "eslint-config-airbnb": { + "version": "6.1.0", + "from": "eslint-config-airbnb@>=6.0.2 <7.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-6.1.0.tgz" + }, + "espree": { + "version": "3.1.1", + "from": "espree@>=3.1.1 <4.0.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-3.1.1.tgz" }, "esprima": { - "version": "2.7.1", + "version": "2.7.2", "from": "esprima@>=2.6.0 <3.0.0", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.1.tgz" + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.2.tgz" }, "esrecurse": { - "version": "3.1.1", - "from": "esrecurse@>=3.1.1 <4.0.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-3.1.1.tgz", - "dependencies": { - "estraverse": { - "version": "3.1.0", - "from": "estraverse@>=3.1.0 <3.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-3.1.0.tgz" - } - } + "version": "4.0.0", + "from": "esrecurse@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.0.0.tgz" }, "estraverse": { "version": "4.1.1", "from": "estraverse@>=4.1.1 <5.0.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.1.1.tgz" }, - "estraverse-fb": { - "version": "1.3.1", - "from": "estraverse-fb@>=1.3.1 <2.0.0", - "resolved": "https://registry.npmjs.org/estraverse-fb/-/estraverse-fb-1.3.1.tgz" - }, "esutils": { "version": "2.0.2", "from": "esutils@>=2.0.2 <3.0.0", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz" }, + "etag": { + "version": "1.7.0", + "from": "etag@>=1.7.0 <1.8.0", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.7.0.tgz" + }, "event-emitter": { "version": "0.3.4", "from": "event-emitter@>=0.3.4 <0.4.0", "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.4.tgz" }, + "eventemitter3": { + "version": "1.1.1", + "from": "eventemitter3@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.1.1.tgz" + }, "events": { "version": "1.1.0", "from": "events@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/events/-/events-1.1.0.tgz" }, + "eventsource": { + "version": "0.1.6", + "from": "eventsource@>=0.1.3 <0.2.0", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-0.1.6.tgz" + }, "evp_bytestokey": { "version": "1.0.0", "from": "evp_bytestokey@>=1.0.0 <2.0.0", @@ -1499,6 +1589,33 @@ "from": "expose-loader@>=0.7.1 <0.8.0", "resolved": "https://registry.npmjs.org/expose-loader/-/expose-loader-0.7.1.tgz" }, + "express": { + "version": "4.13.4", + "from": "express@>=4.13.3 <5.0.0", + "resolved": "https://registry.npmjs.org/express/-/express-4.13.4.tgz", + "dependencies": { + "accepts": { + "version": "1.2.13", + "from": "accepts@>=1.2.12 <1.3.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.2.13.tgz" + }, + "negotiator": { + "version": "0.5.3", + "from": "negotiator@0.5.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.5.3.tgz" + }, + "qs": { + "version": "4.0.0", + "from": "qs@4.0.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-4.0.0.tgz" + }, + "vary": { + "version": "1.0.1", + "from": "vary@>=1.0.1 <1.1.0", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.0.1.tgz" + } + } + }, "extend": { "version": "3.0.0", "from": "extend@>=3.0.0 <3.1.0", @@ -1509,6 +1626,11 @@ "from": "extglob@>=0.3.1 <0.4.0", "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz" }, + "extract-text-webpack-plugin": { + "version": "1.0.1", + "from": "extract-text-webpack-plugin@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/extract-text-webpack-plugin/-/extract-text-webpack-plugin-1.0.1.tgz" + }, "extsprintf": { "version": "1.0.2", "from": "extsprintf@1.0.2", @@ -1520,9 +1642,19 @@ "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz" }, "fast-levenshtein": { - "version": "1.0.7", - "from": "fast-levenshtein@>=1.0.6 <1.1.0", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-1.0.7.tgz" + "version": "1.1.3", + "from": "fast-levenshtein@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-1.1.3.tgz" + }, + "fastparse": { + "version": "1.1.1", + "from": "fastparse@>=1.1.1 <2.0.0", + "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.1.tgz" + }, + "faye-websocket": { + "version": "0.9.4", + "from": "faye-websocket@>=0.9.3 <0.10.0", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.9.4.tgz" }, "fbjs": { "version": "0.6.1", @@ -1539,6 +1671,11 @@ "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" }, + "file-loader": { + "version": "0.8.5", + "from": "file-loader@>=0.8.5 <0.9.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-0.8.5.tgz" + }, "filename-regex": { "version": "2.0.0", "from": "filename-regex@>=2.0.0 <3.0.0", @@ -1549,10 +1686,15 @@ "from": "fill-range@>=2.1.0 <3.0.0", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz" }, + "finalhandler": { + "version": "0.4.1", + "from": "finalhandler@0.4.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.4.1.tgz" + }, "find-up": { - "version": "1.1.0", + "version": "1.1.2", "from": "find-up@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.0.tgz", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", "dependencies": { "path-exists": { "version": "2.1.0", @@ -1571,6 +1713,11 @@ "from": "flat-cache@>=1.0.9 <2.0.0", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.0.10.tgz" }, + "flatten": { + "version": "1.0.2", + "from": "flatten@1.0.2", + "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.2.tgz" + }, "for-in": { "version": "0.1.4", "from": "for-in@>=0.1.4 <0.2.0", @@ -1591,20 +1738,30 @@ "from": "form-data@>=1.0.0-rc3 <1.1.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-1.0.0-rc3.tgz" }, + "forwarded": { + "version": "0.1.0", + "from": "forwarded@>=0.1.0 <0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.0.tgz" + }, + "fresh": { + "version": "0.3.0", + "from": "fresh@0.3.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.3.0.tgz" + }, "fs-readdir-recursive": { "version": "0.1.2", "from": "fs-readdir-recursive@>=0.1.0 <0.2.0", "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-0.1.2.tgz" }, "fsevents": { - "version": "1.0.6", + "version": "1.0.8", "from": "fsevents@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.0.6.tgz", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.0.8.tgz", "dependencies": { "ansi": { - "version": "0.3.0", - "from": "ansi@~0.3.0", - "resolved": "https://registry.npmjs.org/ansi/-/ansi-0.3.0.tgz" + "version": "0.3.1", + "from": "ansi@~0.3.1", + "resolved": "https://registry.npmjs.org/ansi/-/ansi-0.3.1.tgz" }, "ansi-regex": { "version": "2.0.0", @@ -1617,9 +1774,9 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.1.0.tgz" }, "are-we-there-yet": { - "version": "1.0.4", - "from": "are-we-there-yet@~1.0.0", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.0.4.tgz" + "version": "1.0.6", + "from": "are-we-there-yet@~1.0.6", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.0.6.tgz" }, "asn1": { "version": "0.2.3", @@ -1627,64 +1784,37 @@ "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz" }, "assert-plus": { - "version": "0.1.5", - "from": "assert-plus@^0.1.5", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz" + "version": "0.2.0", + "from": "assert-plus@^0.2.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz" }, "async": { - "version": "1.5.0", + "version": "1.5.2", "from": "async@^1.4.0", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.0.tgz" + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz" }, "aws-sign2": { "version": "0.6.0", "from": "aws-sign2@~0.6.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz" }, - "bl": { - "version": "1.0.0", - "from": "bl@~1.0.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.0.0.tgz", + "aws4": { + "version": "1.2.1", + "from": "aws4@^1.2.1", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.2.1.tgz", "dependencies": { - "readable-stream": { - "version": "2.0.4", - "from": "readable-stream@~2.0.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.4.tgz", - "dependencies": { - "core-util-is": { - "version": "1.0.2", - "from": "core-util-is@~1.0.0", - "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", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" - }, - "isarray": { - "version": "0.0.1", - "from": "isarray@0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" - }, - "process-nextick-args": { - "version": "1.0.3", - "from": "process-nextick-args@~1.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.3.tgz" - }, - "string_decoder": { - "version": "0.10.31", - "from": "string_decoder@~0.10.x", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" - }, - "util-deprecate": { - "version": "1.0.2", - "from": "util-deprecate@~1.0.1", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" - } - } + "lru-cache": { + "version": "2.7.3", + "from": "lru-cache@^2.6.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz" } } }, + "bl": { + "version": "1.0.2", + "from": "bl@~1.0.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.0.2.tgz" + }, "block-stream": { "version": "0.0.8", "from": "block-stream@*", @@ -1726,19 +1856,19 @@ "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz" }, "dashdash": { - "version": "1.10.1", + "version": "1.12.2", "from": "dashdash@>=1.10.1 <2.0.0", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.10.1.tgz" + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.12.2.tgz" }, "debug": { - "version": "0.7.4", - "from": "debug@~0.7.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-0.7.4.tgz" + "version": "2.2.0", + "from": "debug@~2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz" }, "deep-extend": { - "version": "0.4.0", + "version": "0.4.1", "from": "deep-extend@~0.4.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.0.tgz" + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.1.tgz" }, "delayed-stream": { "version": "1.0.0", @@ -1746,9 +1876,9 @@ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" }, "delegates": { - "version": "0.1.0", - "from": "delegates@^0.1.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-0.1.0.tgz" + "version": "1.0.0", + "from": "delegates@^1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz" }, "ecc-jsbn": { "version": "0.1.1", @@ -1756,9 +1886,9 @@ "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz" }, "escape-string-regexp": { - "version": "1.0.3", + "version": "1.0.4", "from": "escape-string-regexp@^1.0.2", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.3.tgz" + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.4.tgz" }, "extend": { "version": "3.0.0", @@ -1796,14 +1926,14 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.0.tgz", "dependencies": { "brace-expansion": { - "version": "1.1.1", + "version": "1.1.2", "from": "brace-expansion@^1.0.0", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.1.tgz", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.2.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" + "version": "0.3.0", + "from": "balanced-match@^0.3.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.3.0.tgz" }, "concat-map": { "version": "0.0.1", @@ -1817,9 +1947,9 @@ } }, "gauge": { - "version": "1.2.2", - "from": "gauge@~1.2.0", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-1.2.2.tgz" + "version": "1.2.5", + "from": "gauge@~1.2.5", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-1.2.5.tgz" }, "generate-function": { "version": "2.0.0", @@ -1832,9 +1962,9 @@ "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz" }, "graceful-fs": { - "version": "4.1.2", - "from": "graceful-fs@4.1", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.2.tgz" + "version": "4.1.3", + "from": "graceful-fs@^4.1.2", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.3.tgz" }, "graceful-readlink": { "version": "1.0.1", @@ -1842,9 +1972,9 @@ "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz" }, "har-validator": { - "version": "2.0.3", - "from": "har-validator@~2.0.2", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.3.tgz" + "version": "2.0.6", + "from": "har-validator@~2.0.6", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz" }, "has-ansi": { "version": "2.0.0", @@ -1852,14 +1982,14 @@ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz" }, "has-unicode": { - "version": "1.0.1", - "from": "has-unicode@^1.0.0", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-1.0.1.tgz" + "version": "2.0.0", + "from": "has-unicode@^2.0.0", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.0.tgz" }, "hawk": { - "version": "3.1.2", + "version": "3.1.3", "from": "hawk@~3.1.0", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.2.tgz" + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz" }, "hoek": { "version": "2.16.3", @@ -1867,9 +1997,9 @@ "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz" }, "http-signature": { - "version": "1.1.0", + "version": "1.1.1", "from": "http-signature@~1.1.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.0.tgz" + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz" }, "inherits": { "version": "2.0.1", @@ -1882,9 +2012,9 @@ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz" }, "is-my-json-valid": { - "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" + "version": "2.12.4", + "from": "is-my-json-valid@^2.12.4", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.12.4.tgz" }, "is-property": { "version": "1.0.2", @@ -1946,10 +2076,15 @@ "from": "lodash._createpadding@^3.0.0", "resolved": "https://registry.npmjs.org/lodash._createpadding/-/lodash._createpadding-3.6.1.tgz" }, + "lodash._root": { + "version": "3.0.0", + "from": "lodash._root@^3.0.0", + "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.0.tgz" + }, "lodash.pad": { - "version": "3.1.1", + "version": "3.3.0", "from": "lodash.pad@^3.0.0", - "resolved": "https://registry.npmjs.org/lodash.pad/-/lodash.pad-3.1.1.tgz" + "resolved": "https://registry.npmjs.org/lodash.pad/-/lodash.pad-3.3.0.tgz" }, "lodash.padleft": { "version": "3.1.1", @@ -1962,19 +2097,19 @@ "resolved": "https://registry.npmjs.org/lodash.padright/-/lodash.padright-3.1.1.tgz" }, "lodash.repeat": { - "version": "3.0.1", + "version": "3.2.0", "from": "lodash.repeat@^3.0.0", - "resolved": "https://registry.npmjs.org/lodash.repeat/-/lodash.repeat-3.0.1.tgz" + "resolved": "https://registry.npmjs.org/lodash.repeat/-/lodash.repeat-3.2.0.tgz" }, "mime-db": { - "version": "1.19.0", - "from": "mime-db@~1.19.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.19.0.tgz" + "version": "1.21.0", + "from": "mime-db@~1.21.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.21.0.tgz" }, "mime-types": { - "version": "2.1.7", + "version": "2.1.9", "from": "mime-types@~2.1.7", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.7.tgz" + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.9.tgz" }, "minimist": { "version": "0.0.8", @@ -1986,10 +2121,15 @@ "from": "mkdirp@>=0.3.0 <0.4.0||>=0.4.0 <0.5.0||>=0.5.0 <0.6.0", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz" }, + "ms": { + "version": "0.7.1", + "from": "ms@0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz" + }, "node-pre-gyp": { - "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", + "version": "0.6.21", + "from": "node-pre-gyp@>=0.6.21 <0.7.0", + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.6.21.tgz", "dependencies": { "nopt": { "version": "3.0.6", @@ -2011,39 +2151,44 @@ "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.7.tgz" }, "npmlog": { - "version": "2.0.0", + "version": "2.0.2", "from": "npmlog@~2.0.0", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-2.0.0.tgz" + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-2.0.2.tgz" }, "oauth-sign": { - "version": "0.8.0", + "version": "0.8.1", "from": "oauth-sign@~0.8.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.0.tgz" + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.1.tgz" }, "once": { - "version": "1.1.1", - "from": "once@~1.1.1", - "resolved": "https://registry.npmjs.org/once/-/once-1.1.1.tgz" + "version": "1.3.3", + "from": "once@~1.3.3", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz" }, "pinkie": { - "version": "2.0.1", + "version": "2.0.4", "from": "pinkie@^2.0.0", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.1.tgz" + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz" }, "pinkie-promise": { "version": "2.0.0", "from": "pinkie-promise@^2.0.0", "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.0.tgz" }, + "process-nextick-args": { + "version": "1.0.6", + "from": "process-nextick-args@~1.0.6", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.6.tgz" + }, "qs": { - "version": "5.2.0", - "from": "qs@~5.2.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-5.2.0.tgz" + "version": "6.0.2", + "from": "qs@~6.0.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.0.2.tgz" }, "rc": { - "version": "1.1.5", + "version": "1.1.6", "from": "rc@~1.1.0", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.1.5.tgz", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.1.6.tgz", "dependencies": { "minimist": { "version": "1.2.0", @@ -2053,24 +2198,24 @@ } }, "readable-stream": { - "version": "1.1.13", - "from": "readable-stream@^1.1.13", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.13.tgz" + "version": "2.0.5", + "from": "readable-stream@^2.0.0 || ^1.1.13", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.5.tgz" }, "request": { - "version": "2.67.0", + "version": "2.69.0", "from": "request@2.x", - "resolved": "https://registry.npmjs.org/request/-/request-2.67.0.tgz" + "resolved": "https://registry.npmjs.org/request/-/request-2.69.0.tgz" }, "rimraf": { - "version": "2.4.4", - "from": "rimraf@~2.4.0", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.4.tgz", + "version": "2.5.1", + "from": "rimraf@~2.5.0", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.5.1.tgz", "dependencies": { "glob": { - "version": "5.0.15", - "from": "glob@^5.0.14", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "version": "6.0.4", + "from": "glob@^6.0.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", "dependencies": { "inflight": { "version": "1.0.4", @@ -2095,14 +2240,14 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.0.tgz", "dependencies": { "brace-expansion": { - "version": "1.1.1", + "version": "1.1.2", "from": "brace-expansion@^1.0.0", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.1.tgz", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.2.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" + "version": "0.3.0", + "from": "balanced-match@^0.3.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.3.0.tgz" }, "concat-map": { "version": "0.0.1", @@ -2145,16 +2290,9 @@ "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz" }, "sshpk": { - "version": "1.7.0", + "version": "1.7.3", "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" - } - } + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.7.3.tgz" }, "string_decoder": { "version": "0.10.31", @@ -2187,43 +2325,9 @@ "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz" }, "tar-pack": { - "version": "3.1.0", + "version": "3.1.3", "from": "tar-pack@~3.1.0", - "resolved": "https://registry.npmjs.org/tar-pack/-/tar-pack-3.1.0.tgz", - "dependencies": { - "readable-stream": { - "version": "1.0.33", - "from": "readable-stream@~1.0.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.33.tgz", - "dependencies": { - "core-util-is": { - "version": "1.0.2", - "from": "core-util-is@~1.0.0", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" - }, - "inherits": { - "version": "2.0.1", - "from": "inherits@~2.0.0", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" - }, - "isarray": { - "version": "0.0.1", - "from": "isarray@0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" - }, - "string_decoder": { - "version": "0.10.31", - "from": "string_decoder@~0.10.x", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" - } - } - }, - "rimraf": { - "version": "2.2.8", - "from": "rimraf@~2.2.0", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz" - } - } + "resolved": "https://registry.npmjs.org/tar-pack/-/tar-pack-3.1.3.tgz" }, "tough-cookie": { "version": "2.2.1", @@ -2231,25 +2335,35 @@ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.2.1.tgz" }, "tunnel-agent": { - "version": "0.4.1", + "version": "0.4.2", "from": "tunnel-agent@~0.4.1", - "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", + "version": "0.13.3", "from": "tweetnacl@>=0.13.0 <1.0.0", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.13.2.tgz" + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.13.3.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" + "version": "0.0.6", + "from": "uid-number@~0.0.6", + "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz" + }, + "util-deprecate": { + "version": "1.0.2", + "from": "util-deprecate@~1.0.1", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" }, "verror": { "version": "1.3.6", "from": "verror@1.3.6", "resolved": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz" }, + "wrappy": { + "version": "1.0.1", + "from": "wrappy@1", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz" + }, "xtend": { "version": "4.0.1", "from": "xtend@^4.0.0", @@ -2257,6 +2371,21 @@ } } }, + "fstream": { + "version": "1.0.8", + "from": "fstream@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.8.tgz" + }, + "gauge": { + "version": "1.2.7", + "from": "gauge@>=1.2.5 <1.3.0", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-1.2.7.tgz" + }, + "gaze": { + "version": "0.5.2", + "from": "gaze@>=0.5.1 <0.6.0", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-0.5.2.tgz" + }, "generate-function": { "version": "2.0.0", "from": "generate-function@>=2.0.0 <3.0.0", @@ -2287,6 +2416,18 @@ "from": "glob-parent@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz" }, + "global": { + "version": "4.3.0", + "from": "global@>=4.3.0 <5.0.0", + "resolved": "https://registry.npmjs.org/global/-/global-4.3.0.tgz", + "dependencies": { + "process": { + "version": "0.5.2", + "from": "process@>=0.5.1 <0.6.0", + "resolved": "https://registry.npmjs.org/process/-/process-0.5.2.tgz" + } + } + }, "globals": { "version": "8.18.0", "from": "globals@>=8.3.0 <9.0.0", @@ -2298,62 +2439,63 @@ "resolved": "https://registry.npmjs.org/globby/-/globby-4.0.0.tgz", "dependencies": { "glob": { - "version": "6.0.3", + "version": "6.0.4", "from": "glob@>=6.0.1 <7.0.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.3.tgz", - "dependencies": { - "inflight": { - "version": "1.0.4", - "from": "inflight@>=1.0.4 <2.0.0", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.4.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.3", - "from": "once@>=1.3.0 <2.0.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz" - } - } + "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz" + } + } + }, + "globule": { + "version": "0.1.0", + "from": "globule@>=0.1.0 <0.2.0", + "resolved": "https://registry.npmjs.org/globule/-/globule-0.1.0.tgz", + "dependencies": { + "glob": { + "version": "3.1.21", + "from": "glob@>=3.1.21 <3.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz" + }, + "graceful-fs": { + "version": "1.2.3", + "from": "graceful-fs@>=1.2.0 <1.3.0", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz" + }, + "inherits": { + "version": "1.0.2", + "from": "inherits@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz" + }, + "lodash": { + "version": "1.0.2", + "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", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz" } } }, "graceful-fs": { - "version": "4.1.2", + "version": "4.1.3", "from": "graceful-fs@>=4.1.2 <5.0.0", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.2.tgz" + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.3.tgz" }, "graceful-readlink": { "version": "1.0.1", "from": "graceful-readlink@>=1.0.0", "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz" }, - "handlebars": { - "version": "4.0.5", - "from": "handlebars@>=4.0.0 <5.0.0", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.5.tgz", - "dependencies": { - "source-map": { - "version": "0.4.4", - "from": "source-map@>=0.4.4 <0.5.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz" - } - } - }, "har-validator": { "version": "2.0.6", - "from": "har-validator@>=2.0.2 <2.1.0", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", - "dependencies": { - "is-my-json-valid": { - "version": "2.12.4", - "from": "is-my-json-valid@>=2.12.4 <3.0.0", - "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.12.4.tgz" - } - } + "from": "har-validator@>=2.0.6 <2.1.0", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz" }, "has-ansi": { "version": "2.0.0", @@ -2370,6 +2512,16 @@ "from": "has-flag@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" }, + "has-own": { + "version": "1.0.0", + "from": "has-own@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/has-own/-/has-own-1.0.0.tgz" + }, + "has-unicode": { + "version": "2.0.0", + "from": "has-unicode@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.0.tgz" + }, "hash.js": { "version": "1.0.3", "from": "hash.js@>=1.0.0 <2.0.0", @@ -2381,9 +2533,9 @@ "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz" }, "history": { - "version": "2.0.0-rc2", - "from": "history@>=2.0.0-rc2 <3.0.0", - "resolved": "https://registry.npmjs.org/history/-/history-2.0.0-rc2.tgz" + "version": "2.0.1", + "from": "history@>=2.0.1 <3.0.0", + "resolved": "https://registry.npmjs.org/history/-/history-2.0.1.tgz" }, "hoek": { "version": "2.16.3", @@ -2391,9 +2543,9 @@ "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz" }, "hoist-non-react-statics": { - "version": "1.0.3", + "version": "1.0.5", "from": "hoist-non-react-statics@>=1.0.3 <2.0.0", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-1.0.3.tgz" + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-1.0.5.tgz" }, "home-or-tmp": { "version": "1.0.0", @@ -2422,10 +2574,20 @@ "from": "http-browserify@>=1.3.2 <2.0.0", "resolved": "https://registry.npmjs.org/http-browserify/-/http-browserify-1.7.0.tgz" }, + "http-errors": { + "version": "1.4.0", + "from": "http-errors@>=1.4.0 <1.5.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.4.0.tgz" + }, + "http-proxy": { + "version": "1.13.2", + "from": "http-proxy@>=1.11.2 <2.0.0", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.13.2.tgz" + }, "http-signature": { - "version": "1.1.0", + "version": "1.1.1", "from": "http-signature@>=1.1.0 <1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.0.tgz" + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz" }, "https-browserify": { "version": "0.0.1", @@ -2439,14 +2601,36 @@ }, "iconv-lite": { "version": "0.4.13", - "from": "iconv-lite@>=0.4.5 <0.5.0", + "from": "iconv-lite@0.4.13", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz" }, + "icss-replace-symbols": { + "version": "1.0.2", + "from": "icss-replace-symbols@>=1.0.2 <2.0.0", + "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.0.2.tgz" + }, "ieee754": { "version": "1.1.6", "from": "ieee754@>=1.1.4 <2.0.0", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.6.tgz" }, + "ignore": { + "version": "2.2.19", + "from": "ignore@>=2.2.19 <3.0.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-2.2.19.tgz" + }, + "imports-loader": { + "version": "0.6.5", + "from": "imports-loader@>=0.6.5 <0.7.0", + "resolved": "https://registry.npmjs.org/imports-loader/-/imports-loader-0.6.5.tgz", + "dependencies": { + "source-map": { + "version": "0.1.43", + "from": "source-map@>=0.1.0 <0.2.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz" + } + } + }, "indent-string": { "version": "2.1.0", "from": "indent-string@>=2.1.0 <3.0.0", @@ -2459,6 +2643,11 @@ } } }, + "indexes-of": { + "version": "1.0.1", + "from": "indexes-of@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz" + }, "indexof": { "version": "0.0.1", "from": "indexof@0.0.1", @@ -2469,15 +2658,32 @@ "from": "inflight@>=1.0.4 <2.0.0", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.4.tgz" }, + "inherit": { + "version": "2.2.3", + "from": "inherit@>=2.2.2 <3.0.0", + "resolved": "https://registry.npmjs.org/inherit/-/inherit-2.2.3.tgz" + }, "inherits": { "version": "2.0.1", "from": "inherits@>=2.0.1 <3.0.0", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" }, + "ini": { + "version": "1.3.4", + "from": "ini@>=1.2.0 <2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz" + }, "inquirer": { - "version": "0.11.0", - "from": "inquirer@>=0.11.0 <0.12.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.11.0.tgz" + "version": "0.12.0", + "from": "inquirer@>=0.12.0 <0.13.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz", + "dependencies": { + "lodash": { + "version": "4.6.1", + "from": "lodash@>=4.3.0 <5.0.0", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.6.1.tgz" + } + } }, "interpret": { "version": "0.6.6", @@ -2494,6 +2700,21 @@ "from": "invert-kv@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz" }, + "ipaddr.js": { + "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", + "from": "is-absolute@>=0.1.7 <0.2.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-0.1.7.tgz" + }, + "is-absolute-url": { + "version": "2.0.0", + "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-arrayish": { "version": "0.2.1", "from": "is-arrayish@>=0.2.1 <0.3.0", @@ -2555,9 +2776,9 @@ "resolved": "https://registry.npmjs.org/is-integer/-/is-integer-1.0.6.tgz" }, "is-my-json-valid": { - "version": "2.12.3", - "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" + "version": "2.13.1", + "from": "is-my-json-valid@>=2.12.4 <3.0.0", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.13.1.tgz" }, "is-number": { "version": "2.1.0", @@ -2579,6 +2800,11 @@ "from": "is-path-inside@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.0.tgz" }, + "is-plain-obj": { + "version": "1.1.0", + "from": "is-plain-obj@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz" + }, "is-primitive": { "version": "2.0.0", "from": "is-primitive@>=2.0.0 <3.0.0", @@ -2589,11 +2815,21 @@ "from": "is-property@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz" }, + "is-relative": { + "version": "0.1.3", + "from": "is-relative@>=0.1.0 <0.2.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-0.1.3.tgz" + }, "is-resolvable": { "version": "1.0.0", "from": "is-resolvable@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.0.0.tgz" }, + "is-svg": { + "version": "1.1.1", + "from": "is-svg@>=1.1.1 <2.0.0", + "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-1.1.1.tgz" + }, "is-typedarray": { "version": "1.0.0", "from": "is-typedarray@>=1.0.0 <1.1.0", @@ -2609,6 +2845,11 @@ "from": "isarray@0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" }, + "isexe": { + "version": "1.1.2", + "from": "isexe@>=1.1.1 <2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-1.1.2.tgz" + }, "isobject": { "version": "2.0.0", "from": "isobject@>=2.0.0 <3.0.0", @@ -2625,24 +2866,29 @@ "resolved": "https://registry.npmjs.org/jodid25519/-/jodid25519-1.0.2.tgz" }, "jquery": { - "version": "2.2.0", - "from": "jquery@>=2.2.0 <3.0.0", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-2.2.0.tgz" + "version": "2.2.1", + "from": "jquery@>=2.2.1 <3.0.0", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-2.2.1.tgz" }, "jquery-ujs": { "version": "1.2.0", "from": "jquery-ujs@>=1.2.0 <2.0.0", "resolved": "https://registry.npmjs.org/jquery-ujs/-/jquery-ujs-1.2.0.tgz" }, + "js-base64": { + "version": "2.1.9", + "from": "js-base64@>=2.1.9 <3.0.0", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz" + }, "js-tokens": { "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.4.5", - "from": "js-yaml@3.4.5", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.4.5.tgz" + "version": "3.4.6", + "from": "js-yaml@>=3.4.3 <3.5.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.4.6.tgz" }, "jsbn": { "version": "0.1.0", @@ -2675,15 +2921,20 @@ "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.2.tgz" }, "json-stable-stringify": { - "version": "1.0.0", + "version": "1.0.1", "from": "json-stable-stringify@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.0.tgz" + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz" }, "json-stringify-safe": { "version": "5.0.1", "from": "json-stringify-safe@>=5.0.1 <5.1.0", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" }, + "json3": { + "version": "3.3.2", + "from": "json3@>=3.3.2 <4.0.0", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz" + }, "json5": { "version": "0.4.0", "from": "json5@>=0.4.0 <0.5.0", @@ -2737,9 +2988,9 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.0.2.tgz" }, "lazy-cache": { - "version": "0.2.7", - "from": "lazy-cache@>=0.2.4 <0.3.0", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz" + "version": "1.0.3", + "from": "lazy-cache@>=1.0.3 <2.0.0", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.3.tgz" }, "lcid": { "version": "1.0.0", @@ -2757,9 +3008,9 @@ "resolved": "https://registry.npmjs.org/leven/-/leven-1.0.2.tgz" }, "levn": { - "version": "0.2.5", - "from": "levn@>=0.2.5 <0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.2.5.tgz" + "version": "0.3.0", + "from": "levn@>=0.3.0 <0.4.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz" }, "line-numbers": { "version": "0.2.0", @@ -2773,7 +3024,7 @@ }, "loader-utils": { "version": "0.2.12", - "from": "loader-utils@>=0.2.11 <0.3.0", + "from": "loader-utils@>=0.2.12 <0.3.0", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.12.tgz" }, "lodash": { @@ -2781,41 +3032,21 @@ "from": "lodash@>=3.2.0 <4.0.0", "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz" }, - "lodash._arraycopy": { - "version": "3.0.0", - "from": "lodash._arraycopy@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/lodash._arraycopy/-/lodash._arraycopy-3.0.0.tgz" - }, - "lodash._arrayeach": { - "version": "3.0.0", - "from": "lodash._arrayeach@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/lodash._arrayeach/-/lodash._arrayeach-3.0.0.tgz" - }, - "lodash._arraymap": { - "version": "3.0.0", - "from": "lodash._arraymap@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/lodash._arraymap/-/lodash._arraymap-3.0.0.tgz" + "lodash-es": { + "version": "4.6.1", + "from": "lodash-es@>=4.2.1 <5.0.0", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.6.1.tgz" }, "lodash._baseassign": { "version": "3.2.0", "from": "lodash._baseassign@>=3.0.0 <4.0.0", "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz" }, - "lodash._baseclone": { - "version": "3.3.0", - "from": "lodash._baseclone@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/lodash._baseclone/-/lodash._baseclone-3.3.0.tgz" - }, "lodash._basecopy": { "version": "3.0.1", "from": "lodash._basecopy@>=3.0.0 <4.0.0", "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz" }, - "lodash._basedifference": { - "version": "3.0.3", - "from": "lodash._basedifference@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/lodash._basedifference/-/lodash._basedifference-3.0.3.tgz" - }, "lodash._baseflatten": { "version": "3.1.4", "from": "lodash._baseflatten@>=3.0.0 <4.0.0", @@ -2826,30 +3057,20 @@ "from": "lodash._basefor@>=3.0.0 <4.0.0", "resolved": "https://registry.npmjs.org/lodash._basefor/-/lodash._basefor-3.0.3.tgz" }, - "lodash._baseindexof": { - "version": "3.1.0", - "from": "lodash._baseindexof@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/lodash._baseindexof/-/lodash._baseindexof-3.1.0.tgz" - }, "lodash._bindcallback": { "version": "3.0.1", "from": "lodash._bindcallback@>=3.0.0 <4.0.0", "resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz" }, - "lodash._cacheindexof": { - "version": "3.0.2", - "from": "lodash._cacheindexof@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/lodash._cacheindexof/-/lodash._cacheindexof-3.0.2.tgz" - }, "lodash._createassigner": { "version": "3.1.1", "from": "lodash._createassigner@>=3.0.0 <4.0.0", "resolved": "https://registry.npmjs.org/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz" }, - "lodash._createcache": { - "version": "3.1.2", - "from": "lodash._createcache@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/lodash._createcache/-/lodash._createcache-3.1.2.tgz" + "lodash._createcompounder": { + "version": "3.0.0", + "from": "lodash._createcompounder@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/lodash._createcompounder/-/lodash._createcompounder-3.0.0.tgz" }, "lodash._getnative": { "version": "3.9.1", @@ -2871,36 +3092,41 @@ "from": "lodash._pickbycallback@>=3.0.0 <4.0.0", "resolved": "https://registry.npmjs.org/lodash._pickbycallback/-/lodash._pickbycallback-3.0.0.tgz" }, + "lodash._root": { + "version": "3.0.1", + "from": "lodash._root@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz" + }, "lodash.assign": { "version": "3.2.0", - "from": "lodash.assign@>=3.2.0 <4.0.0", + "from": "lodash.assign@>=3.0.0 <4.0.0", "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-3.2.0.tgz" }, - "lodash.clonedeep": { - "version": "3.0.2", - "from": "lodash.clonedeep@>=3.0.1 <4.0.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-3.0.2.tgz" + "lodash.camelcase": { + "version": "3.0.1", + "from": "lodash.camelcase@>=3.0.1 <4.0.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-3.0.1.tgz" + }, + "lodash.deburr": { + "version": "3.2.0", + "from": "lodash.deburr@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/lodash.deburr/-/lodash.deburr-3.2.0.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.5", + "version": "3.0.8", "from": "lodash.isarguments@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.0.5.tgz" + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.0.8.tgz" }, "lodash.isarray": { "version": "3.0.4", "from": "lodash.isarray@>=3.0.0 <4.0.0", "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz" }, - "lodash.isplainobject": { - "version": "3.2.0", - "from": "lodash.isplainobject@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-3.2.0.tgz" - }, - "lodash.istypedarray": { - "version": "3.0.2", - "from": "lodash.istypedarray@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/lodash.istypedarray/-/lodash.istypedarray-3.0.2.tgz" - }, "lodash.keys": { "version": "3.1.2", "from": "lodash.keys@>=3.0.0 <4.0.0", @@ -2911,30 +3137,45 @@ "from": "lodash.keysin@>=3.0.0 <4.0.0", "resolved": "https://registry.npmjs.org/lodash.keysin/-/lodash.keysin-3.0.8.tgz" }, - "lodash.merge": { - "version": "3.3.2", - "from": "lodash.merge@>=3.3.2 <4.0.0", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-3.3.2.tgz" + "lodash.pad": { + "version": "4.1.0", + "from": "lodash.pad@>=4.1.0 <5.0.0", + "resolved": "https://registry.npmjs.org/lodash.pad/-/lodash.pad-4.1.0.tgz" }, - "lodash.omit": { - "version": "3.1.0", - "from": "lodash.omit@>=3.1.0 <4.0.0", - "resolved": "https://registry.npmjs.org/lodash.omit/-/lodash.omit-3.1.0.tgz" + "lodash.padend": { + "version": "4.2.0", + "from": "lodash.padend@>=4.1.0 <5.0.0", + "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.2.0.tgz" + }, + "lodash.padstart": { + "version": "4.2.0", + "from": "lodash.padstart@>=4.1.0 <5.0.0", + "resolved": "https://registry.npmjs.org/lodash.padstart/-/lodash.padstart-4.2.0.tgz" }, "lodash.pick": { "version": "3.1.0", "from": "lodash.pick@>=3.1.0 <4.0.0", "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-3.1.0.tgz" }, + "lodash.repeat": { + "version": "4.0.0", + "from": "lodash.repeat@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/lodash.repeat/-/lodash.repeat-4.0.0.tgz" + }, "lodash.restparam": { "version": "3.6.1", "from": "lodash.restparam@>=3.0.0 <4.0.0", "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz" }, - "lodash.toplainobject": { - "version": "3.0.0", - "from": "lodash.toplainobject@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/lodash.toplainobject/-/lodash.toplainobject-3.0.0.tgz" + "lodash.tostring": { + "version": "4.1.2", + "from": "lodash.tostring@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/lodash.tostring/-/lodash.tostring-4.1.2.tgz" + }, + "lodash.words": { + "version": "3.2.0", + "from": "lodash.words@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/lodash.words/-/lodash.words-3.2.0.tgz" }, "log-symbols": { "version": "1.0.2", @@ -2952,15 +3193,25 @@ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.1.0.tgz" }, "loud-rejection": { - "version": "1.2.0", + "version": "1.3.0", "from": "loud-rejection@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.2.0.tgz" + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.3.0.tgz" + }, + "lru-cache": { + "version": "4.0.0", + "from": "lru-cache@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.0.0.tgz" }, "map-obj": { "version": "1.0.1", - "from": "map-obj@>=1.0.0 <2.0.0", + "from": "map-obj@>=1.0.1 <2.0.0", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz" }, + "media-typer": { + "version": "0.3.0", + "from": "media-typer@0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" + }, "memory-fs": { "version": "0.3.0", "from": "memory-fs@>=0.3.0 <0.4.0", @@ -2969,14 +3220,17 @@ "meow": { "version": "3.7.0", "from": "meow@>=3.5.0 <4.0.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "dependencies": { - "minimist": { - "version": "1.2.0", - "from": "minimist@1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz" - } - } + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz" + }, + "merge-descriptors": { + "version": "1.0.1", + "from": "merge-descriptors@1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz" + }, + "methods": { + "version": "1.1.2", + "from": "methods@>=1.1.2 <1.2.0", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz" }, "micromatch": { "version": "2.3.7", @@ -2988,15 +3242,25 @@ "from": "miller-rabin@>=4.0.0 <5.0.0", "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.0.tgz" }, + "mime": { + "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.21.0", - "from": "mime-db@>=1.21.0 <1.22.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.21.0.tgz" + "version": "1.22.0", + "from": "mime-db@>=1.22.0 <1.23.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.22.0.tgz" }, "mime-types": { - "version": "2.1.9", + "version": "2.1.10", "from": "mime-types@>=2.1.7 <2.2.0", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.9.tgz" + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.10.tgz" + }, + "min-document": { + "version": "2.18.0", + "from": "min-document@>=2.6.1 <3.0.0", + "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.18.0.tgz" }, "minimalistic-assert": { "version": "1.0.0", @@ -3009,14 +3273,21 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz" }, "minimist": { - "version": "0.0.8", - "from": "minimist@0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" + "version": "1.2.0", + "from": "minimist@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz" }, "mkdirp": { "version": "0.5.1", "from": "mkdirp@>=0.5.1 <0.6.0", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz" + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "dependencies": { + "minimist": { + "version": "0.0.8", + "from": "minimist@0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" + } + } }, "ms": { "version": "0.7.1", @@ -3043,11 +3314,49 @@ "from": "ncp@>=0.4.0 <0.5.0", "resolved": "https://registry.npmjs.org/ncp/-/ncp-0.4.2.tgz" }, + "negotiator": { + "version": "0.6.0", + "from": "negotiator@0.6.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.0.tgz" + }, + "node-gyp": { + "version": "3.3.1", + "from": "node-gyp@>=3.0.1 <4.0.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.3.1.tgz", + "dependencies": { + "glob": { + "version": "4.5.3", + "from": "glob@>=3.0.0 <4.0.0||>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz", + "dependencies": { + "minimatch": { + "version": "2.0.10", + "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" + }, + "minimatch": { + "version": "1.0.0", + "from": "minimatch@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-1.0.0.tgz" + } + } + }, "node-libs-browser": { "version": "1.0.0", "from": "node-libs-browser@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-1.0.0.tgz" }, + "node-sass": { + "version": "3.4.2", + "from": "node-sass@*", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-3.4.2.tgz" + }, "node-uuid": { "version": "1.4.7", "from": "node-uuid@>=1.4.7 <1.5.0", @@ -3075,6 +3384,11 @@ } } }, + "nopt": { + "version": "3.0.6", + "from": "nopt@>=2.0.0 <3.0.0||>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz" + }, "normalize-package-data": { "version": "2.3.5", "from": "normalize-package-data@>=2.3.4 <3.0.0", @@ -3085,15 +3399,40 @@ "from": "normalize-path@>=2.0.1 <3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.0.1.tgz" }, + "normalize-range": { + "version": "0.1.2", + "from": "normalize-range@>=0.1.2 <0.2.0", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz" + }, + "normalize-url": { + "version": "1.4.1", + "from": "normalize-url@>=1.4.0 <2.0.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.4.1.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" + }, + "npmlog": { + "version": "2.0.2", + "from": "npmlog@>=0.0.0 <1.0.0||>=1.0.0 <2.0.0||>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-2.0.2.tgz" + }, + "num2fraction": { + "version": "1.2.2", + "from": "num2fraction@>=1.2.2 <2.0.0", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz" + }, "number-is-nan": { "version": "1.0.0", "from": "number-is-nan@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz" }, "oauth-sign": { - "version": "0.8.0", + "version": "0.8.1", "from": "oauth-sign@>=0.8.0 <0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.0.tgz" + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.1.tgz" }, "object-assign": { "version": "4.0.1", @@ -3105,6 +3444,16 @@ "from": "object.omit@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.0.tgz" }, + "on-finished": { + "version": "2.3.0", + "from": "on-finished@>=2.3.0 <2.4.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz" + }, + "on-headers": { + "version": "1.0.1", + "from": "on-headers@>=1.0.1 <1.1.0", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz" + }, "once": { "version": "1.3.3", "from": "once@>=1.3.0 <2.0.0", @@ -3128,9 +3477,21 @@ } }, "optionator": { - "version": "0.6.0", - "from": "optionator@>=0.6.0 <0.7.0", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.6.0.tgz" + "version": "0.8.1", + "from": "optionator@>=0.8.1 <0.9.0", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.1.tgz", + "dependencies": { + "wordwrap": { + "version": "1.0.0", + "from": "wordwrap@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz" + } + } + }, + "original": { + "version": "1.0.0", + "from": "original@>=0.0.5", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.0.tgz" }, "os-browserify": { "version": "0.2.0", @@ -3147,11 +3508,21 @@ "from": "os-locale@>=1.4.0 <2.0.0", "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz" }, + "os-shim": { + "version": "0.1.3", + "from": "os-shim@>=0.1.2 <0.2.0", + "resolved": "https://registry.npmjs.org/os-shim/-/os-shim-0.1.3.tgz" + }, "os-tmpdir": { "version": "1.0.1", "from": "os-tmpdir@>=1.0.1 <2.0.0", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.1.tgz" }, + "osenv": { + "version": "0.1.3", + "from": "osenv@>=0.0.0 <1.0.0", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.3.tgz" + }, "output-file-sync": { "version": "1.1.1", "from": "output-file-sync@>=1.1.0 <2.0.0", @@ -3177,71 +3548,256 @@ "from": "parse-json@>=2.2.0 <3.0.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz" }, - "path-browserify": { - "version": "0.0.0", - "from": "path-browserify@0.0.0", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz" + "parseurl": { + "version": "1.3.1", + "from": "parseurl@>=1.3.1 <1.4.0", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.1.tgz" + }, + "path-array": { + "version": "1.0.1", + "from": "path-array@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/path-array/-/path-array-1.0.1.tgz" + }, + "path-browserify": { + "version": "0.0.0", + "from": "path-browserify@0.0.0", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz" + }, + "path-exists": { + "version": "1.0.0", + "from": "path-exists@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-1.0.0.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" + }, + "path-is-inside": { + "version": "1.0.1", + "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-to-regexp": { + "version": "0.1.7", + "from": "path-to-regexp@0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz" + }, + "path-type": { + "version": "1.1.0", + "from": "path-type@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz" + }, + "pathval": { + "version": "0.1.1", + "from": "pathval@>=0.1.1 <0.2.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-0.1.1.tgz" + }, + "pbkdf2": { + "version": "3.0.4", + "from": "pbkdf2@>=3.0.3 <4.0.0", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.4.tgz" + }, + "pbkdf2-compat": { + "version": "2.0.1", + "from": "pbkdf2-compat@2.0.1", + "resolved": "https://registry.npmjs.org/pbkdf2-compat/-/pbkdf2-compat-2.0.1.tgz" + }, + "pify": { + "version": "2.3.0", + "from": "pify@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" + }, + "pinkie": { + "version": "2.0.4", + "from": "pinkie@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.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" + }, + "pkginfo": { + "version": "0.4.0", + "from": "pkginfo@>=0.0.0 <1.0.0", + "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.4.0.tgz" + }, + "pluralize": { + "version": "1.2.1", + "from": "pluralize@>=1.2.1 <2.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz" + }, + "postcss": { + "version": "5.0.19", + "from": "postcss@>=5.0.15 <6.0.0", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.0.19.tgz" + }, + "postcss-calc": { + "version": "5.2.0", + "from": "postcss-calc@>=5.2.0 <6.0.0", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-5.2.0.tgz" + }, + "postcss-colormin": { + "version": "2.2.0", + "from": "postcss-colormin@>=2.1.8 <3.0.0", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-2.2.0.tgz" + }, + "postcss-convert-values": { + "version": "2.3.4", + "from": "postcss-convert-values@>=2.3.4 <3.0.0", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-2.3.4.tgz" + }, + "postcss-discard-comments": { + "version": "2.0.4", + "from": "postcss-discard-comments@>=2.0.4 <3.0.0", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz" + }, + "postcss-discard-duplicates": { + "version": "2.0.1", + "from": "postcss-discard-duplicates@>=2.0.1 <3.0.0", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-2.0.1.tgz" + }, + "postcss-discard-empty": { + "version": "2.0.1", + "from": "postcss-discard-empty@>=2.0.1 <3.0.0", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-2.0.1.tgz" + }, + "postcss-discard-unused": { + "version": "2.2.1", + "from": "postcss-discard-unused@>=2.2.1 <3.0.0", + "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-2.2.1.tgz" + }, + "postcss-filter-plugins": { + "version": "2.0.0", + "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.1", + "from": "postcss-loader@>=0.8.1 <0.9.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-0.8.1.tgz" + }, + "postcss-merge-idents": { + "version": "2.1.5", + "from": "postcss-merge-idents@>=2.1.5 <3.0.0", + "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-2.1.5.tgz" + }, + "postcss-merge-longhand": { + "version": "2.0.1", + "from": "postcss-merge-longhand@>=2.0.1 <3.0.0", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-2.0.1.tgz" + }, + "postcss-merge-rules": { + "version": "2.0.6", + "from": "postcss-merge-rules@>=2.0.3 <3.0.0", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-2.0.6.tgz" + }, + "postcss-message-helpers": { + "version": "2.0.0", + "from": "postcss-message-helpers@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz" + }, + "postcss-minify-font-values": { + "version": "1.0.3", + "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.3.tgz" + }, + "postcss-minify-gradients": { + "version": "1.0.1", + "from": "postcss-minify-gradients@>=1.0.1 <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", + "from": "postcss-minify-params@>=1.0.4 <2.0.0", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-1.0.4.tgz" + }, + "postcss-minify-selectors": { + "version": "2.0.4", + "from": "postcss-minify-selectors@>=2.0.4 <3.0.0", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-2.0.4.tgz" }, - "path-exists": { + "postcss-modules-extract-imports": { "version": "1.0.0", - "from": "path-exists@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-1.0.0.tgz" + "from": "postcss-modules-extract-imports@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.0.0.tgz" }, - "path-is-absolute": { + "postcss-modules-local-by-default": { + "version": "1.0.1", + "from": "postcss-modules-local-by-default@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.0.1.tgz" + }, + "postcss-modules-scope": { "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" + "from": "postcss-modules-scope@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.0.0.tgz" }, - "path-is-inside": { - "version": "1.0.1", - "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" + "postcss-modules-values": { + "version": "1.1.1", + "from": "postcss-modules-values@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.1.1.tgz" }, - "path-type": { + "postcss-normalize-charset": { "version": "1.1.0", - "from": "path-type@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz" - }, - "pathval": { - "version": "0.1.1", - "from": "pathval@>=0.1.1 <0.2.0", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-0.1.1.tgz" + "from": "postcss-normalize-charset@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-1.1.0.tgz" }, - "pbkdf2": { - "version": "3.0.4", - "from": "pbkdf2@>=3.0.3 <4.0.0", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.4.tgz" + "postcss-normalize-url": { + "version": "3.0.7", + "from": "postcss-normalize-url@>=3.0.7 <4.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-3.0.7.tgz" }, - "pbkdf2-compat": { - "version": "2.0.1", - "from": "pbkdf2-compat@2.0.1", - "resolved": "https://registry.npmjs.org/pbkdf2-compat/-/pbkdf2-compat-2.0.1.tgz" + "postcss-ordered-values": { + "version": "2.1.0", + "from": "postcss-ordered-values@>=2.1.0 <3.0.0", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-2.1.0.tgz" }, - "pify": { + "postcss-reduce-idents": { "version": "2.3.0", - "from": "pify@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" + "from": "postcss-reduce-idents@>=2.2.2 <3.0.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-2.3.0.tgz" }, - "pinkie": { - "version": "2.0.1", - "from": "pinkie@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.1.tgz" + "postcss-reduce-transforms": { + "version": "1.0.3", + "from": "postcss-reduce-transforms@>=1.0.3 <2.0.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.3.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" + "postcss-selector-parser": { + "version": "1.3.3", + "from": "postcss-selector-parser@>=1.3.1 <2.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-1.3.3.tgz" }, - "pkginfo": { - "version": "0.3.1", - "from": "pkginfo@>=0.0.0 <1.0.0", - "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.3.1.tgz" + "postcss-svgo": { + "version": "2.1.2", + "from": "postcss-svgo@>=2.1.1 <3.0.0", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-2.1.2.tgz" + }, + "postcss-unique-selectors": { + "version": "2.0.2", + "from": "postcss-unique-selectors@>=2.0.2 <3.0.0", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz" + }, + "postcss-value-parser": { + "version": "3.3.0", + "from": "postcss-value-parser@>=3.2.3 <4.0.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz" + }, + "postcss-zindex": { + "version": "2.0.1", + "from": "postcss-zindex@>=2.0.1 <3.0.0", + "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-2.0.1.tgz" }, "prelude-ls": { "version": "1.1.2", - "from": "prelude-ls@>=1.1.1 <1.2.0", + "from": "prelude-ls@>=1.1.2 <1.2.0", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz" }, + "prepend-http": { + "version": "1.0.3", + "from": "prepend-http@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.3.tgz" + }, "preserve": { "version": "0.2.0", "from": "preserve@>=0.2.0 <0.3.0", @@ -3262,6 +3818,11 @@ "from": "process-nextick-args@>=1.0.6 <1.1.0", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.6.tgz" }, + "progress": { + "version": "1.1.8", + "from": "progress@>=1.1.8 <2.0.0", + "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz" + }, "promise": { "version": "7.1.1", "from": "promise@>=7.0.3 <8.0.0", @@ -3272,11 +3833,26 @@ "from": "prompt@>=0.2.14 <0.3.0", "resolved": "https://registry.npmjs.org/prompt/-/prompt-0.2.14.tgz" }, + "proto-list": { + "version": "1.2.4", + "from": "proto-list@>=1.2.1 <1.3.0", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz" + }, + "proxy-addr": { + "version": "1.0.10", + "from": "proxy-addr@>=1.0.10 <1.1.0", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.0.10.tgz" + }, "prr": { "version": "0.0.0", "from": "prr@>=0.0.0 <0.1.0", "resolved": "https://registry.npmjs.org/prr/-/prr-0.0.0.tgz" }, + "pseudomap": { + "version": "1.0.2", + "from": "pseudomap@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz" + }, "public-encrypt": { "version": "4.0.0", "from": "public-encrypt@>=4.0.0 <5.0.0", @@ -3293,14 +3869,14 @@ "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz" }, "qs": { - "version": "5.2.0", - "from": "qs@>=5.2.0 <5.3.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-5.2.0.tgz" + "version": "6.0.2", + "from": "qs@>=6.0.2 <6.1.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.0.2.tgz" }, "query-string": { - "version": "3.0.0", + "version": "3.0.1", "from": "query-string@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-3.0.0.tgz" + "resolved": "https://registry.npmjs.org/query-string/-/query-string-3.0.1.tgz" }, "querystring": { "version": "0.2.0", @@ -3312,47 +3888,79 @@ "from": "querystring-es3@>=0.2.0 <0.3.0", "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz" }, + "querystringify": { + "version": "0.0.3", + "from": "querystringify@>=0.0.0 <0.1.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-0.0.3.tgz" + }, "randomatic": { "version": "1.1.5", "from": "randomatic@>=1.1.3 <2.0.0", "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.5.tgz" }, "randombytes": { - "version": "2.0.2", + "version": "2.0.3", "from": "randombytes@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.2.tgz" + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.3.tgz" + }, + "range-parser": { + "version": "1.0.3", + "from": "range-parser@>=1.0.3 <1.1.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.0.3.tgz" + }, + "raw-body": { + "version": "2.1.5", + "from": "raw-body@>=2.1.5 <2.2.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.1.5.tgz" }, "react": { "version": "0.14.7", "from": "react@>=0.14.7 <0.15.0", "resolved": "https://registry.npmjs.org/react/-/react-0.14.7.tgz" }, + "react-deep-force-update": { + "version": "1.0.1", + "from": "react-deep-force-update@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/react-deep-force-update/-/react-deep-force-update-1.0.1.tgz" + }, "react-dom": { "version": "0.14.7", "from": "react-dom@>=0.14.7 <0.15.0", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-0.14.7.tgz" }, "react-on-rails": { - "version": "2.2.0", + "version": "3.0.6", "from": "../../..", - "resolved": "file:../../..", + "resolved": "file:../../.." + }, + "react-proxy": { + "version": "1.1.6", + "from": "react-proxy@>=1.1.6 <2.0.0", + "resolved": "https://registry.npmjs.org/react-proxy/-/react-proxy-1.1.6.tgz", "dependencies": { - "babel-types": { - "version": "6.4.5", - "from": "babel-types@6.4.5", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.4.5.tgz" + "core-js": { + "version": "2.1.3", + "from": "core-js@>=2.1.3 <3.0.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.1.3.tgz" } } }, "react-redux": { - "version": "4.1.2", - "from": "react-redux@>=4.1.2 <5.0.0", - "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-4.1.2.tgz" + "version": "4.4.0", + "from": "react-redux@>=4.4.0 <5.0.0", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-4.4.0.tgz", + "dependencies": { + "lodash": { + "version": "4.6.1", + "from": "lodash@>=4.2.0 <5.0.0", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.6.1.tgz" + } + } }, "react-router": { - "version": "2.0.0-rc5", - "from": "react-router@>=2.0.0-rc5 <3.0.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-2.0.0-rc5.tgz" + "version": "2.0.0", + "from": "react-router@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-2.0.0.tgz" }, "read": { "version": "1.0.7", @@ -3406,14 +4014,45 @@ "from": "redent@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz" }, + "reduce-css-calc": { + "version": "1.2.1", + "from": "reduce-css-calc@>=1.2.0 <2.0.0", + "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-1.2.1.tgz", + "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" + } + } + }, + "reduce-function-call": { + "version": "1.0.1", + "from": "reduce-function-call@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/reduce-function-call/-/reduce-function-call-1.0.1.tgz", + "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" + } + } + }, "redux": { - "version": "3.1.7", - "from": "redux@3.1.7", - "resolved": "https://registry.npmjs.org/redux/-/redux-3.1.7.tgz" + "version": "3.3.1", + "from": "redux@>=3.3.1 <4.0.0", + "resolved": "https://registry.npmjs.org/redux/-/redux-3.3.1.tgz", + "dependencies": { + "lodash": { + "version": "4.6.1", + "from": "lodash@>=4.2.1 <5.0.0", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.6.1.tgz" + } + } }, "redux-thunk": { "version": "1.0.3", - "from": "redux-thunk@>=1.0.2 <2.0.0", + "from": "redux-thunk@>=1.0.3 <2.0.0", "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-1.0.3.tgz" }, "regenerate": { @@ -3428,7 +4067,7 @@ "dependencies": { "esprima-fb": { "version": "15001.1001.0-dev-harmony-fb", - "from": "esprima-fb@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" } } @@ -3440,9 +4079,14 @@ }, "regexpu": { "version": "1.3.0", - "from": "regexpu@>=1.1.2 <2.0.0", + "from": "regexpu@>=1.3.0 <2.0.0", "resolved": "https://registry.npmjs.org/regexpu/-/regexpu-1.3.0.tgz" }, + "regexpu-core": { + "version": "1.0.0", + "from": "regexpu-core@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz" + }, "regjsgen": { "version": "0.2.0", "from": "regjsgen@>=0.2.0 <0.3.0", @@ -3459,9 +4103,9 @@ "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz" }, "repeat-string": { - "version": "1.5.2", + "version": "1.5.4", "from": "repeat-string@>=1.5.2 <2.0.0", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.5.2.tgz" + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.5.4.tgz" }, "repeating": { "version": "1.1.3", @@ -3469,9 +4113,19 @@ "resolved": "https://registry.npmjs.org/repeating/-/repeating-1.1.3.tgz" }, "request": { - "version": "2.67.0", + "version": "2.69.0", "from": "request@>=2.65.0 <3.0.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.67.0.tgz" + "resolved": "https://registry.npmjs.org/request/-/request-2.69.0.tgz" + }, + "require-uncached": { + "version": "1.0.2", + "from": "require-uncached@>=1.0.2 <2.0.0", + "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.2.tgz" + }, + "requires-port": { + "version": "1.0.0", + "from": "requires-port@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz" }, "reserved-words": { "version": "0.1.1", @@ -3483,6 +4137,33 @@ "from": "resolve@>=1.1.6 <2.0.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz" }, + "resolve-from": { + "version": "1.0.1", + "from": "resolve-from@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.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@>=1.4.3 <2.0.0", + "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", @@ -3493,20 +4174,37 @@ "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" + } + } + }, + "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", "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz" }, "rimraf": { - "version": "2.5.1", + "version": "2.5.2", "from": "rimraf@>=2.2.8 <3.0.0", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.5.1.tgz", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.5.2.tgz", "dependencies": { "glob": { - "version": "6.0.4", - "from": "glob@>=6.0.1 <7.0.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz" + "version": "7.0.3", + "from": "glob@>=7.0.0 <8.0.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.3.tgz" } } }, @@ -3525,6 +4223,38 @@ "from": "rx-lite@>=3.1.2 <4.0.0", "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz" }, + "sass-graph": { + "version": "2.1.1", + "from": "sass-graph@>=2.0.1 <3.0.0", + "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.1.1.tgz", + "dependencies": { + "glob": { + "version": "6.0.4", + "from": "glob@>=6.0.4 <7.0.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz" + }, + "lodash": { + "version": "4.6.1", + "from": "lodash@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.6.1.tgz" + } + } + }, + "sass-loader": { + "version": "3.1.2", + "from": "sass-loader@>=3.1.2 <4.0.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-3.1.2.tgz" + }, + "sass-resources-loader": { + "version": "1.0.2", + "from": "sass-resources-loader@1.0.2", + "resolved": "https://registry.npmjs.org/sass-resources-loader/-/sass-resources-loader-1.0.2.tgz" + }, + "sax": { + "version": "1.1.6", + "from": "sax@>=1.1.4 <1.2.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.1.6.tgz" + }, "semver": { "version": "4.3.6", "from": "semver@>=4.0.3 <5.0.0", @@ -3547,10 +4277,54 @@ } } }, + "send": { + "version": "0.13.1", + "from": "send@0.13.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.13.1.tgz", + "dependencies": { + "http-errors": { + "version": "1.3.1", + "from": "http-errors@>=1.3.1 <1.4.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz" + }, + "mime": { + "version": "1.3.4", + "from": "mime@1.3.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz" + } + } + }, + "serve-index": { + "version": "1.7.3", + "from": "serve-index@>=1.7.2 <2.0.0", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.7.3.tgz", + "dependencies": { + "accepts": { + "version": "1.2.13", + "from": "accepts@>=1.2.13 <1.3.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.2.13.tgz" + }, + "http-errors": { + "version": "1.3.1", + "from": "http-errors@>=1.3.1 <1.4.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz" + }, + "negotiator": { + "version": "0.5.3", + "from": "negotiator@0.5.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.5.3.tgz" + } + } + }, + "serve-static": { + "version": "1.10.2", + "from": "serve-static@>=1.10.2 <1.11.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.10.2.tgz" + }, "sha.js": { - "version": "2.4.4", + "version": "2.4.5", "from": "sha.js@>=2.3.6 <3.0.0", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.4.tgz" + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.5.tgz" }, "shebang-regex": { "version": "1.0.0", @@ -3562,6 +4336,11 @@ "from": "shelljs@>=0.5.3 <0.6.0", "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.5.3.tgz" }, + "sigmund": { + "version": "1.0.1", + "from": "sigmund@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz" + }, "signal-exit": { "version": "2.1.2", "from": "signal-exit@>=2.1.2 <3.0.0", @@ -3582,21 +4361,53 @@ "from": "slash@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz" }, + "slice-ansi": { + "version": "0.0.4", + "from": "slice-ansi@0.0.4", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz" + }, "sntp": { "version": "1.0.9", "from": "sntp@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz" }, + "sockjs": { + "version": "0.3.15", + "from": "sockjs@>=0.3.15 <0.4.0", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.15.tgz" + }, + "sockjs-client": { + "version": "1.0.3", + "from": "sockjs-client@>=1.0.3 <2.0.0", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.0.3.tgz", + "dependencies": { + "faye-websocket": { + "version": "0.7.3", + "from": "faye-websocket@>=0.7.3 <0.8.0", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.7.3.tgz" + } + } + }, + "sort-keys": { + "version": "1.1.1", + "from": "sort-keys@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.1.tgz" + }, "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": { "version": "0.5.3", - "from": "source-map@>=0.5.0 <0.6.0", + "from": "source-map@>=0.5.1 <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", @@ -3609,6 +4420,16 @@ } } }, + "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.15", + "from": "spawn-sync@>=1.0.15 <2.0.0", + "resolved": "https://registry.npmjs.org/spawn-sync/-/spawn-sync-1.0.15.tgz" + }, "spdx-correct": { "version": "1.0.2", "from": "spdx-correct@>=1.0.0 <1.1.0", @@ -3635,16 +4456,9 @@ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" }, "sshpk": { - "version": "1.7.3", + "version": "1.7.4", "from": "sshpk@>=1.7.0 <2.0.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.7.3.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" - } - } + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.7.4.tgz" }, "stable": { "version": "0.1.5", @@ -3656,11 +4470,21 @@ "from": "stack-trace@>=0.0.0 <0.1.0", "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.9.tgz" }, + "statuses": { + "version": "1.2.1", + "from": "statuses@>=1.2.1 <2.0.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.2.1.tgz" + }, "stream-browserify": { "version": "2.0.1", "from": "stream-browserify@>=2.0.1 <3.0.0", "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz" }, + "stream-cache": { + "version": "0.0.2", + "from": "stream-cache@>=0.0.1 <0.1.0", + "resolved": "https://registry.npmjs.org/stream-cache/-/stream-cache-0.0.2.tgz" + }, "strict-uri-encode": { "version": "1.1.0", "from": "strict-uri-encode@>=1.0.0 <2.0.0", @@ -3671,6 +4495,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", @@ -3687,9 +4516,9 @@ "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz" }, "strip-ansi": { - "version": "3.0.0", + "version": "3.0.1", "from": "strip-ansi@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.0.tgz" + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz" }, "strip-bom": { "version": "2.0.0", @@ -3706,16 +4535,43 @@ "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" + }, "supports-color": { - "version": "2.0.0", - "from": "supports-color@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz" + "version": "3.1.2", + "from": "supports-color@>=3.1.2 <4.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz" + }, + "svgo": { + "version": "0.6.1", + "from": "svgo@>=0.6.1 <0.7.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-0.6.1.tgz" + }, + "table": { + "version": "3.7.8", + "from": "table@>=3.7.8 <4.0.0", + "resolved": "https://registry.npmjs.org/table/-/table-3.7.8.tgz", + "dependencies": { + "lodash": { + "version": "4.6.1", + "from": "lodash@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.6.1.tgz" + } + } }, "tapable": { "version": "0.1.10", "from": "tapable@>=0.1.8 <0.2.0", "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.1.10.tgz" }, + "tar": { + "version": "2.2.1", + "from": "tar@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz" + }, "text-table": { "version": "0.2.0", "from": "text-table@>=0.2.0 <0.3.0", @@ -3786,16 +4642,26 @@ "from": "tunnel-agent@>=0.4.1 <0.5.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.2.tgz" }, + "tv4": { + "version": "1.2.7", + "from": "tv4@>=1.2.7 <2.0.0", + "resolved": "https://registry.npmjs.org/tv4/-/tv4-1.2.7.tgz" + }, "tweetnacl": { - "version": "0.13.3", + "version": "0.14.1", "from": "tweetnacl@>=0.13.0 <1.0.0", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.13.3.tgz" + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.1.tgz" }, "type-check": { "version": "0.3.2", - "from": "type-check@>=0.3.1 <0.4.0", + "from": "type-check@>=0.3.2 <0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz" }, + "type-is": { + "version": "1.6.12", + "from": "type-is@>=1.6.11 <1.7.0", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.12.tgz" + }, "typedarray": { "version": "0.0.6", "from": "typedarray@>=0.0.5 <0.1.0", @@ -3807,9 +4673,9 @@ "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.10.tgz" }, "uglify-js": { - "version": "2.6.1", + "version": "2.6.2", "from": "uglify-js@>=2.6.0 <2.7.0", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.6.1.tgz", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.6.2.tgz", "dependencies": { "async": { "version": "0.2.10", @@ -3823,11 +4689,41 @@ "from": "uglify-to-browserify@>=1.0.0 <1.1.0", "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz" }, + "uid-number": { + "version": "0.0.5", + "from": "uid-number@0.0.5", + "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.5.tgz" + }, "underscore": { "version": "1.6.0", "from": "underscore@>=1.6.0 <1.7.0", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz" }, + "uniq": { + "version": "1.0.1", + "from": "uniq@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz" + }, + "uniqid": { + "version": "1.0.0", + "from": "uniqid@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/uniqid/-/uniqid-1.0.0.tgz" + }, + "uniqs": { + "version": "2.0.0", + "from": "uniqs@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz" + }, + "unpipe": { + "version": "1.0.0", + "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.11.0", "from": "url@>=0.11.0 <0.12.0", @@ -3840,6 +4736,16 @@ } } }, + "url-loader": { + "version": "0.5.7", + "from": "url-loader@>=0.5.7 <0.6.0", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-0.5.7.tgz" + }, + "url-parse": { + "version": "1.0.5", + "from": "url-parse@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.0.5.tgz" + }, "user-home": { "version": "1.1.1", "from": "user-home@>=1.1.1 <2.0.0", @@ -3867,6 +4773,11 @@ } } }, + "utils-merge": { + "version": "1.0.0", + "from": "utils-merge@1.0.0", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz" + }, "v8flags": { "version": "2.0.11", "from": "v8flags@>=2.0.10 <3.0.0", @@ -3877,6 +4788,11 @@ "from": "validate-npm-package-license@>=3.0.1 <4.0.0", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz" }, + "vary": { + "version": "1.1.0", + "from": "vary@>=1.1.0 <1.2.0", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.0.tgz" + }, "verror": { "version": "1.3.6", "from": "verror@1.3.6", @@ -3901,11 +4817,6 @@ "version": "4.5.3", "from": "glob@>=4.3.1 <5.0.0", "resolved": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz" - }, - "minimatch": { - "version": "2.0.10", - "from": "minimatch@>=2.0.1 <3.0.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz" } } }, @@ -3932,9 +4843,9 @@ } }, "webpack": { - "version": "1.12.12", - "from": "webpack@>=1.12.12 <2.0.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-1.12.12.tgz", + "version": "1.12.14", + "from": "webpack@>=1.12.14 <2.0.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-1.12.14.tgz", "dependencies": { "base64-js": { "version": "0.0.8", @@ -3963,7 +4874,7 @@ }, "isarray": { "version": "1.0.0", - "from": "isarray@1.0.0", + "from": "isarray@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" }, "node-libs-browser": { @@ -3983,8 +4894,7 @@ "dependencies": { "isarray": { "version": "0.0.1", - "from": "isarray@0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" + "from": "isarray@0.0.1" } } }, @@ -4003,11 +4913,6 @@ "from": "stream-browserify@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-1.0.0.tgz" }, - "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" - }, "url": { "version": "0.10.3", "from": "url@>=0.10.1 <0.11.0", @@ -4034,11 +4939,48 @@ } } }, + "webpack-dev-middleware": { + "version": "1.5.1", + "from": "webpack-dev-middleware@>=1.4.0 <2.0.0", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-1.5.1.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" + } + } + }, + "webpack-sources": { + "version": "0.1.1", + "from": "webpack-sources@>=0.1.0 <0.2.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-0.1.1.tgz" + }, + "websocket-driver": { + "version": "0.6.4", + "from": "websocket-driver@>=0.5.1", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.6.4.tgz" + }, + "websocket-extensions": { + "version": "0.1.1", + "from": "websocket-extensions@>=0.1.1", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.1.tgz" + }, "whatwg-fetch": { "version": "0.9.0", "from": "whatwg-fetch@>=0.9.0 <0.10.0", "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-0.9.0.tgz" }, + "whet.extend": { + "version": "0.9.9", + "from": "whet.extend@>=0.9.9 <0.10.0", + "resolved": "https://registry.npmjs.org/whet.extend/-/whet.extend-0.9.9.tgz" + }, + "which": { + "version": "1.2.4", + "from": "which@>=1.2.4 <2.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-1.2.4.tgz" + }, "window-size": { "version": "0.1.0", "from": "window-size@0.1.0", @@ -4058,6 +5000,11 @@ "version": "0.6.2", "from": "colors@>=0.6.0 <0.7.0", "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz" + }, + "pkginfo": { + "version": "0.3.1", + "from": "pkginfo@>=0.3.0 <0.4.0", + "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.3.1.tgz" } } }, @@ -4076,16 +5023,16 @@ "from": "write@>=0.2.1 <0.3.0", "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz" }, - "xml-escape": { - "version": "1.0.0", - "from": "xml-escape@>=1.0.0 <1.1.0", - "resolved": "https://registry.npmjs.org/xml-escape/-/xml-escape-1.0.0.tgz" - }, "xmlbuilder": { "version": "3.1.0", "from": "xmlbuilder@>=3.1.0 <4.0.0", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-3.1.0.tgz" }, + "xregexp": { + "version": "3.1.0", + "from": "xregexp@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-3.1.0.tgz" + }, "xtend": { "version": "4.0.1", "from": "xtend@>=4.0.0 <5.0.0", @@ -4096,6 +5043,11 @@ "from": "y18n@>=3.2.0 <4.0.0", "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.0.tgz" }, + "yallist": { + "version": "2.0.0", + "from": "yallist@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.0.0.tgz" + }, "yargs": { "version": "3.10.0", "from": "yargs@>=3.10.0 <3.11.0", diff --git a/spec/dummy/client/package.json b/spec/dummy/client/package.json index e0bb4209e..a23c4e6c6 100644 --- a/spec/dummy/client/package.json +++ b/spec/dummy/client/package.json @@ -8,35 +8,51 @@ }, "main": "js/app.js", "dependencies": { - "babel": "^6.5.1", - "babel-cli": "^6.5.1", - "babel-core": "^6.5.1", - "babel-loader": "^6.2.2", - "babel-polyfill": "^6.5.0", - "babel-preset-es2015": "^6.5.0", + "autoprefixer": "^6.3.3", + "babel": "^6.5.2", + "babel-cli": "^6.6.5", + "babel-core": "^6.6.5", + "babel-loader": "^6.2.4", + "babel-polyfill": "^6.6.1", + "babel-preset-es2015": "^6.6.0", "babel-preset-react": "^6.5.0", "babel-preset-stage-0": "^6.5.0", - "es5-shim": "^4.5.2", + "css-loader": "^0.23.1", + "es5-shim": "^4.5.7", "expose-loader": "^0.7.1", - "history": "^2.0.0-rc2", - "jquery": "^2.2.0", + "extract-text-webpack-plugin": "^1.0.1", + "file-loader": "^0.8.5", + "history": "^2.0.1", + "imports-loader": "^0.6.5", + "jquery": "^2.2.1", "jquery-ujs": "^1.2.0", + "loader-utils": "^0.2.12", "node-libs-browser": "^1.0.0", + "node-sass": "^3.4.2", + "postcss-loader": "^0.8.1", "react": "^0.14.7", "react-dom": "^0.14.7", "react-on-rails": "../../..", - "react-redux": "^4.1.2", + "react-redux": "^4.4.0", "react-router": "^2.0.0", - "redux": "^3.1.7", + "redux": "^3.3.1", "redux-thunk": "^1.0.3", - "webpack": "^1.12.12" + "resolve-url-loader": "^1.4.3", + "sass-loader": "^3.1.2", + "sass-resources-loader": "1.0.2", + "style-loader": "^0.13.0", + "url-loader": "^0.5.7", + "webpack": "^1.12.14" }, "devDependencies": { - "babel-eslint": "^5.0.0-beta8", - "eslint": "^1.10.3", - "eslint-config-airbnb": "5.0.0", - "eslint-plugin-react": "^3.16.1", - "jscs": "^2.9.0" + "babel-plugin-react-transform": "^2.0.2", + "body-parser": "^1.15.0", + "eslint": "^2.3.0", + "eslint-config-shakacode": "^3.0.0", + "eslint-plugin-react": "^4.2.0", + "jscs": "^2.11.0", + "react-transform-hmr": "^1.0.2", + "webpack-dev-server": "^1.14.1" }, "browser": { "fs": false @@ -48,10 +64,13 @@ "jscs:fix": "jscs --verbose -x . --silent", "build:test": "webpack --config webpack.client.js && webpack --config webpack.server.js", "test": "npm run build:test && rspec", - "build:dev:client": "webpack -w --config webpack.client.js", - "build:dev:server": "webpack -w --config webpack.server.js", - "build:client": "webpack --config webpack.client.js", - "build:server": "webpack --config webpack.server.js", + "build:production:client": "NODE_ENV=production webpack --config webpack.client.rails.build.config.js", + "build:production:server": "NODE_ENV=production webpack --config webpack.server.rails.build.config.js", + "build:client": "webpack --config webpack.client.rails.build.config.js", + "build:dev:client": "webpack -w --config webpack.client.rails.build.config.js", + "build:dev:server": "webpack -w --config webpack.server.rails.build.config.js", + "build:server": "webpack --config webpack.server.rails.build.config.js", + "hot-assets": "babel-node server-rails-hot.js", "install-react-on-rails": "npm install 'react-on-rails@../../..'" }, "author": "", diff --git a/spec/dummy/client/server-rails-hot.js b/spec/dummy/client/server-rails-hot.js new file mode 100644 index 000000000..66b95261d --- /dev/null +++ b/spec/dummy/client/server-rails-hot.js @@ -0,0 +1,48 @@ +/* eslint no-var: 0, no-console: 0 */ + +// This file is used by the npm script: +// "hot-assets": "babel-node server-rails-hot.js" +// +// This is what creates the hot assets so that you can edit assets, JavaScript and Sass, +// referenced in your webpack config, and the page updated without you needing to reload +// the page. +// +// Steps +// 1. Update your application.html.erb or equivalent to use the env_javascript_include_tag +// and env_stylesheet_link_tag helpers. +// 2. Make sure you have a hot-assets target in your client/package.json +// 3. Start up `forman start -f Procfile.hot` to start both Rails and the hot reload server. + +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/spec/dummy/client/webpack.client.base.config.js b/spec/dummy/client/webpack.client.base.config.js new file mode 100644 index 000000000..c71e03bda --- /dev/null +++ b/spec/dummy/client/webpack.client.base.config.js @@ -0,0 +1,80 @@ +// Common client-side webpack configuration used by webpack.hot.config and webpack.rails.config. + +const webpack = require('webpack'); +const path = require('path'); +const autoprefixer = require('autoprefixer'); + +const devBuild = process.env.NODE_ENV !== 'production'; +const nodeEnv = devBuild ? 'development' : 'production'; + +module.exports = { + + // the project dir + context: __dirname, + entry: { + + // See use of 'vendor' in the CommonsChunkPlugin inclusion below. + vendor: [ + 'babel-polyfill', + 'es5-shim/es5-shim', + 'es5-shim/es5-sham', + 'jquery-ujs', + 'jquery', + ], + + // This will contain the app entry points defined by webpack.hot.config and webpack.rails.config + app: [ + './app/startup/clientRegistration', + ], + }, + resolve: { + extensions: ['', '.js', '.jsx'], + alias: { + libs: path.join(process.cwd(), 'app', 'libs'), + react: path.resolve('./node_modules/react'), + 'react-dom': path.resolve('./node_modules/react-dom'), + }, + }, + + plugins: [ + new webpack.DefinePlugin({ + 'process.env': { + NODE_ENV: JSON.stringify(nodeEnv), + }, + TRACE_TURBOLINKS: devBuild, + }), + + // https://webpack.github.io/docs/list-of-plugins.html#2-explicit-vendor-chunk + new webpack.optimize.CommonsChunkPlugin({ + + // This name 'vendor' ties into the entry definition + name: 'vendor', + + // We don't want the default vendor.js name + filename: 'vendor-bundle.js', + + // Passing Infinity just creates the commons chunk, but moves no modules into it. + // In other words, we only put what's in the vendor entry definition in vendor-bundle.js + minChunks: Infinity, + }), + ], + 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' }, + { test: require.resolve('jquery'), loader: 'expose?jQuery' }, + { test: require.resolve('jquery'), loader: 'expose?$' }, + ], + }, + + // 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/spec/dummy/client/webpack.client.js b/spec/dummy/client/webpack.client.js index 2a64e6da9..d7e646d68 100644 --- a/spec/dummy/client/webpack.client.js +++ b/spec/dummy/client/webpack.client.js @@ -10,7 +10,7 @@ module.exports = { 'startup/clientRegistration', ], output: { - path: '../app/assets/javascripts/generated', + path: '../app/assets/webpack', filename: 'client.js', }, resolve: { diff --git a/spec/dummy/client/webpack.client.rails.build.config.js b/spec/dummy/client/webpack.client.rails.build.config.js new file mode 100644 index 000000000..4d7e28b07 --- /dev/null +++ b/spec/dummy/client/webpack.client.rails.build.config.js @@ -0,0 +1,65 @@ +// Run like this: +// cd client && npm run build:client +// Note that Foreman (Procfile.dev) has also been configured to take care of this. + +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/webpack', +}; + +// 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', + }, + { + test: require.resolve('jquery-ujs'), + loader: 'imports?jQuery=jquery', + } +); + +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 + config.devtool = 'eval-source-map'; +} else { + console.log('Webpack production build for Rails'); // eslint-disable-line no-console +} + +module.exports = config; diff --git a/spec/dummy/client/webpack.client.rails.hot.config.js b/spec/dummy/client/webpack.client.rails.hot.config.js new file mode 100644 index 000000000..7f3012613 --- /dev/null +++ b/spec/dummy/client/webpack.client.rails.hot.config.js @@ -0,0 +1,79 @@ +// 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.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', + ], + }, + { + test: require.resolve('jquery-ujs'), + loader: 'imports?jQuery=jquery', + } +); + +config.plugins.push( + new webpack.HotModuleReplacementPlugin(), + new webpack.NoErrorsPlugin() +); + +config.devtool = 'eval-source-map'; + +console.log('Webpack HOT dev build for Rails'); // eslint-disable-line no-console + +module.exports = config; diff --git a/spec/dummy/client/webpack.server.js b/spec/dummy/client/webpack.server.js index 216f57ee4..9478a8ed6 100644 --- a/spec/dummy/client/webpack.server.js +++ b/spec/dummy/client/webpack.server.js @@ -6,7 +6,7 @@ module.exports = { 'startup/serverRegistration', ], output: { - path: '../app/assets/javascripts/generated', + path: '../app/assets/webpack', filename: 'server.js', }, resolve: { diff --git a/spec/dummy/client/webpack.server.rails.build.config.js b/spec/dummy/client/webpack.server.rails.build.config.js new file mode 100644 index 000000000..3b742be45 --- /dev/null +++ b/spec/dummy/client/webpack.server.rails.build.config.js @@ -0,0 +1,56 @@ +// Common webpack configuration for server bundle + +const webpack = require('webpack'); +const path = require('path'); + +const devBuild = process.env.NODE_ENV !== 'production'; +const nodeEnv = devBuild ? 'development' : 'production'; + +module.exports = { + + // the project dir + context: __dirname, + entry: [ + 'babel-polyfill', + './app/startup/serverRegistration', + ], + output: { + filename: 'server-bundle.js', + path: '../app/assets/webpack', + }, + resolve: { + extensions: ['', '.js', '.jsx'], + alias: { + libs: path.join(process.cwd(), 'app', 'libs'), + }, + }, + plugins: [ + new webpack.DefinePlugin({ + 'process.env': { + NODE_ENV: JSON.stringify(nodeEnv), + }, + }), + ], + 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', + ], + }, + ], + }, + + sassResources: ['./app/assets/styles/app-variables.scss'], + +}; diff --git a/spec/dummy/config/initializers/assets.rb b/spec/dummy/config/initializers/assets.rb index c9bc75d6e..2f3c3e20d 100644 --- a/spec/dummy/config/initializers/assets.rb +++ b/spec/dummy/config/initializers/assets.rb @@ -10,6 +10,23 @@ # application.js, application.css, and all non-JS/CSS in app/assets folder are already added. # Rails.application.config.assets.precompile += %w( search.js ) -unless ENV["DISABLE_TURBOLINKS"].present? - Rails.application.config.assets.precompile += %w( application_with_turbolinks.js ) +# 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( + server-bundle.js +) + +if ENV["REACT_ON_RAILS_ENV"] != "HOT" + Rails.application.config.assets.precompile += %w( + application_static.js.erb + application_static.css.erb + ) +else + Rails.application.config.assets.precompile += %w( + application_non_webpack.js.erb + application_non_webpack.css.erb + ) end diff --git a/spec/dummy/config/initializers/react_on_rails.rb b/spec/dummy/config/initializers/react_on_rails.rb index 20c0f2216..2cb7b1b3b 100644 --- a/spec/dummy/config/initializers/react_on_rails.rb +++ b/spec/dummy/config/initializers/react_on_rails.rb @@ -2,9 +2,17 @@ ReactOnRails.configure do |config| # Client bundles are configured in application.js + # Directory where your generated assets go + config.generated_assets_dir = File.join(%w(app assets webpack)) + + # Define the files for we need to check for webpack compilation when running tests + config.webpack_generated_files = %w( app-bundle.js vendor-bundle.js server-bundle.js ) + # 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.js" # This is the default + # Note, this is the default server bundle. If you have multiple ones, just pick any to be your + # default one. + config.server_bundle_js_file = "server-bundle.js" # Below options can be overriden by passing to the helper method. config.prerender = false # default is false diff --git a/spec/dummy/config/routes.rb b/spec/dummy/config/routes.rb index bbd842be2..cfcc14ff6 100644 --- a/spec/dummy/config/routes.rb +++ b/spec/dummy/config/routes.rb @@ -7,7 +7,11 @@ get "client_side_hello_world" => "pages#client_side_hello_world" get "client_side_hello_world_shared_store" => "pages#client_side_hello_world_shared_store" + get "client_side_hello_world_shared_store_controller" => "pages#client_side_hello_world_shared_store_controller" + get "client_side_hello_world_shared_store_defer" => "pages#client_side_hello_world_shared_store_defer" get "server_side_hello_world_shared_store" => "pages#server_side_hello_world_shared_store" + get "server_side_hello_world_shared_store_controller" => "pages#server_side_hello_world_shared_store_controller" + get "server_side_hello_world_shared_store_defer" => "pages#server_side_hello_world_shared_store_defer" get "server_side_hello_world" => "pages#server_side_hello_world" get "client_side_log_throw" => "pages#client_side_log_throw" get "server_side_log_throw" => "pages#server_side_log_throw" diff --git a/spec/dummy/package.json b/spec/dummy/package.json index 86b1099fe..0b44a53c9 100644 --- a/spec/dummy/package.json +++ b/spec/dummy/package.json @@ -11,9 +11,15 @@ "gulp": "cd ./client && npm run gulp", "test": "npm run build:test && npm run lint && rspec", "lint": "cd client && npm run lint", - "build:client": "cd client && npm run build:client", - "build:server": "cd client && npm run build:server", - "install-react-on-rails": "cd client && npm run install-react-on-rails" + "install-react-on-rails": "cd client && npm run install-react-on-rails", + "build:clean": "rm app/assets/webpack/* || true", + "build:production:client": "(cd client && npm run build:production:client --silent)", + "build:production:server": "(cd client && npm run build:production:server --silent)", + "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)", + "hot-assets": "(cd client && npm run hot-assets)" }, "repository": { "type": "git", diff --git a/spec/dummy/spec/features/integration_spec.rb b/spec/dummy/spec/features/integration_spec.rb index cf09f8d2d..ee99851e4 100644 --- a/spec/dummy/spec/features/integration_spec.rb +++ b/spec/dummy/spec/features/integration_spec.rb @@ -77,7 +77,9 @@ def change_text_expect_dom_selector(dom_selector) subject { page } background { visit "/client_side_log_throw" } - scenario { is_expected.to have_text "This example demonstrates client side logging and error handling." } + scenario "client side logging and error handling", driver: js_errors_driver do + is_expected.to have_text "This example demonstrates client side logging and error handling." + end end feature "Pages/Pure Component", :js do @@ -91,7 +93,7 @@ def change_text_expect_dom_selector(dom_selector) subject { page } background { visit "/server_side_log_throw" } - scenario "page has server side throw messages" do + scenario "page has server side throw messages", driver: js_errors_driver do expect(subject).to have_text "This example demonstrates server side logging and error handling." expect(subject).to have_text "Exception in rendering!\n\nMessage: throw in HelloWorldContainer" end @@ -119,9 +121,12 @@ def change_text_expect_dom_selector(dom_selector) include_examples "React Component", "div#ReduxApp-react-component-0" end -feature "React Router", :js do +feature "React Router", js: true, driver: js_errors_driver do subject { page } - background { visit "/react_router" } + background do + visit "/" + click_link "React Router" + end context "/react_router" do it { is_expected.to have_text("Woohoo, we can use react-router here!") } scenario "clicking links correctly renders other pages" do @@ -174,3 +179,19 @@ def change_text_expect_dom_selector(dom_selector) feature "2 react components, 1 store, server side", :js do include_examples "React Component Shared Store", "/server_side_hello_world_shared_store" end + +feature "2 react components, 1 store, client only, controller setup", :js do + include_examples "React Component Shared Store", "/client_side_hello_world_shared_store_controller" +end + +feature "2 react components, 1 store, server side, controller setup", :js do + include_examples "React Component Shared Store", "/server_side_hello_world_shared_store_controller" +end + +feature "2 react components, 1 store, client only, defer", :js do + include_examples "React Component Shared Store", "/client_side_hello_world_shared_store_defer" +end + +feature "2 react components, 1 store, server side, defer", :js do + include_examples "React Component Shared Store", "/server_side_hello_world_shared_store_defer" +end diff --git a/spec/dummy/spec/helpers/react_on_rails_helper_spec.rb b/spec/dummy/spec/helpers/react_on_rails_helper_spec.rb index 80d90258f..e3872c1f4 100644 --- a/spec/dummy/spec/helpers/react_on_rails_helper_spec.rb +++ b/spec/dummy/spec/helpers/react_on_rails_helper_spec.rb @@ -54,7 +54,6 @@ data-component-name="App" data-props="{"name":"My Test Name"}" data-trace="false" - #{turbolinks_line} data-dom-id="#{id}">

    ).squish end @@ -69,7 +68,7 @@ it { is_expected.to be_an_instance_of ActiveSupport::SafeBuffer } it { is_expected.to start_with "\n\n" } + it { is_expected.to match %r{\s*$} } it { is_expected.to include react_component_div } it { is_expected.to include react_definition_div } @@ -91,7 +90,6 @@ data-component-name=\"App\" data-props=\"{"name":"My Test Name"}\" data-trace=\"false\" - #{turbolinks_line} data-dom-id=\"#{id}\">".squish end @@ -107,7 +105,6 @@ data-component-name=\"App\" data-props=\"{"name":"My Test Name"}\" data-trace=\"false\" - #{turbolinks_line} data-dom-id=\"#{id}\">".squish end @@ -116,7 +113,7 @@ end describe "#redux_store" do - subject { redux_store("reduxStore", props) } + subject { redux_store("reduxStore", props: props) } let(:props) do { name: "My Test Name" } @@ -166,8 +163,4 @@ it { is_expected.to be_an_instance_of ActiveSupport::SafeBuffer } it { is_expected.to eq hello_world } end - - def turbolinks_line - %(data-expect-turbolinks="#{ENV['DISABLE_TURBOLINKS'].present? ? 'false' : 'true'}") - end end diff --git a/spec/dummy/spec/rails_helper.rb b/spec/dummy/spec/rails_helper.rb index 12d6ea1dc..6b39de722 100644 --- a/spec/dummy/spec/rails_helper.rb +++ b/spec/dummy/spec/rails_helper.rb @@ -35,6 +35,7 @@ RSpec.configure do |config| # Ensure that if we are running js tests, we are using latest webpack assets + # This will use the defaults of :js and :server_rendering ReactOnRails::TestHelper.configure_rspec_to_compile_assets(config) # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures @@ -64,34 +65,51 @@ # # selenium_firefox webdriver only works for Travis-CI builds. default_driver = :poltergeist - supported_drivers = %w( poltergeist webkit selenium_chrome selenium_firefox) + + supported_drivers = %i( poltergeist poltergeist_errors_ok webkit + selenium_chrome selenium_firefox selenium) driver = ENV["DRIVER"].try(:to_sym) || default_driver - unless supported_drivers.include?(driver.to_s) - fail "Unsupported driver: #{driver} (supported = #{supported_drivers})" + unless supported_drivers.include?(driver) + raise "Unsupported driver: #{driver} (supported = #{supported_drivers})" end - if driver == :poltergeist + case driver + when :poltergeist, :poltergeist_errors_ok require "capybara/poltergeist" - elsif driver == :selenium_chrome + Capybara.register_driver :poltergeist_errors_ok do |app| + Capybara::Poltergeist::Driver.new(app, js_errors: false) + end + when :selenium_chrome Capybara.register_driver :selenium_chrome do |app| Capybara::Selenium::Driver.new(app, browser: :chrome) end Capybara::Screenshot.register_driver(:selenium_chrome) do |js_driver, path| js_driver.browser.save_screenshot(path) end - elsif driver == :selenium_firefox + when :selenium_firefox, :selenium Capybara.register_driver :selenium_firefox do |app| Capybara::Selenium::Driver.new(app, browser: :firefox) end Capybara::Screenshot.register_driver(:selenium_firefox) do |js_driver, path| js_driver.browser.save_screenshot(path) end + driver = :selenium_firefox end + Capybara.javascript_driver = driver puts "Capybara using driver: #{Capybara.javascript_driver}" Capybara::Screenshot.prune_strategy = { keep: 10 } # [END] Capybara config + + # This will insert a tag with the asset host into the pages created by + # save_and_open_page, meaning that relative links will be loaded from the + # development server if it is running. + Capybara.asset_host = "http://localhost:3000" + + def js_errors_driver + Capybara.javascript_driver == :poltergeist ? :poltergeist_errors_ok : Capybara.javascript_driver + end end diff --git a/spec/dummy/spec/requests/server_render_check_spec.rb b/spec/dummy/spec/requests/server_render_check_spec.rb index 574f335cb..ce85f8264 100644 --- a/spec/dummy/spec/requests/server_render_check_spec.rb +++ b/spec/dummy/spec/requests/server_render_check_spec.rb @@ -1,6 +1,6 @@ require "rails_helper" -describe "Server Rendering" do +describe "Server Rendering", :server_rendering do it "generates server rendered HTML if server renderering enabled" do get server_side_hello_world_with_options_path html_nodes = Nokogiri::HTML(response.body) @@ -29,7 +29,7 @@ end describe "reloading the server bundle" do - let(:server_bundle) { File.expand_path("../../../app/assets/javascripts/generated/server.js", __FILE__) } + let(:server_bundle) { File.expand_path("../../../app/assets/webpack/server-bundle.js", __FILE__) } let!(:original_bundle_text) { File.read(server_bundle) } before do ReactOnRails.configure { |config| config.development_mode = true } diff --git a/spec/dummy/spec/spec_helper.rb b/spec/dummy/spec/spec_helper.rb index 0877fb0ce..a4d63edde 100644 --- a/spec/dummy/spec/spec_helper.rb +++ b/spec/dummy/spec/spec_helper.rb @@ -17,6 +17,9 @@ # # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration RSpec.configure do |config| + config.example_status_persistence_file_path = "spec/examples.txt" + config.run_all_when_everything_filtered = true + # rspec-expectations config goes here. You can use an alternate # assertion/expectation library such as wrong or the stdlib/minitest # assertions if you prefer. diff --git a/spec/react_on_rails/configuration_spec.rb b/spec/react_on_rails/configuration_spec.rb index 779c2a789..27e867204 100644 --- a/spec/react_on_rails/configuration_spec.rb +++ b/spec/react_on_rails/configuration_spec.rb @@ -8,7 +8,7 @@ module ReactOnRails config.prerender = false end - expect(ReactOnRails.configuration.server_bundle_js_file).to eq("client/dist/server.js") + expect(ReactOnRails.configuration.server_bundle_js_file).to eq("server.js") expect(ReactOnRails.configuration.prerender).to eq(false) end @@ -18,7 +18,7 @@ module ReactOnRails config.prerender = true end - expect(ReactOnRails.configuration.server_bundle_js_file).to eq("client/dist/something.js") + expect(ReactOnRails.configuration.server_bundle_js_file).to eq("something.js") expect(ReactOnRails.configuration.prerender).to eq(true) end diff --git a/spec/react_on_rails/fixtures/webpack_assets/assets_exist/compiled_js/app-bundle.js b/spec/react_on_rails/fixtures/webpack_assets/assets_exist/compiled_js/client-bundle.js similarity index 100% rename from spec/react_on_rails/fixtures/webpack_assets/assets_exist/compiled_js/app-bundle.js rename to spec/react_on_rails/fixtures/webpack_assets/assets_exist/compiled_js/client-bundle.js diff --git a/spec/react_on_rails/fixtures/webpack_assets/assets_outdated/compiled/vendor-bundle.js b/spec/react_on_rails/fixtures/webpack_assets/assets_exist/compiled_js/server-bundle.js similarity index 100% rename from spec/react_on_rails/fixtures/webpack_assets/assets_outdated/compiled/vendor-bundle.js rename to spec/react_on_rails/fixtures/webpack_assets/assets_exist/compiled_js/server-bundle.js diff --git a/spec/react_on_rails/fixtures/webpack_assets/assets_exist_only_server_bundle/client/myApp.jsx b/spec/react_on_rails/fixtures/webpack_assets/assets_exist_only_server_bundle/client/myApp.jsx new file mode 100644 index 000000000..e69de29bb diff --git a/spec/react_on_rails/fixtures/webpack_assets/assets_exist_only_server_bundle/compiled_js/server-bundle.js b/spec/react_on_rails/fixtures/webpack_assets/assets_exist_only_server_bundle/compiled_js/server-bundle.js new file mode 100644 index 000000000..e69de29bb diff --git a/spec/react_on_rails/fixtures/webpack_assets/assets_outdated/compiled/client-bundle.js b/spec/react_on_rails/fixtures/webpack_assets/assets_outdated/compiled/client-bundle.js new file mode 100644 index 000000000..e69de29bb diff --git a/spec/react_on_rails/generators/install_generator_spec.rb b/spec/react_on_rails/generators/install_generator_spec.rb index 8c1874e58..0626c9372 100644 --- a/spec/react_on_rails/generators/install_generator_spec.rb +++ b/spec/react_on_rails/generators/install_generator_spec.rb @@ -221,7 +221,7 @@ node_modules # Generated js bundles - /app/assets/javascripts/generated/* + /app/assets/webpack/* MSG expect(GeneratorMessages.output) diff --git a/spec/react_on_rails/spec_helper.rb b/spec/react_on_rails/spec_helper.rb index 8588803e9..fcbcaec23 100644 --- a/spec/react_on_rails/spec_helper.rb +++ b/spec/react_on_rails/spec_helper.rb @@ -15,3 +15,97 @@ require "awesome_print" require_relative "./simplecov_helper" + +# This file was generated by the `rails generate rspec:install` command. Conventionally, all +# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`. +# The generated `.rspec` file contains `--require spec_helper` which will cause +# this file to always be loaded, without a need to explicitly require it in any +# files. +# +# Given that it is always loaded, you are encouraged to keep this file as +# light-weight as possible. Requiring heavyweight dependencies from this file +# will add to the boot time of your test suite on EVERY test run, even for an +# individual file that may not need all of that loaded. Instead, consider making +# a separate helper file that requires the additional dependencies and performs +# the additional setup, and require it from the spec files that actually need +# it. +# +# The `.rspec` file also contains a few flags that are not defaults but that +# users commonly want. +# +# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration +RSpec.configure do |config| + config.example_status_persistence_file_path = "spec/examples.txt" + config.run_all_when_everything_filtered = true + + # rspec-expectations config goes here. You can use an alternate + # assertion/expectation library such as wrong or the stdlib/minitest + # assertions if you prefer. + config.expect_with :rspec do |expectations| + # This option will default to `true` in RSpec 4. It makes the `description` + # and `failure_message` of custom matchers include text for helper methods + # defined using `chain`, e.g.: + # be_bigger_than(2).and_smaller_than(4).description + # # => "be bigger than 2 and smaller than 4" + # ...rather than: + # # => "be bigger than 2" + expectations.include_chain_clauses_in_custom_matcher_descriptions = true + end + + # rspec-mocks config goes here. You can use an alternate test double + # library (such as bogus or mocha) by changing the `mock_with` option here. + config.mock_with :rspec do |mocks| + # Prevents you from mocking or stubbing a method that does not exist on + # a real object. This is generally recommended, and will default to + # `true` in RSpec 4. + mocks.verify_partial_doubles = true + end + + # The settings below are suggested to provide a good initial experience + # with RSpec, but feel free to customize to your heart's content. + # # These two settings work together to allow you to limit a spec run + # # to individual examples or groups you care about by tagging them with + # # `:focus` metadata. When nothing is tagged with `:focus`, all examples + # # get run. + # config.filter_run :focus + # config.run_all_when_everything_filtered = true + # + # # Allows RSpec to persist some state between runs in order to support + # # the `--only-failures` and `--next-failure` CLI options. We recommend + # # you configure your source control system to ignore this file. + # config.example_status_persistence_file_path = "spec/examples.txt" + # + # # Limits the available syntax to the non-monkey patched syntax that is + # # recommended. For more details, see: + # # - http://myronmars.to/n/dev-blog/2012/06/rspecs-new-expectation-syntax + # # - http://www.teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/ + # # - http://myronmars.to/n/dev-blog/2014/05/notable-changes-in-rspec-3#new__config_option_to_disable_rspeccore_monkey_patching + # config.disable_monkey_patching! + # + # # Many RSpec users commonly either run the entire suite or an individual + # # file, and it's useful to allow more verbose output when running an + # # individual spec file. + # if config.files_to_run.one? + # # Use the documentation formatter for detailed output, + # # unless a formatter has already been configured + # # (e.g. via a command-line flag). + # config.default_formatter = 'doc' + # end + # + # # Print the 10 slowest examples and example groups at the + # # end of the spec run, to help surface which specs are running + # # particularly slow. + # config.profile_examples = 10 + # + # # Run specs in random order to surface order dependencies. If you find an + # # order dependency and want to debug it, you can fix the order by providing + # # the seed, which is printed after each run. + # # --seed 1234 + # config.order = :random + # + # # Seed global randomization in this process using the `--seed` CLI option. + # # Setting this allows you to use `--seed` to deterministically reproduce + # # test failures related to randomization by passing the same `--seed` value + # # as the one that triggered the failure. + # Kernel.srand config.seed +end diff --git a/spec/react_on_rails/support/shared_examples/base_generator_examples.rb b/spec/react_on_rails/support/shared_examples/base_generator_examples.rb index d0d6a2e70..6cbb3085f 100644 --- a/spec/react_on_rails/support/shared_examples/base_generator_examples.rb +++ b/spec/react_on_rails/support/shared_examples/base_generator_examples.rb @@ -22,7 +22,7 @@ node_modules # Generated js bundles - /app/assets/javascripts/generated/* + /app/assets/webpack/* MATCH assert_file ".gitignore", match end @@ -32,11 +32,11 @@ // DO NOT REQUIRE jQuery or jQuery-ujs in this file! // DO NOT REQUIRE TREE! - // CRITICAL that generated/vendor-bundle must be BEFORE bootstrap-sprockets and turbolinks + // CRITICAL that 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 + //= require vendor-bundle + //= require app-bundle MATCH assert_file("app/assets/javascripts/application.js") do |contents| @@ -87,16 +87,7 @@ end it "appends path configurations to assets.rb" do - expected = <<-EXPECTED.strip_heredoc - # Add client/assets/ folders to asset pipeline's search path. - # If you do not want to move existing images and fonts from your Rails app - # you could also consider creating symlinks there that point to the original - # rails directories. In that case, you would not add these paths here. - Rails.application.config.assets.paths << Rails.root.join("client", "assets", "stylesheets") - Rails.application.config.assets.paths << Rails.root.join("client", "assets", "images") - Rails.application.config.assets.paths << Rails.root.join("client", "assets", "fonts") - Rails.application.config.assets.precompile += %w( generated/server-bundle.js ) - EXPECTED + expected = ReactOnRails::Generators::BaseGenerator::ASSETS_RB_APPEND assert_file("config/initializers/assets.rb") { |contents| assert_match(expected, contents) } end end @@ -185,7 +176,7 @@ end it "sets server bundle js file to server-bundle in react_on_rails initializer" do - regexp = %r{config.server_bundle_js_file = "app/assets/javascripts/generated/server-bundle.js"} + regexp = /config.server_bundle_js_file = "server-bundle.js"/ assert_file("config/initializers/react_on_rails.rb") do |contents| assert_match(regexp, contents) end diff --git a/spec/react_on_rails/support/shared_examples/bootstrap_generator_examples.rb b/spec/react_on_rails/support/shared_examples/bootstrap_generator_examples.rb index 21328ee13..fd724a8f6 100644 --- a/spec/react_on_rails/support/shared_examples/bootstrap_generator_examples.rb +++ b/spec/react_on_rails/support/shared_examples/bootstrap_generator_examples.rb @@ -120,7 +120,7 @@ def bootstrap_related_css_contents def bootstrap_related_js_contents <<-DATA.strip_heredoc - // bootstrap-sprockets depends on generated/vendor-bundle for jQuery. + // bootstrap-sprockets depends on vendor-bundle for jQuery. //= require bootstrap-sprockets DATA diff --git a/spec/react_on_rails/test_helper/ensure_assets_compiled_spec.rb b/spec/react_on_rails/test_helper/ensure_assets_compiled_spec.rb index 04974b314..5a3e3df28 100644 --- a/spec/react_on_rails/test_helper/ensure_assets_compiled_spec.rb +++ b/spec/react_on_rails/test_helper/ensure_assets_compiled_spec.rb @@ -1,69 +1,108 @@ require_relative "../spec_helper" describe ReactOnRails::TestHelper do - describe "#ensureAssetsCompiled" - let(:compiler) { double_assets_compiler } - after { ReactOnRails::TestHelper::EnsureAssetsCompiled.has_been_run = false } + describe "#ensureAssetsCompiled" do + let(:compiler) { double_assets_compiler } + after { ReactOnRails::TestHelper::EnsureAssetsCompiled.has_been_run = false } + + context "when assets are not up to date" do + let(:assets_checker) do + double_assets_checker(stale_generated_webpack_files: + %w( client-bundle.js server-bundle.js )) + end - context "when assets are not up to date" do - let(:assets_checker) { double_assets_checker(up_to_date: false) } + context "and webpack process is running" do + let(:process_checker) do + double_process_checker(client_running?: true, + server_running?: true, + hot_running?: false) + end - context "and webpack process is running" do - let(:process_checker) { double_process_checker(running: true) } + it "sleeps until assets are up to date" do + expect(compiler).not_to receive(:compile_as_necessary) - it "sleeps until assets are up to date" do - expect(compiler).not_to receive(:compile) + thread = Thread.new { invoke_ensurer_with_doubles } - thread = Thread.new { invoke_ensurer_with_doubles } + sleep 0.1 + allow(assets_checker).to receive(:stale_generated_webpack_files).and_return([]) - sleep 0.1 - allow(assets_checker).to receive(:up_to_date?).and_return(true) + thread.join - thread.join + expect(ReactOnRails::TestHelper::EnsureAssetsCompiled.has_been_run).to eq(true) + end + end - expect(ReactOnRails::TestHelper::EnsureAssetsCompiled.has_been_run).to eq(true) + context "and webpack process is NOT running" do + let(:process_checker) do + double_process_checker(client_running?: false, + server_running?: false, + hot_running?: false) + end + + it "compiles the webpack assets" do + expect(compiler).to receive(:compile_as_necessary).once + invoke_ensurer_with_doubles + end end - end - context "and webpack process is NOT running" do - let(:process_checker) { double_process_checker(running: false) } + context "and hot reloading (only server webpack running)" do + let(:process_checker) do + double_process_checker(client_running?: false, + server_running?: true, + hot_running?: true) + end - it "compiles the webpack assets" do - expect(compiler).to receive(:compile).once - invoke_ensurer_with_doubles + it "compiles the webpack assets" do + expect(compiler).to receive(:compile_as_necessary).never + expect(compiler).to receive(:compile_client).once + thread = Thread.new { invoke_ensurer_with_doubles } + + sleep 0.1 + allow(assets_checker).to receive(:stale_generated_webpack_files).and_return([]) + + thread.join + + expect(ReactOnRails::TestHelper::EnsureAssetsCompiled.has_been_run).to eq(true) + end end end - end - context "when assets are up to date" do - let(:assets_checker) { double_assets_checker(up_to_date: true) } - let(:process_checker) { double_process_checker(running: false) } + context "when assets are up to date" do + let(:assets_checker) { double_assets_checker(stale_generated_webpack_files: []) } + let(:process_checker) do + double_process_checker(client_running?: true, + server_running?: true, + hot_running?: false) + end - it "does nothing" do - expect(compiler).not_to receive(:compile) - invoke_ensurer_with_doubles + it "does nothing" do + expect(compiler).not_to receive(:compile_as_necessary) + invoke_ensurer_with_doubles + end end - end - def invoke_ensurer_with_doubles - ReactOnRails::TestHelper.ensure_assets_compiled( - webpack_assets_status_checker: assets_checker, - webpack_assets_compiler: compiler, - webpack_process_checker: process_checker) - end + def invoke_ensurer_with_doubles + ReactOnRails::TestHelper.ensure_assets_compiled( + webpack_assets_status_checker: assets_checker, + webpack_assets_compiler: compiler, + webpack_process_checker: process_checker) + end - def double_process_checker(args = {}) - instance_double(ReactOnRails::TestHelper::WebpackProcessChecker, - running?: args.fetch(:running)) - end + def double_process_checker(args = {}) + instance_double(ReactOnRails::TestHelper::WebpackProcessChecker, + client_running?: args.fetch(:client_running?), + server_running?: args.fetch(:server_running?), + hot_running?: args.fetch(:hot_running?)) + end - def double_assets_checker(args = {}) - instance_double(ReactOnRails::TestHelper::WebpackAssetsStatusChecker, - up_to_date?: args.fetch(:up_to_date)) - end + def double_assets_checker(args = {}) + instance_double(ReactOnRails::TestHelper::WebpackAssetsStatusChecker, + stale_generated_webpack_files: args.fetch(:stale_generated_webpack_files)) + end - def double_assets_compiler - instance_double(ReactOnRails::TestHelper::WebpackAssetsCompiler, - :compile) + def double_assets_compiler + instance_double(ReactOnRails::TestHelper::WebpackAssetsCompiler, + :compile_as_necessary) + end end end diff --git a/spec/react_on_rails/test_helper/webpack_assets_status_checker_spec.rb b/spec/react_on_rails/test_helper/webpack_assets_status_checker_spec.rb index 636365fc7..254defe30 100644 --- a/spec/react_on_rails/test_helper/webpack_assets_status_checker_spec.rb +++ b/spec/react_on_rails/test_helper/webpack_assets_status_checker_spec.rb @@ -2,36 +2,58 @@ require_relative "../spec_helper" describe ReactOnRails::TestHelper::WebpackAssetsStatusChecker do - describe "#up_to_date?" do + describe "#stale_generated_webpack_files" do let(:client_dir) { client_dir_for(fixture_dirname) } - let(:compiled_js_dir) { compiled_js_dir_for(fixture_dirname) } - let(:compiled_sass_dir) { compiled_js_dir_for(fixture_dirname) } + let(:generated_assets_dir) { compiled_js_dir_for(fixture_dirname) } + let(:webpack_generated_files) { %w( client-bundle.js server-bundle.js ) } + let(:server_bundle_js_file) { File.join(generated_assets_dir, "server-bundle.js") } + let(:client_bundle_js_file) { File.join(generated_assets_dir, "client-bundle.js") } + let(:checker) do ReactOnRails::TestHelper::WebpackAssetsStatusChecker - .new(compiled_dirs: [compiled_js_dir, compiled_sass_dir], - client_dir: client_dir) + .new(generated_assets_dir: generated_assets_dir, + client_dir: client_dir, + webpack_generated_files: webpack_generated_files) end context "when compiled assets exist and are up-to-date" do let(:fixture_dirname) { "assets_exist" } before do - touch_files_in_dir(compiled_js_dir) + touch_files_in_dir(generated_assets_dir) end - specify { expect(checker.up_to_date?).to eq(true) } + specify { expect(checker.stale_generated_webpack_files).to eq([]) } end context "when compiled assets don't exist" do let(:fixture_dirname) { "assets_no_exist" } - specify { expect(checker.up_to_date?).to eq(false) } + specify do + expect(checker.stale_generated_webpack_files) + .to eq([client_bundle_js_file, server_bundle_js_file]) + end + end + + context "when only server-bundle.js exists" do + let(:fixture_dirname) { "assets_exist_only_server_bundle" } + before do + touch_files_in_dir(generated_assets_dir) + end + + specify do + expect(checker.stale_generated_webpack_files) + .to eq([client_bundle_js_file]) + end end context "when assets exist but are outdated" do let(:fixture_dirname) { "assets_outdated" } before { touch_files_in_dir(client_dir) } - specify { expect(checker.up_to_date?).to eq(false) } + specify do + expect(checker.stale_generated_webpack_files) + .to eq([client_bundle_js_file, server_bundle_js_file]) + end end end @@ -43,10 +65,6 @@ def compiled_js_dir_for(fixture_dirname) FixturesHelper.get_file(%W(webpack_assets #{fixture_dirname} compiled_js)) end - def compiled_sass_dir_for(fixture_dirname) - FixturesHelper.get_file(%W(webpack_assets #{fixture_dirname} compiled_sass)) - end - # Necessary for ensuring file mtimes of fixtures are correct def touch_files_in_dir(dir) `touch #{dir}/*`