├── .bookignore ├── .gitattributes ├── .github └── workflows │ └── ci.yaml ├── .gitignore ├── .textlintrc ├── README.md ├── SUMMARY.md ├── ajax.md ├── ajax ├── fetch.md ├── json.md ├── tips.md └── xhr.md ├── architecture.md ├── architecture ├── example.md ├── hatena.md ├── js-mvc-0.png ├── js-mvc-1.png ├── js-mvc-2.png ├── mvc.html ├── mvc.js ├── mvc.md ├── mvp.html ├── mvp.js └── others.md ├── async.md ├── async ├── async-async.png ├── async-sync.png ├── async.sketch ├── callback.md ├── event.md └── promise.md ├── browser.md ├── browser └── dom.md ├── deploy.sh ├── deploy_key.enc ├── exercise.md ├── exercise ├── ex1-hint-perl.md ├── ex1-hint-scala.md ├── ex1.md ├── ex2.md └── ex3.md ├── jquery-logo.png ├── jquery.md ├── language.md ├── language ├── class.md ├── function.md ├── javascript-logo.png ├── js-prototype-1.png ├── js-prototype-2.png ├── syntax.md ├── type.md └── variable.md ├── nodejs.md ├── nodejs ├── dev.md ├── node-and-npm.md └── nodejs-logo.png ├── omake.md ├── package.json ├── prepare.md └── yarn.lock /.bookignore: -------------------------------------------------------------------------------- 1 | .gitignore 2 | .gitattributes 3 | package.json 4 | yarn.lock 5 | .textlintrc 6 | deploy_key.enc 7 | deploy.sh 8 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | docs/**/* binary 2 | -------------------------------------------------------------------------------- /.github/workflows/ci.yaml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | on: [push, pull_request] 4 | 5 | jobs: 6 | test: 7 | name: Test 8 | runs-on: ubuntu-latest 9 | steps: 10 | - uses: actions/checkout@master 11 | - name: Setup Node 12 | uses: actions/setup-node@v1 13 | with: 14 | node-version: 10.x 15 | - name: Install 16 | run: yarn install 17 | - name: Test 18 | run: npm test 19 | - name: Setup Remote URL 20 | run: git config remote.origin.url "https://${GITHUB_ACTOR}:${{ secrets.GITHUB_TOKEN }}@github.com/${GITHUB_REPOSITORY}" 21 | - name: Deploy 22 | run: bash deploy.sh 23 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | _book/ 3 | docs/ 4 | hatena-textbook-javascript.pdf 5 | -------------------------------------------------------------------------------- /.textlintrc: -------------------------------------------------------------------------------- 1 | { 2 | "rules": { 3 | "preset-jtf-style": { 4 | "4.2.7.コロン(:)": false, 5 | "4.3.1.丸かっこ()": false, 6 | }, 7 | "preset-ja-technical-writing": { 8 | "max-comma": false, 9 | "max-kanji-continuous-len": false, 10 | "no-doubled-joshi": { 11 | "allow": ["も", "たり", "か", "と"], 12 | }, 13 | "no-exclamation-question-mark": false, 14 | "no-start-duplicated-conjunction": false, 15 | }, 16 | }, 17 | } 18 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | はてな教科書JavaScript編 2 | ================================================================ 3 | 4 | [![CI Status](https://github.com/hatena/Hatena-Textbook-JavaScript/workflows/CI/badge.svg)](https://github.com/hatena/Hatena-Textbook-JavaScript/actions) 5 | 6 | ## 講義の目的 7 | 8 | * JavaScriptについて、自分で調べて学習するための基礎知識を身につける 9 | * リファレンスをひけば良い部分は覚えない 10 | 11 | 12 | ## 話の流れ 13 | 14 | * JavaScriptの言語コア部分 15 | * 構文とか 16 | * WebとJSにまつわるあれこれ 17 | * DOM 18 | * 非同期プログラミング 19 | * Ajax 20 | * jQuery 21 | * フロントエンド設計 22 | * Node.js 23 | 24 | 25 | 駆け足で進めるので、速すぎるなら遠慮せず言ってください! 26 | 27 | 28 | ## LICENSE 29 | 30 | 31 | クリエイティブ・コモンズ・ライセンス 32 | 33 | 34 | この作品は クリエイティブ・コモンズ表示 - 非営利 - 継承2.1日本ライセンス の下に提供されています。 35 | -------------------------------------------------------------------------------- /SUMMARY.md: -------------------------------------------------------------------------------- 1 | # Summary 2 | 3 | - [予備知識](prepare.md) 4 | 5 | -- 6 | 7 | - [JavaScript言語について](language.md) 8 | - [構文](language/syntax.md) 9 | - [型と値](language/type.md) 10 | - [関数](language/function.md) 11 | - [変数](language/variable.md) 12 | - [クラス](language/class.md) 13 | 14 | -- 15 | 16 | - [ブラウザの API](browser.md) 17 | - [DOM](browser/dom.md) 18 | 19 | -- 20 | 21 | - [非同期プログラミング](async.md) 22 | - [コールバック関数](async/callback.md) 23 | - [Promise](async/promise.md) 24 | - [イベント](async/event.md) 25 | 26 | -- 27 | 28 | - [Ajax](ajax.md) 29 | - [XMLHttpRequest](ajax/xhr.md) 30 | - [その他の方法](ajax/fetch.md) 31 | - [Tips](ajax/tips.md) 32 | - [JSON](ajax/json.md) 33 | 34 | -- 35 | 36 | - [jQuery](jquery.md) 37 | 38 | -- 39 | 40 | - [フロントエンド設計](architecture.md) 41 | - [MVC](architecture/mvc.md) 42 | - [その他](architecture/others.md) 43 | - [はてなでのアーキテクチャ](architecture/hatena.md) 44 | - [jQuery でのページ設計](architecture/example.md) 45 | 46 | -- 47 | 48 | - [Node.js](nodejs.md) 49 | - [Node.js の基本的な使い方](nodejs/node-and-npm.md) 50 | - [開発用ツール](nodejs/dev.md) 51 | 52 | -- 53 | 54 | - [課題](exercise.md) 55 | - [課題4.1](exercise/ex1.md) 56 | - [Perl ヒント](exercise/ex1-hint-perl.md) 57 | - [Scala ヒント](exercise/ex1-hint-scala.md) 58 | - [課題4.2](exercise/ex2.md) 59 | - [課題4.3](exercise/ex3.md) 60 | 61 | -- 62 | 63 | - [おまけ](omake.md) 64 | -------------------------------------------------------------------------------- /ajax.md: -------------------------------------------------------------------------------- 1 | Ajax 2 | ================================================================ 3 | 4 | ## Ajaxとは 5 | 6 | - ページ遷移せず、JSでHTTP通信を行う処理の総称 7 | - `Asynchronous JavaScript and XML` の略 8 | - 昔は `XMLHttpRequest` というAPIを使っていた 9 | 10 | 11 | ### JSでHTTP通信する方法 12 | 13 | - XMLHttpRequest 14 | - ライブラリを利用する 15 | - fetch 16 | -------------------------------------------------------------------------------- /ajax/fetch.md: -------------------------------------------------------------------------------- 1 | その他の方法 2 | ================================================================ 3 | 4 | ## ライブラリ使う 5 | 6 | - jQuery 7 | - axios 8 | - request 9 | - superagent 10 | - etc... 11 | 12 | jQueryについては後ほど解説します。 13 | 14 | 15 | ## fetch 16 | 17 | - XMLHttpRequestはなし崩し的に使われてきた 18 | - WHATWGが新しい仕様を策定中 19 | - PromiseベースのAPI 20 | - `Headers` `Request` `Response` といったクラスを定義 21 | - 最近のブラウザだと使える 22 | - 2016-08-16現在ではEdge, Firefox, Chrome, Operaが対応 23 | - 参考 24 | - [WHATWGによる仕様](https://fetch.spec.whatwg.org/) 25 | - [Fetch API 解説、または Web において "Fetch する" とは何か? - Block Rockin’ Codes](http://jxck.hatenablog.com/entry/whatwg-fetch) 26 | 27 | 28 | ## fetchの使用例 29 | 30 | ```javascript 31 | fetch(url) 32 | .then(res => res.text()) // .json() や .blob() もある 33 | .then(r => console.log(r)); 34 | 35 | // いろいろオプション書いたり 36 | var headers = new Header(); 37 | fetch(url, { 38 | method : 'POST', 39 | headers : headers, 40 | cache : 'no-cache', 41 | }); 42 | 43 | // 途中でキャンセルできる 44 | var fetching = fetch(url); 45 | abortButton.addEventListener('click', () => { 46 | fetching.then(res => res.body.cancel()); 47 | }); 48 | ``` 49 | -------------------------------------------------------------------------------- /ajax/json.md: -------------------------------------------------------------------------------- 1 | JSON 2 | ================================================================ 3 | 4 | Ajax処理ではJSONを頻繁に使います。 5 | 6 | - JSON 7 | - オブジェクトのシリアライズ形式の一種 8 | - JSのオブジェクトリテラルと一部互換性がある 9 | - 注意点 10 | - コメントは書けない 11 | - Objectのプロパティ名は `""` で囲む 12 | - ArrayやObjectの末尾に `,` を書けない 13 | 14 | 15 | OK 16 | ```json 17 | '[1, 2, 3]' 18 | '{"a": 1}' 19 | ``` 20 | 21 | NG 22 | ```json 23 | '[1, 2, 3,]' 24 | '{a: 1}' 25 | '{a: 1,}' 26 | '{"name": "hoge"} // TODO: あとで直す' 27 | ``` 28 | 29 | 30 | ## JSでJSONを扱う 31 | 32 | - `window.JSON` 33 | - `JSON.stringify`: オブジェクトをJSON形式でシリアライズする 34 | - `JSON.parse`: JSON文字列をパースして値を返す 35 | 36 | 37 | ```javascript 38 | var obj = { 39 | foo : 1, 40 | bar : 2, 41 | }; 42 | var str = JSON.stringify(obj); // '{"foo":1,"bar":2}' (文字列) 43 | var parsed = JSON.parse(str); // {foo: 1, bar: 2} (Object) 44 | ``` 45 | -------------------------------------------------------------------------------- /ajax/tips.md: -------------------------------------------------------------------------------- 1 | Ajax Tips 2 | ================================================================ 3 | 4 | ## Ajaxのデバッグ 5 | 6 | デベロッパーツールのNetworkタブで通信内容を見よう。 7 | 8 | - リクエストヘッダ、レスポンスヘッダ 9 | - レスポンス内容 10 | - サイズ 11 | - 通信時間 12 | 13 | 14 | ## Same-Origin Policy 15 | 16 | [同一オリジンポリシー - Web セキュリティ | MDN](https://developer.mozilla.org/ja/docs/Web/Security/Same-origin_policy) 17 | 18 | - 基本的に、他ドメインのリソースは読み込めない 19 | - `b.hatena.ne.jp` からは `b.hatena.ne.jp` のリソースだけ読み込める 20 | - `d.hatena.ne.jp` のデータをJSで読み込んだり表示したりは出来ない 21 | - iframeは別ドメインのページを表示できるが、その中身をJSで操作したりは出来ない 22 | 23 | 24 | ## CORS 25 | 26 | サーバー側で `Allow-Access-Control-Origin` ヘッダを設定すると、他のドメインから参照できるようになる。 27 | 28 | ``` 29 | Access-Control-Allow-Origin: http://b.hatena.ne.jp 30 | ``` 31 | 32 | 公開APIの場合はワイルドカードが使える。 33 | ``` 34 | Access-Control-Allow-Origin: * 35 | ``` 36 | 37 | - 独自ヘッダーをつける時やクッキーを使う時は追加でヘッダが必要 38 | - 参考: [HTTP アクセス制御 (CORS) - HTTP | MDN](https://developer.mozilla.org/ja/docs/Web/HTTP/HTTP_access_control) 39 | -------------------------------------------------------------------------------- /ajax/xhr.md: -------------------------------------------------------------------------------- 1 | XMLHttpRequest 2 | ================================================================ 3 | 4 | - IE5で導入され、後に標準化された 5 | - Ajax用ライブラリは皆XMLHttpRequestのラッパー 6 | - 細かい制御をしようとすると直接さわる必要がある 7 | 8 | 9 | ## 生 `XMLHttpRequest` のようす 10 | 11 | 生で使うことは滅多にないが、一応雰囲気だけ知っておこう。 12 | 13 | ```javascript 14 | // リクエストのオブジェクトを作成 15 | var xhr = new XMLHttpRequest(); 16 | xhr.open('GET', '/api/foo', true); 17 | 18 | // レスポンスが返ってきたときの処理を登録 19 | xhr.onreadystatechange = (e) => { 20 | if (xhr.readyState == 4) { 21 | if (xhr.status == 200) { 22 | console.log(xhr.responseText); 23 | } 24 | else { 25 | console.log('error'); 26 | } 27 | } 28 | }; 29 | 30 | // リクエストを送信 31 | xhr.send(null); 32 | ``` 33 | 34 | POSTの場合。 35 | 36 | ```javascript 37 | var xhr = new XMLHttpRequest(); 38 | xhr.open('POST', '/api/foo', true); 39 | xhr.onreadystatechange = (e) => { ... }; 40 | 41 | // クエリパラメータをつくる 42 | var params = { a: 1, b: 'Hi there' }; 43 | var pairs = Object.keys(params).map((key) => { 44 | return `${encodeURIComponent(key)}=${encodeURIComponent(params[key])}`; 45 | }); 46 | var data = pairs.join('&'); // data === 'a=1&b=Hi%20there' 47 | 48 | xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); 49 | xhr.send(data); 50 | ``` 51 | -------------------------------------------------------------------------------- /architecture.md: -------------------------------------------------------------------------------- 1 | フロントエンドにおけるアプリケーション設計 2 | ================================================================ 3 | 4 | ## 例: ブックマーク一覧 5 | 6 | * ブックマーク追加フォームとブックマーク一覧があるページ 7 | * ブックマークを追加/編集したら、ページ遷移せずにブックマーク一覧を更新したい 8 | 9 | 10 | ### 陥りがちな問題 11 | 12 | 初心者が素朴に書くとこうなりがち。 13 | 14 | ![](./architecture/js-mvc-1.png) 15 | 16 | この設計にはいくつか問題がある。 17 | 18 | * ブックマーク操作や表示の種類が増えると、組合せが膨大に 19 | * 操作: ブックマーク作成、更新、削除、…… 20 | * 表示: 全部ブックマーク一覧、最近更新されたブックマーク、ゴミ箱、…… 21 | * 通信処理が分散している 22 | * コードが重複したり 23 | * 同じ内容の通信を何度もしてしまったり 24 | 25 | 26 | ### ModelとViewの分離がカギ 27 | 28 | * Model 29 | * ビジネスロジック 30 | * サーバーとの通信、ブックマーク一覧データの管理 31 | * View 32 | * 見た目の処理 33 | * DOM操作 (ブックマーク一覧更新) 34 | -------------------------------------------------------------------------------- /architecture/example.md: -------------------------------------------------------------------------------- 1 | jQueryでのページ設計 2 | ================================================================ 3 | 4 | - jQueryで処理を書く場合、1つの関数にベタッと書きがち 5 | - 問題点 6 | - 読めないコードになる 7 | - テストが難しい 8 | 9 | [MVC の章](./mvc.md)で挙げたブックマークページの例。 10 | 11 | ```javascript 12 | (function () { 13 | var $bookmarks = $('.bookmark-container'); 14 | var $bookmarkList = $bookmarks.find('.bookmark-list'); 15 | 16 | // ブックマーク入力フォーム 17 | var $bookmarkInput = $bookmarks.find('.bookmark-input'); 18 | var $bookmarkButton = $bookmarks.find('.bookmark-button'); 19 | 20 | var bookmarkTemplate = _.template('
  • <%- body %>
  • '); 21 | 22 | // イベントリスナ登録 23 | $bookmarkButton.on('click', () => { 24 | const $bookmark = $.parseHTML(bookmarkTemplate({ 25 | body : $bookmarkInput.val(), 26 | })) 27 | $bookmarkList.append($bookmark); 28 | }); 29 | 30 | // ... 31 | })(); 32 | ``` 33 | 34 | 本項では、上記のコードをリファクタしつつMVP / MVCパターンを紹介する。 35 | 36 | 37 | ## まずは構造化 38 | 39 | 初期化とそれ以外を分離。 40 | 41 | * 初期化 42 | * 必要なDOM要素の取得 43 | * データの初期化 44 | * イベントリスナーの登録 45 | * それ以外 46 | * イベントリスナー 47 | * データの更新処理 48 | 49 | ```javascript 50 | const BOOKMARK_TEMPLATE = _.template('
  • <%- url %>
  • '); 51 | 52 | class BookmarkPage { 53 | 54 | constructor ($element) { 55 | // 要素の取得 56 | this.$element = $element; 57 | this.$bookmarkList = $element.find('.bookmark-list'); 58 | this.$bookmarkUrl = $element.find('.bookmark-url'); 59 | this.$bookmarkButton = $element.find('.bookmark-button'); 60 | 61 | // イベントリスナーの登録 62 | $bookmarkButton.on('click', () => this.addNewBookmark()); 63 | } 64 | 65 | // イベントリスナー 66 | addNewBookmark () { 67 | const url = this.$bookmarkUrlInput.text(); 68 | 69 | const $bookmark = $.parseHTML(BOOKMARK_TEMPLATE({ url : url })); 70 | this.$bookmarkList.append($bookmark); 71 | } 72 | 73 | } 74 | 75 | (function () { 76 | const bookmarkPage = new BookmarkPage($('.bookmark-container')); 77 | })(); 78 | ``` 79 | 80 | 81 | ## Modelの作成 82 | 83 | 複雑になるとModelが出来たりする。 84 | 85 | - User, Diary, EntryといったEntityクラスとか 86 | - サーバへのアクセスをラップしてくれるServiceっぽいとか 87 | 88 | 以下はブックマーク1件を表すクラスの例。 89 | 90 | ```javascript 91 | /** 92 | * Bookmark のモデルクラス 93 | */ 94 | class Bookmark { 95 | 96 | /** 97 | * @param {String} url 98 | * @param {Date} created 99 | */ 100 | constructor (opts) { 101 | this.url = opts.url; 102 | this.created = opts.created; 103 | } 104 | 105 | /** 106 | * "n 分前" みたいな形式でブックマークした時刻を表示する 107 | * @return {String} 108 | */ 109 | getRelativeTime () { 110 | return moment(this.created).fromNow(); 111 | } 112 | 113 | } 114 | ``` 115 | 116 | ## そしてMVPへ 117 | 118 | - jQueryベタ書きから移行するにはMVPの方が楽 (私見) 119 | - Modelの変更をViewに反映するのが難しい 120 | 121 | MVPでは、 PresenterがModelの更新を明示的にViewに反映します。 122 | 123 | ```javascript 124 | const BOOKMARK_TEMPLATE = _.template(` 125 |
  • 126 |

    url: <%- url %>

    127 | 128 |
  • 129 | `); 130 | 131 | class BookmarkView { 132 | 133 | constructor ($element) { 134 | this.$element = $element; 135 | this.$bookmarkList = $element.find('.bookmark-list'); 136 | this.$bookmarkUrl = $element.find('.bookmark-url'); 137 | this.$bookmarkButton = $element.find('.bookmark-button'); 138 | 139 | // ユーザー入力を加工してイベントを発火 140 | this.$bookmarkButton.on('click', () => { 141 | const url = this.$bookmarkUrl.val(); 142 | $(this).triggerHandler('addNewBookmark', url); 143 | }); 144 | } 145 | 146 | /** 147 | * @param {Array} bookmarks 148 | */ 149 | render (bookmarks) { 150 | this.$bookmarkList.empty(); 151 | bookmarks.forEach((bookmark) => { 152 | const html = BOOKMARK_TEMPLATE(bookmark); 153 | const $bookmark = $.parseHTML(html); 154 | this.$bookmarkList.append($bookmark); 155 | }); 156 | } 157 | 158 | } 159 | 160 | class BookmarksPresenter { 161 | 162 | /** 163 | * Model と View を初期化 164 | * View からユーザーのイベントを受け取る 165 | * Model を更新したら View に反映する 166 | */ 167 | constructor ($element) { 168 | this.bookmarks = []; 169 | this.view = new BookmarkView($element, this.bookmarks); 170 | $(this.view).on('addNewBookmark', (e, url) => this.addNewBookmark(url)); 171 | } 172 | 173 | /** 174 | * ユーザー入力を元に Model を更新し、 View に反映する 175 | */ 176 | addNewBookmark (url) { 177 | const bookmark = new Bookmark({ 178 | url : url, 179 | created : new Date(), 180 | }); 181 | this.bookmarks.push(bookmark); 182 | this.view.render(this.bookmarks); 183 | } 184 | 185 | } 186 | 187 | $(function(){ 188 | const presenter = new BookmarksPresenter($('.bookmarks')); 189 | }); 190 | ``` 191 | 192 | - codepenにサンプルコード置きました 193 | - http://codepen.io/anon/pen/zBbQYW 194 | 195 | 196 | ## jQueryだけでMVC 197 | 198 | - MVCの場合、柔軟なイベントシステムが欲しくなる 199 | - 大抵のMV* フレームワークはイベント機能を搭載している 200 | - DOMを自分で操作するのが大変 201 | - リストの一部を更新する場合など 202 | 203 | 以下、 jQueryだけで簡単なMVC構成を試してみます。 204 | 205 | 206 | ### コレクションクラスの作成 207 | 208 | - ブックマーク一覧の変更を監視するため、Bookmarkの集合のクラスを作る 209 | - `$(this)` でイベントを発行 210 | 211 | ```javascript 212 | /** 213 | * Bookmark のコレクション 214 | * Bookmark 一覧に変化があったら 'change' イベントを発火する 215 | */ 216 | class Bookmarks { 217 | 218 | constructor () { 219 | this.bookmarks = []; 220 | } 221 | 222 | /** 223 | * @param {Bookmark} bookmark 224 | */ 225 | push (bookmark) { 226 | this.bookmarks.push(bookmark); 227 | $(this).trigger('change'); 228 | } 229 | 230 | /** 231 | * @param {function} callback 232 | */ 233 | forEach (callback) { 234 | this.bookmarks.forEach(callback); 235 | } 236 | 237 | } 238 | ``` 239 | 240 | 続いてView, Controllerを作成。 241 | 242 | - イベントによってM, V, C間を疎結合に 243 | - ControllerがViewのイベントを監視 244 | - ViewがModelのイベントを監視 245 | - 複雑になったときテストしやすくなる 246 | - とはいえ、この実装はすごく冗長 247 | - 大抵の場合は何らかのフレームワークを使う 248 | 249 | ```javascript 250 | class BookmarkView { 251 | 252 | constructor ($element, bookmarks) { 253 | this.$element = $element; 254 | this.$bookmarkList = $element.find('.bookmark-list'); 255 | this.$bookmarkUrl = $element.find('.bookmark-url'); 256 | this.$bookmarkButton = $element.find('.bookmark-button'); 257 | 258 | // ユーザー入力を加工してイベントを発火 259 | this.$bookmarkButton.on('click', () => { 260 | const url = this.$bookmarkUrl.val(); 261 | $(this).triggerHandler('addNewBookmark', url); 262 | }); 263 | 264 | // Model の変更を監視して表示を更新する 265 | this.bookmarks = bookmarks; 266 | $(this.bookmarks).on('change', () => this.render()); 267 | } 268 | 269 | render () { 270 | this.$bookmarkList.empty(); 271 | this.bookmarks.forEach((bookmark) => { 272 | const html = BOOKMARK_TEMPLATE(bookmark); 273 | const $bookmark = $.parseHTML(html); 274 | this.$bookmarkList.append($bookmark); 275 | }); 276 | } 277 | 278 | } 279 | 280 | class BookmarksController { 281 | 282 | /** 283 | * Model と View を初期化 284 | * View からユーザーのイベントを受け取る 285 | */ 286 | constructor ($element) { 287 | this.bookmarks = new Bookmarks(); 288 | this.view = new BookmarkView($element, this.bookmarks); 289 | $(this.view).on('addNewBookmark', (e, url) => this.addNewBookmark(url)); 290 | } 291 | 292 | /** 293 | * ユーザー入力を元に Model を更新する 294 | */ 295 | addNewBookmark (url) { 296 | const bookmark = new Bookmark({ 297 | url : url, 298 | created : new Date(), 299 | }); 300 | this.bookmarks.push(bookmark); 301 | } 302 | 303 | } 304 | 305 | $(function(){ 306 | const controller = new BookmarksController($('.bookmarks')); 307 | }); 308 | ``` 309 | 310 | - codepenにサンプルコード置きました 311 | - http://codepen.io/anon/pen/AXwkOa 312 | -------------------------------------------------------------------------------- /architecture/hatena.md: -------------------------------------------------------------------------------- 1 | はてなでのフロントエンド設計 2 | ================================================================ 3 | 4 | - MVP 5 | - [TypeScript で実現する MVP アーキテクチャパターン - Hatena Developer Blog](http://developer.hatenastaff.com/entry/2015/02/13/121217) 6 | - Flux, MVVM 7 | - はてなブログの一部で採用 8 | - [フロントエンドに秩序を取り戻す方法 // Speaker Deck](https://speakerdeck.com/fand/hurontoendonizhi-xu-woqu-rili-sufang-fa) 9 | 10 | 11 | ## どれを使えば良いの? 12 | 13 | * いろいろ紹介したけど意識しすぎないように 14 | * 最初は汚くてもよい 15 | * コードが大きくなってきたら整理しよう 16 | * まずはViewとビジネスロジックの分離から 17 | * 特定のアーキテクチャを採用するときはメンターに相談しよう 18 | -------------------------------------------------------------------------------- /architecture/js-mvc-0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hatena/Hatena-Textbook-JavaScript/7c59aa6783a759cc8c958ffaa7e636419f9e932b/architecture/js-mvc-0.png -------------------------------------------------------------------------------- /architecture/js-mvc-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hatena/Hatena-Textbook-JavaScript/7c59aa6783a759cc8c958ffaa7e636419f9e932b/architecture/js-mvc-1.png -------------------------------------------------------------------------------- /architecture/js-mvc-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hatena/Hatena-Textbook-JavaScript/7c59aa6783a759cc8c958ffaa7e636419f9e932b/architecture/js-mvc-2.png -------------------------------------------------------------------------------- /architecture/mvc.html: -------------------------------------------------------------------------------- 1 |
    2 | 3 | 4 | 5 |
    6 | 7 | -------------------------------------------------------------------------------- /architecture/mvc.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Bookmark のモデルクラス 3 | */ 4 | class Bookmark { 5 | 6 | /** 7 | * @param {String} url 8 | * @param {Date} created 9 | */ 10 | constructor (opts) { 11 | this.url = opts.url; 12 | this.created = opts.created; 13 | } 14 | 15 | /** 16 | * "n 分前" みたいな形式でブックマークした時刻を表示する 17 | * @return {String} 18 | */ 19 | getRelativeTime () { 20 | return moment(this.created).fromNow(); 21 | } 22 | 23 | } 24 | 25 | /** 26 | * Bookmark のコレクションクラス 27 | * Bookmark 一覧に変化があったら 'change' イベントを発火する 28 | */ 29 | class Bookmarks { 30 | 31 | constructor () { 32 | this.bookmarks = []; 33 | } 34 | 35 | /** 36 | * @param {Bookmark} bookmark 37 | */ 38 | push (bookmark) { 39 | this.bookmarks.push(bookmark); 40 | $(this).trigger('change'); 41 | } 42 | 43 | /** 44 | * @param {function} callback 45 | */ 46 | forEach (callback) { 47 | this.bookmarks.forEach(callback); 48 | } 49 | 50 | } 51 | 52 | const BOOKMARK_TEMPLATE = _.template(` 53 |
  • 54 |

    url: <%- url %>

    55 | 56 |
  • 57 | `); 58 | 59 | class BookmarkView { 60 | 61 | constructor ($element, bookmarks) { 62 | this.$element = $element; 63 | this.$bookmarkList = $element.find('.bookmark-list'); 64 | this.$bookmarkUrl = $element.find('.bookmark-url'); 65 | this.$bookmarkButton = $element.find('.bookmark-button'); 66 | 67 | // ユーザー入力を加工してイベントを発火 68 | this.$bookmarkButton.on('click', () => { 69 | const url = this.$bookmarkUrl.val(); 70 | $(this).triggerHandler('addNewBookmark', url); 71 | }); 72 | 73 | // Model の変更を監視して表示を更新する 74 | this.bookmarks = bookmarks; 75 | $(this.bookmarks).on('change', () => this.render()); 76 | } 77 | 78 | render () { 79 | this.$bookmarkList.empty(); 80 | this.bookmarks.forEach((bookmark) => { 81 | const html = BOOKMARK_TEMPLATE(bookmark); 82 | const $bookmark = $.parseHTML(html); 83 | this.$bookmarkList.append($bookmark); 84 | }); 85 | } 86 | 87 | } 88 | 89 | class BookmarksController { 90 | 91 | /** 92 | * Model と View を初期化 93 | * View からユーザーのイベントを受け取る 94 | */ 95 | constructor ($element) { 96 | this.bookmarks = new Bookmarks(); 97 | this.view = new BookmarkView($element, this.bookmarks); 98 | $(this.view).on('addNewBookmark', (e, url) => this.addNewBookmark(url)); 99 | } 100 | 101 | /** 102 | * ユーザー入力を元に Model を更新する 103 | */ 104 | addNewBookmark (url) { 105 | const bookmark = new Bookmark({ 106 | url : url, 107 | created : new Date(), 108 | }); 109 | this.bookmarks.push(bookmark); 110 | } 111 | 112 | } 113 | 114 | $(function(){ 115 | const controller = new BookmarksController($('.bookmarks')); 116 | }); 117 | -------------------------------------------------------------------------------- /architecture/mvc.md: -------------------------------------------------------------------------------- 1 | MVC 2 | ================================================================ 3 | 4 | ## 概要 5 | 6 | 7 | 8 | * 処理をModel, View, Controllerに分類 9 | * Model: ビジネスロジック全部 10 | * View: 見た目の処理 11 | * Controller: ユーザーの操作に応じてModelを呼び、更新する 12 | * 元々はGUIプログラミングで発明された概念 [1](#foot-1) 13 | * サーバーサイドのWAFでよく使われるアーキテクチャ [2](#foot-2) 14 | * Ruby on Rails, CakePHPなど 15 | * クライアントサイドではAjaxが絡んだりして、より複雑 16 | 17 | * 代表的なフレームワーク 18 | * Backbone.js 19 | * Mithril 20 | 21 | 22 | ## ブックマーク一覧をMVCで 23 | 24 | ![](./js-mvc-2.png) 25 | 26 | 27 | 1. http://heim.ifi.uio.no/~trygver/themes/mvc/mvc-index.html ^ 28 | 2. サーバーサイドでのMVCとは本来のMVCとは異なり、 MVC2などと呼ばれる ^ 29 | -------------------------------------------------------------------------------- /architecture/mvp.html: -------------------------------------------------------------------------------- 1 |
    2 | 3 | 4 | 5 |
    6 | 7 | -------------------------------------------------------------------------------- /architecture/mvp.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Bookmark のモデルクラス 3 | */ 4 | class Bookmark { 5 | 6 | /** 7 | * @param {String} url 8 | * @param {Date} created 9 | */ 10 | constructor (opts) { 11 | this.url = opts.url; 12 | this.created = opts.created; 13 | } 14 | 15 | /** 16 | * "n 分前" みたいな形式でブックマークした時刻を表示する 17 | * @return {String} 18 | */ 19 | getRelativeTime () { 20 | return moment(this.created).fromNow(); 21 | } 22 | 23 | } 24 | 25 | const BOOKMARK_TEMPLATE = _.template(` 26 |
  • 27 |

    url: <%- url %>

    28 | 29 |
  • 30 | `); 31 | 32 | class BookmarkView { 33 | 34 | constructor ($element) { 35 | this.$element = $element; 36 | this.$bookmarkList = $element.find('.bookmark-list'); 37 | this.$bookmarkUrl = $element.find('.bookmark-url'); 38 | this.$bookmarkButton = $element.find('.bookmark-button'); 39 | 40 | // ユーザー入力を加工してイベントを発火 41 | this.$bookmarkButton.on('click', () => { 42 | const url = this.$bookmarkUrl.val(); 43 | $(this).triggerHandler('addNewBookmark', url); 44 | }); 45 | } 46 | 47 | /** 48 | * @param {Array} bookmarks 49 | */ 50 | render (bookmarks) { 51 | this.$bookmarkList.empty(); 52 | bookmarks.forEach((bookmark) => { 53 | const html = BOOKMARK_TEMPLATE(bookmark); 54 | const $bookmark = $.parseHTML(html); 55 | this.$bookmarkList.append($bookmark); 56 | }); 57 | } 58 | 59 | } 60 | 61 | class BookmarksPresenter { 62 | 63 | /** 64 | * Model と View を初期化 65 | * View からユーザーのイベントを受け取る 66 | * Model を更新したら View に反映する 67 | */ 68 | constructor ($element) { 69 | this.bookmarks = []; 70 | this.view = new BookmarkView($element, this.bookmarks); 71 | $(this.view).on('addNewBookmark', (e, url) => this.addNewBookmark(url)); 72 | } 73 | 74 | /** 75 | * ユーザー入力を元に Model を更新し、 View に反映する 76 | */ 77 | addNewBookmark (url) { 78 | const bookmark = new Bookmark({ 79 | url : url, 80 | created : new Date(), 81 | }); 82 | this.bookmarks.push(bookmark); 83 | this.view.render(this.bookmarks); 84 | } 85 | 86 | } 87 | 88 | $(function(){ 89 | const presenter = new BookmarksPresenter($('.bookmarks')); 90 | }); 91 | -------------------------------------------------------------------------------- /architecture/others.md: -------------------------------------------------------------------------------- 1 | その他のアーキテクチャ 2 | ================================================================ 3 | 4 | 有名どころについて、概要だけ紹介。 5 | 6 | 7 | ## MVVM 8 | 9 | [![MVVMの概念図](https://upload.wikimedia.org/wikipedia/commons/8/87/MVVMPattern.png)](https://ja.wikipedia.org/wiki/Model_View_ViewModel) 10 | 11 | * 処理をModel, View, ViewModelに分類 12 | * ViewModel 13 | * Model 14 | * Presenterとの違い 15 | * Viewを明示的に更新しない 16 | * フレームワーク等により、 Viewが自動で更新される 17 | * 代表的なフレームワーク 18 | * Vue.js 19 | * Knockout.js 20 | 21 | 22 | ## MVP 23 | 24 | [![](http://cdn-ak.f.st-hatena.com/images/fotolife/n/nanto_vi/20150207/20150207142855.png)](http://developer.hatenastaff.com/entry/2015/02/13/121217) 25 | 26 | * 処理をModel, View, Presenterに分類 27 | * Presenter 28 | * ユーザー入力を受け取り、Modelを変更し、Viewを更新する 29 | * Viewの操作も行うControllerみたいなもの 30 | 31 | 32 | ## Flux 33 | 34 | [![Fluxの概念図](https://facebook.github.io/flux/img/overview/flux-simple-f8-diagram-with-client-action-1300w.png)](https://facebook.github.io/flux/docs/overview) 35 | 36 | * コンポーネント間の結合を薄くするため、グローバルなイベントを利用する 37 | * Observerパターンの一種 38 | * 代表的なフレームワーク 39 | * Redux 40 | * Fluxible 41 | -------------------------------------------------------------------------------- /async.md: -------------------------------------------------------------------------------- 1 | # 非同期プログラミング 2 | 3 | ## JSでの並列処理 4 | 5 | * JSはシングルスレッド 6 | * スレッドやプロセスなどの機構がない [1](#foot-1) [2](#foot-2) 7 | * 同時に2つのコードが実行されないのでロックとか不要 8 | * 1つの処理が実行中だと、他の処理は _全て止まる_ 9 | ```javascript 10 | while (true) alert(1); 11 | ``` 12 | 13 | ## 非同期プログラミング 14 | 15 | 複数のことを同時に処理するため **非同期プログラミング** を行う。 16 | 17 | 同期的に処理するとムダで遅い仕事も 18 | ![同期的処理の例](./async/async-sync.png) 19 | 20 | 非同期に処理すると効率よくて速い 21 | ![非同期処理の例](./async/async-async.png) 22 | 23 | 24 | ## JSでの非同期プログラミング方法 25 | 26 | * コールバック関数 27 | * イベント 28 | * Promise 29 | * その他 (Generator, Async Functions, Stream, etc...) 30 | 31 | 32 | 1. 最近は [Web Worker](https://developer.mozilla.org/ja/docs/Web/API/Web_Workers_API/Using_web_workers) がある ^ 33 | 2. Node.jsではマルチプロセスプログラミングが可能 ^ 34 | -------------------------------------------------------------------------------- /async/async-async.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hatena/Hatena-Textbook-JavaScript/7c59aa6783a759cc8c958ffaa7e636419f9e932b/async/async-async.png -------------------------------------------------------------------------------- /async/async-sync.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hatena/Hatena-Textbook-JavaScript/7c59aa6783a759cc8c958ffaa7e636419f9e932b/async/async-sync.png -------------------------------------------------------------------------------- /async/async.sketch: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hatena/Hatena-Textbook-JavaScript/7c59aa6783a759cc8c958ffaa7e636419f9e932b/async/async.sketch -------------------------------------------------------------------------------- /async/callback.md: -------------------------------------------------------------------------------- 1 | コールバックによる非同期処理 2 | ================================================================ 3 | 4 | GETリクエストを送信して結果を表示。 5 | 6 | Perlだと同期的に処理するが。 7 | ```perl 8 | my $ua = LWP::UserAgent->new; 9 | my $res = $ua->request(GET $url); # ここでブロック(待たされる) 10 | print($res->content); 11 | ``` 12 | 13 | JavaScriptだとこうなる。 14 | ```javascript 15 | $.get(url, (res) => { 16 | console.log(res); 17 | }); 18 | ``` 19 | 20 | - 通信中はブロックせず、この下に書かれたコードが実行される 21 | - 通信終了したらコールバックが呼び出される 22 | 23 | JavaScriptでは、さまざまな処理でコールバックを利用する。 24 | 25 | 例: ラーメンタイマー。 26 | ```javascript 27 | // 180秒後にalertする 28 | setTimeout(() => { 29 | alert('ラーメンできたよ!'); 30 | }, 180 * 1000); 31 | ``` 32 | 33 | 34 | ## コールバック地獄 35 | 36 | コールバックを利用する処理が重なると、どんどんネストが深くなっていき、読みづらいコードになる。 37 | 38 | ```javascript 39 | MongoClient.connect('mongodb://localhost:27017/rssDataBase', (err, db) => { 40 | fs.readFile('./feed.xml', 'utf8', (err, rssString) => { 41 | parseString(rssString, (err, result) => { 42 | const items = result.rss.channel[0].item; 43 | const data = []; 44 | items.forEach((item) => { 45 | request(item.link[0], (err, res) => { 46 | data.push({ 47 | url : res.request.href, 48 | body : res.body, 49 | }); 50 | if (data.length === items.length) { 51 | db.collection('entries').insertMany(data, (err, result) => { 52 | db.close(); 53 | }); 54 | } 55 | }); 56 | }); 57 | }); 58 | }); 59 | }); 60 | ``` 61 | -------------------------------------------------------------------------------- /async/event.md: -------------------------------------------------------------------------------- 1 | イベント 2 | ================================================================ 3 | 4 | ## イベントドリブン 5 | 6 | ブラウザからのイベントで処理を進める方式。 7 | 8 | * 😇 イベント発火まではCPUを食わない 9 | * 👿 コールバックを多用するので読みにくいかも 10 | * 👿 1つ1つの処理を小さくしないと、全部止まる 11 | * ブラウザの表示処理まで止まる 12 | 13 | 14 | ## DOMイベントの例 15 | 16 | - click 17 | - dblclick 18 | - mousedown 19 | - mousemove 20 | - keydown 21 | - load 22 | - etc... 23 | 24 | 参考: [DOM イベントリファレンス | MDN](https://developer.mozilla.org/ja/docs/Web2/Reference/Events) 25 | 26 | 27 | ## `addEventListener` 28 | 29 | * `element.addEventListener(eventName, callback, useCapture)` 30 | * ある要素のあるイベントに対してコールバックを設定する 31 | 32 | ```javascript 33 | document.body.addEventListener('click', function (e) { 34 | alert('clicked!'); 35 | }, false); 36 | ``` 37 | 38 | 参考: [EventTarget.addEventListener - Web API インターフェイス | MDN](https://developer.mozilla.org/ja/DOM/element.addEventListener) 39 | 40 | 41 | ## DOMイベントのイベントバブリング 42 | 43 | ```html 44 |

    Hello, world!

    45 | ``` 46 | 47 | - `inner` をクリックするとき、`outer` もクリックされている 48 | - イベントは実際に発生したノードから親に向かって浮上 (バブル) していく 49 | - 一部、バブリングしないイベントもある (`focus` `load` etc...) 50 | 51 | [](https://www.w3.org/TR/DOM-Level-3-Events/#event-flow) 52 | 53 | 54 | ## ページ読み込み時のイベント 55 | 56 | * `DOMContentLoaded` イベント 57 | * DOMの構築が終わったあとに発生 58 | * このイベント発生前にDOMをいじると壊れるので注意 59 | * `load` イベント 60 | * 画像など、ページ内のリソースを全部ロードしたら発生 61 | 62 | 初期化は次のように書くことが多い。 63 | ```javascript 64 | document.addEventListener('DOMContentLoaded', function (e) { 65 | var elem = document.getElementById("..."); 66 | // ... 67 | }); 68 | ``` 69 | 70 | 71 | ## イベントオブジェクトの構成要素 72 | 73 | ```javascript 74 | document.body.addEventListener('click', function (e) { 75 | alert(e.target); 76 | }); 77 | ``` 78 | 79 | コールバックに渡されるオブジェクト。 80 | 81 | - `target` : イベントのターゲット (クリックされた要素) 82 | - `clientX`, `clientY` : クリックされた場所の座標 83 | - `stopPropagation()` : イベントの伝播 (含むバブリング) をとめる 84 | - `preventDefault()` : イベントのデフォルトアクションをキャンセルする 85 | - デフォルトアクション : リンクのクリックイベントなら、「リンク先のページへ移動」 86 | 87 | 参考: [​event - Web API インターフェイス | MDN​](https://developer.mozilla.org/ja/docs/Web/API/Event) 88 | 89 | 90 | ## オブジェクトのメソッドをイベントハンドラとして使う 91 | 92 | - `this` が指す内容に注意 93 | - Arrow Functionを使えば大体問題ない 94 | 95 | ```javascript 96 | class Notifier { 97 | constructor (element, message) { 98 | this.message = message; 99 | 100 | // NG 101 | // `this` は `undefined` であり、エラーになる 102 | element.addEventListener('click', function () { 103 | this.notify(); 104 | }); 105 | 106 | // NG 107 | element.addEventListener('click', this.notify); 108 | 109 | // OK 110 | // `self` インスタンスへの参照を保持 111 | var self = this; 112 | element.addEventListener('click', function () { 113 | self.notify(); 114 | }); 115 | 116 | // OK 117 | // Arrow Function は自動的に `this` が bind される 118 | element.addEventListener('click', () => { 119 | this.notify(); 120 | }); 121 | } 122 | notify () { 123 | console.log(this.message); 124 | } 125 | } 126 | 127 | new Notifier(document.body, 'Clicked!'); 128 | ``` 129 | -------------------------------------------------------------------------------- /async/promise.md: -------------------------------------------------------------------------------- 1 | Promise 2 | ================================================================ 3 | 4 | ## Promise 5 | 6 | * ES2015で導入された 7 | * `then` のメソッドチェインでコールバック関数をつなげられるようにする 8 | * 最近のjQueryでも使える 9 | 10 | ```javascript 11 | $.get("http://example.com/aaa") 12 | .then((res) => { 13 | return JSON.parse(res.body); 14 | }) 15 | .then((obj) => { 16 | // ... 17 | }); 18 | ``` 19 | 20 | さっきのコードはこうなる。ちょっと読みやすくなる。 21 | ```javascript 22 | let db; 23 | MongoClient.connect('mongodb://localhost:27017/rssDataBase') 24 | .then((_db) => { 25 | db = _db; 26 | return fs.readFile('./feed.xml', 'utf8'); 27 | }) 28 | .then(rssString => parseString(rssString)) 29 | .then((result) => { 30 | const items = result.rss.channel[0].item; 31 | return Promise.all(items.map(item => request(item.link[0]))); 32 | }) 33 | .then((responses) => { 34 | return responses.map((res) => { 35 | return { 36 | url : res.request.href, 37 | body : res.body, 38 | }; 39 | }); 40 | }) 41 | .then((data) => { 42 | return db.collection('entries').insertMany(data); 43 | }) 44 | .then(() => { 45 | db.close(); 46 | }); 47 | ``` 48 | 49 | 使えるところではガンガン使っていこう。 50 | -------------------------------------------------------------------------------- /browser.md: -------------------------------------------------------------------------------- 1 | WebブラウザとJavaScript 2 | ================================================================ 3 | 4 | * Webアプリケーションは、JavaScriptだけでは作れない 5 | * JSで出来ること 6 | * DOM要素のアニメーション 7 | * フォームに入力されたデータをバリデーション 8 | * Webブラウザに実装されているDBにアクセス 9 | * 場合によってはJSを使わずに済むこともある 10 | * CSS Animationsでアニメーションしたり 11 | * `input` 要素自体のバリデーション機能を利用したり 12 | 13 | * 仕様を読むと楽しい 14 | * [HTML Standard (WHATWG による仕様)](http://www.whatwg.org/specs/web-apps/current-work/multipage/) 15 | * [W3C CSS 仕様](http://www.w3.org/Style/CSS/) 16 | -------------------------------------------------------------------------------- /browser/dom.md: -------------------------------------------------------------------------------- 1 | DOM 2 | ================================================================ 3 | 4 | ```javascript 5 | var source = document.getElementById('template').innerHTML; 6 | ``` 7 | 8 | * HTMLドキュメントの中身を操作しよう 9 | * ブラウザのAPIを知ろう 10 | * jQuery等ライブラリを使うとDOMを直接操作する機会は減るが、知っておく必要はある 11 | 12 | 13 | ## DOMとは 14 | 15 | * Document Object Modelの略 16 | * HTML文書をJSで操作するAPIを定めたもの 17 | * API: メソッドや定数といったインターフェイス 18 | 19 | 20 | ## DOMの基本的な考えかた 21 | 22 | ![](http://cdn-ak.f.st-hatena.com/images/fotolife/c/cho45/20100721/20100721183313.png) 23 | 24 | * 木構造 25 | * 一番上には `document` ノード (文書ノード) がある 26 | 27 | 28 | ## DOMの仕様 29 | 30 | * [DOM Standards](http://dom.spec.whatwg.org/) (WHATWG) 31 | * [DOM 4](http://www.w3.org/TR/dom/) (W3C) 32 | 33 | 最近はここら辺。 ここらへんの文書がどうなってるのかややこしい。 34 | 35 | * 通称DOM Level 0 = 標準化されてなかったものの総称 36 | * DOM Level 0の多くもHTML5で標準化されている 37 | * DOM Level 1 = とても基本的な部分 (Elementがどーとか) 38 | * DOM Level 2 = まともに使えるDOM (Eventsとか) 39 | * DOM Level 3 = いろいろあるが実装されてない 40 | 41 | 42 | ## DOMの構成要素 43 | 44 | * `Node` 45 | * 多くのDOMの構成要素のベースインターフェイス 46 | * `Element` 47 | * HTMLの要素を表現する 48 | * `Attr` 49 | * HTMLの属性を表現する 50 | * `Text` 51 | * HTMLの地のテキストを表現する 52 | * `Document` 53 | * HTMLのドキュメントを表現する 54 | * `DocumentFragment` 55 | * 文書木に属さない木の根を表現する 56 | 57 | - `Element` も `Text` も `Node` のサブインターフェイス 58 | - DOM 3までは `Attr` も `Node` だったがDOM 4では違う 59 | 60 | 61 | ## DOM API 62 | 63 | よく使うメソッドだけ紹介。 64 | 65 | * `document.createElement('div')` 66 | * 要素ノードをつくる 67 | * `document.createTextNode('text')` 68 | * テキストノードをつくる 69 | * `element.appendChild(node)` 70 | * 要素に子ノードを追加する 71 | * `element.removeChild(node)` 72 | * 要素の子ノードを削除する 73 | * `document.querySelector('.foo')` 74 | * 指定したCSSセレクタにマッチする最初の要素を得る 75 | * `document.querySelectorAll('.foo')` 76 | * 指定したCSSセレクタにマッチする要素を列挙 77 | * `element.cloneNode(true);` 78 | * 指定したノードを子孫ノード込みで複製 79 | 80 | 参考: [DOM リファレンス - DOM | MDN](https://developer.mozilla.org/ja/docs/DOM/DOM_Reference) 81 | 82 | 83 | ## 例: テキストノードを要素に追加する 84 | 85 | このようなページで。 86 | ```html 87 |
    88 | ``` 89 | 90 | 次のスクリプトを実行する。 91 | ```javascript 92 | // `
    foobar
    ` を作成 93 | var elementNode = document.createElement('div'); 94 | var textNode = document.createTextNode('foobar'); 95 | elementNode.appendChild(textNode); 96 | 97 | // 文書木に追加 98 | var containerNode = document.getElementById('container'); 99 | containerNode.appendChild(elementNode); 100 | ``` 101 | 102 | 結果。 103 | 104 | ```html 105 |
    106 |
    foobar
    107 |
    108 | ``` 109 | 110 | - ブラウザの画面に表示されるのは文書木 (document tree) に属するノード 111 | - ノードを作った段階では、そのノードはまだ文書木に属していない 112 | - 文章木に追加するとすぐに表示に反映される 113 | -------------------------------------------------------------------------------- /deploy.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # GitHub Actions上でgitbookをビルドするスクリプト 3 | # 参考: https://gist.github.com/domenic/ec8b0fc8ab45f39403dd 4 | set -eux 5 | 6 | SOURCE_BRANCH="master" 7 | TARGET_BRANCH="gh-pages" 8 | COMMIT_MESSAGE="Rebuild by CI" 9 | COMMIT_AUTHOR_NAME="hatenabot" 10 | COMMIT_AUTHOR_EMAIL="platform+githubhatenabot@hatena.ne.jp" 11 | REPO=$(git config remote.origin.url) 12 | 13 | # masterブランチかどうかチェック 14 | deploy_check_branch() { 15 | # gh-pagesブランチではビルドしない 16 | if [ "$GITHUB_REF" == "refs/heads/$TARGET_BRANCH" ]; then 17 | echo "Skipping deploy; branch is '$TARGET_BRANCH'" 18 | exit 0 19 | fi 20 | # master以外のブランチでは、ビルドが通るかだけチェックする 21 | if [ "$GITHUB_REF" != "refs/heads/$SOURCE_BRANCH" ]; then 22 | echo "Skipping deploy; just doing a build." 23 | npm run build 24 | exit 0 25 | fi 26 | } 27 | 28 | # gh-pagesブランチをclone 29 | deploy_clone() { 30 | git clone $REPO docs 31 | cd docs 32 | git checkout $TARGET_BRANCH 33 | cd .. 34 | } 35 | 36 | # gitbookをビルドする 37 | # ビルド結果にdiffがなければ終了する 38 | deploy_build() { 39 | npm run build 40 | cd docs 41 | if git diff --quiet; then 42 | echo "No changes to the output on this push; exiting." 43 | exit 0 44 | fi 45 | cd .. 46 | } 47 | 48 | # ビルド結果をcommit & push 49 | deploy_push() { 50 | cd docs 51 | git config user.name "$COMMIT_AUTHOR_NAME" 52 | git config user.email "$COMMIT_AUTHOR_EMAIL" 53 | git add -A . 54 | git commit -m "$COMMIT_MESSAGE" 55 | git push $REPO $TARGET_BRANCH 56 | } 57 | 58 | # 後始末 59 | deploy_reset() { 60 | unset -f deploy_check_branch deploy_clone deploy_build deploy_push deploy_reset 61 | } 62 | 63 | # 終了時にdeploy_resetする 64 | # bashの場合、SIGINT/SIGTERMが送られてもEXITが走る 65 | trap deploy_reset EXIT 66 | 67 | deploy_check_branch 68 | deploy_clone 69 | deploy_build 70 | deploy_push 71 | -------------------------------------------------------------------------------- /deploy_key.enc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hatena/Hatena-Textbook-JavaScript/7c59aa6783a759cc8c958ffaa7e636419f9e932b/deploy_key.enc -------------------------------------------------------------------------------- /exercise.md: -------------------------------------------------------------------------------- 1 | 課題4 2 | ================================================================ 3 | 4 | ## ライブラリについて 5 | 6 | - 任意のライブラリの使用を許可します 7 | - ライブラリの挙動は理解しておくこと! 8 | - おすすめはjQuery, underscorejs 9 | - jQuery検索用キーワード 10 | - click 11 | - on('scroll', ... 12 | - ajax 13 | - append 14 | - html 15 | -------------------------------------------------------------------------------- /exercise/ex1-hint-perl.md: -------------------------------------------------------------------------------- 1 | 課題4-1のヒント (Perl編) 2 | ================================================================ 3 | 4 | ## JavaScriptの配置と読み込み 5 | 6 | - `static/js` ディレクトリにファイルを置くこと 7 | - `static/js/main.js` を作成した場合、以下のようにロードする 8 | 9 | ```html 10 | 11 | ``` 12 | 13 | ## JSONへのエンコード 14 | 15 | JSON形式のデータを構築するためのライブラリはいくつかあるが、ここでは [`JSON::XS`](https://metacpan.org/module/JSON::XS) を利用する。 16 | 17 | ```perl 18 | use JSON::XS; 19 | my $user = { user_id => 42, name => 'example-user' }; 20 | my $json_string = JSON::XS::encode_json($user); 21 | ``` 22 | 23 | - `JSON::XS` は `bless` されたオブジェクトをJS 24 | - `JSON::Types` などを用い、プレーンなHashRefを作って渡す 25 | - 例: あるクラスのインスタンスをJSON形式でシリアライズしたい場合 26 | - モデルクラスに `json_hash` のようなメソッドを生やす 27 | 28 | ```perl 29 | package Inter::Diary::Model::User; 30 | use strict; 31 | use warnings; 32 | 33 | use JSON::Types (); 34 | use Class::Accessor::Lite ( 35 | ro => [qw(user_id name)], 36 | new => 1, 37 | ); 38 | 39 | sub json_hash { 40 | my ($self) = @_; 41 | return +{ 42 | user_id => JSON::Types::number $self->user_id, 43 | name => JSON::Types::string $self->name, 44 | }; 45 | } 46 | ``` 47 | 48 | ```perl 49 | require JSON::XS; 50 | my $user = Intern::Diary::Model::User->new( 51 | user_id => 42, 52 | name => 'example-user', 53 | ); 54 | my $json_string = JSON::XS::encode_json($user->json_hash); 55 | ``` 56 | 57 | ## JSONからのデコード 58 | 59 | エンコードの場合と同じく [`JSON::XS`](https://metacpan.org/module/JSON::XS) でデコードできる。 60 | 61 | ```perl 62 | require JSON::XS; 63 | my $json_string = '{"user_id": 42, "name":"example-user"}'; 64 | my $user_hash = JSON::XS::decode_json($json_string); # プレーンなハッシュリファレンスが返る 65 | my $user = Intern::Diary::Model::User->new($user_hash); # ハッシュリファレンスからモデルのインスタンスを作る 66 | ``` 67 | 68 | ## コントローラの実装 69 | 70 | - コントローラに渡される `$c` を使うと、簡単にJSON形式のレスポンスを返せる 71 | - Hatena::Newbieのコンテキストオブジェクト 72 | - `$c->html()` の代わりに `$c->json()` を呼ぶと、 HTMLではなくJSON形式のレスポンスが返る 73 | - 内部で `JSON::XS` を使っている 74 | - やはり `bless` されている値は渡せない 75 | 76 | ```perl 77 | package Intern::Diary::Engine::API; 78 | use strict; 79 | use warnings; 80 | 81 | sub user { 82 | my ($class, $c) = @_; 83 | my $user = { user_id => 42, name => 'example-user' }; 84 | $c->json($user); 85 | } 86 | ``` 87 | -------------------------------------------------------------------------------- /exercise/ex1-hint-scala.md: -------------------------------------------------------------------------------- 1 | 課題4-1のヒント (Scala編) 2 | ================================================================ 3 | 4 | ## JavaScriptの配置と読み込み 5 | 6 | - `src/main/webapp/javascripts` ディレクトリにファイルを置くこと 7 | - `src/main/webapp/javascripts/main.js` を作成した場合、以下のようにロードする 8 | 9 | ```scala 10 | 11 | ``` 12 | 13 | ## JSONへのエンコード 14 | 15 | - JSON形式のデータを構築するためのライブラリがいくつかあるが、 Intern-Bookmarkでは [json4s](http://json4s.org/) を利用する 16 | - 以下のようなコードで `case class` のインスタンスをJSON形式にエンコードできる 17 | 18 | ```scala 19 | scala> case class User(id: Long, name: String) 20 | defined class User 21 | 22 | scala> implicit val formats = org.json4s.DefaultFormats 23 | formats: org.json4s.DefaultFormats.type = org.json4s.DefaultFormats$@1d4a4f9e 24 | 25 | scala> org.json4s.jackson.Serialization.write(User(id = 42L, name = "example-user")) 26 | res0: String = {"id":42,"name":"example-user"} 27 | ``` 28 | 29 | - `implicit` 宣言されている `formats` オブジェクトに基づいてシリアライズが行われる 30 | - 多くの場合、 json4sに付属の `DefaultsFormats` オブジェクトをそのまま利用するだけで十分 31 | - `DefaultsFormats` が対応していない型のオブジェクトをシリアライズする場合、カスタマイズすることもできる 32 | 33 | - Intern-Bookmarkの `internbookmark.service.Json` オブジェクトの定義は以下のとおり 34 | - `LocalDateTime` 型や `Long` 型の値のシリアライズ方式を独自に設定している 35 | - Intern-Diaryの実装でも、このオブジェクトと同じ実装が利用できる 36 | 37 | ```scala 38 | package internbookmark.service 39 | 40 | import org.joda.time.LocalDateTime 41 | import org.json4s._ 42 | 43 | object Json { 44 | val Formats = DefaultFormats + LocalDateTimeSerializer + LongIdSerializer 45 | } 46 | 47 | class object LongIdSerializer extends CustomSerializer[Long](format => ( 48 | { case JString(s) => s.toLong }, 49 | { case x: Long => JString(x.toString) } 50 | )) 51 | 52 | case object LocalDateTimeSerializer extends CustomSerializer[LocalDateTime](format => ( 53 | { 54 | case JInt(s) => new LocalDateTime(s.toLong) 55 | case JNull => null 56 | }, 57 | { 58 | case d: LocalDateTime => JInt(BigInt(d.toDateTime().getMillis)) 59 | } 60 | )) 61 | ``` 62 | 63 | ## JSONからのデコード 64 | 65 | - エンコードと同じく [json4s](http://json4s.org/) を利用する 66 | - `parse` メソッドでJSONを解析して読み込んだあと、 `extractOpt` メソッドなどを用いてデータを読み込む 67 | 68 | ```scala 69 | scala> val json = org.json4s.jackson.JsonMethods.parse("""{"id":42,"name":"example-user"}""") 70 | json: org.json4s.JValue = JObject(List((id,JInt(42)), (name,JString(example-user)))) 71 | 72 | scala> (json \ "id").extractOpt[Int] 73 | res1: Option[Int] = Some(42) 74 | 75 | scala> (json \ "name").extractOpt[String] 76 | res2: Option[String] = Some(example-user) 77 | 78 | scala> (json \ "no-such-key").extractOpt[String] // キーが存在しない場合 79 | res3: Option[String] = None 80 | 81 | ``` 82 | 83 | ## コントローラの実装 84 | 85 | - Scalatraではjson4sが組込まれており、リクエストからJSONを読み込んで、レスポンスとしてJSONを返すようなコントローラを簡単に実装できる 86 | - 自分で `parse` したり `write` したりする必要はない 87 | 88 | - 以下のコードはIntern-Bookmarkの `internbookmark.web.BookmarkAPIWeb` traitから抜粋したもの 89 | - `internbookmark.web.BookmarkWeb` にmixinして利用されている 90 | 91 | ```scala 92 | 93 | // ... 94 | 95 | // JacksonJsonSupport を継承する必要がある 96 | trait BookmarkAPIWeb extends JacksonJsonSupport { self: BookmarkWeb with AppContextSupport => 97 | protected implicit val jsonFormats: Formats = 98 | internbookmark.service.Json.Formats // json4sが使うFormatsをoverrideして設定しておく 99 | 100 | // ... 101 | 102 | post("/api/bookmark") { 103 | contentType = formats("json") // Content-Typeヘッダを application/json に設定 104 | val json = parsedBody // リクエストボディをパースしてjson4s.JValueオブジェクトを取得 105 | 106 | val app = createApp() 107 | 108 | // extractOpt を利用してリクエストからデータを取得 109 | val req = for { 110 | url <- (json \ "url").extractOpt[String].toRight(BadRequest()).right 111 | comment <- Right((json \ "comment").extractOrElse("")).right 112 | bookmark <- app.add(url, comment).left.map(_ => InternalServerError()).right 113 | } yield bookmark 114 | 115 | req match { 116 | case Right(bookmark) => bookmark // jsonFormatsが変換できる値であれば、そのまま返すことでJSONに変換される 117 | case Left(errorResult) => errorResult.copy( // 明示的にJValue型の値を返してもよい 118 | body = JObject("error" -> JString(errorResult.status.message))) 119 | } 120 | } 121 | } 122 | ``` 123 | 124 | 参考: [Scalatra のドキュメント](http://www.scalatra.org/2.4/guides/formats/json.html) 125 | -------------------------------------------------------------------------------- /exercise/ex1.md: -------------------------------------------------------------------------------- 1 | 課題4.1 2 | ================================================================ 3 | 4 | 記事一覧をJavaScriptによって動的に描画せよ。 5 | 6 | ## 課題の目的 7 | 8 | * JavaScriptによるサーバーとの通信ができるようになる 9 | * サーバーサイドでJSON APIを作成 10 | * JSからAPIを叩く 11 | 12 | ## 仕様 13 | 14 | * 記事一覧の情報をJSONで返すAPIを作成する 15 | * レスポンスには記事の本文も含めること 16 | * 記事を全件一気に返さず、一定の記事数毎にページングするように 17 | * URIやパラメータ、 ページ毎の記事数などは自由 18 | * 上で作成したAPIをJSから叩いて、記事一覧を表示するページを作成する 19 | * Ajax用ライブラリ使用可 20 | * HTML中には記事の情報を含んでないページを作って、JSで動的に記事を表示する 21 | * JSでは最低限 (APIが返す) 最初のページを表示するように 22 | * ページのURIは自由 23 | -------------------------------------------------------------------------------- /exercise/ex2.md: -------------------------------------------------------------------------------- 1 | 課題4.2 2 | ================================================================ 3 | 4 | 日本の伝統的アプリケーション「マウスストーカー」を作れ。 5 | 6 | ## 課題の目的 7 | 8 | * ユーザーによる入力のハンドリングができるようになる 9 | * ユーザー体験を考慮した実装ができるようになる 10 | * 動きの良さ 11 | * ガタガタしないとか 12 | * 少し遅れてついてくるとか 13 | * 使っていて楽しいこと!! 14 | 15 | 16 | ## マウスストーカーとは 17 | 18 | - ホームページに配置してホームページを楽しくするアプリケーション 19 | - マウスストーカーで検索 20 | - http://ameblo.jp/maman44/entry-11134501119.html 21 | - http://plusone.jpn.org/javascript/sample/mouse/kuma/mskuma.html 22 | - http://oekakirenn.webcrow.jp/mouse_setumei.html 23 | 24 | 25 | ## 仕様 26 | 27 | - マウスカーソルの動きに反応し、小さい画像などがマウスカーソルを置いかける 28 | - `$(LANG)-Intern-Diary-2015-private/mouseStalker` というディレクトリを作り、その中に `main.html` と `main.js` を作ってください 29 | 30 | 31 | ## ヒント 32 | 33 | + `mousemove` イベント 34 | + 小さい画像などを表示 35 | + CSSで小さい画像などの位置を指定 36 | -------------------------------------------------------------------------------- /exercise/ex3.md: -------------------------------------------------------------------------------- 1 | 課題4.3 (オプション課題) 2 | ================================================================ 3 | 4 | * ブログに機能を追加せよ 5 | * 課題1で作ったものに手を加えてもいいし、別のページに手を加えても良い 6 | * JSを使った機能であること 7 | * サーバーサイドに手を入れても良い 8 | * サーバーサイドだけに手を入れた機能はだめ 9 | 10 | 11 | ## 課題の目的 12 | 13 | * サービスに必要な機能を、自分で考えて実現できる 14 | * 新しいコードを追加する際に、既存のコードとの調和をとることができる 15 | * 適切な場所にコードを書く 16 | * 必要に応じて抽象化を行う 17 | 18 | 19 | ## たとえば 20 | 21 | * JSで記事一覧をページングできるようにする 22 | * ページングの仕組みはいろいろ 23 | * 古い記事一覧を残したままどんどん追加したり 24 | * 記事一覧ページ全体を入れ替えたり 25 | * ページ遷移せずに新しい記事の投稿をしたり編集したりする 26 | * コメントをその場で投稿する 27 | * マウスストーカーが表示される 28 | * 記事を英語に飜訳する 29 | * 記事をローマ時に変換する 30 | * etc... 31 | -------------------------------------------------------------------------------- /jquery-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hatena/Hatena-Textbook-JavaScript/7c59aa6783a759cc8c958ffaa7e636419f9e932b/jquery-logo.png -------------------------------------------------------------------------------- /jquery.md: -------------------------------------------------------------------------------- 1 | jQuery 2 | ================================================================ 3 | 4 | Node.js logo 5 | 6 | * 世界的によく使われているライブラリ 7 | * クロスブラウザ対応 8 | * 便利機能なんでもあり 9 | * セレクタ、DOM操作、CSS、イベント、アニメーション、Ajax、リスト操作、…… 10 | * 最近はアンチ意見も多い 11 | 12 | 13 | jQueryの使い方 14 | ---------------------------------------------------------------- 15 | 16 | ### jQueryについて調べる 17 | 18 | - 公式ドキュメント http://api.jquery.com/ 19 | - 他のサイトはできるだけ見ない! 20 | - jQuery周辺は古い情報が溢れてる 21 | 22 | 23 | ### jQueryを使う 24 | 25 | - この講義ではCDNからロードします 26 | - 実際のサービスでは他のJSと結合して配信したり社内CDNを使ったりする 27 | 28 | ```html 29 | 30 | 31 | 32 | 33 | ``` 34 | 35 | ロードしたらこのように使える。 36 | 37 | ```javascript 38 | // window.jQuery または window.$ で参照できる 39 | window.jQuery === window.$; // true 40 | 41 | // 文書読み込み完了時に関数を実行 42 | $(function ($) { ... }); 43 | 44 | // CSS セレクタで要素を選択し、 45 | // それらの要素が含まれる jQuery オブジェクトを作成 46 | $('.foo'); 47 | 48 | // CSS セレクタで選択した要素のうち、最初の DOM オブジェクトを得る 49 | $('.foo')[0]; 50 | 51 | // 以下は雰囲気は同じ 52 | $('.foo').html(); 53 | $('.foo')[0].innerHTML; 54 | 55 | // HTML 文字列から DOM 要素を作成し 56 | // その要素をラップする jQuery オブジェクトを作成 57 | var p = $.parseHTML('

    HTML fragment

    '); 58 | var $p = $(p); 59 | ``` 60 | 61 | 62 | ### jQueryオブジェクト 63 | 64 | * `jQuery` 関数は `jQuery` オブジェクトを返す 65 | * `jQuery` オブジェクトは何らかの要素のコレクション 66 | * 普通はDOMノード 67 | * 中身が0個のこともある 68 | * 中身はただのオブジェクトであることもある 69 | 70 | ```javascript 71 | var obj = $({ name: "ababa" }); 72 | obj.on("click", (event) => { 73 | alert(event); 74 | }); 75 | obj.trigger("click"); // alert が表示される 76 | ``` 77 | 78 | 79 | ### DOM操作 80 | 81 | jQueryオブジェクトはDOM操作の為のAPIを持つ。 82 | 83 | - ページ内のh1タグのテキストを変更する 84 | 85 | ```javascript 86 | $('h1').text('foo'); 87 | ``` 88 | 89 | - ページ内のh1タグに画像を挿入する 90 | 91 | ```javascript 92 | $('h1').append($('').attr('src','http://〜〜')); 93 | ``` 94 | 95 | - DOM要素を直接参照することもできる 96 | 97 | ```javascript 98 | $('div').eq(0).html() === $('div')[0].innerHTML; 99 | ``` 100 | 101 | 102 | ### イベント処理 103 | 104 | - イベント監視: `on` 105 | - 他にも色々あるけど、 `on` に統一するのが最近の主流 106 | - イベント発火: `trigger` `triggerHandler` 107 | - 自作オブジェクトに対しイベント発火するときは `triggerHandler` を使おう 108 | - 参考: [hitode909の日記](http://blog.sushi.money/entry/2013/11/24/174809) 109 | 110 | ```javascript 111 | // foo クラスを持つ要素の click イベントを指定 112 | // イベントを登録する要素は実行時点で存在したもののみ 113 | $('.foo').on('click', (event) => { ... }); 114 | 115 | // 実行時点で存在したかに関わらず 116 | // document 内の foo クラスを持つ全要素の click イベントを監視 117 | $(document).on('click', '.foo', (event) => { ... }); 118 | 119 | // マウスが動いたらalert (うざい) 120 | $(document).on('mousemove', () => alert('スクロールしました')); 121 | 122 | // イベントを人工的に発火させることもできる 123 | $(document).trigger('mousemove'); 124 | ``` 125 | 126 | 127 | ### jQueryを使ったページの初期化の流れ 128 | 129 | + ページが読まれたら 130 | + 何かセレクタで要素を集めて 131 | + イベントハンドラを設定 132 | 133 | ```javascript 134 | // ページが読み込まれたときに 135 | $(() => { 136 | alert('おはようございます'); 137 | }); 138 | ``` 139 | 140 | ```javascript 141 | // ページ読み込み完了後、 142 | $(() => { 143 | // p 要素がクリックされたら alert を表示する 144 | $('p').on('click', () => { 145 | alert('おはようございます'); 146 | }); 147 | }); 148 | ``` 149 | 150 | ```javascript 151 | // ページ読み込み完了後、 152 | $(() => { 153 | // p 要素がクリックされたら、 154 | $('p').on('click', (e) => { 155 | // クリックされた p の内容を変更 156 | $(e.currentTarget).text('おはようございます'); 157 | }); 158 | }); 159 | ``` 160 | 161 | ### Ajax 162 | 163 | * jQueryにはAjax用のメソッドも入ってる 164 | * ver 1.8よりPromiseベースに 165 | 166 | #### $.ajax 167 | 168 | ```javascript 169 | $.ajax({ 170 | url : '/entry', 171 | method : 'POST', 172 | data : { 173 | userId : newEntry.userId, 174 | body : newEntry.body, 175 | }, 176 | }) 177 | .then(() => { 178 | console.log('POST succeeded!'); 179 | }); 180 | ``` 181 | 182 | #### $.get, $.post 183 | 184 | `$.ajax` のエイリアス。 185 | 186 | ```javascript 187 | $.get(url); 188 | $.post(url, { body: 'foo' }); 189 | ``` 190 | 191 | 192 | 複雑な要素をページに挿入したい 193 | ---------------------------------------------------------------- 194 | 195 | - たとえば、ブログのエントリをJSで出したいとき、ブログのエントリをJSで組み立てるのは大変 196 | - createElement + appendChildしまくってもできるけど読みにくい 197 | 198 | ```html 199 |
    200 |
    201 |

    202 |
    203 |
    204 |
    205 |
    206 |
    207 | ``` 208 | 209 | ```javascript 210 | var $article = $('
    ').addClass('article'); 211 | $article.append($('
    ').addClass('date').text(date)); 212 | $article.append($('

    ').addClass('title').text(title)); 213 | $article.append($('
    ').addClass('body').text(body)); 214 | $article.append($('
    ').addClass('comments')); 215 | var $comments = $('
    ').addClass('comments'); 216 | 217 | for (var i = 0; i < comments.length; i++) { 218 | $comments.append($('
    ').addClass('comment')); 219 | } 220 | 221 | $article.append($comments); 222 | $('.articles').append($article); 223 | ``` 224 | 225 | - テンプレートを使うときれいに書ける 226 | - underscore.jsの [`_.template`](http://underscorejs.org/#template) を使ったり 227 | - テンプレートリテラルを使ったり 228 | 229 | ```javascript 230 | // _.template を使う 231 | var template = _.template($('.article-template').html()); 232 | $('.articles').append($(template({ article: article }))); 233 | 234 | // テンプレートリテラル 235 | const renderArticle = (article) => ` 236 |
    237 |
    ${article.title}
    238 |
    ${article.body}
    239 | ... 240 |
    241 | `.trim(); 242 | 243 | var article = $.parseHTML(renderArticle(article)); 244 | $('.articles').append(article); 245 | ``` 246 | 247 | - サーバーサイドでHTMLを組み立ててから返してもよい 248 | - Template Toolkitを使う 249 | -------------------------------------------------------------------------------- /language.md: -------------------------------------------------------------------------------- 1 | JavaScript言語について 2 | ================================================================ 3 | 4 | Node.js logo 5 | 6 | ## 言語的特徴 7 | 8 | * 動的型付け 9 | * 関数も値の一種 10 | * C-likeな文法 11 | * プロトタイプベースの継承構造 12 | * 近年Class構文が追加された 13 | * 言語のコア部分はECMAScriptとして標準化されている 14 | * [JavaScript と ECMAScript 仕様について (JavaScript Overview - MDN)](https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Introduction#JavaScript_and_the_ECMAScript_Specification) 15 | * ECMAScript最新仕様は [ECMAScript® 2016 Language Specification](http://www.ecma-international.org/ecma-262/7.0/) 16 | 17 | 以下では、ECMAScript2016をベースに、JavaScriptという言語自体について解説します。 18 | -------------------------------------------------------------------------------- /language/class.md: -------------------------------------------------------------------------------- 1 | クラス 2 | ================================================================ 3 | 4 | ## プロトタイプ継承 5 | 6 | * オブジェクトそのものが別のオブジェクトを継承できる 7 | * プロパティにアクセスされた時、指定のプロパティを持っていない場合は継承先を探索 8 | * 継承先がなくなるまで続く 9 | 10 | ```javascript 11 | var foo = { 12 | name: "foo" 13 | }; 14 | // `foo` を継承した `bar` を生成 15 | var bar = Object.create(foo); 16 | bar.name; // "foo" 17 | 18 | bar.name = "bar"; 19 | bar.name; // "bar" 20 | foo.name; // "foo" 21 | ``` 22 | 23 | ![プロトタイプ](./js-prototype-1.png) 24 | 25 | 26 | ## プロトタイプチェイン 27 | 28 | ![プロトタイプチェイン](./js-prototype-2.png) 29 | 30 | * 暗黙的参照は既定オブジェクトである `Object` まで暗黙的な参照を持っている 31 | * あえて壊すことはできる 32 | 33 | ```javascript 34 | Object.getPrototypeOf({}); // Object.prototype 35 | Object.getPrototypeOf(Object.prototype); // null 36 | Object.getPrototypeOf(null); // TypeError 37 | ``` 38 | 39 | 40 | ## JavaScriptにおけるクラス 41 | 42 | JavaScriptのクラスの正体は関数。 43 | 44 | * 関数を `new` を付けて呼び出すと、コンストラクタとして作用する 45 | * 新しいオブジェクトを生成する 46 | * 生成したオブジェクトを `this` に束縛してコンストラクタの中身を実装する 47 | * 生成されたオブジェクトは、コンストラクタの `prototype` をプロトタイプ継承している 48 | 49 | ```javascript 50 | // Foo コンストラクタ 51 | var Foo = function () { 52 | // プロパティ定義 53 | // この `this` は、新しく生成されたオブジェクトを指す 54 | this.price = 100; 55 | 56 | // これはコンストラクタ終了後破棄される 57 | var price = 100; 58 | }; 59 | 60 | // メソッド定義 61 | Foo.prototype.sayHello = function () { 62 | alert('hello!'); 63 | }; 64 | Foo.prototype.getPrice = function () { 65 | return this.price; 66 | }; 67 | 68 | // `foo` は `Foo` コンストラクタのインスタンス (`Foo` オブジェクト) 69 | var foo = new Foo(); 70 | foo.sayHello(); //=> 'hello!' 71 | var price = foo.getPrice(); 72 | console.log(price); //=> 100 73 | ``` 74 | 75 | 76 | ## クラスの継承 77 | 78 | - クラスの継承にもプロトタイプ継承を利用できる 79 | - 親のコンストラクタのプロトタイプを継承すればよい 80 | 81 | ```javascript 82 | var SuperClass = function (name) { 83 | this.name = name; 84 | }; 85 | SuperClass.prototype.foo = function () { return 'Super : foo'; }; 86 | SuperClass.prototype.bar = function () { return 'Super : bar'; }; 87 | 88 | var SubClass = function (name) { 89 | SuperClass.call(this, name); // 親クラスのコンストラクタを呼び出す 90 | }; 91 | 92 | // prototypeを継承 93 | SubClass.prototype = Object.create(SuperClass.prototype); 94 | 95 | // 子クラスのメソッドを定義 96 | SubClass.prototype.foo = function () { return 'Sub : Foo'; }; 97 | 98 | var sub = new SubClass('sub1'); 99 | ``` 100 | 101 | 102 | ## `Class` 構文 103 | 104 | - ES2015で `Class` 構文が導入された 105 | - これまでのコンストラクタのシンタックスシュガー 106 | 107 | これが。 108 | ```javascript 109 | var Foo = function (name) { 110 | this.name = name; 111 | }; 112 | Foo.prototype.sayHello = function () { 113 | alert('hello!'); 114 | }; 115 | ``` 116 | 117 | こうかける。 118 | ```javascript 119 | class Foo { 120 | constructor (name) { 121 | this.name = name; 122 | } 123 | 124 | sayHello () { 125 | alert('hello!'); 126 | } 127 | } 128 | ``` 129 | 130 | - 継承も簡単 131 | - `super()` で親クラスのコンストラクタを呼び出す 132 | - `super.foo` で親クラスのメソッドを呼び出し 133 | 134 | ```javascript 135 | class Foo { 136 | constructor (name) { 137 | this.name = name; 138 | } 139 | 140 | sayFoo () { 141 | console.log(`Foo I'm ${this.name}`); 142 | } 143 | } 144 | 145 | class Bar extends Foo { 146 | constructor (name) { 147 | super(name); 148 | } 149 | 150 | sayFooBar () { 151 | super.sayFoo(); 152 | console.log('BarBarBar'); 153 | } 154 | } 155 | 156 | new Bar('bar').sayFooBar(); 157 | // Foo I'm bar 158 | // BarBarBar 159 | ``` 160 | 161 | - 使える環境ではガンガン使っていこう 162 | - 課題でも使ってOK 163 | -------------------------------------------------------------------------------- /language/function.md: -------------------------------------------------------------------------------- 1 | 関数 2 | ================================================================ 3 | 4 | ## 関数は値 5 | 6 | * JSでは関数は値 7 | * `Function` クラスのオブジェクト 8 | * 第一級のオブジェクトというやつ 9 | * 変数に代入できる 10 | * 関数の引数として関数を渡せる 11 | 12 | ```javascript 13 | // 変数に代入できる 14 | var fun = function (msg) { 15 | console.log(`${fun.bar} ${msg}`); 16 | }; 17 | 18 | // プロパティを持てる 19 | fun.bar = 'foo'; 20 | fun('bar'); // 'foo bar' 21 | 22 | // 関数の引数として関数を渡せる 23 | var say = function (callback) { 24 | console.log(`SAY ${callback()} !!!`); 25 | }; 26 | var ho = function () { 27 | return 'HO'; 28 | }; 29 | say(ho); // SAY HO !!! 30 | ``` 31 | 32 | より一般的な例。 33 | ```javascript 34 | [1, 2, 3].forEach(function (i) { 35 | console.log(i * 2); 36 | }); 37 | ``` 38 | 39 | 40 | ## 関数の定義 41 | 42 | 関数宣言と関数式がある。 43 | 44 | ### 関数宣言 45 | 46 | - 関数を定義し、関数名と同じ名前の変数に代入する 47 | - 変数の宣言と違い、関数本体も巻き上げられる 48 | 49 | ```javascript 50 | function add (x, y) { 51 | return x + y; 52 | } 53 | ``` 54 | 55 | ### 関数式 56 | 57 | - 関数を定義して返す 58 | - 変数に代入したり、コールバック関数として関数の引数に渡して使う 59 | 60 | ```javascript 61 | var add = function (x, y) { 62 | return x + y; 63 | }; 64 | ``` 65 | 66 | ### 関数宣言と関数式の使い分け 67 | 68 | これらは、定義した関数を呼べるようになるタイミングが異なる。 69 | 70 | - 関数宣言: 宣言の位置より上で関数を呼べる 71 | ```javascript 72 | foo(); // 'Hi' 73 | 74 | function foo () { console.log('Hi'); } 75 | ``` 76 | - 関数式: 変数へ代入するまで呼べない 77 | ```javascript 78 | foo(); // ReferenceError: foo is not defined 79 | 80 | var foo = function () {}; 81 | ``` 82 | 83 | 84 | ## 引数の受け取り 85 | 86 | * かっこの中に書く 87 | * 値を返すときはreturn必須 88 | 89 | ```javascript 90 | function add (v1, v2) { 91 | return v1 + v2; 92 | } 93 | ``` 94 | 95 | 96 | ## `this` キーワード 97 | 98 | * `this` という、暗黙的に渡される引数のようなものがある 99 | * 普通はレシーバーが渡される 100 | * レシーバー: `foo.bar()` の `foo` のこと 101 | 102 | ```javascript 103 | var a = { 104 | foo : function () { 105 | console.log(this === a); 106 | } , 107 | }; 108 | a.foo(); // true (this は a を指す) 109 | a.foo.call({}); // false (this は {} を指す) 110 | ``` 111 | 112 | ### ハマりどころ 113 | 114 | * `this` の値は呼び出し時に決定する 115 | * オブジェクトのプロパティに持たせた関数を別の関数のコールバックに設定したら、 `this` が期待する値にならなくてハマる 116 | 117 | ```javascript 118 | var obj = { 119 | name: "Hatena", 120 | sayMyName: function () { 121 | alert(this.name); 122 | }, 123 | }; 124 | 125 | // "Hatena" が alert される 126 | obj.sayMyName(); 127 | 128 | // `function() { alert(this.name) };` だけを渡していることになり、 129 | // "Hatena" でない文字列が alert される 130 | setTimeout(obj.sayMyName, 100); 131 | 132 | // この様に `call` で `name`プロパティを含む `this`を指定してあげると、"Hatena-kyoto"という文字列が alert される 133 | 134 | setTimeout(function () { 135 | obj.sayMyName.call({name: "Hatena-kyoto"}); 136 | } , 1000); 137 | 138 | // applyでも良い 139 | setTimeout(function () { 140 | obj.sayMyName.apply({name: "Hatena-kyoto"}); 141 | }, 1000); 142 | ``` 143 | 144 | ## `this` を書き換える方法 145 | 146 | * apply / call 147 | * 関数の `this` を書き換えて呼び出す 148 | * bind 149 | * 関数の `this` を書き換えた関数を返す 150 | 151 | ```javascript 152 | var nodes = document.querySelectorAll('div'); // nodes[0] とかあるのに、sliceが使えない! 153 | 154 | // apply / call をつかう 155 | [].slice.call(nodes, 0, 3); // [] (Array クラスのインスタンス) になりすます 156 | [].slice.apply(nodes, [0, 3]); // 上と同じ結果 157 | 158 | // bind をつかう 159 | var sliceNodes = [].slice.bind(nodes); 160 | sliceNodes(0, 3); 161 | ``` 162 | 163 | ## Arrow Function 164 | 165 | - ES2015で導入 166 | - メリット 167 | - 書きやすい 168 | - 定義したスコープの `this` が渡される 169 | 170 | ### 書きやすい 171 | 172 | ```javascript 173 | // 基本形 174 | var add = (x, y) => { 175 | return x + y; 176 | }; 177 | 178 | // {} を省略 179 | var add = (x, y) => x + y; 180 | 181 | // 引数が1個なら括弧を省略できる 182 | var square = x => x * x; 183 | 184 | [1, 2, 3].map(x => x * x); // [1, 4, 9] 185 | ``` 186 | 187 | ### 定義したスコープの `this` が渡される 188 | 189 | 前項で述べた `this` の扱いが簡単になります。 190 | 191 | ```javascript 192 | var obj = { 193 | name : 'foo', 194 | oldFunc : function () { 195 | setTimeout(function () { 196 | console.log(this.name); // this === window 197 | }, 1000); 198 | }, 199 | newFunc : function () { 200 | setTimeout(() => { 201 | console.log(this.name); // this === (newFunc の this) 202 | }, 1000); 203 | } , 204 | }; 205 | 206 | obj.oldFunc(); // undefined 207 | obj.newFunc(); // 'foo' (newFunc の this は obj) 208 | 209 | var f = obj.newFunc; 210 | f(); // undefined 211 | ``` 212 | 213 | - 以降の説明では、なるべくArrow Functionを使います 214 | - 課題でも使ってOK 215 | - 使える環境ではガンガン使っていこう 216 | -------------------------------------------------------------------------------- /language/javascript-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hatena/Hatena-Textbook-JavaScript/7c59aa6783a759cc8c958ffaa7e636419f9e932b/language/javascript-logo.png -------------------------------------------------------------------------------- /language/js-prototype-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hatena/Hatena-Textbook-JavaScript/7c59aa6783a759cc8c958ffaa7e636419f9e932b/language/js-prototype-1.png -------------------------------------------------------------------------------- /language/js-prototype-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hatena/Hatena-Textbook-JavaScript/7c59aa6783a759cc8c958ffaa7e636419f9e932b/language/js-prototype-2.png -------------------------------------------------------------------------------- /language/syntax.md: -------------------------------------------------------------------------------- 1 | 構文 2 | ================================================================ 3 | 4 | JavaScriptのプログラムは、文と式で出来ている。 5 | 6 | 7 | ## [文](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-statements-and-declarations) 8 | 9 | C言語やJavaあたりと似た文法。 10 | 11 | * `{` `}` でブロックを作る 12 | * 変数宣言 `var` `let` `const` 13 | * 関数宣言 `function foo () {}` 14 | * 条件文 `if` `else` `else if` 15 | * ループ: `while` `for` `for-in` 16 | * `break` で抜けたり `continue` で次に進んだり 17 | * try文: `try` `catch` `finally` 18 | * etc... 19 | 20 | 21 | ## [式](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-expressions) 22 | 23 | インタプリタに評価されて値を返すもの。 24 | 25 | * リテラル: `123`, `'hello'` 26 | * 識別子 27 | * 関数式 28 | * 関数呼び出し: `foo()` 29 | * インスタンスの生成: `new Date()` 30 | * etc... 31 | 32 | 33 | ## 演算子 34 | 35 | 基本的にはC言語やJavaと同じ。 36 | 37 | * 四則演算系 `+`, `-`, `*`, `/`, `%` 38 | * 代入 `=`, `+=`, `-=`, ... 39 | * ビット演算 `&`, `|`, ... 40 | 41 | 以下、JS特有のもの。 42 | 43 | * `typeof` 44 | * `instanceof` 45 | * `in`: オブジェクトがプロパティを持っているかどうか検査する 46 | * `new` 47 | * `delete`: プロパティの削除 48 | * `===`, `!==` 49 | 50 | 51 | ## コメント 52 | 53 | ```javascript 54 | // 一行コメント 55 | 56 | /* 57 | * 複数行コメント 58 | */ 59 | ``` 60 | -------------------------------------------------------------------------------- /language/type.md: -------------------------------------------------------------------------------- 1 | 型と値 2 | ================================================================ 3 | 4 | * 変数には型はない 5 | * 値には型がある 6 | * プリミティブ値 + オブジェクト型 7 | * 関数も値 (オブジェクト) 8 | 9 | 10 | ## 変数には型がない 11 | 12 | 同じ変数にいろんな型の値を代入できます。 13 | 14 | ```javascript 15 | var foo = ""; // 文字列 16 | foo = 1; // 数値も入る 17 | foo = {}; // オブジェクトも入る 18 | ``` 19 | 20 | 21 | ## 値の型 22 | 23 | Rubyと違い「すべての値はオブジェクト」ではない。 24 | 25 | * プリミティブ値 26 | * Undefined型 27 | * Null型 28 | * Boolean型 29 | * Number型 30 | * Symbol型 31 | * String型 32 | * Object型 33 | 34 | 35 | ## [プリミティブ値とリテラル](http://www.ecma-international.org/ecma-262/7.0/#sec-primitive-value) 36 | 37 | 参考: [文法とデータ型 - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Grammar_and_types#Data_structures_and_types) 38 | 39 | ### 文字列 (String型) 40 | 41 | * 文字列はUTF-16で表現される 42 | * 3種類のリテラル 43 | 44 | ```javascript 45 | var str1 = "`\\n` などのエスケープシーケンスが使える\n(改行)"; 46 | var str2 = 'シングルクオートで囲むこともできる。 基本的にはダブルクオートと同じ。'; 47 | 48 | var str3 = `ES2015で追加された、テンプレートリテラル`; 49 | var str4 = `${'この' + '様に'} 式を埋め込んだり、 50 | 改行を含む文字列を作成できる`; 51 | ``` 52 | 53 | 参考: [Template literal - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/template_strings) 54 | 55 | ### 数値 (Number型) 56 | 57 | * 数値はIEEE 754標準の64ビット浮動小数点数 58 | * 整数値で表現できるのは53ビットまで 59 | * 整数とみなしてビット演算できる 60 | 61 | ```javascript 62 | var num1 = 100; 63 | var num2 = 0xFF; // 255 (16 進数) 64 | var num3 = 0o777; // 511 (8 進数) 65 | var num4 = 0b1010; // 10 (2 進数) 66 | Infinity; // 無限大を表す値 67 | NaN; // 数値ではないことを表す値 (Not a Number) 68 | ``` 69 | 70 | * `NaN` の存在は忘れがちなので注意 71 | * 条件式で `0 <= NaN` も `0 >= NaN` も偽とか、`NaN === NaN` が偽とか 72 | 73 | ### 真偽値 (Boolean型) 74 | 75 | ```javascript 76 | true 77 | false 78 | ``` 79 | 80 | ### 未定義値 (Undefined型) 81 | 82 | * 宣言だけされて代入されてない変数の値は `undefined` 83 | 84 | ```javascript 85 | undefined // キーワードではなく定義済みの変数 86 | ``` 87 | 88 | ### Null値 (Null型) 89 | 90 | ```javascript 91 | null // `null` はキーワード 92 | ``` 93 | 94 | 95 | ## オブジェクト (Object型) 96 | 97 | * オブジェクトはプロパティの集合 98 | * プロパティはキーと値の組 99 | * つまりJSにおけるオブジェクトとは辞書 (連想配列、ハッシュ) のようなもの 100 | * 実際には単純な辞書 (key-value pair) ではない 101 | * プロパティに属性があったり、オブジェクトが内部プロパティを持ってたり、関数の場合は呼び出しができたりする 102 | 103 | ```javascript 104 | // オブジェクトリテラル 105 | var obj = { 106 | name: "my name", 107 | age: 17 108 | }; 109 | 110 | // 配列リテラル (配列もオブジェクト) 111 | var array = [1,2,3,4,5]; 112 | 113 | // 関数式 (関数もオブジェクト) 114 | var func = function () { /* ... */ }; 115 | 116 | // 正規表現リテラル 117 | var regexp = /^abcdef/; 118 | ``` 119 | 120 | ### プロパティアクセス 121 | 122 | * ドットを使うか、角括弧を使ってオブジェクトのプロパティにアクセス 123 | * 角括弧を使う場合は、角括弧の中は文字列として評価される 124 | 125 | ```javascript 126 | obj.name; //=> "my name" 127 | obj["name"]; //=> "my name" 128 | 129 | // 代入もできる 130 | obj.name = "new name"; // 改名しました 131 | ``` 132 | 133 | ### アクセサプロパティ 134 | 135 | オブジェクトのプロパティにsetter, getterを設定できる。 136 | 137 | ```javascript 138 | var obj = { 139 | _name: "", 140 | set name (val) { this._name = val }, 141 | get name () { return this._name } 142 | }; 143 | 144 | obj.name = "new name"; 145 | obj.name; //=> "new name" 146 | ``` 147 | 148 | 149 | ## ラッパーオブジェクト 150 | 151 | * StringやNumberコンストラクタのインスタンス 152 | * ハマりやすいので使わないこと! 153 | 154 | プリミティブ値との違い。 155 | ```javascript 156 | // ラッパーオブジェクトの型は `object` 157 | typeof "String 値"; // "string" 158 | typeof new String("`String` オブジェクト"); // "object" 159 | 160 | // 等値演算子は参照の等値性をみる 161 | 'yo' === 'yo'; // true 162 | new String('yo') === new String('yo'); // false 163 | ``` 164 | 165 | 166 | ## プリミティブ値に対するプロパティアクセス 167 | 168 | * String型、Number型、Boolean型の値に対してプロパティ参照が可能 169 | * 暗黙的にラッパーオブジェクトが生成されている 170 | * `null`, `undefined` はできない 171 | * プロパティを参照するのは良い 172 | * プロパティへ代入するのはやめよう 173 | * ラッパーオブジェクトは使い捨てられるので、意味が無い 174 | 175 | ```javascript 176 | var foo = 'foo'; 177 | foo.toString() === 'foo'; // new String(foo).toString() と同じ 178 | 179 | foo.bar = 'bar'; // new String(foo).bar = 'bar' と同じ 180 | foo.bar === undefined; // foo.bar は存在しない 181 | ``` 182 | 183 | 184 | ## `typeof` 演算子 185 | 186 | 値の型を調べることができる。 187 | * 注意!!! 188 | * `null` は `"object"` 189 | * 関数は `"function"` 190 | 191 | ```javascript 192 | typeof undefined; // undefined 193 | typeof 0; // number 194 | typeof true; // boolean 195 | typeof {}; // object 196 | typeof []; // object 197 | typeof null; // object 198 | typeof ""; // string 199 | typeof new String(""); // object 200 | typeof alert; // function 201 | ``` 202 | 203 | 参照: [typeof 演算子 - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/typeof) 204 | 205 | 206 | ## 数値と文字列の変換 207 | 208 | ### String => Number 209 | 210 | - 単項 `+` 演算子 211 | ```javascript 212 | +"3"; // 3 213 | ``` 214 | 215 | - parseInt 216 | - 使うときは必ず基数を渡す [(古い処理系でハマる)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/parseInt#Octal_interpretations_with_no_radix) 217 | ```javascript 218 | parseInt('010', 10); // 10 219 | ``` 220 | 221 | - Number 222 | ```javascript 223 | Number("3"); // 3 224 | ``` 225 | 226 | ### Number => String 227 | 228 | - 文字列結合 229 | ```javascript 230 | '' + 3; // '3' 231 | ``` 232 | - `toString()` 233 | ```javascript 234 | var x = 123; 235 | x.toString(); // '123' 236 | ``` 237 | 238 | 239 | ## 値の比較 240 | 241 | JavaScriptの関係演算子は4種類ある。 242 | 243 | - 等値演算子 `==` , 不等演算子 `!=` 244 | - 同値演算子 `===`, 非同値演算子 `!==` 245 | 246 | - `===`、`!==` を使うこと! 247 | - `==`、`!=` だと勝手に型変換されてハマる 248 | 249 | ```javascript 250 | 3 == '3'; // true 251 | 3 === '3'; // false 252 | 253 | 0 == ''; // true 254 | 0 === ''; // false 255 | 256 | undefined == null; // true 257 | undefined === null; // false 258 | ``` 259 | 260 | ### `NaN` に注意 261 | 262 | NaNは自分自身とも等しくない値。 263 | 264 | ``` 265 | NaN == NaN; //=> false 266 | NaN === NaN; //=> false 267 | ``` 268 | 269 | ちなみに比較演算の結果も悲惨。 270 | 271 | ``` 272 | 0 < NaN; //=> false 273 | 0 > NaN; //=> false 274 | ``` 275 | 276 | 文句はJavaScriptじゃなくてIEEEに言うこと。 277 | 278 | 279 | ## `undefined` と `null` の使い分け 280 | 281 | * `undefined` は未定義値を示す 282 | ```javascript 283 | var foo; 284 | typeof foo; // undefined 285 | ``` 286 | * `null` は何も入ってないことを示す 287 | * 定義されているのでobjectではある 288 | * `object` が入っていることを示しつつ、空にしてきたい、とか 289 | ```javascript 290 | var foo = null 291 | typeof foo; // object 292 | ``` 293 | 294 | ## 真偽評価されたときに偽になる値 295 | 296 | いわゆるfalsyな値はつぎの7つ:。 297 | 298 | - `false` 299 | - `''` (空文字列) 300 | - `0` 301 | - `-0` 302 | - `NaN` 303 | - `undefined` 304 | - `null` 305 | 306 | [厳密には他にもある](https://developer.mozilla.org/ja/docs/Glossary/Falsy)けど気にしなくて良いです 307 | 他はすべて `true` と評価されます。 308 | 309 | 310 | ## 標準オブジェクト 311 | 312 | ## 配列 313 | 314 | 配列リテラルでArrayオブジェクトを生成できる。 315 | 参考: [Array - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array) 316 | 317 | ```javascript 318 | var nums = [1,2,3,4]; 319 | 320 | // 要素の操作 321 | nums.push(5); // [1, 2, 3, 4, 5] 322 | nums.pop(); // [1, 2, 3, 4] 323 | nums.unshift(0); // [0, 1, 2, 3, 4] 324 | nums.shift(); // [1, 2, 3, 4] 325 | 326 | // ES5以降のメソッド: forEach, map, filter, reduce, etc... 327 | var squared = [1,2,3,4].map(function (value, index, array) { 328 | return value * value; 329 | }); 330 | ``` 331 | -------------------------------------------------------------------------------- /language/variable.md: -------------------------------------------------------------------------------- 1 | 変数 2 | ---------------------------------------------------------------- 3 | 4 | ## 変数の宣言方法 5 | 6 | 宣言方法はvar, let, constの3つ。 7 | 8 | ### var 9 | 10 | - 関数スコープの変数を宣言 11 | - forやifなどのブロック `{}` でスコープを作らない 12 | 13 | 以下のコードでは `i`, `x` がブロック内で宣言されているが、ブロックの外から参照できる。 14 | ```javascript 15 | (() => { 16 | for (var i = 0; i < 3; i++) { ... } 17 | console.log(i); // 3 18 | 19 | if (true) { var x = 100; } 20 | console.log(x); // 100 21 | })(); 22 | ``` 23 | 24 | 内部的には次のように解釈される。 25 | ```javascript 26 | (() => { 27 | var i, x; 28 | 29 | for (i = 0; i < 3; i++) { ... } 30 | console.log(i); 31 | 32 | if (true) { x = 100; } 33 | console.log(x); 34 | })(); 35 | ``` 36 | 37 | ### let 38 | 39 | - ブロックスコープの変数を宣言 40 | 41 | ```javascript 42 | (() => { 43 | for (let i = 0; i < 3; i++) { 1 } 44 | console.log(i); // ReferenceError: i is not defined 45 | })(); 46 | ``` 47 | 48 | ```javascript 49 | if (true) { let x = 100; } 50 | console.log(x); // ReferenceError: x is not defined 51 | ``` 52 | 53 | ### const 54 | 55 | - ブロックスコープの定数を宣言 56 | - 一度定義したら再代入できない 57 | 58 | ```javascript 59 | const foo = 'foo'; 60 | foo = 'bar'; // TypeError: Assignment to constant variable 61 | ``` 62 | 63 | 64 | ## 変数の巻き上げ (hoisting) 65 | 66 | 代表的ハマりポイント! 67 | 68 | 変数をvarで宣言するとき、宣言より上で参照してもエラーにならない。 69 | ```javascript 70 | var foo = 1; 71 | (function () { 72 | console.log(foo); // undefined 73 | var foo = 2; 74 | console.log(foo); // 2 75 | })(); 76 | ``` 77 | 78 | 内部的には次のように解釈されている。 79 | ```javascript 80 | var foo = 1; 81 | (function () { 82 | var foo; // 宣言を関数の先頭に巻き上げる 83 | alert(foo); // 代入はまだなので undefined 84 | foo = 2; 85 | alert(foo); 86 | })(); 87 | ``` 88 | 89 | letやconstで宣言した変数は、宣言より前に触ろうとするとエラーが出る。 90 | ```javascript 91 | let foo = 1; 92 | (function () { 93 | console.log(foo); // ReferenceError: foo is not defined 94 | let foo = 2; 95 | console.log(foo); // 実行されない 96 | })(); 97 | ``` 98 | 99 | 100 | ## varとlet, constの使い分け 101 | 102 | - 環境が許せばlet, constを使おう 103 | - 最新のブラウザのみ対応すればよいとか 104 | - Babel, TypeScriptが使えるとか 105 | - 上記以外の環境ではvarで我慢 106 | - ハマりやすいので注意 107 | 108 | 109 | ## クロージャ 110 | 111 | * 変数は基本的に関数スコープ 112 | * 関数オブジェクト生成時に環境がつくられる 113 | * 値を関数の中に閉じ込めることができる 114 | 115 | クロージャでつくったカウンター。 116 | 117 | ```javascript 118 | function createCounter () { 119 | var i = 0; 120 | return function () { 121 | return ++i; 122 | }; 123 | }; 124 | 125 | var counter1 = createCounter(); 126 | var counter2 = createCounter(); 127 | alert(counter1()); //=> 1 128 | alert(counter1()); //=> 2 129 | alert(counter2()); //=> 1 130 | alert(counter2()); //=> 2 131 | ``` 132 | 133 | privateでつくる。 134 | 135 | ```javascript 136 | function defineAdd (i) { 137 | return function(v) { 138 | return i + v; 139 | }; 140 | }; 141 | 142 | var add1 = defineAdd(1); 143 | var add2 = defineAdd(2); 144 | alert(add1(1)); //=> 2 145 | alert(add2(1)); //=> 3 146 | alert(defineAdd(1)(2)); //=> 3 147 | ``` 148 | -------------------------------------------------------------------------------- /nodejs.md: -------------------------------------------------------------------------------- 1 | Node.js 2 | ================================================================ 3 | 4 | Node.js logo 5 | 6 | ## Node.jsとは 7 | 8 | - ブラウザの外で動くJavaScript処理系 9 | - Chrome用に開発されたV8という実行エンジンを使っている 10 | - 使い道 11 | - CLIツール 12 | - Webサーバー / アプリケーションサーバー 13 | - 開発用ツール 14 | - はてなでも多くのプロジェクトで使われています 15 | - Node.jsの使い方を覚えておいて損はない 16 | -------------------------------------------------------------------------------- /nodejs/dev.md: -------------------------------------------------------------------------------- 1 | 開発 / ビルドツール 2 | ================================================================ 3 | 4 | - Webのフロントエンド開発におけるJS / CSS開発用のツール 5 | - AltJS / AltCSSのトランスパイラ 6 | - タスクランナー 7 | - Lint 8 | - CSSスプライト作成 9 | 10 | Node.jsはこれらのツールを通じてWebフロントエンド開発も大幅に影響を及ぼした。 11 | 12 | 13 | ## AltJS / AltCSS 14 | 15 | ### AltJS 16 | 17 | - JavaScriptに変換 (transpile) される言語 18 | - 異常に流行ったけど最近落ち着いてきた 19 | 20 | 以下、はてなで使われたことのあるAltJS (or transpiler) 21 | 22 | - CoffeeScript 23 | - 元祖AltJSだが滅びゆく運命 (さだめ) 24 | - ラボサービスなどで使用 25 | - 皆さんが見ることは無いでしょう 26 | - TypeScript 27 | - 大人気AltJS 28 | - Mackerel, 少年ジャンプルーキーなどで使用 29 | - 社内では人気 30 | - Babel 31 | - はてなブログで使用 32 | - JavaScriptの新機能を用いたコードを、今のブラウザで動作するよう変換する 33 | 34 | 35 | ### AltCSS 36 | 37 | - CSSに変換される言語 / ツール群 38 | - `CSS プリプロセッサ` とも呼ばれる 39 | 40 | 以下、はてなで使われたことのあるAltCSS。 41 | 42 | - Less 43 | - シンプルさ重視 44 | - 社内でもっとも多く使われている 45 | - Sass 46 | - 高機能なAltCSS 47 | - ユーザーが多く、開発が活発 48 | - PostCSS 49 | - プラガブルなCSS変換ツール 50 | - minifyなどで部分的に使われている 51 | 52 | 53 | ## タスクランナー 54 | 55 | - 複雑なビルドやテストを実行するためのツール 56 | - ファイルを監視して自動ビルドしたり 57 | - JS / CSSを並列にビルドしたり 58 | - テストとか 59 | 60 | はてなでは、多くのチームでGrunt / Gulpどちらかを利用している。 61 | 62 | - Grunt 63 | - 元祖タスクランナー 64 | - タスク毎に中間ファイルを作成するため、重い 65 | - 最近あんまり見ない 66 | - Gulp 67 | - Gruntに比べ、高速に動作する 68 | - 設定もJavaScriptで書ける 69 | - 開発が活発 70 | -------------------------------------------------------------------------------- /nodejs/node-and-npm.md: -------------------------------------------------------------------------------- 1 | Node.jsの基本的な使い方 2 | ================================================================ 3 | 4 | ## インストール 5 | 6 | - macだとデフォルトで入ってます 7 | - そうでない方はビルド済みバイナリをダウンロード 8 | - https://nodejs.org/en/#download 9 | - rbenv, plenvに似たndenvというのもあります 10 | - https://github.com/riywo/ndenv 11 | 12 | 13 | ## Node.jsの実行方法 14 | 15 | `node` コマンドを使います。 16 | 17 | - `node (ファイル名)` でJSファイルを実行する 18 | ``` 19 | $ echo 'console.log("hello");' > hello.js 20 | $ node hello.js 21 | hello 22 | ``` 23 | 24 | - `node -e '(式)'` でワンライナー 25 | ``` 26 | $ node -e 'console.log(123);' 27 | 123 28 | ``` 29 | 30 | - `node` コマンドでREPLが開く 31 | - ブラウザのコンソールと同じノリで使える 32 | 33 | ``` 34 | $ node 35 | > 1 + 2 36 | 3 37 | > console.log('yo'); 38 | yo 39 | undefined 40 | > 41 | > var f = (x) => x * x; 42 | [Function] 43 | > f(10); 44 | 100 45 | > g = () => { 46 | ... console.log(123); 47 | ... } 48 | [Function] 49 | > g(); 50 | 123 51 | undefined 52 | ``` 53 | 54 | 55 | ## npm 56 | 57 | - Node.js用のパッケージマネージャ 58 | - Rubyでいう `gem` 、 Perlでいう `cpanm` 59 | - 最近ではフロントエンド用のライブラリやCSSライブラリも管理したり 60 | - 簡易タスクランナーとしても使える 61 | - 例: はてなブログ 62 | - `npm test` : テスト実行 63 | - `npm run build` : JavaScript / CSSビルド 64 | 65 | 66 | ### npmの使い方 67 | 68 | - まずはpackage.jsonを作成する 69 | - プロジェクトの名前やバージョン、依存npmパッケージなどを記録する 70 | - npm initすると対話的に作られます 71 | - `npm init -y` で質問スキップ 72 | 73 | `npm init -y` で生成されるファイル。 74 | 75 | ```json 76 | { 77 | "name": "sample", 78 | "version": "0.0.0", 79 | "description": "", 80 | "main": "index.js", 81 | "scripts": { 82 | "test": "echo \"Error: no test specified\" && exit 1" 83 | }, 84 | "keywords": [], 85 | "author": "foo ", 86 | "license": "MIT" 87 | } 88 | ``` 89 | 90 | - `npm install` でnpmパッケージをインストール 91 | - `node_modules/` 下にインストールされる 92 | 93 | インストールしたnpmパッケージは `require('foo')` として使える様になる。 94 | 95 | ```javascript 96 | // `npm install cool-ascii-faces` 済み 97 | var cool = require('cool-ascii-faces'); 98 | 99 | console.log(cool()); // (๑>ᴗ<๑) 100 | ``` 101 | 102 | `npm install --save` でインストールすると、 package.jsonに依存パッケージとして記録される。 103 | 104 | ```js 105 | { 106 | "name": "sample", 107 | // 中略 108 | "dependencies": { 109 | "cool-ascii-faces": "^1.3.4" 110 | } 111 | } 112 | ``` 113 | -------------------------------------------------------------------------------- /nodejs/nodejs-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hatena/Hatena-Textbook-JavaScript/7c59aa6783a759cc8c958ffaa7e636419f9e932b/nodejs/nodejs-logo.png -------------------------------------------------------------------------------- /omake.md: -------------------------------------------------------------------------------- 1 | おまけ 2 | ================================================================ 3 | 4 | 雑談 5 | ---------------------------------------------------------------- 6 | 7 | ### JavaScriptはテストが難しい 8 | 9 | - DOMと絡んだ動作のテストは難しい 10 | - イベント発火とモデルを切り離せると便利 11 | - 非同期な状態の変化をテストする必要がある 12 | - テストでもコールバックやPromiseを使う 13 | - テストシナリオが複雑 14 | - 「ボタンを押して入力欄を開き、文章を入力してボタンを押すと、入力した値が表示されている」ことのテストとか 15 | - ヘッドレスブラウザを使ったE2Eテスト 16 | - 画面に表示しないけど中でDOMを構築するブラウザ 17 | - PhantomJSなど 18 | - ブラウザによって挙動がちがう 19 | - 手元でテストが通るけど特定の環境では動かないとか 20 | - IEのテスト用にはMicrosoftから仮想マシンが提供されている ([modern.ie](https://www.modern.ie/ja-jp)) 21 | - クロスブラウザテストを行うサービスもある ([BrowserStack](https://www.browserstack.com/)) 22 | - 今回の課題では自動テストは不要です 23 | - あったらかっこいい 24 | 25 | 26 | お役立ちサイト 27 | ---------------------------------------------------------------- 28 | 29 | * [JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript) 30 | * [Can I use... Support tables for HTML5, CSS3, etc](http://caniuse.com/) 31 | 32 | 33 | ブログ 34 | ---------------------------------------------------------------- 35 | * [JSer.info](http://jser.info/) 36 | * [②ality – JavaScript and more](http://www.2ality.com/) 37 | * [JS.next](http://js-next.hatenablog.com/) 38 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Hatena-Textbook-JavaScript", 3 | "version": "0.0.0", 4 | "description": "JavaScript TextBook by Hatena", 5 | "main": "", 6 | "scripts": { 7 | "test": "textlint $(git ls-files '*.md' | grep -v README.md)", 8 | "start": "gitbook serve", 9 | "build": "rm -rf docs/**/* && gitbook build && mkdir -p docs && cp -a _book/* docs", 10 | "pdf": "gitbook pdf . hatena-textbook-javascript.pdf" 11 | }, 12 | "repository": { 13 | "type": "git", 14 | "url": "git@github.com:hatena/Hatena-Textbook-JavaScript.git" 15 | }, 16 | "keywords": [], 17 | "author": "amagitakayosi ", 18 | "license": "CC BY 2.1 JP", 19 | "dependencies": { 20 | "gitbook-cli": "^2.3.0" 21 | }, 22 | "devDependencies": { 23 | "textlint": "^7.3.0", 24 | "textlint-rule-preset-ja-technical-writing": "^3.1.3", 25 | "textlint-rule-preset-jtf-style": "^2.2.3" 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /prepare.md: -------------------------------------------------------------------------------- 1 | 予備知識 2 | ================================================================ 3 | 4 | JavaScriptとは。 5 | 6 | * 基本的にはブラウザ上の処理 7 | * Webアプリケーションにはほぼ必須 8 | * はてなのエンジニアは皆ある程度書ける 9 | * 最近では色んな所で使われている 10 | * サーバーサイド (Node.js) 11 | * npm, gulpなどの開発ツール (Node.js) 12 | * デスクトップアプリ (Electron) 13 | * スマホアプリ (Windows Phone, React Native, Titanium等) 14 | 15 | 今回は基本的にブラウザ上で動作するJSを対象にします。 16 | 17 | 18 | ## JS、HTML、CSSについて調べるときに困ること 19 | 20 | * ブラウザ、処理系によって違う部分が多い 21 | * 変化が激しい 22 | * 一年前の情報がアテにならないことも 23 | * 誤った情報や、参考にすべきでない情報もある 24 | 25 | そのため、読者諸君は。 26 | 27 | * 基礎的な知識を身につける 28 | * 信頼できる情報を探せるようになる 29 | * 信頼できるサイトを見つけておく 30 | 31 | ことを心がけよう。 32 | 33 | 34 | ## クロスブラウザについて 35 | 36 | * 多くの処理系があるので、あらゆる環境に対応するのは難しい 37 | * クロスブラウザ対応はバッドノウハウの塊みたいなもの 38 | * 本質的ではない 39 | 40 | 本講義では最新のFirefoxやChromeを使って開発することを前提とする。 41 | 42 | 43 | ## デバッグ方法 44 | 45 | * 事前課題のJS-0で開発ツール使えた? 46 | * いま適当なページで開発ツールを使ってみよう 47 | * HTML構造を見る、適用されているCSSを見る 48 | * コンソール上でJSを実行 (`document.body.innerHTML = ""`) 49 | * スクリプトを中断する場所 (ブレークポイント) を指定し、そこから1行ずつ実行できる 50 | * スクリプト中に `debugger;` と書いておけばそこで中断する 51 | 52 | 53 | ### printデバッグ 54 | 55 | 値を出力して確認する方法。 56 | 57 | * `console.log()` 58 | * オブジェクトの中身まで見れて便利 59 | * 本講義では基本的にこれを使う 60 | * `alert()` 61 | * 古典的だが今でも役に立つ 62 | * その時点で処理がブロックするので、ステップをひとつずつ確認するとき便利 63 | * スマートフォンや携帯ゲーム機などデバッガが無い場合 64 | 65 | 66 | ### スマートフォンの場合 67 | 68 | iOS, Androidのブラウザは、 PCにつないでリモートデバッグできる。 69 | 70 | * iOSのSafari 71 | * mac上のSafariでデバッグ 72 | * [Safari Developer Library](https://developer.apple.com/library/safari/documentation/AppleApplications/Conceptual/Safari_Developer_Guide/GettingStarted/GettingStarted.html#//apple_ref/doc/uid/TP40007874-CH2-SW8) 73 | * AndroidのChrome 74 | * PCのChromeでデバッグ 75 | * [Remote Debugging Android Devices | Web Tools - Google Developers](https://developers.google.com/web/tools/chrome-devtools/debug/remote-debugging/remote-debugging) 76 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@azu/format-text@^1.0.1": 6 | version "1.0.1" 7 | resolved "https://registry.yarnpkg.com/@azu/format-text/-/format-text-1.0.1.tgz#6967350a94640f6b02855169bd897ce54d6cebe2" 8 | 9 | "@azu/style-format@^1.0.0": 10 | version "1.0.0" 11 | resolved "https://registry.yarnpkg.com/@azu/style-format/-/style-format-1.0.0.tgz#e70187f8a862e191b1bce6c0268f13acd3a56b20" 12 | dependencies: 13 | "@azu/format-text" "^1.0.1" 14 | 15 | "@textlint-rule/textlint-rule-no-invalid-control-character@^1.2.0": 16 | version "1.2.0" 17 | resolved "https://registry.yarnpkg.com/@textlint-rule/textlint-rule-no-invalid-control-character/-/textlint-rule-no-invalid-control-character-1.2.0.tgz#3e8f03258d06b7deb2592bdb13626659c46abbf5" 18 | integrity sha512-FgkOQr14H8D/LQVAEOR2cGWhzItb9MXCAvaBwKkysIfP9Ngwam+8NRmbphQ/GrAm3PXV63QmK1xwAKM1DntwmQ== 19 | dependencies: 20 | execall "^1.0.0" 21 | 22 | "@textlint/ast-node-types@^4.0.2", "@textlint/ast-node-types@^4.2.1", "@textlint/ast-node-types@^4.2.4": 23 | version "4.2.4" 24 | resolved "https://registry.yarnpkg.com/@textlint/ast-node-types/-/ast-node-types-4.2.4.tgz#ae569bd76364040939044d057d5a56284563a7af" 25 | integrity sha512-ggiixpScxgdMY42b6UafD1iUboSvl9k3vGA9kynP+kd6mEhTDzxtb1aHPDAnV+DpAEw4qpHMz72GBFkX/iOSFw== 26 | 27 | "@textlint/module-interop@^1.0.1": 28 | version "1.0.1" 29 | resolved "https://registry.yarnpkg.com/@textlint/module-interop/-/module-interop-1.0.1.tgz#765ca9ccb9b66657d65061d3546b3fe51e48c983" 30 | integrity sha512-gqx1Te+lMnXX6xyGTUdzGhm8RT7IfiSRMtWoH1FeTMg2InArRT+lTksCFc/x5dtaPN4vwOFZUvU8oTzYQzXbyg== 31 | 32 | "@textlint/types@^1.1.2": 33 | version "1.2.1" 34 | resolved "https://registry.yarnpkg.com/@textlint/types/-/types-1.2.1.tgz#24e1d6e1ac82038f84cea57ead58eeaf247c9e5b" 35 | integrity sha512-HNbVS+F9hNy4E/Hnv2mV/6rjlPB7Mdc5KCiT+uFjMK7vqiVuW/DeKjkYScRirQ0jf8gWUXBVTxZgwBBlJZmV1Q== 36 | dependencies: 37 | "@textlint/ast-node-types" "^4.2.4" 38 | 39 | abbrev@1, abbrev@~1.0.7, abbrev@~1.0.9: 40 | version "1.0.9" 41 | resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" 42 | 43 | ajv-keywords@^1.0.0: 44 | version "1.5.1" 45 | resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.5.1.tgz#314dd0a4b3368fad3dfcdc54ede6171b886daf3c" 46 | 47 | ajv@^4.7.0: 48 | version "4.11.5" 49 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.5.tgz#b6ee74657b993a01dce44b7944d56f485828d5bd" 50 | dependencies: 51 | co "^4.6.0" 52 | json-stable-stringify "^1.0.1" 53 | 54 | amp-create-callback@^1.0.0: 55 | version "1.0.1" 56 | resolved "https://registry.yarnpkg.com/amp-create-callback/-/amp-create-callback-1.0.1.tgz#51bb6f1491545d86e9bf236caff514bbb4578310" 57 | 58 | amp-each@^1.0.1: 59 | version "1.0.1" 60 | resolved "https://registry.yarnpkg.com/amp-each/-/amp-each-1.0.1.tgz#0d6c8a33bf499c8b3de62322457c78b9eda5c00f" 61 | dependencies: 62 | amp-create-callback "^1.0.0" 63 | amp-keys "^1.0.0" 64 | 65 | amp-has@^1.0.0: 66 | version "1.0.1" 67 | resolved "https://registry.yarnpkg.com/amp-has/-/amp-has-1.0.1.tgz#dcc58a090a4c6fc4947cdb6e8c410ed9ff5202c6" 68 | 69 | amp-index-of@^1.0.0: 70 | version "1.1.0" 71 | resolved "https://registry.yarnpkg.com/amp-index-of/-/amp-index-of-1.1.0.tgz#d1d798ea57da552b021365b85b1e38ddf993b1c1" 72 | dependencies: 73 | amp-is-number "^1.0.0" 74 | 75 | amp-is-number@^1.0.0: 76 | version "1.0.1" 77 | resolved "https://registry.yarnpkg.com/amp-is-number/-/amp-is-number-1.0.1.tgz#f430d2e65d1bbd2cc41dbd9afb7f03d3e328a314" 78 | 79 | amp-is-object@^1.0.0: 80 | version "1.0.1" 81 | resolved "https://registry.yarnpkg.com/amp-is-object/-/amp-is-object-1.0.1.tgz#0a8cb5956b9112a16a73677e8cbad37bba247702" 82 | 83 | amp-keys@^1.0.0: 84 | version "1.0.1" 85 | resolved "https://registry.yarnpkg.com/amp-keys/-/amp-keys-1.0.1.tgz#b721fb831da79881504f4eb44a39ed930a5bb129" 86 | dependencies: 87 | amp-has "^1.0.0" 88 | amp-index-of "^1.0.0" 89 | amp-is-object "^1.0.0" 90 | 91 | analyze-desumasu-dearu@^2.1.2: 92 | version "2.1.5" 93 | resolved "https://registry.yarnpkg.com/analyze-desumasu-dearu/-/analyze-desumasu-dearu-2.1.5.tgz#9caa2a5a06146c20679f7dc9f3af527db6f68f41" 94 | 95 | analyze-desumasu-dearu@^3.1.0: 96 | version "3.1.0" 97 | resolved "https://registry.yarnpkg.com/analyze-desumasu-dearu/-/analyze-desumasu-dearu-3.1.0.tgz#af36b948454c0783a431f2ab938a59f24d40e150" 98 | dependencies: 99 | array-find "^1.0.0" 100 | kuromojin "^1.2.1" 101 | object.assign "^4.0.3" 102 | 103 | ansi-regex@^2.0.0: 104 | version "2.1.1" 105 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 106 | 107 | ansi-styles@^2.2.1: 108 | version "2.2.1" 109 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" 110 | 111 | ansi@^0.3.0, ansi@~0.3.1: 112 | version "0.3.1" 113 | resolved "https://registry.yarnpkg.com/ansi/-/ansi-0.3.1.tgz#0c42d4fb17160d5a9af1e484bace1c66922c1b21" 114 | 115 | ansicolors@~0.3.2: 116 | version "0.3.2" 117 | resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.3.2.tgz#665597de86a9ffe3aa9bfbe6cae5c6ea426b4979" 118 | 119 | ansistyles@~0.1.3: 120 | version "0.1.3" 121 | resolved "https://registry.yarnpkg.com/ansistyles/-/ansistyles-0.1.3.tgz#5de60415bda071bb37127854c864f41b23254539" 122 | 123 | aproba@~1.0.1: 124 | version "1.0.4" 125 | resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.0.4.tgz#2713680775e7614c8ba186c065d4e2e52d1072c0" 126 | 127 | archy@~1.0.0: 128 | version "1.0.0" 129 | resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" 130 | 131 | are-we-there-yet@~1.1.2: 132 | version "1.1.2" 133 | resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.2.tgz#80e470e95a084794fe1899262c5667c6e88de1b3" 134 | dependencies: 135 | delegates "^1.0.0" 136 | readable-stream "^2.0.0 || ^1.1.13" 137 | 138 | argparse@^1.0.7: 139 | version "1.0.9" 140 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" 141 | dependencies: 142 | sprintf-js "~1.0.2" 143 | 144 | array-find@^1.0.0: 145 | version "1.0.0" 146 | resolved "https://registry.yarnpkg.com/array-find/-/array-find-1.0.0.tgz#6c8e286d11ed768327f8e62ecee87353ca3e78b8" 147 | 148 | array-index@^1.0.0: 149 | version "1.0.0" 150 | resolved "https://registry.yarnpkg.com/array-index/-/array-index-1.0.0.tgz#ec56a749ee103e4e08c790b9c353df16055b97f9" 151 | dependencies: 152 | debug "^2.2.0" 153 | es6-symbol "^3.0.2" 154 | 155 | array-union@^1.0.1: 156 | version "1.0.2" 157 | resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" 158 | dependencies: 159 | array-uniq "^1.0.1" 160 | 161 | array-uniq@^1.0.1: 162 | version "1.0.3" 163 | resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" 164 | 165 | array.prototype.find@^2.0.3: 166 | version "2.1.0" 167 | resolved "https://registry.yarnpkg.com/array.prototype.find/-/array.prototype.find-2.1.0.tgz#630f2eaf70a39e608ac3573e45cf8ccd0ede9ad7" 168 | integrity sha512-Wn41+K1yuO5p7wRZDl7890c3xvv5UBrfVXTVIe28rSQb6LS0fZMDrQB6PAcxQFRFy6vJTLDc3A2+3CjQdzVKRg== 169 | dependencies: 170 | define-properties "^1.1.3" 171 | es-abstract "^1.13.0" 172 | 173 | arrify@^1.0.0: 174 | version "1.0.1" 175 | resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" 176 | 177 | asap@^2.0.0: 178 | version "2.0.5" 179 | resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.5.tgz#522765b50c3510490e52d7dcfe085ef9ba96958f" 180 | 181 | asn1@~0.2.3: 182 | version "0.2.3" 183 | resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" 184 | 185 | assert-plus@1.0.0, assert-plus@^1.0.0: 186 | version "1.0.0" 187 | resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" 188 | 189 | assert-plus@^0.2.0: 190 | version "0.2.0" 191 | resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" 192 | 193 | async-some@~1.0.2: 194 | version "1.0.2" 195 | resolved "https://registry.yarnpkg.com/async-some/-/async-some-1.0.2.tgz#4d8a81620d5958791b5b98f802d3207776e95509" 196 | dependencies: 197 | dezalgo "^1.0.2" 198 | 199 | async@^2.0.1: 200 | version "2.1.5" 201 | resolved "https://registry.yarnpkg.com/async/-/async-2.1.5.tgz#e587c68580994ac67fc56ff86d3ac56bdbe810bc" 202 | dependencies: 203 | lodash "^4.14.0" 204 | 205 | aws-sign2@~0.6.0: 206 | version "0.6.0" 207 | resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" 208 | 209 | aws4@^1.2.1: 210 | version "1.6.0" 211 | resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" 212 | 213 | bail@^1.0.0: 214 | version "1.0.1" 215 | resolved "https://registry.yarnpkg.com/bail/-/bail-1.0.1.tgz#912579de8b391aadf3c5fdf4cd2a0fc225df3bc2" 216 | 217 | balanced-match@^0.4.1: 218 | version "0.4.2" 219 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" 220 | 221 | bash-color@0.0.4: 222 | version "0.0.4" 223 | resolved "https://registry.yarnpkg.com/bash-color/-/bash-color-0.0.4.tgz#e9be8ce33540cada4881768c59bd63865736e913" 224 | 225 | bcrypt-pbkdf@^1.0.0: 226 | version "1.0.1" 227 | resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" 228 | dependencies: 229 | tweetnacl "^0.14.3" 230 | 231 | bl@~1.0.0: 232 | version "1.0.3" 233 | resolved "https://registry.yarnpkg.com/bl/-/bl-1.0.3.tgz#fc5421a28fd4226036c3b3891a66a25bc64d226e" 234 | dependencies: 235 | readable-stream "~2.0.5" 236 | 237 | bl@~1.1.2: 238 | version "1.1.2" 239 | resolved "https://registry.yarnpkg.com/bl/-/bl-1.1.2.tgz#fdca871a99713aa00d19e3bbba41c44787a65398" 240 | dependencies: 241 | readable-stream "~2.0.5" 242 | 243 | block-stream@*, block-stream@0.0.9: 244 | version "0.0.9" 245 | resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" 246 | dependencies: 247 | inherits "~2.0.0" 248 | 249 | bluebird@^3.0.1, bluebird@^3.0.5: 250 | version "3.5.0" 251 | resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.0.tgz#791420d7f551eea2897453a8a77653f96606d67c" 252 | 253 | boom@2.x.x: 254 | version "2.10.1" 255 | resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" 256 | dependencies: 257 | hoek "2.x.x" 258 | 259 | boundary@^1.0.1: 260 | version "1.0.1" 261 | resolved "https://registry.yarnpkg.com/boundary/-/boundary-1.0.1.tgz#4d67dc2602c0cc16dd9bce7ebf87e948290f5812" 262 | 263 | brace-expansion@^1.0.0: 264 | version "1.1.6" 265 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.6.tgz#7197d7eaa9b87e648390ea61fc66c84427420df9" 266 | dependencies: 267 | balanced-match "^0.4.1" 268 | concat-map "0.0.1" 269 | 270 | buffer-shims@^1.0.0: 271 | version "1.0.0" 272 | resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" 273 | 274 | builtin-modules@^1.0.0: 275 | version "1.1.1" 276 | resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" 277 | 278 | builtins@0.0.7: 279 | version "0.0.7" 280 | resolved "https://registry.yarnpkg.com/builtins/-/builtins-0.0.7.tgz#355219cd6cf18dbe7c01cc7fd2dce765cfdc549a" 281 | 282 | builtins@^1.0.3: 283 | version "1.0.3" 284 | resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" 285 | 286 | caller-path@^0.1.0: 287 | version "0.1.0" 288 | resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" 289 | dependencies: 290 | callsites "^0.2.0" 291 | 292 | callsites@^0.2.0: 293 | version "0.2.0" 294 | resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" 295 | 296 | carrack@0.0.5: 297 | version "0.0.5" 298 | resolved "https://registry.yarnpkg.com/carrack/-/carrack-0.0.5.tgz#ab28fbedcd8d2b953d1643353e262272bf0c4bdb" 299 | dependencies: 300 | bluebird "^3.0.1" 301 | 302 | caseless@~0.11.0: 303 | version "0.11.0" 304 | resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7" 305 | 306 | ccount@^1.0.0: 307 | version "1.0.1" 308 | resolved "https://registry.yarnpkg.com/ccount/-/ccount-1.0.1.tgz#665687945168c218ec77ff61a4155ae00227a96c" 309 | 310 | chalk@^1.0.0, chalk@^1.1.1: 311 | version "1.1.3" 312 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" 313 | dependencies: 314 | ansi-styles "^2.2.1" 315 | escape-string-regexp "^1.0.2" 316 | has-ansi "^2.0.0" 317 | strip-ansi "^3.0.0" 318 | supports-color "^2.0.0" 319 | 320 | char-spinner@~1.0.1: 321 | version "1.0.1" 322 | resolved "https://registry.yarnpkg.com/char-spinner/-/char-spinner-1.0.1.tgz#e6ea67bd247e107112983b7ab0479ed362800081" 323 | 324 | character-entities-html4@^1.0.0: 325 | version "1.1.0" 326 | resolved "https://registry.yarnpkg.com/character-entities-html4/-/character-entities-html4-1.1.0.tgz#1ab08551d3ce1fa1df08d00fb9ca1defb147a06c" 327 | 328 | character-entities-legacy@^1.0.0: 329 | version "1.1.0" 330 | resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.0.tgz#b18aad98f6b7bcc646c1e4c81f9f1956376a561a" 331 | 332 | character-entities@^1.0.0: 333 | version "1.2.0" 334 | resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.0.tgz#a683e2cf75dbe8b171963531364e58e18a1b155f" 335 | 336 | character-reference-invalid@^1.0.0: 337 | version "1.1.0" 338 | resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.0.tgz#dec9ad1dfb9f8d06b4fcdaa2adc3c4fd97af1e68" 339 | 340 | charenc@~0.0.1: 341 | version "0.0.2" 342 | resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" 343 | 344 | check-ends-with-period@^1.0.1: 345 | version "1.0.1" 346 | resolved "https://registry.yarnpkg.com/check-ends-with-period/-/check-ends-with-period-1.0.1.tgz#d7d29d614cbc3ed15ab54190f4fda4deaa3141d8" 347 | integrity sha1-19KdYUy8PtFatUGQ9P2k3qoxQdg= 348 | dependencies: 349 | array.prototype.find "^2.0.3" 350 | emoji-regex "^6.4.1" 351 | end-with "^1.0.2" 352 | 353 | chmodr@~1.0.2: 354 | version "1.0.2" 355 | resolved "https://registry.yarnpkg.com/chmodr/-/chmodr-1.0.2.tgz#04662b932d0f02ec66deaa2b0ea42811968e3eb9" 356 | 357 | chownr@^1.0.1, chownr@~1.0.1: 358 | version "1.0.1" 359 | resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181" 360 | 361 | circular-json@^0.3.1: 362 | version "0.3.1" 363 | resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.1.tgz#be8b36aefccde8b3ca7aa2d6afc07a37242c0d2d" 364 | 365 | clone-regexp@^1.0.0: 366 | version "1.0.1" 367 | resolved "https://registry.yarnpkg.com/clone-regexp/-/clone-regexp-1.0.1.tgz#051805cd33173375d82118fc0918606da39fd60f" 368 | integrity sha512-Fcij9IwRW27XedRIJnSOEupS7RVcXtObJXbcUOX93UCLqqOdRpkvzKywOOSizmEK/Is3S/RHX9dLdfo6R1Q1mw== 369 | dependencies: 370 | is-regexp "^1.0.0" 371 | is-supported-regexp-flag "^1.0.0" 372 | 373 | clone@^1.0.2: 374 | version "1.0.2" 375 | resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.2.tgz#260b7a99ebb1edfe247538175f783243cb19d149" 376 | 377 | cmd-shim@~2.0.2: 378 | version "2.0.2" 379 | resolved "https://registry.yarnpkg.com/cmd-shim/-/cmd-shim-2.0.2.tgz#6fcbda99483a8fd15d7d30a196ca69d688a2efdb" 380 | dependencies: 381 | graceful-fs "^4.1.2" 382 | mkdirp "~0.5.0" 383 | 384 | co@^4.6.0: 385 | version "4.6.0" 386 | resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" 387 | 388 | code-point-at@^1.0.0: 389 | version "1.1.0" 390 | resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" 391 | 392 | code-point@^1.0.1: 393 | version "1.1.0" 394 | resolved "https://registry.yarnpkg.com/code-point/-/code-point-1.1.0.tgz#999841f51f54ccae4a0dabbc869063234603fecd" 395 | 396 | collapse-white-space@^1.0.0: 397 | version "1.0.2" 398 | resolved "https://registry.yarnpkg.com/collapse-white-space/-/collapse-white-space-1.0.2.tgz#9c463fb9c6d190d2dcae21a356a01bcae9eeef6d" 399 | 400 | columnify@~1.5.4: 401 | version "1.5.4" 402 | resolved "https://registry.yarnpkg.com/columnify/-/columnify-1.5.4.tgz#4737ddf1c7b69a8a7c340570782e947eec8e78bb" 403 | dependencies: 404 | strip-ansi "^3.0.0" 405 | wcwidth "^1.0.0" 406 | 407 | combined-stream@^1.0.5, combined-stream@~1.0.5: 408 | version "1.0.5" 409 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" 410 | dependencies: 411 | delayed-stream "~1.0.0" 412 | 413 | commander@2.9.0, commander@^2.9.0: 414 | version "2.9.0" 415 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" 416 | dependencies: 417 | graceful-readlink ">= 1.0.0" 418 | 419 | commandpost@^1.0.1: 420 | version "1.0.1" 421 | resolved "https://registry.yarnpkg.com/commandpost/-/commandpost-1.0.1.tgz#7d7e3e69ae8fe7d6949341e91596ede9b2d631fd" 422 | 423 | commandpost@^1.2.1: 424 | version "1.4.0" 425 | resolved "https://registry.yarnpkg.com/commandpost/-/commandpost-1.4.0.tgz#89218012089dfc9b67a337ba162f15c88e0f1048" 426 | integrity sha512-aE2Y4MTFJ870NuB/+2z1cXBhSBBzRydVVjzhFC4gtenEhpnj15yu0qptWGJsO9YGrcPZ3ezX8AWb1VA391MKpQ== 427 | 428 | concat-map@0.0.1: 429 | version "0.0.1" 430 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 431 | 432 | concat-stream@^1.4.6, concat-stream@^1.5.1, concat-stream@^1.5.2: 433 | version "1.6.0" 434 | resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" 435 | dependencies: 436 | inherits "^2.0.3" 437 | readable-stream "^2.2.2" 438 | typedarray "^0.0.6" 439 | 440 | config-chain@~1.1.10: 441 | version "1.1.11" 442 | resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.11.tgz#aba09747dfbe4c3e70e766a6e41586e1859fc6f2" 443 | dependencies: 444 | ini "^1.3.4" 445 | proto-list "~1.2.1" 446 | 447 | core-util-is@~1.0.0: 448 | version "1.0.2" 449 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 450 | 451 | crypt@~0.0.1: 452 | version "0.0.2" 453 | resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" 454 | 455 | cryptiles@2.x.x: 456 | version "2.0.5" 457 | resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" 458 | dependencies: 459 | boom "2.x.x" 460 | 461 | d@1: 462 | version "1.0.0" 463 | resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f" 464 | dependencies: 465 | es5-ext "^0.10.9" 466 | 467 | dashdash@^1.12.0: 468 | version "1.14.1" 469 | resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" 470 | dependencies: 471 | assert-plus "^1.0.0" 472 | 473 | debug@^2.1.0, debug@^2.1.3, debug@^2.2.0: 474 | version "2.6.3" 475 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.3.tgz#0f7eb8c30965ec08c72accfa0130c8b79984141d" 476 | dependencies: 477 | ms "0.7.2" 478 | 479 | debuglog@^1.0.1: 480 | version "1.0.1" 481 | resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" 482 | 483 | deep-equal@^1.0.1: 484 | version "1.0.1" 485 | resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" 486 | 487 | deep-is@~0.1.3: 488 | version "0.1.3" 489 | resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" 490 | 491 | defaults@^1.0.3: 492 | version "1.0.3" 493 | resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" 494 | dependencies: 495 | clone "^1.0.2" 496 | 497 | define-properties@^1.1.1, define-properties@^1.1.2: 498 | version "1.1.2" 499 | resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94" 500 | dependencies: 501 | foreach "^2.0.5" 502 | object-keys "^1.0.8" 503 | 504 | define-properties@^1.1.3: 505 | version "1.1.3" 506 | resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" 507 | integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== 508 | dependencies: 509 | object-keys "^1.0.12" 510 | 511 | del@^2.0.2: 512 | version "2.2.2" 513 | resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" 514 | dependencies: 515 | globby "^5.0.0" 516 | is-path-cwd "^1.0.0" 517 | is-path-in-cwd "^1.0.0" 518 | object-assign "^4.0.1" 519 | pify "^2.0.0" 520 | pinkie-promise "^2.0.0" 521 | rimraf "^2.2.8" 522 | 523 | delayed-stream@~1.0.0: 524 | version "1.0.0" 525 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 526 | 527 | delegates@^1.0.0: 528 | version "1.0.0" 529 | resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" 530 | 531 | dezalgo@^1.0.0, dezalgo@^1.0.1, dezalgo@^1.0.2, dezalgo@~1.0.3: 532 | version "1.0.3" 533 | resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.3.tgz#7f742de066fc748bc8db820569dddce49bf0d456" 534 | dependencies: 535 | asap "^2.0.0" 536 | wrappy "1" 537 | 538 | diff@^2.2.2: 539 | version "2.2.3" 540 | resolved "https://registry.yarnpkg.com/diff/-/diff-2.2.3.tgz#60eafd0d28ee906e4e8ff0a52c1229521033bf99" 541 | 542 | diff@^4.0.1: 543 | version "4.0.1" 544 | resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.1.tgz#0c667cb467ebbb5cea7f14f135cc2dba7780a8ff" 545 | integrity sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q== 546 | 547 | doublearray@0.0.2: 548 | version "0.0.2" 549 | resolved "https://registry.yarnpkg.com/doublearray/-/doublearray-0.0.2.tgz#63186fe8d34413276d3621f6aa0ec5f79e227ef9" 550 | 551 | ecc-jsbn@~0.1.1: 552 | version "0.1.1" 553 | resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" 554 | dependencies: 555 | jsbn "~0.1.0" 556 | 557 | editor@~1.0.0: 558 | version "1.0.0" 559 | resolved "https://registry.yarnpkg.com/editor/-/editor-1.0.0.tgz#60c7f87bd62bcc6a894fa8ccd6afb7823a24f742" 560 | 561 | emoji-regex@^6.4.1: 562 | version "6.5.1" 563 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-6.5.1.tgz#9baea929b155565c11ea41c6626eaa65cef992c2" 564 | integrity sha512-PAHp6TxrCy7MGMFidro8uikr+zlJJKJ/Q6mm2ExZ7HwkyR9lSVFfE3kt36qcwa24BQL7y0G9axycGjK1A/0uNQ== 565 | 566 | end-with@^1.0.2: 567 | version "1.0.2" 568 | resolved "https://registry.yarnpkg.com/end-with/-/end-with-1.0.2.tgz#a432755ab4f51e7fc74f3a719c6b81df5d668bdc" 569 | integrity sha1-pDJ1WrT1Hn/HTzpxnGuB311mi9w= 570 | 571 | error-ex@^1.2.0: 572 | version "1.3.1" 573 | resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" 574 | dependencies: 575 | is-arrayish "^0.2.1" 576 | 577 | es-abstract@^1.12.0, es-abstract@^1.13.0: 578 | version "1.14.2" 579 | resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.14.2.tgz#7ce108fad83068c8783c3cdf62e504e084d8c497" 580 | integrity sha512-DgoQmbpFNOofkjJtKwr87Ma5EW4Dc8fWhD0R+ndq7Oc456ivUfGOOP6oAZTTKl5/CcNMP+EN+e3/iUzgE0veZg== 581 | dependencies: 582 | es-to-primitive "^1.2.0" 583 | function-bind "^1.1.1" 584 | has "^1.0.3" 585 | has-symbols "^1.0.0" 586 | is-callable "^1.1.4" 587 | is-regex "^1.0.4" 588 | object-inspect "^1.6.0" 589 | object-keys "^1.1.1" 590 | string.prototype.trimleft "^2.0.0" 591 | string.prototype.trimright "^2.0.0" 592 | 593 | es-abstract@^1.4.3: 594 | version "1.7.0" 595 | resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.7.0.tgz#dfade774e01bfcd97f96180298c449c8623fb94c" 596 | dependencies: 597 | es-to-primitive "^1.1.1" 598 | function-bind "^1.1.0" 599 | is-callable "^1.1.3" 600 | is-regex "^1.0.3" 601 | 602 | es-to-primitive@^1.1.1: 603 | version "1.1.1" 604 | resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d" 605 | dependencies: 606 | is-callable "^1.1.1" 607 | is-date-object "^1.0.1" 608 | is-symbol "^1.0.1" 609 | 610 | es-to-primitive@^1.2.0: 611 | version "1.2.0" 612 | resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377" 613 | integrity sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg== 614 | dependencies: 615 | is-callable "^1.1.4" 616 | is-date-object "^1.0.1" 617 | is-symbol "^1.0.2" 618 | 619 | es5-ext@^0.10.14, es5-ext@^0.10.9, es5-ext@~0.10.14: 620 | version "0.10.14" 621 | resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.14.tgz#625bc9ab9cac0f6fb9dc271525823d1800b3d360" 622 | dependencies: 623 | es6-iterator "2" 624 | es6-symbol "~3.1" 625 | 626 | es6-iterator@2: 627 | version "2.0.1" 628 | resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.1.tgz#8e319c9f0453bf575d374940a655920e59ca5512" 629 | dependencies: 630 | d "1" 631 | es5-ext "^0.10.14" 632 | es6-symbol "^3.1" 633 | 634 | es6-symbol@^3.0.2, es6-symbol@^3.1, es6-symbol@~3.1: 635 | version "3.1.1" 636 | resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77" 637 | dependencies: 638 | d "1" 639 | es5-ext "~0.10.14" 640 | 641 | escape-string-regexp@^1.0.2: 642 | version "1.0.5" 643 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 644 | 645 | esprima@^3.1.1: 646 | version "3.1.3" 647 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" 648 | 649 | esprima@^4.0.0: 650 | version "4.0.1" 651 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" 652 | integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== 653 | 654 | execall@^1.0.0: 655 | version "1.0.0" 656 | resolved "https://registry.yarnpkg.com/execall/-/execall-1.0.0.tgz#73d0904e395b3cab0658b08d09ec25307f29bb73" 657 | integrity sha1-c9CQTjlbPKsGWLCNCewlMH8pu3M= 658 | dependencies: 659 | clone-regexp "^1.0.0" 660 | 661 | extend@^3.0.0, extend@~3.0.0: 662 | version "3.0.0" 663 | resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.0.tgz#5a474353b9f3353ddd8176dfd37b91c83a46f1d4" 664 | 665 | extsprintf@1.0.2: 666 | version "1.0.2" 667 | resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550" 668 | 669 | fast-levenshtein@~2.0.4: 670 | version "2.0.6" 671 | resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" 672 | 673 | file-entry-cache@^2.0.0: 674 | version "2.0.0" 675 | resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" 676 | dependencies: 677 | flat-cache "^1.2.1" 678 | object-assign "^4.0.1" 679 | 680 | flat-cache@^1.2.1: 681 | version "1.2.2" 682 | resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.2.2.tgz#fa86714e72c21db88601761ecf2f555d1abc6b96" 683 | dependencies: 684 | circular-json "^0.3.1" 685 | del "^2.0.2" 686 | graceful-fs "^4.1.2" 687 | write "^0.2.1" 688 | 689 | flatmap@0.0.3: 690 | version "0.0.3" 691 | resolved "https://registry.yarnpkg.com/flatmap/-/flatmap-0.0.3.tgz#1f18a4d938152d495965f9c958d923ab2dd669b4" 692 | 693 | foreach@^2.0.5: 694 | version "2.0.5" 695 | resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" 696 | 697 | forever-agent@~0.6.1: 698 | version "0.6.1" 699 | resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" 700 | 701 | form-data@~1.0.0-rc3, form-data@~1.0.0-rc4: 702 | version "1.0.1" 703 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-1.0.1.tgz#ae315db9a4907fa065502304a66d7733475ee37c" 704 | dependencies: 705 | async "^2.0.1" 706 | combined-stream "^1.0.5" 707 | mime-types "^2.1.11" 708 | 709 | fs-extra@0.26.5: 710 | version "0.26.5" 711 | resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.26.5.tgz#53ac74667ca083fd2dc1712c813039ca32d69a7f" 712 | dependencies: 713 | graceful-fs "^4.1.2" 714 | jsonfile "^2.1.0" 715 | klaw "^1.0.0" 716 | path-is-absolute "^1.0.0" 717 | rimraf "^2.2.8" 718 | 719 | fs-vacuum@~1.2.7, fs-vacuum@~1.2.9: 720 | version "1.2.10" 721 | resolved "https://registry.yarnpkg.com/fs-vacuum/-/fs-vacuum-1.2.10.tgz#b7629bec07a4031a2548fdf99f5ecf1cc8b31e36" 722 | dependencies: 723 | graceful-fs "^4.1.2" 724 | path-is-inside "^1.0.1" 725 | rimraf "^2.5.2" 726 | 727 | fs-write-stream-atomic@~1.0.8: 728 | version "1.0.10" 729 | resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" 730 | dependencies: 731 | graceful-fs "^4.1.2" 732 | iferr "^0.1.5" 733 | imurmurhash "^0.1.4" 734 | readable-stream "1 || 2" 735 | 736 | fs.realpath@^1.0.0: 737 | version "1.0.0" 738 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 739 | 740 | fstream-ignore@^1.0.0: 741 | version "1.0.5" 742 | resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" 743 | dependencies: 744 | fstream "^1.0.0" 745 | inherits "2" 746 | minimatch "^3.0.0" 747 | 748 | fstream-npm@~1.0.7: 749 | version "1.0.7" 750 | resolved "https://registry.yarnpkg.com/fstream-npm/-/fstream-npm-1.0.7.tgz#7ed0d1ac13d7686dd9e1bf6ceb8be273bf6d2f86" 751 | dependencies: 752 | fstream-ignore "^1.0.0" 753 | inherits "2" 754 | 755 | fstream-npm@~1.1.1: 756 | version "1.1.1" 757 | resolved "https://registry.yarnpkg.com/fstream-npm/-/fstream-npm-1.1.1.tgz#6b9175db6239a83d8209e232426c494dbb29690c" 758 | dependencies: 759 | fstream-ignore "^1.0.0" 760 | inherits "2" 761 | 762 | fstream@^1.0.0, fstream@^1.0.2, fstream@~1.0.10, fstream@~1.0.8: 763 | version "1.0.11" 764 | resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" 765 | dependencies: 766 | graceful-fs "^4.1.2" 767 | inherits "~2.0.0" 768 | mkdirp ">=0.5 0" 769 | rimraf "2" 770 | 771 | function-bind@^1.0.2, function-bind@^1.1.0: 772 | version "1.1.0" 773 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.0.tgz#16176714c801798e4e8f2cf7f7529467bb4a5771" 774 | 775 | function-bind@^1.1.1: 776 | version "1.1.1" 777 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 778 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== 779 | 780 | gauge@~1.2.5: 781 | version "1.2.7" 782 | resolved "https://registry.yarnpkg.com/gauge/-/gauge-1.2.7.tgz#e9cec5483d3d4ee0ef44b60a7d99e4935e136d93" 783 | dependencies: 784 | ansi "^0.3.0" 785 | has-unicode "^2.0.0" 786 | lodash.pad "^4.1.0" 787 | lodash.padend "^4.1.0" 788 | lodash.padstart "^4.1.0" 789 | 790 | generate-function@^2.0.0: 791 | version "2.0.0" 792 | resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74" 793 | 794 | generate-object-property@^1.1.0: 795 | version "1.2.0" 796 | resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0" 797 | dependencies: 798 | is-property "^1.0.0" 799 | 800 | get-stdin@^5.0.1: 801 | version "5.0.1" 802 | resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-5.0.1.tgz#122e161591e21ff4c52530305693f20e6393a398" 803 | 804 | getpass@^0.1.1: 805 | version "0.1.6" 806 | resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.6.tgz#283ffd9fc1256840875311c1b60e8c40187110e6" 807 | dependencies: 808 | assert-plus "^1.0.0" 809 | 810 | gitbook-cli@^2.3.0: 811 | version "2.3.0" 812 | resolved "https://registry.yarnpkg.com/gitbook-cli/-/gitbook-cli-2.3.0.tgz#01a360de71a48e53277ed2cb1abf6c60a0901576" 813 | dependencies: 814 | bash-color "0.0.4" 815 | commander "2.9.0" 816 | fs-extra "0.26.5" 817 | lodash "4.5.1" 818 | npm "3.7.5" 819 | npmi "1.0.1" 820 | optimist "0.6.1" 821 | q "1.4.1" 822 | semver "5.1.0" 823 | tmp "0.0.28" 824 | user-home "2.0.0" 825 | 826 | github-url-from-git@~1.4.0: 827 | version "1.4.0" 828 | resolved "https://registry.yarnpkg.com/github-url-from-git/-/github-url-from-git-1.4.0.tgz#285e6b520819001bde128674704379e4ff03e0de" 829 | 830 | github-url-from-username-repo@~1.0.2: 831 | version "1.0.2" 832 | resolved "https://registry.yarnpkg.com/github-url-from-username-repo/-/github-url-from-username-repo-1.0.2.tgz#7dd79330d2abe69c10c2cef79714c97215791dfa" 833 | 834 | "glob@3 || 4": 835 | version "4.5.3" 836 | resolved "https://registry.yarnpkg.com/glob/-/glob-4.5.3.tgz#c6cb73d3226c1efef04de3c56d012f03377ee15f" 837 | dependencies: 838 | inflight "^1.0.4" 839 | inherits "2" 840 | minimatch "^2.0.1" 841 | once "^1.3.0" 842 | 843 | glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1: 844 | version "7.1.1" 845 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" 846 | dependencies: 847 | fs.realpath "^1.0.0" 848 | inflight "^1.0.4" 849 | inherits "2" 850 | minimatch "^3.0.2" 851 | once "^1.3.0" 852 | path-is-absolute "^1.0.0" 853 | 854 | glob@~7.0.0, glob@~7.0.6: 855 | version "7.0.6" 856 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.0.6.tgz#211bafaf49e525b8cd93260d14ab136152b3f57a" 857 | dependencies: 858 | fs.realpath "^1.0.0" 859 | inflight "^1.0.4" 860 | inherits "2" 861 | minimatch "^3.0.2" 862 | once "^1.3.0" 863 | path-is-absolute "^1.0.0" 864 | 865 | globby@^5.0.0: 866 | version "5.0.0" 867 | resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" 868 | dependencies: 869 | array-union "^1.0.1" 870 | arrify "^1.0.0" 871 | glob "^7.0.3" 872 | object-assign "^4.0.1" 873 | pify "^2.0.0" 874 | pinkie-promise "^2.0.0" 875 | 876 | graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@~4.1.3, graceful-fs@~4.1.6: 877 | version "4.1.11" 878 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" 879 | 880 | "graceful-readlink@>= 1.0.0": 881 | version "1.0.1" 882 | resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" 883 | 884 | har-validator@~2.0.6: 885 | version "2.0.6" 886 | resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-2.0.6.tgz#cdcbc08188265ad119b6a5a7c8ab70eecfb5d27d" 887 | dependencies: 888 | chalk "^1.1.1" 889 | commander "^2.9.0" 890 | is-my-json-valid "^2.12.4" 891 | pinkie-promise "^2.0.0" 892 | 893 | has-ansi@^2.0.0: 894 | version "2.0.0" 895 | resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" 896 | dependencies: 897 | ansi-regex "^2.0.0" 898 | 899 | has-symbols@^1.0.0: 900 | version "1.0.0" 901 | resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" 902 | integrity sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q= 903 | 904 | has-unicode@^2.0.0, has-unicode@~2.0.0: 905 | version "2.0.1" 906 | resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" 907 | 908 | has@^1.0.1: 909 | version "1.0.1" 910 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28" 911 | dependencies: 912 | function-bind "^1.0.2" 913 | 914 | has@^1.0.3: 915 | version "1.0.3" 916 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 917 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== 918 | dependencies: 919 | function-bind "^1.1.1" 920 | 921 | hawk@~3.1.0, hawk@~3.1.3: 922 | version "3.1.3" 923 | resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" 924 | dependencies: 925 | boom "2.x.x" 926 | cryptiles "2.x.x" 927 | hoek "2.x.x" 928 | sntp "1.x.x" 929 | 930 | hoek@2.x.x: 931 | version "2.16.3" 932 | resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" 933 | 934 | hosted-git-info@^2.1.4, hosted-git-info@~2.1.4, hosted-git-info@~2.1.5: 935 | version "2.1.5" 936 | resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.1.5.tgz#0ba81d90da2e25ab34a332e6ec77936e1598118b" 937 | 938 | http-signature@~1.1.0: 939 | version "1.1.1" 940 | resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" 941 | dependencies: 942 | assert-plus "^0.2.0" 943 | jsprim "^1.2.2" 944 | sshpk "^1.7.0" 945 | 946 | iferr@^0.1.5, iferr@~0.1.5: 947 | version "0.1.5" 948 | resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" 949 | 950 | imurmurhash@^0.1.4: 951 | version "0.1.4" 952 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 953 | 954 | inflight@^1.0.4, inflight@~1.0.4: 955 | version "1.0.6" 956 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 957 | dependencies: 958 | once "^1.3.0" 959 | wrappy "1" 960 | 961 | inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: 962 | version "2.0.3" 963 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 964 | 965 | ini@^1.3.4, ini@~1.3.4: 966 | version "1.3.4" 967 | resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" 968 | 969 | init-package-json@~1.9.3, init-package-json@~1.9.4: 970 | version "1.9.5" 971 | resolved "https://registry.yarnpkg.com/init-package-json/-/init-package-json-1.9.5.tgz#7d4d64a264dc76c1f1f557cbbe824978bf10cd09" 972 | dependencies: 973 | glob "^7.1.1" 974 | npm-package-arg "^4.0.0" 975 | promzard "^0.3.0" 976 | read "~1.0.1" 977 | read-package-json "1 || 2" 978 | semver "2.x || 3.x || 4 || 5" 979 | validate-npm-package-license "^3.0.1" 980 | validate-npm-package-name "^3.0.0" 981 | 982 | interop-require@^1.0.0: 983 | version "1.0.0" 984 | resolved "https://registry.yarnpkg.com/interop-require/-/interop-require-1.0.0.tgz#e53103679944c88d7e6105b62a9f4475c783971e" 985 | 986 | interpret@^1.0.0: 987 | version "1.0.1" 988 | resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.0.1.tgz#d579fb7f693b858004947af39fa0db49f795602c" 989 | 990 | is-alphabetical@^1.0.0: 991 | version "1.0.0" 992 | resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.0.tgz#e2544c13058255f2144cb757066cd3342a1c8c46" 993 | 994 | is-alphanumerical@^1.0.0: 995 | version "1.0.0" 996 | resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.0.tgz#e06492e719c1bf15dec239e4f1af5f67b4d6e7bf" 997 | dependencies: 998 | is-alphabetical "^1.0.0" 999 | is-decimal "^1.0.0" 1000 | 1001 | is-arrayish@^0.2.1: 1002 | version "0.2.1" 1003 | resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" 1004 | 1005 | is-buffer@~1.1.1: 1006 | version "1.1.5" 1007 | resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.5.tgz#1f3b26ef613b214b88cbca23cc6c01d87961eecc" 1008 | 1009 | is-builtin-module@^1.0.0: 1010 | version "1.0.0" 1011 | resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" 1012 | dependencies: 1013 | builtin-modules "^1.0.0" 1014 | 1015 | is-callable@^1.1.1, is-callable@^1.1.3: 1016 | version "1.1.3" 1017 | resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.3.tgz#86eb75392805ddc33af71c92a0eedf74ee7604b2" 1018 | 1019 | is-callable@^1.1.4: 1020 | version "1.1.4" 1021 | resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" 1022 | integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA== 1023 | 1024 | is-date-object@^1.0.1: 1025 | version "1.0.1" 1026 | resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" 1027 | 1028 | is-decimal@^1.0.0: 1029 | version "1.0.0" 1030 | resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.0.tgz#940579b6ea63c628080a69e62bda88c8470b4fe0" 1031 | 1032 | is-file@^1.0.0: 1033 | version "1.0.0" 1034 | resolved "https://registry.yarnpkg.com/is-file/-/is-file-1.0.0.tgz#28a44cfbd9d3db193045f22b65fce8edf9620596" 1035 | 1036 | is-fullwidth-code-point@^1.0.0: 1037 | version "1.0.0" 1038 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" 1039 | dependencies: 1040 | number-is-nan "^1.0.0" 1041 | 1042 | is-fullwidth-code-point@^2.0.0: 1043 | version "2.0.0" 1044 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 1045 | 1046 | is-hexadecimal@^1.0.0: 1047 | version "1.0.0" 1048 | resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.0.tgz#5c459771d2af9a2e3952781fd54fcb1bcfe4113c" 1049 | 1050 | is-my-json-valid@^2.12.4: 1051 | version "2.16.0" 1052 | resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.16.0.tgz#f079dd9bfdae65ee2038aae8acbc86ab109e3693" 1053 | dependencies: 1054 | generate-function "^2.0.0" 1055 | generate-object-property "^1.1.0" 1056 | jsonpointer "^4.0.0" 1057 | xtend "^4.0.0" 1058 | 1059 | is-path-cwd@^1.0.0: 1060 | version "1.0.0" 1061 | resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" 1062 | 1063 | is-path-in-cwd@^1.0.0: 1064 | version "1.0.0" 1065 | resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003be8a9eac04dc" 1066 | dependencies: 1067 | is-path-inside "^1.0.0" 1068 | 1069 | is-path-inside@^1.0.0: 1070 | version "1.0.0" 1071 | resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.0.tgz#fc06e5a1683fbda13de667aff717bbc10a48f37f" 1072 | dependencies: 1073 | path-is-inside "^1.0.1" 1074 | 1075 | is-property@^1.0.0: 1076 | version "1.0.2" 1077 | resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" 1078 | 1079 | is-regex@^1.0.3, is-regex@^1.0.4: 1080 | version "1.0.4" 1081 | resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" 1082 | dependencies: 1083 | has "^1.0.1" 1084 | 1085 | is-regexp@^1.0.0: 1086 | version "1.0.0" 1087 | resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" 1088 | integrity sha1-/S2INUXEa6xaYz57mgnof6LLUGk= 1089 | 1090 | is-supported-regexp-flag@^1.0.0: 1091 | version "1.0.1" 1092 | resolved "https://registry.yarnpkg.com/is-supported-regexp-flag/-/is-supported-regexp-flag-1.0.1.tgz#21ee16518d2c1dd3edd3e9a0d57e50207ac364ca" 1093 | integrity sha512-3vcJecUUrpgCqc/ca0aWeNu64UGgxcvO60K/Fkr1N6RSvfGCTU60UKN68JDmKokgba0rFFJs12EnzOQa14ubKQ== 1094 | 1095 | is-symbol@^1.0.1: 1096 | version "1.0.1" 1097 | resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572" 1098 | 1099 | is-symbol@^1.0.2: 1100 | version "1.0.2" 1101 | resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38" 1102 | integrity sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw== 1103 | dependencies: 1104 | has-symbols "^1.0.0" 1105 | 1106 | is-typedarray@~1.0.0: 1107 | version "1.0.0" 1108 | resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" 1109 | 1110 | is-utf8@^0.2.0: 1111 | version "0.2.1" 1112 | resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" 1113 | 1114 | isarray@~1.0.0: 1115 | version "1.0.0" 1116 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 1117 | 1118 | isexe@^1.1.1: 1119 | version "1.1.2" 1120 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-1.1.2.tgz#36f3e22e60750920f5e7241a476a8c6a42275ad0" 1121 | 1122 | isstream@~0.1.2: 1123 | version "0.1.2" 1124 | resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" 1125 | 1126 | japanese-numerals-to-number@^1.0.2: 1127 | version "1.0.2" 1128 | resolved "https://registry.yarnpkg.com/japanese-numerals-to-number/-/japanese-numerals-to-number-1.0.2.tgz#cbfcb18ca6e93a51b062f33a5e5d29d9d7693d94" 1129 | integrity sha1-y/yxjKbpOlGwYvM6Xl0p2ddpPZQ= 1130 | 1131 | jju@^1.1.0: 1132 | version "1.3.0" 1133 | resolved "https://registry.yarnpkg.com/jju/-/jju-1.3.0.tgz#dadd9ef01924bc728b03f2f7979bdbd62f7a2aaa" 1134 | 1135 | jodid25519@^1.0.0: 1136 | version "1.0.2" 1137 | resolved "https://registry.yarnpkg.com/jodid25519/-/jodid25519-1.0.2.tgz#06d4912255093419477d425633606e0e90782967" 1138 | dependencies: 1139 | jsbn "~0.1.0" 1140 | 1141 | joyo-kanji@^0.2.1: 1142 | version "0.2.1" 1143 | resolved "https://registry.yarnpkg.com/joyo-kanji/-/joyo-kanji-0.2.1.tgz#5e2e8ea2b903ba9333f1680c66902fc9682ea592" 1144 | 1145 | js-yaml@^3.2.4, js-yaml@^3.6.1: 1146 | version "3.8.2" 1147 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.8.2.tgz#02d3e2c0f6beab20248d412c352203827d786721" 1148 | dependencies: 1149 | argparse "^1.0.7" 1150 | esprima "^3.1.1" 1151 | 1152 | js-yaml@^3.9.1: 1153 | version "3.13.1" 1154 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" 1155 | integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== 1156 | dependencies: 1157 | argparse "^1.0.7" 1158 | esprima "^4.0.0" 1159 | 1160 | jsbn@~0.1.0: 1161 | version "0.1.1" 1162 | resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" 1163 | 1164 | json-parse-helpfulerror@^1.0.2: 1165 | version "1.0.3" 1166 | resolved "https://registry.yarnpkg.com/json-parse-helpfulerror/-/json-parse-helpfulerror-1.0.3.tgz#13f14ce02eed4e981297b64eb9e3b932e2dd13dc" 1167 | dependencies: 1168 | jju "^1.1.0" 1169 | 1170 | json-schema@0.2.3: 1171 | version "0.2.3" 1172 | resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" 1173 | 1174 | json-stable-stringify@^1.0.1: 1175 | version "1.0.1" 1176 | resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" 1177 | dependencies: 1178 | jsonify "~0.0.0" 1179 | 1180 | json-stringify-safe@~5.0.1: 1181 | version "5.0.1" 1182 | resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" 1183 | 1184 | json5@^0.5.0: 1185 | version "0.5.1" 1186 | resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" 1187 | 1188 | jsonfile@^2.1.0: 1189 | version "2.4.0" 1190 | resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" 1191 | optionalDependencies: 1192 | graceful-fs "^4.1.6" 1193 | 1194 | jsonify@~0.0.0: 1195 | version "0.0.0" 1196 | resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" 1197 | 1198 | jsonpointer@^4.0.0: 1199 | version "4.0.1" 1200 | resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9" 1201 | 1202 | jsprim@^1.2.2: 1203 | version "1.4.0" 1204 | resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.0.tgz#a3b87e40298d8c380552d8cc7628a0bb95a22918" 1205 | dependencies: 1206 | assert-plus "1.0.0" 1207 | extsprintf "1.0.2" 1208 | json-schema "0.2.3" 1209 | verror "1.3.6" 1210 | 1211 | klaw@^1.0.0: 1212 | version "1.3.1" 1213 | resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" 1214 | optionalDependencies: 1215 | graceful-fs "^4.1.9" 1216 | 1217 | kuromoji@0.1.1, kuromoji@^0.1.1: 1218 | version "0.1.1" 1219 | resolved "https://registry.yarnpkg.com/kuromoji/-/kuromoji-0.1.1.tgz#4aabf39bcced8b8ad92d007a04a26be6da8477c9" 1220 | dependencies: 1221 | async "^2.0.1" 1222 | doublearray "0.0.2" 1223 | zlibjs "^0.2.0" 1224 | 1225 | kuromojin@^1.0.2, kuromojin@^1.1.0, kuromojin@^1.2.1, kuromojin@^1.3.1: 1226 | version "1.3.2" 1227 | resolved "https://registry.yarnpkg.com/kuromojin/-/kuromojin-1.3.2.tgz#342bb5cfbee69c9bb31d3fc439a8ad69fd281b11" 1228 | dependencies: 1229 | kuromoji "^0.1.1" 1230 | 1231 | kuromojin@^1.3.2: 1232 | version "1.5.1" 1233 | resolved "https://registry.yarnpkg.com/kuromojin/-/kuromojin-1.5.1.tgz#f5c4cc2d4a8b56343c7281f7def8d56309184078" 1234 | integrity sha512-tzt3UUqWqzwHMsahchyrcs9kgbn6OM7xP4QRCd0w5vqE0lA/cjCH0OxjLaekz5cnxGmcy8RfN7La3xOxZOvJ1w== 1235 | dependencies: 1236 | kuromoji "0.1.1" 1237 | 1238 | levn@~0.3.0: 1239 | version "0.3.0" 1240 | resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" 1241 | dependencies: 1242 | prelude-ls "~1.1.2" 1243 | type-check "~0.3.2" 1244 | 1245 | load-json-file@^1.0.0: 1246 | version "1.1.0" 1247 | resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" 1248 | dependencies: 1249 | graceful-fs "^4.1.2" 1250 | parse-json "^2.2.0" 1251 | pify "^2.0.0" 1252 | pinkie-promise "^2.0.0" 1253 | strip-bom "^2.0.0" 1254 | 1255 | lockfile@~1.0.1: 1256 | version "1.0.3" 1257 | resolved "https://registry.yarnpkg.com/lockfile/-/lockfile-1.0.3.tgz#2638fc39a0331e9cac1a04b71799931c9c50df79" 1258 | 1259 | lodash._baseclone@~4.5.0: 1260 | version "4.5.7" 1261 | resolved "https://registry.yarnpkg.com/lodash._baseclone/-/lodash._baseclone-4.5.7.tgz#ce42ade08384ef5d62fa77c30f61a46e686f8434" 1262 | 1263 | lodash._basedifference@~4.4.0: 1264 | version "4.4.1" 1265 | resolved "https://registry.yarnpkg.com/lodash._basedifference/-/lodash._basedifference-4.4.1.tgz#537bde6fd0f3eeec28e37288dd51459765181b4d" 1266 | dependencies: 1267 | lodash._setcache "~4.1.0" 1268 | 1269 | lodash._baseflatten@~4.1.0: 1270 | version "4.1.1" 1271 | resolved "https://registry.yarnpkg.com/lodash._baseflatten/-/lodash._baseflatten-4.1.1.tgz#5c87403b88f3687a88d26424faadf3aa054aab0d" 1272 | 1273 | lodash._baseuniq@~4.4.0: 1274 | version "4.4.0" 1275 | resolved "https://registry.yarnpkg.com/lodash._baseuniq/-/lodash._baseuniq-4.4.0.tgz#a445294347a2f5311f585fe3225644530b9b8fae" 1276 | dependencies: 1277 | lodash._root "^3.0.0" 1278 | lodash._setcache "^4.0.0" 1279 | 1280 | lodash._baseuniq@~4.5.0: 1281 | version "4.5.1" 1282 | resolved "https://registry.yarnpkg.com/lodash._baseuniq/-/lodash._baseuniq-4.5.1.tgz#1980430c2e64ee86df6dd35794e1a301b2ab74de" 1283 | dependencies: 1284 | lodash._createset "~4.0.0" 1285 | lodash._setcache "~4.1.0" 1286 | 1287 | lodash._createset@~4.0.0: 1288 | version "4.0.3" 1289 | resolved "https://registry.yarnpkg.com/lodash._createset/-/lodash._createset-4.0.3.tgz#0f4659fbb09d75194fa9e2b88a6644d363c9fe26" 1290 | 1291 | lodash._root@^3.0.0: 1292 | version "3.0.1" 1293 | resolved "https://registry.yarnpkg.com/lodash._root/-/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692" 1294 | 1295 | lodash._setcache@^4.0.0, lodash._setcache@~4.1.0: 1296 | version "4.1.3" 1297 | resolved "https://registry.yarnpkg.com/lodash._setcache/-/lodash._setcache-4.1.3.tgz#4f982081255a11810fb4b0431d49e2da65adb77c" 1298 | 1299 | lodash.clonedeep@~4.3.0: 1300 | version "4.3.2" 1301 | resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.3.2.tgz#d0112c02c76b5223833aebc6a4b6e334f0d057de" 1302 | dependencies: 1303 | lodash._baseclone "~4.5.0" 1304 | 1305 | lodash.isarguments@~3.0.7: 1306 | version "3.0.9" 1307 | resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.0.9.tgz#3c4994a4210f340d49ccfafa62176296207d8675" 1308 | 1309 | lodash.isarray@~4.0.0: 1310 | version "4.0.0" 1311 | resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-4.0.0.tgz#2aca496b28c4ca6d726715313590c02e6ea34403" 1312 | 1313 | lodash.keys@~4.0.3: 1314 | version "4.0.8" 1315 | resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-4.0.8.tgz#c0cf45d2fcf576c83055404d674c7e637c83ae81" 1316 | 1317 | lodash.pad@^4.1.0: 1318 | version "4.5.1" 1319 | resolved "https://registry.yarnpkg.com/lodash.pad/-/lodash.pad-4.5.1.tgz#4330949a833a7c8da22cc20f6a26c4d59debba70" 1320 | 1321 | lodash.padend@^4.1.0: 1322 | version "4.6.1" 1323 | resolved "https://registry.yarnpkg.com/lodash.padend/-/lodash.padend-4.6.1.tgz#53ccba047d06e158d311f45da625f4e49e6f166e" 1324 | 1325 | lodash.padstart@^4.1.0: 1326 | version "4.6.1" 1327 | resolved "https://registry.yarnpkg.com/lodash.padstart/-/lodash.padstart-4.6.1.tgz#d2e3eebff0d9d39ad50f5cbd1b52a7bce6bb611b" 1328 | 1329 | lodash.rest@^4.0.0: 1330 | version "4.0.5" 1331 | resolved "https://registry.yarnpkg.com/lodash.rest/-/lodash.rest-4.0.5.tgz#954ef75049262038c96d1fc98b28fdaf9f0772aa" 1332 | 1333 | lodash.union@~4.2.0: 1334 | version "4.2.1" 1335 | resolved "https://registry.yarnpkg.com/lodash.union/-/lodash.union-4.2.1.tgz#6871017b9b1ff71952c1e2bb2e25b1046a7e2842" 1336 | dependencies: 1337 | lodash._baseflatten "~4.1.0" 1338 | lodash._baseuniq "~4.5.0" 1339 | lodash.rest "^4.0.0" 1340 | 1341 | lodash.uniq@~4.2.0: 1342 | version "4.2.1" 1343 | resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.2.1.tgz#4210d4b90647ee24211b469aed0ef84902069743" 1344 | dependencies: 1345 | lodash._baseuniq "~4.5.0" 1346 | 1347 | lodash.without@~4.1.0: 1348 | version "4.1.2" 1349 | resolved "https://registry.yarnpkg.com/lodash.without/-/lodash.without-4.1.2.tgz#c68b1981e1b001bd87eef7487dba0af267846229" 1350 | dependencies: 1351 | lodash._basedifference "~4.4.0" 1352 | lodash.rest "^4.0.0" 1353 | 1354 | lodash@4.5.1, lodash@^4.0.0: 1355 | version "4.5.1" 1356 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.5.1.tgz#80e8a074ca5f3893a6b1c10b2a636492d710c316" 1357 | 1358 | lodash@^4.14.0: 1359 | version "4.17.4" 1360 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" 1361 | 1362 | log-symbols@^1.0.2: 1363 | version "1.0.2" 1364 | resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18" 1365 | dependencies: 1366 | chalk "^1.0.0" 1367 | 1368 | longest-streak@^1.0.0: 1369 | version "1.0.0" 1370 | resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-1.0.0.tgz#d06597c4d4c31b52ccb1f5d8f8fe7148eafd6965" 1371 | 1372 | lru-cache@2: 1373 | version "2.7.3" 1374 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952" 1375 | 1376 | lru-cache@~4.0.1: 1377 | version "4.0.2" 1378 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.0.2.tgz#1d17679c069cda5d040991a09dbc2c0db377e55e" 1379 | dependencies: 1380 | pseudomap "^1.0.1" 1381 | yallist "^2.0.0" 1382 | 1383 | map-like@^1.0.1: 1384 | version "1.0.3" 1385 | resolved "https://registry.yarnpkg.com/map-like/-/map-like-1.0.3.tgz#1bda42b0510116730c878366de9e7ef8cc375131" 1386 | 1387 | markdown-table@^0.4.0: 1388 | version "0.4.0" 1389 | resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-0.4.0.tgz#890c2c1b3bfe83fb00e4129b8e4cfe645270f9d1" 1390 | 1391 | markdown-to-ast@^3.4.0: 1392 | version "3.4.0" 1393 | resolved "https://registry.yarnpkg.com/markdown-to-ast/-/markdown-to-ast-3.4.0.tgz#0e2cba81390b0549a9153ec3b0d915b61c164be7" 1394 | dependencies: 1395 | debug "^2.1.3" 1396 | remark "^5.0.1" 1397 | structured-source "^3.0.2" 1398 | traverse "^0.6.6" 1399 | 1400 | match-index@^1.0.1: 1401 | version "1.0.1" 1402 | resolved "https://registry.yarnpkg.com/match-index/-/match-index-1.0.1.tgz#b4b673e99ab3ac5a6af303ccf4db709812bc3f58" 1403 | dependencies: 1404 | regexp.prototype.flags "^1.1.1" 1405 | 1406 | md5@^2.2.1: 1407 | version "2.2.1" 1408 | resolved "https://registry.yarnpkg.com/md5/-/md5-2.2.1.tgz#53ab38d5fe3c8891ba465329ea23fac0540126f9" 1409 | dependencies: 1410 | charenc "~0.0.1" 1411 | crypt "~0.0.1" 1412 | is-buffer "~1.1.1" 1413 | 1414 | mime-db@~1.26.0: 1415 | version "1.26.0" 1416 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.26.0.tgz#eaffcd0e4fc6935cf8134da246e2e6c35305adff" 1417 | 1418 | mime-types@^2.1.11, mime-types@~2.1.7: 1419 | version "2.1.14" 1420 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.14.tgz#f7ef7d97583fcaf3b7d282b6f8b5679dab1e94ee" 1421 | dependencies: 1422 | mime-db "~1.26.0" 1423 | 1424 | minimatch@1: 1425 | version "1.0.0" 1426 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-1.0.0.tgz#e0dd2120b49e1b724ce8d714c520822a9438576d" 1427 | dependencies: 1428 | lru-cache "2" 1429 | sigmund "~1.0.0" 1430 | 1431 | minimatch@^2.0.1: 1432 | version "2.0.10" 1433 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-2.0.10.tgz#8d087c39c6b38c001b97fca7ce6d0e1e80afbac7" 1434 | dependencies: 1435 | brace-expansion "^1.0.0" 1436 | 1437 | minimatch@^3.0.0, minimatch@^3.0.2, minimatch@~3.0.3: 1438 | version "3.0.3" 1439 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.3.tgz#2a4e4090b96b2db06a9d7df01055a62a77c9b774" 1440 | dependencies: 1441 | brace-expansion "^1.0.0" 1442 | 1443 | minimist@0.0.8: 1444 | version "0.0.8" 1445 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 1446 | 1447 | minimist@~0.0.1: 1448 | version "0.0.10" 1449 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" 1450 | 1451 | "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: 1452 | version "0.5.1" 1453 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 1454 | dependencies: 1455 | minimist "0.0.8" 1456 | 1457 | moji@^0.5.1: 1458 | version "0.5.1" 1459 | resolved "https://registry.yarnpkg.com/moji/-/moji-0.5.1.tgz#088eecd1c22c8f31a240adcf9c95e54f33eb54fb" 1460 | dependencies: 1461 | object-assign "^3.0.0" 1462 | 1463 | morpheme-match-all@^1.1.0: 1464 | version "1.2.0" 1465 | resolved "https://registry.yarnpkg.com/morpheme-match-all/-/morpheme-match-all-1.2.0.tgz#1aa437de0c0bfe2874f299d0206151248a75a7cb" 1466 | integrity sha512-z8F1k4U8fAMcjkGBDWwVrKZLR8VSvKtYh6+5GZ9hi5mtXrYMILwDMgiPwfNGJvk/liQEG9/oNAJUcwLpyjI9Xg== 1467 | dependencies: 1468 | morpheme-match "^1.2.1" 1469 | 1470 | morpheme-match@^1.0.1: 1471 | version "1.1.0" 1472 | resolved "https://registry.yarnpkg.com/morpheme-match/-/morpheme-match-1.1.0.tgz#d8f3330b95e5f27d1cb610f763285c724c25874a" 1473 | 1474 | morpheme-match@^1.2.1: 1475 | version "1.2.1" 1476 | resolved "https://registry.yarnpkg.com/morpheme-match/-/morpheme-match-1.2.1.tgz#783cdcf9feb0e8e7da7e794a8a38f6d711796aa0" 1477 | integrity sha512-SSIcFPas4Dctx5PbrfKbW5XNADlkcn38LI+fqgB9QtminQ7FXeOR3//rnAmooZ1/5zTGeFoi8H9kFBAH9y1nfQ== 1478 | 1479 | ms@0.7.2: 1480 | version "0.7.2" 1481 | resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765" 1482 | 1483 | mute-stream@~0.0.4: 1484 | version "0.0.7" 1485 | resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" 1486 | 1487 | node-gyp@~3.3.0: 1488 | version "3.3.1" 1489 | resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.3.1.tgz#80f7b6d7c2f9c0495ba42c518a670c99bdf6e4a0" 1490 | dependencies: 1491 | fstream "^1.0.0" 1492 | glob "3 || 4" 1493 | graceful-fs "^4.1.2" 1494 | minimatch "1" 1495 | mkdirp "^0.5.0" 1496 | nopt "2 || 3" 1497 | npmlog "0 || 1 || 2" 1498 | osenv "0" 1499 | path-array "^1.0.0" 1500 | request "2" 1501 | rimraf "2" 1502 | semver "2.x || 3.x || 4 || 5" 1503 | tar "^2.0.0" 1504 | which "1" 1505 | 1506 | node-gyp@~3.4.0: 1507 | version "3.4.0" 1508 | resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.4.0.tgz#dda558393b3ecbbe24c9e6b8703c71194c63fa36" 1509 | dependencies: 1510 | fstream "^1.0.0" 1511 | glob "^7.0.3" 1512 | graceful-fs "^4.1.2" 1513 | minimatch "^3.0.2" 1514 | mkdirp "^0.5.0" 1515 | nopt "2 || 3" 1516 | npmlog "0 || 1 || 2 || 3" 1517 | osenv "0" 1518 | path-array "^1.0.0" 1519 | request "2" 1520 | rimraf "2" 1521 | semver "2.x || 3.x || 4 || 5" 1522 | tar "^2.0.0" 1523 | which "1" 1524 | 1525 | node-uuid@~1.4.7: 1526 | version "1.4.7" 1527 | resolved "https://registry.yarnpkg.com/node-uuid/-/node-uuid-1.4.7.tgz#6da5a17668c4b3dd59623bda11cf7fa4c1f60a6f" 1528 | 1529 | "nopt@2 || 3", nopt@~3.0.6: 1530 | version "3.0.6" 1531 | resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" 1532 | dependencies: 1533 | abbrev "1" 1534 | 1535 | normalize-git-url@~3.0.1, normalize-git-url@~3.0.2: 1536 | version "3.0.2" 1537 | resolved "https://registry.yarnpkg.com/normalize-git-url/-/normalize-git-url-3.0.2.tgz#8e5f14be0bdaedb73e07200310aa416c27350fc4" 1538 | 1539 | normalize-package-data@^2.0.0, normalize-package-data@^2.3.2, "normalize-package-data@~1.0.1 || ^2.0.0", normalize-package-data@~2.3.5: 1540 | version "2.3.6" 1541 | resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.3.6.tgz#498fa420c96401f787402ba21e600def9f981fff" 1542 | dependencies: 1543 | hosted-git-info "^2.1.4" 1544 | is-builtin-module "^1.0.0" 1545 | semver "2 || 3 || 4 || 5" 1546 | validate-npm-package-license "^3.0.1" 1547 | 1548 | npm-cache-filename@~1.0.2: 1549 | version "1.0.2" 1550 | resolved "https://registry.yarnpkg.com/npm-cache-filename/-/npm-cache-filename-1.0.2.tgz#ded306c5b0bfc870a9e9faf823bc5f283e05ae11" 1551 | 1552 | npm-install-checks@~1.0.7: 1553 | version "1.0.7" 1554 | resolved "https://registry.yarnpkg.com/npm-install-checks/-/npm-install-checks-1.0.7.tgz#6d91aeda0ac96801f1ed7aadee116a6c0a086a57" 1555 | dependencies: 1556 | npmlog "0.1 || 1 || 2" 1557 | semver "^2.3.0 || 3.x || 4 || 5" 1558 | 1559 | npm-install-checks@~3.0.0: 1560 | version "3.0.0" 1561 | resolved "https://registry.yarnpkg.com/npm-install-checks/-/npm-install-checks-3.0.0.tgz#d4aecdfd51a53e3723b7b2f93b2ee28e307bc0d7" 1562 | dependencies: 1563 | semver "^2.3.0 || 3.x || 4 || 5" 1564 | 1565 | "npm-package-arg@^3.0.0 || ^4.0.0", npm-package-arg@^4.0.0, npm-package-arg@^4.1.1, npm-package-arg@~4.1.0: 1566 | version "4.1.1" 1567 | resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-4.1.1.tgz#86d9dca985b4c5e5d59772dfd5de6919998a495a" 1568 | dependencies: 1569 | hosted-git-info "^2.1.4" 1570 | semver "4 || 5" 1571 | 1572 | npm-registry-client@~7.0.9: 1573 | version "7.0.9" 1574 | resolved "https://registry.yarnpkg.com/npm-registry-client/-/npm-registry-client-7.0.9.tgz#1baf86ee5285c4e6d38d4556208ded56049231bb" 1575 | dependencies: 1576 | chownr "^1.0.1" 1577 | concat-stream "^1.4.6" 1578 | graceful-fs "^4.1.2" 1579 | mkdirp "^0.5.0" 1580 | normalize-package-data "~1.0.1 || ^2.0.0" 1581 | npm-package-arg "^3.0.0 || ^4.0.0" 1582 | once "^1.3.0" 1583 | request "^2.47.0" 1584 | retry "^0.8.0" 1585 | rimraf "2" 1586 | semver "2 >=2.2.1 || 3.x || 4 || 5" 1587 | slide "^1.1.3" 1588 | optionalDependencies: 1589 | npmlog "~2.0.0" 1590 | 1591 | npm-registry-client@~7.2.1: 1592 | version "7.2.1" 1593 | resolved "https://registry.yarnpkg.com/npm-registry-client/-/npm-registry-client-7.2.1.tgz#c792266b088cc313f8525e7e35248626c723db75" 1594 | dependencies: 1595 | concat-stream "^1.5.2" 1596 | graceful-fs "^4.1.6" 1597 | normalize-package-data "~1.0.1 || ^2.0.0" 1598 | npm-package-arg "^3.0.0 || ^4.0.0" 1599 | once "^1.3.3" 1600 | request "^2.74.0" 1601 | retry "^0.10.0" 1602 | semver "2 >=2.2.1 || 3.x || 4 || 5" 1603 | slide "^1.1.3" 1604 | optionalDependencies: 1605 | npmlog "~2.0.0 || ~3.1.0" 1606 | 1607 | npm-user-validate@~0.1.2, npm-user-validate@~0.1.5: 1608 | version "0.1.5" 1609 | resolved "https://registry.yarnpkg.com/npm-user-validate/-/npm-user-validate-0.1.5.tgz#52465d50c2d20294a57125b996baedbf56c5004b" 1610 | 1611 | npm@3.7.5: 1612 | version "3.7.5" 1613 | resolved "https://registry.yarnpkg.com/npm/-/npm-3.7.5.tgz#a7dae58e52ecbe263c1c860c6fd64ffa50f3c79b" 1614 | dependencies: 1615 | abbrev "~1.0.7" 1616 | ansicolors "~0.3.2" 1617 | ansistyles "~0.1.3" 1618 | aproba "~1.0.1" 1619 | archy "~1.0.0" 1620 | async-some "~1.0.2" 1621 | chownr "~1.0.1" 1622 | cmd-shim "~2.0.2" 1623 | columnify "~1.5.4" 1624 | config-chain "~1.1.10" 1625 | dezalgo "~1.0.3" 1626 | editor "~1.0.0" 1627 | fs-vacuum "~1.2.7" 1628 | fs-write-stream-atomic "~1.0.8" 1629 | fstream "~1.0.8" 1630 | fstream-npm "~1.0.7" 1631 | glob "~7.0.0" 1632 | graceful-fs "~4.1.3" 1633 | has-unicode "~2.0.0" 1634 | hosted-git-info "~2.1.4" 1635 | iferr "~0.1.5" 1636 | inflight "~1.0.4" 1637 | inherits "~2.0.1" 1638 | ini "~1.3.4" 1639 | init-package-json "~1.9.3" 1640 | lockfile "~1.0.1" 1641 | lodash._baseuniq "~4.4.0" 1642 | lodash.clonedeep "~4.3.0" 1643 | lodash.isarguments "~3.0.7" 1644 | lodash.isarray "~4.0.0" 1645 | lodash.keys "~4.0.3" 1646 | lodash.union "~4.2.0" 1647 | lodash.uniq "~4.2.0" 1648 | lodash.without "~4.1.0" 1649 | mkdirp "~0.5.1" 1650 | node-gyp "~3.3.0" 1651 | nopt "~3.0.6" 1652 | normalize-git-url "~3.0.1" 1653 | normalize-package-data "~2.3.5" 1654 | npm-cache-filename "~1.0.2" 1655 | npm-install-checks "~3.0.0" 1656 | npm-package-arg "~4.1.0" 1657 | npm-registry-client "~7.0.9" 1658 | npm-user-validate "~0.1.2" 1659 | npmlog "~2.0.2" 1660 | once "~1.3.3" 1661 | opener "~1.4.1" 1662 | osenv "~0.1.3" 1663 | path-is-inside "~1.0.1" 1664 | read "~1.0.7" 1665 | read-cmd-shim "~1.0.1" 1666 | read-installed "~4.0.3" 1667 | read-package-json "~2.0.3" 1668 | read-package-tree "~5.1.2" 1669 | readable-stream "~2.0.5" 1670 | realize-package-specifier "~3.0.1" 1671 | request "~2.69.0" 1672 | retry "~0.9.0" 1673 | rimraf "~2.5.2" 1674 | semver "~5.1.0" 1675 | sha "~2.0.1" 1676 | slide "~1.1.6" 1677 | sorted-object "~1.0.0" 1678 | tar "~2.2.1" 1679 | text-table "~0.2.0" 1680 | uid-number "0.0.6" 1681 | umask "~1.1.0" 1682 | unique-filename "~1.1.0" 1683 | unpipe "~1.0.0" 1684 | validate-npm-package-name "~2.2.2" 1685 | which "~1.2.4" 1686 | wrappy "~1.0.1" 1687 | write-file-atomic "~1.1.4" 1688 | 1689 | npm@^2.1.12: 1690 | version "2.15.11" 1691 | resolved "https://registry.yarnpkg.com/npm/-/npm-2.15.11.tgz#350588fba9cd8d384cf9a6e8dc0fef0f94992b7c" 1692 | dependencies: 1693 | abbrev "~1.0.9" 1694 | ansi "~0.3.1" 1695 | ansicolors "~0.3.2" 1696 | ansistyles "~0.1.3" 1697 | archy "~1.0.0" 1698 | async-some "~1.0.2" 1699 | block-stream "0.0.9" 1700 | char-spinner "~1.0.1" 1701 | chmodr "~1.0.2" 1702 | chownr "~1.0.1" 1703 | cmd-shim "~2.0.2" 1704 | columnify "~1.5.4" 1705 | config-chain "~1.1.10" 1706 | dezalgo "~1.0.3" 1707 | editor "~1.0.0" 1708 | fs-vacuum "~1.2.9" 1709 | fs-write-stream-atomic "~1.0.8" 1710 | fstream "~1.0.10" 1711 | fstream-npm "~1.1.1" 1712 | github-url-from-git "~1.4.0" 1713 | github-url-from-username-repo "~1.0.2" 1714 | glob "~7.0.6" 1715 | graceful-fs "~4.1.6" 1716 | hosted-git-info "~2.1.5" 1717 | inflight "~1.0.4" 1718 | inherits "~2.0.3" 1719 | ini "~1.3.4" 1720 | init-package-json "~1.9.4" 1721 | lockfile "~1.0.1" 1722 | lru-cache "~4.0.1" 1723 | minimatch "~3.0.3" 1724 | mkdirp "~0.5.1" 1725 | node-gyp "~3.4.0" 1726 | nopt "~3.0.6" 1727 | normalize-git-url "~3.0.2" 1728 | normalize-package-data "~2.3.5" 1729 | npm-cache-filename "~1.0.2" 1730 | npm-install-checks "~1.0.7" 1731 | npm-package-arg "~4.1.0" 1732 | npm-registry-client "~7.2.1" 1733 | npm-user-validate "~0.1.5" 1734 | npmlog "~2.0.4" 1735 | once "~1.4.0" 1736 | opener "~1.4.1" 1737 | osenv "~0.1.3" 1738 | path-is-inside "~1.0.0" 1739 | read "~1.0.7" 1740 | read-installed "~4.0.3" 1741 | read-package-json "~2.0.4" 1742 | readable-stream "~2.1.5" 1743 | realize-package-specifier "~3.0.1" 1744 | request "~2.74.0" 1745 | retry "~0.10.0" 1746 | rimraf "~2.5.4" 1747 | semver "~5.1.0" 1748 | sha "~2.0.1" 1749 | slide "~1.1.6" 1750 | sorted-object "~2.0.0" 1751 | spdx-license-ids "~1.2.2" 1752 | strip-ansi "~3.0.1" 1753 | tar "~2.2.1" 1754 | text-table "~0.2.0" 1755 | uid-number "0.0.6" 1756 | umask "~1.1.0" 1757 | validate-npm-package-license "~3.0.1" 1758 | validate-npm-package-name "~2.2.2" 1759 | which "~1.2.11" 1760 | wrappy "~1.0.2" 1761 | write-file-atomic "~1.1.4" 1762 | 1763 | npmi@1.0.1: 1764 | version "1.0.1" 1765 | resolved "https://registry.yarnpkg.com/npmi/-/npmi-1.0.1.tgz#15d769273547545e6809dcf0ce18aed48b0290e2" 1766 | dependencies: 1767 | npm "^2.1.12" 1768 | semver "^4.1.0" 1769 | 1770 | "npmlog@0 || 1 || 2", "npmlog@0 || 1 || 2 || 3", "npmlog@0.1 || 1 || 2", npmlog@~2.0.0, "npmlog@~2.0.0 || ~3.1.0", npmlog@~2.0.2, npmlog@~2.0.4: 1771 | version "2.0.4" 1772 | resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-2.0.4.tgz#98b52530f2514ca90d09ec5b22c8846722375692" 1773 | dependencies: 1774 | ansi "~0.3.1" 1775 | are-we-there-yet "~1.1.2" 1776 | gauge "~1.2.5" 1777 | 1778 | number-is-nan@^1.0.0: 1779 | version "1.0.1" 1780 | resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" 1781 | 1782 | oauth-sign@~0.8.0, oauth-sign@~0.8.1: 1783 | version "0.8.2" 1784 | resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" 1785 | 1786 | object-assign@^3.0.0: 1787 | version "3.0.0" 1788 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2" 1789 | 1790 | object-assign@^4.0.1, object-assign@^4.1.0: 1791 | version "4.1.1" 1792 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 1793 | 1794 | object-inspect@^1.6.0: 1795 | version "1.6.0" 1796 | resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.6.0.tgz#c70b6cbf72f274aab4c34c0c82f5167bf82cf15b" 1797 | integrity sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ== 1798 | 1799 | object-keys@^1.0.10, object-keys@^1.0.8, object-keys@^1.0.9: 1800 | version "1.0.11" 1801 | resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d" 1802 | 1803 | object-keys@^1.0.12, object-keys@^1.1.1: 1804 | version "1.1.1" 1805 | resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" 1806 | integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== 1807 | 1808 | object.assign@^4.0.3: 1809 | version "4.0.4" 1810 | resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.0.4.tgz#b1c9cc044ef1b9fe63606fc141abbb32e14730cc" 1811 | dependencies: 1812 | define-properties "^1.1.2" 1813 | function-bind "^1.1.0" 1814 | object-keys "^1.0.10" 1815 | 1816 | object.values@^1.0.4: 1817 | version "1.1.0" 1818 | resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.0.tgz#bf6810ef5da3e5325790eaaa2be213ea84624da9" 1819 | integrity sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg== 1820 | dependencies: 1821 | define-properties "^1.1.3" 1822 | es-abstract "^1.12.0" 1823 | function-bind "^1.1.1" 1824 | has "^1.0.3" 1825 | 1826 | once@^1.3.0, once@^1.3.3, once@~1.4.0: 1827 | version "1.4.0" 1828 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1829 | dependencies: 1830 | wrappy "1" 1831 | 1832 | once@~1.3.3: 1833 | version "1.3.3" 1834 | resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20" 1835 | dependencies: 1836 | wrappy "1" 1837 | 1838 | opener@~1.4.1: 1839 | version "1.4.3" 1840 | resolved "https://registry.yarnpkg.com/opener/-/opener-1.4.3.tgz#5c6da2c5d7e5831e8ffa3964950f8d6674ac90b8" 1841 | 1842 | optimist@0.6.1: 1843 | version "0.6.1" 1844 | resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" 1845 | dependencies: 1846 | minimist "~0.0.1" 1847 | wordwrap "~0.0.2" 1848 | 1849 | optionator@^0.8.0, optionator@^0.8.1: 1850 | version "0.8.2" 1851 | resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" 1852 | dependencies: 1853 | deep-is "~0.1.3" 1854 | fast-levenshtein "~2.0.4" 1855 | levn "~0.3.0" 1856 | prelude-ls "~1.1.2" 1857 | type-check "~0.3.2" 1858 | wordwrap "~1.0.0" 1859 | 1860 | os-homedir@^1.0.0: 1861 | version "1.0.2" 1862 | resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" 1863 | 1864 | os-tmpdir@^1.0.0, os-tmpdir@~1.0.1: 1865 | version "1.0.2" 1866 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 1867 | 1868 | osenv@0, osenv@~0.1.3: 1869 | version "0.1.4" 1870 | resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644" 1871 | dependencies: 1872 | os-homedir "^1.0.0" 1873 | os-tmpdir "^1.0.0" 1874 | 1875 | parse-entities@^1.0.2: 1876 | version "1.1.0" 1877 | resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-1.1.0.tgz#4bc58f35fdc8e65dded35a12f2e40223ca24a3f7" 1878 | dependencies: 1879 | character-entities "^1.0.0" 1880 | character-entities-legacy "^1.0.0" 1881 | character-reference-invalid "^1.0.0" 1882 | has "^1.0.1" 1883 | is-alphanumerical "^1.0.0" 1884 | is-decimal "^1.0.0" 1885 | is-hexadecimal "^1.0.0" 1886 | 1887 | parse-json@^2.2.0: 1888 | version "2.2.0" 1889 | resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" 1890 | dependencies: 1891 | error-ex "^1.2.0" 1892 | 1893 | path-array@^1.0.0: 1894 | version "1.0.1" 1895 | resolved "https://registry.yarnpkg.com/path-array/-/path-array-1.0.1.tgz#7e2f0f35f07a2015122b868b7eac0eb2c4fec271" 1896 | dependencies: 1897 | array-index "^1.0.0" 1898 | 1899 | path-exists@^2.1.0: 1900 | version "2.1.0" 1901 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" 1902 | dependencies: 1903 | pinkie-promise "^2.0.0" 1904 | 1905 | path-is-absolute@^1.0.0: 1906 | version "1.0.1" 1907 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1908 | 1909 | path-is-inside@^1.0.1, path-is-inside@~1.0.0, path-is-inside@~1.0.1: 1910 | version "1.0.2" 1911 | resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" 1912 | 1913 | path-parse@^1.0.5: 1914 | version "1.0.5" 1915 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" 1916 | 1917 | path-to-glob-pattern@^1.0.1: 1918 | version "1.0.1" 1919 | resolved "https://registry.yarnpkg.com/path-to-glob-pattern/-/path-to-glob-pattern-1.0.1.tgz#203348a166c2b68936b59f74ae2070bf1520012d" 1920 | dependencies: 1921 | shelljs "^0.7.6" 1922 | 1923 | path-type@^1.0.0: 1924 | version "1.1.0" 1925 | resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" 1926 | dependencies: 1927 | graceful-fs "^4.1.2" 1928 | pify "^2.0.0" 1929 | pinkie-promise "^2.0.0" 1930 | 1931 | pify@^2.0.0: 1932 | version "2.3.0" 1933 | resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" 1934 | 1935 | pinkie-promise@^2.0.0: 1936 | version "2.0.1" 1937 | resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" 1938 | dependencies: 1939 | pinkie "^2.0.0" 1940 | 1941 | pinkie@^2.0.0: 1942 | version "2.0.4" 1943 | resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" 1944 | 1945 | pluralize@^2.0.0: 1946 | version "2.0.0" 1947 | resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-2.0.0.tgz#72b726aa6fac1edeee42256c7d8dc256b335677f" 1948 | 1949 | prelude-ls@~1.1.2: 1950 | version "1.1.2" 1951 | resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" 1952 | 1953 | prh@^1.0.1: 1954 | version "1.1.0" 1955 | resolved "https://registry.yarnpkg.com/prh/-/prh-1.1.0.tgz#1c22b2a1998daaa7445865e5c86fb30e5b8ebb33" 1956 | dependencies: 1957 | commandpost "^1.0.1" 1958 | js-yaml "^3.6.1" 1959 | 1960 | prh@^5.4.3: 1961 | version "5.4.4" 1962 | resolved "https://registry.yarnpkg.com/prh/-/prh-5.4.4.tgz#5b618213a187f3580f262f4e0f79e8e8561ea179" 1963 | integrity sha512-UATF+R/2H8owxwPvF12Knihu9aYGTuZttGHrEEq5NBWz38mREh23+WvCVKX3fhnIZIMV7ye6E1fnqAl+V6WYEw== 1964 | dependencies: 1965 | commandpost "^1.2.1" 1966 | diff "^4.0.1" 1967 | js-yaml "^3.9.1" 1968 | 1969 | process-nextick-args@~1.0.6: 1970 | version "1.0.7" 1971 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" 1972 | 1973 | promzard@^0.3.0: 1974 | version "0.3.0" 1975 | resolved "https://registry.yarnpkg.com/promzard/-/promzard-0.3.0.tgz#26a5d6ee8c7dee4cb12208305acfb93ba382a9ee" 1976 | dependencies: 1977 | read "1" 1978 | 1979 | proto-list@~1.2.1: 1980 | version "1.2.4" 1981 | resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" 1982 | 1983 | pseudomap@^1.0.1: 1984 | version "1.0.2" 1985 | resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" 1986 | 1987 | punycode@^1.4.1: 1988 | version "1.4.1" 1989 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" 1990 | 1991 | q@1.4.1: 1992 | version "1.4.1" 1993 | resolved "https://registry.yarnpkg.com/q/-/q-1.4.1.tgz#55705bcd93c5f3673530c2c2cbc0c2b3addc286e" 1994 | 1995 | qs@~6.0.2: 1996 | version "6.0.4" 1997 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.0.4.tgz#51019d84720c939b82737e84556a782338ecea7b" 1998 | 1999 | qs@~6.2.0: 2000 | version "6.2.3" 2001 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.2.3.tgz#1cfcb25c10a9b2b483053ff39f5dfc9233908cfe" 2002 | 2003 | rc-config-loader@^1.0.2: 2004 | version "1.0.2" 2005 | resolved "https://registry.yarnpkg.com/rc-config-loader/-/rc-config-loader-1.0.2.tgz#c5e903ab36c22204f3cca9d9ddfd7e68fe3758eb" 2006 | dependencies: 2007 | debug "^2.2.0" 2008 | js-yaml "^3.6.1" 2009 | json5 "^0.5.0" 2010 | object-assign "^4.1.0" 2011 | object-keys "^1.0.9" 2012 | path-exists "^2.1.0" 2013 | require-uncached "^1.0.3" 2014 | 2015 | read-cmd-shim@~1.0.1: 2016 | version "1.0.1" 2017 | resolved "https://registry.yarnpkg.com/read-cmd-shim/-/read-cmd-shim-1.0.1.tgz#2d5d157786a37c055d22077c32c53f8329e91c7b" 2018 | dependencies: 2019 | graceful-fs "^4.1.2" 2020 | 2021 | read-installed@~4.0.3: 2022 | version "4.0.3" 2023 | resolved "https://registry.yarnpkg.com/read-installed/-/read-installed-4.0.3.tgz#ff9b8b67f187d1e4c29b9feb31f6b223acd19067" 2024 | dependencies: 2025 | debuglog "^1.0.1" 2026 | read-package-json "^2.0.0" 2027 | readdir-scoped-modules "^1.0.0" 2028 | semver "2 || 3 || 4 || 5" 2029 | slide "~1.1.3" 2030 | util-extend "^1.0.1" 2031 | optionalDependencies: 2032 | graceful-fs "^4.1.2" 2033 | 2034 | "read-package-json@1 || 2", read-package-json@^2.0.0, read-package-json@~2.0.3, read-package-json@~2.0.4: 2035 | version "2.0.5" 2036 | resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-2.0.5.tgz#f93a64e641529df68a08c64de46389e8a3f88845" 2037 | dependencies: 2038 | glob "^7.1.1" 2039 | json-parse-helpfulerror "^1.0.2" 2040 | normalize-package-data "^2.0.0" 2041 | optionalDependencies: 2042 | graceful-fs "^4.1.2" 2043 | 2044 | read-package-tree@~5.1.2: 2045 | version "5.1.5" 2046 | resolved "https://registry.yarnpkg.com/read-package-tree/-/read-package-tree-5.1.5.tgz#ace7e6381c7684f970aaa98fc7c5d2b666addab6" 2047 | dependencies: 2048 | debuglog "^1.0.1" 2049 | dezalgo "^1.0.0" 2050 | once "^1.3.0" 2051 | read-package-json "^2.0.0" 2052 | readdir-scoped-modules "^1.0.0" 2053 | 2054 | read-pkg@^1.1.0: 2055 | version "1.1.0" 2056 | resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" 2057 | dependencies: 2058 | load-json-file "^1.0.0" 2059 | normalize-package-data "^2.3.2" 2060 | path-type "^1.0.0" 2061 | 2062 | read@1, read@~1.0.1, read@~1.0.7: 2063 | version "1.0.7" 2064 | resolved "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4" 2065 | dependencies: 2066 | mute-stream "~0.0.4" 2067 | 2068 | "readable-stream@1 || 2", readable-stream@^2.0.2, readable-stream@~2.1.5: 2069 | version "2.1.5" 2070 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.1.5.tgz#66fa8b720e1438b364681f2ad1a63c618448c9d0" 2071 | dependencies: 2072 | buffer-shims "^1.0.0" 2073 | core-util-is "~1.0.0" 2074 | inherits "~2.0.1" 2075 | isarray "~1.0.0" 2076 | process-nextick-args "~1.0.6" 2077 | string_decoder "~0.10.x" 2078 | util-deprecate "~1.0.1" 2079 | 2080 | "readable-stream@^2.0.0 || ^1.1.13", readable-stream@^2.2.2: 2081 | version "2.2.5" 2082 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.5.tgz#a0b187304e05bab01a4ce2b4cc9c607d5aa1d606" 2083 | dependencies: 2084 | buffer-shims "^1.0.0" 2085 | core-util-is "~1.0.0" 2086 | inherits "~2.0.1" 2087 | isarray "~1.0.0" 2088 | process-nextick-args "~1.0.6" 2089 | string_decoder "~0.10.x" 2090 | util-deprecate "~1.0.1" 2091 | 2092 | readable-stream@~2.0.5: 2093 | version "2.0.6" 2094 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e" 2095 | dependencies: 2096 | core-util-is "~1.0.0" 2097 | inherits "~2.0.1" 2098 | isarray "~1.0.0" 2099 | process-nextick-args "~1.0.6" 2100 | string_decoder "~0.10.x" 2101 | util-deprecate "~1.0.1" 2102 | 2103 | readdir-scoped-modules@^1.0.0: 2104 | version "1.0.2" 2105 | resolved "https://registry.yarnpkg.com/readdir-scoped-modules/-/readdir-scoped-modules-1.0.2.tgz#9fafa37d286be5d92cbaebdee030dc9b5f406747" 2106 | dependencies: 2107 | debuglog "^1.0.1" 2108 | dezalgo "^1.0.0" 2109 | graceful-fs "^4.1.2" 2110 | once "^1.3.0" 2111 | 2112 | realize-package-specifier@~3.0.1: 2113 | version "3.0.3" 2114 | resolved "https://registry.yarnpkg.com/realize-package-specifier/-/realize-package-specifier-3.0.3.tgz#d0def882952b8de3f67eba5e91199661271f41f4" 2115 | dependencies: 2116 | dezalgo "^1.0.1" 2117 | npm-package-arg "^4.1.1" 2118 | 2119 | rechoir@^0.6.2: 2120 | version "0.6.2" 2121 | resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" 2122 | dependencies: 2123 | resolve "^1.1.6" 2124 | 2125 | regexp.prototype.flags@^1.1.1: 2126 | version "1.1.1" 2127 | resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.1.1.tgz#4b45162251d73bbd1a73555ad2f109be1f4c2f4a" 2128 | dependencies: 2129 | define-properties "^1.1.1" 2130 | 2131 | regx@^1.0.4: 2132 | version "1.0.4" 2133 | resolved "https://registry.yarnpkg.com/regx/-/regx-1.0.4.tgz#a0ee32c308910902019ca1117ed41b9ddd041b2f" 2134 | 2135 | remark-parse@^1.1.0: 2136 | version "1.1.0" 2137 | resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-1.1.0.tgz#c3ca10f9a8da04615c28f09aa4e304510526ec21" 2138 | dependencies: 2139 | collapse-white-space "^1.0.0" 2140 | extend "^3.0.0" 2141 | parse-entities "^1.0.2" 2142 | repeat-string "^1.5.4" 2143 | trim "0.0.1" 2144 | trim-trailing-lines "^1.0.0" 2145 | unherit "^1.0.4" 2146 | unist-util-remove-position "^1.0.0" 2147 | vfile-location "^2.0.0" 2148 | 2149 | remark-stringify@^1.1.0: 2150 | version "1.1.0" 2151 | resolved "https://registry.yarnpkg.com/remark-stringify/-/remark-stringify-1.1.0.tgz#a7105e25b9ee2bf9a49b75d2c423f11b06ae2092" 2152 | dependencies: 2153 | ccount "^1.0.0" 2154 | extend "^3.0.0" 2155 | longest-streak "^1.0.0" 2156 | markdown-table "^0.4.0" 2157 | parse-entities "^1.0.2" 2158 | repeat-string "^1.5.4" 2159 | stringify-entities "^1.0.1" 2160 | unherit "^1.0.4" 2161 | 2162 | remark@^5.0.1: 2163 | version "5.1.0" 2164 | resolved "https://registry.yarnpkg.com/remark/-/remark-5.1.0.tgz#cb463bd3dbcb4b99794935eee1cf71d7a8e3068c" 2165 | dependencies: 2166 | remark-parse "^1.1.0" 2167 | remark-stringify "^1.1.0" 2168 | unified "^4.1.1" 2169 | 2170 | repeat-string@^1.5.4: 2171 | version "1.6.1" 2172 | resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" 2173 | 2174 | request@2, request@^2.47.0, request@^2.74.0, request@~2.74.0: 2175 | version "2.74.0" 2176 | resolved "https://registry.yarnpkg.com/request/-/request-2.74.0.tgz#7693ca768bbb0ea5c8ce08c084a45efa05b892ab" 2177 | dependencies: 2178 | aws-sign2 "~0.6.0" 2179 | aws4 "^1.2.1" 2180 | bl "~1.1.2" 2181 | caseless "~0.11.0" 2182 | combined-stream "~1.0.5" 2183 | extend "~3.0.0" 2184 | forever-agent "~0.6.1" 2185 | form-data "~1.0.0-rc4" 2186 | har-validator "~2.0.6" 2187 | hawk "~3.1.3" 2188 | http-signature "~1.1.0" 2189 | is-typedarray "~1.0.0" 2190 | isstream "~0.1.2" 2191 | json-stringify-safe "~5.0.1" 2192 | mime-types "~2.1.7" 2193 | node-uuid "~1.4.7" 2194 | oauth-sign "~0.8.1" 2195 | qs "~6.2.0" 2196 | stringstream "~0.0.4" 2197 | tough-cookie "~2.3.0" 2198 | tunnel-agent "~0.4.1" 2199 | 2200 | request@~2.69.0: 2201 | version "2.69.0" 2202 | resolved "https://registry.yarnpkg.com/request/-/request-2.69.0.tgz#cf91d2e000752b1217155c005241911991a2346a" 2203 | dependencies: 2204 | aws-sign2 "~0.6.0" 2205 | aws4 "^1.2.1" 2206 | bl "~1.0.0" 2207 | caseless "~0.11.0" 2208 | combined-stream "~1.0.5" 2209 | extend "~3.0.0" 2210 | forever-agent "~0.6.1" 2211 | form-data "~1.0.0-rc3" 2212 | har-validator "~2.0.6" 2213 | hawk "~3.1.0" 2214 | http-signature "~1.1.0" 2215 | is-typedarray "~1.0.0" 2216 | isstream "~0.1.2" 2217 | json-stringify-safe "~5.0.1" 2218 | mime-types "~2.1.7" 2219 | node-uuid "~1.4.7" 2220 | oauth-sign "~0.8.0" 2221 | qs "~6.0.2" 2222 | stringstream "~0.0.4" 2223 | tough-cookie "~2.2.0" 2224 | tunnel-agent "~0.4.1" 2225 | 2226 | require-uncached@^1.0.3: 2227 | version "1.0.3" 2228 | resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" 2229 | dependencies: 2230 | caller-path "^0.1.0" 2231 | resolve-from "^1.0.0" 2232 | 2233 | resolve-from@^1.0.0: 2234 | version "1.0.1" 2235 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" 2236 | 2237 | resolve@^1.1.6: 2238 | version "1.3.2" 2239 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.3.2.tgz#1f0442c9e0cbb8136e87b9305f932f46c7f28235" 2240 | dependencies: 2241 | path-parse "^1.0.5" 2242 | 2243 | retry@^0.10.0, retry@~0.10.0: 2244 | version "0.10.1" 2245 | resolved "https://registry.yarnpkg.com/retry/-/retry-0.10.1.tgz#e76388d217992c252750241d3d3956fed98d8ff4" 2246 | 2247 | retry@^0.8.0: 2248 | version "0.8.0" 2249 | resolved "https://registry.yarnpkg.com/retry/-/retry-0.8.0.tgz#2367628dc0edb247b1eab649dc53ac8628ac2d5f" 2250 | 2251 | retry@~0.9.0: 2252 | version "0.9.0" 2253 | resolved "https://registry.yarnpkg.com/retry/-/retry-0.9.0.tgz#6f697e50a0e4ddc8c8f7fb547a9b60dead43678d" 2254 | 2255 | rimraf@2, rimraf@^2.2.8, rimraf@^2.5.2: 2256 | version "2.6.1" 2257 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d" 2258 | dependencies: 2259 | glob "^7.0.5" 2260 | 2261 | rimraf@~2.5.2, rimraf@~2.5.4: 2262 | version "2.5.4" 2263 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.5.4.tgz#96800093cbf1a0c86bd95b4625467535c29dfa04" 2264 | dependencies: 2265 | glob "^7.0.5" 2266 | 2267 | "semver@2 >=2.2.1 || 3.x || 4 || 5", "semver@2 || 3 || 4 || 5", "semver@2.x || 3.x || 4 || 5", "semver@4 || 5", semver@5.1.0, "semver@^2.3.0 || 3.x || 4 || 5", semver@~5.1.0: 2268 | version "5.1.0" 2269 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.1.0.tgz#85f2cf8550465c4df000cf7d86f6b054106ab9e5" 2270 | 2271 | semver@^4.1.0: 2272 | version "4.3.6" 2273 | resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" 2274 | 2275 | sentence-splitter@^1.2.0: 2276 | version "1.2.0" 2277 | resolved "https://registry.yarnpkg.com/sentence-splitter/-/sentence-splitter-1.2.0.tgz#c1c38414cf145ec717fd437cac20c988e0fd0d46" 2278 | dependencies: 2279 | structured-source "^3.0.2" 2280 | 2281 | sentence-splitter@^2.0.0, sentence-splitter@^2.2.0: 2282 | version "2.2.0" 2283 | resolved "https://registry.yarnpkg.com/sentence-splitter/-/sentence-splitter-2.2.0.tgz#a9964463473ea7d263aece50b96b90f177a9ebc9" 2284 | dependencies: 2285 | concat-stream "^1.5.2" 2286 | structured-source "^3.0.2" 2287 | 2288 | sentence-splitter@^3.0.10: 2289 | version "3.0.11" 2290 | resolved "https://registry.yarnpkg.com/sentence-splitter/-/sentence-splitter-3.0.11.tgz#82d98f0fd7a392e0e6c49b0730ae7b880bfde0b2" 2291 | integrity sha512-8k/74ErjpdvgBVLQ7kI7jbbaqNdgMXVqMF8gWlJan25xfm1mg8cYmHQgMb+zx8xyocm1Dq46af4TpmnKWHr/yA== 2292 | dependencies: 2293 | "@textlint/ast-node-types" "^4.0.2" 2294 | concat-stream "^1.5.2" 2295 | object.values "^1.0.4" 2296 | structured-source "^3.0.2" 2297 | 2298 | sha@~2.0.1: 2299 | version "2.0.1" 2300 | resolved "https://registry.yarnpkg.com/sha/-/sha-2.0.1.tgz#6030822fbd2c9823949f8f72ed6411ee5cf25aae" 2301 | dependencies: 2302 | graceful-fs "^4.1.2" 2303 | readable-stream "^2.0.2" 2304 | 2305 | shelljs@^0.7.6: 2306 | version "0.7.7" 2307 | resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.7.7.tgz#b2f5c77ef97148f4b4f6e22682e10bba8667cff1" 2308 | dependencies: 2309 | glob "^7.0.0" 2310 | interpret "^1.0.0" 2311 | rechoir "^0.6.2" 2312 | 2313 | sigmund@~1.0.0: 2314 | version "1.0.1" 2315 | resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" 2316 | 2317 | slice-ansi@0.0.4: 2318 | version "0.0.4" 2319 | resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" 2320 | 2321 | slide@^1.1.3, slide@^1.1.5, slide@~1.1.3, slide@~1.1.6: 2322 | version "1.1.6" 2323 | resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" 2324 | 2325 | sntp@1.x.x: 2326 | version "1.0.9" 2327 | resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" 2328 | dependencies: 2329 | hoek "2.x.x" 2330 | 2331 | sorted-array@^2.0.1: 2332 | version "2.0.1" 2333 | resolved "https://registry.yarnpkg.com/sorted-array/-/sorted-array-2.0.1.tgz#a93d5a71f94f0d115a1bb55b26d37582b438bdcc" 2334 | 2335 | sorted-joyo-kanji@^0.2.0: 2336 | version "0.2.0" 2337 | resolved "https://registry.yarnpkg.com/sorted-joyo-kanji/-/sorted-joyo-kanji-0.2.0.tgz#34ae6bbaf0ee0a5e9165b2a4eeb51e2ab23e185c" 2338 | dependencies: 2339 | amp-each "^1.0.1" 2340 | code-point "^1.0.1" 2341 | joyo-kanji "^0.2.1" 2342 | sorted-array "^2.0.1" 2343 | 2344 | sorted-object@~1.0.0: 2345 | version "1.0.0" 2346 | resolved "https://registry.yarnpkg.com/sorted-object/-/sorted-object-1.0.0.tgz#5d1f4f9c1fb2cd48965967304e212eb44cfb6d05" 2347 | 2348 | sorted-object@~2.0.0: 2349 | version "2.0.1" 2350 | resolved "https://registry.yarnpkg.com/sorted-object/-/sorted-object-2.0.1.tgz#7d631f4bd3a798a24af1dffcfbfe83337a5df5fc" 2351 | 2352 | spdx-correct@~1.0.0: 2353 | version "1.0.2" 2354 | resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" 2355 | dependencies: 2356 | spdx-license-ids "^1.0.2" 2357 | 2358 | spdx-expression-parse@~1.0.0: 2359 | version "1.0.4" 2360 | resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c" 2361 | 2362 | spdx-license-ids@^1.0.2, spdx-license-ids@~1.2.2: 2363 | version "1.2.2" 2364 | resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" 2365 | 2366 | sprintf-js@~1.0.2: 2367 | version "1.0.3" 2368 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 2369 | 2370 | sshpk@^1.7.0: 2371 | version "1.11.0" 2372 | resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.11.0.tgz#2d8d5ebb4a6fab28ffba37fa62a90f4a3ea59d77" 2373 | dependencies: 2374 | asn1 "~0.2.3" 2375 | assert-plus "^1.0.0" 2376 | dashdash "^1.12.0" 2377 | getpass "^0.1.1" 2378 | optionalDependencies: 2379 | bcrypt-pbkdf "^1.0.0" 2380 | ecc-jsbn "~0.1.1" 2381 | jodid25519 "^1.0.0" 2382 | jsbn "~0.1.0" 2383 | tweetnacl "~0.14.0" 2384 | 2385 | string-width@^1.0.1: 2386 | version "1.0.2" 2387 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" 2388 | dependencies: 2389 | code-point-at "^1.0.0" 2390 | is-fullwidth-code-point "^1.0.0" 2391 | strip-ansi "^3.0.0" 2392 | 2393 | string-width@^2.0.0: 2394 | version "2.0.0" 2395 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.0.0.tgz#635c5436cc72a6e0c387ceca278d4e2eec52687e" 2396 | dependencies: 2397 | is-fullwidth-code-point "^2.0.0" 2398 | strip-ansi "^3.0.0" 2399 | 2400 | string.prototype.padstart@^3.0.0: 2401 | version "3.0.0" 2402 | resolved "https://registry.yarnpkg.com/string.prototype.padstart/-/string.prototype.padstart-3.0.0.tgz#5bcfad39f4649bb2d031292e19bcf0b510d4b242" 2403 | dependencies: 2404 | define-properties "^1.1.2" 2405 | es-abstract "^1.4.3" 2406 | function-bind "^1.0.2" 2407 | 2408 | string.prototype.trimleft@^2.0.0: 2409 | version "2.1.0" 2410 | resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz#6cc47f0d7eb8d62b0f3701611715a3954591d634" 2411 | integrity sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw== 2412 | dependencies: 2413 | define-properties "^1.1.3" 2414 | function-bind "^1.1.1" 2415 | 2416 | string.prototype.trimright@^2.0.0: 2417 | version "2.1.0" 2418 | resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz#669d164be9df9b6f7559fa8e89945b168a5a6c58" 2419 | integrity sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg== 2420 | dependencies: 2421 | define-properties "^1.1.3" 2422 | function-bind "^1.1.1" 2423 | 2424 | string_decoder@~0.10.x: 2425 | version "0.10.31" 2426 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" 2427 | 2428 | stringify-entities@^1.0.1: 2429 | version "1.3.0" 2430 | resolved "https://registry.yarnpkg.com/stringify-entities/-/stringify-entities-1.3.0.tgz#2244a516c4f1e8e01b73dad01023016776abd917" 2431 | dependencies: 2432 | character-entities-html4 "^1.0.0" 2433 | character-entities-legacy "^1.0.0" 2434 | has "^1.0.1" 2435 | is-alphanumerical "^1.0.0" 2436 | is-hexadecimal "^1.0.0" 2437 | 2438 | stringstream@~0.0.4: 2439 | version "0.0.5" 2440 | resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" 2441 | 2442 | strip-ansi@^3.0.0, strip-ansi@^3.0.1, strip-ansi@~3.0.1: 2443 | version "3.0.1" 2444 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 2445 | dependencies: 2446 | ansi-regex "^2.0.0" 2447 | 2448 | strip-bom@^2.0.0: 2449 | version "2.0.0" 2450 | resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" 2451 | dependencies: 2452 | is-utf8 "^0.2.0" 2453 | 2454 | structured-source@^3.0.2: 2455 | version "3.0.2" 2456 | resolved "https://registry.yarnpkg.com/structured-source/-/structured-source-3.0.2.tgz#dd802425e0f53dc4a6e7aca3752901a1ccda7af5" 2457 | dependencies: 2458 | boundary "^1.0.1" 2459 | 2460 | supports-color@^2.0.0: 2461 | version "2.0.0" 2462 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" 2463 | 2464 | table@^3.7.8: 2465 | version "3.8.3" 2466 | resolved "https://registry.yarnpkg.com/table/-/table-3.8.3.tgz#2bbc542f0fda9861a755d3947fefd8b3f513855f" 2467 | dependencies: 2468 | ajv "^4.7.0" 2469 | ajv-keywords "^1.0.0" 2470 | chalk "^1.1.1" 2471 | lodash "^4.0.0" 2472 | slice-ansi "0.0.4" 2473 | string-width "^2.0.0" 2474 | 2475 | tar@^2.0.0, tar@~2.2.1: 2476 | version "2.2.1" 2477 | resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" 2478 | dependencies: 2479 | block-stream "*" 2480 | fstream "^1.0.2" 2481 | inherits "2" 2482 | 2483 | text-table@^0.2.0, text-table@~0.2.0: 2484 | version "0.2.0" 2485 | resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" 2486 | 2487 | textlint-formatter@^1.7.3: 2488 | version "1.8.0" 2489 | resolved "https://registry.yarnpkg.com/textlint-formatter/-/textlint-formatter-1.8.0.tgz#3254e9bd7d4c8cf031b74778bf21bc086faff3eb" 2490 | dependencies: 2491 | "@azu/format-text" "^1.0.1" 2492 | "@azu/style-format" "^1.0.0" 2493 | chalk "^1.0.0" 2494 | concat-stream "^1.5.1" 2495 | js-yaml "^3.2.4" 2496 | optionator "^0.8.1" 2497 | pluralize "^2.0.0" 2498 | string-width "^1.0.1" 2499 | string.prototype.padstart "^3.0.0" 2500 | strip-ansi "^3.0.1" 2501 | table "^3.7.8" 2502 | text-table "^0.2.0" 2503 | try-resolve "^1.0.1" 2504 | xml-escape "^1.0.0" 2505 | 2506 | textlint-plugin-markdown@^1.1.0: 2507 | version "1.1.0" 2508 | resolved "https://registry.yarnpkg.com/textlint-plugin-markdown/-/textlint-plugin-markdown-1.1.0.tgz#36490eb2704f4969b4b2f00c624197111e5d1568" 2509 | dependencies: 2510 | markdown-to-ast "^3.4.0" 2511 | 2512 | textlint-plugin-text@^1.0.1: 2513 | version "1.0.1" 2514 | resolved "https://registry.yarnpkg.com/textlint-plugin-text/-/textlint-plugin-text-1.0.1.tgz#ee4642986e8fe3267849abe0f82cbabb2072b99f" 2515 | dependencies: 2516 | txt-to-ast "^1.0.2" 2517 | 2518 | textlint-rule-helper@^1.1.3, textlint-rule-helper@^1.1.4, textlint-rule-helper@^1.1.5: 2519 | version "1.2.0" 2520 | resolved "https://registry.yarnpkg.com/textlint-rule-helper/-/textlint-rule-helper-1.2.0.tgz#be68d47a5146b16dd116278c9aeb7bd35631ccda" 2521 | dependencies: 2522 | unist-util-visit "^1.1.0" 2523 | 2524 | textlint-rule-helper@^2.0.0: 2525 | version "2.0.0" 2526 | resolved "https://registry.yarnpkg.com/textlint-rule-helper/-/textlint-rule-helper-2.0.0.tgz#95cb4696c95c4258d2e3389e9e64b849f9721382" 2527 | dependencies: 2528 | unist-util-visit "^1.1.0" 2529 | 2530 | textlint-rule-helper@^2.1.1: 2531 | version "2.1.1" 2532 | resolved "https://registry.yarnpkg.com/textlint-rule-helper/-/textlint-rule-helper-2.1.1.tgz#d572588685359134bc779939b217e61f087dab0f" 2533 | integrity sha512-6fxgHzoJVkjl3LaC1b2Egi+5wbhG4i0pU0knJmQujVhxIJ3D3AcQQZPs457xKAi5xKz1WayYeTeJ5jrD/hnO7g== 2534 | dependencies: 2535 | "@textlint/ast-node-types" "^4.2.1" 2536 | "@textlint/types" "^1.1.2" 2537 | structured-source "^3.0.2" 2538 | unist-util-visit "^1.1.0" 2539 | 2540 | textlint-rule-ja-no-abusage@^1.2.2: 2541 | version "1.2.2" 2542 | resolved "https://registry.yarnpkg.com/textlint-rule-ja-no-abusage/-/textlint-rule-ja-no-abusage-1.2.2.tgz#6478a150d4dcea4e95bb88a2af92a2fcace1c5f0" 2543 | integrity sha512-lDRvfOCh41h0DnenGgfjstBNBh7EZP37r/q/24DP1PKWvVytOtiIxN048KEfm4sXjJZ/eSZOrZrfHqFm1uaiCw== 2544 | dependencies: 2545 | kuromojin "^1.3.1" 2546 | morpheme-match "^1.0.1" 2547 | textlint-rule-prh "^3.1.1" 2548 | 2549 | textlint-rule-ja-no-mixed-period@^2.1.1: 2550 | version "2.1.1" 2551 | resolved "https://registry.yarnpkg.com/textlint-rule-ja-no-mixed-period/-/textlint-rule-ja-no-mixed-period-2.1.1.tgz#6c63446de0bab9870041f38b1a339d54328f4c60" 2552 | integrity sha512-yCfRva4pl2Sa6Xsxhzkec9rGuqP4MBlGrQ7ZQIM9On9dMaeIVabcwniMbLfO1CzUBBe9xUaCF/8eE0zOi8g4/A== 2553 | dependencies: 2554 | check-ends-with-period "^1.0.1" 2555 | textlint-rule-helper "^2.0.0" 2556 | 2557 | textlint-rule-ja-no-redundant-expression@^2.0.0: 2558 | version "2.0.0" 2559 | resolved "https://registry.yarnpkg.com/textlint-rule-ja-no-redundant-expression/-/textlint-rule-ja-no-redundant-expression-2.0.0.tgz#ef5e34f619005c9e5d5509b6eeceab11b9610f10" 2560 | integrity sha512-QyvZbq7Yujdl3uT7h606i6U6oBROi9A+aWa0DsGWbWpavZWuiK34E5TWUlFaduvscAeq2fejLxruROgdv4WhFw== 2561 | dependencies: 2562 | kuromojin "^1.3.2" 2563 | morpheme-match "^1.0.1" 2564 | morpheme-match-all "^1.1.0" 2565 | 2566 | textlint-rule-ja-no-successive-word@^1.1.0: 2567 | version "1.1.0" 2568 | resolved "https://registry.yarnpkg.com/textlint-rule-ja-no-successive-word/-/textlint-rule-ja-no-successive-word-1.1.0.tgz#243778076ce3f80d76bf2b9b73156c161e33c998" 2569 | integrity sha512-kWnftTP5PkaDHphQggcXzQ/6uxpUc6J0WqNIFNLb+cmPnplmxfbhnsO8ksb8tpdu+niURQGqLJPI8948OPMoGQ== 2570 | dependencies: 2571 | kuromojin "^1.3.1" 2572 | 2573 | textlint-rule-ja-no-weak-phrase@^1.0.2: 2574 | version "1.0.3" 2575 | resolved "https://registry.yarnpkg.com/textlint-rule-ja-no-weak-phrase/-/textlint-rule-ja-no-weak-phrase-1.0.3.tgz#8cc1c2b643e0b0be00225c9b2ff440bf423aeac7" 2576 | dependencies: 2577 | kuromojin "^1.3.1" 2578 | morpheme-match "^1.0.1" 2579 | 2580 | textlint-rule-max-comma@^1.0.2: 2581 | version "1.0.4" 2582 | resolved "https://registry.yarnpkg.com/textlint-rule-max-comma/-/textlint-rule-max-comma-1.0.4.tgz#f555c97e0d3039ca7da06cfd1afad0e5f5899a37" 2583 | dependencies: 2584 | sentence-splitter "^2.0.0" 2585 | unist-util-filter "^0.2.1" 2586 | 2587 | textlint-rule-max-kanji-continuous-len@^1.1.0: 2588 | version "1.1.1" 2589 | resolved "https://registry.yarnpkg.com/textlint-rule-max-kanji-continuous-len/-/textlint-rule-max-kanji-continuous-len-1.1.1.tgz#cbcc44488c06d36c65099e12f7977e3a15c3b77f" 2590 | dependencies: 2591 | match-index "^1.0.1" 2592 | textlint-rule-helper "^2.0.0" 2593 | 2594 | textlint-rule-max-ten@^2.0.1: 2595 | version "2.0.3" 2596 | resolved "https://registry.yarnpkg.com/textlint-rule-max-ten/-/textlint-rule-max-ten-2.0.3.tgz#dccbc0d0157ee86a7572ca00a47ab1fa577f0645" 2597 | dependencies: 2598 | kuromojin "^1.0.2" 2599 | sentence-splitter "^2.0.0" 2600 | structured-source "^3.0.2" 2601 | textlint-rule-helper "^2.0.0" 2602 | 2603 | textlint-rule-no-double-negative-ja@^1.0.4: 2604 | version "1.0.5" 2605 | resolved "https://registry.yarnpkg.com/textlint-rule-no-double-negative-ja/-/textlint-rule-no-double-negative-ja-1.0.5.tgz#ba30db424dc7ef84ceda6d103781b14cd20cc764" 2606 | dependencies: 2607 | kuromojin "^1.1.0" 2608 | 2609 | textlint-rule-no-doubled-conjunction@^1.0.2: 2610 | version "1.0.2" 2611 | resolved "https://registry.yarnpkg.com/textlint-rule-no-doubled-conjunction/-/textlint-rule-no-doubled-conjunction-1.0.2.tgz#24c6e8014c6b2e184bc7a5d4c1a6ee13bb309930" 2612 | dependencies: 2613 | kuromojin "^1.1.0" 2614 | sentence-splitter "^2.0.0" 2615 | textlint-rule-helper "^1.1.5" 2616 | textlint-util-to-string "^1.2.0" 2617 | 2618 | textlint-rule-no-doubled-conjunctive-particle-ga@^1.1.0: 2619 | version "1.1.0" 2620 | resolved "https://registry.yarnpkg.com/textlint-rule-no-doubled-conjunctive-particle-ga/-/textlint-rule-no-doubled-conjunctive-particle-ga-1.1.0.tgz#f43717a670ca94d5a7de94efb85b862075436f23" 2621 | integrity sha512-5uTZEw0S1j27DJ2vxdSqmqekZGuzOz2c8axtjJR1XiLc/miB8f7Rz3S16Mq+M2W06wcJTdoM87ix5XWa+4oe8A== 2622 | dependencies: 2623 | kuromojin "^1.1.0" 2624 | sentence-splitter "^1.2.0" 2625 | textlint-rule-helper "^1.1.5" 2626 | textlint-util-to-string "^1.2.0" 2627 | 2628 | textlint-rule-no-doubled-joshi@^3.3.0: 2629 | version "3.5.1" 2630 | resolved "https://registry.yarnpkg.com/textlint-rule-no-doubled-joshi/-/textlint-rule-no-doubled-joshi-3.5.1.tgz#759c6c5def8075f849d9a4df551c2d2a0815ba2f" 2631 | dependencies: 2632 | kuromojin "^1.2.1" 2633 | sentence-splitter "^2.2.0" 2634 | textlint-rule-helper "^1.1.4" 2635 | textlint-util-to-string "^1.1.0" 2636 | 2637 | textlint-rule-no-dropping-the-ra@^1.0.3: 2638 | version "1.1.2" 2639 | resolved "https://registry.yarnpkg.com/textlint-rule-no-dropping-the-ra/-/textlint-rule-no-dropping-the-ra-1.1.2.tgz#17d8c65986d7bd8014a4529303a2ba0b769a89d2" 2640 | dependencies: 2641 | kuromojin "^1.2.1" 2642 | textlint-rule-helper "^1.1.4" 2643 | 2644 | textlint-rule-no-exclamation-question-mark@^1.0.2: 2645 | version "1.0.2" 2646 | resolved "https://registry.yarnpkg.com/textlint-rule-no-exclamation-question-mark/-/textlint-rule-no-exclamation-question-mark-1.0.2.tgz#f3d812cfbaddc8224ca497d9b38b70dac554891c" 2647 | dependencies: 2648 | match-index "^1.0.1" 2649 | textlint-rule-helper "^1.1.5" 2650 | 2651 | textlint-rule-no-hankaku-kana@^1.0.1: 2652 | version "1.0.2" 2653 | resolved "https://registry.yarnpkg.com/textlint-rule-no-hankaku-kana/-/textlint-rule-no-hankaku-kana-1.0.2.tgz#6d3a936b18cd7021ebffca8d4111181dc159f4c8" 2654 | dependencies: 2655 | match-index "^1.0.1" 2656 | textlint-rule-helper "^1.1.5" 2657 | 2658 | textlint-rule-no-mix-dearu-desumasu@^3.0.2: 2659 | version "3.0.3" 2660 | resolved "https://registry.yarnpkg.com/textlint-rule-no-mix-dearu-desumasu/-/textlint-rule-no-mix-dearu-desumasu-3.0.3.tgz#ac4b8160b4f46644a4a40d62fe01d8db7670b7c3" 2661 | dependencies: 2662 | analyze-desumasu-dearu "^3.1.0" 2663 | textlint-rule-helper "^2.0.0" 2664 | unist-util-visit "^1.1.0" 2665 | 2666 | textlint-rule-no-nfd@^1.0.1: 2667 | version "1.0.1" 2668 | resolved "https://registry.yarnpkg.com/textlint-rule-no-nfd/-/textlint-rule-no-nfd-1.0.1.tgz#bf483f844e641ef23ae3f82361421a9e53b5d65a" 2669 | dependencies: 2670 | match-index "^1.0.1" 2671 | textlint-rule-helper "^1.1.5" 2672 | unorm "^1.4.1" 2673 | 2674 | textlint-rule-preset-ja-technical-writing@^3.1.3: 2675 | version "3.1.3" 2676 | resolved "https://registry.yarnpkg.com/textlint-rule-preset-ja-technical-writing/-/textlint-rule-preset-ja-technical-writing-3.1.3.tgz#b5c98ff981e7948e5b0224f80bb3243b87651642" 2677 | integrity sha512-olcNwyUFs9H6yGEc0XXhb1/KtSASDULdT+Vfx0n2CJ3kBbbVDjArpeflovoXeBxD8UlXtbNppJiiF7Dwe5eIpA== 2678 | dependencies: 2679 | "@textlint-rule/textlint-rule-no-invalid-control-character" "^1.2.0" 2680 | "@textlint/module-interop" "^1.0.1" 2681 | textlint-rule-ja-no-abusage "^1.2.2" 2682 | textlint-rule-ja-no-mixed-period "^2.1.1" 2683 | textlint-rule-ja-no-redundant-expression "^2.0.0" 2684 | textlint-rule-ja-no-successive-word "^1.1.0" 2685 | textlint-rule-ja-no-weak-phrase "^1.0.2" 2686 | textlint-rule-max-comma "^1.0.2" 2687 | textlint-rule-max-kanji-continuous-len "^1.1.0" 2688 | textlint-rule-max-ten "^2.0.1" 2689 | textlint-rule-no-double-negative-ja "^1.0.4" 2690 | textlint-rule-no-doubled-conjunction "^1.0.2" 2691 | textlint-rule-no-doubled-conjunctive-particle-ga "^1.1.0" 2692 | textlint-rule-no-doubled-joshi "^3.3.0" 2693 | textlint-rule-no-dropping-the-ra "^1.0.3" 2694 | textlint-rule-no-exclamation-question-mark "^1.0.2" 2695 | textlint-rule-no-hankaku-kana "^1.0.1" 2696 | textlint-rule-no-mix-dearu-desumasu "^3.0.2" 2697 | textlint-rule-no-nfd "^1.0.1" 2698 | textlint-rule-preset-jtf-style "^2.3.3" 2699 | textlint-rule-sentence-length "^2.1.1" 2700 | 2701 | textlint-rule-preset-jtf-style@^2.2.3: 2702 | version "2.2.3" 2703 | resolved "https://registry.yarnpkg.com/textlint-rule-preset-jtf-style/-/textlint-rule-preset-jtf-style-2.2.3.tgz#15d77e72a76ccdd020a180884b11d51cffa1d7aa" 2704 | dependencies: 2705 | analyze-desumasu-dearu "^2.1.2" 2706 | match-index "^1.0.1" 2707 | moji "^0.5.1" 2708 | regexp.prototype.flags "^1.1.1" 2709 | regx "^1.0.4" 2710 | sorted-joyo-kanji "^0.2.0" 2711 | textlint-rule-helper "^1.1.3" 2712 | textlint-rule-prh "^3.0.1" 2713 | 2714 | textlint-rule-preset-jtf-style@^2.3.3: 2715 | version "2.3.3" 2716 | resolved "https://registry.yarnpkg.com/textlint-rule-preset-jtf-style/-/textlint-rule-preset-jtf-style-2.3.3.tgz#5128d96f4edb566c8940e09ddcf3ce4803d133c4" 2717 | integrity sha512-wSBz4yqCcbKSAhlW7rhCCCPpCULTq2tT3lhyY3Q43cL+qsNx6U1UjngmQqLWkVBXVw2awQxkdeqORW7r+n4Qdg== 2718 | dependencies: 2719 | analyze-desumasu-dearu "^2.1.2" 2720 | japanese-numerals-to-number "^1.0.2" 2721 | match-index "^1.0.1" 2722 | moji "^0.5.1" 2723 | regexp.prototype.flags "^1.1.1" 2724 | regx "^1.0.4" 2725 | sorted-joyo-kanji "^0.2.0" 2726 | textlint-rule-helper "^2.0.0" 2727 | textlint-rule-prh "^5.0.0" 2728 | 2729 | textlint-rule-prh@^3.0.1, textlint-rule-prh@^3.1.1: 2730 | version "3.1.3" 2731 | resolved "https://registry.yarnpkg.com/textlint-rule-prh/-/textlint-rule-prh-3.1.3.tgz#0bd87537dd15c884dcffdeef0afcf9147cb30fc6" 2732 | dependencies: 2733 | prh "^1.0.1" 2734 | textlint-rule-helper "^2.0.0" 2735 | untildify "^3.0.2" 2736 | 2737 | textlint-rule-prh@^5.0.0: 2738 | version "5.2.1" 2739 | resolved "https://registry.yarnpkg.com/textlint-rule-prh/-/textlint-rule-prh-5.2.1.tgz#dcbb3ee674a9c63e7ba71f73b31d675571b874fc" 2740 | integrity sha512-RlVQRok7GnmuuCrNRSYbFqcpzJkH1g6OrVVrGE+S9drT1TzgsSSM8NkAQlP6kFnQ7fN4V7g4j6JBg0N3ArBpCg== 2741 | dependencies: 2742 | prh "^5.4.3" 2743 | textlint-rule-helper "^2.1.1" 2744 | untildify "^3.0.3" 2745 | 2746 | textlint-rule-sentence-length@^2.1.1: 2747 | version "2.1.1" 2748 | resolved "https://registry.yarnpkg.com/textlint-rule-sentence-length/-/textlint-rule-sentence-length-2.1.1.tgz#a348d784b9a4b7be6929204a15cb4508755b99a3" 2749 | integrity sha512-5LIsGd2Og4KQhDN99hwkW0iPDk4lPAgvkbi9EtlQ5rdHPhjuoj+nbpM0BXKR5boF1p/9O2UEnA3aUBp0az81Ng== 2750 | dependencies: 2751 | sentence-splitter "^3.0.10" 2752 | textlint-rule-helper "^2.0.0" 2753 | textlint-util-to-string "^2.1.1" 2754 | 2755 | textlint-util-to-string@^1.1.0, textlint-util-to-string@^1.2.0: 2756 | version "1.2.1" 2757 | resolved "https://registry.yarnpkg.com/textlint-util-to-string/-/textlint-util-to-string-1.2.1.tgz#1cf89956d27555a55e9588c06b35a50f0d1d46f9" 2758 | dependencies: 2759 | object-assign "^4.0.1" 2760 | structured-source "^3.0.2" 2761 | 2762 | textlint-util-to-string@^2.1.1: 2763 | version "2.1.1" 2764 | resolved "https://registry.yarnpkg.com/textlint-util-to-string/-/textlint-util-to-string-2.1.1.tgz#7e456f16a2abc07e473cb9591acf19f110def2d1" 2765 | integrity sha512-PW6rXqLNGL3xZ6d5/INrX+pt8qbffmeDPLcvkBOlfNpDRFhVvNNjFmZXH86ZQjrOz9t/nNZDBXqnzqJuioJbSQ== 2766 | dependencies: 2767 | object-assign "^4.0.1" 2768 | structured-source "^3.0.2" 2769 | 2770 | textlint@^7.3.0: 2771 | version "7.3.0" 2772 | resolved "https://registry.yarnpkg.com/textlint/-/textlint-7.3.0.tgz#4d5ce36c8aa65a6c1fa6f2368b25c1b10b08b9a7" 2773 | dependencies: 2774 | bluebird "^3.0.5" 2775 | carrack "0.0.5" 2776 | chalk "^1.1.1" 2777 | debug "^2.1.0" 2778 | deep-equal "^1.0.1" 2779 | diff "^2.2.2" 2780 | file-entry-cache "^2.0.0" 2781 | get-stdin "^5.0.1" 2782 | glob "^7.1.1" 2783 | interop-require "^1.0.0" 2784 | is-file "^1.0.0" 2785 | log-symbols "^1.0.2" 2786 | map-like "^1.0.1" 2787 | md5 "^2.2.1" 2788 | mkdirp "^0.5.0" 2789 | object-assign "^4.0.1" 2790 | optionator "^0.8.0" 2791 | path-to-glob-pattern "^1.0.1" 2792 | rc-config-loader "^1.0.2" 2793 | read-pkg "^1.1.0" 2794 | shelljs "^0.7.6" 2795 | string-width "^1.0.1" 2796 | structured-source "^3.0.2" 2797 | text-table "^0.2.0" 2798 | textlint-formatter "^1.7.3" 2799 | textlint-plugin-markdown "^1.1.0" 2800 | textlint-plugin-text "^1.0.1" 2801 | traverse "^0.6.6" 2802 | try-resolve "^1.0.1" 2803 | txt-ast-traverse "^1.2.0" 2804 | unique-concat "^0.2.2" 2805 | 2806 | tmp@0.0.28: 2807 | version "0.0.28" 2808 | resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.28.tgz#172735b7f614ea7af39664fa84cf0de4e515d120" 2809 | dependencies: 2810 | os-tmpdir "~1.0.1" 2811 | 2812 | tough-cookie@~2.2.0: 2813 | version "2.2.2" 2814 | resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.2.2.tgz#c83a1830f4e5ef0b93ef2a3488e724f8de016ac7" 2815 | 2816 | tough-cookie@~2.3.0: 2817 | version "2.3.2" 2818 | resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.2.tgz#f081f76e4c85720e6c37a5faced737150d84072a" 2819 | dependencies: 2820 | punycode "^1.4.1" 2821 | 2822 | traverse@^0.6.6: 2823 | version "0.6.6" 2824 | resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.6.6.tgz#cbdf560fd7b9af632502fed40f918c157ea97137" 2825 | 2826 | trim-trailing-lines@^1.0.0: 2827 | version "1.1.0" 2828 | resolved "https://registry.yarnpkg.com/trim-trailing-lines/-/trim-trailing-lines-1.1.0.tgz#7aefbb7808df9d669f6da2e438cac8c46ada7684" 2829 | 2830 | trim@0.0.1: 2831 | version "0.0.1" 2832 | resolved "https://registry.yarnpkg.com/trim/-/trim-0.0.1.tgz#5858547f6b290757ee95cccc666fb50084c460dd" 2833 | 2834 | trough@^1.0.0: 2835 | version "1.0.0" 2836 | resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.0.tgz#6bdedfe7f2aa49a6f3c432257687555957f342fd" 2837 | 2838 | try-resolve@^1.0.1: 2839 | version "1.0.1" 2840 | resolved "https://registry.yarnpkg.com/try-resolve/-/try-resolve-1.0.1.tgz#cfde6fabd72d63e5797cfaab873abbe8e700e912" 2841 | 2842 | tunnel-agent@~0.4.1: 2843 | version "0.4.3" 2844 | resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb" 2845 | 2846 | tweetnacl@^0.14.3, tweetnacl@~0.14.0: 2847 | version "0.14.5" 2848 | resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" 2849 | 2850 | txt-ast-traverse@^1.2.0: 2851 | version "1.2.1" 2852 | resolved "https://registry.yarnpkg.com/txt-ast-traverse/-/txt-ast-traverse-1.2.1.tgz#58e3fe43ddb5db5ca8b51142943b0d1b970def41" 2853 | 2854 | txt-to-ast@^1.0.2: 2855 | version "1.1.0" 2856 | resolved "https://registry.yarnpkg.com/txt-to-ast/-/txt-to-ast-1.1.0.tgz#eb91a7484ff4a5e136f6d24ce5a47a86ccc11008" 2857 | 2858 | type-check@~0.3.2: 2859 | version "0.3.2" 2860 | resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" 2861 | dependencies: 2862 | prelude-ls "~1.1.2" 2863 | 2864 | typedarray@^0.0.6: 2865 | version "0.0.6" 2866 | resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" 2867 | 2868 | uid-number@0.0.6: 2869 | version "0.0.6" 2870 | resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" 2871 | 2872 | umask@~1.1.0: 2873 | version "1.1.0" 2874 | resolved "https://registry.yarnpkg.com/umask/-/umask-1.1.0.tgz#f29cebf01df517912bb58ff9c4e50fde8e33320d" 2875 | 2876 | unherit@^1.0.4: 2877 | version "1.1.0" 2878 | resolved "https://registry.yarnpkg.com/unherit/-/unherit-1.1.0.tgz#6b9aaedfbf73df1756ad9e316dd981885840cd7d" 2879 | dependencies: 2880 | inherits "^2.0.1" 2881 | xtend "^4.0.1" 2882 | 2883 | unified@^4.1.1: 2884 | version "4.2.1" 2885 | resolved "https://registry.yarnpkg.com/unified/-/unified-4.2.1.tgz#76ff43aa8da430f6e7e4a55c84ebac2ad2cfcd2e" 2886 | dependencies: 2887 | bail "^1.0.0" 2888 | extend "^3.0.0" 2889 | has "^1.0.1" 2890 | once "^1.3.3" 2891 | trough "^1.0.0" 2892 | vfile "^1.0.0" 2893 | 2894 | unique-concat@^0.2.2: 2895 | version "0.2.2" 2896 | resolved "https://registry.yarnpkg.com/unique-concat/-/unique-concat-0.2.2.tgz#9210f9bdcaacc5e1e3929490d7c019df96f18712" 2897 | 2898 | unique-filename@~1.1.0: 2899 | version "1.1.0" 2900 | resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.0.tgz#d05f2fe4032560871f30e93cbe735eea201514f3" 2901 | dependencies: 2902 | unique-slug "^2.0.0" 2903 | 2904 | unique-slug@^2.0.0: 2905 | version "2.0.0" 2906 | resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.0.tgz#db6676e7c7cc0629878ff196097c78855ae9f4ab" 2907 | dependencies: 2908 | imurmurhash "^0.1.4" 2909 | 2910 | unist-util-filter@^0.2.1: 2911 | version "0.2.1" 2912 | resolved "https://registry.yarnpkg.com/unist-util-filter/-/unist-util-filter-0.2.1.tgz#e2f7876828903a6a9308e362051f86b14f35b545" 2913 | dependencies: 2914 | flatmap "0.0.3" 2915 | unist-util-is "^1.0.0" 2916 | 2917 | unist-util-is@^1.0.0: 2918 | version "1.0.0" 2919 | resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-1.0.0.tgz#4c7b3c5c0f6aa963640056fe4af7b5fcfdbb8ef0" 2920 | 2921 | unist-util-remove-position@^1.0.0: 2922 | version "1.1.0" 2923 | resolved "https://registry.yarnpkg.com/unist-util-remove-position/-/unist-util-remove-position-1.1.0.tgz#2444fedc344bc5f540dab6353e013b6d78101dc2" 2924 | dependencies: 2925 | unist-util-visit "^1.1.0" 2926 | 2927 | unist-util-visit@^1.1.0: 2928 | version "1.1.1" 2929 | resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-1.1.1.tgz#e917a3b137658b335cb4420c7da2e74d928e4e94" 2930 | 2931 | unorm@^1.4.1: 2932 | version "1.4.1" 2933 | resolved "https://registry.yarnpkg.com/unorm/-/unorm-1.4.1.tgz#364200d5f13646ca8bcd44490271335614792300" 2934 | 2935 | unpipe@~1.0.0: 2936 | version "1.0.0" 2937 | resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" 2938 | 2939 | untildify@^3.0.2: 2940 | version "3.0.2" 2941 | resolved "https://registry.yarnpkg.com/untildify/-/untildify-3.0.2.tgz#7f1f302055b3fea0f3e81dc78eb36766cb65e3f1" 2942 | 2943 | untildify@^3.0.3: 2944 | version "3.0.3" 2945 | resolved "https://registry.yarnpkg.com/untildify/-/untildify-3.0.3.tgz#1e7b42b140bcfd922b22e70ca1265bfe3634c7c9" 2946 | integrity sha512-iSk/J8efr8uPT/Z4eSUywnqyrQU7DSdMfdqK4iWEaUVVmcP5JcnpRqmVMwcwcnmI1ATFNgC5V90u09tBynNFKA== 2947 | 2948 | user-home@2.0.0: 2949 | version "2.0.0" 2950 | resolved "https://registry.yarnpkg.com/user-home/-/user-home-2.0.0.tgz#9c70bfd8169bc1dcbf48604e0f04b8b49cde9e9f" 2951 | dependencies: 2952 | os-homedir "^1.0.0" 2953 | 2954 | util-deprecate@~1.0.1: 2955 | version "1.0.2" 2956 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 2957 | 2958 | util-extend@^1.0.1: 2959 | version "1.0.3" 2960 | resolved "https://registry.yarnpkg.com/util-extend/-/util-extend-1.0.3.tgz#a7c216d267545169637b3b6edc6ca9119e2ff93f" 2961 | 2962 | validate-npm-package-license@^3.0.1, validate-npm-package-license@~3.0.1: 2963 | version "3.0.1" 2964 | resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" 2965 | dependencies: 2966 | spdx-correct "~1.0.0" 2967 | spdx-expression-parse "~1.0.0" 2968 | 2969 | validate-npm-package-name@^3.0.0: 2970 | version "3.0.0" 2971 | resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz#5fa912d81eb7d0c74afc140de7317f0ca7df437e" 2972 | dependencies: 2973 | builtins "^1.0.3" 2974 | 2975 | validate-npm-package-name@~2.2.2: 2976 | version "2.2.2" 2977 | resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-2.2.2.tgz#f65695b22f7324442019a3c7fa39a6e7fd299085" 2978 | dependencies: 2979 | builtins "0.0.7" 2980 | 2981 | verror@1.3.6: 2982 | version "1.3.6" 2983 | resolved "https://registry.yarnpkg.com/verror/-/verror-1.3.6.tgz#cff5df12946d297d2baaefaa2689e25be01c005c" 2984 | dependencies: 2985 | extsprintf "1.0.2" 2986 | 2987 | vfile-location@^2.0.0: 2988 | version "2.0.1" 2989 | resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-2.0.1.tgz#0bf8816f732b0f8bd902a56fda4c62c8e935dc52" 2990 | 2991 | vfile@^1.0.0: 2992 | version "1.4.0" 2993 | resolved "https://registry.yarnpkg.com/vfile/-/vfile-1.4.0.tgz#c0fd6fa484f8debdb771f68c31ed75d88da97fe7" 2994 | 2995 | wcwidth@^1.0.0: 2996 | version "1.0.1" 2997 | resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" 2998 | dependencies: 2999 | defaults "^1.0.3" 3000 | 3001 | which@1, which@~1.2.11, which@~1.2.4: 3002 | version "1.2.12" 3003 | resolved "https://registry.yarnpkg.com/which/-/which-1.2.12.tgz#de67b5e450269f194909ef23ece4ebe416fa1192" 3004 | dependencies: 3005 | isexe "^1.1.1" 3006 | 3007 | wordwrap@~0.0.2: 3008 | version "0.0.3" 3009 | resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" 3010 | 3011 | wordwrap@~1.0.0: 3012 | version "1.0.0" 3013 | resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" 3014 | 3015 | wrappy@1, wrappy@~1.0.1, wrappy@~1.0.2: 3016 | version "1.0.2" 3017 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 3018 | 3019 | write-file-atomic@~1.1.4: 3020 | version "1.1.4" 3021 | resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-1.1.4.tgz#b1f52dc2e8dc0e3cb04d187a25f758a38a90ca3b" 3022 | dependencies: 3023 | graceful-fs "^4.1.2" 3024 | imurmurhash "^0.1.4" 3025 | slide "^1.1.5" 3026 | 3027 | write@^0.2.1: 3028 | version "0.2.1" 3029 | resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" 3030 | dependencies: 3031 | mkdirp "^0.5.1" 3032 | 3033 | xml-escape@^1.0.0: 3034 | version "1.1.0" 3035 | resolved "https://registry.yarnpkg.com/xml-escape/-/xml-escape-1.1.0.tgz#3904c143fa8eb3a0030ec646d2902a2f1b706c44" 3036 | 3037 | xtend@^4.0.0, xtend@^4.0.1: 3038 | version "4.0.1" 3039 | resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" 3040 | 3041 | yallist@^2.0.0: 3042 | version "2.1.2" 3043 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" 3044 | 3045 | zlibjs@^0.2.0: 3046 | version "0.2.0" 3047 | resolved "https://registry.yarnpkg.com/zlibjs/-/zlibjs-0.2.0.tgz#ae20f06243293d85c255563189f9b12f5b3ba1a0" 3048 | --------------------------------------------------------------------------------