├── .eslintignore ├── .eslintrc.js ├── .gitignore ├── .tool-versions ├── README.md ├── assets ├── css │ ├── app.scss │ └── phoenix.css ├── js │ ├── app.js │ ├── socket.js │ └── view │ │ ├── message_list.js │ │ ├── metrics_list.js │ │ └── operation_box.js ├── package-lock.json ├── package.json ├── static │ ├── favicon.ico │ ├── images │ │ └── phoenix.png │ └── robots.txt ├── webpack.config.js └── yarn.lock ├── config ├── config.exs ├── dev.exs ├── prod.exs └── test.exs ├── lib ├── delicate_chat.ex ├── delicate_chat │ ├── application.ex │ ├── metrics.ex │ ├── metrics_notifier.ex │ ├── violence_text_judgement.ex │ └── xml_validator.ex ├── delicate_chat_web.ex └── delicate_chat_web │ ├── channels │ ├── room_channel.ex │ └── user_socket.ex │ ├── controllers │ └── page_controller.ex │ ├── endpoint.ex │ ├── gettext.ex │ ├── router.ex │ ├── templates │ ├── layout │ │ └── app.html.eex │ └── page │ │ └── index.html.eex │ └── views │ ├── error_helpers.ex │ ├── error_view.ex │ ├── layout_view.ex │ └── page_view.ex ├── mix.exs ├── mix.lock ├── package.json ├── priv └── gettext │ ├── en │ └── LC_MESSAGES │ │ └── errors.po │ └── errors.pot ├── test ├── delicate_chat_web │ ├── controllers │ │ └── page_controller_test.exs │ └── views │ │ ├── error_view_test.exs │ │ ├── layout_view_test.exs │ │ └── page_view_test.exs ├── support │ ├── channel_case.ex │ └── conn_case.ex └── test_helper.exs └── yarn.lock /.eslintignore: -------------------------------------------------------------------------------- 1 | web/static/vendor/ 2 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | "env": { 3 | "browser": true, 4 | "jquery": true, 5 | }, 6 | "parserOptions": { 7 | "ecmaVersion": 7, 8 | "sourceType": "module" 9 | }, 10 | "globals": { 11 | }, 12 | "extends": "eslint:recommended", 13 | "rules": { 14 | "indent": [ 15 | "error", 16 | 2 17 | ], 18 | "linebreak-style": [ 19 | "error", 20 | "unix" 21 | ], 22 | "no-console": "off", 23 | "quotes": [ 24 | "error", 25 | "single" 26 | ], 27 | "semi": [ 28 | "error", 29 | "always" 30 | ], 31 | "no-unused-vars": ["error", { "argsIgnorePattern": "^_" }] 32 | } 33 | }; -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # App artifacts 2 | /_build 3 | /db 4 | /deps 5 | /*.ez 6 | 7 | # Generated on crash by the VM 8 | erl_crash.dump 9 | 10 | # Generated on crash by NPM 11 | npm-debug.log 12 | 13 | # Static artifacts 14 | /assets/node_modules 15 | 16 | # Since we are building assets from assets/, 17 | # we ignore priv/static. You may want to comment 18 | # this depending on your deployment strategy. 19 | /priv/static/ 20 | 21 | # Files matching config/*.secret.exs pattern contain sensitive 22 | # data and you should not commit them into version control. 23 | # 24 | # Alternatively, you may comment the line below and commit the 25 | # secrets files as long as you replace their contents by environment 26 | # variables. 27 | /config/*.secret.exs -------------------------------------------------------------------------------- /.tool-versions: -------------------------------------------------------------------------------- 1 | nodejs 8.4.0 2 | elixir 1.5.2 3 | erlang 20.1 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # DelicateChat(α) 2 | 3 | Elixirのアンチーパターンとそれで発生する問題時のErlangVMの状態を体験するためのWebチャット 4 | 5 | ## 発表スライドへのリンク 6 | 7 | [Elixirを利用した繊細なwebチャットの開発](https://www.slideshare.net/ndruger/elixirweb-82742732) 8 | 9 | ## To start your Phoenix server: 10 | 11 | * Install dependencies with `mix deps.get` 12 | * Install Node.js dependencies with `cd assets && yarn` 13 | * Start Phoenix endpoint with `iex -S mix phx.server` 14 | 15 | Now you can visit [`localhost:4000`](http://localhost:4000) from your browser. 16 | 17 | ## 対応済みアンチパターン 18 | 19 | - 1. ユーザー入力から動的にAtomを生成する。 20 | - 2. GenServerで処理量より多くのメッセージを定常的に受け取る。 21 | 22 | ## 対応予定アンチパターン 23 | 24 | - GenServerでのinit/1でのコネクション接続によるエラー 25 | - メモリリーク 26 | - プロセスリーク 27 | - ファイルでスクリプタリーク 28 | - パターンマッチミスによるリーク 29 | - NIFによるErlangVMクラッシュ 30 | 31 | -------------------------------------------------------------------------------- /assets/css/app.scss: -------------------------------------------------------------------------------- 1 | html, body { 2 | height: 100%; 3 | font-size: large 4 | } 5 | 6 | textarea.form-control { 7 | font-size: large 8 | } 9 | 10 | select.form-control { 11 | font-size: large 12 | } 13 | 14 | .client-base { 15 | display: flex; 16 | flex-direction: column; 17 | flex-grow: 1; 18 | height: 100%; 19 | } 20 | 21 | .client-container { 22 | display: flex; 23 | flex-grow: 1; 24 | overflow: hidden; 25 | } 26 | 27 | .side-bar { 28 | background-color: #000; 29 | color: #0f0; 30 | overflow: scroll; 31 | position: relative; 32 | display: flex; 33 | flex-direction: column; 34 | flex-basis: 440px; 35 | flex-shrink: 0; 36 | padding: 15px; 37 | .system-metrics { 38 | font-size: 18pt; 39 | } 40 | .metrics-group { 41 | background-color: rgba(255, 255, 255, 0.2); 42 | padding: 2px 10px; 43 | margin: 8px; 44 | .metrics-group-label { 45 | text-align: center; 46 | margin-bottom: 4px; 47 | } 48 | .metrics-body { 49 | white-space: pre; 50 | } 51 | } 52 | .chart-container { 53 | $height: 40px; 54 | height: $height; 55 | position: relative; 56 | canvas { 57 | height: $height !important; 58 | } 59 | } 60 | } 61 | 62 | .client-main { 63 | position: relative; 64 | display: flex; 65 | flex-direction: column; 66 | flex-grow: 1; 67 | } 68 | 69 | .message-list-container { 70 | overflow: scroll; 71 | flex: 1; 72 | padding: 15px; 73 | .message-list-pad { 74 | height: 100vh; 75 | } 76 | } 77 | 78 | .message { 79 | border-top: solid 2px #aaa; 80 | padding: 8px; 81 | .message-header { 82 | .message-name { 83 | font-weight: bold; 84 | &.message-name-system { 85 | color: red; 86 | } 87 | } 88 | .message-type { 89 | margin-left: 10px; 90 | color: #5a5; 91 | } 92 | } 93 | .message-body { 94 | white-space: pre; 95 | } 96 | .message-body-main-xml { 97 | border: solid 2px #ccc; 98 | padding: 2px; 99 | border-radius: 5px; 100 | } 101 | } 102 | 103 | .operation-box { 104 | border-top: solid 2px #aaa; 105 | padding: 15px; 106 | display: flex; 107 | .opeartion-message-form { 108 | flex-grow: 1; 109 | .operation-type { 110 | width: 180px; 111 | } 112 | } 113 | .opeartion-trouble { 114 | padding: 10px; 115 | flex-basis: 440px; 116 | .operation-button-group { 117 | float: right; 118 | } 119 | } 120 | } 121 | 122 | -------------------------------------------------------------------------------- /assets/js/app.js: -------------------------------------------------------------------------------- 1 | import 'phoenix_html'; 2 | import {Socket} from 'phoenix'; 3 | import * as OperationBox from './view/operation_box'; 4 | import * as MessageList from './view/message_list'; 5 | import * as MetricsList from './view/metrics_list'; 6 | 7 | $(() => { 8 | 9 | const socket = new Socket('/socket', { 10 | params: {token: window.userToken}, 11 | // logger: ((kind, msg, data) => { 12 | // console.log(`${kind}: ${msg}`, data); 13 | // }) 14 | }); 15 | 16 | socket.connect(); 17 | const chan = socket.channel('room:chat', {}); 18 | 19 | OperationBox.load(chan); 20 | 21 | chan.join().receive('ok', () => { 22 | console.log('joined'); 23 | 24 | chan.on('new_msg', (msg) => { 25 | MessageList.handleMsg(msg); 26 | }); 27 | 28 | chan.on('system', (msg) => { 29 | MetricsList.handleMsg(msg); 30 | }); 31 | }); 32 | }); 33 | -------------------------------------------------------------------------------- /assets/js/socket.js: -------------------------------------------------------------------------------- 1 | // NOTE: The contents of this file will only be executed if 2 | // you uncomment its entry in "assets/js/app.js". 3 | 4 | // To use Phoenix channels, the first step is to import Socket 5 | // and connect at the socket path in "lib/web/endpoint.ex": 6 | import {Socket} from "phoenix" 7 | 8 | let socket = new Socket("/socket", {params: {token: window.userToken}}) 9 | 10 | // When you connect, you'll often need to authenticate the client. 11 | // For example, imagine you have an authentication plug, `MyAuth`, 12 | // which authenticates the session and assigns a `:current_user`. 13 | // If the current user exists you can assign the user's token in 14 | // the connection for use in the layout. 15 | // 16 | // In your "lib/web/router.ex": 17 | // 18 | // pipeline :browser do 19 | // ... 20 | // plug MyAuth 21 | // plug :put_user_token 22 | // end 23 | // 24 | // defp put_user_token(conn, _) do 25 | // if current_user = conn.assigns[:current_user] do 26 | // token = Phoenix.Token.sign(conn, "user socket", current_user.id) 27 | // assign(conn, :user_token, token) 28 | // else 29 | // conn 30 | // end 31 | // end 32 | // 33 | // Now you need to pass this token to JavaScript. You can do so 34 | // inside a script tag in "lib/web/templates/layout/app.html.eex": 35 | // 36 | // 37 | // 38 | // You will need to verify the user token in the "connect/2" function 39 | // in "lib/web/channels/user_socket.ex": 40 | // 41 | // def connect(%{"token" => token}, socket) do 42 | // # max_age: 1209600 is equivalent to two weeks in seconds 43 | // case Phoenix.Token.verify(socket, "user socket", token, max_age: 1209600) do 44 | // {:ok, user_id} -> 45 | // {:ok, assign(socket, :user, user_id)} 46 | // {:error, reason} -> 47 | // :error 48 | // end 49 | // end 50 | // 51 | // Finally, pass the token on connect as below. Or remove it 52 | // from connect if you don't care about authentication. 53 | 54 | socket.connect() 55 | 56 | // Now that you are connected, you can join channels with a topic: 57 | let channel = socket.channel("topic:subtopic", {}) 58 | channel.join() 59 | .receive("ok", resp => { console.log("Joined successfully", resp) }) 60 | .receive("error", resp => { console.log("Unable to join", resp) }) 61 | 62 | export default socket 63 | -------------------------------------------------------------------------------- /assets/js/view/message_list.js: -------------------------------------------------------------------------------- 1 | import {pd as PrettyData} from 'pretty-data'; 2 | 3 | const messageMax = 20; 4 | 5 | function createTextBody({body}) { 6 | const $el = $('
'); 7 | const $main = $('
').text(body); 8 | return $el.append($main); 9 | } 10 | 11 | function createXmlBody({body, meta}) { 12 | const $el = $('
'); 13 | const $main = $('
').text(PrettyData.xml(body)); 14 | const $meta = $('
').text(meta.isValid ? '[ 有効なXMLです ]' : '[ 不正なXMLです ]'); 15 | return $el.append([$meta, $main]); 16 | } 17 | 18 | function createBodyEl({type, body, meta}) { 19 | switch(type) { 20 | case 'text': 21 | return createTextBody({body, meta}); 22 | case 'xml': 23 | return createXmlBody({body, meta}); 24 | } 25 | } 26 | 27 | function createMsgEl({name, type, body, meta}) { 28 | const $msg = $('
'); 29 | const $header = $('
'); 30 | const $name = $('') 31 | .text(name) 32 | .toggleClass('message-name-system', name === 'system'); 33 | const $type = $('').text(type); 34 | $header.append([$name, $type]); 35 | const $body = createBodyEl({type, body, meta}); 36 | $msg.append([$header, $body]); 37 | return $msg; 38 | } 39 | 40 | function clearOveredMsg() { 41 | const $allMessages = $('.message'); 42 | if ($allMessages.length > messageMax) { 43 | $allMessages.first().remove(); 44 | } 45 | } 46 | 47 | function adjustScroll() { 48 | $('.message-list-container').scrollTop($('.message-list-container')[0].scrollHeight); 49 | } 50 | 51 | export function handleMsg(msg) { 52 | const $msg = createMsgEl(msg); 53 | $('.message-list').append($msg); 54 | clearOveredMsg(); 55 | adjustScroll(); 56 | } 57 | -------------------------------------------------------------------------------- /assets/js/view/metrics_list.js: -------------------------------------------------------------------------------- 1 | import _ from 'lodash'; 2 | import Chart from 'chart.js'; 3 | 4 | Chart.defaults.global.legend.display = false; 5 | 6 | const metricsHistoryMax = 80; 7 | const charts = {}; 8 | 9 | function initChart($el) { 10 | var ctx = $el[0].getContext('2d'); 11 | const color = 'rgb(255, 255, 255)'; 12 | return new Chart(ctx, { 13 | type: 'line', 14 | responsive: false, 15 | maintainAspectRatio: false, 16 | data: { 17 | labels: _.times(metricsHistoryMax, () => ''), 18 | datasets: [{ 19 | data: _.times(metricsHistoryMax, () => 0), 20 | fill: 'start', 21 | backgroundColor: [ 22 | color, 23 | ], 24 | borderColor: [ 25 | color, 26 | ], 27 | borderWidth: 1 28 | }] 29 | }, 30 | options: { 31 | scales: { 32 | yAxes: [{ 33 | display: false, 34 | ticks: { 35 | beginAtZero: true 36 | } 37 | }] 38 | } 39 | } 40 | }); 41 | } 42 | 43 | function genMetricsId(k) { 44 | return `metrics-${k}`; 45 | } 46 | 47 | function createAndAppendNumberMetricsEntity(k, v, $group) { 48 | const id = genMetricsId(k); 49 | const $el = $('
').attr('id', id); 50 | const $label = $('
'); 51 | const $chartContainer = $('
'); 52 | $el.append([$label, $chartContainer]); 53 | $group.append($el); 54 | charts[id] = initChart($(`#${id} canvas`)); 55 | } 56 | 57 | function createAndAppendObjectMetricsEntity(k, v, $group) { 58 | const id = genMetricsId(k); 59 | const $el = $('
').attr('id', id); 60 | const $label = $('
'); 61 | const $body = $('
'); 62 | $el.append([$label, $body]); 63 | $group.append($el); 64 | } 65 | 66 | function createAndAppendMetricsEntity(k, v, $group) { 67 | switch(typeof(v)) { 68 | case 'number': 69 | createAndAppendNumberMetricsEntity(k, v, $group); 70 | break; 71 | case 'object': 72 | createAndAppendObjectMetricsEntity(k, v, $group); 73 | break; 74 | default: 75 | console.assert('unexpected type'); 76 | } 77 | } 78 | 79 | function updateNumberMetricsEntity(k, v) { 80 | const id = genMetricsId(k); 81 | $(`#${id} .metrics-label`).text(`${k}: ${v.toLocaleString('en-US')}`); 82 | const chart = charts[id]; 83 | const data = chart.data.datasets[0].data; 84 | data.push(v); 85 | data.shift(); 86 | chart.update(); 87 | } 88 | 89 | function updateObjectMetricsEntity(k, v) { 90 | const id = genMetricsId(k); 91 | $(`#${id} .metrics-label`).text(k); 92 | $(`#${id} .metrics-body`).text(JSON.stringify(v, null, 2)); 93 | } 94 | 95 | function updatedMetricsEntity(k, v) { 96 | switch(typeof(v)) { 97 | case 'number': 98 | updateNumberMetricsEntity(k, v); 99 | break; 100 | case 'object': 101 | updateObjectMetricsEntity(k, v); 102 | break; 103 | default: 104 | console.assert('unexpected type'); 105 | } 106 | } 107 | 108 | function initMetrics(metricGroups) { 109 | const arrayed = _.map(metricGroups, (v, k) => [k, v]); 110 | const order = ['Process.list', ':erlang.system_info', ':erlang.memroy', ':recon.proc_count']; 111 | const sorted = _.sortBy(arrayed, ([name]) => { 112 | return _.findIndex(order, (o) => name.match(o)); 113 | }); 114 | _.each(sorted, ([groupName, metrics]) => { 115 | const $group = $('
'); 116 | const $groupLabel = $('
').text(groupName); 117 | $group.append($groupLabel); 118 | $('.system-metrics').append($group); 119 | _.each(metrics, (v, k) => { 120 | createAndAppendMetricsEntity(k, v, $group); 121 | }); 122 | }); 123 | } 124 | 125 | function updateMetrics(metricGroups) { 126 | _.each(metricGroups, (metrics) => { 127 | _.each(metrics, (v, k) => updatedMetricsEntity(k, v)); 128 | }); 129 | } 130 | 131 | export function handleMsg({body}) { 132 | const metricGroups = JSON.parse(body); 133 | if ($('.system-metrics').children().length == 0) { 134 | initMetrics(metricGroups); 135 | } 136 | updateMetrics(metricGroups); 137 | } 138 | -------------------------------------------------------------------------------- /assets/js/view/operation_box.js: -------------------------------------------------------------------------------- 1 | import _ from 'lodash'; 2 | 3 | const senarioInterval = 10; 4 | 5 | function randomAlphaStr(len) { 6 | return _.times(len, () => (10 + _.random(25)).toString(36)).join('') ; 7 | } 8 | 9 | export function load(chan) { 10 | let lastKeyDownCode; 11 | $('.operation-textarea').keydown((e) => { 12 | lastKeyDownCode = e.keyCode; 13 | }); 14 | 15 | $('.operation-textarea').keyup((e) => { 16 | if (lastKeyDownCode == 13 && e.keyCode == 13 && !e.shiftKey) { // lastKeyDownCode for ime 17 | const msg = { 18 | name: 'nobody', 19 | type: $('.operation-type').val(), 20 | body: $('.operation-textarea').val(), 21 | }; 22 | chan.push('new:msg', msg); 23 | $('.operation-textarea').val(''); 24 | } 25 | }); 26 | 27 | $('.xml-text-senario').click(() => { 28 | function generateXml() { 29 | const body = _.map(_.times(3000), () => { 30 | const tag = randomAlphaStr(10); 31 | return `<${tag}>a`; 32 | }).join(); 33 | const start = ''; 34 | const end = ''; 35 | return `${start}${body}${end}`; 36 | } 37 | setInterval(() => { 38 | const msg = { 39 | name: 'nobody', 40 | type: 'xml', 41 | body: generateXml(), 42 | }; 43 | chan.push('new:msg', msg); 44 | }, senarioInterval); 45 | }); 46 | 47 | function startPlainTextSenario(strLen) { 48 | setInterval(() => { 49 | const msg = { 50 | name: 'nobody', 51 | type: 'text', 52 | body: randomAlphaStr(strLen), 53 | }; 54 | chan.push('new:msg', msg); 55 | }, senarioInterval); 56 | } 57 | 58 | $('.small-plain-text-senario').click(() => { 59 | startPlainTextSenario(10); 60 | }); 61 | 62 | $('.large-plain-text-senario').click(() => { 63 | startPlainTextSenario(10000); 64 | }); 65 | } 66 | 67 | -------------------------------------------------------------------------------- /assets/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "repository": {}, 4 | "license": "MIT", 5 | "scripts": { 6 | "deploy": "brunch build --production", 7 | "watch": "brunch watch --stdin" 8 | }, 9 | "dependencies": { 10 | "chart.js": "^2.7.1", 11 | "css-loader": "^0.28.7", 12 | "node-sass": "^4.7.2", 13 | "phoenix": "file:../deps/phoenix", 14 | "phoenix_html": "file:../deps/phoenix_html", 15 | "pretty-data": "^0.40.0", 16 | "sass-loader": "^6.0.6", 17 | "style-loader": "^0.19.0" 18 | }, 19 | "devDependencies": { 20 | "webpack": "^3.8.1" 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /assets/static/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ndruger/delicate_chat/ea5261bb8a62a6ba094d7549d39b68f0a0e7897c/assets/static/favicon.ico -------------------------------------------------------------------------------- /assets/static/images/phoenix.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ndruger/delicate_chat/ea5261bb8a62a6ba094d7549d39b68f0a0e7897c/assets/static/images/phoenix.png -------------------------------------------------------------------------------- /assets/static/robots.txt: -------------------------------------------------------------------------------- 1 | # See http://www.robotstxt.org/robotstxt.html for documentation on how to use the robots.txt file 2 | # 3 | # To ban all spiders from the entire site uncomment the next two lines: 4 | # User-agent: * 5 | # Disallow: / 6 | -------------------------------------------------------------------------------- /assets/webpack.config.js: -------------------------------------------------------------------------------- 1 | const webpack = require('webpack'); 2 | 3 | const isDevelopment = process.env.NODE_ENV === 'development' || process.env.NODE_ENV === undefined; 4 | 5 | module.exports = { 6 | entry: { 7 | app: [ 8 | './js/app.js', 9 | './css/app.scss', 10 | ], 11 | }, 12 | output: { 13 | path: __dirname + '/../priv/static/js', 14 | filename: 'app.js', 15 | publicPath: '/js/', 16 | }, 17 | externals: { 18 | jquery: 'jQuery', 19 | }, 20 | module: { 21 | rules: [{ 22 | test: /\.scss$/, 23 | use: [ 24 | { 25 | loader: "style-loader" 26 | }, 27 | { 28 | loader: "css-loader" 29 | }, 30 | { 31 | loader: "sass-loader" 32 | } 33 | ] 34 | }] 35 | } 36 | }; -------------------------------------------------------------------------------- /config/config.exs: -------------------------------------------------------------------------------- 1 | # This file is responsible for configuring your application 2 | # and its dependencies with the aid of the Mix.Config module. 3 | # 4 | # This configuration file is loaded before any dependency and 5 | # is restricted to this project. 6 | use Mix.Config 7 | 8 | # Configures the endpoint 9 | config :delicate_chat, DelicateChatWeb.Endpoint, 10 | url: [host: "localhost"], 11 | secret_key_base: "GCtXpWYRAjiM6vIXN0v0c7CByxYBlIRaIzEYHHmn3F+boYVP0un7q372ITayi0K2", 12 | render_errors: [view: DelicateChatWeb.ErrorView, accepts: ~w(html json)], 13 | pubsub: [name: DelicateChat.PubSub, 14 | adapter: Phoenix.PubSub.PG2] 15 | 16 | # Configures Elixir's Logger 17 | config :logger, :console, 18 | level: :info, # for demo 19 | format: "$time $metadata[$level] $message\n", 20 | metadata: [:request_id] 21 | 22 | # Import environment specific config. This must remain at the bottom 23 | # of this file so it overrides the configuration defined above. 24 | import_config "#{Mix.env}.exs" 25 | -------------------------------------------------------------------------------- /config/dev.exs: -------------------------------------------------------------------------------- 1 | use Mix.Config 2 | 3 | # For development, we disable any cache and enable 4 | # debugging and code reloading. 5 | # 6 | # The watchers configuration can be used to run external 7 | # watchers to your application. For example, we use it 8 | # with brunch.io to recompile .js and .css sources. 9 | config :delicate_chat, DelicateChatWeb.Endpoint, 10 | http: [port: 4000], 11 | debug_errors: true, 12 | code_reloader: true, 13 | check_origin: false, 14 | watchers: [node: ["node_modules/webpack/bin/webpack.js", "--watch", 15 | cd: Path.expand("../assets", __DIR__)]] 16 | 17 | # ## SSL Support 18 | # 19 | # In order to use HTTPS in development, a self-signed 20 | # certificate can be generated by running the following 21 | # command from your terminal: 22 | # 23 | # openssl req -new -newkey rsa:4096 -days 365 -nodes -x509 -subj "/C=US/ST=Denial/L=Springfield/O=Dis/CN=www.example.com" -keyout priv/server.key -out priv/server.pem 24 | # 25 | # The `http:` config above can be replaced with: 26 | # 27 | # https: [port: 4000, keyfile: "priv/server.key", certfile: "priv/server.pem"], 28 | # 29 | # If desired, both `http:` and `https:` keys can be 30 | # configured to run both http and https servers on 31 | # different ports. 32 | 33 | # Watch static and templates for browser reloading. 34 | config :delicate_chat, DelicateChatWeb.Endpoint, 35 | live_reload: [ 36 | patterns: [ 37 | ~r{priv/static/.*(js|css|png|jpeg|jpg|gif|svg)$}, 38 | ~r{priv/gettext/.*(po)$}, 39 | ~r{lib/delicate_chat_web/views/.*(ex)$}, 40 | ~r{lib/delicate_chat_web/templates/.*(eex)$} 41 | ] 42 | ] 43 | 44 | # Do not include metadata nor timestamps in development logs 45 | config :logger, :console, format: "[$level] $message\n" 46 | 47 | # Set a higher stacktrace during development. Avoid configuring such 48 | # in production as building large stacktraces may be expensive. 49 | config :phoenix, :stacktrace_depth, 20 50 | -------------------------------------------------------------------------------- /config/prod.exs: -------------------------------------------------------------------------------- 1 | use Mix.Config 2 | 3 | # For production, we often load configuration from external 4 | # sources, such as your system environment. For this reason, 5 | # you won't find the :http configuration below, but set inside 6 | # DelicateChatWeb.Endpoint.init/2 when load_from_system_env is 7 | # true. Any dynamic configuration should be done there. 8 | # 9 | # Don't forget to configure the url host to something meaningful, 10 | # Phoenix uses this information when generating URLs. 11 | # 12 | # Finally, we also include the path to a cache manifest 13 | # containing the digested version of static files. This 14 | # manifest is generated by the mix phx.digest task 15 | # which you typically run after static files are built. 16 | config :delicate_chat, DelicateChatWeb.Endpoint, 17 | load_from_system_env: true, 18 | url: [host: "example.com", port: 80], 19 | cache_static_manifest: "priv/static/cache_manifest.json" 20 | 21 | # Do not print debug messages in production 22 | config :logger, level: :info 23 | 24 | # ## SSL Support 25 | # 26 | # To get SSL working, you will need to add the `https` key 27 | # to the previous section and set your `:url` port to 443: 28 | # 29 | # config :delicate_chat, DelicateChatWeb.Endpoint, 30 | # ... 31 | # url: [host: "example.com", port: 443], 32 | # https: [:inet6, 33 | # port: 443, 34 | # keyfile: System.get_env("SOME_APP_SSL_KEY_PATH"), 35 | # certfile: System.get_env("SOME_APP_SSL_CERT_PATH")] 36 | # 37 | # Where those two env variables return an absolute path to 38 | # the key and cert in disk or a relative path inside priv, 39 | # for example "priv/ssl/server.key". 40 | # 41 | # We also recommend setting `force_ssl`, ensuring no data is 42 | # ever sent via http, always redirecting to https: 43 | # 44 | # config :delicate_chat, DelicateChatWeb.Endpoint, 45 | # force_ssl: [hsts: true] 46 | # 47 | # Check `Plug.SSL` for all available options in `force_ssl`. 48 | 49 | # ## Using releases 50 | # 51 | # If you are doing OTP releases, you need to instruct Phoenix 52 | # to start the server for all endpoints: 53 | # 54 | # config :phoenix, :serve_endpoints, true 55 | # 56 | # Alternatively, you can configure exactly which server to 57 | # start per endpoint: 58 | # 59 | # config :delicate_chat, DelicateChatWeb.Endpoint, server: true 60 | # 61 | 62 | # Finally import the config/prod.secret.exs 63 | # which should be versioned separately. 64 | import_config "prod.secret.exs" 65 | -------------------------------------------------------------------------------- /config/test.exs: -------------------------------------------------------------------------------- 1 | use Mix.Config 2 | 3 | # We don't run a server during test. If one is required, 4 | # you can enable the server option below. 5 | config :delicate_chat, DelicateChatWeb.Endpoint, 6 | http: [port: 4001], 7 | server: false 8 | 9 | # Print only warnings and errors during test 10 | config :logger, level: :warn 11 | -------------------------------------------------------------------------------- /lib/delicate_chat.ex: -------------------------------------------------------------------------------- 1 | defmodule DelicateChat do 2 | @moduledoc """ 3 | DelicateChat keeps the contexts that define your domain 4 | and business logic. 5 | 6 | Contexts are also responsible for managing your data, regardless 7 | if it comes from the database, an external API or others. 8 | """ 9 | end 10 | -------------------------------------------------------------------------------- /lib/delicate_chat/application.ex: -------------------------------------------------------------------------------- 1 | defmodule DelicateChat.Application do 2 | use Application 3 | 4 | # See https://hexdocs.pm/elixir/Application.html 5 | # for more information on OTP Applications 6 | def start(_type, _args) do 7 | import Supervisor.Spec 8 | 9 | # Define workers and child supervisors to be supervised 10 | children = [ 11 | # Start the endpoint when the application starts 12 | supervisor(DelicateChatWeb.Endpoint, []), 13 | # Start your own worker by calling: DelicateChat.Worker.start_link(arg1, arg2, arg3) 14 | worker(DelicateChat.MetricsNotifier, []), 15 | worker(DelicateChat.ViolenceTextJudgement, []), 16 | ] 17 | 18 | # See https://hexdocs.pm/elixir/Supervisor.html 19 | # for other strategies and supported options 20 | opts = [strategy: :one_for_one, name: DelicateChat.Supervisor] 21 | Supervisor.start_link(children, opts) 22 | end 23 | 24 | # Tell Phoenix to update the endpoint configuration 25 | # whenever the application is updated. 26 | def config_change(changed, _new, removed) do 27 | DelicateChatWeb.Endpoint.config_change(changed, removed) 28 | :ok 29 | end 30 | end 31 | -------------------------------------------------------------------------------- /lib/delicate_chat/metrics.ex: -------------------------------------------------------------------------------- 1 | defmodule DelicateChat.Metrics do 2 | def get() do 3 | %{ 4 | "Process.list/0 && Process.info/2" => %{total_message_queue_len: total_message_queue_len()}, 5 | ":erlang.memroy/0" => memory(), 6 | ":erlang.system_info/1" => system(), 7 | ":recon.proc_count/1" => %{memory: recon_proc_count_memory()}, 8 | } 9 | end 10 | 11 | defp total_message_queue_len() do 12 | Enum.reduce(Process.list(), 0, fn p, acc -> 13 | case Process.info(p, :message_queue_len) do 14 | {_, len} -> acc + len 15 | nil -> acc 16 | end 17 | end) 18 | end 19 | 20 | defp memory() do 21 | Enum.into(:erlang.memory(), %{}) 22 | end 23 | 24 | defp system() do 25 | %{ 26 | atom_count: :erlang.system_info(:atom_count) 27 | } 28 | end 29 | 30 | def recon_proc_count_memory() do 31 | recon_to_jsonable(:recon.proc_count(:memory, 3)) 32 | end 33 | 34 | defp recon_to_jsonable(v) when is_pid(v) do 35 | v |> :erlang.pid_to_list |> to_string 36 | end 37 | defp recon_to_jsonable(v) when is_tuple(v) do 38 | recon_to_jsonable(Tuple.to_list(v)) 39 | end 40 | defp recon_to_jsonable(v) when is_list(v) do 41 | Enum.map(v, &recon_to_jsonable(&1)) 42 | end 43 | defp recon_to_jsonable(v), do: v 44 | end 45 | -------------------------------------------------------------------------------- /lib/delicate_chat/metrics_notifier.ex: -------------------------------------------------------------------------------- 1 | defmodule DelicateChat.MetricsNotifier do 2 | use GenServer 3 | 4 | @interval 3_000 5 | 6 | def start_link() do 7 | GenServer.start_link(__MODULE__, []) 8 | end 9 | 10 | @impl true 11 | def init(_) do 12 | Process.send_after(self(), :notify, @interval) 13 | {:ok, []} 14 | end 15 | 16 | @impl true 17 | def handle_info(:notify, state) do 18 | notify() 19 | Process.send_after(self(), :notify, @interval) 20 | {:noreply, state} 21 | end 22 | 23 | defp notify() do 24 | msg = %{type: "system:metrics", body: Poison.encode!(DelicateChat.Metrics.get())} 25 | DelicateChatWeb.Endpoint.broadcast!("room:chat", "system", msg) # TODO: fix 26 | end 27 | end 28 | -------------------------------------------------------------------------------- /lib/delicate_chat/violence_text_judgement.ex: -------------------------------------------------------------------------------- 1 | defmodule DelicateChat.ViolenceTextJudgement do 2 | use GenServer 3 | # Anti-Pattern 2: 処理できる流量以上のでメッセージを受け取る 4 | # mail boxにメッセージが溜まり利用メモリが増え続ける。 5 | 6 | @violence_words [ 7 | "kill", 8 | "殺" 9 | ] 10 | 11 | def start_link() do 12 | GenServer.start_link(__MODULE__, [], [name: __MODULE__]) 13 | end 14 | 15 | @impl true 16 | def init(_) do 17 | {:ok, []} 18 | end 19 | 20 | # 重いてメモリを食う実装になる予定なので、非同期で1個ずつ処理していく。 21 | def judge(name, text) do 22 | GenServer.cast(__MODULE__, {:judge, name, text}) 23 | end 24 | 25 | @impl true 26 | def handle_cast({:judge, name, text}, state) do 27 | # 今は暫定実装なので少しばかりシンプルだが、実際は誤検知をしないように非常に高度に考えられた処理になるので、2秒ぐらいかかるとしておく。 28 | Process.sleep(5_000) 29 | if String.contains?(text, @violence_words) do # this algorithm is inspired by twitter! 30 | notify(name) 31 | end 32 | {:noreply, state} 33 | end 34 | 35 | defp notify(name) do 36 | msg = %{name: "system", type: "text", body: "#{name} による攻撃的な言動が検出されました。"} 37 | DelicateChatWeb.Endpoint.broadcast!("room:chat", "new_msg", msg) # TODO: fix 38 | end 39 | end 40 | -------------------------------------------------------------------------------- /lib/delicate_chat/xml_validator.ex: -------------------------------------------------------------------------------- 1 | defmodule DelicateChat.XmlValidator do 2 | # Anti-Pattern 1: 動的にAtomを生成する。 3 | # ユーザー入力からAtomを作る。ユーザー入力は内容が制限さえてないので作成されるAtomに際限がなくなり、Atomは解放されないのでメモリを消費が増え続ける。 4 | def is_valid?(text) do 5 | try do 6 | x = text 7 | |> :binary.bin_to_list() 8 | |> :xmerl_scan.string() 9 | x |> inspect() |> IO.puts() 10 | true 11 | catch 12 | :exit, _ -> false 13 | end 14 | end 15 | end 16 | -------------------------------------------------------------------------------- /lib/delicate_chat_web.ex: -------------------------------------------------------------------------------- 1 | defmodule DelicateChatWeb do 2 | @moduledoc """ 3 | The entrypoint for defining your web interface, such 4 | as controllers, views, channels and so on. 5 | 6 | This can be used in your application as: 7 | 8 | use DelicateChatWeb, :controller 9 | use DelicateChatWeb, :view 10 | 11 | The definitions below will be executed for every view, 12 | controller, etc, so keep them short and clean, focused 13 | on imports, uses and aliases. 14 | 15 | Do NOT define functions inside the quoted expressions 16 | below. Instead, define any helper function in modules 17 | and import those modules here. 18 | """ 19 | 20 | def controller do 21 | quote do 22 | use Phoenix.Controller, namespace: DelicateChatWeb 23 | import Plug.Conn 24 | import DelicateChatWeb.Router.Helpers 25 | import DelicateChatWeb.Gettext 26 | end 27 | end 28 | 29 | def view do 30 | quote do 31 | use Phoenix.View, root: "lib/delicate_chat_web/templates", 32 | namespace: DelicateChatWeb 33 | 34 | # Import convenience functions from controllers 35 | import Phoenix.Controller, only: [get_flash: 2, view_module: 1] 36 | 37 | # Use all HTML functionality (forms, tags, etc) 38 | use Phoenix.HTML 39 | 40 | import DelicateChatWeb.Router.Helpers 41 | import DelicateChatWeb.ErrorHelpers 42 | import DelicateChatWeb.Gettext 43 | end 44 | end 45 | 46 | def router do 47 | quote do 48 | use Phoenix.Router 49 | import Plug.Conn 50 | import Phoenix.Controller 51 | end 52 | end 53 | 54 | def channel do 55 | quote do 56 | use Phoenix.Channel 57 | import DelicateChatWeb.Gettext 58 | end 59 | end 60 | 61 | @doc """ 62 | When used, dispatch to the appropriate controller/view/etc. 63 | """ 64 | defmacro __using__(which) when is_atom(which) do 65 | apply(__MODULE__, which, []) 66 | end 67 | end 68 | -------------------------------------------------------------------------------- /lib/delicate_chat_web/channels/room_channel.ex: -------------------------------------------------------------------------------- 1 | defmodule DelicateChatWeb.RoomChannel do 2 | use Phoenix.Channel 3 | require Logger 4 | 5 | def join("room:chat", _auth_msg, socket) do 6 | Logger.debug("RoomChannel.join") 7 | name = "nobody-#{round(:rand.uniform() * 1000_00)}" 8 | socket2 = assign(socket, :name, name) 9 | {:ok, socket2} 10 | end 11 | 12 | def handle_in("new:msg", %{"type" => "text", "body" => body}, %Phoenix.Socket{assigns: %{name: name}} = socket) do 13 | DelicateChat.ViolenceTextJudgement.judge(name, body) 14 | broadcast!(socket, "new_msg", %{name: name, type: "text", body: body}) 15 | {:noreply, socket} 16 | end 17 | def handle_in("new:msg", %{"type" => "xml", "body" => body}, %Phoenix.Socket{assigns: %{name: name}} = socket) do 18 | # XMLはサーバサイドでチェックしてXMLとしてXMLとして有効かどうかを付加する。 19 | broadcast!(socket, "new_msg", %{name: name, type: "xml", body: body, meta: %{"isValid" => DelicateChat.XmlValidator.is_valid?(body)}}) 20 | {:noreply, socket} 21 | end 22 | def handle_in("new:msg", _, socket) do 23 | {:noreply, socket} 24 | end 25 | end 26 | -------------------------------------------------------------------------------- /lib/delicate_chat_web/channels/user_socket.ex: -------------------------------------------------------------------------------- 1 | defmodule DelicateChatWeb.UserSocket do 2 | use Phoenix.Socket 3 | 4 | ## Channels 5 | channel "room:*", DelicateChatWeb.RoomChannel 6 | 7 | ## Transports 8 | transport :websocket, Phoenix.Transports.WebSocket 9 | # transport :longpoll, Phoenix.Transports.LongPoll 10 | 11 | # Socket params are passed from the client and can 12 | # be used to verify and authenticate a user. After 13 | # verification, you can put default assigns into 14 | # the socket that will be set for all channels, ie 15 | # 16 | # {:ok, assign(socket, :user_id, verified_user_id)} 17 | # 18 | # To deny connection, return `:error`. 19 | # 20 | # See `Phoenix.Token` documentation for examples in 21 | # performing token verification on connect. 22 | def connect(_params, socket) do 23 | {:ok, socket} 24 | end 25 | 26 | # Socket id's are topics that allow you to identify all sockets for a given user: 27 | # 28 | # def id(socket), do: "user_socket:#{socket.assigns.user_id}" 29 | # 30 | # Would allow you to broadcast a "disconnect" event and terminate 31 | # all active sockets and channels for a given user: 32 | # 33 | # DelicateChatWeb.Endpoint.broadcast("user_socket:#{user.id}", "disconnect", %{}) 34 | # 35 | # Returning `nil` makes this socket anonymous. 36 | def id(_socket), do: nil 37 | end 38 | -------------------------------------------------------------------------------- /lib/delicate_chat_web/controllers/page_controller.ex: -------------------------------------------------------------------------------- 1 | defmodule DelicateChatWeb.PageController do 2 | use DelicateChatWeb, :controller 3 | 4 | def index(conn, _params) do 5 | render conn, "index.html" 6 | end 7 | end 8 | -------------------------------------------------------------------------------- /lib/delicate_chat_web/endpoint.ex: -------------------------------------------------------------------------------- 1 | defmodule DelicateChatWeb.Endpoint do 2 | use Phoenix.Endpoint, otp_app: :delicate_chat 3 | 4 | socket "/socket", DelicateChatWeb.UserSocket 5 | 6 | # Serve at "/" the static files from "priv/static" directory. 7 | # 8 | # You should set gzip to true if you are running phoenix.digest 9 | # when deploying your static files in production. 10 | plug Plug.Static, 11 | at: "/", from: :delicate_chat, gzip: false, 12 | only: ~w(css fonts images js favicon.ico robots.txt) 13 | 14 | # Code reloading can be explicitly enabled under the 15 | # :code_reloader configuration of your endpoint. 16 | if code_reloading? do 17 | socket "/phoenix/live_reload/socket", Phoenix.LiveReloader.Socket 18 | plug Phoenix.LiveReloader 19 | plug Phoenix.CodeReloader 20 | end 21 | 22 | plug Plug.RequestId 23 | plug Plug.Logger 24 | 25 | plug Plug.Parsers, 26 | parsers: [:urlencoded, :multipart, :json], 27 | pass: ["*/*"], 28 | json_decoder: Poison 29 | 30 | plug Plug.MethodOverride 31 | plug Plug.Head 32 | 33 | # The session will be stored in the cookie and signed, 34 | # this means its contents can be read but not tampered with. 35 | # Set :encryption_salt if you would also like to encrypt it. 36 | plug Plug.Session, 37 | store: :cookie, 38 | key: "_delicate_chat_key", 39 | signing_salt: "FCAyMbHd" 40 | 41 | plug DelicateChatWeb.Router 42 | 43 | @doc """ 44 | Callback invoked for dynamically configuring the endpoint. 45 | 46 | It receives the endpoint configuration and checks if 47 | configuration should be loaded from the system environment. 48 | """ 49 | def init(_key, config) do 50 | if config[:load_from_system_env] do 51 | port = System.get_env("PORT") || raise "expected the PORT environment variable to be set" 52 | {:ok, Keyword.put(config, :http, [:inet6, port: port])} 53 | else 54 | {:ok, config} 55 | end 56 | end 57 | end 58 | -------------------------------------------------------------------------------- /lib/delicate_chat_web/gettext.ex: -------------------------------------------------------------------------------- 1 | defmodule DelicateChatWeb.Gettext do 2 | @moduledoc """ 3 | A module providing Internationalization with a gettext-based API. 4 | 5 | By using [Gettext](https://hexdocs.pm/gettext), 6 | your module gains a set of macros for translations, for example: 7 | 8 | import DelicateChatWeb.Gettext 9 | 10 | # Simple translation 11 | gettext "Here is the string to translate" 12 | 13 | # Plural translation 14 | ngettext "Here is the string to translate", 15 | "Here are the strings to translate", 16 | 3 17 | 18 | # Domain-based translation 19 | dgettext "errors", "Here is the error message to translate" 20 | 21 | See the [Gettext Docs](https://hexdocs.pm/gettext) for detailed usage. 22 | """ 23 | use Gettext, otp_app: :delicate_chat 24 | end 25 | -------------------------------------------------------------------------------- /lib/delicate_chat_web/router.ex: -------------------------------------------------------------------------------- 1 | defmodule DelicateChatWeb.Router do 2 | use DelicateChatWeb, :router 3 | 4 | pipeline :browser do 5 | plug :accepts, ["html"] 6 | plug :fetch_session 7 | plug :fetch_flash 8 | plug :protect_from_forgery 9 | plug :put_secure_browser_headers 10 | end 11 | 12 | pipeline :api do 13 | plug :accepts, ["json"] 14 | end 15 | 16 | scope "/", DelicateChatWeb do 17 | pipe_through :browser # Use the default browser stack 18 | 19 | get "/", PageController, :index 20 | end 21 | 22 | # Other scopes may use custom stacks. 23 | # scope "/api", DelicateChatWeb do 24 | # pipe_through :api 25 | # end 26 | end 27 | -------------------------------------------------------------------------------- /lib/delicate_chat_web/templates/layout/app.html.eex: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | Delicate Chat - How to break stability of Elixir - 11 | 12 | 13 | 14 | 15 |
16 | <%= render @view_module, @view_template, assigns %> 17 |
18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /lib/delicate_chat_web/templates/page/index.html.eex: -------------------------------------------------------------------------------- 1 |
2 |
3 | 6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 | 18 |
19 |
20 | 21 |
22 |
23 |
24 |
25 | 26 | 27 | 28 |
29 |
30 |
31 |
32 |
33 | -------------------------------------------------------------------------------- /lib/delicate_chat_web/views/error_helpers.ex: -------------------------------------------------------------------------------- 1 | defmodule DelicateChatWeb.ErrorHelpers do 2 | @moduledoc """ 3 | Conveniences for translating and building error messages. 4 | """ 5 | 6 | use Phoenix.HTML 7 | 8 | @doc """ 9 | Generates tag for inlined form input errors. 10 | """ 11 | def error_tag(form, field) do 12 | Enum.map(Keyword.get_values(form.errors, field), fn (error) -> 13 | content_tag :span, translate_error(error), class: "help-block" 14 | end) 15 | end 16 | 17 | @doc """ 18 | Translates an error message using gettext. 19 | """ 20 | def translate_error({msg, opts}) do 21 | # Because error messages were defined within Ecto, we must 22 | # call the Gettext module passing our Gettext backend. We 23 | # also use the "errors" domain as translations are placed 24 | # in the errors.po file. 25 | # Ecto will pass the :count keyword if the error message is 26 | # meant to be pluralized. 27 | # On your own code and templates, depending on whether you 28 | # need the message to be pluralized or not, this could be 29 | # written simply as: 30 | # 31 | # dngettext "errors", "1 file", "%{count} files", count 32 | # dgettext "errors", "is invalid" 33 | # 34 | if count = opts[:count] do 35 | Gettext.dngettext(DelicateChatWeb.Gettext, "errors", msg, msg, count, opts) 36 | else 37 | Gettext.dgettext(DelicateChatWeb.Gettext, "errors", msg, opts) 38 | end 39 | end 40 | end 41 | -------------------------------------------------------------------------------- /lib/delicate_chat_web/views/error_view.ex: -------------------------------------------------------------------------------- 1 | defmodule DelicateChatWeb.ErrorView do 2 | use DelicateChatWeb, :view 3 | 4 | def render("404.html", _assigns) do 5 | "Page not found" 6 | end 7 | 8 | def render("500.html", _assigns) do 9 | "Internal server error" 10 | end 11 | 12 | # In case no render clause matches or no 13 | # template is found, let's render it as 500 14 | def template_not_found(_template, assigns) do 15 | render "500.html", assigns 16 | end 17 | end 18 | -------------------------------------------------------------------------------- /lib/delicate_chat_web/views/layout_view.ex: -------------------------------------------------------------------------------- 1 | defmodule DelicateChatWeb.LayoutView do 2 | use DelicateChatWeb, :view 3 | end 4 | -------------------------------------------------------------------------------- /lib/delicate_chat_web/views/page_view.ex: -------------------------------------------------------------------------------- 1 | defmodule DelicateChatWeb.PageView do 2 | use DelicateChatWeb, :view 3 | end 4 | -------------------------------------------------------------------------------- /mix.exs: -------------------------------------------------------------------------------- 1 | defmodule DelicateChat.Mixfile do 2 | use Mix.Project 3 | 4 | def project do 5 | [ 6 | app: :delicate_chat, 7 | version: "0.0.1", 8 | elixir: "~> 1.4", 9 | elixirc_paths: elixirc_paths(Mix.env), 10 | compilers: [:phoenix, :gettext] ++ Mix.compilers, 11 | start_permanent: Mix.env == :prod, 12 | deps: deps() 13 | ] 14 | end 15 | 16 | # Configuration for the OTP application. 17 | # 18 | # Type `mix help compile.app` for more information. 19 | def application do 20 | [ 21 | mod: {DelicateChat.Application, []}, 22 | extra_applications: [:logger, :runtime_tools] 23 | ] 24 | end 25 | 26 | # Specifies which paths to compile per environment. 27 | defp elixirc_paths(:test), do: ["lib", "test/support"] 28 | defp elixirc_paths(_), do: ["lib"] 29 | 30 | # Specifies your project dependencies. 31 | # 32 | # Type `mix help deps` for examples and options. 33 | defp deps do 34 | [ 35 | {:phoenix, "~> 1.3.0"}, 36 | {:phoenix_pubsub, "~> 1.0"}, 37 | {:phoenix_html, "~> 2.10"}, 38 | {:phoenix_live_reload, "~> 1.0", only: :dev}, 39 | {:gettext, "~> 0.11"}, 40 | {:cowboy, "~> 1.0"}, 41 | {:poison, "~> 3.1"}, 42 | {:uuid, "~> 1.1"}, 43 | {:credo, "~> 0.8", only: [:dev, :test], runtime: false}, 44 | {:recon, "~> 2.3.1", manager: :rebar}, 45 | ] 46 | end 47 | end 48 | -------------------------------------------------------------------------------- /mix.lock: -------------------------------------------------------------------------------- 1 | %{"bunt": {:hex, :bunt, "0.2.0", "951c6e801e8b1d2cbe58ebbd3e616a869061ddadcc4863d0a2182541acae9a38", [], [], "hexpm"}, 2 | "cowboy": {:hex, :cowboy, "1.1.2", "61ac29ea970389a88eca5a65601460162d370a70018afe6f949a29dca91f3bb0", [], [{:cowlib, "~> 1.0.2", [hex: :cowlib, repo: "hexpm", optional: false]}, {:ranch, "~> 1.3.2", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm"}, 3 | "cowlib": {:hex, :cowlib, "1.0.2", "9d769a1d062c9c3ac753096f868ca121e2730b9a377de23dec0f7e08b1df84ee", [], [], "hexpm"}, 4 | "credo": {:hex, :credo, "0.8.10", "261862bb7363247762e1063713bb85df2bbd84af8d8610d1272cd9c1943bba63", [], [{:bunt, "~> 0.2.0", [hex: :bunt, repo: "hexpm", optional: false]}], "hexpm"}, 5 | "file_system": {:hex, :file_system, "0.2.2", "7f1e9de4746f4eb8a4ca8f2fbab582d84a4e40fa394cce7bfcb068b988625b06", [], [], "hexpm"}, 6 | "gettext": {:hex, :gettext, "0.13.1", "5e0daf4e7636d771c4c71ad5f3f53ba09a9ae5c250e1ab9c42ba9edccc476263", [], [], "hexpm"}, 7 | "mime": {:hex, :mime, "1.1.0", "01c1d6f4083d8aa5c7b8c246ade95139620ef8effb009edde934e0ec3b28090a", [], [], "hexpm"}, 8 | "phoenix": {:hex, :phoenix, "1.3.0", "1c01124caa1b4a7af46f2050ff11b267baa3edb441b45dbf243e979cd4c5891b", [], [{:cowboy, "~> 1.0", [hex: :cowboy, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 1.0", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:plug, "~> 1.3.3 or ~> 1.4", [hex: :plug, repo: "hexpm", optional: false]}, {:poison, "~> 2.2 or ~> 3.0", [hex: :poison, repo: "hexpm", optional: false]}], "hexpm"}, 9 | "phoenix_html": {:hex, :phoenix_html, "2.10.5", "4f9df6b0fb7422a9440a73182a566cb9cbe0e3ffe8884ef9337ccf284fc1ef0a", [], [{:plug, "~> 1.0", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm"}, 10 | "phoenix_live_reload": {:hex, :phoenix_live_reload, "1.1.3", "1d178429fc8950b12457d09c6afec247bfe1fcb6f36209e18fbb0221bdfe4d41", [], [{:file_system, "~> 0.2.1 or ~> 0.3", [hex: :file_system, repo: "hexpm", optional: false]}, {:phoenix, "~> 1.0 or ~> 1.2 or ~> 1.3", [hex: :phoenix, repo: "hexpm", optional: false]}], "hexpm"}, 11 | "phoenix_pubsub": {:hex, :phoenix_pubsub, "1.0.2", "bfa7fd52788b5eaa09cb51ff9fcad1d9edfeb68251add458523f839392f034c1", [], [], "hexpm"}, 12 | "plug": {:hex, :plug, "1.4.3", "236d77ce7bf3e3a2668dc0d32a9b6f1f9b1f05361019946aae49874904be4aed", [], [{:cowboy, "~> 1.0.1 or ~> 1.1", [hex: :cowboy, repo: "hexpm", optional: true]}, {:mime, "~> 1.0", [hex: :mime, repo: "hexpm", optional: false]}], "hexpm"}, 13 | "poison": {:hex, :poison, "3.1.0", "d9eb636610e096f86f25d9a46f35a9facac35609a7591b3be3326e99a0484665", [], [], "hexpm"}, 14 | "ranch": {:hex, :ranch, "1.3.2", "e4965a144dc9fbe70e5c077c65e73c57165416a901bd02ea899cfd95aa890986", [], [], "hexpm"}, 15 | "recon": {:hex, :recon, "2.3.4", "b406c2fccdeaa0d94e23b5e30ae3d635a2d461e363a5c9c6316897037cf050d2", [], [], "hexpm"}, 16 | "uuid": {:hex, :uuid, "1.1.8", "e22fc04499de0de3ed1116b770c7737779f226ceefa0badb3592e64d5cfb4eb9", [], [], "hexpm"}} 17 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "dependencies": { 3 | "css-loader": "^0.28.7", 4 | "eslint": "^4.11.0", 5 | "install": "^0.10.2", 6 | "lodash": "^4.17.13", 7 | "node-sass": "^4.7.2", 8 | "pretty-data": "^0.40.0", 9 | "sass-loader": "^6.0.6", 10 | "style-loader": "^0.19.0" 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /priv/gettext/en/LC_MESSAGES/errors.po: -------------------------------------------------------------------------------- 1 | ## `msgid`s in this file come from POT (.pot) files. 2 | ## 3 | ## Do not add, change, or remove `msgid`s manually here as 4 | ## they're tied to the ones in the corresponding POT file 5 | ## (with the same domain). 6 | ## 7 | ## Use `mix gettext.extract --merge` or `mix gettext.merge` 8 | ## to merge POT files into PO files. 9 | msgid "" 10 | msgstr "" 11 | "Language: en\n" 12 | -------------------------------------------------------------------------------- /priv/gettext/errors.pot: -------------------------------------------------------------------------------- 1 | ## This file is a PO Template file. 2 | ## 3 | ## `msgid`s here are often extracted from source code. 4 | ## Add new translations manually only if they're dynamic 5 | ## translations that can't be statically extracted. 6 | ## 7 | ## Run `mix gettext.extract` to bring this file up to 8 | ## date. Leave `msgstr`s empty as changing them here as no 9 | ## effect: edit them in PO (`.po`) files instead. 10 | 11 | -------------------------------------------------------------------------------- /test/delicate_chat_web/controllers/page_controller_test.exs: -------------------------------------------------------------------------------- 1 | defmodule DelicateChatWeb.PageControllerTest do 2 | use DelicateChatWeb.ConnCase 3 | 4 | test "GET /", %{conn: conn} do 5 | conn = get conn, "/" 6 | assert html_response(conn, 200) =~ "Welcome to Phoenix!" 7 | end 8 | end 9 | -------------------------------------------------------------------------------- /test/delicate_chat_web/views/error_view_test.exs: -------------------------------------------------------------------------------- 1 | defmodule DelicateChatWeb.ErrorViewTest do 2 | use DelicateChatWeb.ConnCase, async: true 3 | 4 | # Bring render/3 and render_to_string/3 for testing custom views 5 | import Phoenix.View 6 | 7 | test "renders 404.html" do 8 | assert render_to_string(DelicateChatWeb.ErrorView, "404.html", []) == 9 | "Page not found" 10 | end 11 | 12 | test "render 500.html" do 13 | assert render_to_string(DelicateChatWeb.ErrorView, "500.html", []) == 14 | "Internal server error" 15 | end 16 | 17 | test "render any other" do 18 | assert render_to_string(DelicateChatWeb.ErrorView, "505.html", []) == 19 | "Internal server error" 20 | end 21 | end 22 | -------------------------------------------------------------------------------- /test/delicate_chat_web/views/layout_view_test.exs: -------------------------------------------------------------------------------- 1 | defmodule DelicateChatWeb.LayoutViewTest do 2 | use DelicateChatWeb.ConnCase, async: true 3 | end 4 | -------------------------------------------------------------------------------- /test/delicate_chat_web/views/page_view_test.exs: -------------------------------------------------------------------------------- 1 | defmodule DelicateChatWeb.PageViewTest do 2 | use DelicateChatWeb.ConnCase, async: true 3 | end 4 | -------------------------------------------------------------------------------- /test/support/channel_case.ex: -------------------------------------------------------------------------------- 1 | defmodule DelicateChatWeb.ChannelCase do 2 | @moduledoc """ 3 | This module defines the test case to be used by 4 | channel tests. 5 | 6 | Such tests rely on `Phoenix.ChannelTest` and also 7 | import other functionality to make it easier 8 | to build common datastructures and query the data layer. 9 | 10 | Finally, if the test case interacts with the database, 11 | it cannot be async. For this reason, every test runs 12 | inside a transaction which is reset at the beginning 13 | of the test unless the test case is marked as async. 14 | """ 15 | 16 | use ExUnit.CaseTemplate 17 | 18 | using do 19 | quote do 20 | # Import conveniences for testing with channels 21 | use Phoenix.ChannelTest 22 | 23 | # The default endpoint for testing 24 | @endpoint DelicateChatWeb.Endpoint 25 | end 26 | end 27 | 28 | 29 | setup _tags do 30 | :ok 31 | end 32 | 33 | end 34 | -------------------------------------------------------------------------------- /test/support/conn_case.ex: -------------------------------------------------------------------------------- 1 | defmodule DelicateChatWeb.ConnCase do 2 | @moduledoc """ 3 | This module defines the test case to be used by 4 | tests that require setting up a connection. 5 | 6 | Such tests rely on `Phoenix.ConnTest` and also 7 | import other functionality to make it easier 8 | to build common datastructures and query the data layer. 9 | 10 | Finally, if the test case interacts with the database, 11 | it cannot be async. For this reason, every test runs 12 | inside a transaction which is reset at the beginning 13 | of the test unless the test case is marked as async. 14 | """ 15 | 16 | use ExUnit.CaseTemplate 17 | 18 | using do 19 | quote do 20 | # Import conveniences for testing with connections 21 | use Phoenix.ConnTest 22 | import DelicateChatWeb.Router.Helpers 23 | 24 | # The default endpoint for testing 25 | @endpoint DelicateChatWeb.Endpoint 26 | end 27 | end 28 | 29 | 30 | setup _tags do 31 | {:ok, conn: Phoenix.ConnTest.build_conn()} 32 | end 33 | 34 | end 35 | -------------------------------------------------------------------------------- /test/test_helper.exs: -------------------------------------------------------------------------------- 1 | ExUnit.start() 2 | 3 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@types/node@^7.0.48": 6 | version "7.0.48" 7 | resolved "https://registry.yarnpkg.com/@types/node/-/node-7.0.48.tgz#24bfdc0aa82e8f6dbd017159c58094a2e06d0abb" 8 | 9 | abbrev@1: 10 | version "1.1.1" 11 | resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" 12 | 13 | acorn-jsx@^3.0.0: 14 | version "3.0.1" 15 | resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" 16 | dependencies: 17 | acorn "^3.0.4" 18 | 19 | acorn@^3.0.4: 20 | version "3.3.0" 21 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" 22 | 23 | acorn@^5.2.1: 24 | version "5.2.1" 25 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.2.1.tgz#317ac7821826c22c702d66189ab8359675f135d7" 26 | 27 | ajv-keywords@^2.1.0: 28 | version "2.1.1" 29 | resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762" 30 | 31 | ajv@^5.0.0, ajv@^5.1.0, ajv@^5.2.3, ajv@^5.3.0: 32 | version "5.4.0" 33 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.4.0.tgz#32d1cf08dbc80c432f426f12e10b2511f6b46474" 34 | dependencies: 35 | co "^4.6.0" 36 | fast-deep-equal "^1.0.0" 37 | fast-json-stable-stringify "^2.0.0" 38 | json-schema-traverse "^0.3.0" 39 | 40 | alphanum-sort@^1.0.1, alphanum-sort@^1.0.2: 41 | version "1.0.2" 42 | resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" 43 | 44 | amdefine@>=0.0.4: 45 | version "1.0.1" 46 | resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" 47 | 48 | ansi-escapes@^3.0.0: 49 | version "3.0.0" 50 | resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.0.0.tgz#ec3e8b4e9f8064fc02c3ac9b65f1c275bda8ef92" 51 | 52 | ansi-regex@^2.0.0: 53 | version "2.1.1" 54 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 55 | 56 | ansi-regex@^3.0.0: 57 | version "3.0.0" 58 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" 59 | 60 | ansi-styles@^2.2.1: 61 | version "2.2.1" 62 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" 63 | 64 | ansi-styles@^3.1.0: 65 | version "3.2.0" 66 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.0.tgz#c159b8d5be0f9e5a6f346dab94f16ce022161b88" 67 | dependencies: 68 | color-convert "^1.9.0" 69 | 70 | aproba@^1.0.3: 71 | version "1.2.0" 72 | resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" 73 | 74 | are-we-there-yet@~1.1.2: 75 | version "1.1.4" 76 | resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d" 77 | dependencies: 78 | delegates "^1.0.0" 79 | readable-stream "^2.0.6" 80 | 81 | argparse@^1.0.7: 82 | version "1.0.9" 83 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" 84 | dependencies: 85 | sprintf-js "~1.0.2" 86 | 87 | array-find-index@^1.0.1: 88 | version "1.0.2" 89 | resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" 90 | 91 | array-union@^1.0.1: 92 | version "1.0.2" 93 | resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" 94 | dependencies: 95 | array-uniq "^1.0.1" 96 | 97 | array-uniq@^1.0.1: 98 | version "1.0.3" 99 | resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" 100 | 101 | arrify@^1.0.0: 102 | version "1.0.1" 103 | resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" 104 | 105 | asn1@~0.2.3: 106 | version "0.2.3" 107 | resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" 108 | 109 | assert-plus@1.0.0, assert-plus@^1.0.0: 110 | version "1.0.0" 111 | resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" 112 | 113 | assert-plus@^0.2.0: 114 | version "0.2.0" 115 | resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" 116 | 117 | async-foreach@^0.1.3: 118 | version "0.1.3" 119 | resolved "https://registry.yarnpkg.com/async-foreach/-/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542" 120 | 121 | async@^2.1.5: 122 | version "2.6.0" 123 | resolved "https://registry.yarnpkg.com/async/-/async-2.6.0.tgz#61a29abb6fcc026fea77e56d1c6ec53a795951f4" 124 | dependencies: 125 | lodash "^4.14.0" 126 | 127 | asynckit@^0.4.0: 128 | version "0.4.0" 129 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 130 | 131 | autoprefixer@^6.3.1: 132 | version "6.7.7" 133 | resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-6.7.7.tgz#1dbd1c835658e35ce3f9984099db00585c782014" 134 | dependencies: 135 | browserslist "^1.7.6" 136 | caniuse-db "^1.0.30000634" 137 | normalize-range "^0.1.2" 138 | num2fraction "^1.2.2" 139 | postcss "^5.2.16" 140 | postcss-value-parser "^3.2.3" 141 | 142 | aws-sign2@~0.6.0: 143 | version "0.6.0" 144 | resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" 145 | 146 | aws-sign2@~0.7.0: 147 | version "0.7.0" 148 | resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" 149 | 150 | aws4@^1.2.1, aws4@^1.6.0: 151 | version "1.6.0" 152 | resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" 153 | 154 | babel-code-frame@^6.11.0, babel-code-frame@^6.22.0: 155 | version "6.26.0" 156 | resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" 157 | dependencies: 158 | chalk "^1.1.3" 159 | esutils "^2.0.2" 160 | js-tokens "^3.0.2" 161 | 162 | balanced-match@^0.4.2: 163 | version "0.4.2" 164 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" 165 | 166 | balanced-match@^1.0.0: 167 | version "1.0.0" 168 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 169 | 170 | bcrypt-pbkdf@^1.0.0: 171 | version "1.0.1" 172 | resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" 173 | dependencies: 174 | tweetnacl "^0.14.3" 175 | 176 | big.js@^3.1.3: 177 | version "3.2.0" 178 | resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e" 179 | 180 | block-stream@*: 181 | version "0.0.9" 182 | resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" 183 | dependencies: 184 | inherits "~2.0.0" 185 | 186 | boom@2.x.x: 187 | version "2.10.1" 188 | resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" 189 | dependencies: 190 | hoek "2.x.x" 191 | 192 | boom@4.x.x: 193 | version "4.3.1" 194 | resolved "https://registry.yarnpkg.com/boom/-/boom-4.3.1.tgz#4f8a3005cb4a7e3889f749030fd25b96e01d2e31" 195 | dependencies: 196 | hoek "4.x.x" 197 | 198 | boom@5.x.x: 199 | version "5.2.0" 200 | resolved "https://registry.yarnpkg.com/boom/-/boom-5.2.0.tgz#5dd9da6ee3a5f302077436290cb717d3f4a54e02" 201 | dependencies: 202 | hoek "4.x.x" 203 | 204 | brace-expansion@^1.1.7: 205 | version "1.1.8" 206 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" 207 | dependencies: 208 | balanced-match "^1.0.0" 209 | concat-map "0.0.1" 210 | 211 | browserslist@^1.3.6, browserslist@^1.5.2, browserslist@^1.7.6: 212 | version "1.7.7" 213 | resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-1.7.7.tgz#0bd76704258be829b2398bb50e4b62d1a166b0b9" 214 | dependencies: 215 | caniuse-db "^1.0.30000639" 216 | electron-to-chromium "^1.2.7" 217 | 218 | builtin-modules@^1.0.0: 219 | version "1.1.1" 220 | resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" 221 | 222 | caller-path@^0.1.0: 223 | version "0.1.0" 224 | resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" 225 | dependencies: 226 | callsites "^0.2.0" 227 | 228 | callsites@^0.2.0: 229 | version "0.2.0" 230 | resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" 231 | 232 | camelcase-keys@^2.0.0: 233 | version "2.1.0" 234 | resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" 235 | dependencies: 236 | camelcase "^2.0.0" 237 | map-obj "^1.0.0" 238 | 239 | camelcase@^2.0.0: 240 | version "2.1.1" 241 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" 242 | 243 | camelcase@^3.0.0: 244 | version "3.0.0" 245 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" 246 | 247 | caniuse-api@^1.5.2: 248 | version "1.6.1" 249 | resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-1.6.1.tgz#b534e7c734c4f81ec5fbe8aca2ad24354b962c6c" 250 | dependencies: 251 | browserslist "^1.3.6" 252 | caniuse-db "^1.0.30000529" 253 | lodash.memoize "^4.1.2" 254 | lodash.uniq "^4.5.0" 255 | 256 | caniuse-db@^1.0.30000529, caniuse-db@^1.0.30000634, caniuse-db@^1.0.30000639: 257 | version "1.0.30000770" 258 | resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000770.tgz#cf68ae1cb8a82f6d3c35df41c62dc6973e470244" 259 | 260 | caseless@~0.11.0: 261 | version "0.11.0" 262 | resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7" 263 | 264 | caseless@~0.12.0: 265 | version "0.12.0" 266 | resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" 267 | 268 | chalk@^1.1.1, chalk@^1.1.3: 269 | version "1.1.3" 270 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" 271 | dependencies: 272 | ansi-styles "^2.2.1" 273 | escape-string-regexp "^1.0.2" 274 | has-ansi "^2.0.0" 275 | strip-ansi "^3.0.0" 276 | supports-color "^2.0.0" 277 | 278 | chalk@^2.0.0, chalk@^2.1.0, chalk@^2.3.0: 279 | version "2.3.0" 280 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.0.tgz#b5ea48efc9c1793dccc9b4767c93914d3f2d52ba" 281 | dependencies: 282 | ansi-styles "^3.1.0" 283 | escape-string-regexp "^1.0.5" 284 | supports-color "^4.0.0" 285 | 286 | chardet@^0.4.0: 287 | version "0.4.0" 288 | resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.0.tgz#0bbe1355ac44d7a3ed4a925707c4ef70f8190f6c" 289 | 290 | circular-json@^0.3.1: 291 | version "0.3.3" 292 | resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" 293 | 294 | clap@^1.0.9: 295 | version "1.2.3" 296 | resolved "https://registry.yarnpkg.com/clap/-/clap-1.2.3.tgz#4f36745b32008492557f46412d66d50cb99bce51" 297 | dependencies: 298 | chalk "^1.1.3" 299 | 300 | cli-cursor@^2.1.0: 301 | version "2.1.0" 302 | resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" 303 | dependencies: 304 | restore-cursor "^2.0.0" 305 | 306 | cli-width@^2.0.0: 307 | version "2.2.0" 308 | resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" 309 | 310 | cliui@^3.2.0: 311 | version "3.2.0" 312 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" 313 | dependencies: 314 | string-width "^1.0.1" 315 | strip-ansi "^3.0.1" 316 | wrap-ansi "^2.0.0" 317 | 318 | clone-deep@^0.3.0: 319 | version "0.3.0" 320 | resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-0.3.0.tgz#348c61ae9cdbe0edfe053d91ff4cc521d790ede8" 321 | dependencies: 322 | for-own "^1.0.0" 323 | is-plain-object "^2.0.1" 324 | kind-of "^3.2.2" 325 | shallow-clone "^0.1.2" 326 | 327 | clone@^1.0.2: 328 | version "1.0.3" 329 | resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.3.tgz#298d7e2231660f40c003c2ed3140decf3f53085f" 330 | 331 | co@^4.6.0: 332 | version "4.6.0" 333 | resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" 334 | 335 | coa@~1.0.1: 336 | version "1.0.4" 337 | resolved "https://registry.yarnpkg.com/coa/-/coa-1.0.4.tgz#a9ef153660d6a86a8bdec0289a5c684d217432fd" 338 | dependencies: 339 | q "^1.1.2" 340 | 341 | code-point-at@^1.0.0: 342 | version "1.1.0" 343 | resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" 344 | 345 | color-convert@^1.3.0, color-convert@^1.9.0: 346 | version "1.9.1" 347 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.1.tgz#c1261107aeb2f294ebffec9ed9ecad529a6097ed" 348 | dependencies: 349 | color-name "^1.1.1" 350 | 351 | color-name@^1.0.0, color-name@^1.1.1: 352 | version "1.1.3" 353 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 354 | 355 | color-string@^0.3.0: 356 | version "0.3.0" 357 | resolved "https://registry.yarnpkg.com/color-string/-/color-string-0.3.0.tgz#27d46fb67025c5c2fa25993bfbf579e47841b991" 358 | dependencies: 359 | color-name "^1.0.0" 360 | 361 | color@^0.11.0: 362 | version "0.11.4" 363 | resolved "https://registry.yarnpkg.com/color/-/color-0.11.4.tgz#6d7b5c74fb65e841cd48792ad1ed5e07b904d764" 364 | dependencies: 365 | clone "^1.0.2" 366 | color-convert "^1.3.0" 367 | color-string "^0.3.0" 368 | 369 | colormin@^1.0.5: 370 | version "1.1.2" 371 | resolved "https://registry.yarnpkg.com/colormin/-/colormin-1.1.2.tgz#ea2f7420a72b96881a38aae59ec124a6f7298133" 372 | dependencies: 373 | color "^0.11.0" 374 | css-color-names "0.0.4" 375 | has "^1.0.1" 376 | 377 | colors@~1.1.2: 378 | version "1.1.2" 379 | resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" 380 | 381 | combined-stream@^1.0.5, combined-stream@~1.0.5: 382 | version "1.0.5" 383 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" 384 | dependencies: 385 | delayed-stream "~1.0.0" 386 | 387 | commander@^2.9.0: 388 | version "2.12.0" 389 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.12.0.tgz#2f13615c39c687a77926aa68ef25c099db1e72fb" 390 | dependencies: 391 | "@types/node" "^7.0.48" 392 | 393 | concat-map@0.0.1: 394 | version "0.0.1" 395 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 396 | 397 | concat-stream@^1.6.0: 398 | version "1.6.0" 399 | resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" 400 | dependencies: 401 | inherits "^2.0.3" 402 | readable-stream "^2.2.2" 403 | typedarray "^0.0.6" 404 | 405 | console-control-strings@^1.0.0, console-control-strings@~1.1.0: 406 | version "1.1.0" 407 | resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" 408 | 409 | core-util-is@1.0.2, core-util-is@~1.0.0: 410 | version "1.0.2" 411 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 412 | 413 | cross-spawn@^3.0.0: 414 | version "3.0.1" 415 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982" 416 | dependencies: 417 | lru-cache "^4.0.1" 418 | which "^1.2.9" 419 | 420 | cross-spawn@^5.1.0: 421 | version "5.1.0" 422 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" 423 | dependencies: 424 | lru-cache "^4.0.1" 425 | shebang-command "^1.2.0" 426 | which "^1.2.9" 427 | 428 | cryptiles@2.x.x: 429 | version "2.0.5" 430 | resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" 431 | dependencies: 432 | boom "2.x.x" 433 | 434 | cryptiles@3.x.x: 435 | version "3.1.2" 436 | resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-3.1.2.tgz#a89fbb220f5ce25ec56e8c4aa8a4fd7b5b0d29fe" 437 | dependencies: 438 | boom "5.x.x" 439 | 440 | css-color-names@0.0.4: 441 | version "0.0.4" 442 | resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" 443 | 444 | css-loader@^0.28.7: 445 | version "0.28.7" 446 | resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-0.28.7.tgz#5f2ee989dd32edd907717f953317656160999c1b" 447 | dependencies: 448 | babel-code-frame "^6.11.0" 449 | css-selector-tokenizer "^0.7.0" 450 | cssnano ">=2.6.1 <4" 451 | icss-utils "^2.1.0" 452 | loader-utils "^1.0.2" 453 | lodash.camelcase "^4.3.0" 454 | object-assign "^4.0.1" 455 | postcss "^5.0.6" 456 | postcss-modules-extract-imports "^1.0.0" 457 | postcss-modules-local-by-default "^1.0.1" 458 | postcss-modules-scope "^1.0.0" 459 | postcss-modules-values "^1.1.0" 460 | postcss-value-parser "^3.3.0" 461 | source-list-map "^2.0.0" 462 | 463 | css-selector-tokenizer@^0.7.0: 464 | version "0.7.0" 465 | resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz#e6988474ae8c953477bf5e7efecfceccd9cf4c86" 466 | dependencies: 467 | cssesc "^0.1.0" 468 | fastparse "^1.1.1" 469 | regexpu-core "^1.0.0" 470 | 471 | cssesc@^0.1.0: 472 | version "0.1.0" 473 | resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-0.1.0.tgz#c814903e45623371a0477b40109aaafbeeaddbb4" 474 | 475 | "cssnano@>=2.6.1 <4": 476 | version "3.10.0" 477 | resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-3.10.0.tgz#4f38f6cea2b9b17fa01490f23f1dc68ea65c1c38" 478 | dependencies: 479 | autoprefixer "^6.3.1" 480 | decamelize "^1.1.2" 481 | defined "^1.0.0" 482 | has "^1.0.1" 483 | object-assign "^4.0.1" 484 | postcss "^5.0.14" 485 | postcss-calc "^5.2.0" 486 | postcss-colormin "^2.1.8" 487 | postcss-convert-values "^2.3.4" 488 | postcss-discard-comments "^2.0.4" 489 | postcss-discard-duplicates "^2.0.1" 490 | postcss-discard-empty "^2.0.1" 491 | postcss-discard-overridden "^0.1.1" 492 | postcss-discard-unused "^2.2.1" 493 | postcss-filter-plugins "^2.0.0" 494 | postcss-merge-idents "^2.1.5" 495 | postcss-merge-longhand "^2.0.1" 496 | postcss-merge-rules "^2.0.3" 497 | postcss-minify-font-values "^1.0.2" 498 | postcss-minify-gradients "^1.0.1" 499 | postcss-minify-params "^1.0.4" 500 | postcss-minify-selectors "^2.0.4" 501 | postcss-normalize-charset "^1.1.0" 502 | postcss-normalize-url "^3.0.7" 503 | postcss-ordered-values "^2.1.0" 504 | postcss-reduce-idents "^2.2.2" 505 | postcss-reduce-initial "^1.0.0" 506 | postcss-reduce-transforms "^1.0.3" 507 | postcss-svgo "^2.1.1" 508 | postcss-unique-selectors "^2.0.2" 509 | postcss-value-parser "^3.2.3" 510 | postcss-zindex "^2.0.1" 511 | 512 | csso@~2.3.1: 513 | version "2.3.2" 514 | resolved "https://registry.yarnpkg.com/csso/-/csso-2.3.2.tgz#ddd52c587033f49e94b71fc55569f252e8ff5f85" 515 | dependencies: 516 | clap "^1.0.9" 517 | source-map "^0.5.3" 518 | 519 | currently-unhandled@^0.4.1: 520 | version "0.4.1" 521 | resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" 522 | dependencies: 523 | array-find-index "^1.0.1" 524 | 525 | dashdash@^1.12.0: 526 | version "1.14.1" 527 | resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" 528 | dependencies: 529 | assert-plus "^1.0.0" 530 | 531 | debug@^3.0.1: 532 | version "3.1.0" 533 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" 534 | dependencies: 535 | ms "2.0.0" 536 | 537 | decamelize@^1.1.1, decamelize@^1.1.2: 538 | version "1.2.0" 539 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" 540 | 541 | deep-is@~0.1.3: 542 | version "0.1.3" 543 | resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" 544 | 545 | defined@^1.0.0: 546 | version "1.0.0" 547 | resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" 548 | 549 | del@^2.0.2: 550 | version "2.2.2" 551 | resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" 552 | dependencies: 553 | globby "^5.0.0" 554 | is-path-cwd "^1.0.0" 555 | is-path-in-cwd "^1.0.0" 556 | object-assign "^4.0.1" 557 | pify "^2.0.0" 558 | pinkie-promise "^2.0.0" 559 | rimraf "^2.2.8" 560 | 561 | delayed-stream@~1.0.0: 562 | version "1.0.0" 563 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 564 | 565 | delegates@^1.0.0: 566 | version "1.0.0" 567 | resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" 568 | 569 | doctrine@^2.0.0: 570 | version "2.0.0" 571 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.0.0.tgz#c73d8d2909d22291e1a007a395804da8b665fe63" 572 | dependencies: 573 | esutils "^2.0.2" 574 | isarray "^1.0.0" 575 | 576 | ecc-jsbn@~0.1.1: 577 | version "0.1.1" 578 | resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" 579 | dependencies: 580 | jsbn "~0.1.0" 581 | 582 | electron-to-chromium@^1.2.7: 583 | version "1.3.27" 584 | resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.27.tgz#78ecb8a399066187bb374eede35d9c70565a803d" 585 | 586 | emojis-list@^2.0.0: 587 | version "2.1.0" 588 | resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" 589 | 590 | error-ex@^1.2.0: 591 | version "1.3.1" 592 | resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" 593 | dependencies: 594 | is-arrayish "^0.2.1" 595 | 596 | escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: 597 | version "1.0.5" 598 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 599 | 600 | eslint-scope@^3.7.1: 601 | version "3.7.1" 602 | resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8" 603 | dependencies: 604 | esrecurse "^4.1.0" 605 | estraverse "^4.1.1" 606 | 607 | eslint@^4.11.0: 608 | version "4.11.0" 609 | resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.11.0.tgz#39a8c82bc0a3783adf5a39fa27fdd9d36fac9a34" 610 | dependencies: 611 | ajv "^5.3.0" 612 | babel-code-frame "^6.22.0" 613 | chalk "^2.1.0" 614 | concat-stream "^1.6.0" 615 | cross-spawn "^5.1.0" 616 | debug "^3.0.1" 617 | doctrine "^2.0.0" 618 | eslint-scope "^3.7.1" 619 | espree "^3.5.2" 620 | esquery "^1.0.0" 621 | estraverse "^4.2.0" 622 | esutils "^2.0.2" 623 | file-entry-cache "^2.0.0" 624 | functional-red-black-tree "^1.0.1" 625 | glob "^7.1.2" 626 | globals "^9.17.0" 627 | ignore "^3.3.3" 628 | imurmurhash "^0.1.4" 629 | inquirer "^3.0.6" 630 | is-resolvable "^1.0.0" 631 | js-yaml "^3.9.1" 632 | json-stable-stringify-without-jsonify "^1.0.1" 633 | levn "^0.3.0" 634 | lodash "^4.17.4" 635 | minimatch "^3.0.2" 636 | mkdirp "^0.5.1" 637 | natural-compare "^1.4.0" 638 | optionator "^0.8.2" 639 | path-is-inside "^1.0.2" 640 | pluralize "^7.0.0" 641 | progress "^2.0.0" 642 | require-uncached "^1.0.3" 643 | semver "^5.3.0" 644 | strip-ansi "^4.0.0" 645 | strip-json-comments "~2.0.1" 646 | table "^4.0.1" 647 | text-table "~0.2.0" 648 | 649 | espree@^3.5.2: 650 | version "3.5.2" 651 | resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.2.tgz#756ada8b979e9dcfcdb30aad8d1a9304a905e1ca" 652 | dependencies: 653 | acorn "^5.2.1" 654 | acorn-jsx "^3.0.0" 655 | 656 | esprima@^2.6.0: 657 | version "2.7.3" 658 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" 659 | 660 | esprima@^4.0.0: 661 | version "4.0.0" 662 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" 663 | 664 | esquery@^1.0.0: 665 | version "1.0.0" 666 | resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.0.tgz#cfba8b57d7fba93f17298a8a006a04cda13d80fa" 667 | dependencies: 668 | estraverse "^4.0.0" 669 | 670 | esrecurse@^4.1.0: 671 | version "4.2.0" 672 | resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.0.tgz#fa9568d98d3823f9a41d91e902dcab9ea6e5b163" 673 | dependencies: 674 | estraverse "^4.1.0" 675 | object-assign "^4.0.1" 676 | 677 | estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: 678 | version "4.2.0" 679 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" 680 | 681 | esutils@^2.0.2: 682 | version "2.0.2" 683 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" 684 | 685 | extend@~3.0.0, extend@~3.0.1: 686 | version "3.0.1" 687 | resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" 688 | 689 | external-editor@^2.0.4: 690 | version "2.1.0" 691 | resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.1.0.tgz#3d026a21b7f95b5726387d4200ac160d372c3b48" 692 | dependencies: 693 | chardet "^0.4.0" 694 | iconv-lite "^0.4.17" 695 | tmp "^0.0.33" 696 | 697 | extsprintf@1.3.0, extsprintf@^1.2.0: 698 | version "1.3.0" 699 | resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" 700 | 701 | fast-deep-equal@^1.0.0: 702 | version "1.0.0" 703 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz#96256a3bc975595eb36d82e9929d060d893439ff" 704 | 705 | fast-json-stable-stringify@^2.0.0: 706 | version "2.0.0" 707 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" 708 | 709 | fast-levenshtein@~2.0.4: 710 | version "2.0.6" 711 | resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" 712 | 713 | fastparse@^1.1.1: 714 | version "1.1.1" 715 | resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.1.tgz#d1e2643b38a94d7583b479060e6c4affc94071f8" 716 | 717 | figures@^2.0.0: 718 | version "2.0.0" 719 | resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" 720 | dependencies: 721 | escape-string-regexp "^1.0.5" 722 | 723 | file-entry-cache@^2.0.0: 724 | version "2.0.0" 725 | resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" 726 | dependencies: 727 | flat-cache "^1.2.1" 728 | object-assign "^4.0.1" 729 | 730 | find-up@^1.0.0: 731 | version "1.1.2" 732 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" 733 | dependencies: 734 | path-exists "^2.0.0" 735 | pinkie-promise "^2.0.0" 736 | 737 | flat-cache@^1.2.1: 738 | version "1.3.0" 739 | resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.0.tgz#d3030b32b38154f4e3b7e9c709f490f7ef97c481" 740 | dependencies: 741 | circular-json "^0.3.1" 742 | del "^2.0.2" 743 | graceful-fs "^4.1.2" 744 | write "^0.2.1" 745 | 746 | flatten@^1.0.2: 747 | version "1.0.2" 748 | resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782" 749 | 750 | for-in@^0.1.3: 751 | version "0.1.8" 752 | resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.8.tgz#d8773908e31256109952b1fdb9b3fa867d2775e1" 753 | 754 | for-in@^1.0.1: 755 | version "1.0.2" 756 | resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" 757 | 758 | for-own@^1.0.0: 759 | version "1.0.0" 760 | resolved "https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz#c63332f415cedc4b04dbfe70cf836494c53cb44b" 761 | dependencies: 762 | for-in "^1.0.1" 763 | 764 | forever-agent@~0.6.1: 765 | version "0.6.1" 766 | resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" 767 | 768 | form-data@~2.1.1: 769 | version "2.1.4" 770 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1" 771 | dependencies: 772 | asynckit "^0.4.0" 773 | combined-stream "^1.0.5" 774 | mime-types "^2.1.12" 775 | 776 | form-data@~2.3.1: 777 | version "2.3.1" 778 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.1.tgz#6fb94fbd71885306d73d15cc497fe4cc4ecd44bf" 779 | dependencies: 780 | asynckit "^0.4.0" 781 | combined-stream "^1.0.5" 782 | mime-types "^2.1.12" 783 | 784 | fs.realpath@^1.0.0: 785 | version "1.0.0" 786 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 787 | 788 | fstream@^1.0.0, fstream@^1.0.2: 789 | version "1.0.11" 790 | resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" 791 | dependencies: 792 | graceful-fs "^4.1.2" 793 | inherits "~2.0.0" 794 | mkdirp ">=0.5 0" 795 | rimraf "2" 796 | 797 | function-bind@^1.0.2: 798 | version "1.1.1" 799 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 800 | 801 | functional-red-black-tree@^1.0.1: 802 | version "1.0.1" 803 | resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" 804 | 805 | gauge@~2.7.3: 806 | version "2.7.4" 807 | resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" 808 | dependencies: 809 | aproba "^1.0.3" 810 | console-control-strings "^1.0.0" 811 | has-unicode "^2.0.0" 812 | object-assign "^4.1.0" 813 | signal-exit "^3.0.0" 814 | string-width "^1.0.1" 815 | strip-ansi "^3.0.1" 816 | wide-align "^1.1.0" 817 | 818 | gaze@^1.0.0: 819 | version "1.1.2" 820 | resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.2.tgz#847224677adb8870d679257ed3388fdb61e40105" 821 | dependencies: 822 | globule "^1.0.0" 823 | 824 | generate-function@^2.0.0: 825 | version "2.0.0" 826 | resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74" 827 | 828 | generate-object-property@^1.1.0: 829 | version "1.2.0" 830 | resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0" 831 | dependencies: 832 | is-property "^1.0.0" 833 | 834 | get-caller-file@^1.0.1: 835 | version "1.0.2" 836 | resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" 837 | 838 | get-stdin@^4.0.1: 839 | version "4.0.1" 840 | resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" 841 | 842 | getpass@^0.1.1: 843 | version "0.1.7" 844 | resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" 845 | dependencies: 846 | assert-plus "^1.0.0" 847 | 848 | glob@^6.0.4: 849 | version "6.0.4" 850 | resolved "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22" 851 | dependencies: 852 | inflight "^1.0.4" 853 | inherits "2" 854 | minimatch "2 || 3" 855 | once "^1.3.0" 856 | path-is-absolute "^1.0.0" 857 | 858 | glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.2, glob@~7.1.1: 859 | version "7.1.2" 860 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" 861 | dependencies: 862 | fs.realpath "^1.0.0" 863 | inflight "^1.0.4" 864 | inherits "2" 865 | minimatch "^3.0.4" 866 | once "^1.3.0" 867 | path-is-absolute "^1.0.0" 868 | 869 | globals@^9.17.0: 870 | version "9.18.0" 871 | resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" 872 | 873 | globby@^5.0.0: 874 | version "5.0.0" 875 | resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" 876 | dependencies: 877 | array-union "^1.0.1" 878 | arrify "^1.0.0" 879 | glob "^7.0.3" 880 | object-assign "^4.0.1" 881 | pify "^2.0.0" 882 | pinkie-promise "^2.0.0" 883 | 884 | globule@^1.0.0: 885 | version "1.2.0" 886 | resolved "https://registry.yarnpkg.com/globule/-/globule-1.2.0.tgz#1dc49c6822dd9e8a2fa00ba2a295006e8664bd09" 887 | dependencies: 888 | glob "~7.1.1" 889 | lodash "~4.17.4" 890 | minimatch "~3.0.2" 891 | 892 | graceful-fs@^4.1.2: 893 | version "4.1.11" 894 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" 895 | 896 | har-schema@^2.0.0: 897 | version "2.0.0" 898 | resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" 899 | 900 | har-validator@~2.0.6: 901 | version "2.0.6" 902 | resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-2.0.6.tgz#cdcbc08188265ad119b6a5a7c8ab70eecfb5d27d" 903 | dependencies: 904 | chalk "^1.1.1" 905 | commander "^2.9.0" 906 | is-my-json-valid "^2.12.4" 907 | pinkie-promise "^2.0.0" 908 | 909 | har-validator@~5.0.3: 910 | version "5.0.3" 911 | resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd" 912 | dependencies: 913 | ajv "^5.1.0" 914 | har-schema "^2.0.0" 915 | 916 | has-ansi@^2.0.0: 917 | version "2.0.0" 918 | resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" 919 | dependencies: 920 | ansi-regex "^2.0.0" 921 | 922 | has-flag@^1.0.0: 923 | version "1.0.0" 924 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" 925 | 926 | has-flag@^2.0.0: 927 | version "2.0.0" 928 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" 929 | 930 | has-unicode@^2.0.0: 931 | version "2.0.1" 932 | resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" 933 | 934 | has@^1.0.1: 935 | version "1.0.1" 936 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28" 937 | dependencies: 938 | function-bind "^1.0.2" 939 | 940 | hawk@~3.1.3: 941 | version "3.1.3" 942 | resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" 943 | dependencies: 944 | boom "2.x.x" 945 | cryptiles "2.x.x" 946 | hoek "2.x.x" 947 | sntp "1.x.x" 948 | 949 | hawk@~6.0.2: 950 | version "6.0.2" 951 | resolved "https://registry.yarnpkg.com/hawk/-/hawk-6.0.2.tgz#af4d914eb065f9b5ce4d9d11c1cb2126eecc3038" 952 | dependencies: 953 | boom "4.x.x" 954 | cryptiles "3.x.x" 955 | hoek "4.x.x" 956 | sntp "2.x.x" 957 | 958 | hoek@2.x.x: 959 | version "2.16.3" 960 | resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" 961 | 962 | hoek@4.x.x: 963 | version "4.2.0" 964 | resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.0.tgz#72d9d0754f7fe25ca2d01ad8f8f9a9449a89526d" 965 | 966 | hosted-git-info@^2.1.4: 967 | version "2.5.0" 968 | resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.5.0.tgz#6d60e34b3abbc8313062c3b798ef8d901a07af3c" 969 | 970 | html-comment-regex@^1.1.0: 971 | version "1.1.1" 972 | resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.1.tgz#668b93776eaae55ebde8f3ad464b307a4963625e" 973 | 974 | http-signature@~1.1.0: 975 | version "1.1.1" 976 | resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" 977 | dependencies: 978 | assert-plus "^0.2.0" 979 | jsprim "^1.2.2" 980 | sshpk "^1.7.0" 981 | 982 | http-signature@~1.2.0: 983 | version "1.2.0" 984 | resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" 985 | dependencies: 986 | assert-plus "^1.0.0" 987 | jsprim "^1.2.2" 988 | sshpk "^1.7.0" 989 | 990 | iconv-lite@^0.4.17: 991 | version "0.4.19" 992 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" 993 | 994 | icss-replace-symbols@^1.1.0: 995 | version "1.1.0" 996 | resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded" 997 | 998 | icss-utils@^2.1.0: 999 | version "2.1.0" 1000 | resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-2.1.0.tgz#83f0a0ec378bf3246178b6c2ad9136f135b1c962" 1001 | dependencies: 1002 | postcss "^6.0.1" 1003 | 1004 | ignore@^3.3.3: 1005 | version "3.3.7" 1006 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.7.tgz#612289bfb3c220e186a58118618d5be8c1bab021" 1007 | 1008 | imurmurhash@^0.1.4: 1009 | version "0.1.4" 1010 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 1011 | 1012 | in-publish@^2.0.0: 1013 | version "2.0.0" 1014 | resolved "https://registry.yarnpkg.com/in-publish/-/in-publish-2.0.0.tgz#e20ff5e3a2afc2690320b6dc552682a9c7fadf51" 1015 | 1016 | indent-string@^2.1.0: 1017 | version "2.1.0" 1018 | resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" 1019 | dependencies: 1020 | repeating "^2.0.0" 1021 | 1022 | indexes-of@^1.0.1: 1023 | version "1.0.1" 1024 | resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" 1025 | 1026 | inflight@^1.0.4: 1027 | version "1.0.6" 1028 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 1029 | dependencies: 1030 | once "^1.3.0" 1031 | wrappy "1" 1032 | 1033 | inherits@2, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.3: 1034 | version "2.0.3" 1035 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 1036 | 1037 | inquirer@^3.0.6: 1038 | version "3.3.0" 1039 | resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" 1040 | dependencies: 1041 | ansi-escapes "^3.0.0" 1042 | chalk "^2.0.0" 1043 | cli-cursor "^2.1.0" 1044 | cli-width "^2.0.0" 1045 | external-editor "^2.0.4" 1046 | figures "^2.0.0" 1047 | lodash "^4.3.0" 1048 | mute-stream "0.0.7" 1049 | run-async "^2.2.0" 1050 | rx-lite "^4.0.8" 1051 | rx-lite-aggregates "^4.0.8" 1052 | string-width "^2.1.0" 1053 | strip-ansi "^4.0.0" 1054 | through "^2.3.6" 1055 | 1056 | install@^0.10.2: 1057 | version "0.10.2" 1058 | resolved "https://registry.yarnpkg.com/install/-/install-0.10.2.tgz#f1f71902797e5a900069fb9ab80c94055025ffdc" 1059 | 1060 | invert-kv@^1.0.0: 1061 | version "1.0.0" 1062 | resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" 1063 | 1064 | is-absolute-url@^2.0.0: 1065 | version "2.1.0" 1066 | resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" 1067 | 1068 | is-arrayish@^0.2.1: 1069 | version "0.2.1" 1070 | resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" 1071 | 1072 | is-buffer@^1.0.2, is-buffer@^1.1.5: 1073 | version "1.1.6" 1074 | resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" 1075 | 1076 | is-builtin-module@^1.0.0: 1077 | version "1.0.0" 1078 | resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" 1079 | dependencies: 1080 | builtin-modules "^1.0.0" 1081 | 1082 | is-extendable@^0.1.1: 1083 | version "0.1.1" 1084 | resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" 1085 | 1086 | is-finite@^1.0.0: 1087 | version "1.0.2" 1088 | resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" 1089 | dependencies: 1090 | number-is-nan "^1.0.0" 1091 | 1092 | is-fullwidth-code-point@^1.0.0: 1093 | version "1.0.0" 1094 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" 1095 | dependencies: 1096 | number-is-nan "^1.0.0" 1097 | 1098 | is-fullwidth-code-point@^2.0.0: 1099 | version "2.0.0" 1100 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 1101 | 1102 | is-my-json-valid@^2.12.4: 1103 | version "2.16.1" 1104 | resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.16.1.tgz#5a846777e2c2620d1e69104e5d3a03b1f6088f11" 1105 | dependencies: 1106 | generate-function "^2.0.0" 1107 | generate-object-property "^1.1.0" 1108 | jsonpointer "^4.0.0" 1109 | xtend "^4.0.0" 1110 | 1111 | is-path-cwd@^1.0.0: 1112 | version "1.0.0" 1113 | resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" 1114 | 1115 | is-path-in-cwd@^1.0.0: 1116 | version "1.0.0" 1117 | resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003be8a9eac04dc" 1118 | dependencies: 1119 | is-path-inside "^1.0.0" 1120 | 1121 | is-path-inside@^1.0.0: 1122 | version "1.0.0" 1123 | resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.0.tgz#fc06e5a1683fbda13de667aff717bbc10a48f37f" 1124 | dependencies: 1125 | path-is-inside "^1.0.1" 1126 | 1127 | is-plain-obj@^1.0.0: 1128 | version "1.1.0" 1129 | resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" 1130 | 1131 | is-plain-object@^2.0.1: 1132 | version "2.0.4" 1133 | resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" 1134 | dependencies: 1135 | isobject "^3.0.1" 1136 | 1137 | is-promise@^2.1.0: 1138 | version "2.1.0" 1139 | resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" 1140 | 1141 | is-property@^1.0.0: 1142 | version "1.0.2" 1143 | resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" 1144 | 1145 | is-resolvable@^1.0.0: 1146 | version "1.0.0" 1147 | resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.0.0.tgz#8df57c61ea2e3c501408d100fb013cf8d6e0cc62" 1148 | dependencies: 1149 | tryit "^1.0.1" 1150 | 1151 | is-svg@^2.0.0: 1152 | version "2.1.0" 1153 | resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-2.1.0.tgz#cf61090da0d9efbcab8722deba6f032208dbb0e9" 1154 | dependencies: 1155 | html-comment-regex "^1.1.0" 1156 | 1157 | is-typedarray@~1.0.0: 1158 | version "1.0.0" 1159 | resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" 1160 | 1161 | is-utf8@^0.2.0: 1162 | version "0.2.1" 1163 | resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" 1164 | 1165 | isarray@^1.0.0, isarray@~1.0.0: 1166 | version "1.0.0" 1167 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 1168 | 1169 | isexe@^2.0.0: 1170 | version "2.0.0" 1171 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 1172 | 1173 | isobject@^3.0.1: 1174 | version "3.0.1" 1175 | resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" 1176 | 1177 | isstream@~0.1.2: 1178 | version "0.1.2" 1179 | resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" 1180 | 1181 | js-base64@^2.1.8, js-base64@^2.1.9: 1182 | version "2.3.2" 1183 | resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.3.2.tgz#a79a923666372b580f8e27f51845c6f7e8fbfbaf" 1184 | 1185 | js-tokens@^3.0.2: 1186 | version "3.0.2" 1187 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" 1188 | 1189 | js-yaml@^3.9.1: 1190 | version "3.10.0" 1191 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc" 1192 | dependencies: 1193 | argparse "^1.0.7" 1194 | esprima "^4.0.0" 1195 | 1196 | js-yaml@~3.7.0: 1197 | version "3.7.0" 1198 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.7.0.tgz#5c967ddd837a9bfdca5f2de84253abe8a1c03b80" 1199 | dependencies: 1200 | argparse "^1.0.7" 1201 | esprima "^2.6.0" 1202 | 1203 | jsbn@~0.1.0: 1204 | version "0.1.1" 1205 | resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" 1206 | 1207 | jsesc@~0.5.0: 1208 | version "0.5.0" 1209 | resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" 1210 | 1211 | json-schema-traverse@^0.3.0: 1212 | version "0.3.1" 1213 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" 1214 | 1215 | json-schema@0.2.3: 1216 | version "0.2.3" 1217 | resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" 1218 | 1219 | json-stable-stringify-without-jsonify@^1.0.1: 1220 | version "1.0.1" 1221 | resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" 1222 | 1223 | json-stringify-safe@~5.0.1: 1224 | version "5.0.1" 1225 | resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" 1226 | 1227 | json5@^0.5.0: 1228 | version "0.5.1" 1229 | resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" 1230 | 1231 | jsonpointer@^4.0.0: 1232 | version "4.0.1" 1233 | resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9" 1234 | 1235 | jsprim@^1.2.2: 1236 | version "1.4.1" 1237 | resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" 1238 | dependencies: 1239 | assert-plus "1.0.0" 1240 | extsprintf "1.3.0" 1241 | json-schema "0.2.3" 1242 | verror "1.10.0" 1243 | 1244 | kind-of@^2.0.1: 1245 | version "2.0.1" 1246 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-2.0.1.tgz#018ec7a4ce7e3a86cb9141be519d24c8faa981b5" 1247 | dependencies: 1248 | is-buffer "^1.0.2" 1249 | 1250 | kind-of@^3.2.2: 1251 | version "3.2.2" 1252 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" 1253 | dependencies: 1254 | is-buffer "^1.1.5" 1255 | 1256 | lazy-cache@^0.2.3: 1257 | version "0.2.7" 1258 | resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-0.2.7.tgz#7feddf2dcb6edb77d11ef1d117ab5ffdf0ab1b65" 1259 | 1260 | lcid@^1.0.0: 1261 | version "1.0.0" 1262 | resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" 1263 | dependencies: 1264 | invert-kv "^1.0.0" 1265 | 1266 | levn@^0.3.0, levn@~0.3.0: 1267 | version "0.3.0" 1268 | resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" 1269 | dependencies: 1270 | prelude-ls "~1.1.2" 1271 | type-check "~0.3.2" 1272 | 1273 | load-json-file@^1.0.0: 1274 | version "1.1.0" 1275 | resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" 1276 | dependencies: 1277 | graceful-fs "^4.1.2" 1278 | parse-json "^2.2.0" 1279 | pify "^2.0.0" 1280 | pinkie-promise "^2.0.0" 1281 | strip-bom "^2.0.0" 1282 | 1283 | loader-utils@^1.0.1, loader-utils@^1.0.2: 1284 | version "1.1.0" 1285 | resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd" 1286 | dependencies: 1287 | big.js "^3.1.3" 1288 | emojis-list "^2.0.0" 1289 | json5 "^0.5.0" 1290 | 1291 | lodash.assign@^4.2.0: 1292 | version "4.2.0" 1293 | resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" 1294 | 1295 | lodash.camelcase@^4.3.0: 1296 | version "4.3.0" 1297 | resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" 1298 | 1299 | lodash.clonedeep@^4.3.2: 1300 | version "4.5.0" 1301 | resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" 1302 | 1303 | lodash.memoize@^4.1.2: 1304 | version "4.1.2" 1305 | resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" 1306 | 1307 | lodash.mergewith@^4.6.0: 1308 | version "4.6.0" 1309 | resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.0.tgz#150cf0a16791f5903b8891eab154609274bdea55" 1310 | 1311 | lodash.tail@^4.1.1: 1312 | version "4.1.1" 1313 | resolved "https://registry.yarnpkg.com/lodash.tail/-/lodash.tail-4.1.1.tgz#d2333a36d9e7717c8ad2f7cacafec7c32b444664" 1314 | 1315 | lodash.uniq@^4.5.0: 1316 | version "4.5.0" 1317 | resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" 1318 | 1319 | lodash@^4.0.0, lodash@^4.14.0, lodash@^4.17.13, lodash@^4.17.4, lodash@^4.3.0, lodash@~4.17.4: 1320 | version "4.17.13" 1321 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.13.tgz#0bdc3a6adc873d2f4e0c4bac285df91b64fc7b93" 1322 | 1323 | loud-rejection@^1.0.0: 1324 | version "1.6.0" 1325 | resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" 1326 | dependencies: 1327 | currently-unhandled "^0.4.1" 1328 | signal-exit "^3.0.0" 1329 | 1330 | lru-cache@^4.0.1: 1331 | version "4.1.1" 1332 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55" 1333 | dependencies: 1334 | pseudomap "^1.0.2" 1335 | yallist "^2.1.2" 1336 | 1337 | macaddress@^0.2.8: 1338 | version "0.2.8" 1339 | resolved "https://registry.yarnpkg.com/macaddress/-/macaddress-0.2.8.tgz#5904dc537c39ec6dbefeae902327135fa8511f12" 1340 | 1341 | map-obj@^1.0.0, map-obj@^1.0.1: 1342 | version "1.0.1" 1343 | resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" 1344 | 1345 | math-expression-evaluator@^1.2.14: 1346 | version "1.2.17" 1347 | resolved "https://registry.yarnpkg.com/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz#de819fdbcd84dccd8fae59c6aeb79615b9d266ac" 1348 | 1349 | meow@^3.7.0: 1350 | version "3.7.0" 1351 | resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" 1352 | dependencies: 1353 | camelcase-keys "^2.0.0" 1354 | decamelize "^1.1.2" 1355 | loud-rejection "^1.0.0" 1356 | map-obj "^1.0.1" 1357 | minimist "^1.1.3" 1358 | normalize-package-data "^2.3.4" 1359 | object-assign "^4.0.1" 1360 | read-pkg-up "^1.0.1" 1361 | redent "^1.0.0" 1362 | trim-newlines "^1.0.0" 1363 | 1364 | mime-db@~1.30.0: 1365 | version "1.30.0" 1366 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01" 1367 | 1368 | mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.7: 1369 | version "2.1.17" 1370 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.17.tgz#09d7a393f03e995a79f8af857b70a9e0ab16557a" 1371 | dependencies: 1372 | mime-db "~1.30.0" 1373 | 1374 | mimic-fn@^1.0.0: 1375 | version "1.1.0" 1376 | resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.1.0.tgz#e667783d92e89dbd342818b5230b9d62a672ad18" 1377 | 1378 | "minimatch@2 || 3", minimatch@^3.0.2, minimatch@^3.0.4, minimatch@~3.0.2: 1379 | version "3.0.4" 1380 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 1381 | dependencies: 1382 | brace-expansion "^1.1.7" 1383 | 1384 | minimist@0.0.8: 1385 | version "0.0.8" 1386 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 1387 | 1388 | minimist@^1.1.3: 1389 | version "1.2.0" 1390 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" 1391 | 1392 | mixin-object@^2.0.1: 1393 | version "2.0.1" 1394 | resolved "https://registry.yarnpkg.com/mixin-object/-/mixin-object-2.0.1.tgz#4fb949441dab182540f1fe035ba60e1947a5e57e" 1395 | dependencies: 1396 | for-in "^0.1.3" 1397 | is-extendable "^0.1.1" 1398 | 1399 | "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.1: 1400 | version "0.5.1" 1401 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 1402 | dependencies: 1403 | minimist "0.0.8" 1404 | 1405 | ms@2.0.0: 1406 | version "2.0.0" 1407 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 1408 | 1409 | mute-stream@0.0.7: 1410 | version "0.0.7" 1411 | resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" 1412 | 1413 | nan@^2.3.2: 1414 | version "2.8.0" 1415 | resolved "https://registry.yarnpkg.com/nan/-/nan-2.8.0.tgz#ed715f3fe9de02b57a5e6252d90a96675e1f085a" 1416 | 1417 | natural-compare@^1.4.0: 1418 | version "1.4.0" 1419 | resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" 1420 | 1421 | node-gyp@^3.3.1: 1422 | version "3.6.2" 1423 | resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.6.2.tgz#9bfbe54562286284838e750eac05295853fa1c60" 1424 | dependencies: 1425 | fstream "^1.0.0" 1426 | glob "^7.0.3" 1427 | graceful-fs "^4.1.2" 1428 | minimatch "^3.0.2" 1429 | mkdirp "^0.5.0" 1430 | nopt "2 || 3" 1431 | npmlog "0 || 1 || 2 || 3 || 4" 1432 | osenv "0" 1433 | request "2" 1434 | rimraf "2" 1435 | semver "~5.3.0" 1436 | tar "^2.0.0" 1437 | which "1" 1438 | 1439 | node-sass@^4.7.2: 1440 | version "4.7.2" 1441 | resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.7.2.tgz#9366778ba1469eb01438a9e8592f4262bcb6794e" 1442 | dependencies: 1443 | async-foreach "^0.1.3" 1444 | chalk "^1.1.1" 1445 | cross-spawn "^3.0.0" 1446 | gaze "^1.0.0" 1447 | get-stdin "^4.0.1" 1448 | glob "^7.0.3" 1449 | in-publish "^2.0.0" 1450 | lodash.assign "^4.2.0" 1451 | lodash.clonedeep "^4.3.2" 1452 | lodash.mergewith "^4.6.0" 1453 | meow "^3.7.0" 1454 | mkdirp "^0.5.1" 1455 | nan "^2.3.2" 1456 | node-gyp "^3.3.1" 1457 | npmlog "^4.0.0" 1458 | request "~2.79.0" 1459 | sass-graph "^2.2.4" 1460 | stdout-stream "^1.4.0" 1461 | "true-case-path" "^1.0.2" 1462 | 1463 | "nopt@2 || 3": 1464 | version "3.0.6" 1465 | resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" 1466 | dependencies: 1467 | abbrev "1" 1468 | 1469 | normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: 1470 | version "2.4.0" 1471 | resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" 1472 | dependencies: 1473 | hosted-git-info "^2.1.4" 1474 | is-builtin-module "^1.0.0" 1475 | semver "2 || 3 || 4 || 5" 1476 | validate-npm-package-license "^3.0.1" 1477 | 1478 | normalize-range@^0.1.2: 1479 | version "0.1.2" 1480 | resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" 1481 | 1482 | normalize-url@^1.4.0: 1483 | version "1.9.1" 1484 | resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c" 1485 | dependencies: 1486 | object-assign "^4.0.1" 1487 | prepend-http "^1.0.0" 1488 | query-string "^4.1.0" 1489 | sort-keys "^1.0.0" 1490 | 1491 | "npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0: 1492 | version "4.1.2" 1493 | resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" 1494 | dependencies: 1495 | are-we-there-yet "~1.1.2" 1496 | console-control-strings "~1.1.0" 1497 | gauge "~2.7.3" 1498 | set-blocking "~2.0.0" 1499 | 1500 | num2fraction@^1.2.2: 1501 | version "1.2.2" 1502 | resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" 1503 | 1504 | number-is-nan@^1.0.0: 1505 | version "1.0.1" 1506 | resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" 1507 | 1508 | oauth-sign@~0.8.1, oauth-sign@~0.8.2: 1509 | version "0.8.2" 1510 | resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" 1511 | 1512 | object-assign@^4.0.1, object-assign@^4.1.0: 1513 | version "4.1.1" 1514 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 1515 | 1516 | once@^1.3.0: 1517 | version "1.4.0" 1518 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1519 | dependencies: 1520 | wrappy "1" 1521 | 1522 | onetime@^2.0.0: 1523 | version "2.0.1" 1524 | resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" 1525 | dependencies: 1526 | mimic-fn "^1.0.0" 1527 | 1528 | optionator@^0.8.2: 1529 | version "0.8.2" 1530 | resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" 1531 | dependencies: 1532 | deep-is "~0.1.3" 1533 | fast-levenshtein "~2.0.4" 1534 | levn "~0.3.0" 1535 | prelude-ls "~1.1.2" 1536 | type-check "~0.3.2" 1537 | wordwrap "~1.0.0" 1538 | 1539 | os-homedir@^1.0.0: 1540 | version "1.0.2" 1541 | resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" 1542 | 1543 | os-locale@^1.4.0: 1544 | version "1.4.0" 1545 | resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" 1546 | dependencies: 1547 | lcid "^1.0.0" 1548 | 1549 | os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: 1550 | version "1.0.2" 1551 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 1552 | 1553 | osenv@0: 1554 | version "0.1.4" 1555 | resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644" 1556 | dependencies: 1557 | os-homedir "^1.0.0" 1558 | os-tmpdir "^1.0.0" 1559 | 1560 | parse-json@^2.2.0: 1561 | version "2.2.0" 1562 | resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" 1563 | dependencies: 1564 | error-ex "^1.2.0" 1565 | 1566 | path-exists@^2.0.0: 1567 | version "2.1.0" 1568 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" 1569 | dependencies: 1570 | pinkie-promise "^2.0.0" 1571 | 1572 | path-is-absolute@^1.0.0: 1573 | version "1.0.1" 1574 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1575 | 1576 | path-is-inside@^1.0.1, path-is-inside@^1.0.2: 1577 | version "1.0.2" 1578 | resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" 1579 | 1580 | path-type@^1.0.0: 1581 | version "1.1.0" 1582 | resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" 1583 | dependencies: 1584 | graceful-fs "^4.1.2" 1585 | pify "^2.0.0" 1586 | pinkie-promise "^2.0.0" 1587 | 1588 | performance-now@^2.1.0: 1589 | version "2.1.0" 1590 | resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" 1591 | 1592 | pify@^2.0.0: 1593 | version "2.3.0" 1594 | resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" 1595 | 1596 | pify@^3.0.0: 1597 | version "3.0.0" 1598 | resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" 1599 | 1600 | pinkie-promise@^2.0.0: 1601 | version "2.0.1" 1602 | resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" 1603 | dependencies: 1604 | pinkie "^2.0.0" 1605 | 1606 | pinkie@^2.0.0: 1607 | version "2.0.4" 1608 | resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" 1609 | 1610 | pluralize@^7.0.0: 1611 | version "7.0.0" 1612 | resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" 1613 | 1614 | postcss-calc@^5.2.0: 1615 | version "5.3.1" 1616 | resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-5.3.1.tgz#77bae7ca928ad85716e2fda42f261bf7c1d65b5e" 1617 | dependencies: 1618 | postcss "^5.0.2" 1619 | postcss-message-helpers "^2.0.0" 1620 | reduce-css-calc "^1.2.6" 1621 | 1622 | postcss-colormin@^2.1.8: 1623 | version "2.2.2" 1624 | resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-2.2.2.tgz#6631417d5f0e909a3d7ec26b24c8a8d1e4f96e4b" 1625 | dependencies: 1626 | colormin "^1.0.5" 1627 | postcss "^5.0.13" 1628 | postcss-value-parser "^3.2.3" 1629 | 1630 | postcss-convert-values@^2.3.4: 1631 | version "2.6.1" 1632 | resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz#bbd8593c5c1fd2e3d1c322bb925dcae8dae4d62d" 1633 | dependencies: 1634 | postcss "^5.0.11" 1635 | postcss-value-parser "^3.1.2" 1636 | 1637 | postcss-discard-comments@^2.0.4: 1638 | version "2.0.4" 1639 | resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz#befe89fafd5b3dace5ccce51b76b81514be00e3d" 1640 | dependencies: 1641 | postcss "^5.0.14" 1642 | 1643 | postcss-discard-duplicates@^2.0.1: 1644 | version "2.1.0" 1645 | resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz#b9abf27b88ac188158a5eb12abcae20263b91932" 1646 | dependencies: 1647 | postcss "^5.0.4" 1648 | 1649 | postcss-discard-empty@^2.0.1: 1650 | version "2.1.0" 1651 | resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz#d2b4bd9d5ced5ebd8dcade7640c7d7cd7f4f92b5" 1652 | dependencies: 1653 | postcss "^5.0.14" 1654 | 1655 | postcss-discard-overridden@^0.1.1: 1656 | version "0.1.1" 1657 | resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz#8b1eaf554f686fb288cd874c55667b0aa3668d58" 1658 | dependencies: 1659 | postcss "^5.0.16" 1660 | 1661 | postcss-discard-unused@^2.2.1: 1662 | version "2.2.3" 1663 | resolved "https://registry.yarnpkg.com/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz#bce30b2cc591ffc634322b5fb3464b6d934f4433" 1664 | dependencies: 1665 | postcss "^5.0.14" 1666 | uniqs "^2.0.0" 1667 | 1668 | postcss-filter-plugins@^2.0.0: 1669 | version "2.0.2" 1670 | resolved "https://registry.yarnpkg.com/postcss-filter-plugins/-/postcss-filter-plugins-2.0.2.tgz#6d85862534d735ac420e4a85806e1f5d4286d84c" 1671 | dependencies: 1672 | postcss "^5.0.4" 1673 | uniqid "^4.0.0" 1674 | 1675 | postcss-merge-idents@^2.1.5: 1676 | version "2.1.7" 1677 | resolved "https://registry.yarnpkg.com/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz#4c5530313c08e1d5b3bbf3d2bbc747e278eea270" 1678 | dependencies: 1679 | has "^1.0.1" 1680 | postcss "^5.0.10" 1681 | postcss-value-parser "^3.1.1" 1682 | 1683 | postcss-merge-longhand@^2.0.1: 1684 | version "2.0.2" 1685 | resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz#23d90cd127b0a77994915332739034a1a4f3d658" 1686 | dependencies: 1687 | postcss "^5.0.4" 1688 | 1689 | postcss-merge-rules@^2.0.3: 1690 | version "2.1.2" 1691 | resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz#d1df5dfaa7b1acc3be553f0e9e10e87c61b5f721" 1692 | dependencies: 1693 | browserslist "^1.5.2" 1694 | caniuse-api "^1.5.2" 1695 | postcss "^5.0.4" 1696 | postcss-selector-parser "^2.2.2" 1697 | vendors "^1.0.0" 1698 | 1699 | postcss-message-helpers@^2.0.0: 1700 | version "2.0.0" 1701 | resolved "https://registry.yarnpkg.com/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz#a4f2f4fab6e4fe002f0aed000478cdf52f9ba60e" 1702 | 1703 | postcss-minify-font-values@^1.0.2: 1704 | version "1.0.5" 1705 | resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz#4b58edb56641eba7c8474ab3526cafd7bbdecb69" 1706 | dependencies: 1707 | object-assign "^4.0.1" 1708 | postcss "^5.0.4" 1709 | postcss-value-parser "^3.0.2" 1710 | 1711 | postcss-minify-gradients@^1.0.1: 1712 | version "1.0.5" 1713 | resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz#5dbda11373703f83cfb4a3ea3881d8d75ff5e6e1" 1714 | dependencies: 1715 | postcss "^5.0.12" 1716 | postcss-value-parser "^3.3.0" 1717 | 1718 | postcss-minify-params@^1.0.4: 1719 | version "1.2.2" 1720 | resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz#ad2ce071373b943b3d930a3fa59a358c28d6f1f3" 1721 | dependencies: 1722 | alphanum-sort "^1.0.1" 1723 | postcss "^5.0.2" 1724 | postcss-value-parser "^3.0.2" 1725 | uniqs "^2.0.0" 1726 | 1727 | postcss-minify-selectors@^2.0.4: 1728 | version "2.1.1" 1729 | resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz#b2c6a98c0072cf91b932d1a496508114311735bf" 1730 | dependencies: 1731 | alphanum-sort "^1.0.2" 1732 | has "^1.0.1" 1733 | postcss "^5.0.14" 1734 | postcss-selector-parser "^2.0.0" 1735 | 1736 | postcss-modules-extract-imports@^1.0.0: 1737 | version "1.2.0" 1738 | resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.0.tgz#66140ecece38ef06bf0d3e355d69bf59d141ea85" 1739 | dependencies: 1740 | postcss "^6.0.1" 1741 | 1742 | postcss-modules-local-by-default@^1.0.1: 1743 | version "1.2.0" 1744 | resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz#f7d80c398c5a393fa7964466bd19500a7d61c069" 1745 | dependencies: 1746 | css-selector-tokenizer "^0.7.0" 1747 | postcss "^6.0.1" 1748 | 1749 | postcss-modules-scope@^1.0.0: 1750 | version "1.1.0" 1751 | resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz#d6ea64994c79f97b62a72b426fbe6056a194bb90" 1752 | dependencies: 1753 | css-selector-tokenizer "^0.7.0" 1754 | postcss "^6.0.1" 1755 | 1756 | postcss-modules-values@^1.1.0: 1757 | version "1.3.0" 1758 | resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz#ecffa9d7e192518389f42ad0e83f72aec456ea20" 1759 | dependencies: 1760 | icss-replace-symbols "^1.1.0" 1761 | postcss "^6.0.1" 1762 | 1763 | postcss-normalize-charset@^1.1.0: 1764 | version "1.1.1" 1765 | resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz#ef9ee71212d7fe759c78ed162f61ed62b5cb93f1" 1766 | dependencies: 1767 | postcss "^5.0.5" 1768 | 1769 | postcss-normalize-url@^3.0.7: 1770 | version "3.0.8" 1771 | resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz#108f74b3f2fcdaf891a2ffa3ea4592279fc78222" 1772 | dependencies: 1773 | is-absolute-url "^2.0.0" 1774 | normalize-url "^1.4.0" 1775 | postcss "^5.0.14" 1776 | postcss-value-parser "^3.2.3" 1777 | 1778 | postcss-ordered-values@^2.1.0: 1779 | version "2.2.3" 1780 | resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz#eec6c2a67b6c412a8db2042e77fe8da43f95c11d" 1781 | dependencies: 1782 | postcss "^5.0.4" 1783 | postcss-value-parser "^3.0.1" 1784 | 1785 | postcss-reduce-idents@^2.2.2: 1786 | version "2.4.0" 1787 | resolved "https://registry.yarnpkg.com/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz#c2c6d20cc958284f6abfbe63f7609bf409059ad3" 1788 | dependencies: 1789 | postcss "^5.0.4" 1790 | postcss-value-parser "^3.0.2" 1791 | 1792 | postcss-reduce-initial@^1.0.0: 1793 | version "1.0.1" 1794 | resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz#68f80695f045d08263a879ad240df8dd64f644ea" 1795 | dependencies: 1796 | postcss "^5.0.4" 1797 | 1798 | postcss-reduce-transforms@^1.0.3: 1799 | version "1.0.4" 1800 | resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz#ff76f4d8212437b31c298a42d2e1444025771ae1" 1801 | dependencies: 1802 | has "^1.0.1" 1803 | postcss "^5.0.8" 1804 | postcss-value-parser "^3.0.1" 1805 | 1806 | postcss-selector-parser@^2.0.0, postcss-selector-parser@^2.2.2: 1807 | version "2.2.3" 1808 | resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz#f9437788606c3c9acee16ffe8d8b16297f27bb90" 1809 | dependencies: 1810 | flatten "^1.0.2" 1811 | indexes-of "^1.0.1" 1812 | uniq "^1.0.1" 1813 | 1814 | postcss-svgo@^2.1.1: 1815 | version "2.1.6" 1816 | resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-2.1.6.tgz#b6df18aa613b666e133f08adb5219c2684ac108d" 1817 | dependencies: 1818 | is-svg "^2.0.0" 1819 | postcss "^5.0.14" 1820 | postcss-value-parser "^3.2.3" 1821 | svgo "^0.7.0" 1822 | 1823 | postcss-unique-selectors@^2.0.2: 1824 | version "2.0.2" 1825 | resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz#981d57d29ddcb33e7b1dfe1fd43b8649f933ca1d" 1826 | dependencies: 1827 | alphanum-sort "^1.0.1" 1828 | postcss "^5.0.4" 1829 | uniqs "^2.0.0" 1830 | 1831 | postcss-value-parser@^3.0.1, postcss-value-parser@^3.0.2, postcss-value-parser@^3.1.1, postcss-value-parser@^3.1.2, postcss-value-parser@^3.2.3, postcss-value-parser@^3.3.0: 1832 | version "3.3.0" 1833 | resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz#87f38f9f18f774a4ab4c8a232f5c5ce8872a9d15" 1834 | 1835 | postcss-zindex@^2.0.1: 1836 | version "2.2.0" 1837 | resolved "https://registry.yarnpkg.com/postcss-zindex/-/postcss-zindex-2.2.0.tgz#d2109ddc055b91af67fc4cb3b025946639d2af22" 1838 | dependencies: 1839 | has "^1.0.1" 1840 | postcss "^5.0.4" 1841 | uniqs "^2.0.0" 1842 | 1843 | postcss@^5.0.10, postcss@^5.0.11, postcss@^5.0.12, postcss@^5.0.13, postcss@^5.0.14, postcss@^5.0.16, postcss@^5.0.2, postcss@^5.0.4, postcss@^5.0.5, postcss@^5.0.6, postcss@^5.0.8, postcss@^5.2.16: 1844 | version "5.2.18" 1845 | resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.18.tgz#badfa1497d46244f6390f58b319830d9107853c5" 1846 | dependencies: 1847 | chalk "^1.1.3" 1848 | js-base64 "^2.1.9" 1849 | source-map "^0.5.6" 1850 | supports-color "^3.2.3" 1851 | 1852 | postcss@^6.0.1: 1853 | version "6.0.14" 1854 | resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.14.tgz#5534c72114739e75d0afcf017db853099f562885" 1855 | dependencies: 1856 | chalk "^2.3.0" 1857 | source-map "^0.6.1" 1858 | supports-color "^4.4.0" 1859 | 1860 | prelude-ls@~1.1.2: 1861 | version "1.1.2" 1862 | resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" 1863 | 1864 | prepend-http@^1.0.0: 1865 | version "1.0.4" 1866 | resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" 1867 | 1868 | pretty-data@^0.40.0: 1869 | version "0.40.0" 1870 | resolved "https://registry.yarnpkg.com/pretty-data/-/pretty-data-0.40.0.tgz#572aa8ea23467467ab94b6b5266a6fd9c8fddd72" 1871 | 1872 | process-nextick-args@~1.0.6: 1873 | version "1.0.7" 1874 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" 1875 | 1876 | progress@^2.0.0: 1877 | version "2.0.0" 1878 | resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" 1879 | 1880 | pseudomap@^1.0.2: 1881 | version "1.0.2" 1882 | resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" 1883 | 1884 | punycode@^1.4.1: 1885 | version "1.4.1" 1886 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" 1887 | 1888 | q@^1.1.2: 1889 | version "1.5.1" 1890 | resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" 1891 | 1892 | qs@~6.3.0: 1893 | version "6.3.2" 1894 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.2.tgz#e75bd5f6e268122a2a0e0bda630b2550c166502c" 1895 | 1896 | qs@~6.5.1: 1897 | version "6.5.1" 1898 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" 1899 | 1900 | query-string@^4.1.0: 1901 | version "4.3.4" 1902 | resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb" 1903 | dependencies: 1904 | object-assign "^4.1.0" 1905 | strict-uri-encode "^1.0.0" 1906 | 1907 | read-pkg-up@^1.0.1: 1908 | version "1.0.1" 1909 | resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" 1910 | dependencies: 1911 | find-up "^1.0.0" 1912 | read-pkg "^1.0.0" 1913 | 1914 | read-pkg@^1.0.0: 1915 | version "1.1.0" 1916 | resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" 1917 | dependencies: 1918 | load-json-file "^1.0.0" 1919 | normalize-package-data "^2.3.2" 1920 | path-type "^1.0.0" 1921 | 1922 | readable-stream@^2.0.1, readable-stream@^2.0.6, readable-stream@^2.2.2: 1923 | version "2.3.3" 1924 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" 1925 | dependencies: 1926 | core-util-is "~1.0.0" 1927 | inherits "~2.0.3" 1928 | isarray "~1.0.0" 1929 | process-nextick-args "~1.0.6" 1930 | safe-buffer "~5.1.1" 1931 | string_decoder "~1.0.3" 1932 | util-deprecate "~1.0.1" 1933 | 1934 | redent@^1.0.0: 1935 | version "1.0.0" 1936 | resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" 1937 | dependencies: 1938 | indent-string "^2.1.0" 1939 | strip-indent "^1.0.1" 1940 | 1941 | reduce-css-calc@^1.2.6: 1942 | version "1.3.0" 1943 | resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz#747c914e049614a4c9cfbba629871ad1d2927716" 1944 | dependencies: 1945 | balanced-match "^0.4.2" 1946 | math-expression-evaluator "^1.2.14" 1947 | reduce-function-call "^1.0.1" 1948 | 1949 | reduce-function-call@^1.0.1: 1950 | version "1.0.2" 1951 | resolved "https://registry.yarnpkg.com/reduce-function-call/-/reduce-function-call-1.0.2.tgz#5a200bf92e0e37751752fe45b0ab330fd4b6be99" 1952 | dependencies: 1953 | balanced-match "^0.4.2" 1954 | 1955 | regenerate@^1.2.1: 1956 | version "1.3.3" 1957 | resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.3.tgz#0c336d3980553d755c39b586ae3b20aa49c82b7f" 1958 | 1959 | regexpu-core@^1.0.0: 1960 | version "1.0.0" 1961 | resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-1.0.0.tgz#86a763f58ee4d7c2f6b102e4764050de7ed90c6b" 1962 | dependencies: 1963 | regenerate "^1.2.1" 1964 | regjsgen "^0.2.0" 1965 | regjsparser "^0.1.4" 1966 | 1967 | regjsgen@^0.2.0: 1968 | version "0.2.0" 1969 | resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" 1970 | 1971 | regjsparser@^0.1.4: 1972 | version "0.1.5" 1973 | resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" 1974 | dependencies: 1975 | jsesc "~0.5.0" 1976 | 1977 | repeating@^2.0.0: 1978 | version "2.0.1" 1979 | resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" 1980 | dependencies: 1981 | is-finite "^1.0.0" 1982 | 1983 | request@2: 1984 | version "2.83.0" 1985 | resolved "https://registry.yarnpkg.com/request/-/request-2.83.0.tgz#ca0b65da02ed62935887808e6f510381034e3356" 1986 | dependencies: 1987 | aws-sign2 "~0.7.0" 1988 | aws4 "^1.6.0" 1989 | caseless "~0.12.0" 1990 | combined-stream "~1.0.5" 1991 | extend "~3.0.1" 1992 | forever-agent "~0.6.1" 1993 | form-data "~2.3.1" 1994 | har-validator "~5.0.3" 1995 | hawk "~6.0.2" 1996 | http-signature "~1.2.0" 1997 | is-typedarray "~1.0.0" 1998 | isstream "~0.1.2" 1999 | json-stringify-safe "~5.0.1" 2000 | mime-types "~2.1.17" 2001 | oauth-sign "~0.8.2" 2002 | performance-now "^2.1.0" 2003 | qs "~6.5.1" 2004 | safe-buffer "^5.1.1" 2005 | stringstream "~0.0.5" 2006 | tough-cookie "~2.3.3" 2007 | tunnel-agent "^0.6.0" 2008 | uuid "^3.1.0" 2009 | 2010 | request@~2.79.0: 2011 | version "2.79.0" 2012 | resolved "https://registry.yarnpkg.com/request/-/request-2.79.0.tgz#4dfe5bf6be8b8cdc37fcf93e04b65577722710de" 2013 | dependencies: 2014 | aws-sign2 "~0.6.0" 2015 | aws4 "^1.2.1" 2016 | caseless "~0.11.0" 2017 | combined-stream "~1.0.5" 2018 | extend "~3.0.0" 2019 | forever-agent "~0.6.1" 2020 | form-data "~2.1.1" 2021 | har-validator "~2.0.6" 2022 | hawk "~3.1.3" 2023 | http-signature "~1.1.0" 2024 | is-typedarray "~1.0.0" 2025 | isstream "~0.1.2" 2026 | json-stringify-safe "~5.0.1" 2027 | mime-types "~2.1.7" 2028 | oauth-sign "~0.8.1" 2029 | qs "~6.3.0" 2030 | stringstream "~0.0.4" 2031 | tough-cookie "~2.3.0" 2032 | tunnel-agent "~0.4.1" 2033 | uuid "^3.0.0" 2034 | 2035 | require-directory@^2.1.1: 2036 | version "2.1.1" 2037 | resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" 2038 | 2039 | require-main-filename@^1.0.1: 2040 | version "1.0.1" 2041 | resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" 2042 | 2043 | require-uncached@^1.0.3: 2044 | version "1.0.3" 2045 | resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" 2046 | dependencies: 2047 | caller-path "^0.1.0" 2048 | resolve-from "^1.0.0" 2049 | 2050 | resolve-from@^1.0.0: 2051 | version "1.0.1" 2052 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" 2053 | 2054 | restore-cursor@^2.0.0: 2055 | version "2.0.0" 2056 | resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" 2057 | dependencies: 2058 | onetime "^2.0.0" 2059 | signal-exit "^3.0.2" 2060 | 2061 | rimraf@2, rimraf@^2.2.8: 2062 | version "2.6.2" 2063 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" 2064 | dependencies: 2065 | glob "^7.0.5" 2066 | 2067 | run-async@^2.2.0: 2068 | version "2.3.0" 2069 | resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" 2070 | dependencies: 2071 | is-promise "^2.1.0" 2072 | 2073 | rx-lite-aggregates@^4.0.8: 2074 | version "4.0.8" 2075 | resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" 2076 | dependencies: 2077 | rx-lite "*" 2078 | 2079 | rx-lite@*, rx-lite@^4.0.8: 2080 | version "4.0.8" 2081 | resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" 2082 | 2083 | safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: 2084 | version "5.1.1" 2085 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" 2086 | 2087 | sass-graph@^2.2.4: 2088 | version "2.2.4" 2089 | resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.4.tgz#13fbd63cd1caf0908b9fd93476ad43a51d1e0b49" 2090 | dependencies: 2091 | glob "^7.0.0" 2092 | lodash "^4.0.0" 2093 | scss-tokenizer "^0.2.3" 2094 | yargs "^7.0.0" 2095 | 2096 | sass-loader@^6.0.6: 2097 | version "6.0.6" 2098 | resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-6.0.6.tgz#e9d5e6c1f155faa32a4b26d7a9b7107c225e40f9" 2099 | dependencies: 2100 | async "^2.1.5" 2101 | clone-deep "^0.3.0" 2102 | loader-utils "^1.0.1" 2103 | lodash.tail "^4.1.1" 2104 | pify "^3.0.0" 2105 | 2106 | sax@~1.2.1: 2107 | version "1.2.4" 2108 | resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" 2109 | 2110 | schema-utils@^0.3.0: 2111 | version "0.3.0" 2112 | resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.3.0.tgz#f5877222ce3e931edae039f17eb3716e7137f8cf" 2113 | dependencies: 2114 | ajv "^5.0.0" 2115 | 2116 | scss-tokenizer@^0.2.3: 2117 | version "0.2.3" 2118 | resolved "https://registry.yarnpkg.com/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz#8eb06db9a9723333824d3f5530641149847ce5d1" 2119 | dependencies: 2120 | js-base64 "^2.1.8" 2121 | source-map "^0.4.2" 2122 | 2123 | "semver@2 || 3 || 4 || 5", semver@^5.3.0: 2124 | version "5.4.1" 2125 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" 2126 | 2127 | semver@~5.3.0: 2128 | version "5.3.0" 2129 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" 2130 | 2131 | set-blocking@^2.0.0, set-blocking@~2.0.0: 2132 | version "2.0.0" 2133 | resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" 2134 | 2135 | shallow-clone@^0.1.2: 2136 | version "0.1.2" 2137 | resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-0.1.2.tgz#5909e874ba77106d73ac414cfec1ffca87d97060" 2138 | dependencies: 2139 | is-extendable "^0.1.1" 2140 | kind-of "^2.0.1" 2141 | lazy-cache "^0.2.3" 2142 | mixin-object "^2.0.1" 2143 | 2144 | shebang-command@^1.2.0: 2145 | version "1.2.0" 2146 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" 2147 | dependencies: 2148 | shebang-regex "^1.0.0" 2149 | 2150 | shebang-regex@^1.0.0: 2151 | version "1.0.0" 2152 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" 2153 | 2154 | signal-exit@^3.0.0, signal-exit@^3.0.2: 2155 | version "3.0.2" 2156 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" 2157 | 2158 | slice-ansi@1.0.0: 2159 | version "1.0.0" 2160 | resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d" 2161 | dependencies: 2162 | is-fullwidth-code-point "^2.0.0" 2163 | 2164 | sntp@1.x.x: 2165 | version "1.0.9" 2166 | resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" 2167 | dependencies: 2168 | hoek "2.x.x" 2169 | 2170 | sntp@2.x.x: 2171 | version "2.1.0" 2172 | resolved "https://registry.yarnpkg.com/sntp/-/sntp-2.1.0.tgz#2c6cec14fedc2222739caf9b5c3d85d1cc5a2cc8" 2173 | dependencies: 2174 | hoek "4.x.x" 2175 | 2176 | sort-keys@^1.0.0: 2177 | version "1.1.2" 2178 | resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" 2179 | dependencies: 2180 | is-plain-obj "^1.0.0" 2181 | 2182 | source-list-map@^2.0.0: 2183 | version "2.0.0" 2184 | resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.0.tgz#aaa47403f7b245a92fbc97ea08f250d6087ed085" 2185 | 2186 | source-map@^0.4.2: 2187 | version "0.4.4" 2188 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" 2189 | dependencies: 2190 | amdefine ">=0.0.4" 2191 | 2192 | source-map@^0.5.3, source-map@^0.5.6: 2193 | version "0.5.7" 2194 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" 2195 | 2196 | source-map@^0.6.1: 2197 | version "0.6.1" 2198 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" 2199 | 2200 | spdx-correct@~1.0.0: 2201 | version "1.0.2" 2202 | resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" 2203 | dependencies: 2204 | spdx-license-ids "^1.0.2" 2205 | 2206 | spdx-expression-parse@~1.0.0: 2207 | version "1.0.4" 2208 | resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c" 2209 | 2210 | spdx-license-ids@^1.0.2: 2211 | version "1.2.2" 2212 | resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" 2213 | 2214 | sprintf-js@~1.0.2: 2215 | version "1.0.3" 2216 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 2217 | 2218 | sshpk@^1.7.0: 2219 | version "1.13.1" 2220 | resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.1.tgz#512df6da6287144316dc4c18fe1cf1d940739be3" 2221 | dependencies: 2222 | asn1 "~0.2.3" 2223 | assert-plus "^1.0.0" 2224 | dashdash "^1.12.0" 2225 | getpass "^0.1.1" 2226 | optionalDependencies: 2227 | bcrypt-pbkdf "^1.0.0" 2228 | ecc-jsbn "~0.1.1" 2229 | jsbn "~0.1.0" 2230 | tweetnacl "~0.14.0" 2231 | 2232 | stdout-stream@^1.4.0: 2233 | version "1.4.0" 2234 | resolved "https://registry.yarnpkg.com/stdout-stream/-/stdout-stream-1.4.0.tgz#a2c7c8587e54d9427ea9edb3ac3f2cd522df378b" 2235 | dependencies: 2236 | readable-stream "^2.0.1" 2237 | 2238 | strict-uri-encode@^1.0.0: 2239 | version "1.1.0" 2240 | resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" 2241 | 2242 | string-width@^1.0.1, string-width@^1.0.2: 2243 | version "1.0.2" 2244 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" 2245 | dependencies: 2246 | code-point-at "^1.0.0" 2247 | is-fullwidth-code-point "^1.0.0" 2248 | strip-ansi "^3.0.0" 2249 | 2250 | string-width@^2.1.0, string-width@^2.1.1: 2251 | version "2.1.1" 2252 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" 2253 | dependencies: 2254 | is-fullwidth-code-point "^2.0.0" 2255 | strip-ansi "^4.0.0" 2256 | 2257 | string_decoder@~1.0.3: 2258 | version "1.0.3" 2259 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" 2260 | dependencies: 2261 | safe-buffer "~5.1.0" 2262 | 2263 | stringstream@~0.0.4, stringstream@~0.0.5: 2264 | version "0.0.5" 2265 | resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" 2266 | 2267 | strip-ansi@^3.0.0, strip-ansi@^3.0.1: 2268 | version "3.0.1" 2269 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 2270 | dependencies: 2271 | ansi-regex "^2.0.0" 2272 | 2273 | strip-ansi@^4.0.0: 2274 | version "4.0.0" 2275 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" 2276 | dependencies: 2277 | ansi-regex "^3.0.0" 2278 | 2279 | strip-bom@^2.0.0: 2280 | version "2.0.0" 2281 | resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" 2282 | dependencies: 2283 | is-utf8 "^0.2.0" 2284 | 2285 | strip-indent@^1.0.1: 2286 | version "1.0.1" 2287 | resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" 2288 | dependencies: 2289 | get-stdin "^4.0.1" 2290 | 2291 | strip-json-comments@~2.0.1: 2292 | version "2.0.1" 2293 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 2294 | 2295 | style-loader@^0.19.0: 2296 | version "0.19.0" 2297 | resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.19.0.tgz#7258e788f0fee6a42d710eaf7d6c2412a4c50759" 2298 | dependencies: 2299 | loader-utils "^1.0.2" 2300 | schema-utils "^0.3.0" 2301 | 2302 | supports-color@^2.0.0: 2303 | version "2.0.0" 2304 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" 2305 | 2306 | supports-color@^3.2.3: 2307 | version "3.2.3" 2308 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" 2309 | dependencies: 2310 | has-flag "^1.0.0" 2311 | 2312 | supports-color@^4.0.0, supports-color@^4.4.0: 2313 | version "4.5.0" 2314 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b" 2315 | dependencies: 2316 | has-flag "^2.0.0" 2317 | 2318 | svgo@^0.7.0: 2319 | version "0.7.2" 2320 | resolved "https://registry.yarnpkg.com/svgo/-/svgo-0.7.2.tgz#9f5772413952135c6fefbf40afe6a4faa88b4bb5" 2321 | dependencies: 2322 | coa "~1.0.1" 2323 | colors "~1.1.2" 2324 | csso "~2.3.1" 2325 | js-yaml "~3.7.0" 2326 | mkdirp "~0.5.1" 2327 | sax "~1.2.1" 2328 | whet.extend "~0.9.9" 2329 | 2330 | table@^4.0.1: 2331 | version "4.0.2" 2332 | resolved "https://registry.yarnpkg.com/table/-/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36" 2333 | dependencies: 2334 | ajv "^5.2.3" 2335 | ajv-keywords "^2.1.0" 2336 | chalk "^2.1.0" 2337 | lodash "^4.17.4" 2338 | slice-ansi "1.0.0" 2339 | string-width "^2.1.1" 2340 | 2341 | tar@^2.0.0: 2342 | version "2.2.1" 2343 | resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" 2344 | dependencies: 2345 | block-stream "*" 2346 | fstream "^1.0.2" 2347 | inherits "2" 2348 | 2349 | text-table@~0.2.0: 2350 | version "0.2.0" 2351 | resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" 2352 | 2353 | through@^2.3.6: 2354 | version "2.3.8" 2355 | resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" 2356 | 2357 | tmp@^0.0.33: 2358 | version "0.0.33" 2359 | resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" 2360 | dependencies: 2361 | os-tmpdir "~1.0.2" 2362 | 2363 | tough-cookie@~2.3.0, tough-cookie@~2.3.3: 2364 | version "2.3.3" 2365 | resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.3.tgz#0b618a5565b6dea90bf3425d04d55edc475a7561" 2366 | dependencies: 2367 | punycode "^1.4.1" 2368 | 2369 | trim-newlines@^1.0.0: 2370 | version "1.0.0" 2371 | resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" 2372 | 2373 | "true-case-path@^1.0.2": 2374 | version "1.0.2" 2375 | resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-1.0.2.tgz#7ec91130924766c7f573be3020c34f8fdfd00d62" 2376 | dependencies: 2377 | glob "^6.0.4" 2378 | 2379 | tryit@^1.0.1: 2380 | version "1.0.3" 2381 | resolved "https://registry.yarnpkg.com/tryit/-/tryit-1.0.3.tgz#393be730a9446fd1ead6da59a014308f36c289cb" 2382 | 2383 | tunnel-agent@^0.6.0: 2384 | version "0.6.0" 2385 | resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" 2386 | dependencies: 2387 | safe-buffer "^5.0.1" 2388 | 2389 | tunnel-agent@~0.4.1: 2390 | version "0.4.3" 2391 | resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb" 2392 | 2393 | tweetnacl@^0.14.3, tweetnacl@~0.14.0: 2394 | version "0.14.5" 2395 | resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" 2396 | 2397 | type-check@~0.3.2: 2398 | version "0.3.2" 2399 | resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" 2400 | dependencies: 2401 | prelude-ls "~1.1.2" 2402 | 2403 | typedarray@^0.0.6: 2404 | version "0.0.6" 2405 | resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" 2406 | 2407 | uniq@^1.0.1: 2408 | version "1.0.1" 2409 | resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" 2410 | 2411 | uniqid@^4.0.0: 2412 | version "4.1.1" 2413 | resolved "https://registry.yarnpkg.com/uniqid/-/uniqid-4.1.1.tgz#89220ddf6b751ae52b5f72484863528596bb84c1" 2414 | dependencies: 2415 | macaddress "^0.2.8" 2416 | 2417 | uniqs@^2.0.0: 2418 | version "2.0.0" 2419 | resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" 2420 | 2421 | util-deprecate@~1.0.1: 2422 | version "1.0.2" 2423 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 2424 | 2425 | uuid@^3.0.0, uuid@^3.1.0: 2426 | version "3.1.0" 2427 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04" 2428 | 2429 | validate-npm-package-license@^3.0.1: 2430 | version "3.0.1" 2431 | resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" 2432 | dependencies: 2433 | spdx-correct "~1.0.0" 2434 | spdx-expression-parse "~1.0.0" 2435 | 2436 | vendors@^1.0.0: 2437 | version "1.0.1" 2438 | resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.1.tgz#37ad73c8ee417fb3d580e785312307d274847f22" 2439 | 2440 | verror@1.10.0: 2441 | version "1.10.0" 2442 | resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" 2443 | dependencies: 2444 | assert-plus "^1.0.0" 2445 | core-util-is "1.0.2" 2446 | extsprintf "^1.2.0" 2447 | 2448 | whet.extend@~0.9.9: 2449 | version "0.9.9" 2450 | resolved "https://registry.yarnpkg.com/whet.extend/-/whet.extend-0.9.9.tgz#f877d5bf648c97e5aa542fadc16d6a259b9c11a1" 2451 | 2452 | which-module@^1.0.0: 2453 | version "1.0.0" 2454 | resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" 2455 | 2456 | which@1, which@^1.2.9: 2457 | version "1.3.0" 2458 | resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" 2459 | dependencies: 2460 | isexe "^2.0.0" 2461 | 2462 | wide-align@^1.1.0: 2463 | version "1.1.2" 2464 | resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710" 2465 | dependencies: 2466 | string-width "^1.0.2" 2467 | 2468 | wordwrap@~1.0.0: 2469 | version "1.0.0" 2470 | resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" 2471 | 2472 | wrap-ansi@^2.0.0: 2473 | version "2.1.0" 2474 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" 2475 | dependencies: 2476 | string-width "^1.0.1" 2477 | strip-ansi "^3.0.1" 2478 | 2479 | wrappy@1: 2480 | version "1.0.2" 2481 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 2482 | 2483 | write@^0.2.1: 2484 | version "0.2.1" 2485 | resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" 2486 | dependencies: 2487 | mkdirp "^0.5.1" 2488 | 2489 | xtend@^4.0.0: 2490 | version "4.0.1" 2491 | resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" 2492 | 2493 | y18n@^3.2.1: 2494 | version "3.2.1" 2495 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" 2496 | 2497 | yallist@^2.1.2: 2498 | version "2.1.2" 2499 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" 2500 | 2501 | yargs-parser@^5.0.0: 2502 | version "5.0.0" 2503 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0.tgz#275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a" 2504 | dependencies: 2505 | camelcase "^3.0.0" 2506 | 2507 | yargs@^7.0.0: 2508 | version "7.1.0" 2509 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8" 2510 | dependencies: 2511 | camelcase "^3.0.0" 2512 | cliui "^3.2.0" 2513 | decamelize "^1.1.1" 2514 | get-caller-file "^1.0.1" 2515 | os-locale "^1.4.0" 2516 | read-pkg-up "^1.0.1" 2517 | require-directory "^2.1.1" 2518 | require-main-filename "^1.0.1" 2519 | set-blocking "^2.0.0" 2520 | string-width "^1.0.2" 2521 | which-module "^1.0.0" 2522 | y18n "^3.2.1" 2523 | yargs-parser "^5.0.0" 2524 | --------------------------------------------------------------------------------