├── .gitignore ├── .npmignore ├── README.md ├── demo ├── .gitignore ├── Gemfile ├── Gemfile.lock ├── README.md ├── Rakefile ├── app │ ├── channels │ │ └── application_cable │ │ │ ├── channel.rb │ │ │ └── connection.rb │ ├── controllers │ │ ├── api │ │ │ └── auth_test_controller.rb │ │ ├── application_controller.rb │ │ ├── concerns │ │ │ └── .keep │ │ └── static_controller.rb │ ├── jobs │ │ └── application_job.rb │ ├── mailers │ │ └── application_mailer.rb │ ├── models │ │ ├── application_record.rb │ │ ├── concerns │ │ │ └── .keep │ │ └── user.rb │ └── views │ │ └── layouts │ │ ├── mailer.html.erb │ │ └── mailer.text.erb ├── bin │ ├── bundle │ ├── rails │ ├── rake │ ├── setup │ ├── spring │ └── update ├── client │ ├── .gitignore │ ├── README.md │ ├── package.json │ ├── public │ │ ├── favicon.ico │ │ ├── index.html │ │ └── manifest.json │ ├── src │ │ ├── actions │ │ │ ├── auth.js │ │ │ ├── flash.js │ │ │ └── headers.js │ │ ├── components │ │ │ ├── App.js │ │ │ ├── AuthRoute.js │ │ │ ├── Authenticated.js │ │ │ ├── ComponentLoader.js │ │ │ ├── FetchUser.js │ │ │ ├── Flash.js │ │ │ ├── Home.js │ │ │ ├── Login.js │ │ │ ├── NavBar.js │ │ │ ├── NoMatch.js │ │ │ ├── ProtectedRoute.js │ │ │ └── Register.js │ │ ├── index.js │ │ ├── reducers │ │ │ ├── flash.js │ │ │ ├── index.js │ │ │ └── user.js │ │ ├── registerServiceWorker.js │ │ └── store.js │ └── yarn.lock ├── config.ru ├── config │ ├── application.rb │ ├── boot.rb │ ├── cable.yml │ ├── database.yml │ ├── environment.rb │ ├── environments │ │ ├── development.rb │ │ ├── production.rb │ │ └── test.rb │ ├── initializers │ │ ├── application_controller_renderer.rb │ │ ├── backtrace_silencers.rb │ │ ├── cors.rb │ │ ├── devise_token_auth.rb │ │ ├── filter_parameter_logging.rb │ │ ├── inflections.rb │ │ ├── mime_types.rb │ │ └── wrap_parameters.rb │ ├── locales │ │ └── en.yml │ ├── puma.rb │ ├── routes.rb │ ├── secrets.yml │ └── spring.rb ├── db │ ├── migrate │ │ └── 20180211191111_devise_token_auth_create_users.rb │ ├── schema.rb │ └── seeds.rb ├── lib │ └── tasks │ │ └── .keep ├── log │ └── .keep ├── package.json ├── public │ └── robots.txt ├── tmp │ └── .keep └── vendor │ └── .keep ├── package.json ├── src └── index.js └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dist 3 | *.tgz 4 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | src 2 | *.tgz 3 | demo/ 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # About 2 | 3 | This package fits a very specific use case. It's purpose is to keep help keep track of new tokens everytime a request is made. It works by capturing the dispatch and updating the axios config with the new headers recieved from devise. There is also a validate token option as well as a logout option. 4 | 5 | * You are using devise token authentiation 6 | * You are using axios 7 | * You are using redux 8 | 9 | # Installation 10 | ```npm install redux-devise-axios``` 11 | 12 | store.js 13 | 14 | ```javascript 15 | import { createStore, compose, applyMiddleware } from 'redux'; 16 | 17 | //This could be saga or promise or any other async middleware 18 | import thunk from 'redux-thunk'; 19 | 20 | import apiMiddleware from 'redux-devise-axios'; 21 | 22 | import rootReducer from './reducers/index'; 23 | import axios from 'axios'; 24 | 25 | 26 | /* OPTIONS 27 | axios: Your axios instance *required 28 | customHeaders: An array of headers you want to add. Defaults: ['access-token', 'token-type', 'client', 'expiry', 'uid'] 29 | validateAction: default 'VALIDATE_TOKEN' 30 | logoutAction: default 'LOGOUT' 31 | */ 32 | const options = { axios } 33 | 34 | 35 | //redux-devise-axios middleware must come after your async middleware 36 | const enhancers = compose( 37 | applyMiddleware(thunk, apiMiddleware(options)), 38 | window.devToolsExtension ? window.devToolsExtension() : f => f 39 | ); 40 | 41 | const store = createStore(rootReducer, {}, enhancers); 42 | ``` 43 | 44 | 45 | # Options 46 | * axios: This is your instance of axios and is required 47 | * customHeaders: Array of additional Headers you want to use 48 | * default: ['access-token', 'token-type', 'client', 'expiry', 'uid'] This is what devise sends by default 49 | * validateAction: This is the action you dispatch in an HOC (Usually because the user refreshed the browser) 50 | * default: 'VALIDATE_TOKEN' 51 | * logoutAction: This is the action you dispatch to logout your user. 52 | * default: 'LOGOUT' 53 | 54 | NOTE: You are resposible for the implementation of LOGOUT and VALIDATE token. These actions simply add to and clear localStorage. 55 | 56 | # Example Usage 57 | 58 | actions/auth.js 59 | ```javascript 60 | import axios from 'axios'; 61 | import { setFlash } from '../actions/flash'; 62 | 63 | export const registerUser = (email, password, passwordConfirmation, history) => { 64 | return(dispatch) => { 65 | axios.post('/api/auth', { email, password, password_confirmation: passwordConfirmation }) 66 | .then( res => { 67 | let { data: { data: user }, headers } = res; 68 | dispatch({ type: 'LOGIN', user, headers }); 69 | history.push('/'); 70 | }) 71 | .catch( res => { 72 | const message = res.response.data.errors.full_messages.join(','); 73 | dispatch(setFlash(message, 'error')); 74 | }); 75 | } 76 | } 77 | 78 | export const handleLogout = (history) => { 79 | return(dispatch) => { 80 | axios.delete('/api/auth/sign_out') 81 | .then( res => { 82 | dispatch({ type: 'LOGOUT' }); 83 | dispatch(setFlash('Logged out successfully!', 'success')); 84 | history.push('/login'); 85 | }) 86 | .catch( res => { 87 | // TODO: handle errors for the client 88 | console.log(res); 89 | }); 90 | } 91 | } 92 | 93 | export const handleLogin = (email, password, history) => { 94 | return(dispatch) => { 95 | axios.post('/api/auth/sign_in', { email, password }) 96 | .then( res => { 97 | let { data: { data: user }, headers } = res 98 | dispatch({ type: 'LOGIN', user, headers }); 99 | history.push('/'); 100 | }) 101 | .catch( res => { 102 | // TODO: handle errors for the client 103 | console.log(res); 104 | }) 105 | } 106 | } 107 | 108 | export const validateToken = (cb = f => f) => { 109 | return (dispatch) => { 110 | dispatch({ type: 'VALIDATE_TOKEN' }) 111 | let headers = axios.defaults.headers.common 112 | axios.get('/api/auth/validate_token', headers) 113 | .then( res => dispatch({ type: 'LOGIN', user: res.data.data }) ) 114 | .catch(() => cb()) 115 | } 116 | } 117 | ``` 118 | Notice that we are sending the headers when we dispatch. This is key to how this package works. Anytime any action is dispatched with a key of headers axios headers will be updated. 119 | 120 | This will work for React State as well as long as you dispatch some action with the res.headers from axios. 121 | 122 | ```javascript 123 | componentDidMount() { 124 | axios.get('/api/bio') 125 | .then( res => { 126 | this.setState({ bio: res.data.body }); 127 | this.props.dispatch(setHeaders(res.headers)) 128 | }) 129 | .catch( res => { 130 | console.log(`Bio GET Fail: ${res}`); 131 | }); 132 | } 133 | ``` 134 | 135 | # Demo 136 | ``` 137 | $ clone project 138 | $ cd demo 139 | $ bundle 140 | $ bundle exec rake db:create db:migrate 141 | $ rails s -p 3001 142 | $ cd client (new tab / pane) 143 | $ yarn or npm install 144 | $ yarn start or npm start 145 | ``` 146 | -------------------------------------------------------------------------------- /demo/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files for more about ignoring files. 2 | # 3 | # If you find yourself ignoring temporary files generated by your text editor 4 | # or operating system, you probably want to add a global ignore instead: 5 | # git config --global core.excludesfile '~/.gitignore_global' 6 | 7 | # Ignore bundler config. 8 | /.bundle 9 | 10 | # Ignore all logfiles and tempfiles. 11 | /log/* 12 | /tmp/* 13 | !/log/.keep 14 | !/tmp/.keep 15 | 16 | .byebug_history 17 | -------------------------------------------------------------------------------- /demo/Gemfile: -------------------------------------------------------------------------------- 1 | source 'https://rubygems.org' 2 | 3 | git_source(:github) do |repo_name| 4 | repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include?("/") 5 | "https://github.com/#{repo_name}.git" 6 | end 7 | 8 | 9 | # Bundle edge Rails instead: gem 'rails', github: 'rails/rails' 10 | gem 'rails', '~> 5.1.4' 11 | # Use postgresql as the database for Active Record 12 | gem 'pg', '~> 0.18' 13 | # Use Puma as the app server 14 | gem 'puma', '~> 3.7' 15 | # Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder 16 | # gem 'jbuilder', '~> 2.5' 17 | # Use Redis adapter to run Action Cable in production 18 | # gem 'redis', '~> 3.0' 19 | # Use ActiveModel has_secure_password 20 | # gem 'bcrypt', '~> 3.1.7' 21 | 22 | # Use Capistrano for deployment 23 | # gem 'capistrano-rails', group: :development 24 | 25 | # Use Rack CORS for handling Cross-Origin Resource Sharing (CORS), making cross-origin AJAX possible 26 | # gem 'rack-cors' 27 | 28 | gem 'omniauth' 29 | gem 'devise' 30 | gem 'devise_token_auth' 31 | group :development, :test do 32 | # Call 'byebug' anywhere in the code to stop execution and get a debugger console 33 | gem 'byebug', platforms: [:mri, :mingw, :x64_mingw] 34 | end 35 | 36 | group :development do 37 | gem 'listen', '>= 3.0.5', '< 3.2' 38 | # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring 39 | gem 'spring' 40 | gem 'spring-watcher-listen', '~> 2.0.0' 41 | end 42 | 43 | # Windows does not include zoneinfo files, so bundle the tzinfo-data gem 44 | gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby] 45 | -------------------------------------------------------------------------------- /demo/Gemfile.lock: -------------------------------------------------------------------------------- 1 | GEM 2 | remote: https://rubygems.org/ 3 | specs: 4 | actioncable (5.1.4) 5 | actionpack (= 5.1.4) 6 | nio4r (~> 2.0) 7 | websocket-driver (~> 0.6.1) 8 | actionmailer (5.1.4) 9 | actionpack (= 5.1.4) 10 | actionview (= 5.1.4) 11 | activejob (= 5.1.4) 12 | mail (~> 2.5, >= 2.5.4) 13 | rails-dom-testing (~> 2.0) 14 | actionpack (5.1.4) 15 | actionview (= 5.1.4) 16 | activesupport (= 5.1.4) 17 | rack (~> 2.0) 18 | rack-test (>= 0.6.3) 19 | rails-dom-testing (~> 2.0) 20 | rails-html-sanitizer (~> 1.0, >= 1.0.2) 21 | actionview (5.1.4) 22 | activesupport (= 5.1.4) 23 | builder (~> 3.1) 24 | erubi (~> 1.4) 25 | rails-dom-testing (~> 2.0) 26 | rails-html-sanitizer (~> 1.0, >= 1.0.3) 27 | activejob (5.1.4) 28 | activesupport (= 5.1.4) 29 | globalid (>= 0.3.6) 30 | activemodel (5.1.4) 31 | activesupport (= 5.1.4) 32 | activerecord (5.1.4) 33 | activemodel (= 5.1.4) 34 | activesupport (= 5.1.4) 35 | arel (~> 8.0) 36 | activesupport (5.1.4) 37 | concurrent-ruby (~> 1.0, >= 1.0.2) 38 | i18n (~> 0.7) 39 | minitest (~> 5.1) 40 | tzinfo (~> 1.1) 41 | arel (8.0.0) 42 | bcrypt (3.1.11) 43 | builder (3.2.3) 44 | byebug (10.0.0) 45 | concurrent-ruby (1.0.5) 46 | crass (1.0.3) 47 | devise (4.3.0) 48 | bcrypt (~> 3.0) 49 | orm_adapter (~> 0.1) 50 | railties (>= 4.1.0, < 5.2) 51 | responders 52 | warden (~> 1.2.3) 53 | devise_token_auth (0.1.42) 54 | devise (> 3.5.2, <= 4.3) 55 | rails (< 6) 56 | erubi (1.7.0) 57 | ffi (1.9.21) 58 | globalid (0.4.1) 59 | activesupport (>= 4.2.0) 60 | hashie (3.5.7) 61 | i18n (0.9.4) 62 | concurrent-ruby (~> 1.0) 63 | listen (3.1.5) 64 | rb-fsevent (~> 0.9, >= 0.9.4) 65 | rb-inotify (~> 0.9, >= 0.9.7) 66 | ruby_dep (~> 1.2) 67 | loofah (2.1.1) 68 | crass (~> 1.0.2) 69 | nokogiri (>= 1.5.9) 70 | mail (2.7.0) 71 | mini_mime (>= 0.1.1) 72 | method_source (0.9.0) 73 | mini_mime (1.0.0) 74 | mini_portile2 (2.3.0) 75 | minitest (5.11.3) 76 | nio4r (2.2.0) 77 | nokogiri (1.8.2) 78 | mini_portile2 (~> 2.3.0) 79 | omniauth (1.8.1) 80 | hashie (>= 3.4.6, < 3.6.0) 81 | rack (>= 1.6.2, < 3) 82 | orm_adapter (0.5.0) 83 | pg (0.21.0) 84 | puma (3.11.2) 85 | rack (2.0.4) 86 | rack-test (0.8.2) 87 | rack (>= 1.0, < 3) 88 | rails (5.1.4) 89 | actioncable (= 5.1.4) 90 | actionmailer (= 5.1.4) 91 | actionpack (= 5.1.4) 92 | actionview (= 5.1.4) 93 | activejob (= 5.1.4) 94 | activemodel (= 5.1.4) 95 | activerecord (= 5.1.4) 96 | activesupport (= 5.1.4) 97 | bundler (>= 1.3.0) 98 | railties (= 5.1.4) 99 | sprockets-rails (>= 2.0.0) 100 | rails-dom-testing (2.0.3) 101 | activesupport (>= 4.2.0) 102 | nokogiri (>= 1.6) 103 | rails-html-sanitizer (1.0.3) 104 | loofah (~> 2.0) 105 | railties (5.1.4) 106 | actionpack (= 5.1.4) 107 | activesupport (= 5.1.4) 108 | method_source 109 | rake (>= 0.8.7) 110 | thor (>= 0.18.1, < 2.0) 111 | rake (12.3.0) 112 | rb-fsevent (0.10.2) 113 | rb-inotify (0.9.10) 114 | ffi (>= 0.5.0, < 2) 115 | responders (2.4.0) 116 | actionpack (>= 4.2.0, < 5.3) 117 | railties (>= 4.2.0, < 5.3) 118 | ruby_dep (1.5.0) 119 | spring (2.0.2) 120 | activesupport (>= 4.2) 121 | spring-watcher-listen (2.0.1) 122 | listen (>= 2.7, < 4.0) 123 | spring (>= 1.2, < 3.0) 124 | sprockets (3.7.1) 125 | concurrent-ruby (~> 1.0) 126 | rack (> 1, < 3) 127 | sprockets-rails (3.2.1) 128 | actionpack (>= 4.0) 129 | activesupport (>= 4.0) 130 | sprockets (>= 3.0.0) 131 | thor (0.20.0) 132 | thread_safe (0.3.6) 133 | tzinfo (1.2.5) 134 | thread_safe (~> 0.1) 135 | warden (1.2.7) 136 | rack (>= 1.0) 137 | websocket-driver (0.6.5) 138 | websocket-extensions (>= 0.1.0) 139 | websocket-extensions (0.1.3) 140 | 141 | PLATFORMS 142 | ruby 143 | 144 | DEPENDENCIES 145 | byebug 146 | devise 147 | devise_token_auth 148 | listen (>= 3.0.5, < 3.2) 149 | omniauth 150 | pg (~> 0.18) 151 | puma (~> 3.7) 152 | rails (~> 5.1.4) 153 | spring 154 | spring-watcher-listen (~> 2.0.0) 155 | tzinfo-data 156 | 157 | BUNDLED WITH 158 | 1.16.1 159 | -------------------------------------------------------------------------------- /demo/README.md: -------------------------------------------------------------------------------- 1 | # README 2 | 3 | This README would normally document whatever steps are necessary to get the 4 | application up and running. 5 | 6 | Things you may want to cover: 7 | 8 | * Ruby version 9 | 10 | * System dependencies 11 | 12 | * Configuration 13 | 14 | * Database creation 15 | 16 | * Database initialization 17 | 18 | * How to run the test suite 19 | 20 | * Services (job queues, cache servers, search engines, etc.) 21 | 22 | * Deployment instructions 23 | 24 | * ... 25 | -------------------------------------------------------------------------------- /demo/Rakefile: -------------------------------------------------------------------------------- 1 | # Add your own tasks in files placed in lib/tasks ending in .rake, 2 | # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake. 3 | 4 | require_relative 'config/application' 5 | 6 | Rails.application.load_tasks 7 | -------------------------------------------------------------------------------- /demo/app/channels/application_cable/channel.rb: -------------------------------------------------------------------------------- 1 | module ApplicationCable 2 | class Channel < ActionCable::Channel::Base 3 | end 4 | end 5 | -------------------------------------------------------------------------------- /demo/app/channels/application_cable/connection.rb: -------------------------------------------------------------------------------- 1 | module ApplicationCable 2 | class Connection < ActionCable::Connection::Base 3 | end 4 | end 5 | -------------------------------------------------------------------------------- /demo/app/controllers/api/auth_test_controller.rb: -------------------------------------------------------------------------------- 1 | class Api::AuthTestController < ApplicationController 2 | before_action :authenticate_user! 3 | 4 | def index 5 | render json: { is_authenicated: user_signed_in? } 6 | end 7 | end 8 | -------------------------------------------------------------------------------- /demo/app/controllers/application_controller.rb: -------------------------------------------------------------------------------- 1 | class ApplicationController < ActionController::API 2 | include DeviseTokenAuth::Concerns::SetUserByToken 3 | end 4 | -------------------------------------------------------------------------------- /demo/app/controllers/concerns/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wdjungst/redux-devise-axios/461693530a650162c36709c34be3b0571f224366/demo/app/controllers/concerns/.keep -------------------------------------------------------------------------------- /demo/app/controllers/static_controller.rb: -------------------------------------------------------------------------------- 1 | require 'rails/application_controller' 2 | 3 | class StaticController < Rails::ApplicationController 4 | layout false 5 | 6 | def index 7 | render file: Rails.root.join('public', 'index.html') 8 | end 9 | end 10 | -------------------------------------------------------------------------------- /demo/app/jobs/application_job.rb: -------------------------------------------------------------------------------- 1 | class ApplicationJob < ActiveJob::Base 2 | end 3 | -------------------------------------------------------------------------------- /demo/app/mailers/application_mailer.rb: -------------------------------------------------------------------------------- 1 | class ApplicationMailer < ActionMailer::Base 2 | default from: 'from@example.com' 3 | layout 'mailer' 4 | end 5 | -------------------------------------------------------------------------------- /demo/app/models/application_record.rb: -------------------------------------------------------------------------------- 1 | class ApplicationRecord < ActiveRecord::Base 2 | self.abstract_class = true 3 | end 4 | -------------------------------------------------------------------------------- /demo/app/models/concerns/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wdjungst/redux-devise-axios/461693530a650162c36709c34be3b0571f224366/demo/app/models/concerns/.keep -------------------------------------------------------------------------------- /demo/app/models/user.rb: -------------------------------------------------------------------------------- 1 | class User < ActiveRecord::Base 2 | # Include default devise modules. 3 | devise :database_authenticatable, :registerable, 4 | :recoverable, :rememberable, :trackable, :validatable, 5 | :omniauthable 6 | include DeviseTokenAuth::Concerns::User 7 | end 8 | -------------------------------------------------------------------------------- /demo/app/views/layouts/mailer.html.erb: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 8 | 9 | 10 | 11 | <%= yield %> 12 | 13 | 14 | -------------------------------------------------------------------------------- /demo/app/views/layouts/mailer.text.erb: -------------------------------------------------------------------------------- 1 | <%= yield %> 2 | -------------------------------------------------------------------------------- /demo/bin/bundle: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__) 3 | load Gem.bin_path('bundler', 'bundle') 4 | -------------------------------------------------------------------------------- /demo/bin/rails: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | begin 3 | load File.expand_path('../spring', __FILE__) 4 | rescue LoadError => e 5 | raise unless e.message.include?('spring') 6 | end 7 | APP_PATH = File.expand_path('../config/application', __dir__) 8 | require_relative '../config/boot' 9 | require 'rails/commands' 10 | -------------------------------------------------------------------------------- /demo/bin/rake: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | begin 3 | load File.expand_path('../spring', __FILE__) 4 | rescue LoadError => e 5 | raise unless e.message.include?('spring') 6 | end 7 | require_relative '../config/boot' 8 | require 'rake' 9 | Rake.application.run 10 | -------------------------------------------------------------------------------- /demo/bin/setup: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | require 'pathname' 3 | require 'fileutils' 4 | include FileUtils 5 | 6 | # path to your application root. 7 | APP_ROOT = Pathname.new File.expand_path('../../', __FILE__) 8 | 9 | def system!(*args) 10 | system(*args) || abort("\n== Command #{args} failed ==") 11 | end 12 | 13 | chdir APP_ROOT do 14 | # This script is a starting point to setup your application. 15 | # Add necessary setup steps to this file. 16 | 17 | puts '== Installing dependencies ==' 18 | system! 'gem install bundler --conservative' 19 | system('bundle check') || system!('bundle install') 20 | 21 | 22 | # puts "\n== Copying sample files ==" 23 | # unless File.exist?('config/database.yml') 24 | # cp 'config/database.yml.sample', 'config/database.yml' 25 | # end 26 | 27 | puts "\n== Preparing database ==" 28 | system! 'bin/rails db:setup' 29 | 30 | puts "\n== Removing old logs and tempfiles ==" 31 | system! 'bin/rails log:clear tmp:clear' 32 | 33 | puts "\n== Restarting application server ==" 34 | system! 'bin/rails restart' 35 | end 36 | -------------------------------------------------------------------------------- /demo/bin/spring: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | 3 | # This file loads spring without using Bundler, in order to be fast. 4 | # It gets overwritten when you run the `spring binstub` command. 5 | 6 | unless defined?(Spring) 7 | require 'rubygems' 8 | require 'bundler' 9 | 10 | lockfile = Bundler::LockfileParser.new(Bundler.default_lockfile.read) 11 | spring = lockfile.specs.detect { |spec| spec.name == "spring" } 12 | if spring 13 | Gem.use_paths Gem.dir, Bundler.bundle_path.to_s, *Gem.path 14 | gem 'spring', spring.version 15 | require 'spring/binstub' 16 | end 17 | end 18 | -------------------------------------------------------------------------------- /demo/bin/update: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | require 'pathname' 3 | require 'fileutils' 4 | include FileUtils 5 | 6 | # path to your application root. 7 | APP_ROOT = Pathname.new File.expand_path('../../', __FILE__) 8 | 9 | def system!(*args) 10 | system(*args) || abort("\n== Command #{args} failed ==") 11 | end 12 | 13 | chdir APP_ROOT do 14 | # This script is a way to update your development environment automatically. 15 | # Add necessary update steps to this file. 16 | 17 | puts '== Installing dependencies ==' 18 | system! 'gem install bundler --conservative' 19 | system('bundle check') || system!('bundle install') 20 | 21 | puts "\n== Updating database ==" 22 | system! 'bin/rails db:migrate' 23 | 24 | puts "\n== Removing old logs and tempfiles ==" 25 | system! 'bin/rails log:clear tmp:clear' 26 | 27 | puts "\n== Restarting application server ==" 28 | system! 'bin/rails restart' 29 | end 30 | -------------------------------------------------------------------------------- /demo/client/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/ignore-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | 6 | # testing 7 | /coverage 8 | 9 | # production 10 | /build 11 | 12 | # misc 13 | .DS_Store 14 | .env.local 15 | .env.development.local 16 | .env.test.local 17 | .env.production.local 18 | 19 | npm-debug.log* 20 | yarn-debug.log* 21 | yarn-error.log* 22 | -------------------------------------------------------------------------------- /demo/client/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "client", 3 | "version": "0.1.0", 4 | "private": true, 5 | "dependencies": { 6 | "axios": "^0.17.1", 7 | "react": "^16.2.0", 8 | "react-dom": "^16.2.0", 9 | "react-redux": "^5.0.6", 10 | "react-router-dom": "^4.2.2", 11 | "react-scripts": "1.1.1", 12 | "redux": "^3.7.2", 13 | "redux-devise-axios": "^0.0.4", 14 | "redux-thunk": "^2.2.0", 15 | "semantic-ui-css": "^2.2.14", 16 | "semantic-ui-react": "^0.78.2" 17 | }, 18 | "scripts": { 19 | "start": "react-scripts start", 20 | "build": "react-scripts build", 21 | "test": "react-scripts test --env=jsdom", 22 | "eject": "react-scripts eject" 23 | }, 24 | "proxy": "http://localhost:3001" 25 | } 26 | -------------------------------------------------------------------------------- /demo/client/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wdjungst/redux-devise-axios/461693530a650162c36709c34be3b0571f224366/demo/client/public/favicon.ico -------------------------------------------------------------------------------- /demo/client/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 11 | 12 | 13 | 22 | React App 23 | 24 | 25 | 28 |
29 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /demo/client/public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "React App", 3 | "name": "Create React App Sample", 4 | "icons": [ 5 | { 6 | "src": "favicon.ico", 7 | "sizes": "64x64 32x32 24x24 16x16", 8 | "type": "image/x-icon" 9 | } 10 | ], 11 | "start_url": "./index.html", 12 | "display": "standalone", 13 | "theme_color": "#000000", 14 | "background_color": "#ffffff" 15 | } 16 | -------------------------------------------------------------------------------- /demo/client/src/actions/auth.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import axios from 'axios'; 3 | import { setFlash } from '../actions/flash'; 4 | import { setHeaders } from '../actions/headers'; 5 | 6 | const login = user => { 7 | return { type: 'LOGIN', user }; 8 | }; 9 | 10 | const logout = () => { 11 | return { type: 'LOGOUT' }; 12 | }; 13 | 14 | export const registerUser = (email, password, passwordConfirmation, history) => { 15 | return dispatch => { 16 | axios.post('/api/auth', { email, password, password_confirmation: passwordConfirmation }) 17 | .then(res => { 18 | const { data: { data: user }, headers } = res; 19 | dispatch(login(user)); 20 | dispatch(setHeaders(headers)); 21 | history.push('/'); 22 | }) 23 | .catch(res => { 24 | const messages = 25 | res.response.data.errors.full_messages.map(message => 26 |
{message}
); 27 | const { headers } = res; 28 | dispatch(setHeaders(headers)); 29 | dispatch(setFlash(messages, 'red')); 30 | }); 31 | }; 32 | }; 33 | 34 | export const handleLogout = history => { 35 | return dispatch => { 36 | axios.delete('/api/auth/sign_out') 37 | .then(res => { 38 | const { headers } = res; 39 | dispatch(setHeaders(headers)); 40 | dispatch(logout()); 41 | dispatch(setFlash('Logged out successfully!', 'green')); 42 | history.push('/login'); 43 | }) 44 | .catch(res => { 45 | const messages = 46 | res.response.data.errors.map(message => 47 |
{message}
); 48 | const { headers } = res; 49 | dispatch(setHeaders(headers)); 50 | dispatch(setFlash(messages, 'red')); 51 | }); 52 | }; 53 | }; 54 | 55 | export const handleLogin = (email, password, history) => { 56 | return dispatch => { 57 | axios.post('/api/auth/sign_in', { email, password }) 58 | .then(res => { 59 | const { data: { data: user }, headers } = res; 60 | dispatch(setHeaders(headers)); 61 | dispatch(login(user)); 62 | history.push('/'); 63 | }) 64 | .catch(res => { 65 | let errors = res.response.data.errors ? res.response.data.errors : { full_messages: ['Something went wrong'] } 66 | if (Array.isArray(errors)) 67 | errors = { full_messages: errors } 68 | const messages = 69 | errors.map(message => 70 |
{message}
); 71 | const { headers } = res; 72 | dispatch(setHeaders(headers)); 73 | dispatch(setFlash(messages, 'red')); 74 | }); 75 | }; 76 | }; 77 | 78 | export const validateToken = (callBack = () => {}) => { 79 | return dispatch => { 80 | dispatch({ type: 'VALIDATE_TOKEN' }); 81 | const headers = axios.defaults.headers.common; 82 | axios.get('/api/auth/validate_token', headers) 83 | .then(res => { 84 | const user = res.data.data; 85 | dispatch(setHeaders(res.headers)); 86 | dispatch(login(user)); 87 | }) 88 | .catch(() => callBack()); 89 | }; 90 | }; 91 | -------------------------------------------------------------------------------- /demo/client/src/actions/flash.js: -------------------------------------------------------------------------------- 1 | export const setFlash = (message, color) => { 2 | return { type: 'SET_FLASH', message, color }; 3 | }; 4 | 5 | export const clearFlash = () => { 6 | return { type: 'CLEAR_FLASH' }; 7 | }; 8 | -------------------------------------------------------------------------------- /demo/client/src/actions/headers.js: -------------------------------------------------------------------------------- 1 | export const setHeaders = headers => { 2 | return { type: 'SET_HEADERS', headers }; 3 | }; 4 | -------------------------------------------------------------------------------- /demo/client/src/components/App.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react'; 2 | import NoMatch from './NoMatch'; 3 | import NavBar from './NavBar'; 4 | import Login from './Login'; 5 | import Register from './Register'; 6 | import Flash from './Flash'; 7 | import Home from './Home'; 8 | import ProtectedRoute from './ProtectedRoute'; 9 | import AuthRoute from './AuthRoute'; 10 | import FetchUser from './FetchUser'; 11 | import { Switch, Route } from 'react-router-dom'; 12 | import Authenticated from './Authenticated'; 13 | 14 | class App extends Component { 15 | render() { 16 | return ( 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | ); 31 | } 32 | } 33 | 34 | export default App; 35 | -------------------------------------------------------------------------------- /demo/client/src/components/AuthRoute.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { Route, Redirect } from 'react-router-dom'; 3 | import { connect } from 'react-redux'; 4 | 5 | const AuthRoute = ({ isAuthenticated, component: Component, ...rest }) => ( 6 | ( 9 | !isAuthenticated 10 | ? () 11 | : ( 12 | ) 18 | )} 19 | /> 20 | ); 21 | 22 | const mapStateToProps = state => { 23 | return { isAuthenticated: state.user.id }; 24 | }; 25 | 26 | export default connect(mapStateToProps)(AuthRoute); 27 | -------------------------------------------------------------------------------- /demo/client/src/components/Authenticated.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { Link } from 'react-router-dom'; 3 | import { Header } from 'semantic-ui-react'; 4 | import { connect } from 'react-redux'; 5 | 6 | const Authenticated = ({ user }) => ( 7 |
8 |
Welcome {user.email}
9 | Go Back 10 |
11 | ) 12 | 13 | const mapStateToProps = (state) => { 14 | return { user: state.user } 15 | } 16 | 17 | export default connect(mapStateToProps)(Authenticated); 18 | -------------------------------------------------------------------------------- /demo/client/src/components/ComponentLoader.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { Segment, Loader } from 'semantic-ui-react'; 3 | 4 | const ComponentLoader = ({ loaded, message, children }) => { 5 | if(loaded) 6 | return children 7 | else 8 | return( 9 | 10 | {message}... 11 | 12 | ) 13 | } 14 | 15 | export default ComponentLoader; -------------------------------------------------------------------------------- /demo/client/src/components/FetchUser.js: -------------------------------------------------------------------------------- 1 | import { Component } from 'react'; 2 | import { connect } from 'react-redux'; 3 | import { validateToken } from '../actions/auth'; 4 | 5 | class FetchUser extends Component { 6 | state = { loaded: false }; 7 | 8 | componentDidMount() { 9 | const { isAuthenticated, dispatch } = this.props; 10 | if (isAuthenticated) this.loaded(); 11 | else dispatch(validateToken(this.loaded)); 12 | } 13 | 14 | componentWillReceiveProps() { 15 | if (!this.state.loaded) this.loaded(); 16 | } 17 | 18 | loaded = () => { 19 | this.setState({ loaded: true }); 20 | } 21 | 22 | render() { 23 | return this.state.loaded ? this.props.children : null; 24 | } 25 | } 26 | 27 | const mapStateToProps = state => { 28 | return { isAuthenticated: state.user.id }; 29 | }; 30 | 31 | export default connect(mapStateToProps)(FetchUser); 32 | -------------------------------------------------------------------------------- /demo/client/src/components/Flash.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react'; 2 | import { connect } from 'react-redux'; 3 | import { Message, Container, Header } from 'semantic-ui-react'; 4 | import { clearFlash } from '../actions/flash'; 5 | import { withRouter } from 'react-router-dom'; 6 | 7 | class Flash extends Component { 8 | componentDidUpdate(prevProps) { 9 | const { location: prevLocation, flash: prevFlash } = prevProps; 10 | const { location, flash, dispatch } = this.props; 11 | 12 | const prevMessage = prevFlash.message; 13 | const prevUrl = prevLocation.pathname; 14 | const currentMessage = flash.message; 15 | const currentUrl = location.pathname; 16 | 17 | if(prevMessage && prevMessage === currentMessage) { 18 | if(prevUrl !== currentUrl) { 19 | clearTimeout(this.flashTimeout); 20 | dispatch(clearFlash()); 21 | } 22 | } 23 | } 24 | 25 | fadeFlash = dispatch => { 26 | setTimeout(() => { 27 | dispatch(clearFlash()); 28 | }, 15000); 29 | } 30 | 31 | render() { 32 | const { dispatch, flash: { message, color } } = this.props; 33 | 34 | if (message) { 35 | return ( 36 | 37 | dispatch(clearFlash())} 39 | color={color} 40 | > 41 |
{message}
42 | {this.fadeFlash(dispatch)} 43 |
44 |
45 | ); 46 | } 47 | return null; 48 | } 49 | } 50 | 51 | const mapStateToProps = state => { 52 | const { flash } = state; 53 | return { flash }; 54 | }; 55 | 56 | export default withRouter(connect(mapStateToProps)(Flash)); 57 | -------------------------------------------------------------------------------- /demo/client/src/components/Home.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react'; 2 | import { Header, Button, Divider } from 'semantic-ui-react'; 3 | import { setHeaders } from '../actions/headers'; 4 | import { connect } from 'react-redux'; 5 | import axios from 'axios' 6 | 7 | class Home extends Component { 8 | handleClick = () => { 9 | const { history, dispatch } = this.props; 10 | axios.get('/api/auth_test') 11 | .then( res => { 12 | dispatch(setHeaders(res.headers)) 13 | history.push('/authenticated') 14 | }); 15 | } 16 | 17 | render() { 18 | return ( 19 |
20 |
Home Component
21 | 22 | 23 |
24 | ); 25 | } 26 | } 27 | 28 | export default connect()(Home); 29 | -------------------------------------------------------------------------------- /demo/client/src/components/Login.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react'; 2 | import { Header, Segment, Form, Button } from 'semantic-ui-react'; 3 | import { connect } from 'react-redux'; 4 | import { handleLogin } from '../actions/auth'; 5 | 6 | class Login extends Component { 7 | state = { email: '', password: '' }; 8 | 9 | handleChange = event => { 10 | const { id, value } = event.target; 11 | this.setState({ [id]: value }); 12 | } 13 | 14 | handleSubmit = event => { 15 | event.preventDefault(); 16 | const { dispatch, history } = this.props; 17 | const { email, password } = this.state; 18 | dispatch(handleLogin(email, password, history)); 19 | } 20 | 21 | render() { 22 | const { email, password } = this.state; 23 | return ( 24 | 25 |
Login
26 |
27 | 28 | 29 | 36 | 37 | 38 | 39 | 47 | 48 | 49 | 50 | 51 |
52 |
53 | ); 54 | } 55 | } 56 | 57 | export default connect()(Login); 58 | -------------------------------------------------------------------------------- /demo/client/src/components/NavBar.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react'; 2 | import { Menu } from 'semantic-ui-react'; 3 | import { Link, withRouter } from 'react-router-dom'; 4 | import { connect } from 'react-redux'; 5 | import { handleLogout } from '../actions/auth'; 6 | 7 | class NavBar extends Component { 8 | rightNavs = () => { 9 | const { user, dispatch, history } = this.props; 10 | 11 | if (user.id) { 12 | return ( 13 | 14 | dispatch(handleLogout(history))} 17 | /> 18 | 19 | ); 20 | } 21 | return ( 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | ); 31 | } 32 | 33 | render() { 34 | return ( 35 |
36 | 37 | 38 | 39 | 40 | { this.rightNavs() } 41 | 42 |
43 | ); 44 | } 45 | } 46 | 47 | const mapStateToProps = state => { 48 | return { user: state.user }; 49 | }; 50 | 51 | export default withRouter(connect(mapStateToProps)(NavBar)); 52 | -------------------------------------------------------------------------------- /demo/client/src/components/NoMatch.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react'; 2 | import { Header } from 'semantic-ui-react'; 3 | import { Link } from 'react-router-dom'; 4 | 5 | class NoMatch extends Component { 6 | render() { 7 | return ( 8 |
9 | Page Not Found 10 | Home 11 |
12 | ); 13 | } 14 | } 15 | 16 | export default NoMatch; 17 | -------------------------------------------------------------------------------- /demo/client/src/components/ProtectedRoute.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { Route, Redirect } from 'react-router-dom'; 3 | import { connect } from 'react-redux'; 4 | 5 | const ProtectedRoute = ({ isAuthenticated, component: Component, ...rest }) => ( 6 | ( 9 | isAuthenticated 10 | ? () 11 | : ( 12 | ) 18 | )} 19 | /> 20 | ); 21 | 22 | const mapStateToProps = state => { 23 | return { isAuthenticated: state.user.id }; 24 | }; 25 | 26 | export default connect(mapStateToProps)(ProtectedRoute); 27 | -------------------------------------------------------------------------------- /demo/client/src/components/Register.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react'; 2 | import { Header, Form, Button, Segment } from 'semantic-ui-react'; 3 | import { connect } from 'react-redux'; 4 | import { registerUser } from '../actions/auth'; 5 | import { setFlash } from '../actions/flash'; 6 | 7 | class Register extends Component { 8 | state = { email: '', password: '', passwordConfirmation: '' }; 9 | 10 | handleSubmit = event => { 11 | event.preventDefault(); 12 | const { email, password, passwordConfirmation } = this.state; 13 | const { dispatch, history } = this.props; 14 | if (password === passwordConfirmation) { 15 | dispatch(registerUser(email, password, passwordConfirmation, history)); 16 | } else dispatch(setFlash('Passwords do not match!, please try again', 'red')); 17 | } 18 | 19 | handleChange = event => { 20 | // use e to grab the id off the element also the value and set state 21 | // const { id, value } = event.target; 22 | const id = event.target.id; 23 | const value = event.target.value; 24 | this.setState({ [id]: value }); 25 | } 26 | 27 | render() { 28 | const { email, password, passwordConfirmation } = this.state; 29 | 30 | return ( 31 | 32 |
Register Component
33 |
34 | 35 | 36 | 43 | 44 | 45 | 46 | 54 | 55 | 56 | 57 | 65 | 66 | 67 | 68 | 69 |
70 |
71 | ); 72 | } 73 | } 74 | 75 | export default connect()(Register); 76 | -------------------------------------------------------------------------------- /demo/client/src/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import ReactDOM from 'react-dom'; 3 | import App from './components/App'; 4 | import registerServiceWorker from './registerServiceWorker'; 5 | import { BrowserRouter } from 'react-router-dom'; 6 | import { Provider } from 'react-redux'; 7 | import store from './store'; 8 | import 'semantic-ui-css/semantic.min.css'; 9 | 10 | ReactDOM.render( 11 | 12 | 13 | 14 | 15 | , 16 | document.getElementById('root') 17 | ); 18 | registerServiceWorker(); 19 | -------------------------------------------------------------------------------- /demo/client/src/reducers/flash.js: -------------------------------------------------------------------------------- 1 | const flash = (state = {}, action) => { 2 | switch (action.type) { 3 | case 'SET_FLASH': 4 | return { message: action.message, color: action.color }; 5 | case 'CLEAR_FLASH': 6 | return {}; 7 | default: 8 | return state; 9 | } 10 | }; 11 | 12 | export default flash; 13 | -------------------------------------------------------------------------------- /demo/client/src/reducers/index.js: -------------------------------------------------------------------------------- 1 | import { combineReducers } from 'redux'; 2 | import user from './user'; 3 | import flash from './flash'; 4 | 5 | const rootReducer = combineReducers({ 6 | user, 7 | flash 8 | }); 9 | 10 | export default rootReducer; 11 | -------------------------------------------------------------------------------- /demo/client/src/reducers/user.js: -------------------------------------------------------------------------------- 1 | const user = (state = {}, action) => { 2 | switch (action.type) { 3 | case 'LOGIN': 4 | return action.user; 5 | case 'LOGOUT': 6 | return {}; 7 | default: 8 | return state; 9 | } 10 | }; 11 | 12 | export default user; 13 | -------------------------------------------------------------------------------- /demo/client/src/registerServiceWorker.js: -------------------------------------------------------------------------------- 1 | // In production, we register a service worker to serve assets from local cache. 2 | 3 | // This lets the app load faster on subsequent visits in production, and gives 4 | // it offline capabilities. However, it also means that developers (and users) 5 | // will only see deployed updates on the "N+1" visit to a page, since previously 6 | // cached resources are updated in the background. 7 | 8 | // To learn more about the benefits of this model, read https://goo.gl/KwvDNy. 9 | // This link also includes instructions on opting out of this behavior. 10 | 11 | const isLocalhost = Boolean( 12 | window.location.hostname === 'localhost' || 13 | // [::1] is the IPv6 localhost address. 14 | window.location.hostname === '[::1]' || 15 | // 127.0.0.1/8 is considered localhost for IPv4. 16 | window.location.hostname.match( 17 | /^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/ 18 | ) 19 | ); 20 | 21 | export default function register() { 22 | if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) { 23 | // The URL constructor is available in all browsers that support SW. 24 | const publicUrl = new URL(process.env.PUBLIC_URL, window.location); 25 | if (publicUrl.origin !== window.location.origin) { 26 | // Our service worker won't work if PUBLIC_URL is on a different origin 27 | // from what our page is served on. This might happen if a CDN is used to 28 | // serve assets; see https://github.com/facebookincubator/create-react-app/issues/2374 29 | return; 30 | } 31 | 32 | window.addEventListener('load', () => { 33 | const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`; 34 | 35 | if (isLocalhost) { 36 | // This is running on localhost. Lets check if a service worker still exists or not. 37 | checkValidServiceWorker(swUrl); 38 | 39 | // Add some additional logging to localhost, pointing developers to the 40 | // service worker/PWA documentation. 41 | navigator.serviceWorker.ready.then(() => { 42 | console.log( 43 | 'This web app is being served cache-first by a service ' + 44 | 'worker. To learn more, visit https://goo.gl/SC7cgQ' 45 | ); 46 | }); 47 | } else { 48 | // Is not local host. Just register service worker 49 | registerValidSW(swUrl); 50 | } 51 | }); 52 | } 53 | } 54 | 55 | function registerValidSW(swUrl) { 56 | navigator.serviceWorker 57 | .register(swUrl) 58 | .then(registration => { 59 | registration.onupdatefound = () => { 60 | const installingWorker = registration.installing; 61 | installingWorker.onstatechange = () => { 62 | if (installingWorker.state === 'installed') { 63 | if (navigator.serviceWorker.controller) { 64 | // At this point, the old content will have been purged and 65 | // the fresh content will have been added to the cache. 66 | // It's the perfect time to display a "New content is 67 | // available; please refresh." message in your web app. 68 | console.log('New content is available; please refresh.'); 69 | } else { 70 | // At this point, everything has been precached. 71 | // It's the perfect time to display a 72 | // "Content is cached for offline use." message. 73 | console.log('Content is cached for offline use.'); 74 | } 75 | } 76 | }; 77 | }; 78 | }) 79 | .catch(error => { 80 | console.error('Error during service worker registration:', error); 81 | }); 82 | } 83 | 84 | function checkValidServiceWorker(swUrl) { 85 | // Check if the service worker can be found. If it can't reload the page. 86 | fetch(swUrl) 87 | .then(response => { 88 | // Ensure service worker exists, and that we really are getting a JS file. 89 | if ( 90 | response.status === 404 || 91 | response.headers.get('content-type').indexOf('javascript') === -1 92 | ) { 93 | // No service worker found. Probably a different app. Reload the page. 94 | navigator.serviceWorker.ready.then(registration => { 95 | registration.unregister().then(() => { 96 | window.location.reload(); 97 | }); 98 | }); 99 | } else { 100 | // Service worker found. Proceed as normal. 101 | registerValidSW(swUrl); 102 | } 103 | }) 104 | .catch(() => { 105 | console.log( 106 | 'No internet connection found. App is running in offline mode.' 107 | ); 108 | }); 109 | } 110 | 111 | export function unregister() { 112 | if ('serviceWorker' in navigator) { 113 | navigator.serviceWorker.ready.then(registration => { 114 | registration.unregister(); 115 | }); 116 | } 117 | } 118 | -------------------------------------------------------------------------------- /demo/client/src/store.js: -------------------------------------------------------------------------------- 1 | import { createStore, compose, applyMiddleware } from 'redux'; 2 | import thunk from 'redux-thunk'; 3 | import apiMiddleware from 'redux-devise-axios'; 4 | import rootReducer from './reducers/index'; 5 | import axios from 'axios'; 6 | 7 | const options = { axios }; 8 | 9 | const enhancers = compose( 10 | applyMiddleware(thunk, apiMiddleware(options)), 11 | window.devToolsExtension ? window.devToolsExtension() : f => f 12 | ); 13 | 14 | const store = createStore(rootReducer, {}, enhancers); 15 | 16 | if (module.hot) { 17 | module.hot.accept('./reducers/', () => { 18 | const nextRootReducer = require('./reducers/index').default; 19 | store.replaceReducer(nextRootReducer); 20 | }); 21 | } 22 | 23 | export default store; 24 | -------------------------------------------------------------------------------- /demo/config.ru: -------------------------------------------------------------------------------- 1 | # This file is used by Rack-based servers to start the application. 2 | 3 | require_relative 'config/environment' 4 | 5 | run Rails.application 6 | -------------------------------------------------------------------------------- /demo/config/application.rb: -------------------------------------------------------------------------------- 1 | require_relative 'boot' 2 | 3 | require "rails" 4 | # Pick the frameworks you want: 5 | require "active_model/railtie" 6 | require "active_job/railtie" 7 | require "active_record/railtie" 8 | require "action_controller/railtie" 9 | require "action_mailer/railtie" 10 | require "action_view/railtie" 11 | require "action_cable/engine" 12 | # require "sprockets/railtie" 13 | # require "rails/test_unit/railtie" 14 | 15 | # Require the gems listed in Gemfile, including any gems 16 | # you've limited to :test, :development, or :production. 17 | Bundler.require(*Rails.groups) 18 | 19 | module Demo 20 | class Application < Rails::Application 21 | # Initialize configuration defaults for originally generated Rails version. 22 | config.load_defaults 5.1 23 | 24 | # Settings in config/environments/* take precedence over those specified here. 25 | # Application configuration should go into files in config/initializers 26 | # -- all .rb files in that directory are automatically loaded. 27 | 28 | # Only loads a smaller set of middleware suitable for API only apps. 29 | # Middleware like session, flash, cookies can be added back manually. 30 | # Skip views, helpers and assets when generating a new resource. 31 | config.api_only = true 32 | end 33 | end 34 | -------------------------------------------------------------------------------- /demo/config/boot.rb: -------------------------------------------------------------------------------- 1 | ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__) 2 | 3 | require 'bundler/setup' # Set up gems listed in the Gemfile. 4 | -------------------------------------------------------------------------------- /demo/config/cable.yml: -------------------------------------------------------------------------------- 1 | development: 2 | adapter: async 3 | 4 | test: 5 | adapter: async 6 | 7 | production: 8 | adapter: redis 9 | url: redis://localhost:6379/1 10 | channel_prefix: demo_production 11 | -------------------------------------------------------------------------------- /demo/config/database.yml: -------------------------------------------------------------------------------- 1 | # PostgreSQL. Versions 9.1 and up are supported. 2 | # 3 | # Install the pg driver: 4 | # gem install pg 5 | # On OS X with Homebrew: 6 | # gem install pg -- --with-pg-config=/usr/local/bin/pg_config 7 | # On OS X with MacPorts: 8 | # gem install pg -- --with-pg-config=/opt/local/lib/postgresql84/bin/pg_config 9 | # On Windows: 10 | # gem install pg 11 | # Choose the win32 build. 12 | # Install PostgreSQL and put its /bin directory on your path. 13 | # 14 | # Configure Using Gemfile 15 | # gem 'pg' 16 | # 17 | default: &default 18 | adapter: postgresql 19 | encoding: unicode 20 | # For details on connection pooling, see Rails configuration guide 21 | # http://guides.rubyonrails.org/configuring.html#database-pooling 22 | pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> 23 | 24 | development: 25 | <<: *default 26 | database: demo_development 27 | 28 | # The specified database role being used to connect to postgres. 29 | # To create additional roles in postgres see `$ createuser --help`. 30 | # When left blank, postgres will use the default role. This is 31 | # the same name as the operating system user that initialized the database. 32 | #username: demo 33 | 34 | # The password associated with the postgres role (username). 35 | #password: 36 | 37 | # Connect on a TCP socket. Omitted by default since the client uses a 38 | # domain socket that doesn't need configuration. Windows does not have 39 | # domain sockets, so uncomment these lines. 40 | #host: localhost 41 | 42 | # The TCP port the server listens on. Defaults to 5432. 43 | # If your server runs on a different port number, change accordingly. 44 | #port: 5432 45 | 46 | # Schema search path. The server defaults to $user,public 47 | #schema_search_path: myapp,sharedapp,public 48 | 49 | # Minimum log levels, in increasing order: 50 | # debug5, debug4, debug3, debug2, debug1, 51 | # log, notice, warning, error, fatal, and panic 52 | # Defaults to warning. 53 | #min_messages: notice 54 | 55 | # Warning: The database defined as "test" will be erased and 56 | # re-generated from your development database when you run "rake". 57 | # Do not set this db to the same as development or production. 58 | test: 59 | <<: *default 60 | database: demo_test 61 | 62 | # As with config/secrets.yml, you never want to store sensitive information, 63 | # like your database password, in your source code. If your source code is 64 | # ever seen by anyone, they now have access to your database. 65 | # 66 | # Instead, provide the password as a unix environment variable when you boot 67 | # the app. Read http://guides.rubyonrails.org/configuring.html#configuring-a-database 68 | # for a full rundown on how to provide these environment variables in a 69 | # production deployment. 70 | # 71 | # On Heroku and other platform providers, you may have a full connection URL 72 | # available as an environment variable. For example: 73 | # 74 | # DATABASE_URL="postgres://myuser:mypass@localhost/somedatabase" 75 | # 76 | # You can use this database configuration with: 77 | # 78 | # production: 79 | # url: <%= ENV['DATABASE_URL'] %> 80 | # 81 | production: 82 | <<: *default 83 | database: demo_production 84 | username: demo 85 | password: <%= ENV['DEMO_DATABASE_PASSWORD'] %> 86 | -------------------------------------------------------------------------------- /demo/config/environment.rb: -------------------------------------------------------------------------------- 1 | # Load the Rails application. 2 | require_relative 'application' 3 | 4 | # Initialize the Rails application. 5 | Rails.application.initialize! 6 | -------------------------------------------------------------------------------- /demo/config/environments/development.rb: -------------------------------------------------------------------------------- 1 | Rails.application.configure do 2 | # Settings specified here will take precedence over those in config/application.rb. 3 | 4 | # In the development environment your application's code is reloaded on 5 | # every request. This slows down response time but is perfect for development 6 | # since you don't have to restart the web server when you make code changes. 7 | config.cache_classes = false 8 | 9 | # Do not eager load code on boot. 10 | config.eager_load = false 11 | 12 | # Show full error reports. 13 | config.consider_all_requests_local = true 14 | 15 | # Enable/disable caching. By default caching is disabled. 16 | if Rails.root.join('tmp/caching-dev.txt').exist? 17 | config.action_controller.perform_caching = true 18 | 19 | config.cache_store = :memory_store 20 | config.public_file_server.headers = { 21 | 'Cache-Control' => "public, max-age=#{2.days.seconds.to_i}" 22 | } 23 | else 24 | config.action_controller.perform_caching = false 25 | 26 | config.cache_store = :null_store 27 | end 28 | 29 | # Don't care if the mailer can't send. 30 | config.action_mailer.raise_delivery_errors = false 31 | 32 | config.action_mailer.perform_caching = false 33 | 34 | # Print deprecation notices to the Rails logger. 35 | config.active_support.deprecation = :log 36 | 37 | # Raise an error on page load if there are pending migrations. 38 | config.active_record.migration_error = :page_load 39 | 40 | 41 | # Raises error for missing translations 42 | # config.action_view.raise_on_missing_translations = true 43 | 44 | # Use an evented file watcher to asynchronously detect changes in source code, 45 | # routes, locales, etc. This feature depends on the listen gem. 46 | config.file_watcher = ActiveSupport::EventedFileUpdateChecker 47 | end 48 | -------------------------------------------------------------------------------- /demo/config/environments/production.rb: -------------------------------------------------------------------------------- 1 | Rails.application.configure do 2 | # Settings specified here will take precedence over those in config/application.rb. 3 | 4 | # Code is not reloaded between requests. 5 | config.cache_classes = true 6 | 7 | # Eager load code on boot. This eager loads most of Rails and 8 | # your application in memory, allowing both threaded web servers 9 | # and those relying on copy on write to perform better. 10 | # Rake tasks automatically ignore this option for performance. 11 | config.eager_load = true 12 | 13 | # Full error reports are disabled and caching is turned on. 14 | config.consider_all_requests_local = false 15 | config.action_controller.perform_caching = true 16 | 17 | # Attempt to read encrypted secrets from `config/secrets.yml.enc`. 18 | # Requires an encryption key in `ENV["RAILS_MASTER_KEY"]` or 19 | # `config/secrets.yml.key`. 20 | config.read_encrypted_secrets = true 21 | 22 | # Disable serving static files from the `/public` folder by default since 23 | # Apache or NGINX already handles this. 24 | config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present? 25 | 26 | 27 | # Enable serving of images, stylesheets, and JavaScripts from an asset server. 28 | # config.action_controller.asset_host = 'http://assets.example.com' 29 | 30 | # Specifies the header that your server uses for sending files. 31 | # config.action_dispatch.x_sendfile_header = 'X-Sendfile' # for Apache 32 | # config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for NGINX 33 | 34 | # Mount Action Cable outside main process or domain 35 | # config.action_cable.mount_path = nil 36 | # config.action_cable.url = 'wss://example.com/cable' 37 | # config.action_cable.allowed_request_origins = [ 'http://example.com', /http:\/\/example.*/ ] 38 | 39 | # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies. 40 | # config.force_ssl = true 41 | 42 | # Use the lowest log level to ensure availability of diagnostic information 43 | # when problems arise. 44 | config.log_level = :debug 45 | 46 | # Prepend all log lines with the following tags. 47 | config.log_tags = [ :request_id ] 48 | 49 | # Use a different cache store in production. 50 | # config.cache_store = :mem_cache_store 51 | 52 | # Use a real queuing backend for Active Job (and separate queues per environment) 53 | # config.active_job.queue_adapter = :resque 54 | # config.active_job.queue_name_prefix = "demo_#{Rails.env}" 55 | config.action_mailer.perform_caching = false 56 | 57 | # Ignore bad email addresses and do not raise email delivery errors. 58 | # Set this to true and configure the email server for immediate delivery to raise delivery errors. 59 | # config.action_mailer.raise_delivery_errors = false 60 | 61 | # Enable locale fallbacks for I18n (makes lookups for any locale fall back to 62 | # the I18n.default_locale when a translation cannot be found). 63 | config.i18n.fallbacks = true 64 | 65 | # Send deprecation notices to registered listeners. 66 | config.active_support.deprecation = :notify 67 | 68 | # Use default logging formatter so that PID and timestamp are not suppressed. 69 | config.log_formatter = ::Logger::Formatter.new 70 | 71 | # Use a different logger for distributed setups. 72 | # require 'syslog/logger' 73 | # config.logger = ActiveSupport::TaggedLogging.new(Syslog::Logger.new 'app-name') 74 | 75 | if ENV["RAILS_LOG_TO_STDOUT"].present? 76 | logger = ActiveSupport::Logger.new(STDOUT) 77 | logger.formatter = config.log_formatter 78 | config.logger = ActiveSupport::TaggedLogging.new(logger) 79 | end 80 | 81 | # Do not dump schema after migrations. 82 | config.active_record.dump_schema_after_migration = false 83 | end 84 | -------------------------------------------------------------------------------- /demo/config/environments/test.rb: -------------------------------------------------------------------------------- 1 | Rails.application.configure do 2 | # Settings specified here will take precedence over those in config/application.rb. 3 | 4 | # The test environment is used exclusively to run your application's 5 | # test suite. You never need to work with it otherwise. Remember that 6 | # your test database is "scratch space" for the test suite and is wiped 7 | # and recreated between test runs. Don't rely on the data there! 8 | config.cache_classes = true 9 | 10 | # Do not eager load code on boot. This avoids loading your whole application 11 | # just for the purpose of running a single test. If you are using a tool that 12 | # preloads Rails for running tests, you may have to set it to true. 13 | config.eager_load = false 14 | 15 | # Configure public file server for tests with Cache-Control for performance. 16 | config.public_file_server.enabled = true 17 | config.public_file_server.headers = { 18 | 'Cache-Control' => "public, max-age=#{1.hour.seconds.to_i}" 19 | } 20 | 21 | # Show full error reports and disable caching. 22 | config.consider_all_requests_local = true 23 | config.action_controller.perform_caching = false 24 | 25 | # Raise exceptions instead of rendering exception templates. 26 | config.action_dispatch.show_exceptions = false 27 | 28 | # Disable request forgery protection in test environment. 29 | config.action_controller.allow_forgery_protection = false 30 | config.action_mailer.perform_caching = false 31 | 32 | # Tell Action Mailer not to deliver emails to the real world. 33 | # The :test delivery method accumulates sent emails in the 34 | # ActionMailer::Base.deliveries array. 35 | config.action_mailer.delivery_method = :test 36 | 37 | # Print deprecation notices to the stderr. 38 | config.active_support.deprecation = :stderr 39 | 40 | # Raises error for missing translations 41 | # config.action_view.raise_on_missing_translations = true 42 | end 43 | -------------------------------------------------------------------------------- /demo/config/initializers/application_controller_renderer.rb: -------------------------------------------------------------------------------- 1 | # Be sure to restart your server when you modify this file. 2 | 3 | # ActiveSupport::Reloader.to_prepare do 4 | # ApplicationController.renderer.defaults.merge!( 5 | # http_host: 'example.org', 6 | # https: false 7 | # ) 8 | # end 9 | -------------------------------------------------------------------------------- /demo/config/initializers/backtrace_silencers.rb: -------------------------------------------------------------------------------- 1 | # Be sure to restart your server when you modify this file. 2 | 3 | # You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces. 4 | # Rails.backtrace_cleaner.add_silencer { |line| line =~ /my_noisy_library/ } 5 | 6 | # You can also remove all the silencers if you're trying to debug a problem that might stem from framework code. 7 | # Rails.backtrace_cleaner.remove_silencers! 8 | -------------------------------------------------------------------------------- /demo/config/initializers/cors.rb: -------------------------------------------------------------------------------- 1 | # Be sure to restart your server when you modify this file. 2 | 3 | # Avoid CORS issues when API is called from the frontend app. 4 | # Handle Cross-Origin Resource Sharing (CORS) in order to accept cross-origin AJAX requests. 5 | 6 | # Read more: https://github.com/cyu/rack-cors 7 | 8 | # Rails.application.config.middleware.insert_before 0, Rack::Cors do 9 | # allow do 10 | # origins 'example.com' 11 | # 12 | # resource '*', 13 | # headers: :any, 14 | # methods: [:get, :post, :put, :patch, :delete, :options, :head] 15 | # end 16 | # end 17 | -------------------------------------------------------------------------------- /demo/config/initializers/devise_token_auth.rb: -------------------------------------------------------------------------------- 1 | DeviseTokenAuth.setup do |config| 2 | # By default the authorization headers will change after each request. The 3 | # client is responsible for keeping track of the changing tokens. Change 4 | # this to false to prevent the Authorization header from changing after 5 | # each request. 6 | config.change_headers_on_each_request = true 7 | 8 | # By default, users will need to re-authenticate after 2 weeks. This setting 9 | # determines how long tokens will remain valid after they are issued. 10 | # config.token_lifespan = 2.weeks 11 | 12 | # Sets the max number of concurrent devices per user, which is 10 by default. 13 | # After this limit is reached, the oldest tokens will be removed. 14 | # config.max_number_of_devices = 10 15 | 16 | # Sometimes it's necessary to make several requests to the API at the same 17 | # time. In this case, each request in the batch will need to share the same 18 | # auth token. This setting determines how far apart the requests can be while 19 | # still using the same auth token. 20 | # config.batch_request_buffer_throttle = 5.seconds 21 | 22 | # This route will be the prefix for all oauth2 redirect callbacks. For 23 | # example, using the default '/omniauth', the github oauth2 provider will 24 | # redirect successful authentications to '/omniauth/github/callback' 25 | # config.omniauth_prefix = "/omniauth" 26 | 27 | # By default sending current password is not needed for the password update. 28 | # Uncomment to enforce current_password param to be checked before all 29 | # attribute updates. Set it to :password if you want it to be checked only if 30 | # password is updated. 31 | # config.check_current_password_before_update = :attributes 32 | 33 | # By default we will use callbacks for single omniauth. 34 | # It depends on fields like email, provider and uid. 35 | # config.default_callbacks = true 36 | 37 | # Makes it possible to change the headers names 38 | # config.headers_names = {:'access-token' => 'access-token', 39 | # :'client' => 'client', 40 | # :'expiry' => 'expiry', 41 | # :'uid' => 'uid', 42 | # :'token-type' => 'token-type' } 43 | 44 | # By default, only Bearer Token authentication is implemented out of the box. 45 | # If, however, you wish to integrate with legacy Devise authentication, you can 46 | # do so by enabling this flag. NOTE: This feature is highly experimental! 47 | # config.enable_standard_devise_support = false 48 | end 49 | -------------------------------------------------------------------------------- /demo/config/initializers/filter_parameter_logging.rb: -------------------------------------------------------------------------------- 1 | # Be sure to restart your server when you modify this file. 2 | 3 | # Configure sensitive parameters which will be filtered from the log file. 4 | Rails.application.config.filter_parameters += [:password] 5 | -------------------------------------------------------------------------------- /demo/config/initializers/inflections.rb: -------------------------------------------------------------------------------- 1 | # Be sure to restart your server when you modify this file. 2 | 3 | # Add new inflection rules using the following format. Inflections 4 | # are locale specific, and you may define rules for as many different 5 | # locales as you wish. All of these examples are active by default: 6 | # ActiveSupport::Inflector.inflections(:en) do |inflect| 7 | # inflect.plural /^(ox)$/i, '\1en' 8 | # inflect.singular /^(ox)en/i, '\1' 9 | # inflect.irregular 'person', 'people' 10 | # inflect.uncountable %w( fish sheep ) 11 | # end 12 | 13 | # These inflection rules are supported but not enabled by default: 14 | # ActiveSupport::Inflector.inflections(:en) do |inflect| 15 | # inflect.acronym 'RESTful' 16 | # end 17 | -------------------------------------------------------------------------------- /demo/config/initializers/mime_types.rb: -------------------------------------------------------------------------------- 1 | # Be sure to restart your server when you modify this file. 2 | 3 | # Add new mime types for use in respond_to blocks: 4 | # Mime::Type.register "text/richtext", :rtf 5 | -------------------------------------------------------------------------------- /demo/config/initializers/wrap_parameters.rb: -------------------------------------------------------------------------------- 1 | # Be sure to restart your server when you modify this file. 2 | 3 | # This file contains settings for ActionController::ParamsWrapper which 4 | # is enabled by default. 5 | 6 | # Enable parameter wrapping for JSON. You can disable this by setting :format to an empty array. 7 | ActiveSupport.on_load(:action_controller) do 8 | wrap_parameters format: [:json] 9 | end 10 | 11 | # To enable root element in JSON for ActiveRecord objects. 12 | # ActiveSupport.on_load(:active_record) do 13 | # self.include_root_in_json = true 14 | # end 15 | -------------------------------------------------------------------------------- /demo/config/locales/en.yml: -------------------------------------------------------------------------------- 1 | # Files in the config/locales directory are used for internationalization 2 | # and are automatically loaded by Rails. If you want to use locales other 3 | # than English, add the necessary files in this directory. 4 | # 5 | # To use the locales, use `I18n.t`: 6 | # 7 | # I18n.t 'hello' 8 | # 9 | # In views, this is aliased to just `t`: 10 | # 11 | # <%= t('hello') %> 12 | # 13 | # To use a different locale, set it with `I18n.locale`: 14 | # 15 | # I18n.locale = :es 16 | # 17 | # This would use the information in config/locales/es.yml. 18 | # 19 | # The following keys must be escaped otherwise they will not be retrieved by 20 | # the default I18n backend: 21 | # 22 | # true, false, on, off, yes, no 23 | # 24 | # Instead, surround them with single quotes. 25 | # 26 | # en: 27 | # 'true': 'foo' 28 | # 29 | # To learn more, please read the Rails Internationalization guide 30 | # available at http://guides.rubyonrails.org/i18n.html. 31 | 32 | en: 33 | hello: "Hello world" 34 | -------------------------------------------------------------------------------- /demo/config/puma.rb: -------------------------------------------------------------------------------- 1 | # Puma can serve each request in a thread from an internal thread pool. 2 | # The `threads` method setting takes two numbers: a minimum and maximum. 3 | # Any libraries that use thread pools should be configured to match 4 | # the maximum value specified for Puma. Default is set to 5 threads for minimum 5 | # and maximum; this matches the default thread size of Active Record. 6 | # 7 | threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 } 8 | threads threads_count, threads_count 9 | 10 | # Specifies the `port` that Puma will listen on to receive requests; default is 3000. 11 | # 12 | port ENV.fetch("PORT") { 3000 } 13 | 14 | # Specifies the `environment` that Puma will run in. 15 | # 16 | environment ENV.fetch("RAILS_ENV") { "development" } 17 | 18 | # Specifies the number of `workers` to boot in clustered mode. 19 | # Workers are forked webserver processes. If using threads and workers together 20 | # the concurrency of the application would be max `threads` * `workers`. 21 | # Workers do not work on JRuby or Windows (both of which do not support 22 | # processes). 23 | # 24 | # workers ENV.fetch("WEB_CONCURRENCY") { 2 } 25 | 26 | # Use the `preload_app!` method when specifying a `workers` number. 27 | # This directive tells Puma to first boot the application and load code 28 | # before forking the application. This takes advantage of Copy On Write 29 | # process behavior so workers use less memory. If you use this option 30 | # you need to make sure to reconnect any threads in the `on_worker_boot` 31 | # block. 32 | # 33 | # preload_app! 34 | 35 | # If you are preloading your application and using Active Record, it's 36 | # recommended that you close any connections to the database before workers 37 | # are forked to prevent connection leakage. 38 | # 39 | # before_fork do 40 | # ActiveRecord::Base.connection_pool.disconnect! if defined?(ActiveRecord) 41 | # end 42 | 43 | # The code in the `on_worker_boot` will be called if you are using 44 | # clustered mode by specifying a number of `workers`. After each worker 45 | # process is booted, this block will be run. If you are using the `preload_app!` 46 | # option, you will want to use this block to reconnect to any threads 47 | # or connections that may have been created at application boot, as Ruby 48 | # cannot share connections between processes. 49 | # 50 | # on_worker_boot do 51 | # ActiveRecord::Base.establish_connection if defined?(ActiveRecord) 52 | # end 53 | # 54 | 55 | # Allow puma to be restarted by `rails restart` command. 56 | plugin :tmp_restart 57 | -------------------------------------------------------------------------------- /demo/config/routes.rb: -------------------------------------------------------------------------------- 1 | Rails.application.routes.draw do 2 | mount_devise_token_auth_for 'User', at: 'api/auth' 3 | namespace :api do 4 | get '/auth_test', to: 'auth_test#index' 5 | end 6 | 7 | #Do not place any routes below this one 8 | get '*other', to: 'static#index' 9 | end 10 | -------------------------------------------------------------------------------- /demo/config/secrets.yml: -------------------------------------------------------------------------------- 1 | # Be sure to restart your server when you modify this file. 2 | 3 | # Your secret key is used for verifying the integrity of signed cookies. 4 | # If you change this key, all old signed cookies will become invalid! 5 | 6 | # Make sure the secret is at least 30 characters and all random, 7 | # no regular words or you'll be exposed to dictionary attacks. 8 | # You can use `rails secret` to generate a secure secret key. 9 | 10 | # Make sure the secrets in this file are kept private 11 | # if you're sharing your code publicly. 12 | 13 | # Shared secrets are available across all environments. 14 | 15 | # shared: 16 | # api_key: a1B2c3D4e5F6 17 | 18 | # Environmental secrets are only available for that specific environment. 19 | 20 | development: 21 | secret_key_base: d5d9eb74f03caa61b3ec54b6c1dd1086c558f3cca5889868718aeca09d3bcd399c775f3645e3390bffe8f9269f0cbc504da1662ad6e44641eea8ff95ec0cd705 22 | 23 | test: 24 | secret_key_base: bb4fbe9a24bd384a268acd5fb32706dd54345d314310d9b2556173eb79e77bb67ceab7cb8435ac6cf0c8fe735fd01c1e289a3703af932f746b9610229c63a787 25 | 26 | # Do not keep production secrets in the unencrypted secrets file. 27 | # Instead, either read values from the environment. 28 | # Or, use `bin/rails secrets:setup` to configure encrypted secrets 29 | # and move the `production:` environment over there. 30 | 31 | production: 32 | secret_key_base: <%= ENV["SECRET_KEY_BASE"] %> 33 | -------------------------------------------------------------------------------- /demo/config/spring.rb: -------------------------------------------------------------------------------- 1 | %w( 2 | .ruby-version 3 | .rbenv-vars 4 | tmp/restart.txt 5 | tmp/caching-dev.txt 6 | ).each { |path| Spring.watch(path) } 7 | -------------------------------------------------------------------------------- /demo/db/migrate/20180211191111_devise_token_auth_create_users.rb: -------------------------------------------------------------------------------- 1 | class DeviseTokenAuthCreateUsers < ActiveRecord::Migration[5.1] 2 | def change 3 | create_table(:users) do |t| 4 | ## Required 5 | t.string :provider, :null => false, :default => "email" 6 | t.string :uid, :null => false, :default => "" 7 | 8 | ## Database authenticatable 9 | t.string :encrypted_password, :null => false, :default => "" 10 | 11 | ## Recoverable 12 | t.string :reset_password_token 13 | t.datetime :reset_password_sent_at 14 | 15 | ## Rememberable 16 | t.datetime :remember_created_at 17 | 18 | ## Trackable 19 | t.integer :sign_in_count, :default => 0, :null => false 20 | t.datetime :current_sign_in_at 21 | t.datetime :last_sign_in_at 22 | t.string :current_sign_in_ip 23 | t.string :last_sign_in_ip 24 | 25 | ## Confirmable 26 | t.string :confirmation_token 27 | t.datetime :confirmed_at 28 | t.datetime :confirmation_sent_at 29 | t.string :unconfirmed_email # Only if using reconfirmable 30 | 31 | ## Lockable 32 | # t.integer :failed_attempts, :default => 0, :null => false # Only if lock strategy is :failed_attempts 33 | # t.string :unlock_token # Only if unlock strategy is :email or :both 34 | # t.datetime :locked_at 35 | 36 | ## User Info 37 | t.string :name 38 | t.string :nickname 39 | t.string :image 40 | t.string :email 41 | 42 | ## Tokens 43 | t.json :tokens 44 | 45 | t.timestamps 46 | end 47 | 48 | add_index :users, :email, unique: true 49 | add_index :users, [:uid, :provider], unique: true 50 | add_index :users, :reset_password_token, unique: true 51 | add_index :users, :confirmation_token, unique: true 52 | # add_index :users, :unlock_token, unique: true 53 | end 54 | end 55 | -------------------------------------------------------------------------------- /demo/db/schema.rb: -------------------------------------------------------------------------------- 1 | # This file is auto-generated from the current state of the database. Instead 2 | # of editing this file, please use the migrations feature of Active Record to 3 | # incrementally modify your database, and then regenerate this schema definition. 4 | # 5 | # Note that this schema.rb definition is the authoritative source for your 6 | # database schema. If you need to create the application database on another 7 | # system, you should be using db:schema:load, not running all the migrations 8 | # from scratch. The latter is a flawed and unsustainable approach (the more migrations 9 | # you'll amass, the slower it'll run and the greater likelihood for issues). 10 | # 11 | # It's strongly recommended that you check this file into your version control system. 12 | 13 | ActiveRecord::Schema.define(version: 20180211191111) do 14 | 15 | # These are extensions that must be enabled in order to support this database 16 | enable_extension "plpgsql" 17 | 18 | create_table "users", force: :cascade do |t| 19 | t.string "provider", default: "email", null: false 20 | t.string "uid", default: "", null: false 21 | t.string "encrypted_password", default: "", null: false 22 | t.string "reset_password_token" 23 | t.datetime "reset_password_sent_at" 24 | t.datetime "remember_created_at" 25 | t.integer "sign_in_count", default: 0, null: false 26 | t.datetime "current_sign_in_at" 27 | t.datetime "last_sign_in_at" 28 | t.string "current_sign_in_ip" 29 | t.string "last_sign_in_ip" 30 | t.string "confirmation_token" 31 | t.datetime "confirmed_at" 32 | t.datetime "confirmation_sent_at" 33 | t.string "unconfirmed_email" 34 | t.string "name" 35 | t.string "nickname" 36 | t.string "image" 37 | t.string "email" 38 | t.json "tokens" 39 | t.datetime "created_at", null: false 40 | t.datetime "updated_at", null: false 41 | t.index ["confirmation_token"], name: "index_users_on_confirmation_token", unique: true 42 | t.index ["email"], name: "index_users_on_email", unique: true 43 | t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true 44 | t.index ["uid", "provider"], name: "index_users_on_uid_and_provider", unique: true 45 | end 46 | 47 | end 48 | -------------------------------------------------------------------------------- /demo/db/seeds.rb: -------------------------------------------------------------------------------- 1 | # This file should contain all the record creation needed to seed the database with its default values. 2 | # The data can then be loaded with the rails db:seed command (or created alongside the database with db:setup). 3 | # 4 | # Examples: 5 | # 6 | # movies = Movie.create([{ name: 'Star Wars' }, { name: 'Lord of the Rings' }]) 7 | # Character.create(name: 'Luke', movie: movies.first) 8 | -------------------------------------------------------------------------------- /demo/lib/tasks/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wdjungst/redux-devise-axios/461693530a650162c36709c34be3b0571f224366/demo/lib/tasks/.keep -------------------------------------------------------------------------------- /demo/log/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wdjungst/redux-devise-axios/461693530a650162c36709c34be3b0571f224366/demo/log/.keep -------------------------------------------------------------------------------- /demo/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "create-repack-app", 3 | "version": "1.0.0", 4 | "scripts": { 5 | "build": "cd client && npm install --only=dev && npm install && npm run build && cd ..", 6 | "deploy": "cp -a client/build/. public/", 7 | "heroku-postbuild": "npm run build && npm run deploy && echo 'Client Built'" 8 | }, 9 | "keywords": [], 10 | "author": "", 11 | "license": "ISC" 12 | } 13 | -------------------------------------------------------------------------------- /demo/public/robots.txt: -------------------------------------------------------------------------------- 1 | # See http://www.robotstxt.org/robotstxt.html for documentation on how to use the robots.txt file 2 | -------------------------------------------------------------------------------- /demo/tmp/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wdjungst/redux-devise-axios/461693530a650162c36709c34be3b0571f224366/demo/tmp/.keep -------------------------------------------------------------------------------- /demo/vendor/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wdjungst/redux-devise-axios/461693530a650162c36709c34be3b0571f224366/demo/vendor/.keep -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "redux-devise-axios", 3 | "version": "0.0.4", 4 | "description": "Redux Middleware to help set axios headers when using Devise Token Auth", 5 | "main": "./dist/index.js", 6 | "author": "djungst", 7 | "homepage": "https://github.com/wdjungst/redux-devios-axios", 8 | "repository": { 9 | "type": "git", 10 | "url": "https://github.com/wdjungst/redux-devios-axios" 11 | }, 12 | "scripts": { 13 | "build": "babel src --presets babel-preset-latest --out-dir dist", 14 | "prepublish": "npm run build" 15 | }, 16 | "license": "ISC", 17 | "devDependencies": { 18 | "babel-cli": "^6.24.1", 19 | "babel-preset-latest": "^6.24.1" 20 | }, 21 | "dependencies": {} 22 | } 23 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | let HEADERS = ['access-token', 'token-type', 'client', 'expiry', 'uid'] 2 | 3 | const tokenMiddleware = args => store => next => action => { 4 | if (!action) 5 | action = { type: '' } 6 | let { customHeaders = [], validateAction = 'VALIDATE_TOKEN', logoutAction = 'LOGOUT', axios, native } = args; 7 | HEADERS = [...new Set([...HEADERS, ...customHeaders])] 8 | if (action.type === validateAction) { 9 | if (native) 10 | HEADERS.forEach( async (token) => axios.defaults.headers.common[token] = await AsyncStorage.getItem(token)); 11 | else 12 | HEADERS.forEach( token => axios.defaults.headers.common[token] = localStorage.getItem(token)); 13 | } else if (action.type === logoutAction) { 14 | if (native) 15 | HEADERS.forEach( async (token) => await AsyncStorage.removeItem(token)); 16 | else 17 | HEADERS.forEach( token => localStorage.removeItem(token)); 18 | } else { 19 | let { headers } = action; 20 | if (headers) { 21 | if(headers['access-token']) { 22 | if (native){ 23 | HEADERS.forEach( async (token) => { 24 | axios.defaults.headers.common[token] = headers[token]; 25 | await AsyncStorage.setItem(token, headers[token]) 26 | }) 27 | } 28 | else { 29 | HEADERS.forEach( token => { 30 | axios.defaults.headers.common[token] = headers[token]; 31 | localStorage.setItem(token, headers[token]) 32 | }) 33 | } 34 | } 35 | } 36 | } 37 | return next(action) 38 | } 39 | 40 | export default tokenMiddleware 41 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | abbrev@1: 6 | version "1.1.0" 7 | resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.0.tgz#d0554c2256636e2f56e7c2e5ad183f859428d81f" 8 | 9 | ajv@^4.9.1: 10 | version "4.11.8" 11 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" 12 | dependencies: 13 | co "^4.6.0" 14 | json-stable-stringify "^1.0.1" 15 | 16 | ansi-regex@^2.0.0: 17 | version "2.1.1" 18 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 19 | 20 | ansi-styles@^2.2.1: 21 | version "2.2.1" 22 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" 23 | 24 | anymatch@^1.3.0: 25 | version "1.3.0" 26 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.0.tgz#a3e52fa39168c825ff57b0248126ce5a8ff95507" 27 | dependencies: 28 | arrify "^1.0.0" 29 | micromatch "^2.1.5" 30 | 31 | aproba@^1.0.3: 32 | version "1.1.2" 33 | resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.1.2.tgz#45c6629094de4e96f693ef7eab74ae079c240fc1" 34 | 35 | are-we-there-yet@~1.1.2: 36 | version "1.1.4" 37 | resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d" 38 | dependencies: 39 | delegates "^1.0.0" 40 | readable-stream "^2.0.6" 41 | 42 | arr-diff@^2.0.0: 43 | version "2.0.0" 44 | resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" 45 | dependencies: 46 | arr-flatten "^1.0.1" 47 | 48 | arr-flatten@^1.0.1: 49 | version "1.0.3" 50 | resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.0.3.tgz#a274ed85ac08849b6bd7847c4580745dc51adfb1" 51 | 52 | array-unique@^0.2.1: 53 | version "0.2.1" 54 | resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" 55 | 56 | arrify@^1.0.0: 57 | version "1.0.1" 58 | resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" 59 | 60 | asn1@~0.2.3: 61 | version "0.2.3" 62 | resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" 63 | 64 | assert-plus@1.0.0, assert-plus@^1.0.0: 65 | version "1.0.0" 66 | resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" 67 | 68 | assert-plus@^0.2.0: 69 | version "0.2.0" 70 | resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" 71 | 72 | async-each@^1.0.0: 73 | version "1.0.1" 74 | resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" 75 | 76 | asynckit@^0.4.0: 77 | version "0.4.0" 78 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 79 | 80 | aws-sign2@~0.6.0: 81 | version "0.6.0" 82 | resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" 83 | 84 | aws4@^1.2.1: 85 | version "1.6.0" 86 | resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" 87 | 88 | babel-cli@^6.24.1: 89 | version "6.24.1" 90 | resolved "https://registry.yarnpkg.com/babel-cli/-/babel-cli-6.24.1.tgz#207cd705bba61489b2ea41b5312341cf6aca2283" 91 | dependencies: 92 | babel-core "^6.24.1" 93 | babel-polyfill "^6.23.0" 94 | babel-register "^6.24.1" 95 | babel-runtime "^6.22.0" 96 | commander "^2.8.1" 97 | convert-source-map "^1.1.0" 98 | fs-readdir-recursive "^1.0.0" 99 | glob "^7.0.0" 100 | lodash "^4.2.0" 101 | output-file-sync "^1.1.0" 102 | path-is-absolute "^1.0.0" 103 | slash "^1.0.0" 104 | source-map "^0.5.0" 105 | v8flags "^2.0.10" 106 | optionalDependencies: 107 | chokidar "^1.6.1" 108 | 109 | babel-code-frame@^6.22.0: 110 | version "6.22.0" 111 | resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.22.0.tgz#027620bee567a88c32561574e7fd0801d33118e4" 112 | dependencies: 113 | chalk "^1.1.0" 114 | esutils "^2.0.2" 115 | js-tokens "^3.0.0" 116 | 117 | babel-core@^6.24.1: 118 | version "6.25.0" 119 | resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.25.0.tgz#7dd42b0463c742e9d5296deb3ec67a9322dad729" 120 | dependencies: 121 | babel-code-frame "^6.22.0" 122 | babel-generator "^6.25.0" 123 | babel-helpers "^6.24.1" 124 | babel-messages "^6.23.0" 125 | babel-register "^6.24.1" 126 | babel-runtime "^6.22.0" 127 | babel-template "^6.25.0" 128 | babel-traverse "^6.25.0" 129 | babel-types "^6.25.0" 130 | babylon "^6.17.2" 131 | convert-source-map "^1.1.0" 132 | debug "^2.1.1" 133 | json5 "^0.5.0" 134 | lodash "^4.2.0" 135 | minimatch "^3.0.2" 136 | path-is-absolute "^1.0.0" 137 | private "^0.1.6" 138 | slash "^1.0.0" 139 | source-map "^0.5.0" 140 | 141 | babel-generator@^6.25.0: 142 | version "6.25.0" 143 | resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.25.0.tgz#33a1af70d5f2890aeb465a4a7793c1df6a9ea9fc" 144 | dependencies: 145 | babel-messages "^6.23.0" 146 | babel-runtime "^6.22.0" 147 | babel-types "^6.25.0" 148 | detect-indent "^4.0.0" 149 | jsesc "^1.3.0" 150 | lodash "^4.2.0" 151 | source-map "^0.5.0" 152 | trim-right "^1.0.1" 153 | 154 | babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: 155 | version "6.24.1" 156 | resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" 157 | dependencies: 158 | babel-helper-explode-assignable-expression "^6.24.1" 159 | babel-runtime "^6.22.0" 160 | babel-types "^6.24.1" 161 | 162 | babel-helper-call-delegate@^6.24.1: 163 | version "6.24.1" 164 | resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" 165 | dependencies: 166 | babel-helper-hoist-variables "^6.24.1" 167 | babel-runtime "^6.22.0" 168 | babel-traverse "^6.24.1" 169 | babel-types "^6.24.1" 170 | 171 | babel-helper-define-map@^6.24.1: 172 | version "6.24.1" 173 | resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.24.1.tgz#7a9747f258d8947d32d515f6aa1c7bd02204a080" 174 | dependencies: 175 | babel-helper-function-name "^6.24.1" 176 | babel-runtime "^6.22.0" 177 | babel-types "^6.24.1" 178 | lodash "^4.2.0" 179 | 180 | babel-helper-explode-assignable-expression@^6.24.1: 181 | version "6.24.1" 182 | resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" 183 | dependencies: 184 | babel-runtime "^6.22.0" 185 | babel-traverse "^6.24.1" 186 | babel-types "^6.24.1" 187 | 188 | babel-helper-function-name@^6.24.1: 189 | version "6.24.1" 190 | resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" 191 | dependencies: 192 | babel-helper-get-function-arity "^6.24.1" 193 | babel-runtime "^6.22.0" 194 | babel-template "^6.24.1" 195 | babel-traverse "^6.24.1" 196 | babel-types "^6.24.1" 197 | 198 | babel-helper-get-function-arity@^6.24.1: 199 | version "6.24.1" 200 | resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" 201 | dependencies: 202 | babel-runtime "^6.22.0" 203 | babel-types "^6.24.1" 204 | 205 | babel-helper-hoist-variables@^6.24.1: 206 | version "6.24.1" 207 | resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" 208 | dependencies: 209 | babel-runtime "^6.22.0" 210 | babel-types "^6.24.1" 211 | 212 | babel-helper-optimise-call-expression@^6.24.1: 213 | version "6.24.1" 214 | resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" 215 | dependencies: 216 | babel-runtime "^6.22.0" 217 | babel-types "^6.24.1" 218 | 219 | babel-helper-regex@^6.24.1: 220 | version "6.24.1" 221 | resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.24.1.tgz#d36e22fab1008d79d88648e32116868128456ce8" 222 | dependencies: 223 | babel-runtime "^6.22.0" 224 | babel-types "^6.24.1" 225 | lodash "^4.2.0" 226 | 227 | babel-helper-remap-async-to-generator@^6.24.1: 228 | version "6.24.1" 229 | resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" 230 | dependencies: 231 | babel-helper-function-name "^6.24.1" 232 | babel-runtime "^6.22.0" 233 | babel-template "^6.24.1" 234 | babel-traverse "^6.24.1" 235 | babel-types "^6.24.1" 236 | 237 | babel-helper-replace-supers@^6.24.1: 238 | version "6.24.1" 239 | resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" 240 | dependencies: 241 | babel-helper-optimise-call-expression "^6.24.1" 242 | babel-messages "^6.23.0" 243 | babel-runtime "^6.22.0" 244 | babel-template "^6.24.1" 245 | babel-traverse "^6.24.1" 246 | babel-types "^6.24.1" 247 | 248 | babel-helpers@^6.24.1: 249 | version "6.24.1" 250 | resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" 251 | dependencies: 252 | babel-runtime "^6.22.0" 253 | babel-template "^6.24.1" 254 | 255 | babel-messages@^6.23.0: 256 | version "6.23.0" 257 | resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" 258 | dependencies: 259 | babel-runtime "^6.22.0" 260 | 261 | babel-plugin-check-es2015-constants@^6.22.0: 262 | version "6.22.0" 263 | resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" 264 | dependencies: 265 | babel-runtime "^6.22.0" 266 | 267 | babel-plugin-syntax-async-functions@^6.8.0: 268 | version "6.13.0" 269 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" 270 | 271 | babel-plugin-syntax-exponentiation-operator@^6.8.0: 272 | version "6.13.0" 273 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" 274 | 275 | babel-plugin-syntax-trailing-function-commas@^6.22.0: 276 | version "6.22.0" 277 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" 278 | 279 | babel-plugin-transform-async-to-generator@^6.24.1: 280 | version "6.24.1" 281 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761" 282 | dependencies: 283 | babel-helper-remap-async-to-generator "^6.24.1" 284 | babel-plugin-syntax-async-functions "^6.8.0" 285 | babel-runtime "^6.22.0" 286 | 287 | babel-plugin-transform-es2015-arrow-functions@^6.22.0: 288 | version "6.22.0" 289 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" 290 | dependencies: 291 | babel-runtime "^6.22.0" 292 | 293 | babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: 294 | version "6.22.0" 295 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" 296 | dependencies: 297 | babel-runtime "^6.22.0" 298 | 299 | babel-plugin-transform-es2015-block-scoping@^6.24.1: 300 | version "6.24.1" 301 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.24.1.tgz#76c295dc3a4741b1665adfd3167215dcff32a576" 302 | dependencies: 303 | babel-runtime "^6.22.0" 304 | babel-template "^6.24.1" 305 | babel-traverse "^6.24.1" 306 | babel-types "^6.24.1" 307 | lodash "^4.2.0" 308 | 309 | babel-plugin-transform-es2015-classes@^6.24.1: 310 | version "6.24.1" 311 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" 312 | dependencies: 313 | babel-helper-define-map "^6.24.1" 314 | babel-helper-function-name "^6.24.1" 315 | babel-helper-optimise-call-expression "^6.24.1" 316 | babel-helper-replace-supers "^6.24.1" 317 | babel-messages "^6.23.0" 318 | babel-runtime "^6.22.0" 319 | babel-template "^6.24.1" 320 | babel-traverse "^6.24.1" 321 | babel-types "^6.24.1" 322 | 323 | babel-plugin-transform-es2015-computed-properties@^6.24.1: 324 | version "6.24.1" 325 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" 326 | dependencies: 327 | babel-runtime "^6.22.0" 328 | babel-template "^6.24.1" 329 | 330 | babel-plugin-transform-es2015-destructuring@^6.22.0: 331 | version "6.23.0" 332 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" 333 | dependencies: 334 | babel-runtime "^6.22.0" 335 | 336 | babel-plugin-transform-es2015-duplicate-keys@^6.24.1: 337 | version "6.24.1" 338 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" 339 | dependencies: 340 | babel-runtime "^6.22.0" 341 | babel-types "^6.24.1" 342 | 343 | babel-plugin-transform-es2015-for-of@^6.22.0: 344 | version "6.23.0" 345 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" 346 | dependencies: 347 | babel-runtime "^6.22.0" 348 | 349 | babel-plugin-transform-es2015-function-name@^6.24.1: 350 | version "6.24.1" 351 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" 352 | dependencies: 353 | babel-helper-function-name "^6.24.1" 354 | babel-runtime "^6.22.0" 355 | babel-types "^6.24.1" 356 | 357 | babel-plugin-transform-es2015-literals@^6.22.0: 358 | version "6.22.0" 359 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" 360 | dependencies: 361 | babel-runtime "^6.22.0" 362 | 363 | babel-plugin-transform-es2015-modules-amd@^6.24.1: 364 | version "6.24.1" 365 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" 366 | dependencies: 367 | babel-plugin-transform-es2015-modules-commonjs "^6.24.1" 368 | babel-runtime "^6.22.0" 369 | babel-template "^6.24.1" 370 | 371 | babel-plugin-transform-es2015-modules-commonjs@^6.24.1: 372 | version "6.24.1" 373 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.24.1.tgz#d3e310b40ef664a36622200097c6d440298f2bfe" 374 | dependencies: 375 | babel-plugin-transform-strict-mode "^6.24.1" 376 | babel-runtime "^6.22.0" 377 | babel-template "^6.24.1" 378 | babel-types "^6.24.1" 379 | 380 | babel-plugin-transform-es2015-modules-systemjs@^6.24.1: 381 | version "6.24.1" 382 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" 383 | dependencies: 384 | babel-helper-hoist-variables "^6.24.1" 385 | babel-runtime "^6.22.0" 386 | babel-template "^6.24.1" 387 | 388 | babel-plugin-transform-es2015-modules-umd@^6.24.1: 389 | version "6.24.1" 390 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" 391 | dependencies: 392 | babel-plugin-transform-es2015-modules-amd "^6.24.1" 393 | babel-runtime "^6.22.0" 394 | babel-template "^6.24.1" 395 | 396 | babel-plugin-transform-es2015-object-super@^6.24.1: 397 | version "6.24.1" 398 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" 399 | dependencies: 400 | babel-helper-replace-supers "^6.24.1" 401 | babel-runtime "^6.22.0" 402 | 403 | babel-plugin-transform-es2015-parameters@^6.24.1: 404 | version "6.24.1" 405 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" 406 | dependencies: 407 | babel-helper-call-delegate "^6.24.1" 408 | babel-helper-get-function-arity "^6.24.1" 409 | babel-runtime "^6.22.0" 410 | babel-template "^6.24.1" 411 | babel-traverse "^6.24.1" 412 | babel-types "^6.24.1" 413 | 414 | babel-plugin-transform-es2015-shorthand-properties@^6.24.1: 415 | version "6.24.1" 416 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" 417 | dependencies: 418 | babel-runtime "^6.22.0" 419 | babel-types "^6.24.1" 420 | 421 | babel-plugin-transform-es2015-spread@^6.22.0: 422 | version "6.22.0" 423 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" 424 | dependencies: 425 | babel-runtime "^6.22.0" 426 | 427 | babel-plugin-transform-es2015-sticky-regex@^6.24.1: 428 | version "6.24.1" 429 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" 430 | dependencies: 431 | babel-helper-regex "^6.24.1" 432 | babel-runtime "^6.22.0" 433 | babel-types "^6.24.1" 434 | 435 | babel-plugin-transform-es2015-template-literals@^6.22.0: 436 | version "6.22.0" 437 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" 438 | dependencies: 439 | babel-runtime "^6.22.0" 440 | 441 | babel-plugin-transform-es2015-typeof-symbol@^6.22.0: 442 | version "6.23.0" 443 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" 444 | dependencies: 445 | babel-runtime "^6.22.0" 446 | 447 | babel-plugin-transform-es2015-unicode-regex@^6.24.1: 448 | version "6.24.1" 449 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" 450 | dependencies: 451 | babel-helper-regex "^6.24.1" 452 | babel-runtime "^6.22.0" 453 | regexpu-core "^2.0.0" 454 | 455 | babel-plugin-transform-exponentiation-operator@^6.24.1: 456 | version "6.24.1" 457 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e" 458 | dependencies: 459 | babel-helper-builder-binary-assignment-operator-visitor "^6.24.1" 460 | babel-plugin-syntax-exponentiation-operator "^6.8.0" 461 | babel-runtime "^6.22.0" 462 | 463 | babel-plugin-transform-regenerator@^6.24.1: 464 | version "6.24.1" 465 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.24.1.tgz#b8da305ad43c3c99b4848e4fe4037b770d23c418" 466 | dependencies: 467 | regenerator-transform "0.9.11" 468 | 469 | babel-plugin-transform-strict-mode@^6.24.1: 470 | version "6.24.1" 471 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" 472 | dependencies: 473 | babel-runtime "^6.22.0" 474 | babel-types "^6.24.1" 475 | 476 | babel-polyfill@^6.23.0: 477 | version "6.23.0" 478 | resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.23.0.tgz#8364ca62df8eafb830499f699177466c3b03499d" 479 | dependencies: 480 | babel-runtime "^6.22.0" 481 | core-js "^2.4.0" 482 | regenerator-runtime "^0.10.0" 483 | 484 | babel-preset-es2015@^6.24.1: 485 | version "6.24.1" 486 | resolved "https://registry.yarnpkg.com/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz#d44050d6bc2c9feea702aaf38d727a0210538939" 487 | dependencies: 488 | babel-plugin-check-es2015-constants "^6.22.0" 489 | babel-plugin-transform-es2015-arrow-functions "^6.22.0" 490 | babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" 491 | babel-plugin-transform-es2015-block-scoping "^6.24.1" 492 | babel-plugin-transform-es2015-classes "^6.24.1" 493 | babel-plugin-transform-es2015-computed-properties "^6.24.1" 494 | babel-plugin-transform-es2015-destructuring "^6.22.0" 495 | babel-plugin-transform-es2015-duplicate-keys "^6.24.1" 496 | babel-plugin-transform-es2015-for-of "^6.22.0" 497 | babel-plugin-transform-es2015-function-name "^6.24.1" 498 | babel-plugin-transform-es2015-literals "^6.22.0" 499 | babel-plugin-transform-es2015-modules-amd "^6.24.1" 500 | babel-plugin-transform-es2015-modules-commonjs "^6.24.1" 501 | babel-plugin-transform-es2015-modules-systemjs "^6.24.1" 502 | babel-plugin-transform-es2015-modules-umd "^6.24.1" 503 | babel-plugin-transform-es2015-object-super "^6.24.1" 504 | babel-plugin-transform-es2015-parameters "^6.24.1" 505 | babel-plugin-transform-es2015-shorthand-properties "^6.24.1" 506 | babel-plugin-transform-es2015-spread "^6.22.0" 507 | babel-plugin-transform-es2015-sticky-regex "^6.24.1" 508 | babel-plugin-transform-es2015-template-literals "^6.22.0" 509 | babel-plugin-transform-es2015-typeof-symbol "^6.22.0" 510 | babel-plugin-transform-es2015-unicode-regex "^6.24.1" 511 | babel-plugin-transform-regenerator "^6.24.1" 512 | 513 | babel-preset-es2016@^6.24.1: 514 | version "6.24.1" 515 | resolved "https://registry.yarnpkg.com/babel-preset-es2016/-/babel-preset-es2016-6.24.1.tgz#f900bf93e2ebc0d276df9b8ab59724ebfd959f8b" 516 | dependencies: 517 | babel-plugin-transform-exponentiation-operator "^6.24.1" 518 | 519 | babel-preset-es2017@^6.24.1: 520 | version "6.24.1" 521 | resolved "https://registry.yarnpkg.com/babel-preset-es2017/-/babel-preset-es2017-6.24.1.tgz#597beadfb9f7f208bcfd8a12e9b2b29b8b2f14d1" 522 | dependencies: 523 | babel-plugin-syntax-trailing-function-commas "^6.22.0" 524 | babel-plugin-transform-async-to-generator "^6.24.1" 525 | 526 | babel-preset-latest@^6.24.1: 527 | version "6.24.1" 528 | resolved "https://registry.yarnpkg.com/babel-preset-latest/-/babel-preset-latest-6.24.1.tgz#677de069154a7485c2d25c577c02f624b85b85e8" 529 | dependencies: 530 | babel-preset-es2015 "^6.24.1" 531 | babel-preset-es2016 "^6.24.1" 532 | babel-preset-es2017 "^6.24.1" 533 | 534 | babel-register@^6.24.1: 535 | version "6.24.1" 536 | resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.24.1.tgz#7e10e13a2f71065bdfad5a1787ba45bca6ded75f" 537 | dependencies: 538 | babel-core "^6.24.1" 539 | babel-runtime "^6.22.0" 540 | core-js "^2.4.0" 541 | home-or-tmp "^2.0.0" 542 | lodash "^4.2.0" 543 | mkdirp "^0.5.1" 544 | source-map-support "^0.4.2" 545 | 546 | babel-runtime@^6.18.0, babel-runtime@^6.22.0: 547 | version "6.23.0" 548 | resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.23.0.tgz#0a9489f144de70efb3ce4300accdb329e2fc543b" 549 | dependencies: 550 | core-js "^2.4.0" 551 | regenerator-runtime "^0.10.0" 552 | 553 | babel-template@^6.24.1, babel-template@^6.25.0: 554 | version "6.25.0" 555 | resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.25.0.tgz#665241166b7c2aa4c619d71e192969552b10c071" 556 | dependencies: 557 | babel-runtime "^6.22.0" 558 | babel-traverse "^6.25.0" 559 | babel-types "^6.25.0" 560 | babylon "^6.17.2" 561 | lodash "^4.2.0" 562 | 563 | babel-traverse@^6.24.1, babel-traverse@^6.25.0: 564 | version "6.25.0" 565 | resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.25.0.tgz#2257497e2fcd19b89edc13c4c91381f9512496f1" 566 | dependencies: 567 | babel-code-frame "^6.22.0" 568 | babel-messages "^6.23.0" 569 | babel-runtime "^6.22.0" 570 | babel-types "^6.25.0" 571 | babylon "^6.17.2" 572 | debug "^2.2.0" 573 | globals "^9.0.0" 574 | invariant "^2.2.0" 575 | lodash "^4.2.0" 576 | 577 | babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.25.0: 578 | version "6.25.0" 579 | resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.25.0.tgz#70afb248d5660e5d18f811d91c8303b54134a18e" 580 | dependencies: 581 | babel-runtime "^6.22.0" 582 | esutils "^2.0.2" 583 | lodash "^4.2.0" 584 | to-fast-properties "^1.0.1" 585 | 586 | babylon@^6.17.2: 587 | version "6.17.4" 588 | resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.17.4.tgz#3e8b7402b88d22c3423e137a1577883b15ff869a" 589 | 590 | balanced-match@^1.0.0: 591 | version "1.0.0" 592 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 593 | 594 | bcrypt-pbkdf@^1.0.0: 595 | version "1.0.1" 596 | resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" 597 | dependencies: 598 | tweetnacl "^0.14.3" 599 | 600 | binary-extensions@^1.0.0: 601 | version "1.8.0" 602 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.8.0.tgz#48ec8d16df4377eae5fa5884682480af4d95c774" 603 | 604 | block-stream@*: 605 | version "0.0.9" 606 | resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" 607 | dependencies: 608 | inherits "~2.0.0" 609 | 610 | boom@2.x.x: 611 | version "2.10.1" 612 | resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" 613 | dependencies: 614 | hoek "2.x.x" 615 | 616 | brace-expansion@^1.1.7: 617 | version "1.1.8" 618 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" 619 | dependencies: 620 | balanced-match "^1.0.0" 621 | concat-map "0.0.1" 622 | 623 | braces@^1.8.2: 624 | version "1.8.5" 625 | resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" 626 | dependencies: 627 | expand-range "^1.8.1" 628 | preserve "^0.2.0" 629 | repeat-element "^1.1.2" 630 | 631 | caseless@~0.12.0: 632 | version "0.12.0" 633 | resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" 634 | 635 | chalk@^1.1.0: 636 | version "1.1.3" 637 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" 638 | dependencies: 639 | ansi-styles "^2.2.1" 640 | escape-string-regexp "^1.0.2" 641 | has-ansi "^2.0.0" 642 | strip-ansi "^3.0.0" 643 | supports-color "^2.0.0" 644 | 645 | chokidar@^1.6.1: 646 | version "1.7.0" 647 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" 648 | dependencies: 649 | anymatch "^1.3.0" 650 | async-each "^1.0.0" 651 | glob-parent "^2.0.0" 652 | inherits "^2.0.1" 653 | is-binary-path "^1.0.0" 654 | is-glob "^2.0.0" 655 | path-is-absolute "^1.0.0" 656 | readdirp "^2.0.0" 657 | optionalDependencies: 658 | fsevents "^1.0.0" 659 | 660 | co@^4.6.0: 661 | version "4.6.0" 662 | resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" 663 | 664 | code-point-at@^1.0.0: 665 | version "1.1.0" 666 | resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" 667 | 668 | combined-stream@^1.0.5, combined-stream@~1.0.5: 669 | version "1.0.5" 670 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" 671 | dependencies: 672 | delayed-stream "~1.0.0" 673 | 674 | commander@^2.8.1: 675 | version "2.10.0" 676 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.10.0.tgz#e1f5d3245de246d1a5ca04702fa1ad1bd7e405fe" 677 | dependencies: 678 | graceful-readlink ">= 1.0.0" 679 | 680 | concat-map@0.0.1: 681 | version "0.0.1" 682 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 683 | 684 | console-control-strings@^1.0.0, console-control-strings@~1.1.0: 685 | version "1.1.0" 686 | resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" 687 | 688 | convert-source-map@^1.1.0: 689 | version "1.5.0" 690 | resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5" 691 | 692 | core-js@^2.4.0: 693 | version "2.4.1" 694 | resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e" 695 | 696 | core-util-is@~1.0.0: 697 | version "1.0.2" 698 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 699 | 700 | cryptiles@2.x.x: 701 | version "2.0.5" 702 | resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" 703 | dependencies: 704 | boom "2.x.x" 705 | 706 | dashdash@^1.12.0: 707 | version "1.14.1" 708 | resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" 709 | dependencies: 710 | assert-plus "^1.0.0" 711 | 712 | debug@^2.1.1, debug@^2.2.0: 713 | version "2.6.8" 714 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc" 715 | dependencies: 716 | ms "2.0.0" 717 | 718 | deep-extend@~0.4.0: 719 | version "0.4.2" 720 | resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f" 721 | 722 | delayed-stream@~1.0.0: 723 | version "1.0.0" 724 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 725 | 726 | delegates@^1.0.0: 727 | version "1.0.0" 728 | resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" 729 | 730 | detect-indent@^4.0.0: 731 | version "4.0.0" 732 | resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" 733 | dependencies: 734 | repeating "^2.0.0" 735 | 736 | ecc-jsbn@~0.1.1: 737 | version "0.1.1" 738 | resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" 739 | dependencies: 740 | jsbn "~0.1.0" 741 | 742 | escape-string-regexp@^1.0.2: 743 | version "1.0.5" 744 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 745 | 746 | esutils@^2.0.2: 747 | version "2.0.2" 748 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" 749 | 750 | expand-brackets@^0.1.4: 751 | version "0.1.5" 752 | resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" 753 | dependencies: 754 | is-posix-bracket "^0.1.0" 755 | 756 | expand-range@^1.8.1: 757 | version "1.8.2" 758 | resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" 759 | dependencies: 760 | fill-range "^2.1.0" 761 | 762 | extend@~3.0.0: 763 | version "3.0.1" 764 | resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" 765 | 766 | extglob@^0.3.1: 767 | version "0.3.2" 768 | resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" 769 | dependencies: 770 | is-extglob "^1.0.0" 771 | 772 | extsprintf@1.0.2: 773 | version "1.0.2" 774 | resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550" 775 | 776 | filename-regex@^2.0.0: 777 | version "2.0.1" 778 | resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" 779 | 780 | fill-range@^2.1.0: 781 | version "2.2.3" 782 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" 783 | dependencies: 784 | is-number "^2.1.0" 785 | isobject "^2.0.0" 786 | randomatic "^1.1.3" 787 | repeat-element "^1.1.2" 788 | repeat-string "^1.5.2" 789 | 790 | for-in@^1.0.1: 791 | version "1.0.2" 792 | resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" 793 | 794 | for-own@^0.1.4: 795 | version "0.1.5" 796 | resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" 797 | dependencies: 798 | for-in "^1.0.1" 799 | 800 | forever-agent@~0.6.1: 801 | version "0.6.1" 802 | resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" 803 | 804 | form-data@~2.1.1: 805 | version "2.1.4" 806 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1" 807 | dependencies: 808 | asynckit "^0.4.0" 809 | combined-stream "^1.0.5" 810 | mime-types "^2.1.12" 811 | 812 | fs-readdir-recursive@^1.0.0: 813 | version "1.0.0" 814 | resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.0.0.tgz#8cd1745c8b4f8a29c8caec392476921ba195f560" 815 | 816 | fs.realpath@^1.0.0: 817 | version "1.0.0" 818 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 819 | 820 | fsevents@^1.0.0: 821 | version "1.1.2" 822 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.2.tgz#3282b713fb3ad80ede0e9fcf4611b5aa6fc033f4" 823 | dependencies: 824 | nan "^2.3.0" 825 | node-pre-gyp "^0.6.36" 826 | 827 | fstream-ignore@^1.0.5: 828 | version "1.0.5" 829 | resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" 830 | dependencies: 831 | fstream "^1.0.0" 832 | inherits "2" 833 | minimatch "^3.0.0" 834 | 835 | fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2: 836 | version "1.0.11" 837 | resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" 838 | dependencies: 839 | graceful-fs "^4.1.2" 840 | inherits "~2.0.0" 841 | mkdirp ">=0.5 0" 842 | rimraf "2" 843 | 844 | gauge@~2.7.3: 845 | version "2.7.4" 846 | resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" 847 | dependencies: 848 | aproba "^1.0.3" 849 | console-control-strings "^1.0.0" 850 | has-unicode "^2.0.0" 851 | object-assign "^4.1.0" 852 | signal-exit "^3.0.0" 853 | string-width "^1.0.1" 854 | strip-ansi "^3.0.1" 855 | wide-align "^1.1.0" 856 | 857 | getpass@^0.1.1: 858 | version "0.1.7" 859 | resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" 860 | dependencies: 861 | assert-plus "^1.0.0" 862 | 863 | glob-base@^0.3.0: 864 | version "0.3.0" 865 | resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" 866 | dependencies: 867 | glob-parent "^2.0.0" 868 | is-glob "^2.0.0" 869 | 870 | glob-parent@^2.0.0: 871 | version "2.0.0" 872 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" 873 | dependencies: 874 | is-glob "^2.0.0" 875 | 876 | glob@^7.0.0, glob@^7.0.5: 877 | version "7.1.2" 878 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" 879 | dependencies: 880 | fs.realpath "^1.0.0" 881 | inflight "^1.0.4" 882 | inherits "2" 883 | minimatch "^3.0.4" 884 | once "^1.3.0" 885 | path-is-absolute "^1.0.0" 886 | 887 | globals@^9.0.0: 888 | version "9.18.0" 889 | resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" 890 | 891 | graceful-fs@^4.1.2, graceful-fs@^4.1.4: 892 | version "4.1.11" 893 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" 894 | 895 | "graceful-readlink@>= 1.0.0": 896 | version "1.0.1" 897 | resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" 898 | 899 | har-schema@^1.0.5: 900 | version "1.0.5" 901 | resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" 902 | 903 | har-validator@~4.2.1: 904 | version "4.2.1" 905 | resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a" 906 | dependencies: 907 | ajv "^4.9.1" 908 | har-schema "^1.0.5" 909 | 910 | has-ansi@^2.0.0: 911 | version "2.0.0" 912 | resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" 913 | dependencies: 914 | ansi-regex "^2.0.0" 915 | 916 | has-unicode@^2.0.0: 917 | version "2.0.1" 918 | resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" 919 | 920 | hawk@~3.1.3: 921 | version "3.1.3" 922 | resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" 923 | dependencies: 924 | boom "2.x.x" 925 | cryptiles "2.x.x" 926 | hoek "2.x.x" 927 | sntp "1.x.x" 928 | 929 | hoek@2.x.x: 930 | version "2.16.3" 931 | resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" 932 | 933 | home-or-tmp@^2.0.0: 934 | version "2.0.0" 935 | resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" 936 | dependencies: 937 | os-homedir "^1.0.0" 938 | os-tmpdir "^1.0.1" 939 | 940 | http-signature@~1.1.0: 941 | version "1.1.1" 942 | resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" 943 | dependencies: 944 | assert-plus "^0.2.0" 945 | jsprim "^1.2.2" 946 | sshpk "^1.7.0" 947 | 948 | inflight@^1.0.4: 949 | version "1.0.6" 950 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 951 | dependencies: 952 | once "^1.3.0" 953 | wrappy "1" 954 | 955 | inherits@2, inherits@^2.0.1, inherits@~2.0.0, inherits@~2.0.3: 956 | version "2.0.3" 957 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 958 | 959 | ini@~1.3.0: 960 | version "1.3.4" 961 | resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" 962 | 963 | invariant@^2.2.0: 964 | version "2.2.2" 965 | resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" 966 | dependencies: 967 | loose-envify "^1.0.0" 968 | 969 | is-binary-path@^1.0.0: 970 | version "1.0.1" 971 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" 972 | dependencies: 973 | binary-extensions "^1.0.0" 974 | 975 | is-buffer@^1.1.5: 976 | version "1.1.5" 977 | resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.5.tgz#1f3b26ef613b214b88cbca23cc6c01d87961eecc" 978 | 979 | is-dotfile@^1.0.0: 980 | version "1.0.3" 981 | resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" 982 | 983 | is-equal-shallow@^0.1.3: 984 | version "0.1.3" 985 | resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" 986 | dependencies: 987 | is-primitive "^2.0.0" 988 | 989 | is-extendable@^0.1.1: 990 | version "0.1.1" 991 | resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" 992 | 993 | is-extglob@^1.0.0: 994 | version "1.0.0" 995 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" 996 | 997 | is-finite@^1.0.0: 998 | version "1.0.2" 999 | resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" 1000 | dependencies: 1001 | number-is-nan "^1.0.0" 1002 | 1003 | is-fullwidth-code-point@^1.0.0: 1004 | version "1.0.0" 1005 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" 1006 | dependencies: 1007 | number-is-nan "^1.0.0" 1008 | 1009 | is-glob@^2.0.0, is-glob@^2.0.1: 1010 | version "2.0.1" 1011 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" 1012 | dependencies: 1013 | is-extglob "^1.0.0" 1014 | 1015 | is-number@^2.1.0: 1016 | version "2.1.0" 1017 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" 1018 | dependencies: 1019 | kind-of "^3.0.2" 1020 | 1021 | is-number@^3.0.0: 1022 | version "3.0.0" 1023 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" 1024 | dependencies: 1025 | kind-of "^3.0.2" 1026 | 1027 | is-posix-bracket@^0.1.0: 1028 | version "0.1.1" 1029 | resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" 1030 | 1031 | is-primitive@^2.0.0: 1032 | version "2.0.0" 1033 | resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" 1034 | 1035 | is-typedarray@~1.0.0: 1036 | version "1.0.0" 1037 | resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" 1038 | 1039 | isarray@1.0.0, isarray@~1.0.0: 1040 | version "1.0.0" 1041 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 1042 | 1043 | isobject@^2.0.0: 1044 | version "2.1.0" 1045 | resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" 1046 | dependencies: 1047 | isarray "1.0.0" 1048 | 1049 | isstream@~0.1.2: 1050 | version "0.1.2" 1051 | resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" 1052 | 1053 | js-tokens@^3.0.0: 1054 | version "3.0.2" 1055 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" 1056 | 1057 | jsbn@~0.1.0: 1058 | version "0.1.1" 1059 | resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" 1060 | 1061 | jsesc@^1.3.0: 1062 | version "1.3.0" 1063 | resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" 1064 | 1065 | jsesc@~0.5.0: 1066 | version "0.5.0" 1067 | resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" 1068 | 1069 | json-schema@0.2.3: 1070 | version "0.2.3" 1071 | resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" 1072 | 1073 | json-stable-stringify@^1.0.1: 1074 | version "1.0.1" 1075 | resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" 1076 | dependencies: 1077 | jsonify "~0.0.0" 1078 | 1079 | json-stringify-safe@~5.0.1: 1080 | version "5.0.1" 1081 | resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" 1082 | 1083 | json5@^0.5.0: 1084 | version "0.5.1" 1085 | resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" 1086 | 1087 | jsonify@~0.0.0: 1088 | version "0.0.0" 1089 | resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" 1090 | 1091 | jsprim@^1.2.2: 1092 | version "1.4.0" 1093 | resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.0.tgz#a3b87e40298d8c380552d8cc7628a0bb95a22918" 1094 | dependencies: 1095 | assert-plus "1.0.0" 1096 | extsprintf "1.0.2" 1097 | json-schema "0.2.3" 1098 | verror "1.3.6" 1099 | 1100 | kind-of@^3.0.2: 1101 | version "3.2.2" 1102 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" 1103 | dependencies: 1104 | is-buffer "^1.1.5" 1105 | 1106 | kind-of@^4.0.0: 1107 | version "4.0.0" 1108 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" 1109 | dependencies: 1110 | is-buffer "^1.1.5" 1111 | 1112 | lodash@^4.2.0: 1113 | version "4.17.4" 1114 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" 1115 | 1116 | loose-envify@^1.0.0: 1117 | version "1.3.1" 1118 | resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" 1119 | dependencies: 1120 | js-tokens "^3.0.0" 1121 | 1122 | micromatch@^2.1.5: 1123 | version "2.3.11" 1124 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" 1125 | dependencies: 1126 | arr-diff "^2.0.0" 1127 | array-unique "^0.2.1" 1128 | braces "^1.8.2" 1129 | expand-brackets "^0.1.4" 1130 | extglob "^0.3.1" 1131 | filename-regex "^2.0.0" 1132 | is-extglob "^1.0.0" 1133 | is-glob "^2.0.1" 1134 | kind-of "^3.0.2" 1135 | normalize-path "^2.0.1" 1136 | object.omit "^2.0.0" 1137 | parse-glob "^3.0.4" 1138 | regex-cache "^0.4.2" 1139 | 1140 | mime-db@~1.27.0: 1141 | version "1.27.0" 1142 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.27.0.tgz#820f572296bbd20ec25ed55e5b5de869e5436eb1" 1143 | 1144 | mime-types@^2.1.12, mime-types@~2.1.7: 1145 | version "2.1.15" 1146 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.15.tgz#a4ebf5064094569237b8cf70046776d09fc92aed" 1147 | dependencies: 1148 | mime-db "~1.27.0" 1149 | 1150 | minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.4: 1151 | version "3.0.4" 1152 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 1153 | dependencies: 1154 | brace-expansion "^1.1.7" 1155 | 1156 | minimist@0.0.8: 1157 | version "0.0.8" 1158 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 1159 | 1160 | minimist@^1.2.0: 1161 | version "1.2.0" 1162 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" 1163 | 1164 | "mkdirp@>=0.5 0", mkdirp@^0.5.1: 1165 | version "0.5.1" 1166 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 1167 | dependencies: 1168 | minimist "0.0.8" 1169 | 1170 | ms@2.0.0: 1171 | version "2.0.0" 1172 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 1173 | 1174 | nan@^2.3.0: 1175 | version "2.6.2" 1176 | resolved "https://registry.yarnpkg.com/nan/-/nan-2.6.2.tgz#e4ff34e6c95fdfb5aecc08de6596f43605a7db45" 1177 | 1178 | node-pre-gyp@^0.6.36: 1179 | version "0.6.36" 1180 | resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.36.tgz#db604112cb74e0d477554e9b505b17abddfab786" 1181 | dependencies: 1182 | mkdirp "^0.5.1" 1183 | nopt "^4.0.1" 1184 | npmlog "^4.0.2" 1185 | rc "^1.1.7" 1186 | request "^2.81.0" 1187 | rimraf "^2.6.1" 1188 | semver "^5.3.0" 1189 | tar "^2.2.1" 1190 | tar-pack "^3.4.0" 1191 | 1192 | nopt@^4.0.1: 1193 | version "4.0.1" 1194 | resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" 1195 | dependencies: 1196 | abbrev "1" 1197 | osenv "^0.1.4" 1198 | 1199 | normalize-path@^2.0.1: 1200 | version "2.1.1" 1201 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" 1202 | dependencies: 1203 | remove-trailing-separator "^1.0.1" 1204 | 1205 | npmlog@^4.0.2: 1206 | version "4.1.2" 1207 | resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" 1208 | dependencies: 1209 | are-we-there-yet "~1.1.2" 1210 | console-control-strings "~1.1.0" 1211 | gauge "~2.7.3" 1212 | set-blocking "~2.0.0" 1213 | 1214 | number-is-nan@^1.0.0: 1215 | version "1.0.1" 1216 | resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" 1217 | 1218 | oauth-sign@~0.8.1: 1219 | version "0.8.2" 1220 | resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" 1221 | 1222 | object-assign@^4.1.0: 1223 | version "4.1.1" 1224 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 1225 | 1226 | object.omit@^2.0.0: 1227 | version "2.0.1" 1228 | resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" 1229 | dependencies: 1230 | for-own "^0.1.4" 1231 | is-extendable "^0.1.1" 1232 | 1233 | once@^1.3.0, once@^1.3.3: 1234 | version "1.4.0" 1235 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1236 | dependencies: 1237 | wrappy "1" 1238 | 1239 | os-homedir@^1.0.0: 1240 | version "1.0.2" 1241 | resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" 1242 | 1243 | os-tmpdir@^1.0.0, os-tmpdir@^1.0.1: 1244 | version "1.0.2" 1245 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 1246 | 1247 | osenv@^0.1.4: 1248 | version "0.1.4" 1249 | resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644" 1250 | dependencies: 1251 | os-homedir "^1.0.0" 1252 | os-tmpdir "^1.0.0" 1253 | 1254 | output-file-sync@^1.1.0: 1255 | version "1.1.2" 1256 | resolved "https://registry.yarnpkg.com/output-file-sync/-/output-file-sync-1.1.2.tgz#d0a33eefe61a205facb90092e826598d5245ce76" 1257 | dependencies: 1258 | graceful-fs "^4.1.4" 1259 | mkdirp "^0.5.1" 1260 | object-assign "^4.1.0" 1261 | 1262 | parse-glob@^3.0.4: 1263 | version "3.0.4" 1264 | resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" 1265 | dependencies: 1266 | glob-base "^0.3.0" 1267 | is-dotfile "^1.0.0" 1268 | is-extglob "^1.0.0" 1269 | is-glob "^2.0.0" 1270 | 1271 | path-is-absolute@^1.0.0: 1272 | version "1.0.1" 1273 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1274 | 1275 | performance-now@^0.2.0: 1276 | version "0.2.0" 1277 | resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" 1278 | 1279 | preserve@^0.2.0: 1280 | version "0.2.0" 1281 | resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" 1282 | 1283 | private@^0.1.6: 1284 | version "0.1.7" 1285 | resolved "https://registry.yarnpkg.com/private/-/private-0.1.7.tgz#68ce5e8a1ef0a23bb570cc28537b5332aba63ef1" 1286 | 1287 | process-nextick-args@~1.0.6: 1288 | version "1.0.7" 1289 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" 1290 | 1291 | punycode@^1.4.1: 1292 | version "1.4.1" 1293 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" 1294 | 1295 | qs@~6.4.0: 1296 | version "6.4.0" 1297 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" 1298 | 1299 | randomatic@^1.1.3: 1300 | version "1.1.7" 1301 | resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.7.tgz#c7abe9cc8b87c0baa876b19fde83fd464797e38c" 1302 | dependencies: 1303 | is-number "^3.0.0" 1304 | kind-of "^4.0.0" 1305 | 1306 | rc@^1.1.7: 1307 | version "1.2.1" 1308 | resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.1.tgz#2e03e8e42ee450b8cb3dce65be1bf8974e1dfd95" 1309 | dependencies: 1310 | deep-extend "~0.4.0" 1311 | ini "~1.3.0" 1312 | minimist "^1.2.0" 1313 | strip-json-comments "~2.0.1" 1314 | 1315 | readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.4: 1316 | version "2.3.3" 1317 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" 1318 | dependencies: 1319 | core-util-is "~1.0.0" 1320 | inherits "~2.0.3" 1321 | isarray "~1.0.0" 1322 | process-nextick-args "~1.0.6" 1323 | safe-buffer "~5.1.1" 1324 | string_decoder "~1.0.3" 1325 | util-deprecate "~1.0.1" 1326 | 1327 | readdirp@^2.0.0: 1328 | version "2.1.0" 1329 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" 1330 | dependencies: 1331 | graceful-fs "^4.1.2" 1332 | minimatch "^3.0.2" 1333 | readable-stream "^2.0.2" 1334 | set-immediate-shim "^1.0.1" 1335 | 1336 | regenerate@^1.2.1: 1337 | version "1.3.2" 1338 | resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.2.tgz#d1941c67bad437e1be76433add5b385f95b19260" 1339 | 1340 | regenerator-runtime@^0.10.0: 1341 | version "0.10.5" 1342 | resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" 1343 | 1344 | regenerator-transform@0.9.11: 1345 | version "0.9.11" 1346 | resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.9.11.tgz#3a7d067520cb7b7176769eb5ff868691befe1283" 1347 | dependencies: 1348 | babel-runtime "^6.18.0" 1349 | babel-types "^6.19.0" 1350 | private "^0.1.6" 1351 | 1352 | regex-cache@^0.4.2: 1353 | version "0.4.3" 1354 | resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.3.tgz#9b1a6c35d4d0dfcef5711ae651e8e9d3d7114145" 1355 | dependencies: 1356 | is-equal-shallow "^0.1.3" 1357 | is-primitive "^2.0.0" 1358 | 1359 | regexpu-core@^2.0.0: 1360 | version "2.0.0" 1361 | resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" 1362 | dependencies: 1363 | regenerate "^1.2.1" 1364 | regjsgen "^0.2.0" 1365 | regjsparser "^0.1.4" 1366 | 1367 | regjsgen@^0.2.0: 1368 | version "0.2.0" 1369 | resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" 1370 | 1371 | regjsparser@^0.1.4: 1372 | version "0.1.5" 1373 | resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" 1374 | dependencies: 1375 | jsesc "~0.5.0" 1376 | 1377 | remove-trailing-separator@^1.0.1: 1378 | version "1.0.2" 1379 | resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.0.2.tgz#69b062d978727ad14dc6b56ba4ab772fd8d70511" 1380 | 1381 | repeat-element@^1.1.2: 1382 | version "1.1.2" 1383 | resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" 1384 | 1385 | repeat-string@^1.5.2: 1386 | version "1.6.1" 1387 | resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" 1388 | 1389 | repeating@^2.0.0: 1390 | version "2.0.1" 1391 | resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" 1392 | dependencies: 1393 | is-finite "^1.0.0" 1394 | 1395 | request@^2.81.0: 1396 | version "2.81.0" 1397 | resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" 1398 | dependencies: 1399 | aws-sign2 "~0.6.0" 1400 | aws4 "^1.2.1" 1401 | caseless "~0.12.0" 1402 | combined-stream "~1.0.5" 1403 | extend "~3.0.0" 1404 | forever-agent "~0.6.1" 1405 | form-data "~2.1.1" 1406 | har-validator "~4.2.1" 1407 | hawk "~3.1.3" 1408 | http-signature "~1.1.0" 1409 | is-typedarray "~1.0.0" 1410 | isstream "~0.1.2" 1411 | json-stringify-safe "~5.0.1" 1412 | mime-types "~2.1.7" 1413 | oauth-sign "~0.8.1" 1414 | performance-now "^0.2.0" 1415 | qs "~6.4.0" 1416 | safe-buffer "^5.0.1" 1417 | stringstream "~0.0.4" 1418 | tough-cookie "~2.3.0" 1419 | tunnel-agent "^0.6.0" 1420 | uuid "^3.0.0" 1421 | 1422 | rimraf@2, rimraf@^2.5.1, rimraf@^2.6.1: 1423 | version "2.6.1" 1424 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d" 1425 | dependencies: 1426 | glob "^7.0.5" 1427 | 1428 | safe-buffer@^5.0.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: 1429 | version "5.1.1" 1430 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" 1431 | 1432 | semver@^5.3.0: 1433 | version "5.3.0" 1434 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" 1435 | 1436 | set-blocking@~2.0.0: 1437 | version "2.0.0" 1438 | resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" 1439 | 1440 | set-immediate-shim@^1.0.1: 1441 | version "1.0.1" 1442 | resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" 1443 | 1444 | signal-exit@^3.0.0: 1445 | version "3.0.2" 1446 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" 1447 | 1448 | slash@^1.0.0: 1449 | version "1.0.0" 1450 | resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" 1451 | 1452 | sntp@1.x.x: 1453 | version "1.0.9" 1454 | resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" 1455 | dependencies: 1456 | hoek "2.x.x" 1457 | 1458 | source-map-support@^0.4.2: 1459 | version "0.4.15" 1460 | resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.15.tgz#03202df65c06d2bd8c7ec2362a193056fef8d3b1" 1461 | dependencies: 1462 | source-map "^0.5.6" 1463 | 1464 | source-map@^0.5.0, source-map@^0.5.6: 1465 | version "0.5.6" 1466 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" 1467 | 1468 | sshpk@^1.7.0: 1469 | version "1.13.1" 1470 | resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.1.tgz#512df6da6287144316dc4c18fe1cf1d940739be3" 1471 | dependencies: 1472 | asn1 "~0.2.3" 1473 | assert-plus "^1.0.0" 1474 | dashdash "^1.12.0" 1475 | getpass "^0.1.1" 1476 | optionalDependencies: 1477 | bcrypt-pbkdf "^1.0.0" 1478 | ecc-jsbn "~0.1.1" 1479 | jsbn "~0.1.0" 1480 | tweetnacl "~0.14.0" 1481 | 1482 | string-width@^1.0.1, string-width@^1.0.2: 1483 | version "1.0.2" 1484 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" 1485 | dependencies: 1486 | code-point-at "^1.0.0" 1487 | is-fullwidth-code-point "^1.0.0" 1488 | strip-ansi "^3.0.0" 1489 | 1490 | string_decoder@~1.0.3: 1491 | version "1.0.3" 1492 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" 1493 | dependencies: 1494 | safe-buffer "~5.1.0" 1495 | 1496 | stringstream@~0.0.4: 1497 | version "0.0.5" 1498 | resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" 1499 | 1500 | strip-ansi@^3.0.0, strip-ansi@^3.0.1: 1501 | version "3.0.1" 1502 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 1503 | dependencies: 1504 | ansi-regex "^2.0.0" 1505 | 1506 | strip-json-comments@~2.0.1: 1507 | version "2.0.1" 1508 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 1509 | 1510 | supports-color@^2.0.0: 1511 | version "2.0.0" 1512 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" 1513 | 1514 | tar-pack@^3.4.0: 1515 | version "3.4.0" 1516 | resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.0.tgz#23be2d7f671a8339376cbdb0b8fe3fdebf317984" 1517 | dependencies: 1518 | debug "^2.2.0" 1519 | fstream "^1.0.10" 1520 | fstream-ignore "^1.0.5" 1521 | once "^1.3.3" 1522 | readable-stream "^2.1.4" 1523 | rimraf "^2.5.1" 1524 | tar "^2.2.1" 1525 | uid-number "^0.0.6" 1526 | 1527 | tar@^2.2.1: 1528 | version "2.2.1" 1529 | resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" 1530 | dependencies: 1531 | block-stream "*" 1532 | fstream "^1.0.2" 1533 | inherits "2" 1534 | 1535 | to-fast-properties@^1.0.1: 1536 | version "1.0.3" 1537 | resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" 1538 | 1539 | tough-cookie@~2.3.0: 1540 | version "2.3.2" 1541 | resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.2.tgz#f081f76e4c85720e6c37a5faced737150d84072a" 1542 | dependencies: 1543 | punycode "^1.4.1" 1544 | 1545 | trim-right@^1.0.1: 1546 | version "1.0.1" 1547 | resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" 1548 | 1549 | tunnel-agent@^0.6.0: 1550 | version "0.6.0" 1551 | resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" 1552 | dependencies: 1553 | safe-buffer "^5.0.1" 1554 | 1555 | tweetnacl@^0.14.3, tweetnacl@~0.14.0: 1556 | version "0.14.5" 1557 | resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" 1558 | 1559 | uid-number@^0.0.6: 1560 | version "0.0.6" 1561 | resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" 1562 | 1563 | user-home@^1.1.1: 1564 | version "1.1.1" 1565 | resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" 1566 | 1567 | util-deprecate@~1.0.1: 1568 | version "1.0.2" 1569 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 1570 | 1571 | uuid@^3.0.0: 1572 | version "3.1.0" 1573 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04" 1574 | 1575 | v8flags@^2.0.10: 1576 | version "2.1.1" 1577 | resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4" 1578 | dependencies: 1579 | user-home "^1.1.1" 1580 | 1581 | verror@1.3.6: 1582 | version "1.3.6" 1583 | resolved "https://registry.yarnpkg.com/verror/-/verror-1.3.6.tgz#cff5df12946d297d2baaefaa2689e25be01c005c" 1584 | dependencies: 1585 | extsprintf "1.0.2" 1586 | 1587 | wide-align@^1.1.0: 1588 | version "1.1.2" 1589 | resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710" 1590 | dependencies: 1591 | string-width "^1.0.2" 1592 | 1593 | wrappy@1: 1594 | version "1.0.2" 1595 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1596 | --------------------------------------------------------------------------------