├── .babelrc ├── .eslintignore ├── .eslintrc ├── .gitignore ├── .npmignore ├── README.md ├── package.json ├── src ├── api.js ├── clients.js ├── config.js ├── index.js ├── models.js └── pinVerifier.js └── yarn.lock /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ "es2015" ], 3 | "plugins": [ 4 | "transform-object-rest-spread", 5 | "add-module-exports" 6 | ] 7 | } 8 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | spec 2 | webpack.config.js 3 | -------------------------------------------------------------------------------- /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "airbnb", 3 | "rules": { 4 | "strict": [ 5 | 2, 6 | "global" 7 | ], 8 | "max-len": [2, 80, 4, { "ignoreComments": true }], 9 | "quotes": [ 10 | 2, 11 | "single" 12 | ], 13 | "indent": [ 14 | 2, 15 | 2, 16 | { "SwitchCase": 1 } 17 | ], 18 | "no-var": 2, 19 | "one-var": [ 20 | 2, 21 | "never" 22 | ], 23 | "consistent-return": 0, 24 | "no-use-before-define": [ 25 | 2, 26 | "nofunc" 27 | ], 28 | "space-before-function-paren": [ 29 | 2, 30 | { 31 | "anonymous": "always", 32 | "named": "never" 33 | } 34 | ], 35 | "space-before-blocks" : [ 36 | 2, 37 | "always" 38 | ], 39 | "keyword-spacing": [ 40 | 2, 41 | { 42 | "before": true, 43 | "after": true, 44 | "overrides": {} 45 | } 46 | ], 47 | "array-bracket-spacing": [ 48 | 2, 49 | "never" 50 | ], 51 | "space-in-parens": [ 52 | 2, 53 | "never" 54 | ], 55 | "quote-props": [ 56 | 2, 57 | "as-needed" 58 | ], 59 | "no-multiple-empty-lines": [ 60 | 2, 61 | { 62 | "max": 2 63 | } 64 | ], 65 | "brace-style": [ 66 | 2, 67 | "1tbs" 68 | ], 69 | "curly": [ 70 | 2, 71 | "all" 72 | ], 73 | "key-spacing": [ 74 | 2, 75 | { 76 | "beforeColon": false, 77 | "afterColon": true 78 | } 79 | ], 80 | "space-infix-ops": 2, 81 | "no-eval": 2, 82 | "no-with": 2, 83 | "eol-last": 2, 84 | "comma-dangle": [ 85 | 2, 86 | "never" 87 | ], 88 | "no-console": 0, 89 | "no-cond-assign": 2, 90 | "no-constant-condition": 2, 91 | "no-control-regex": 2, 92 | "no-debugger": 2, 93 | "no-dupe-args": 2, 94 | "no-dupe-keys": 2, 95 | "no-duplicate-case": 2, 96 | "no-empty-character-class": 2, 97 | "no-empty": 2, 98 | "no-ex-assign": 2, 99 | "no-extra-boolean-cast": 2, 100 | "no-extra-semi": 2, 101 | "no-func-assign": 2, 102 | "no-inner-declarations": [ 103 | 2, 104 | "functions" 105 | ], 106 | "no-invalid-regexp": 2, 107 | "no-irregular-whitespace": 2, 108 | "no-negated-in-lhs": 2, 109 | "no-obj-calls": 2, 110 | "no-regex-spaces": 2, 111 | "no-sparse-arrays": 2, 112 | "no-unreachable": 2, 113 | "use-isnan": 2, 114 | "valid-typeof": 2, 115 | "dot-notation": [ 116 | 2, 117 | { 118 | "allowKeywords": true 119 | } 120 | ], 121 | "eqeqeq": 2, 122 | "no-alert": 1, 123 | "no-caller": 2, 124 | "no-extend-native": 2, 125 | "no-extra-bind": 2, 126 | "no-fallthrough": 2, 127 | "no-implied-eval": 2, 128 | "no-iterator": 2, 129 | "no-labels": 2, 130 | "no-lone-blocks": 2, 131 | "no-loop-func": 2, 132 | "no-multi-spaces": 2, 133 | "no-multi-str": 2, 134 | "no-native-reassign": 2, 135 | "no-new-func": 2, 136 | "no-new-wrappers": 2, 137 | "no-new": 2, 138 | "no-octal-escape": 2, 139 | "no-octal": 2, 140 | "no-proto": 2, 141 | "no-redeclare": 2, 142 | "no-return-assign": 2, 143 | "no-script-url": 2, 144 | "no-sequences": 2, 145 | "no-unused-expressions": 2, 146 | "yoda": 2, 147 | "no-delete-var": 2, 148 | "no-label-var": 2, 149 | "no-shadow-restricted-names": 2, 150 | "no-shadow": 2, 151 | "no-undef-init": 2, 152 | "no-undef": 2, 153 | "no-unused-vars": [ 154 | 2, 155 | { 156 | "vars": "all", 157 | "args": "after-used" 158 | } 159 | ], 160 | "camelcase": 2, 161 | "comma-spacing": 2, 162 | "comma-style": [2, "last"], 163 | "new-cap": 0, 164 | "new-parens": 2, 165 | "no-array-constructor": 2, 166 | "no-extra-parens": 2, 167 | "no-mixed-spaces-and-tabs": [ 168 | 2, 169 | false 170 | ], 171 | "no-new-object": 2, 172 | "no-spaced-func": 2, 173 | "arrow-parens": [2, "always"], 174 | "no-trailing-spaces": 2, 175 | "no-underscore-dangle": 0, 176 | "semi-spacing": [ 177 | 2, 178 | { 179 | "before": false, 180 | "after": true 181 | } 182 | ], 183 | "semi": 2, 184 | "complexity": [2, 10] 185 | }, 186 | "env": { 187 | "browser": true, 188 | "amd": true, 189 | "node": true, 190 | "mocha": true, 191 | "es6": true 192 | }, 193 | "parser": "babel-eslint", 194 | "parserOptions": { 195 | "ecmaFeatures": { 196 | "jsx": true 197 | }, 198 | "ecmaVersion": 6, 199 | "sourceType": "module" 200 | } 201 | } 202 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | lib 2 | spec 3 | node_modules 4 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | src 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Line in JS 2 | ========== 3 | 4 | [![Join the chat at https://gitter.im/CYBAI/jsline-api](https://img.shields.io/gitter/room/CYBAI/jsline-api.svg?style=flat-square)](https://gitter.im/CYBAI/jsline-api?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) 5 | 6 | 7 | ### **When you want to create a LINE bot with node.js, please use the [official node.js SDK](https://github.com/line/line-bot-sdk-nodejs).** 8 | 9 | This is inspired by [carpedm20's LINE API](https://github.com/carpedm20/LINE). 10 | 11 | Still work in process, don't use it now! :construction_worker: 12 | 13 | **TODO** features 14 | - Implement `longPoll` for fetch messages 15 | - Improve API logic 16 | 17 | Author 18 | ------ 19 | 20 | CYB / [@cyb_0815](https://twitter.com/cyb_0815) 21 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "jsline-api", 3 | "version": "0.2.0", 4 | "description": "Line in JS", 5 | "main": "./lib/index.js", 6 | "scripts": { 7 | "compile": "babel src --out-dir lib", 8 | "prepublish": "npm run compile", 9 | "test": "npm run test-watch", 10 | "test-once": "jasmine-node spec", 11 | "test-watch": "jasmine-node spec --autotest --color --watch ." 12 | }, 13 | "repository": { 14 | "type": "git", 15 | "url": "https://github.com/CYBAI/jsline-api.git" 16 | }, 17 | "author": { 18 | "name": "cybai", 19 | "email": "cyb.ai.815@gmail.com" 20 | }, 21 | "license": "MIT", 22 | "devDependencies": { 23 | "babel": "^6.5.2", 24 | "babel-cli": "^6.9.0", 25 | "babel-core": "^6.7.2", 26 | "babel-eslint": "^6.0.4", 27 | "babel-plugin-add-module-exports": "^0.2.1", 28 | "babel-plugin-transform-object-rest-spread": "^6.6.5", 29 | "babel-polyfill": "^6.7.4", 30 | "babel-preset-es2015": "^6.6.0", 31 | "eslint": "^2.8.0", 32 | "eslint-config-airbnb": "^8.0.0", 33 | "eslint-plugin-import": "^1.6.1", 34 | "eslint-plugin-jsx-a11y": "^1.0.4", 35 | "eslint-plugin-react": "^5.0.1" 36 | }, 37 | "dependencies": { 38 | "bluebird": "^3.3.4", 39 | "curve-thrift": "^0.2.0", 40 | "moment": "^2.12.0", 41 | "node-bignumber": "^1.2.1", 42 | "rsa-pem-from-mod-exp": "^0.8.4", 43 | "thrift": "^0.9.3", 44 | "through": "^2.3.8", 45 | "tmp": "0.0.28", 46 | "unirest": "^0.5.0", 47 | "utf8": "^2.1.1" 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /src/api.js: -------------------------------------------------------------------------------- 1 | import thrift from 'thrift'; 2 | import unirest from 'unirest'; 3 | import Promise from 'bluebird'; 4 | import { 5 | LoginResultType, 6 | IdentityProvider 7 | } from 'curve-thrift/line_types'; 8 | import TalkService from 'curve-thrift/TalkService'; 9 | 10 | import { PinVerifier } from './pinVerifier'; 11 | import { config } from './config'; 12 | 13 | export class LineAPI { 14 | constructor() { 15 | this.config = config; 16 | } 17 | 18 | setTHttpClient(options = { 19 | protocol: thrift.TCompactProtocol, 20 | headers: this.config.Headers, 21 | path: this.config.LINE_HTTP_URL 22 | }) { 23 | this.connection = 24 | thrift.createHttpConnection(this.config.LINE_DOMAIN, 443, options); 25 | this.connection.on('error', (err) => { 26 | console.error(err); 27 | return err; 28 | }); 29 | this._client = thrift.createHttpClient(TalkService, this.connection); 30 | } 31 | 32 | _tokenLogin(authToken, certificate) { 33 | this.config.Headers['X-Line-Access'] = authToken; 34 | this.setTHttpClient(); 35 | return Promise.resolve({ authToken, certificate }); 36 | } 37 | 38 | _login(id, password) { 39 | const pinVerifier = new PinVerifier(id, password); 40 | return new Promise((resolve, reject) => ( 41 | this._setProvider(id) 42 | .then((json) => pinVerifier.getRSACrypto(json)) 43 | .then((rsaCrypto) => { 44 | this.setTHttpClient(); 45 | this._client.loginWithIdentityCredentialForCertificate( 46 | this.provider, rsaCrypto.keyname, rsaCrypto.credentials, 47 | true, this.config.ip, this.config.hostname, rsaCrypto.message, 48 | (err, result) => { 49 | if (err) { 50 | console.log('LoginFailed'); 51 | console.error(err); 52 | return reject(err); 53 | } 54 | console.log(result); 55 | this._client.pinCode = result.pinCode; 56 | this.alertOrConsoleLog( 57 | `Enter Pincode ${result.pinCode} 58 | to your mobile phone in 2 minutes` 59 | ); 60 | this._checkLoginResultType(result.type, result); 61 | this._loginWithVerifier(result) 62 | .then((verifierResult) => { 63 | this._checkLoginResultType(verifierResult.type, verifierResult); 64 | resolve(verifierResult); 65 | }); 66 | }); 67 | }) 68 | )); 69 | } 70 | 71 | _loginWithVerifier() { 72 | return this.getJson(this.config.LINE_CERTIFICATE_URL) 73 | .then( 74 | (json) => 75 | this._client.loginWithVerifierForCertificate(json.result.verifier) 76 | , (err) => console.log(`LoginWithVerifierForCertificate Error: ${err}`) 77 | ); 78 | } 79 | 80 | _setProvider(id) { 81 | this.provider = this.config.EMAIL_REGEX.test(id) ? 82 | IdentityProvider.LINE : 83 | IdentityProvider.NAVER_KR; 84 | 85 | return this.provider === IdentityProvider.LINE ? 86 | this.getJson(this.config.LINE_SESSION_LINE_URL) : 87 | this.getJson(this.config.LINE_SESSION_NAVER_URL); 88 | } 89 | 90 | _checkLoginResultType(type, result) { 91 | this.config.Headers['X-Line-Access'] = result.authToken || result.verifier; 92 | if (result.type === LoginResultType.SUCCESS) { 93 | this.certificate = result.certificate; 94 | this.authToken = result.authToken; 95 | } else if (result.type === LoginResultType.REQUIRE_QRCODE) { 96 | console.log('require QR code'); 97 | } else if (result.type === LoginResultType.REQUIRE_DEVICE_CONFIRM) { 98 | console.log('require device confirm'); 99 | } else { 100 | throw new Error('unkown type'); 101 | } 102 | return result; 103 | } 104 | 105 | _getProfile() { 106 | return this._client.getProfile(); 107 | } 108 | 109 | _getAllContactIds() { 110 | return this._client.getAllContactIds(); 111 | } 112 | 113 | _getBlockedContactIds() { 114 | return this._client.getBlockedContactIds(); 115 | } 116 | 117 | _getContacts(ids) { 118 | if (!Array.isArray(ids)) { 119 | throw new Error('argument should be array of contact ids'); 120 | } 121 | return this._client.getContacts(ids); 122 | } 123 | 124 | _createRoom(ids, seq = 0) { 125 | return this._client.createRoom(seq, ids); 126 | } 127 | 128 | _getRoom(id) { 129 | return this._client.getRoom(id); 130 | } 131 | 132 | _inviteIntoRoom(roomId, contactIds = []) { 133 | return this._client.inviteIntoRoom(0, roomId, contactIds); 134 | } 135 | 136 | _leaveRoom(id) { 137 | return this._client.leaveRoom(0, id); 138 | } 139 | 140 | _createGroup(name, ids, seq = 0) { 141 | return this._client.createGroup(seq, name, ids); 142 | } 143 | 144 | _getGroups(ids) { 145 | if (!Array.isArray(ids)) { 146 | throw new Error('argument should be array of group ids'); 147 | } 148 | return this._client.getGroups(ids); 149 | } 150 | 151 | _getGroupIdsJoined() { 152 | return this._client.getGroupIdsJoined(); 153 | } 154 | 155 | _getGroupIdsInvited() { 156 | return this._client.getGroupIdsInvited(); 157 | } 158 | 159 | _acceptGroupInvitation(groupId, seq = 0) { 160 | return this._client.acceptGroupInvitation(seq, groupId); 161 | } 162 | 163 | _cancelGroupInvitation(groupId, contactIds = [], seq = 0) { 164 | return this._client.cancelGroupInvitation(seq, groupId, contactIds); 165 | } 166 | 167 | _inviteIntoGroup(groupId, contactIds = [], seq = 0) { 168 | return this._client.inviteIntoGroup(seq, groupId, contactIds); 169 | } 170 | 171 | _leaveGroup(id) { 172 | return this._client.leaveGroup(0, id); 173 | } 174 | 175 | _getRecentMessages(id, count = 1) { 176 | return this._client.getRecentMessages(id, count); 177 | } 178 | 179 | _sendMessage(message, seq = 0) { 180 | return this._client.sendMessage(seq, message); 181 | } 182 | 183 | _sendChatChecked(consumer, lastMessageId, seq = 0) { 184 | return this._client.sendChatChecked(seq, consumer, lastMessageId); 185 | } 186 | 187 | _getLastOpRevision() { 188 | return this._client.getLastOpRevision(); 189 | } 190 | 191 | _fetchOperations(revision, count = 50) { 192 | return this._client.fetchOperations(revision, count); 193 | } 194 | 195 | _getMessageBoxCompactWrapUp(id) { 196 | return this._client.getMessageBoxCompactWrapUp(id); 197 | } 198 | 199 | _getMessageBoxCompactWrapUpList(start = 1, count = 50) { 200 | return this._client.getMessageBoxCompactWrapUpList(start, count); 201 | } 202 | 203 | /** 204 | * If using api in browser, it will alert message, or message will be console.log 205 | * @param {String} message [Message to be alert or console.log] 206 | */ 207 | alertOrConsoleLog(message) { 208 | if (typeof alert !== 'undefined') { 209 | alert(message); // eslint-disable-line no-alert 210 | } else { 211 | console.log(message); 212 | } 213 | } 214 | 215 | /** 216 | * fetch data from LINE_DOMAIN, using `unirest` 217 | * @param {String} path [pathname to do fetch] 218 | * @return {Promise} [defer first, then resolve after getting data] 219 | */ 220 | getJson(path) { 221 | return new Promise((resolve, reject) => ( 222 | unirest.get(`http://${this.config.LINE_DOMAIN}${path}`) 223 | .headers(this.config.Headers) 224 | .timeout(120000) 225 | .end((res) => ( 226 | res.error ? reject(res.error) : resolve(res.body) 227 | )) 228 | )); 229 | } 230 | 231 | /** 232 | * Send files to chat room, ex. images, videos or files 233 | * @param {String} url [Url to post the image] 234 | * @param {Object} data=null [JSON stringify paramater object] 235 | * @param {String} filepath=null [File path] 236 | * @return {Promise} [defer first, then resolve after getting data] 237 | */ 238 | postContent(url, data = null, filepath = null) { 239 | return new Promise((resolve, reject) => ( 240 | unirest.post(url) 241 | .headers({ 242 | ...this.config.Headers, 243 | 'Content-Type': 'multipart/form-data' 244 | }) 245 | .timeout(120000) 246 | .field(data) 247 | .attach('files', filepath) 248 | .end((res) => ( 249 | res.error ? reject(res.error) : resolve(res) 250 | )) 251 | )); 252 | } 253 | } 254 | -------------------------------------------------------------------------------- /src/clients.js: -------------------------------------------------------------------------------- 1 | import Promise from 'bluebird'; 2 | // Promise.longStackTraces() 3 | import { 4 | OpType, 5 | MIDType, 6 | TalkException 7 | } from 'curve-thrift/line_types'; 8 | 9 | import { LineAPI } from './api'; 10 | import { LineRoom, LineGroup, LineContact, LineMessage } from './models'; 11 | 12 | function getOpTypeNameFromValue(operationValue) { 13 | for (const operationName in OpType) { // eslint-disable-line no-restricted-syntax 14 | if (operationValue === OpType[operationName]) { 15 | return operationName; 16 | } 17 | } 18 | } 19 | 20 | export class LineClient extends LineAPI { 21 | /** 22 | * Constructor of LineClient, initiate basic info for login 23 | * @param {String} id = null [Default to null, account id of client] 24 | * @param {String} password = null [Default to null, password of client] 25 | * @param {String} authToken = null [Default to null, authentication token of LINE] 26 | * @param {String} certificate = null [Default to null, certification of LINE] 27 | */ 28 | constructor(options = { 29 | id: null, password: null, 30 | authToken: null, certificate: null 31 | }) { 32 | super(); 33 | if (!(options.authToken || options.id && options.password)) { 34 | throw new Error('id and password or authToken is needed'); 35 | } 36 | 37 | this.id = options.id; 38 | this.password = options.password; 39 | this.certificate = options.certificate; 40 | 41 | if (this.config.platform === 'MAC') { 42 | // this.config.Headers['User-Agent'] = `DESKTOP:MAC:${this.config.version}(10.9.4-MAVERICKS-x64)`; 43 | this.config.Headers['X-Line-Application'] = 44 | `DESKTOPMAC\t${this.config.version}\tMAC\t10.9.4-MAVERICKS-x64`; 45 | } else { 46 | // this.config.Headers['User-Agent'] = `DESKTOP:WIN:${this.config.version}(5.1.2600-XP-x64)`; 47 | this.config.Headers['X-Line-Application'] = 48 | `DESKTOPWIN\t${this.config.version}\tWINDOWS\t5.2.2-XP-x64`; 49 | } 50 | 51 | if (options.authToken) { 52 | this.authToken = options.authToken; 53 | this.config.Headers['X-Line-Access'] = options.authToken; 54 | } else { 55 | this._setProvider(options.id); 56 | } 57 | 58 | this.contacts = []; 59 | this.rooms = []; 60 | this.groups = []; 61 | } 62 | 63 | /** 64 | * Login to LINE 65 | * @return {Promise} [If login successfully return result with authToken 66 | * and certificate, or return error message] 67 | */ 68 | login() { 69 | const loginPromise = this.authToken ? 70 | this._tokenLogin(this.authToken, this.certificate) : 71 | this._login(this.id, this.password); 72 | return loginPromise.then((result) => { 73 | if (result.authToken && !this.authToken) { 74 | this.authToken = result.authToken; 75 | } 76 | if (result.certificate && !this.certificate) { 77 | this.certificate = result.certificate; 78 | } 79 | return Promise.join( 80 | this.getLastOpRevision(), 81 | this.getProfile(), 82 | this.refreshContacts(), 83 | this.refreshGroups(), 84 | this.refreshActiveRooms() 85 | ).catch((err) => err); 86 | }); 87 | } 88 | 89 | /** 90 | * Get last operation revision 91 | * @return {Promise} [return revision when promise successfully, 92 | * or return promise with error message] 93 | */ 94 | getLastOpRevision() { 95 | if (this._checkAuth()) { 96 | return this._getLastOpRevision() 97 | .then((revision) => { 98 | this.revision = revision; 99 | return this.revision; 100 | }); 101 | } 102 | return Promise.reject(new Error('Please Login first')); 103 | } 104 | 105 | /** 106 | * Get profile of client 107 | * @return {Promise} [return profile when promise successfully, 108 | * or return promise with error message] 109 | */ 110 | getProfile() { 111 | if (this._checkAuth()) { 112 | return this._getProfile() 113 | .then((profile) => { 114 | this.profile = new LineContact(this, profile); 115 | return this.profile; 116 | }); 117 | } 118 | return Promise.reject(new Error('Please Login first')); 119 | } 120 | 121 | /** 122 | * Get the LineContact searching by name 123 | * @param {String} name [contact name which want to find] 124 | * @return {LineContact} [LineContact which name matches the passing parameter] 125 | */ 126 | getContactByName(name) { 127 | for (let i = 0, len = this.contacts.length; i < len; i++) { 128 | if (this.contacts[i].name === name) { 129 | return this.contacts[i]; 130 | } 131 | } 132 | } 133 | 134 | /** 135 | * Get the LineContact searching by id 136 | * @param {String} id [contact id which want to find] 137 | * @return {LineContact} [LineContact which id matches the passing parameter] 138 | */ 139 | getContactById(id) { 140 | for (let i = 0, len = this.contacts.length; i < len; i++) { 141 | if (this.contacts[i].id === id) { 142 | return this.contacts[i]; 143 | } 144 | } 145 | } 146 | 147 | /** 148 | * Get a LineContact or LineRoom or LineGroup searching by id 149 | * @param {String} id [user id which want to find] 150 | * @return {LineContact|LineRoom|LineGroup} [LineContact/LineRoom/LineGroup which id matches the passing parameter] 151 | */ 152 | getContactOrRoomOrGroupById(id) { 153 | return this.getContactById(id) || 154 | this.getRoomById(id) || 155 | this.getGroupById(id); 156 | } 157 | 158 | /** 159 | * Get groups from groupIds, initiate them into LineGroup, and push to this.groups 160 | * @param {Array} groupIds [an array of group ids] 161 | * @param {Boolean} isJoined = true [a boolean value to determine user joined the group or not] 162 | * @return {Promise} [return initiated this.groups when promise successfully, 163 | * or return promise with error message] 164 | */ 165 | addGroupsWithIds(groupIds, isJoined = true) { 166 | if (this._checkAuth()) { 167 | return this._getGroups(groupIds).then((newGroups) => { 168 | const newGroupsContext = 169 | newGroups.map((group) => new LineGroup(this, group, isJoined)); 170 | this.groups = this.groups.concat(newGroupsContext); 171 | this.groups.sort((a, b) => a.id - b.id); 172 | return this.groups; 173 | }).catch((err) => err); 174 | } 175 | return Promise.reject(new Error('Please Login first')); 176 | } 177 | 178 | /** 179 | * Get contacts, initiate them into LineContact, and push to this.contacts 180 | * @return {Promise} [return initiated this.contacts when promise successfully, 181 | * or return promise with error message] 182 | */ 183 | refreshContacts() { 184 | if (this._checkAuth()) { 185 | return this._getAllContactIds().then((contactIds) => ( 186 | this._getContacts(contactIds).then((contacts) => { 187 | this.contacts = 188 | contacts.map((contact) => new LineContact(this, contact)); 189 | this.contacts.sort((a, b) => a.id - b.id); 190 | return this.contacts; 191 | }) 192 | )).catch((err) => { 193 | if (err.code === 8) { 194 | this.authToken = null; 195 | this.certificate = null; 196 | this._client.alertOrConsoleLog(`${err.reason}, please login again`); 197 | } 198 | return err; 199 | }); 200 | } 201 | return Promise.reject(new Error('Please Login first')); 202 | } 203 | 204 | /** 205 | * Call addGroupsWithIds to initiate groups 206 | * @return {Promise} [return initiated this.groups when promise successfully, 207 | * or return promise with error message] 208 | */ 209 | refreshGroups() { 210 | if (this._checkAuth()) { 211 | return new Promise((resolve, reject) => { 212 | this._getGroupIdsJoined() 213 | .then((groupIdsJoined) => this.addGroupsWithIds(groupIdsJoined)) 214 | .then(() => ( 215 | this._getGroupIdsInvited() 216 | .then( 217 | (groupIdsInvited) => this.addGroupsWithIds(groupIdsInvited, false) 218 | ) 219 | )) 220 | .then(() => resolve(this.groups)) 221 | .catch((err) => reject(err)); 222 | }); 223 | } 224 | return Promise.reject(new Error('Please Login first')); 225 | } 226 | 227 | /** 228 | * Reresh active rooms and initiate rooms into LineRoom 229 | * @return {Promise} [return initiated this.rooms when promise successfully, 230 | * or return promise with error message] 231 | */ 232 | refreshActiveRooms() { 233 | if (this._checkAuth()) { 234 | let start = 1; 235 | const count = 50; 236 | while (true) { // eslint-disable-line no-constant-condition 237 | let checkChannel = 0; 238 | this._getMessageBoxCompactWrapUpList(start, count) 239 | .then((channel) => { 240 | if (!channel.messageBoxWrapUpList) { 241 | return false; 242 | } 243 | checkChannel = channel.messageBoxWrapUpList.length; 244 | for (let i = 0, len = channel.messageBoxWrapUpList; i < len; i++) { 245 | const box = channel.messageBoxWrapUpList[i]; 246 | if (box.messageBox.midType === MIDType.ROOM) { 247 | this._getRoom(box.messageBox.id) 248 | .then((room) => this.rooms.push(new LineRoom(this, room))); 249 | } 250 | } 251 | return channel; 252 | }).done((channel) => { 253 | if (!channel) { 254 | checkChannel = 50; 255 | } 256 | console.log('Done this Channel: '); 257 | console.dir(channel); 258 | }); 259 | 260 | if (checkChannel === count) { 261 | start += count; 262 | } else { 263 | break; 264 | } 265 | } 266 | return Promise.resolve(this.rooms); 267 | } 268 | return Promise.reject(new Error('Please Login first')); 269 | } 270 | 271 | /** 272 | * Create group with LineContact ids 273 | * @param {String} name [name of created LineGroup] 274 | * @param {Array} ids = [] [Default value to empty array, or it should contain LineContact ids] 275 | * @return {Promise} [return created LineGroup when promise successfully, 276 | * or return promise with error message] 277 | */ 278 | createGroupWithIds(name, ids = []) { 279 | if (this._checkAuth()) { 280 | return this._createGroup(name, ids) 281 | .then((created) => { 282 | const group = new LineGroup(this, created); 283 | this.groups.push(group); 284 | return group; 285 | }); 286 | } 287 | return Promise.reject(new Error('Please Login first')); 288 | } 289 | 290 | /** 291 | * Create group with LineContact instances 292 | * @param {String} name [name of created LineGroup] 293 | * @param {Array} contacts = [] [Default value to empty array, or 294 | * it should contain LineContact instances] 295 | * @return {Promise} [return created LineGroup when promise successfully, 296 | * or return promise with error message] 297 | */ 298 | createGroupWithContacts(name, contacts = []) { 299 | if (this._checkAuth()) { 300 | const contactIds = []; 301 | for (let i = 0, len = contacts.length; i < len; i++) { 302 | contactIds.push(contacts[i].id); 303 | } 304 | return this._createGroup(name, contactIds) 305 | .then((created) => { 306 | const group = new LineGroup(this, created); 307 | this.groups.push(group); 308 | return group; 309 | }); 310 | } 311 | return Promise.reject(new Error('Please Login first')); 312 | } 313 | 314 | /** 315 | * Get LineGroup instance by name of group 316 | * @param {String} name [name of group which want to get] 317 | * @return {LineGroup} [LineGroup instance which name is equal to the name in param] 318 | */ 319 | getGroupByName(name) { 320 | for (let i = 0, len = this.groups.length; i < len; i++) { 321 | if (this.groups[i].name === name) { 322 | return this.groups[i]; 323 | } 324 | } 325 | } 326 | 327 | /** 328 | * Get LineGroup instance by id of group 329 | * @param {String} id [id of group which want to get] 330 | * @return {LineGroup} [LineGroup instance which id is equal to the id in param] 331 | */ 332 | getGroupById(id) { 333 | for (let i = 0, len = this.groups.length; i < len; i++) { 334 | if (this.groups[i].id === id) { 335 | return this.groups[i]; 336 | } 337 | } 338 | } 339 | 340 | /** 341 | * Invite contact(s) into a LineGroup 342 | * @param {LineGroup} group [LineGroup instance which client want to invite contact(s) into] 343 | * @param {Array} contacts = [] [Array of LineContact(s) which will be invited into the group] 344 | * @return {Promise} [handle result by promise or receive 345 | * promise with error message directly] 346 | */ 347 | inviteIntoGroup(group, contacts = []) { 348 | if (this._checkAuth()) { 349 | const contactIds = []; 350 | for (let i = 0, len = contacts.length; i < len; i++) { 351 | contactIds.push(contacts[i].id); 352 | } 353 | return this._inviteIntoGroup(group.id, contactIds); 354 | } 355 | return Promise.reject(new Error('Please Login first')); 356 | } 357 | 358 | /** 359 | * Accept group invitation 360 | * @param {LineGroup} group [LineGroup instance which client want to accept] 361 | * @return {Promise} [handle result by promise or receive 362 | * promise with error message directly] 363 | */ 364 | acceptGroupInvitation(group) { 365 | if (this._checkAuth()) { 366 | return this._acceptGroupInvitation(group.id); 367 | } 368 | return Promise.reject(new Error('Please Login first')); 369 | } 370 | 371 | leaveGroup(group) { 372 | if (this._checkAuth()) { 373 | return this._leaveGroup(group.id) 374 | .then(() => { 375 | this.groups = this.groups.filter((gp) => gp.id !== group.id); 376 | return true; 377 | }, () => false); 378 | } 379 | return Promise.reject(new Error('Please Login first')); 380 | } 381 | 382 | createRoomWithIds(ids = []) { 383 | if (this._checkAuth()) { 384 | return this._createRoom(ids) 385 | .then((created) => { 386 | const room = new LineRoom(this, created); 387 | this.rooms.push(room); 388 | return room; 389 | }); 390 | } 391 | return Promise.reject(new Error('Please Login first')); 392 | } 393 | 394 | createRoomWithContacts(contacts = []) { 395 | if (this._checkAuth()) { 396 | const contactIds = []; 397 | for (let i = 0, len = contacts.length; i < len; i++) { 398 | contacts.push(contacts.id); 399 | } 400 | return this._createRoom(contactIds) 401 | .then((created) => { 402 | const room = new LineRoom(this, created); 403 | this.rooms.push(room); 404 | return room; 405 | }); 406 | } 407 | return Promise.reject(new Error('Please Login first')); 408 | } 409 | 410 | getRoomById(id) { 411 | for (let i = 0, len = this.rooms.length; i < len; i++) { 412 | if (this.rooms[i].id === id) { 413 | return this.rooms[i]; 414 | } 415 | } 416 | } 417 | 418 | inviteIntoRoom(room, contacts = []) { 419 | if (this._checkAuth()) { 420 | const contactIds = []; 421 | for (let i = 0, len = contacts.length; i < len; i++) { 422 | contacts.push(contacts.id); 423 | } 424 | return this._inviteIntoRoom(room.id, contactIds); 425 | } 426 | return Promise.reject(new Error('Please Login first')); 427 | } 428 | 429 | leaveRoom(room) { 430 | if (this._checkAuth()) { 431 | return this._leaveRoom(room.id) 432 | .then(() => { 433 | this.rooms = this.rooms.filter((rm) => rm.id !== room.id); 434 | return true; 435 | }, () => false); 436 | } 437 | return Promise.reject(new Error('Please Login first')); 438 | } 439 | 440 | sendMessage(message, seq = 0) { 441 | if (this._checkAuth()) { 442 | return this._sendMessage(message, seq); 443 | } 444 | return Promise.reject(new Error('Please Login first')); 445 | } 446 | 447 | sendChatChecked(consumer, lastMessageId, seq = 0) { 448 | if (this._checkAuth()) { 449 | return this._sendChatChecked(consumer, lastMessageId, seq); 450 | } 451 | return Promise.reject(new Error('Please Login first')); 452 | } 453 | 454 | getMessageBox(id) { 455 | if (this._checkAuth()) { 456 | return this._getMessageBoxCompactWrapUp(id) 457 | .then((messageBoxWrapUp) => messageBoxWrapUp.messageBox); 458 | } 459 | return Promise.reject(new Error('Please Login first')); 460 | } 461 | 462 | getRecentMessages(messageBox, count) { 463 | if (this._checkAuth()) { 464 | return this._getRecentMessages(messageBox.id, count) 465 | .then((messages) => this.getLineMessageFromMessage(messages)); 466 | } 467 | return Promise.reject(new Error('Please Login first')); 468 | } 469 | 470 | longpoll() { 471 | return new Promise((resolve, reject) => { 472 | this._fetchOperations(this.revision, 50).then((operations) => { 473 | if (!operations) { 474 | console.log('No operations'); 475 | reject('No operations'); 476 | return; 477 | } 478 | 479 | return operations.map((operation) => { 480 | switch (operation.type) { 481 | case OpType.END_OF_OPERATION: 482 | case OpType.SEND_MESSAGE: 483 | case OpType.RECEIVE_MESSAGE: { 484 | const message = new LineMessage(this, operation.message); 485 | 486 | const rawSender = operation.message.from_; 487 | const rawReceiver = operation.message.to; 488 | 489 | let sender = this.getContactOrRoomOrGroupById(rawSender); 490 | let receiver = this.getContactOrRoomOrGroupById(rawReceiver); 491 | 492 | if (!sender && typeof receiver === LineGroup) { 493 | receiver.members.forEach((member) => { 494 | if (member.id === rawSender) { 495 | sender = member.id; 496 | } 497 | }); 498 | } 499 | 500 | if (!sender || !receiver) { 501 | this.refreshGroups(); 502 | this.refreshContacts(); 503 | this.refreshActiveRooms(); 504 | sender = this.getContactOrRoomOrGroupById(rawSender); 505 | receiver = this.getContactOrRoomOrGroupById(rawReceiver); 506 | } 507 | 508 | this.revision = Math.max(operation.revision, this.revision); 509 | console.log([sender, receiver, message, this.revision]); 510 | resolve([sender, receiver, message, this.revision]); 511 | return [sender, receiver, message, this.revision]; 512 | } 513 | default: 514 | console.log('[*]', operation); 515 | resolve(operation); 516 | return operation; 517 | } 518 | }); 519 | }); 520 | }); 521 | } 522 | 523 | *longPollGenerator(count = 50) { // eslint-disable-line complexity 524 | if (this._checkAuth()) { 525 | try { 526 | const operations = yield this._fetchOperations(this.revision, count); 527 | if (!operations) { 528 | throw Error('No Operation.'); 529 | } 530 | for (let i = 0, opLen = operations.length; i < opLen; i++) { 531 | const operation = operations[i]; 532 | switch (operation.type) { 533 | case OpType.END_OF_OPERATION: 534 | case OpType.SEND_MESSAGE: 535 | case OpType.RECEIVE_MESSAGE: { 536 | const message = new LineMessage(this, operation.message); 537 | 538 | const rawSender = operation.message.from_; 539 | const rawReceiver = operation.message.to; 540 | 541 | let sender = this.getContactOrRoomOrGroupById(rawSender); 542 | let receiver = this.getContactOrRoomOrGroupById(rawReceiver); 543 | 544 | if (!sender && typeof receiver === LineGroup) { 545 | for (let j = 0, memLen = receiver.members; j < memLen; j++) { 546 | if (receiver.members[j].id === rawSender) { 547 | sender = receiver.members[j].id; 548 | } 549 | } 550 | } 551 | 552 | if (!sender || !receiver) { 553 | this.refreshGroups(); 554 | this.refreshContacts(); 555 | this.refreshActiveRooms(); 556 | sender = this.getContactOrRoomOrGroupById(rawSender); 557 | receiver = this.getContactOrRoomOrGroupById(rawReceiver); 558 | } 559 | 560 | yield Promise.resolve([sender, receiver, message]); 561 | this.revision = Math.max(operation.revision, this.revision); 562 | return [sender, receiver, message, this.revision]; 563 | } 564 | default: 565 | console.log(`[*] ${getOpTypeNameFromValue(operation.type)}`); 566 | return operation; 567 | } 568 | } 569 | } catch (err) { 570 | console.error(err); 571 | if (err instanceof TalkException && err.code === 9) { 572 | throw new Error('user logged in on another machine'); 573 | } 574 | } 575 | } 576 | } 577 | 578 | createContactOrRoomOrGroupByMessage(message) { 579 | switch (message.toType) { 580 | case MIDType.USER: 581 | case MIDType.ROOM: 582 | case MIDType.GROUP: 583 | console.log(message.toType); 584 | break; 585 | default: 586 | console.log(message.toType); 587 | } 588 | } 589 | 590 | getLineMessageFromMessage(messages = []) { 591 | return messages.map((msg) => new LineMessage(this, msg)); 592 | } 593 | 594 | _checkAuth() { 595 | return !!this.authToken; 596 | } 597 | } 598 | -------------------------------------------------------------------------------- /src/config.js: -------------------------------------------------------------------------------- 1 | import { hostname, platform } from 'os'; 2 | 3 | const whichPlatform = platform() === 'darwin' ? 'MAC' : 'win32'; 4 | 5 | export const config = { 6 | LINE_DOMAIN: 'gd2.line.naver.jp', 7 | LINE_OS_URL: 'os.line.naver.jp', 8 | LINE_HTTP_URL: '/api/v4/TalkService.do', 9 | LINE_STICKER_URL: 'dl.stickershop.line.naver.jp/products/', 10 | LINE_POLL_URL: '/P4', 11 | LINE_CERTIFICATE_URL: '/Q', 12 | LINE_SHOP_PATH: '/SHOP4', 13 | LINE_SESSION_LINE_URL: '/authct/v1/keys/line', 14 | LINE_SESSION_NAVER_URL: '/authct/v1/keys/naver', 15 | LINE_POST_CONTENT_URL: 'https://os.line.naver.jp/talk/m/upload.nhn', 16 | ip: '127.0.0.1', 17 | version: '4.6.1.931', 18 | revision: 0, 19 | hostname: hostname(), 20 | platform: whichPlatform, 21 | EMAIL_REGEX: /[^@]+@[^@]+\.[^@]+/, 22 | Headers: { 23 | 'User-Agent': 'js-line (LINE for webapp)' 24 | } 25 | }; 26 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | import 'babel-core/register'; 2 | import 'babel-polyfill'; 3 | 4 | import LineModel from './models'; 5 | import { LineAPI } from './api'; 6 | import { LineClient } from './clients'; 7 | import { config as LineConfig } from './config'; 8 | 9 | module.exports = { 10 | LineAPI, 11 | LineConfig, 12 | LineClient, 13 | LineRoom: LineModel.LineRoom, 14 | LineGroup: LineModel.LineGroup, 15 | LineContact: LineModel.LineContact, 16 | LineMessage: LineModel.LineMessage 17 | }; 18 | -------------------------------------------------------------------------------- /src/models.js: -------------------------------------------------------------------------------- 1 | /* eslint no-use-before-define: ["error", { "classes": false }] */ 2 | 3 | import fs from 'fs'; 4 | 5 | import { file as tmpFile } from 'tmp'; 6 | import unirest from 'unirest'; 7 | import Promise from 'bluebird'; 8 | 9 | import { config } from './config'; 10 | import { Message, ContentType } from 'curve-thrift/line_types'; 11 | 12 | const tmpFilePromise = Promise.promisify(tmpFile); 13 | Promise.promisifyAll(fs); 14 | 15 | function getContentTypeNameFromValue(content) { 16 | for (const name in ContentType) { // eslint-disable-line no-restricted-syntax 17 | if (content === ContentType[name]) { 18 | return name; 19 | } 20 | } 21 | } 22 | 23 | class LineMessage { 24 | /** 25 | * LineMessage constructor 26 | * @param {Thrift HttpClient} client [client object of who logged in] 27 | * @param {String} message [LineMessage object] 28 | */ 29 | constructor(client, message) { 30 | this._client = client; 31 | this.id = message.id; 32 | this.text = message.text; 33 | this.hasContent = message.hasContent; 34 | this.contentType = message.contentType; 35 | this.contentPreview = message.contentPreview; 36 | this.contentMetaData = message.contentMetadata; 37 | this.sender = client.getContactOrRoomOrGroupById(message._from); 38 | this.receiver = client.getContactOrRoomOrGroupById(message.to); 39 | this.toType = message.toType; 40 | this.createdTime = new Date(message.createdTime); 41 | } 42 | 43 | /** 44 | * Override toString method 45 | * @return {String} [Print some important info of LineMessage] 46 | */ 47 | toString() { 48 | return ` 49 | LineMessage 50 | (contentType=${getContentTypeNameFromValue(this.contentType)}, 51 | sender=${this.sender}, receiver=${this.receiver}, msg=\"${this.text}\") 52 | `; 53 | } 54 | } 55 | 56 | class LineBase { 57 | /** 58 | * Constructor of base class of each line users, including groups, rooms, and contacts 59 | * and initiate message box for each user object 60 | */ 61 | constructor() { 62 | this._messageBox = null; 63 | } 64 | 65 | /** 66 | * Send text message 67 | * @param {String} text [content of text message] 68 | * @return {Promise} [return sendMessage promise to handle result or error] 69 | */ 70 | sendMessage(text) { 71 | const message = new Message({ to: this.id, text }); 72 | return this._client.sendMessage(message); 73 | } 74 | 75 | /** 76 | * Send sticker message 77 | * @param {String} stickerId='13' [default value to 13, a string number of sticker id] 78 | * @param {String} stickerPackageId='1' [default value to 1, a string number of sticker package id] 79 | * @param {String} stickerVersion='100' [default value to 100, a string number of sticker version] 80 | * @param {String} stickerText='[null]' [default value to null, a string of sticker text] 81 | * @return {Promise} [return sendSticker promise to handle result or error] 82 | */ 83 | sendSticker( 84 | stickerId = '13', 85 | stickerPackageId = '1', 86 | stickerVersion = '100', 87 | stickerText = '[null]' 88 | ) { 89 | const message = new Message({ to: this.id, text: '' }); 90 | 91 | message.contentType = ContentType.STICKER; 92 | message.contentMetadata = { 93 | STKID: stickerId, 94 | STKPKGID: stickerPackageId, 95 | STKVER: stickerVersion, 96 | STKTXT: stickerText 97 | }; 98 | 99 | return this._client.sendMessage(message); 100 | } 101 | 102 | /** 103 | * Send image message from a path 104 | * @param {String} path [full path string to read the file] 105 | * @return {Promise} [return fs promise to handle result or error] 106 | */ 107 | sendImage(filepath, filename = 'Line Image') { 108 | const message = new Message({ 109 | to: this.id, 110 | text: '', 111 | contentType: ContentType.IMAGE, 112 | contentPreview: null, 113 | contentMetadata: null 114 | }); 115 | 116 | return fs.readFileAsync(filepath).then((bufs) => ( 117 | this._client.sendMessage(message).then((responseMessage) => { 118 | const data = { 119 | params: JSON.stringify({ 120 | name: filename, 121 | oid: responseMessage.id, 122 | size: bufs.length, 123 | type: 'image', 124 | ver: '1.0' 125 | }) 126 | }; 127 | return this._client 128 | .postContent(config.LINE_POST_CONTENT_URL, data, filepath) 129 | .then((res) => (res.error ? Promise.reject(res.error) : res)); 130 | }) 131 | )).catch((err) => { 132 | console.error(err); 133 | return err; 134 | }); 135 | } 136 | 137 | /** 138 | * Send image message from an URL 139 | * @param {String} url [image URL] 140 | * @return {Promise} [return promise of sending image with url to handle result or error] 141 | */ 142 | sendImageWithURL(url) { 143 | const _client = this._client; 144 | const message = new Message({ 145 | to: this.id, 146 | text: '', 147 | contentType: ContentType.IMAGE, 148 | contentPreview: null, 149 | contentMetadata: null 150 | }); 151 | 152 | return _client.sendMessage(message).then(() => { 153 | const unireq = unirest.get(url); 154 | unireq.options.encoding = 'binary'; 155 | return unireq.end((resp) => ( 156 | tmpFilePromise({ postfix: '.jpg' }).then((path) => ( 157 | fs.appendFileAsync(path, resp.body, 'binary') 158 | .then(() => this.sendImage(path).then(() => fs.unlinkAsync(path))) 159 | )) 160 | )); 161 | }).catch((err) => { 162 | console.error(err); 163 | return err; 164 | }); 165 | } 166 | 167 | /** 168 | * Get recent messages 169 | * @param {Number} count=1 [default value to 1, number of messages wanna get] 170 | * @return {Promise} [return promise of getRecentMessages to handle result or error] 171 | */ 172 | getRecentMessages(count = 1) { 173 | if (this._messageBox) { 174 | return this._client.getRecentMessages(this._messageBox, count); 175 | } 176 | 177 | return this._client.getMessageBox(this.id) 178 | .then((messageBox) => { 179 | this._messageBox = messageBox; 180 | return this._client.getRecentMessages(this._messageBox, count); 181 | }); 182 | } 183 | 184 | /** 185 | * Override valueOf method to compare value with ID 186 | * @return {String} [return id of an user, including groups or rooms or contacts] 187 | */ 188 | valueOf() { 189 | return this.id; 190 | } 191 | } 192 | 193 | class LineGroup extends LineBase { 194 | /** 195 | * Constructor of LineGroup, initiate base info of a group context 196 | * @param {Thrift HttpClient} client [Client context of the group] 197 | * @param {LineGroup} group [original group context, and using it to initiate `this`] 198 | * @param {Boolean} isJoined=true [default value to true, if use has joined the group, it will be true] 199 | */ 200 | constructor(client, group, isJoined = true) { 201 | super(); 202 | this._client = client; 203 | this._group = group; 204 | this.isJoined = isJoined; 205 | if (!group) { 206 | this.id = null; 207 | this.name = null; 208 | this.creator = null; 209 | this.invitee = []; 210 | this.members = []; 211 | } else { 212 | this.id = group.id; 213 | this.name = group.name; 214 | this.creator = 215 | group.creator ? new LineContact(client, group.creator) : null; 216 | this.invitee = 217 | group.invitee ? 218 | group.invitee.map((inv) => new LineContact(client, inv)) : 219 | []; 220 | this.members = 221 | group.members ? 222 | group.members.map((member) => new LineContact(client, member)) : 223 | []; 224 | } 225 | } 226 | 227 | /** 228 | * Accept a group invitation 229 | * @return {Promise} [if user has joined the group, 230 | * then user will just get a `Boolean` value of false 231 | * from Promise.reject. ] 232 | */ 233 | acceptGroupInvitation() { 234 | if (!this.isJoined) { 235 | return this._client.acceptGroupInvitation(this); 236 | } 237 | return Promise.reject(new Error('You are already in group')); 238 | } 239 | 240 | /** 241 | * Leave group method to each LineGroup 242 | * @return {Promise} [User will only get result from _client.leaveGroup 243 | * when leaving successfully. Besides, user will get `false` 244 | * from Promise.reject immediately when not joining the group] 245 | */ 246 | leave() { 247 | if (this.isJoined) { 248 | return this._client.leaveGroup(this); 249 | } 250 | return Promise.reject(new Error('You are not joined to group')); 251 | } 252 | 253 | /** 254 | * Get all of members' ids in this group 255 | * @return {Array} [array of members' ids in this group] 256 | */ 257 | getMemberIds() { 258 | const memberIds = []; 259 | for (let i = 0, len = this.members.length; i < len; i++) { 260 | memberIds.push(this.members[i].id); 261 | } 262 | return memberIds; 263 | } 264 | 265 | /** 266 | * Check this group containing the id or not 267 | * @param {String} id [id of the contact] 268 | * @return {Boolean} [if id of the contact is in this.members, then return true] 269 | */ 270 | _containId(id) { 271 | return Array.isArray(this.members) && this.members.indexOf(id) >= 0; 272 | } 273 | 274 | /** 275 | * Override toString method to show the group info 276 | * @return {String} [basic group info and joined or not] 277 | */ 278 | toString() { 279 | return this.isJoined ? 280 | `` : 281 | ``; 282 | } 283 | } 284 | 285 | class LineRoom extends LineBase { 286 | /** 287 | * Constructor of LineRoom, initiate base info of a Room context 288 | * @param {Thrift HttpClient} client [Client context of Room] 289 | * @param {LineRoom} room [original room context and using it to initiate `this`] 290 | */ 291 | constructor(client, room) { 292 | super(); 293 | this._client = client; 294 | this._room = room; 295 | this.id = room.mid; 296 | this.contacts = room.contacts ? 297 | room.contacts.map((contact) => new LineContact(client, contact)) : 298 | []; 299 | } 300 | 301 | /** 302 | * Leave room method to each LineRoom 303 | * @return {Promise} [user can handle the result or error from promise] 304 | */ 305 | leave() { 306 | return this._client.leaveRoom(this); 307 | } 308 | 309 | /** 310 | * Invite other Contact into `this` 311 | * @param {LineContact} contact [LineContact who will be invited into `this`] 312 | * @return {Promise} [user can handle result or error from promise. 313 | * Besides, when `contact` is not a LineContact, it will return 314 | * a promise with `false` and error message] 315 | */ 316 | invite(contact) { 317 | return !(contact instanceof LineContact) ? 318 | Promise.reject(new Error('You should pass a LineContact as parameter')) : 319 | this._client.inviteIntoRoom(this, new LineContact(this._client, contact)); 320 | } 321 | 322 | /** 323 | * Get contacts in `this` room 324 | * @return {Array} [array containing contact ids in this room] 325 | */ 326 | getContactIds() { 327 | const contactIds = []; 328 | for (let i = 0, len = this.contacts.length; i < len; i++) { 329 | contactIds.push(this.contacts[i].id); 330 | } 331 | return contactIds; 332 | } 333 | 334 | /** 335 | * Check this room containing the id or not 336 | * @param {String} id [id of the contact] 337 | * @return {Boolean} [if id of the contact is in this.contacts, then return true] 338 | */ 339 | _containId(id) { 340 | return Array.isArray(this.contacts) && this.contacts.indexOf(id) >= 0; 341 | } 342 | 343 | /** 344 | * Override toString method to show room id 345 | * @return {String} [show room id] 346 | */ 347 | toString() { 348 | return ``; 349 | } 350 | } 351 | 352 | class LineContact extends LineBase { 353 | /** 354 | * Constructor of LineContact, initiate base info of a contact context 355 | * @param {Thrift HttpClient} client [Client context of contact] 356 | * @param {LineContact} contact [original contact context and using it to initiate `this`] 357 | */ 358 | constructor(client, contact) { 359 | super(); 360 | this._client = client; 361 | this._contact = contact; 362 | this.id = contact.mid; 363 | this.name = contact.displayName; 364 | this.iconPath = 365 | `http://${config.LINE_OS_URL}${contact.picturePath}/preview`; 366 | this.statusMessage = contact.statusMessage; 367 | } 368 | 369 | /** 370 | * `rooms` setter of LineContact 371 | * @param {Array} contactRooms [give an array of rooms joined by `this` LineContact] 372 | */ 373 | set rooms(contactRooms) { 374 | this.rooms = contactRooms; 375 | } 376 | 377 | /** 378 | * `rooms` getter of LineContact 379 | * @return {Array} [an array of LineRoom that `this` LineContact has joined] 380 | */ 381 | get rooms() { 382 | return this._client.rooms.filter((room) => room._containId(this.id)); 383 | } 384 | 385 | /** 386 | * `groups` setter of LineContact 387 | * @param {Array} contactGroups [give an array of groups joined by `this` LineContact] 388 | */ 389 | set groups(contactGroups) { 390 | this.groups = contactGroups; 391 | } 392 | 393 | /** 394 | * `groups` setter of LineContact 395 | * @return {Array} [an array of LineGroup that `this` LineContact has joined] 396 | */ 397 | get groups() { 398 | return this._client.groups.map((group) => group._containId(this.id)); 399 | } 400 | 401 | /** 402 | * Override valueOf method to compare value with id 403 | * @return {String} [id of `this` LineContact] 404 | */ 405 | valueOf() { 406 | return this.id; 407 | } 408 | 409 | /** 410 | * Override toString method to show basic info of `this` LineContact 411 | * @return {String} [show basic info of `this` LineContact] 412 | */ 413 | toString() { 414 | return ``; 415 | } 416 | } 417 | 418 | export default { 419 | LineRoom, 420 | LineGroup, 421 | LineMessage, 422 | LineContact 423 | }; 424 | -------------------------------------------------------------------------------- /src/pinVerifier.js: -------------------------------------------------------------------------------- 1 | import utf8 from 'utf8'; 2 | import RSA from 'node-bignumber'; 3 | 4 | export class PinVerifier { 5 | constructor(id, password) { 6 | this.id = id; 7 | this.password = password; 8 | } 9 | 10 | getRSACrypto(json) { 11 | const rsa = new RSA.Key(); 12 | const chr = String.fromCharCode; 13 | const sessionKey = json.session_key; 14 | const message = 15 | utf8.encode(chr(sessionKey.length) + 16 | sessionKey + chr(this.id.length) + 17 | this.id + chr(this.password.length) + this.password); 18 | const [keyname, n, e] = json.rsa_key.split(','); 19 | rsa.setPublic(n, e); 20 | const credentials = rsa.encrypt(message); 21 | return { keyname, credentials, message }; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | abbrev@1: 4 | version "1.0.9" 5 | resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" 6 | 7 | acorn-jsx@^3.0.0, acorn-jsx@^3.0.1: 8 | version "3.0.1" 9 | resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" 10 | dependencies: 11 | acorn "^3.0.4" 12 | 13 | acorn@^3.0.4: 14 | version "3.3.0" 15 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" 16 | 17 | acorn@^4.0.1: 18 | version "4.0.3" 19 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.3.tgz#1a3e850b428e73ba6b09d1cc527f5aaad4d03ef1" 20 | 21 | ajv-keywords@^1.0.0: 22 | version "1.1.1" 23 | resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.1.1.tgz#02550bc605a3e576041565628af972e06c549d50" 24 | 25 | ajv@^4.7.0: 26 | version "4.8.2" 27 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.8.2.tgz#65486936ca36fea39a1504332a78bebd5d447bdc" 28 | dependencies: 29 | co "^4.6.0" 30 | json-stable-stringify "^1.0.1" 31 | 32 | ansi-escapes@^1.1.0: 33 | version "1.4.0" 34 | resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" 35 | 36 | ansi-regex@^2.0.0: 37 | version "2.0.0" 38 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.0.0.tgz#c5061b6e0ef8a81775e50f5d66151bf6bf371107" 39 | 40 | ansi-styles@^2.2.1: 41 | version "2.2.1" 42 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" 43 | 44 | anymatch@^1.3.0: 45 | version "1.3.0" 46 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.0.tgz#a3e52fa39168c825ff57b0248126ce5a8ff95507" 47 | dependencies: 48 | arrify "^1.0.0" 49 | micromatch "^2.1.5" 50 | 51 | aproba@^1.0.3: 52 | version "1.0.4" 53 | resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.0.4.tgz#2713680775e7614c8ba186c065d4e2e52d1072c0" 54 | 55 | are-we-there-yet@~1.1.2: 56 | version "1.1.2" 57 | resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.2.tgz#80e470e95a084794fe1899262c5667c6e88de1b3" 58 | dependencies: 59 | delegates "^1.0.0" 60 | readable-stream "^2.0.0 || ^1.1.13" 61 | 62 | argparse@^1.0.7: 63 | version "1.0.9" 64 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" 65 | dependencies: 66 | sprintf-js "~1.0.2" 67 | 68 | arr-diff@^2.0.0: 69 | version "2.0.0" 70 | resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" 71 | dependencies: 72 | arr-flatten "^1.0.1" 73 | 74 | arr-flatten@^1.0.1: 75 | version "1.0.1" 76 | resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.0.1.tgz#e5ffe54d45e19f32f216e91eb99c8ce892bb604b" 77 | 78 | array-union@^1.0.1: 79 | version "1.0.2" 80 | resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" 81 | dependencies: 82 | array-uniq "^1.0.1" 83 | 84 | array-uniq@^1.0.1: 85 | version "1.0.3" 86 | resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" 87 | 88 | array-unique@^0.2.1: 89 | version "0.2.1" 90 | resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" 91 | 92 | arrify@^1.0.0: 93 | version "1.0.1" 94 | resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" 95 | 96 | asn1@~0.2.3: 97 | version "0.2.3" 98 | resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" 99 | 100 | assert-plus@^0.2.0: 101 | version "0.2.0" 102 | resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" 103 | 104 | assert-plus@^1.0.0: 105 | version "1.0.0" 106 | resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" 107 | 108 | async-each@^1.0.0: 109 | version "1.0.1" 110 | resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" 111 | 112 | async@^2.0.1: 113 | version "2.1.2" 114 | resolved "https://registry.yarnpkg.com/async/-/async-2.1.2.tgz#612a4ab45ef42a70cde806bad86ee6db047e8385" 115 | dependencies: 116 | lodash "^4.14.0" 117 | 118 | async@~0.9.0: 119 | version "0.9.2" 120 | resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d" 121 | 122 | asynckit@^0.4.0: 123 | version "0.4.0" 124 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 125 | 126 | aws-sign2@~0.6.0: 127 | version "0.6.0" 128 | resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" 129 | 130 | aws4@^1.2.1: 131 | version "1.5.0" 132 | resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.5.0.tgz#0a29ffb79c31c9e712eeb087e8e7a64b4a56d755" 133 | 134 | babel-cli@^6.9.0: 135 | version "6.18.0" 136 | resolved "https://registry.yarnpkg.com/babel-cli/-/babel-cli-6.18.0.tgz#92117f341add9dead90f6fa7d0a97c0cc08ec186" 137 | dependencies: 138 | babel-core "^6.18.0" 139 | babel-polyfill "^6.16.0" 140 | babel-register "^6.18.0" 141 | babel-runtime "^6.9.0" 142 | commander "^2.8.1" 143 | convert-source-map "^1.1.0" 144 | fs-readdir-recursive "^1.0.0" 145 | glob "^5.0.5" 146 | lodash "^4.2.0" 147 | output-file-sync "^1.1.0" 148 | path-is-absolute "^1.0.0" 149 | slash "^1.0.0" 150 | source-map "^0.5.0" 151 | v8flags "^2.0.10" 152 | optionalDependencies: 153 | chokidar "^1.0.0" 154 | 155 | babel-code-frame@^6.16.0: 156 | version "6.16.0" 157 | resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.16.0.tgz#f90e60da0862909d3ce098733b5d3987c97cb8de" 158 | dependencies: 159 | chalk "^1.1.0" 160 | esutils "^2.0.2" 161 | js-tokens "^2.0.0" 162 | 163 | babel-core@^6.18.0, babel-core@^6.7.2: 164 | version "6.18.2" 165 | resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.18.2.tgz#d8bb14dd6986fa4f3566a26ceda3964fa0e04e5b" 166 | dependencies: 167 | babel-code-frame "^6.16.0" 168 | babel-generator "^6.18.0" 169 | babel-helpers "^6.16.0" 170 | babel-messages "^6.8.0" 171 | babel-register "^6.18.0" 172 | babel-runtime "^6.9.1" 173 | babel-template "^6.16.0" 174 | babel-traverse "^6.18.0" 175 | babel-types "^6.18.0" 176 | babylon "^6.11.0" 177 | convert-source-map "^1.1.0" 178 | debug "^2.1.1" 179 | json5 "^0.5.0" 180 | lodash "^4.2.0" 181 | minimatch "^3.0.2" 182 | path-is-absolute "^1.0.0" 183 | private "^0.1.6" 184 | slash "^1.0.0" 185 | source-map "^0.5.0" 186 | 187 | babel-eslint@^6.0.4: 188 | version "6.1.2" 189 | resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-6.1.2.tgz#5293419fe3672d66598d327da9694567ba6a5f2f" 190 | dependencies: 191 | babel-traverse "^6.0.20" 192 | babel-types "^6.0.19" 193 | babylon "^6.0.18" 194 | lodash.assign "^4.0.0" 195 | lodash.pickby "^4.0.0" 196 | 197 | babel-generator@^6.18.0: 198 | version "6.18.0" 199 | resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.18.0.tgz#e4f104cb3063996d9850556a45aae4a022060a07" 200 | dependencies: 201 | babel-messages "^6.8.0" 202 | babel-runtime "^6.9.0" 203 | babel-types "^6.18.0" 204 | detect-indent "^4.0.0" 205 | jsesc "^1.3.0" 206 | lodash "^4.2.0" 207 | source-map "^0.5.0" 208 | 209 | babel-helper-call-delegate@^6.18.0: 210 | version "6.18.0" 211 | resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.18.0.tgz#05b14aafa430884b034097ef29e9f067ea4133bd" 212 | dependencies: 213 | babel-helper-hoist-variables "^6.18.0" 214 | babel-runtime "^6.0.0" 215 | babel-traverse "^6.18.0" 216 | babel-types "^6.18.0" 217 | 218 | babel-helper-define-map@^6.18.0, babel-helper-define-map@^6.8.0: 219 | version "6.18.0" 220 | resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.18.0.tgz#8d6c85dc7fbb4c19be3de40474d18e97c3676ec2" 221 | dependencies: 222 | babel-helper-function-name "^6.18.0" 223 | babel-runtime "^6.9.0" 224 | babel-types "^6.18.0" 225 | lodash "^4.2.0" 226 | 227 | babel-helper-function-name@^6.18.0, babel-helper-function-name@^6.8.0: 228 | version "6.18.0" 229 | resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.18.0.tgz#68ec71aeba1f3e28b2a6f0730190b754a9bf30e6" 230 | dependencies: 231 | babel-helper-get-function-arity "^6.18.0" 232 | babel-runtime "^6.0.0" 233 | babel-template "^6.8.0" 234 | babel-traverse "^6.18.0" 235 | babel-types "^6.18.0" 236 | 237 | babel-helper-get-function-arity@^6.18.0: 238 | version "6.18.0" 239 | resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.18.0.tgz#a5b19695fd3f9cdfc328398b47dafcd7094f9f24" 240 | dependencies: 241 | babel-runtime "^6.0.0" 242 | babel-types "^6.18.0" 243 | 244 | babel-helper-hoist-variables@^6.18.0: 245 | version "6.18.0" 246 | resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.18.0.tgz#a835b5ab8b46d6de9babefae4d98ea41e866b82a" 247 | dependencies: 248 | babel-runtime "^6.0.0" 249 | babel-types "^6.18.0" 250 | 251 | babel-helper-optimise-call-expression@^6.18.0: 252 | version "6.18.0" 253 | resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.18.0.tgz#9261d0299ee1a4f08a6dd28b7b7c777348fd8f0f" 254 | dependencies: 255 | babel-runtime "^6.0.0" 256 | babel-types "^6.18.0" 257 | 258 | babel-helper-regex@^6.8.0: 259 | version "6.18.0" 260 | resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.18.0.tgz#ae0ebfd77de86cb2f1af258e2cc20b5fe893ecc6" 261 | dependencies: 262 | babel-runtime "^6.9.0" 263 | babel-types "^6.18.0" 264 | lodash "^4.2.0" 265 | 266 | babel-helper-replace-supers@^6.18.0, babel-helper-replace-supers@^6.8.0: 267 | version "6.18.0" 268 | resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.18.0.tgz#28ec69877be4144dbd64f4cc3a337e89f29a924e" 269 | dependencies: 270 | babel-helper-optimise-call-expression "^6.18.0" 271 | babel-messages "^6.8.0" 272 | babel-runtime "^6.0.0" 273 | babel-template "^6.16.0" 274 | babel-traverse "^6.18.0" 275 | babel-types "^6.18.0" 276 | 277 | babel-helpers@^6.16.0: 278 | version "6.16.0" 279 | resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.16.0.tgz#1095ec10d99279460553e67eb3eee9973d3867e3" 280 | dependencies: 281 | babel-runtime "^6.0.0" 282 | babel-template "^6.16.0" 283 | 284 | babel-messages@^6.8.0: 285 | version "6.8.0" 286 | resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.8.0.tgz#bf504736ca967e6d65ef0adb5a2a5f947c8e0eb9" 287 | dependencies: 288 | babel-runtime "^6.0.0" 289 | 290 | babel-plugin-add-module-exports@^0.2.1: 291 | version "0.2.1" 292 | resolved "https://registry.yarnpkg.com/babel-plugin-add-module-exports/-/babel-plugin-add-module-exports-0.2.1.tgz#9ae9a1f4a8dc67f0cdec4f4aeda1e43a5ff65e25" 293 | 294 | babel-plugin-check-es2015-constants@^6.3.13: 295 | version "6.8.0" 296 | resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.8.0.tgz#dbf024c32ed37bfda8dee1e76da02386a8d26fe7" 297 | dependencies: 298 | babel-runtime "^6.0.0" 299 | 300 | babel-plugin-syntax-object-rest-spread@^6.8.0: 301 | version "6.13.0" 302 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" 303 | 304 | babel-plugin-transform-es2015-arrow-functions@^6.3.13: 305 | version "6.8.0" 306 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.8.0.tgz#5b63afc3181bdc9a8c4d481b5a4f3f7d7fef3d9d" 307 | dependencies: 308 | babel-runtime "^6.0.0" 309 | 310 | babel-plugin-transform-es2015-block-scoped-functions@^6.3.13: 311 | version "6.8.0" 312 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.8.0.tgz#ed95d629c4b5a71ae29682b998f70d9833eb366d" 313 | dependencies: 314 | babel-runtime "^6.0.0" 315 | 316 | babel-plugin-transform-es2015-block-scoping@^6.18.0: 317 | version "6.18.0" 318 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.18.0.tgz#3bfdcfec318d46df22525cdea88f1978813653af" 319 | dependencies: 320 | babel-runtime "^6.9.0" 321 | babel-template "^6.15.0" 322 | babel-traverse "^6.18.0" 323 | babel-types "^6.18.0" 324 | lodash "^4.2.0" 325 | 326 | babel-plugin-transform-es2015-classes@^6.18.0: 327 | version "6.18.0" 328 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.18.0.tgz#ffe7a17321bf83e494dcda0ae3fc72df48ffd1d9" 329 | dependencies: 330 | babel-helper-define-map "^6.18.0" 331 | babel-helper-function-name "^6.18.0" 332 | babel-helper-optimise-call-expression "^6.18.0" 333 | babel-helper-replace-supers "^6.18.0" 334 | babel-messages "^6.8.0" 335 | babel-runtime "^6.9.0" 336 | babel-template "^6.14.0" 337 | babel-traverse "^6.18.0" 338 | babel-types "^6.18.0" 339 | 340 | babel-plugin-transform-es2015-computed-properties@^6.3.13: 341 | version "6.8.0" 342 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.8.0.tgz#f51010fd61b3bd7b6b60a5fdfd307bb7a5279870" 343 | dependencies: 344 | babel-helper-define-map "^6.8.0" 345 | babel-runtime "^6.0.0" 346 | babel-template "^6.8.0" 347 | 348 | babel-plugin-transform-es2015-destructuring@^6.18.0: 349 | version "6.18.0" 350 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.18.0.tgz#a08fb89415ab82058649558bedb7bf8dafa76ba5" 351 | dependencies: 352 | babel-runtime "^6.9.0" 353 | 354 | babel-plugin-transform-es2015-duplicate-keys@^6.6.0: 355 | version "6.8.0" 356 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.8.0.tgz#fd8f7f7171fc108cc1c70c3164b9f15a81c25f7d" 357 | dependencies: 358 | babel-runtime "^6.0.0" 359 | babel-types "^6.8.0" 360 | 361 | babel-plugin-transform-es2015-for-of@^6.18.0: 362 | version "6.18.0" 363 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.18.0.tgz#4c517504db64bf8cfc119a6b8f177211f2028a70" 364 | dependencies: 365 | babel-runtime "^6.0.0" 366 | 367 | babel-plugin-transform-es2015-function-name@^6.9.0: 368 | version "6.9.0" 369 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.9.0.tgz#8c135b17dbd064e5bba56ec511baaee2fca82719" 370 | dependencies: 371 | babel-helper-function-name "^6.8.0" 372 | babel-runtime "^6.9.0" 373 | babel-types "^6.9.0" 374 | 375 | babel-plugin-transform-es2015-literals@^6.3.13: 376 | version "6.8.0" 377 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.8.0.tgz#50aa2e5c7958fc2ab25d74ec117e0cc98f046468" 378 | dependencies: 379 | babel-runtime "^6.0.0" 380 | 381 | babel-plugin-transform-es2015-modules-amd@^6.18.0: 382 | version "6.18.0" 383 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.18.0.tgz#49a054cbb762bdf9ae2d8a807076cfade6141e40" 384 | dependencies: 385 | babel-plugin-transform-es2015-modules-commonjs "^6.18.0" 386 | babel-runtime "^6.0.0" 387 | babel-template "^6.8.0" 388 | 389 | babel-plugin-transform-es2015-modules-commonjs@^6.18.0: 390 | version "6.18.0" 391 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.18.0.tgz#c15ae5bb11b32a0abdcc98a5837baa4ee8d67bcc" 392 | dependencies: 393 | babel-plugin-transform-strict-mode "^6.18.0" 394 | babel-runtime "^6.0.0" 395 | babel-template "^6.16.0" 396 | babel-types "^6.18.0" 397 | 398 | babel-plugin-transform-es2015-modules-systemjs@^6.18.0: 399 | version "6.18.0" 400 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.18.0.tgz#f09294707163edae4d3b3e8bfacecd01d920b7ad" 401 | dependencies: 402 | babel-helper-hoist-variables "^6.18.0" 403 | babel-runtime "^6.11.6" 404 | babel-template "^6.14.0" 405 | 406 | babel-plugin-transform-es2015-modules-umd@^6.18.0: 407 | version "6.18.0" 408 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.18.0.tgz#23351770ece5c1f8e83ed67cb1d7992884491e50" 409 | dependencies: 410 | babel-plugin-transform-es2015-modules-amd "^6.18.0" 411 | babel-runtime "^6.0.0" 412 | babel-template "^6.8.0" 413 | 414 | babel-plugin-transform-es2015-object-super@^6.3.13: 415 | version "6.8.0" 416 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.8.0.tgz#1b858740a5a4400887c23dcff6f4d56eea4a24c5" 417 | dependencies: 418 | babel-helper-replace-supers "^6.8.0" 419 | babel-runtime "^6.0.0" 420 | 421 | babel-plugin-transform-es2015-parameters@^6.18.0: 422 | version "6.18.0" 423 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.18.0.tgz#9b2cfe238c549f1635ba27fc1daa858be70608b1" 424 | dependencies: 425 | babel-helper-call-delegate "^6.18.0" 426 | babel-helper-get-function-arity "^6.18.0" 427 | babel-runtime "^6.9.0" 428 | babel-template "^6.16.0" 429 | babel-traverse "^6.18.0" 430 | babel-types "^6.18.0" 431 | 432 | babel-plugin-transform-es2015-shorthand-properties@^6.18.0: 433 | version "6.18.0" 434 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.18.0.tgz#e2ede3b7df47bf980151926534d1dd0cbea58f43" 435 | dependencies: 436 | babel-runtime "^6.0.0" 437 | babel-types "^6.18.0" 438 | 439 | babel-plugin-transform-es2015-spread@^6.3.13: 440 | version "6.8.0" 441 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.8.0.tgz#0217f737e3b821fa5a669f187c6ed59205f05e9c" 442 | dependencies: 443 | babel-runtime "^6.0.0" 444 | 445 | babel-plugin-transform-es2015-sticky-regex@^6.3.13: 446 | version "6.8.0" 447 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.8.0.tgz#e73d300a440a35d5c64f5c2a344dc236e3df47be" 448 | dependencies: 449 | babel-helper-regex "^6.8.0" 450 | babel-runtime "^6.0.0" 451 | babel-types "^6.8.0" 452 | 453 | babel-plugin-transform-es2015-template-literals@^6.6.0: 454 | version "6.8.0" 455 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.8.0.tgz#86eb876d0a2c635da4ec048b4f7de9dfc897e66b" 456 | dependencies: 457 | babel-runtime "^6.0.0" 458 | 459 | babel-plugin-transform-es2015-typeof-symbol@^6.18.0: 460 | version "6.18.0" 461 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.18.0.tgz#0b14c48629c90ff47a0650077f6aa699bee35798" 462 | dependencies: 463 | babel-runtime "^6.0.0" 464 | 465 | babel-plugin-transform-es2015-unicode-regex@^6.3.13: 466 | version "6.11.0" 467 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.11.0.tgz#6298ceabaad88d50a3f4f392d8de997260f6ef2c" 468 | dependencies: 469 | babel-helper-regex "^6.8.0" 470 | babel-runtime "^6.0.0" 471 | regexpu-core "^2.0.0" 472 | 473 | babel-plugin-transform-object-rest-spread@^6.6.5: 474 | version "6.16.0" 475 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.16.0.tgz#db441d56fffc1999052fdebe2e2f25ebd28e36a9" 476 | dependencies: 477 | babel-plugin-syntax-object-rest-spread "^6.8.0" 478 | babel-runtime "^6.0.0" 479 | 480 | babel-plugin-transform-regenerator@^6.16.0: 481 | version "6.16.1" 482 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.16.1.tgz#a75de6b048a14154aae14b0122756c5bed392f59" 483 | dependencies: 484 | babel-runtime "^6.9.0" 485 | babel-types "^6.16.0" 486 | private "~0.1.5" 487 | 488 | babel-plugin-transform-strict-mode@^6.18.0: 489 | version "6.18.0" 490 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.18.0.tgz#df7cf2991fe046f44163dcd110d5ca43bc652b9d" 491 | dependencies: 492 | babel-runtime "^6.0.0" 493 | babel-types "^6.18.0" 494 | 495 | babel-polyfill@^6.16.0, babel-polyfill@^6.7.4: 496 | version "6.16.0" 497 | resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.16.0.tgz#2d45021df87e26a374b6d4d1a9c65964d17f2422" 498 | dependencies: 499 | babel-runtime "^6.9.1" 500 | core-js "^2.4.0" 501 | regenerator-runtime "^0.9.5" 502 | 503 | babel-preset-es2015@^6.6.0: 504 | version "6.18.0" 505 | resolved "https://registry.yarnpkg.com/babel-preset-es2015/-/babel-preset-es2015-6.18.0.tgz#b8c70df84ec948c43dcf2bf770e988eb7da88312" 506 | dependencies: 507 | babel-plugin-check-es2015-constants "^6.3.13" 508 | babel-plugin-transform-es2015-arrow-functions "^6.3.13" 509 | babel-plugin-transform-es2015-block-scoped-functions "^6.3.13" 510 | babel-plugin-transform-es2015-block-scoping "^6.18.0" 511 | babel-plugin-transform-es2015-classes "^6.18.0" 512 | babel-plugin-transform-es2015-computed-properties "^6.3.13" 513 | babel-plugin-transform-es2015-destructuring "^6.18.0" 514 | babel-plugin-transform-es2015-duplicate-keys "^6.6.0" 515 | babel-plugin-transform-es2015-for-of "^6.18.0" 516 | babel-plugin-transform-es2015-function-name "^6.9.0" 517 | babel-plugin-transform-es2015-literals "^6.3.13" 518 | babel-plugin-transform-es2015-modules-amd "^6.18.0" 519 | babel-plugin-transform-es2015-modules-commonjs "^6.18.0" 520 | babel-plugin-transform-es2015-modules-systemjs "^6.18.0" 521 | babel-plugin-transform-es2015-modules-umd "^6.18.0" 522 | babel-plugin-transform-es2015-object-super "^6.3.13" 523 | babel-plugin-transform-es2015-parameters "^6.18.0" 524 | babel-plugin-transform-es2015-shorthand-properties "^6.18.0" 525 | babel-plugin-transform-es2015-spread "^6.3.13" 526 | babel-plugin-transform-es2015-sticky-regex "^6.3.13" 527 | babel-plugin-transform-es2015-template-literals "^6.6.0" 528 | babel-plugin-transform-es2015-typeof-symbol "^6.18.0" 529 | babel-plugin-transform-es2015-unicode-regex "^6.3.13" 530 | babel-plugin-transform-regenerator "^6.16.0" 531 | 532 | babel-register@^6.18.0: 533 | version "6.18.0" 534 | resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.18.0.tgz#892e2e03865078dd90ad2c715111ec4449b32a68" 535 | dependencies: 536 | babel-core "^6.18.0" 537 | babel-runtime "^6.11.6" 538 | core-js "^2.4.0" 539 | home-or-tmp "^2.0.0" 540 | lodash "^4.2.0" 541 | mkdirp "^0.5.1" 542 | source-map-support "^0.4.2" 543 | 544 | babel-runtime@^6.0.0, babel-runtime@^6.11.6, babel-runtime@^6.9.0, babel-runtime@^6.9.1: 545 | version "6.18.0" 546 | resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.18.0.tgz#0f4177ffd98492ef13b9f823e9994a02584c9078" 547 | dependencies: 548 | core-js "^2.4.0" 549 | regenerator-runtime "^0.9.5" 550 | 551 | babel-template@^6.14.0, babel-template@^6.15.0, babel-template@^6.16.0, babel-template@^6.8.0: 552 | version "6.16.0" 553 | resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.16.0.tgz#e149dd1a9f03a35f817ddbc4d0481988e7ebc8ca" 554 | dependencies: 555 | babel-runtime "^6.9.0" 556 | babel-traverse "^6.16.0" 557 | babel-types "^6.16.0" 558 | babylon "^6.11.0" 559 | lodash "^4.2.0" 560 | 561 | babel-traverse@^6.0.20, babel-traverse@^6.16.0, babel-traverse@^6.18.0: 562 | version "6.18.0" 563 | resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.18.0.tgz#5aeaa980baed2a07c8c47329cd90c3b90c80f05e" 564 | dependencies: 565 | babel-code-frame "^6.16.0" 566 | babel-messages "^6.8.0" 567 | babel-runtime "^6.9.0" 568 | babel-types "^6.18.0" 569 | babylon "^6.11.0" 570 | debug "^2.2.0" 571 | globals "^9.0.0" 572 | invariant "^2.2.0" 573 | lodash "^4.2.0" 574 | 575 | babel-types@^6.0.19, babel-types@^6.16.0, babel-types@^6.18.0, babel-types@^6.8.0, babel-types@^6.9.0: 576 | version "6.18.0" 577 | resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.18.0.tgz#1f7d5a73474c59eb9151b2417bbff4e4fce7c3f8" 578 | dependencies: 579 | babel-runtime "^6.9.1" 580 | esutils "^2.0.2" 581 | lodash "^4.2.0" 582 | to-fast-properties "^1.0.1" 583 | 584 | babel@^6.5.2: 585 | version "6.5.2" 586 | resolved "https://registry.yarnpkg.com/babel/-/babel-6.5.2.tgz#59140607438270920047ff56f02b2d8630c2d129" 587 | 588 | babylon@^6.0.18, babylon@^6.11.0: 589 | version "6.13.1" 590 | resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.13.1.tgz#adca350e088f0467647157652bafead6ddb8dfdb" 591 | 592 | balanced-match@^0.4.1: 593 | version "0.4.2" 594 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" 595 | 596 | bcrypt-pbkdf@^1.0.0: 597 | version "1.0.0" 598 | resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.0.tgz#3ca76b85241c7170bf7d9703e7b9aa74630040d4" 599 | dependencies: 600 | tweetnacl "^0.14.3" 601 | 602 | binary-extensions@^1.0.0: 603 | version "1.7.0" 604 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.7.0.tgz#6c1610db163abfb34edfe42fa423343a1e01185d" 605 | 606 | bl@~1.1.2: 607 | version "1.1.2" 608 | resolved "https://registry.yarnpkg.com/bl/-/bl-1.1.2.tgz#fdca871a99713aa00d19e3bbba41c44787a65398" 609 | dependencies: 610 | readable-stream "~2.0.5" 611 | 612 | block-stream@*: 613 | version "0.0.9" 614 | resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" 615 | dependencies: 616 | inherits "~2.0.0" 617 | 618 | bluebird@^3.3.4: 619 | version "3.4.6" 620 | resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.4.6.tgz#01da8d821d87813d158967e743d5fe6c62cf8c0f" 621 | 622 | boom@2.x.x: 623 | version "2.10.1" 624 | resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" 625 | dependencies: 626 | hoek "2.x.x" 627 | 628 | brace-expansion@^1.0.0: 629 | version "1.1.6" 630 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.6.tgz#7197d7eaa9b87e648390ea61fc66c84427420df9" 631 | dependencies: 632 | balanced-match "^0.4.1" 633 | concat-map "0.0.1" 634 | 635 | braces@^1.8.2: 636 | version "1.8.5" 637 | resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" 638 | dependencies: 639 | expand-range "^1.8.1" 640 | preserve "^0.2.0" 641 | repeat-element "^1.1.2" 642 | 643 | buffer-shims@^1.0.0: 644 | version "1.0.0" 645 | resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" 646 | 647 | builtin-modules@^1.1.1: 648 | version "1.1.1" 649 | resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" 650 | 651 | caller-path@^0.1.0: 652 | version "0.1.0" 653 | resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" 654 | dependencies: 655 | callsites "^0.2.0" 656 | 657 | callsites@^0.2.0: 658 | version "0.2.0" 659 | resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" 660 | 661 | caseless@~0.11.0: 662 | version "0.11.0" 663 | resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7" 664 | 665 | chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3: 666 | version "1.1.3" 667 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" 668 | dependencies: 669 | ansi-styles "^2.2.1" 670 | escape-string-regexp "^1.0.2" 671 | has-ansi "^2.0.0" 672 | strip-ansi "^3.0.0" 673 | supports-color "^2.0.0" 674 | 675 | chokidar@^1.0.0: 676 | version "1.6.1" 677 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.6.1.tgz#2f4447ab5e96e50fb3d789fd90d4c72e0e4c70c2" 678 | dependencies: 679 | anymatch "^1.3.0" 680 | async-each "^1.0.0" 681 | glob-parent "^2.0.0" 682 | inherits "^2.0.1" 683 | is-binary-path "^1.0.0" 684 | is-glob "^2.0.0" 685 | path-is-absolute "^1.0.0" 686 | readdirp "^2.0.0" 687 | optionalDependencies: 688 | fsevents "^1.0.0" 689 | 690 | circular-json@^0.3.0: 691 | version "0.3.1" 692 | resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.1.tgz#be8b36aefccde8b3ca7aa2d6afc07a37242c0d2d" 693 | 694 | cli-cursor@^1.0.1: 695 | version "1.0.2" 696 | resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987" 697 | dependencies: 698 | restore-cursor "^1.0.1" 699 | 700 | cli-width@^2.0.0: 701 | version "2.1.0" 702 | resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.1.0.tgz#b234ca209b29ef66fc518d9b98d5847b00edf00a" 703 | 704 | co@^4.6.0: 705 | version "4.6.0" 706 | resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" 707 | 708 | code-point-at@^1.0.0: 709 | version "1.0.1" 710 | resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.0.1.tgz#1104cd34f9b5b45d3eba88f1babc1924e1ce35fb" 711 | dependencies: 712 | number-is-nan "^1.0.0" 713 | 714 | combined-stream@^1.0.5, combined-stream@~1.0.5: 715 | version "1.0.5" 716 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" 717 | dependencies: 718 | delayed-stream "~1.0.0" 719 | 720 | combined-stream@~0.0.4: 721 | version "0.0.7" 722 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-0.0.7.tgz#0137e657baa5a7541c57ac37ac5fc07d73b4dc1f" 723 | dependencies: 724 | delayed-stream "0.0.5" 725 | 726 | commander@^2.8.1, commander@^2.9.0: 727 | version "2.9.0" 728 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" 729 | dependencies: 730 | graceful-readlink ">= 1.0.0" 731 | 732 | commander@~2.1.0: 733 | version "2.1.0" 734 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.1.0.tgz#d121bbae860d9992a3d517ba96f56588e47c6781" 735 | 736 | concat-map@0.0.1: 737 | version "0.0.1" 738 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 739 | 740 | concat-stream@^1.4.6: 741 | version "1.5.2" 742 | resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.5.2.tgz#708978624d856af41a5a741defdd261da752c266" 743 | dependencies: 744 | inherits "~2.0.1" 745 | readable-stream "~2.0.0" 746 | typedarray "~0.0.5" 747 | 748 | console-control-strings@^1.0.0, console-control-strings@~1.1.0: 749 | version "1.1.0" 750 | resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" 751 | 752 | contains-path@^0.1.0: 753 | version "0.1.0" 754 | resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" 755 | 756 | convert-source-map@^1.1.0: 757 | version "1.3.0" 758 | resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.3.0.tgz#e9f3e9c6e2728efc2676696a70eb382f73106a67" 759 | 760 | core-js@^2.4.0: 761 | version "2.4.1" 762 | resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e" 763 | 764 | core-util-is@~1.0.0: 765 | version "1.0.2" 766 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 767 | 768 | cryptiles@2.x.x: 769 | version "2.0.5" 770 | resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" 771 | dependencies: 772 | boom "2.x.x" 773 | 774 | curve-thrift@^0.2.0: 775 | version "0.2.0" 776 | resolved "https://registry.yarnpkg.com/curve-thrift/-/curve-thrift-0.2.0.tgz#49cb9632856c50cd72d385028b7d9670db4ae849" 777 | 778 | d@^0.1.1, d@~0.1.1: 779 | version "0.1.1" 780 | resolved "https://registry.yarnpkg.com/d/-/d-0.1.1.tgz#da184c535d18d8ee7ba2aa229b914009fae11309" 781 | dependencies: 782 | es5-ext "~0.10.2" 783 | 784 | damerau-levenshtein@^1.0.0: 785 | version "1.0.3" 786 | resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.3.tgz#ae4f4ce0b62acae10ff63a01bb08f652f5213af2" 787 | 788 | dashdash@^1.12.0: 789 | version "1.14.0" 790 | resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.0.tgz#29e486c5418bf0f356034a993d51686a33e84141" 791 | dependencies: 792 | assert-plus "^1.0.0" 793 | 794 | debug@^2.1.1, debug@^2.2.0, debug@~2.2.0: 795 | version "2.2.0" 796 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" 797 | dependencies: 798 | ms "0.7.1" 799 | 800 | deep-extend@~0.4.0: 801 | version "0.4.1" 802 | resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.1.tgz#efe4113d08085f4e6f9687759810f807469e2253" 803 | 804 | deep-is@~0.1.3: 805 | version "0.1.3" 806 | resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" 807 | 808 | del@^2.0.2: 809 | version "2.2.2" 810 | resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" 811 | dependencies: 812 | globby "^5.0.0" 813 | is-path-cwd "^1.0.0" 814 | is-path-in-cwd "^1.0.0" 815 | object-assign "^4.0.1" 816 | pify "^2.0.0" 817 | pinkie-promise "^2.0.0" 818 | rimraf "^2.2.8" 819 | 820 | delayed-stream@~1.0.0: 821 | version "1.0.0" 822 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 823 | 824 | delayed-stream@0.0.5: 825 | version "0.0.5" 826 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-0.0.5.tgz#d4b1f43a93e8296dfe02694f4680bc37a313c73f" 827 | 828 | delegates@^1.0.0: 829 | version "1.0.0" 830 | resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" 831 | 832 | detect-indent@^4.0.0: 833 | version "4.0.0" 834 | resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" 835 | dependencies: 836 | repeating "^2.0.0" 837 | 838 | doctrine@^1.2.2: 839 | version "1.5.0" 840 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" 841 | dependencies: 842 | esutils "^2.0.2" 843 | isarray "^1.0.0" 844 | 845 | doctrine@1.3.x: 846 | version "1.3.0" 847 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.3.0.tgz#13e75682b55518424276f7c173783456ef913d26" 848 | dependencies: 849 | esutils "^2.0.2" 850 | isarray "^1.0.0" 851 | 852 | ecc-jsbn@~0.1.1: 853 | version "0.1.1" 854 | resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" 855 | dependencies: 856 | jsbn "~0.1.0" 857 | 858 | es5-ext@^0.10.7, es5-ext@^0.10.8, es5-ext@~0.10.11, es5-ext@~0.10.2, es5-ext@~0.10.7: 859 | version "0.10.12" 860 | resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.12.tgz#aa84641d4db76b62abba5e45fd805ecbab140047" 861 | dependencies: 862 | es6-iterator "2" 863 | es6-symbol "~3.1" 864 | 865 | es6-iterator@2: 866 | version "2.0.0" 867 | resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.0.tgz#bd968567d61635e33c0b80727613c9cb4b096bac" 868 | dependencies: 869 | d "^0.1.1" 870 | es5-ext "^0.10.7" 871 | es6-symbol "3" 872 | 873 | es6-map@^0.1.3: 874 | version "0.1.4" 875 | resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.4.tgz#a34b147be224773a4d7da8072794cefa3632b897" 876 | dependencies: 877 | d "~0.1.1" 878 | es5-ext "~0.10.11" 879 | es6-iterator "2" 880 | es6-set "~0.1.3" 881 | es6-symbol "~3.1.0" 882 | event-emitter "~0.3.4" 883 | 884 | es6-set@^0.1.4, es6-set@~0.1.3: 885 | version "0.1.4" 886 | resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.4.tgz#9516b6761c2964b92ff479456233a247dc707ce8" 887 | dependencies: 888 | d "~0.1.1" 889 | es5-ext "~0.10.11" 890 | es6-iterator "2" 891 | es6-symbol "3" 892 | event-emitter "~0.3.4" 893 | 894 | es6-symbol@~3.1, es6-symbol@~3.1.0, es6-symbol@3: 895 | version "3.1.0" 896 | resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.0.tgz#94481c655e7a7cad82eba832d97d5433496d7ffa" 897 | dependencies: 898 | d "~0.1.1" 899 | es5-ext "~0.10.11" 900 | 901 | es6-weak-map@^2.0.1: 902 | version "2.0.1" 903 | resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.1.tgz#0d2bbd8827eb5fb4ba8f97fbfea50d43db21ea81" 904 | dependencies: 905 | d "^0.1.1" 906 | es5-ext "^0.10.8" 907 | es6-iterator "2" 908 | es6-symbol "3" 909 | 910 | escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: 911 | version "1.0.5" 912 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 913 | 914 | escope@^3.6.0: 915 | version "3.6.0" 916 | resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3" 917 | dependencies: 918 | es6-map "^0.1.3" 919 | es6-weak-map "^2.0.1" 920 | esrecurse "^4.1.0" 921 | estraverse "^4.1.1" 922 | 923 | eslint-config-airbnb-base@^1.0.2: 924 | version "1.0.4" 925 | resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-1.0.4.tgz#bc5420890bc6442cf15277c9a4a281fc1317f8a6" 926 | 927 | eslint-config-airbnb@^8.0.0: 928 | version "8.0.0" 929 | resolved "https://registry.yarnpkg.com/eslint-config-airbnb/-/eslint-config-airbnb-8.0.0.tgz#2e539826262e6367525960d5a0d53d32b263af90" 930 | dependencies: 931 | eslint-config-airbnb-base "^1.0.2" 932 | 933 | eslint-import-resolver-node@^0.2.0: 934 | version "0.2.3" 935 | resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.2.3.tgz#5add8106e8c928db2cba232bcd9efa846e3da16c" 936 | dependencies: 937 | debug "^2.2.0" 938 | object-assign "^4.0.1" 939 | resolve "^1.1.6" 940 | 941 | eslint-plugin-import@^1.6.1: 942 | version "1.16.0" 943 | resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-1.16.0.tgz#b2fa07ebcc53504d0f2a4477582ec8bff1871b9f" 944 | dependencies: 945 | builtin-modules "^1.1.1" 946 | contains-path "^0.1.0" 947 | debug "^2.2.0" 948 | doctrine "1.3.x" 949 | es6-map "^0.1.3" 950 | es6-set "^0.1.4" 951 | eslint-import-resolver-node "^0.2.0" 952 | has "^1.0.1" 953 | lodash.cond "^4.3.0" 954 | lodash.endswith "^4.0.1" 955 | lodash.find "^4.3.0" 956 | lodash.findindex "^4.3.0" 957 | minimatch "^3.0.3" 958 | object-assign "^4.0.1" 959 | pkg-dir "^1.0.0" 960 | pkg-up "^1.0.0" 961 | 962 | eslint-plugin-jsx-a11y@^1.0.4: 963 | version "1.5.5" 964 | resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-1.5.5.tgz#da284a016c1889e73698180217e2eb988a98bab5" 965 | dependencies: 966 | damerau-levenshtein "^1.0.0" 967 | jsx-ast-utils "^1.0.0" 968 | object-assign "^4.0.1" 969 | 970 | eslint-plugin-react@^5.0.1: 971 | version "5.2.2" 972 | resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-5.2.2.tgz#7db068e1f5487f6871e4deef36a381c303eac161" 973 | dependencies: 974 | doctrine "^1.2.2" 975 | jsx-ast-utils "^1.2.1" 976 | 977 | eslint@^2.8.0: 978 | version "2.13.1" 979 | resolved "https://registry.yarnpkg.com/eslint/-/eslint-2.13.1.tgz#e4cc8fa0f009fb829aaae23855a29360be1f6c11" 980 | dependencies: 981 | chalk "^1.1.3" 982 | concat-stream "^1.4.6" 983 | debug "^2.1.1" 984 | doctrine "^1.2.2" 985 | es6-map "^0.1.3" 986 | escope "^3.6.0" 987 | espree "^3.1.6" 988 | estraverse "^4.2.0" 989 | esutils "^2.0.2" 990 | file-entry-cache "^1.1.1" 991 | glob "^7.0.3" 992 | globals "^9.2.0" 993 | ignore "^3.1.2" 994 | imurmurhash "^0.1.4" 995 | inquirer "^0.12.0" 996 | is-my-json-valid "^2.10.0" 997 | is-resolvable "^1.0.0" 998 | js-yaml "^3.5.1" 999 | json-stable-stringify "^1.0.0" 1000 | levn "^0.3.0" 1001 | lodash "^4.0.0" 1002 | mkdirp "^0.5.0" 1003 | optionator "^0.8.1" 1004 | path-is-absolute "^1.0.0" 1005 | path-is-inside "^1.0.1" 1006 | pluralize "^1.2.1" 1007 | progress "^1.1.8" 1008 | require-uncached "^1.0.2" 1009 | shelljs "^0.6.0" 1010 | strip-json-comments "~1.0.1" 1011 | table "^3.7.8" 1012 | text-table "~0.2.0" 1013 | user-home "^2.0.0" 1014 | 1015 | espree@^3.1.6: 1016 | version "3.3.2" 1017 | resolved "https://registry.yarnpkg.com/espree/-/espree-3.3.2.tgz#dbf3fadeb4ecb4d4778303e50103b3d36c88b89c" 1018 | dependencies: 1019 | acorn "^4.0.1" 1020 | acorn-jsx "^3.0.0" 1021 | 1022 | esprima@^2.6.0: 1023 | version "2.7.3" 1024 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" 1025 | 1026 | esrecurse@^4.1.0: 1027 | version "4.1.0" 1028 | resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.1.0.tgz#4713b6536adf7f2ac4f327d559e7756bff648220" 1029 | dependencies: 1030 | estraverse "~4.1.0" 1031 | object-assign "^4.0.1" 1032 | 1033 | estraverse@^4.1.1, estraverse@^4.2.0: 1034 | version "4.2.0" 1035 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" 1036 | 1037 | estraverse@~4.1.0: 1038 | version "4.1.1" 1039 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.1.1.tgz#f6caca728933a850ef90661d0e17982ba47111a2" 1040 | 1041 | esutils@^2.0.2: 1042 | version "2.0.2" 1043 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" 1044 | 1045 | event-emitter@~0.3.4: 1046 | version "0.3.4" 1047 | resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.4.tgz#8d63ddfb4cfe1fae3b32ca265c4c720222080bb5" 1048 | dependencies: 1049 | d "~0.1.1" 1050 | es5-ext "~0.10.7" 1051 | 1052 | exit-hook@^1.0.0: 1053 | version "1.1.1" 1054 | resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8" 1055 | 1056 | expand-brackets@^0.1.4: 1057 | version "0.1.5" 1058 | resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" 1059 | dependencies: 1060 | is-posix-bracket "^0.1.0" 1061 | 1062 | expand-range@^1.8.1: 1063 | version "1.8.2" 1064 | resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" 1065 | dependencies: 1066 | fill-range "^2.1.0" 1067 | 1068 | extend@~3.0.0: 1069 | version "3.0.0" 1070 | resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.0.tgz#5a474353b9f3353ddd8176dfd37b91c83a46f1d4" 1071 | 1072 | extglob@^0.3.1: 1073 | version "0.3.2" 1074 | resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" 1075 | dependencies: 1076 | is-extglob "^1.0.0" 1077 | 1078 | extsprintf@1.0.2: 1079 | version "1.0.2" 1080 | resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550" 1081 | 1082 | fast-levenshtein@~2.0.4: 1083 | version "2.0.5" 1084 | resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.5.tgz#bd33145744519ab1c36c3ee9f31f08e9079b67f2" 1085 | 1086 | figures@^1.3.5: 1087 | version "1.7.0" 1088 | resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" 1089 | dependencies: 1090 | escape-string-regexp "^1.0.5" 1091 | object-assign "^4.1.0" 1092 | 1093 | file-entry-cache@^1.1.1: 1094 | version "1.3.1" 1095 | resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-1.3.1.tgz#44c61ea607ae4be9c1402f41f44270cbfe334ff8" 1096 | dependencies: 1097 | flat-cache "^1.2.1" 1098 | object-assign "^4.0.1" 1099 | 1100 | filename-regex@^2.0.0: 1101 | version "2.0.0" 1102 | resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.0.tgz#996e3e80479b98b9897f15a8a58b3d084e926775" 1103 | 1104 | fill-range@^2.1.0: 1105 | version "2.2.3" 1106 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" 1107 | dependencies: 1108 | is-number "^2.1.0" 1109 | isobject "^2.0.0" 1110 | randomatic "^1.1.3" 1111 | repeat-element "^1.1.2" 1112 | repeat-string "^1.5.2" 1113 | 1114 | find-up@^1.0.0: 1115 | version "1.1.2" 1116 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" 1117 | dependencies: 1118 | path-exists "^2.0.0" 1119 | pinkie-promise "^2.0.0" 1120 | 1121 | flat-cache@^1.2.1: 1122 | version "1.2.1" 1123 | resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.2.1.tgz#6c837d6225a7de5659323740b36d5361f71691ff" 1124 | dependencies: 1125 | circular-json "^0.3.0" 1126 | del "^2.0.2" 1127 | graceful-fs "^4.1.2" 1128 | write "^0.2.1" 1129 | 1130 | for-in@^0.1.5: 1131 | version "0.1.6" 1132 | resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.6.tgz#c9f96e89bfad18a545af5ec3ed352a1d9e5b4dc8" 1133 | 1134 | for-own@^0.1.4: 1135 | version "0.1.4" 1136 | resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.4.tgz#0149b41a39088c7515f51ebe1c1386d45f935072" 1137 | dependencies: 1138 | for-in "^0.1.5" 1139 | 1140 | forever-agent@~0.6.1: 1141 | version "0.6.1" 1142 | resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" 1143 | 1144 | form-data@^0.2.0: 1145 | version "0.2.0" 1146 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-0.2.0.tgz#26f8bc26da6440e299cbdcfb69035c4f77a6e466" 1147 | dependencies: 1148 | async "~0.9.0" 1149 | combined-stream "~0.0.4" 1150 | mime-types "~2.0.3" 1151 | 1152 | form-data@~1.0.0-rc4: 1153 | version "1.0.1" 1154 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-1.0.1.tgz#ae315db9a4907fa065502304a66d7733475ee37c" 1155 | dependencies: 1156 | async "^2.0.1" 1157 | combined-stream "^1.0.5" 1158 | mime-types "^2.1.11" 1159 | 1160 | form-data@~2.1.1: 1161 | version "2.1.1" 1162 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.1.tgz#4adf0342e1a79afa1e84c8c320a9ffc82392a1f3" 1163 | dependencies: 1164 | asynckit "^0.4.0" 1165 | combined-stream "^1.0.5" 1166 | mime-types "^2.1.12" 1167 | 1168 | fs-readdir-recursive@^1.0.0: 1169 | version "1.0.0" 1170 | resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.0.0.tgz#8cd1745c8b4f8a29c8caec392476921ba195f560" 1171 | 1172 | fs.realpath@^1.0.0: 1173 | version "1.0.0" 1174 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 1175 | 1176 | fsevents@^1.0.0: 1177 | version "1.0.14" 1178 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.0.14.tgz#558e8cc38643d8ef40fe45158486d0d25758eee4" 1179 | dependencies: 1180 | nan "^2.3.0" 1181 | node-pre-gyp "^0.6.29" 1182 | 1183 | fstream-ignore@~1.0.5: 1184 | version "1.0.5" 1185 | resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" 1186 | dependencies: 1187 | fstream "^1.0.0" 1188 | inherits "2" 1189 | minimatch "^3.0.0" 1190 | 1191 | fstream@^1.0.0, fstream@^1.0.2, fstream@~1.0.10: 1192 | version "1.0.10" 1193 | resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.10.tgz#604e8a92fe26ffd9f6fae30399d4984e1ab22822" 1194 | dependencies: 1195 | graceful-fs "^4.1.2" 1196 | inherits "~2.0.0" 1197 | mkdirp ">=0.5 0" 1198 | rimraf "2" 1199 | 1200 | function-bind@^1.0.2: 1201 | version "1.1.0" 1202 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.0.tgz#16176714c801798e4e8f2cf7f7529467bb4a5771" 1203 | 1204 | gauge@~2.6.0: 1205 | version "2.6.0" 1206 | resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.6.0.tgz#d35301ad18e96902b4751dcbbe40f4218b942a46" 1207 | dependencies: 1208 | aproba "^1.0.3" 1209 | console-control-strings "^1.0.0" 1210 | has-color "^0.1.7" 1211 | has-unicode "^2.0.0" 1212 | object-assign "^4.1.0" 1213 | signal-exit "^3.0.0" 1214 | string-width "^1.0.1" 1215 | strip-ansi "^3.0.1" 1216 | wide-align "^1.1.0" 1217 | 1218 | generate-function@^2.0.0: 1219 | version "2.0.0" 1220 | resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74" 1221 | 1222 | generate-object-property@^1.1.0: 1223 | version "1.2.0" 1224 | resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0" 1225 | dependencies: 1226 | is-property "^1.0.0" 1227 | 1228 | getpass@^0.1.1: 1229 | version "0.1.6" 1230 | resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.6.tgz#283ffd9fc1256840875311c1b60e8c40187110e6" 1231 | dependencies: 1232 | assert-plus "^1.0.0" 1233 | 1234 | glob-base@^0.3.0: 1235 | version "0.3.0" 1236 | resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" 1237 | dependencies: 1238 | glob-parent "^2.0.0" 1239 | is-glob "^2.0.0" 1240 | 1241 | glob-parent@^2.0.0: 1242 | version "2.0.0" 1243 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" 1244 | dependencies: 1245 | is-glob "^2.0.0" 1246 | 1247 | glob@^5.0.5: 1248 | version "5.0.15" 1249 | resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" 1250 | dependencies: 1251 | inflight "^1.0.4" 1252 | inherits "2" 1253 | minimatch "2 || 3" 1254 | once "^1.3.0" 1255 | path-is-absolute "^1.0.0" 1256 | 1257 | glob@^7.0.3, glob@^7.0.5: 1258 | version "7.1.1" 1259 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" 1260 | dependencies: 1261 | fs.realpath "^1.0.0" 1262 | inflight "^1.0.4" 1263 | inherits "2" 1264 | minimatch "^3.0.2" 1265 | once "^1.3.0" 1266 | path-is-absolute "^1.0.0" 1267 | 1268 | globals@^9.0.0, globals@^9.2.0: 1269 | version "9.12.0" 1270 | resolved "https://registry.yarnpkg.com/globals/-/globals-9.12.0.tgz#992ce90828c3a55fa8f16fada177adb64664cf9d" 1271 | 1272 | globby@^5.0.0: 1273 | version "5.0.0" 1274 | resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" 1275 | dependencies: 1276 | array-union "^1.0.1" 1277 | arrify "^1.0.0" 1278 | glob "^7.0.3" 1279 | object-assign "^4.0.1" 1280 | pify "^2.0.0" 1281 | pinkie-promise "^2.0.0" 1282 | 1283 | graceful-fs@^4.1.2, graceful-fs@^4.1.4: 1284 | version "4.1.9" 1285 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.9.tgz#baacba37d19d11f9d146d3578bc99958c3787e29" 1286 | 1287 | "graceful-readlink@>= 1.0.0": 1288 | version "1.0.1" 1289 | resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" 1290 | 1291 | har-validator@~2.0.6: 1292 | version "2.0.6" 1293 | resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-2.0.6.tgz#cdcbc08188265ad119b6a5a7c8ab70eecfb5d27d" 1294 | dependencies: 1295 | chalk "^1.1.1" 1296 | commander "^2.9.0" 1297 | is-my-json-valid "^2.12.4" 1298 | pinkie-promise "^2.0.0" 1299 | 1300 | has-ansi@^2.0.0: 1301 | version "2.0.0" 1302 | resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" 1303 | dependencies: 1304 | ansi-regex "^2.0.0" 1305 | 1306 | has-color@^0.1.7: 1307 | version "0.1.7" 1308 | resolved "https://registry.yarnpkg.com/has-color/-/has-color-0.1.7.tgz#67144a5260c34fc3cca677d041daf52fe7b78b2f" 1309 | 1310 | has-unicode@^2.0.0: 1311 | version "2.0.1" 1312 | resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" 1313 | 1314 | has@^1.0.1: 1315 | version "1.0.1" 1316 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28" 1317 | dependencies: 1318 | function-bind "^1.0.2" 1319 | 1320 | hawk@~3.1.3: 1321 | version "3.1.3" 1322 | resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" 1323 | dependencies: 1324 | boom "2.x.x" 1325 | cryptiles "2.x.x" 1326 | hoek "2.x.x" 1327 | sntp "1.x.x" 1328 | 1329 | hoek@2.x.x: 1330 | version "2.16.3" 1331 | resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" 1332 | 1333 | home-or-tmp@^2.0.0: 1334 | version "2.0.0" 1335 | resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" 1336 | dependencies: 1337 | os-homedir "^1.0.0" 1338 | os-tmpdir "^1.0.1" 1339 | 1340 | http-signature@~1.1.0: 1341 | version "1.1.1" 1342 | resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" 1343 | dependencies: 1344 | assert-plus "^0.2.0" 1345 | jsprim "^1.2.2" 1346 | sshpk "^1.7.0" 1347 | 1348 | ignore@^3.1.2: 1349 | version "3.2.0" 1350 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.2.0.tgz#8d88f03c3002a0ac52114db25d2c673b0bf1e435" 1351 | 1352 | imurmurhash@^0.1.4: 1353 | version "0.1.4" 1354 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 1355 | 1356 | inflight@^1.0.4: 1357 | version "1.0.6" 1358 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 1359 | dependencies: 1360 | once "^1.3.0" 1361 | wrappy "1" 1362 | 1363 | inherits@^2.0.1, inherits@~2.0.0, inherits@~2.0.1, inherits@2: 1364 | version "2.0.3" 1365 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 1366 | 1367 | ini@~1.3.0: 1368 | version "1.3.4" 1369 | resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" 1370 | 1371 | inquirer@^0.12.0: 1372 | version "0.12.0" 1373 | resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-0.12.0.tgz#1ef2bfd63504df0bc75785fff8c2c41df12f077e" 1374 | dependencies: 1375 | ansi-escapes "^1.1.0" 1376 | ansi-regex "^2.0.0" 1377 | chalk "^1.0.0" 1378 | cli-cursor "^1.0.1" 1379 | cli-width "^2.0.0" 1380 | figures "^1.3.5" 1381 | lodash "^4.3.0" 1382 | readline2 "^1.0.1" 1383 | run-async "^0.1.0" 1384 | rx-lite "^3.1.2" 1385 | string-width "^1.0.1" 1386 | strip-ansi "^3.0.0" 1387 | through "^2.3.6" 1388 | 1389 | invariant@^2.2.0: 1390 | version "2.2.1" 1391 | resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.1.tgz#b097010547668c7e337028ebe816ebe36c8a8d54" 1392 | dependencies: 1393 | loose-envify "^1.0.0" 1394 | 1395 | is-binary-path@^1.0.0: 1396 | version "1.0.1" 1397 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" 1398 | dependencies: 1399 | binary-extensions "^1.0.0" 1400 | 1401 | is-buffer@^1.0.2: 1402 | version "1.1.4" 1403 | resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.4.tgz#cfc86ccd5dc5a52fa80489111c6920c457e2d98b" 1404 | 1405 | is-dotfile@^1.0.0: 1406 | version "1.0.2" 1407 | resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.2.tgz#2c132383f39199f8edc268ca01b9b007d205cc4d" 1408 | 1409 | is-equal-shallow@^0.1.3: 1410 | version "0.1.3" 1411 | resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" 1412 | dependencies: 1413 | is-primitive "^2.0.0" 1414 | 1415 | is-extendable@^0.1.1: 1416 | version "0.1.1" 1417 | resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" 1418 | 1419 | is-extglob@^1.0.0: 1420 | version "1.0.0" 1421 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" 1422 | 1423 | is-finite@^1.0.0: 1424 | version "1.0.2" 1425 | resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" 1426 | dependencies: 1427 | number-is-nan "^1.0.0" 1428 | 1429 | is-fullwidth-code-point@^1.0.0: 1430 | version "1.0.0" 1431 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" 1432 | dependencies: 1433 | number-is-nan "^1.0.0" 1434 | 1435 | is-fullwidth-code-point@^2.0.0: 1436 | version "2.0.0" 1437 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 1438 | 1439 | is-glob@^2.0.0, is-glob@^2.0.1: 1440 | version "2.0.1" 1441 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" 1442 | dependencies: 1443 | is-extglob "^1.0.0" 1444 | 1445 | is-my-json-valid@^2.10.0, is-my-json-valid@^2.12.4: 1446 | version "2.15.0" 1447 | resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.15.0.tgz#936edda3ca3c211fd98f3b2d3e08da43f7b2915b" 1448 | dependencies: 1449 | generate-function "^2.0.0" 1450 | generate-object-property "^1.1.0" 1451 | jsonpointer "^4.0.0" 1452 | xtend "^4.0.0" 1453 | 1454 | is-number@^2.0.2, is-number@^2.1.0: 1455 | version "2.1.0" 1456 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" 1457 | dependencies: 1458 | kind-of "^3.0.2" 1459 | 1460 | is-path-cwd@^1.0.0: 1461 | version "1.0.0" 1462 | resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" 1463 | 1464 | is-path-in-cwd@^1.0.0: 1465 | version "1.0.0" 1466 | resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003be8a9eac04dc" 1467 | dependencies: 1468 | is-path-inside "^1.0.0" 1469 | 1470 | is-path-inside@^1.0.0: 1471 | version "1.0.0" 1472 | resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.0.tgz#fc06e5a1683fbda13de667aff717bbc10a48f37f" 1473 | dependencies: 1474 | path-is-inside "^1.0.1" 1475 | 1476 | is-posix-bracket@^0.1.0: 1477 | version "0.1.1" 1478 | resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" 1479 | 1480 | is-primitive@^2.0.0: 1481 | version "2.0.0" 1482 | resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" 1483 | 1484 | is-property@^1.0.0: 1485 | version "1.0.2" 1486 | resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" 1487 | 1488 | is-resolvable@^1.0.0: 1489 | version "1.0.0" 1490 | resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.0.0.tgz#8df57c61ea2e3c501408d100fb013cf8d6e0cc62" 1491 | dependencies: 1492 | tryit "^1.0.1" 1493 | 1494 | is-typedarray@~1.0.0: 1495 | version "1.0.0" 1496 | resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" 1497 | 1498 | isarray@^1.0.0, isarray@~1.0.0, isarray@1.0.0: 1499 | version "1.0.0" 1500 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 1501 | 1502 | isobject@^2.0.0: 1503 | version "2.1.0" 1504 | resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" 1505 | dependencies: 1506 | isarray "1.0.0" 1507 | 1508 | isstream@~0.1.2: 1509 | version "0.1.2" 1510 | resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" 1511 | 1512 | jodid25519@^1.0.0: 1513 | version "1.0.2" 1514 | resolved "https://registry.yarnpkg.com/jodid25519/-/jodid25519-1.0.2.tgz#06d4912255093419477d425633606e0e90782967" 1515 | dependencies: 1516 | jsbn "~0.1.0" 1517 | 1518 | js-tokens@^2.0.0: 1519 | version "2.0.0" 1520 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-2.0.0.tgz#79903f5563ee778cc1162e6dcf1a0027c97f9cb5" 1521 | 1522 | js-yaml@^3.5.1: 1523 | version "3.6.1" 1524 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.6.1.tgz#6e5fe67d8b205ce4d22fad05b7781e8dadcc4b30" 1525 | dependencies: 1526 | argparse "^1.0.7" 1527 | esprima "^2.6.0" 1528 | 1529 | jsbn@~0.1.0: 1530 | version "0.1.0" 1531 | resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.0.tgz#650987da0dd74f4ebf5a11377a2aa2d273e97dfd" 1532 | 1533 | jsesc@^1.3.0: 1534 | version "1.3.0" 1535 | resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" 1536 | 1537 | jsesc@~0.5.0: 1538 | version "0.5.0" 1539 | resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" 1540 | 1541 | json-schema@0.2.3: 1542 | version "0.2.3" 1543 | resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" 1544 | 1545 | json-stable-stringify@^1.0.0, json-stable-stringify@^1.0.1: 1546 | version "1.0.1" 1547 | resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" 1548 | dependencies: 1549 | jsonify "~0.0.0" 1550 | 1551 | json-stringify-safe@~5.0.1: 1552 | version "5.0.1" 1553 | resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" 1554 | 1555 | json5@^0.5.0: 1556 | version "0.5.0" 1557 | resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.0.tgz#9b20715b026cbe3778fd769edccd822d8332a5b2" 1558 | 1559 | jsonify@~0.0.0: 1560 | version "0.0.0" 1561 | resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" 1562 | 1563 | jsonpointer@^4.0.0: 1564 | version "4.0.0" 1565 | resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.0.tgz#6661e161d2fc445f19f98430231343722e1fcbd5" 1566 | 1567 | jsprim@^1.2.2: 1568 | version "1.3.1" 1569 | resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.3.1.tgz#2a7256f70412a29ee3670aaca625994c4dcff252" 1570 | dependencies: 1571 | extsprintf "1.0.2" 1572 | json-schema "0.2.3" 1573 | verror "1.3.6" 1574 | 1575 | jsx-ast-utils@^1.0.0, jsx-ast-utils@^1.2.1: 1576 | version "1.3.3" 1577 | resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-1.3.3.tgz#ccfdbe0320ba03f7a1fc4e67ceaf7e2cc0169721" 1578 | dependencies: 1579 | acorn-jsx "^3.0.1" 1580 | object-assign "^4.1.0" 1581 | 1582 | kind-of@^3.0.2: 1583 | version "3.0.4" 1584 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.0.4.tgz#7b8ecf18a4e17f8269d73b501c9f232c96887a74" 1585 | dependencies: 1586 | is-buffer "^1.0.2" 1587 | 1588 | levn@^0.3.0, levn@~0.3.0: 1589 | version "0.3.0" 1590 | resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" 1591 | dependencies: 1592 | prelude-ls "~1.1.2" 1593 | type-check "~0.3.2" 1594 | 1595 | lodash.assign@^4.0.0: 1596 | version "4.2.0" 1597 | resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" 1598 | 1599 | lodash.cond@^4.3.0: 1600 | version "4.5.2" 1601 | resolved "https://registry.yarnpkg.com/lodash.cond/-/lodash.cond-4.5.2.tgz#f471a1da486be60f6ab955d17115523dd1d255d5" 1602 | 1603 | lodash.endswith@^4.0.1: 1604 | version "4.2.1" 1605 | resolved "https://registry.yarnpkg.com/lodash.endswith/-/lodash.endswith-4.2.1.tgz#fed59ac1738ed3e236edd7064ec456448b37bc09" 1606 | 1607 | lodash.find@^4.3.0: 1608 | version "4.6.0" 1609 | resolved "https://registry.yarnpkg.com/lodash.find/-/lodash.find-4.6.0.tgz#cb0704d47ab71789ffa0de8b97dd926fb88b13b1" 1610 | 1611 | lodash.findindex@^4.3.0: 1612 | version "4.6.0" 1613 | resolved "https://registry.yarnpkg.com/lodash.findindex/-/lodash.findindex-4.6.0.tgz#a3245dee61fb9b6e0624b535125624bb69c11106" 1614 | 1615 | lodash.pickby@^4.0.0: 1616 | version "4.6.0" 1617 | resolved "https://registry.yarnpkg.com/lodash.pickby/-/lodash.pickby-4.6.0.tgz#7dea21d8c18d7703a27c704c15d3b84a67e33aff" 1618 | 1619 | lodash@^4.0.0, lodash@^4.14.0, lodash@^4.2.0, lodash@^4.3.0: 1620 | version "4.16.6" 1621 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.16.6.tgz#d22c9ac660288f3843e16ba7d2b5d06cca27d777" 1622 | 1623 | loose-envify@^1.0.0: 1624 | version "1.3.0" 1625 | resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.0.tgz#6b26248c42f6d4fa4b0d8542f78edfcde35642a8" 1626 | dependencies: 1627 | js-tokens "^2.0.0" 1628 | 1629 | micromatch@^2.1.5: 1630 | version "2.3.11" 1631 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" 1632 | dependencies: 1633 | arr-diff "^2.0.0" 1634 | array-unique "^0.2.1" 1635 | braces "^1.8.2" 1636 | expand-brackets "^0.1.4" 1637 | extglob "^0.3.1" 1638 | filename-regex "^2.0.0" 1639 | is-extglob "^1.0.0" 1640 | is-glob "^2.0.1" 1641 | kind-of "^3.0.2" 1642 | normalize-path "^2.0.1" 1643 | object.omit "^2.0.0" 1644 | parse-glob "^3.0.4" 1645 | regex-cache "^0.4.2" 1646 | 1647 | mime-db@~1.12.0: 1648 | version "1.12.0" 1649 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.12.0.tgz#3d0c63180f458eb10d325aaa37d7c58ae312e9d7" 1650 | 1651 | mime-db@~1.24.0: 1652 | version "1.24.0" 1653 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.24.0.tgz#e2d13f939f0016c6e4e9ad25a8652f126c467f0c" 1654 | 1655 | mime-types@^2.1.11, mime-types@^2.1.12, mime-types@~2.1.7: 1656 | version "2.1.12" 1657 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.12.tgz#152ba256777020dd4663f54c2e7bc26381e71729" 1658 | dependencies: 1659 | mime-db "~1.24.0" 1660 | 1661 | mime-types@~2.0.3: 1662 | version "2.0.14" 1663 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.0.14.tgz#310e159db23e077f8bb22b748dabfa4957140aa6" 1664 | dependencies: 1665 | mime-db "~1.12.0" 1666 | 1667 | mime@~1.3.4: 1668 | version "1.3.4" 1669 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53" 1670 | 1671 | minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, "minimatch@2 || 3": 1672 | version "3.0.3" 1673 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.3.tgz#2a4e4090b96b2db06a9d7df01055a62a77c9b774" 1674 | dependencies: 1675 | brace-expansion "^1.0.0" 1676 | 1677 | minimist@^1.2.0: 1678 | version "1.2.0" 1679 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" 1680 | 1681 | minimist@0.0.8: 1682 | version "0.0.8" 1683 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 1684 | 1685 | mkdirp@^0.5.0, mkdirp@^0.5.1, "mkdirp@>=0.5 0", mkdirp@~0.5.1: 1686 | version "0.5.1" 1687 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 1688 | dependencies: 1689 | minimist "0.0.8" 1690 | 1691 | moment@^2.12.0: 1692 | version "2.15.2" 1693 | resolved "https://registry.yarnpkg.com/moment/-/moment-2.15.2.tgz#1bfdedf6a6e345f322fe956d5df5bd08a8ce84dc" 1694 | 1695 | ms@0.7.1: 1696 | version "0.7.1" 1697 | resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" 1698 | 1699 | mute-stream@0.0.5: 1700 | version "0.0.5" 1701 | resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.5.tgz#8fbfabb0a98a253d3184331f9e8deb7372fac6c0" 1702 | 1703 | nan@^2.3.0: 1704 | version "2.4.0" 1705 | resolved "https://registry.yarnpkg.com/nan/-/nan-2.4.0.tgz#fb3c59d45fe4effe215f0b890f8adf6eb32d2232" 1706 | 1707 | nan@~1.0.0: 1708 | version "1.0.0" 1709 | resolved "https://registry.yarnpkg.com/nan/-/nan-1.0.0.tgz#ae24f8850818d662fcab5acf7f3b95bfaa2ccf38" 1710 | 1711 | node-bignumber@^1.2.1: 1712 | version v1.2.1 1713 | resolved "https://registry.yarnpkg.com/node-bignumber/-/node-bignumber-1.2.1.tgz#266c9553352838539f661c92e58631be97917ea5" 1714 | 1715 | node-int64@~0.3.0: 1716 | version "0.3.3" 1717 | resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.3.3.tgz#2d6e6b2ece5de8588b43d88d1bc41b26cd1fa84d" 1718 | 1719 | node-pre-gyp@^0.6.29: 1720 | version "0.6.31" 1721 | resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.31.tgz#d8a00ddaa301a940615dbcc8caad4024d58f6017" 1722 | dependencies: 1723 | mkdirp "~0.5.1" 1724 | nopt "~3.0.6" 1725 | npmlog "^4.0.0" 1726 | rc "~1.1.6" 1727 | request "^2.75.0" 1728 | rimraf "~2.5.4" 1729 | semver "~5.3.0" 1730 | tar "~2.2.1" 1731 | tar-pack "~3.3.0" 1732 | 1733 | node-uuid@~1.4.7: 1734 | version "1.4.7" 1735 | resolved "https://registry.yarnpkg.com/node-uuid/-/node-uuid-1.4.7.tgz#6da5a17668c4b3dd59623bda11cf7fa4c1f60a6f" 1736 | 1737 | nopt@~3.0.6: 1738 | version "3.0.6" 1739 | resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" 1740 | dependencies: 1741 | abbrev "1" 1742 | 1743 | normalize-path@^2.0.1: 1744 | version "2.0.1" 1745 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.0.1.tgz#47886ac1662760d4261b7d979d241709d3ce3f7a" 1746 | 1747 | npmlog@^4.0.0: 1748 | version "4.0.0" 1749 | resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.0.0.tgz#e094503961c70c1774eb76692080e8d578a9f88f" 1750 | dependencies: 1751 | are-we-there-yet "~1.1.2" 1752 | console-control-strings "~1.1.0" 1753 | gauge "~2.6.0" 1754 | set-blocking "~2.0.0" 1755 | 1756 | number-is-nan@^1.0.0: 1757 | version "1.0.1" 1758 | resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" 1759 | 1760 | oauth-sign@~0.8.1: 1761 | version "0.8.2" 1762 | resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" 1763 | 1764 | object-assign@^4.0.1, object-assign@^4.1.0: 1765 | version "4.1.0" 1766 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.0.tgz#7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0" 1767 | 1768 | object.omit@^2.0.0: 1769 | version "2.0.1" 1770 | resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" 1771 | dependencies: 1772 | for-own "^0.1.4" 1773 | is-extendable "^0.1.1" 1774 | 1775 | once@^1.3.0: 1776 | version "1.4.0" 1777 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1778 | dependencies: 1779 | wrappy "1" 1780 | 1781 | once@~1.3.3: 1782 | version "1.3.3" 1783 | resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20" 1784 | dependencies: 1785 | wrappy "1" 1786 | 1787 | onetime@^1.0.0: 1788 | version "1.1.0" 1789 | resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789" 1790 | 1791 | optionator@^0.8.1: 1792 | version "0.8.2" 1793 | resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" 1794 | dependencies: 1795 | deep-is "~0.1.3" 1796 | fast-levenshtein "~2.0.4" 1797 | levn "~0.3.0" 1798 | prelude-ls "~1.1.2" 1799 | type-check "~0.3.2" 1800 | wordwrap "~1.0.0" 1801 | 1802 | options@>=0.0.5: 1803 | version "0.0.6" 1804 | resolved "https://registry.yarnpkg.com/options/-/options-0.0.6.tgz#ec22d312806bb53e731773e7cdaefcf1c643128f" 1805 | 1806 | os-homedir@^1.0.0: 1807 | version "1.0.2" 1808 | resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" 1809 | 1810 | os-tmpdir@^1.0.1, os-tmpdir@~1.0.1: 1811 | version "1.0.2" 1812 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 1813 | 1814 | output-file-sync@^1.1.0: 1815 | version "1.1.2" 1816 | resolved "https://registry.yarnpkg.com/output-file-sync/-/output-file-sync-1.1.2.tgz#d0a33eefe61a205facb90092e826598d5245ce76" 1817 | dependencies: 1818 | graceful-fs "^4.1.4" 1819 | mkdirp "^0.5.1" 1820 | object-assign "^4.1.0" 1821 | 1822 | parse-glob@^3.0.4: 1823 | version "3.0.4" 1824 | resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" 1825 | dependencies: 1826 | glob-base "^0.3.0" 1827 | is-dotfile "^1.0.0" 1828 | is-extglob "^1.0.0" 1829 | is-glob "^2.0.0" 1830 | 1831 | path-exists@^2.0.0: 1832 | version "2.1.0" 1833 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" 1834 | dependencies: 1835 | pinkie-promise "^2.0.0" 1836 | 1837 | path-is-absolute@^1.0.0: 1838 | version "1.0.1" 1839 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1840 | 1841 | path-is-inside@^1.0.1: 1842 | version "1.0.2" 1843 | resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" 1844 | 1845 | pify@^2.0.0: 1846 | version "2.3.0" 1847 | resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" 1848 | 1849 | pinkie-promise@^2.0.0: 1850 | version "2.0.1" 1851 | resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" 1852 | dependencies: 1853 | pinkie "^2.0.0" 1854 | 1855 | pinkie@^2.0.0: 1856 | version "2.0.4" 1857 | resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" 1858 | 1859 | pkg-dir@^1.0.0: 1860 | version "1.0.0" 1861 | resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" 1862 | dependencies: 1863 | find-up "^1.0.0" 1864 | 1865 | pkg-up@^1.0.0: 1866 | version "1.0.0" 1867 | resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-1.0.0.tgz#3e08fb461525c4421624a33b9f7e6d0af5b05a26" 1868 | dependencies: 1869 | find-up "^1.0.0" 1870 | 1871 | pluralize@^1.2.1: 1872 | version "1.2.1" 1873 | resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-1.2.1.tgz#d1a21483fd22bb41e58a12fa3421823140897c45" 1874 | 1875 | prelude-ls@~1.1.2: 1876 | version "1.1.2" 1877 | resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" 1878 | 1879 | preserve@^0.2.0: 1880 | version "0.2.0" 1881 | resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" 1882 | 1883 | private@^0.1.6, private@~0.1.5: 1884 | version "0.1.6" 1885 | resolved "https://registry.yarnpkg.com/private/-/private-0.1.6.tgz#55c6a976d0f9bafb9924851350fe47b9b5fbb7c1" 1886 | 1887 | process-nextick-args@~1.0.6: 1888 | version "1.0.7" 1889 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" 1890 | 1891 | progress@^1.1.8: 1892 | version "1.1.8" 1893 | resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be" 1894 | 1895 | punycode@^1.4.1: 1896 | version "1.4.1" 1897 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" 1898 | 1899 | q@1.0.x: 1900 | version "1.0.1" 1901 | resolved "https://registry.yarnpkg.com/q/-/q-1.0.1.tgz#11872aeedee89268110b10a718448ffb10112a14" 1902 | 1903 | qs@~6.2.0: 1904 | version "6.2.1" 1905 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.2.1.tgz#ce03c5ff0935bc1d9d69a9f14cbd18e568d67625" 1906 | 1907 | qs@~6.3.0: 1908 | version "6.3.0" 1909 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.0.tgz#f403b264f23bc01228c74131b407f18d5ea5d442" 1910 | 1911 | randomatic@^1.1.3: 1912 | version "1.1.5" 1913 | resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.5.tgz#5e9ef5f2d573c67bd2b8124ae90b5156e457840b" 1914 | dependencies: 1915 | is-number "^2.0.2" 1916 | kind-of "^3.0.2" 1917 | 1918 | rc@~1.1.6: 1919 | version "1.1.6" 1920 | resolved "https://registry.yarnpkg.com/rc/-/rc-1.1.6.tgz#43651b76b6ae53b5c802f1151fa3fc3b059969c9" 1921 | dependencies: 1922 | deep-extend "~0.4.0" 1923 | ini "~1.3.0" 1924 | minimist "^1.2.0" 1925 | strip-json-comments "~1.0.4" 1926 | 1927 | "readable-stream@^2.0.0 || ^1.1.13", readable-stream@^2.0.2, readable-stream@~2.1.4: 1928 | version "2.1.5" 1929 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.1.5.tgz#66fa8b720e1438b364681f2ad1a63c618448c9d0" 1930 | dependencies: 1931 | buffer-shims "^1.0.0" 1932 | core-util-is "~1.0.0" 1933 | inherits "~2.0.1" 1934 | isarray "~1.0.0" 1935 | process-nextick-args "~1.0.6" 1936 | string_decoder "~0.10.x" 1937 | util-deprecate "~1.0.1" 1938 | 1939 | readable-stream@~2.0.0, readable-stream@~2.0.5: 1940 | version "2.0.6" 1941 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e" 1942 | dependencies: 1943 | core-util-is "~1.0.0" 1944 | inherits "~2.0.1" 1945 | isarray "~1.0.0" 1946 | process-nextick-args "~1.0.6" 1947 | string_decoder "~0.10.x" 1948 | util-deprecate "~1.0.1" 1949 | 1950 | readdirp@^2.0.0: 1951 | version "2.1.0" 1952 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" 1953 | dependencies: 1954 | graceful-fs "^4.1.2" 1955 | minimatch "^3.0.2" 1956 | readable-stream "^2.0.2" 1957 | set-immediate-shim "^1.0.1" 1958 | 1959 | readline2@^1.0.1: 1960 | version "1.0.1" 1961 | resolved "https://registry.yarnpkg.com/readline2/-/readline2-1.0.1.tgz#41059608ffc154757b715d9989d199ffbf372e35" 1962 | dependencies: 1963 | code-point-at "^1.0.0" 1964 | is-fullwidth-code-point "^1.0.0" 1965 | mute-stream "0.0.5" 1966 | 1967 | regenerate@^1.2.1: 1968 | version "1.3.1" 1969 | resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.1.tgz#0300203a5d2fdcf89116dce84275d011f5903f33" 1970 | 1971 | regenerator-runtime@^0.9.5: 1972 | version "0.9.5" 1973 | resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.9.5.tgz#403d6d40a4bdff9c330dd9392dcbb2d9a8bba1fc" 1974 | 1975 | regex-cache@^0.4.2: 1976 | version "0.4.3" 1977 | resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.3.tgz#9b1a6c35d4d0dfcef5711ae651e8e9d3d7114145" 1978 | dependencies: 1979 | is-equal-shallow "^0.1.3" 1980 | is-primitive "^2.0.0" 1981 | 1982 | regexpu-core@^2.0.0: 1983 | version "2.0.0" 1984 | resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" 1985 | dependencies: 1986 | regenerate "^1.2.1" 1987 | regjsgen "^0.2.0" 1988 | regjsparser "^0.1.4" 1989 | 1990 | regjsgen@^0.2.0: 1991 | version "0.2.0" 1992 | resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" 1993 | 1994 | regjsparser@^0.1.4: 1995 | version "0.1.5" 1996 | resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" 1997 | dependencies: 1998 | jsesc "~0.5.0" 1999 | 2000 | repeat-element@^1.1.2: 2001 | version "1.1.2" 2002 | resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" 2003 | 2004 | repeat-string@^1.5.2: 2005 | version "1.6.1" 2006 | resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" 2007 | 2008 | repeating@^2.0.0: 2009 | version "2.0.1" 2010 | resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" 2011 | dependencies: 2012 | is-finite "^1.0.0" 2013 | 2014 | request@^2.75.0: 2015 | version "2.76.0" 2016 | resolved "https://registry.yarnpkg.com/request/-/request-2.76.0.tgz#be44505afef70360a0436955106be3945d95560e" 2017 | dependencies: 2018 | aws-sign2 "~0.6.0" 2019 | aws4 "^1.2.1" 2020 | caseless "~0.11.0" 2021 | combined-stream "~1.0.5" 2022 | extend "~3.0.0" 2023 | forever-agent "~0.6.1" 2024 | form-data "~2.1.1" 2025 | har-validator "~2.0.6" 2026 | hawk "~3.1.3" 2027 | http-signature "~1.1.0" 2028 | is-typedarray "~1.0.0" 2029 | isstream "~0.1.2" 2030 | json-stringify-safe "~5.0.1" 2031 | mime-types "~2.1.7" 2032 | node-uuid "~1.4.7" 2033 | oauth-sign "~0.8.1" 2034 | qs "~6.3.0" 2035 | stringstream "~0.0.4" 2036 | tough-cookie "~2.3.0" 2037 | tunnel-agent "~0.4.1" 2038 | 2039 | request@~2.74.0: 2040 | version "2.74.0" 2041 | resolved "https://registry.yarnpkg.com/request/-/request-2.74.0.tgz#7693ca768bbb0ea5c8ce08c084a45efa05b892ab" 2042 | dependencies: 2043 | aws-sign2 "~0.6.0" 2044 | aws4 "^1.2.1" 2045 | bl "~1.1.2" 2046 | caseless "~0.11.0" 2047 | combined-stream "~1.0.5" 2048 | extend "~3.0.0" 2049 | forever-agent "~0.6.1" 2050 | form-data "~1.0.0-rc4" 2051 | har-validator "~2.0.6" 2052 | hawk "~3.1.3" 2053 | http-signature "~1.1.0" 2054 | is-typedarray "~1.0.0" 2055 | isstream "~0.1.2" 2056 | json-stringify-safe "~5.0.1" 2057 | mime-types "~2.1.7" 2058 | node-uuid "~1.4.7" 2059 | oauth-sign "~0.8.1" 2060 | qs "~6.2.0" 2061 | stringstream "~0.0.4" 2062 | tough-cookie "~2.3.0" 2063 | tunnel-agent "~0.4.1" 2064 | 2065 | require-uncached@^1.0.2: 2066 | version "1.0.2" 2067 | resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.2.tgz#67dad3b733089e77030124678a459589faf6a7ec" 2068 | dependencies: 2069 | caller-path "^0.1.0" 2070 | resolve-from "^1.0.0" 2071 | 2072 | resolve-from@^1.0.0: 2073 | version "1.0.1" 2074 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" 2075 | 2076 | resolve@^1.1.6: 2077 | version "1.1.7" 2078 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" 2079 | 2080 | restore-cursor@^1.0.1: 2081 | version "1.0.1" 2082 | resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541" 2083 | dependencies: 2084 | exit-hook "^1.0.0" 2085 | onetime "^1.0.0" 2086 | 2087 | rimraf@^2.2.8, rimraf@~2.5.1, rimraf@~2.5.4, rimraf@2: 2088 | version "2.5.4" 2089 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.5.4.tgz#96800093cbf1a0c86bd95b4625467535c29dfa04" 2090 | dependencies: 2091 | glob "^7.0.5" 2092 | 2093 | rsa-pem-from-mod-exp@^0.8.4: 2094 | version "0.8.4" 2095 | resolved "https://registry.yarnpkg.com/rsa-pem-from-mod-exp/-/rsa-pem-from-mod-exp-0.8.4.tgz#362a42c6d304056d493b3f12bceabb2c6576a6d4" 2096 | 2097 | run-async@^0.1.0: 2098 | version "0.1.0" 2099 | resolved "https://registry.yarnpkg.com/run-async/-/run-async-0.1.0.tgz#c8ad4a5e110661e402a7d21b530e009f25f8e389" 2100 | dependencies: 2101 | once "^1.3.0" 2102 | 2103 | rx-lite@^3.1.2: 2104 | version "3.1.2" 2105 | resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-3.1.2.tgz#19ce502ca572665f3b647b10939f97fd1615f102" 2106 | 2107 | semver@~5.3.0: 2108 | version "5.3.0" 2109 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" 2110 | 2111 | set-blocking@~2.0.0: 2112 | version "2.0.0" 2113 | resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" 2114 | 2115 | set-immediate-shim@^1.0.1: 2116 | version "1.0.1" 2117 | resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" 2118 | 2119 | shelljs@^0.6.0: 2120 | version "0.6.1" 2121 | resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.6.1.tgz#ec6211bed1920442088fe0f70b2837232ed2c8a8" 2122 | 2123 | signal-exit@^3.0.0: 2124 | version "3.0.1" 2125 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.1.tgz#5a4c884992b63a7acd9badb7894c3ee9cfccad81" 2126 | 2127 | slash@^1.0.0: 2128 | version "1.0.0" 2129 | resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" 2130 | 2131 | slice-ansi@0.0.4: 2132 | version "0.0.4" 2133 | resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" 2134 | 2135 | sntp@1.x.x: 2136 | version "1.0.9" 2137 | resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" 2138 | dependencies: 2139 | hoek "2.x.x" 2140 | 2141 | source-map-support@^0.4.2: 2142 | version "0.4.6" 2143 | resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.6.tgz#32552aa64b458392a85eab3b0b5ee61527167aeb" 2144 | dependencies: 2145 | source-map "^0.5.3" 2146 | 2147 | source-map@^0.5.0, source-map@^0.5.3: 2148 | version "0.5.6" 2149 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" 2150 | 2151 | sprintf-js@~1.0.2: 2152 | version "1.0.3" 2153 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 2154 | 2155 | sshpk@^1.7.0: 2156 | version "1.10.1" 2157 | resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.10.1.tgz#30e1a5d329244974a1af61511339d595af6638b0" 2158 | dependencies: 2159 | asn1 "~0.2.3" 2160 | assert-plus "^1.0.0" 2161 | dashdash "^1.12.0" 2162 | getpass "^0.1.1" 2163 | optionalDependencies: 2164 | bcrypt-pbkdf "^1.0.0" 2165 | ecc-jsbn "~0.1.1" 2166 | jodid25519 "^1.0.0" 2167 | jsbn "~0.1.0" 2168 | tweetnacl "~0.14.0" 2169 | 2170 | string_decoder@~0.10.x: 2171 | version "0.10.31" 2172 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" 2173 | 2174 | string-width@^1.0.1: 2175 | version "1.0.2" 2176 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" 2177 | dependencies: 2178 | code-point-at "^1.0.0" 2179 | is-fullwidth-code-point "^1.0.0" 2180 | strip-ansi "^3.0.0" 2181 | 2182 | string-width@^2.0.0: 2183 | version "2.0.0" 2184 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.0.0.tgz#635c5436cc72a6e0c387ceca278d4e2eec52687e" 2185 | dependencies: 2186 | is-fullwidth-code-point "^2.0.0" 2187 | strip-ansi "^3.0.0" 2188 | 2189 | stringstream@~0.0.4: 2190 | version "0.0.5" 2191 | resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" 2192 | 2193 | strip-ansi@^3.0.0, strip-ansi@^3.0.1: 2194 | version "3.0.1" 2195 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 2196 | dependencies: 2197 | ansi-regex "^2.0.0" 2198 | 2199 | strip-json-comments@~1.0.1, strip-json-comments@~1.0.4: 2200 | version "1.0.4" 2201 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-1.0.4.tgz#1e15fbcac97d3ee99bf2d73b4c656b082bbafb91" 2202 | 2203 | supports-color@^2.0.0: 2204 | version "2.0.0" 2205 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" 2206 | 2207 | table@^3.7.8: 2208 | version "3.8.3" 2209 | resolved "https://registry.yarnpkg.com/table/-/table-3.8.3.tgz#2bbc542f0fda9861a755d3947fefd8b3f513855f" 2210 | dependencies: 2211 | ajv "^4.7.0" 2212 | ajv-keywords "^1.0.0" 2213 | chalk "^1.1.1" 2214 | lodash "^4.0.0" 2215 | slice-ansi "0.0.4" 2216 | string-width "^2.0.0" 2217 | 2218 | tar-pack@~3.3.0: 2219 | version "3.3.0" 2220 | resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.3.0.tgz#30931816418f55afc4d21775afdd6720cee45dae" 2221 | dependencies: 2222 | debug "~2.2.0" 2223 | fstream "~1.0.10" 2224 | fstream-ignore "~1.0.5" 2225 | once "~1.3.3" 2226 | readable-stream "~2.1.4" 2227 | rimraf "~2.5.1" 2228 | tar "~2.2.1" 2229 | uid-number "~0.0.6" 2230 | 2231 | tar@~2.2.1: 2232 | version "2.2.1" 2233 | resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" 2234 | dependencies: 2235 | block-stream "*" 2236 | fstream "^1.0.2" 2237 | inherits "2" 2238 | 2239 | text-table@~0.2.0: 2240 | version "0.2.0" 2241 | resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" 2242 | 2243 | thrift@^0.9.3: 2244 | version "0.9.3" 2245 | resolved "https://registry.yarnpkg.com/thrift/-/thrift-0.9.3.tgz#99021336403d42e08b8efadb1c37a06d7998b2a6" 2246 | dependencies: 2247 | node-int64 "~0.3.0" 2248 | q "1.0.x" 2249 | ws "~0.4.32" 2250 | 2251 | through@^2.3.6, through@^2.3.8: 2252 | version "2.3.8" 2253 | resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" 2254 | 2255 | tinycolor@0.x: 2256 | version "0.0.1" 2257 | resolved "https://registry.yarnpkg.com/tinycolor/-/tinycolor-0.0.1.tgz#320b5a52d83abb5978d81a3e887d4aefb15a6164" 2258 | 2259 | tmp@0.0.28: 2260 | version "0.0.28" 2261 | resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.28.tgz#172735b7f614ea7af39664fa84cf0de4e515d120" 2262 | dependencies: 2263 | os-tmpdir "~1.0.1" 2264 | 2265 | to-fast-properties@^1.0.1: 2266 | version "1.0.2" 2267 | resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.2.tgz#f3f5c0c3ba7299a7ef99427e44633257ade43320" 2268 | 2269 | tough-cookie@~2.3.0: 2270 | version "2.3.2" 2271 | resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.2.tgz#f081f76e4c85720e6c37a5faced737150d84072a" 2272 | dependencies: 2273 | punycode "^1.4.1" 2274 | 2275 | tryit@^1.0.1: 2276 | version "1.0.3" 2277 | resolved "https://registry.yarnpkg.com/tryit/-/tryit-1.0.3.tgz#393be730a9446fd1ead6da59a014308f36c289cb" 2278 | 2279 | tunnel-agent@~0.4.1: 2280 | version "0.4.3" 2281 | resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb" 2282 | 2283 | tweetnacl@^0.14.3, tweetnacl@~0.14.0: 2284 | version "0.14.3" 2285 | resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.3.tgz#3da382f670f25ded78d7b3d1792119bca0b7132d" 2286 | 2287 | type-check@~0.3.2: 2288 | version "0.3.2" 2289 | resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" 2290 | dependencies: 2291 | prelude-ls "~1.1.2" 2292 | 2293 | typedarray@~0.0.5: 2294 | version "0.0.6" 2295 | resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" 2296 | 2297 | uid-number@~0.0.6: 2298 | version "0.0.6" 2299 | resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" 2300 | 2301 | unirest@^0.5.0: 2302 | version "0.5.1" 2303 | resolved "https://registry.yarnpkg.com/unirest/-/unirest-0.5.1.tgz#9df5766187280f245b4e9a75ce1fad313337d6ed" 2304 | dependencies: 2305 | form-data "^0.2.0" 2306 | mime "~1.3.4" 2307 | request "~2.74.0" 2308 | 2309 | user-home@^1.1.1: 2310 | version "1.1.1" 2311 | resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" 2312 | 2313 | user-home@^2.0.0: 2314 | version "2.0.0" 2315 | resolved "https://registry.yarnpkg.com/user-home/-/user-home-2.0.0.tgz#9c70bfd8169bc1dcbf48604e0f04b8b49cde9e9f" 2316 | dependencies: 2317 | os-homedir "^1.0.0" 2318 | 2319 | utf8@^2.1.1: 2320 | version "2.1.2" 2321 | resolved "https://registry.yarnpkg.com/utf8/-/utf8-2.1.2.tgz#1fa0d9270e9be850d9b05027f63519bf46457d96" 2322 | 2323 | util-deprecate@~1.0.1: 2324 | version "1.0.2" 2325 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 2326 | 2327 | v8flags@^2.0.10: 2328 | version "2.0.11" 2329 | resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.0.11.tgz#bca8f30f0d6d60612cc2c00641e6962d42ae6881" 2330 | dependencies: 2331 | user-home "^1.1.1" 2332 | 2333 | verror@1.3.6: 2334 | version "1.3.6" 2335 | resolved "https://registry.yarnpkg.com/verror/-/verror-1.3.6.tgz#cff5df12946d297d2baaefaa2689e25be01c005c" 2336 | dependencies: 2337 | extsprintf "1.0.2" 2338 | 2339 | wide-align@^1.1.0: 2340 | version "1.1.0" 2341 | resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.0.tgz#40edde802a71fea1f070da3e62dcda2e7add96ad" 2342 | dependencies: 2343 | string-width "^1.0.1" 2344 | 2345 | wordwrap@~1.0.0: 2346 | version "1.0.0" 2347 | resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" 2348 | 2349 | wrappy@1: 2350 | version "1.0.2" 2351 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 2352 | 2353 | write@^0.2.1: 2354 | version "0.2.1" 2355 | resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" 2356 | dependencies: 2357 | mkdirp "^0.5.1" 2358 | 2359 | ws@~0.4.32: 2360 | version "0.4.32" 2361 | resolved "https://registry.yarnpkg.com/ws/-/ws-0.4.32.tgz#787a6154414f3c99ed83c5772153b20feb0cec32" 2362 | dependencies: 2363 | commander "~2.1.0" 2364 | nan "~1.0.0" 2365 | options ">=0.0.5" 2366 | tinycolor "0.x" 2367 | 2368 | xtend@^4.0.0: 2369 | version "4.0.1" 2370 | resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" 2371 | 2372 | --------------------------------------------------------------------------------