├── .eslintignore ├── .eslintrc.js ├── .gitignore ├── README.md ├── image └── fb_hurts.png ├── package-lock.json ├── package.json ├── src ├── README.md ├── apply │ ├── README.md │ └── memoize.js ├── compose │ └── README.md ├── curry │ ├── README.md │ └── index.js ├── feature │ ├── README.md │ ├── firstClass.md │ └── pureFunction.js ├── highOrderFunction │ ├── README.md │ └── reduce.js ├── immutable │ ├── README.md │ └── index.js ├── index.js ├── introduction │ ├── README.md │ └── index.js ├── lambda │ └── README.md ├── recursion │ └── README.md └── utils.js ├── test └── pure.test.js └── yarn.lock /.eslintignore: -------------------------------------------------------------------------------- 1 | 2 | **/node_modules/** 3 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | "extends": "airbnb-base", 3 | "plugins": [ 4 | "import" 5 | ] 6 | }; -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .vscode/ 3 | .idea 4 | .DS_Store 5 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## 关于此 Repo 2 | > 总结 JS 中的函数式编程,边学习边记录 3 | 4 | 学习函数式编程是困难的,我决定通过 JS 先行入手,体会它的思想,并在 JS 中应用。 5 | 先做到 function programing in JavaScript,再有机会去接触函数式的编程语言。 6 | 7 | 代码在 src 下,会按文件夹分章节。[开始](https://github.com/sunyongjian/FP-Code/tree/master/src) 8 | 9 | 10 | #### PS 11 | 有问题请到 issue 提出,指出位置或者贴代码 -------------------------------------------------------------------------------- /image/fb_hurts.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sunyongjian/FP-Code/4a33e5cfea3b605a58c16b4067d7b57272e17b0a/image/fb_hurts.png -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "fp-code", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "acorn": { 8 | "version": "5.1.1", 9 | "resolved": "http://registry.npm.taobao.org/acorn/download/acorn-5.1.1.tgz", 10 | "integrity": "sha1-U/4WERH5EquZnuiHqQoLxSgi/XU=", 11 | "dev": true 12 | }, 13 | "acorn-jsx": { 14 | "version": "3.0.1", 15 | "resolved": "http://registry.npm.taobao.org/acorn-jsx/download/acorn-jsx-3.0.1.tgz", 16 | "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", 17 | "dev": true, 18 | "requires": { 19 | "acorn": "3.3.0" 20 | }, 21 | "dependencies": { 22 | "acorn": { 23 | "version": "3.3.0", 24 | "resolved": "http://registry.npm.taobao.org/acorn/download/acorn-3.3.0.tgz", 25 | "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", 26 | "dev": true 27 | } 28 | } 29 | }, 30 | "ajv": { 31 | "version": "5.2.2", 32 | "resolved": "http://registry.npm.taobao.org/ajv/download/ajv-5.2.2.tgz", 33 | "integrity": "sha1-R8aNaehvXZUxA7AHSpQw3GPaXjk=", 34 | "dev": true, 35 | "requires": { 36 | "co": "4.6.0", 37 | "fast-deep-equal": "1.0.0", 38 | "json-schema-traverse": "0.3.1", 39 | "json-stable-stringify": "1.0.1" 40 | } 41 | }, 42 | "ajv-keywords": { 43 | "version": "1.5.1", 44 | "resolved": "http://registry.npm.taobao.org/ajv-keywords/download/ajv-keywords-1.5.1.tgz", 45 | "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=", 46 | "dev": true 47 | }, 48 | "ansi-escapes": { 49 | "version": "2.0.0", 50 | "resolved": "http://registry.npm.taobao.org/ansi-escapes/download/ansi-escapes-2.0.0.tgz", 51 | "integrity": "sha1-W65SvkJIeN2Xg+iRDj/Cki6DyBs=", 52 | "dev": true 53 | }, 54 | "ansi-regex": { 55 | "version": "2.1.1", 56 | "resolved": "http://registry.npm.taobao.org/ansi-regex/download/ansi-regex-2.1.1.tgz", 57 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", 58 | "dev": true 59 | }, 60 | "ansi-styles": { 61 | "version": "2.2.1", 62 | "resolved": "http://registry.npm.taobao.org/ansi-styles/download/ansi-styles-2.2.1.tgz", 63 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", 64 | "dev": true 65 | }, 66 | "argparse": { 67 | "version": "1.0.9", 68 | "resolved": "http://registry.npm.taobao.org/argparse/download/argparse-1.0.9.tgz", 69 | "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", 70 | "dev": true, 71 | "requires": { 72 | "sprintf-js": "1.0.3" 73 | } 74 | }, 75 | "array-union": { 76 | "version": "1.0.2", 77 | "resolved": "http://registry.npm.taobao.org/array-union/download/array-union-1.0.2.tgz", 78 | "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", 79 | "dev": true, 80 | "requires": { 81 | "array-uniq": "1.0.3" 82 | } 83 | }, 84 | "array-uniq": { 85 | "version": "1.0.3", 86 | "resolved": "http://registry.npm.taobao.org/array-uniq/download/array-uniq-1.0.3.tgz", 87 | "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", 88 | "dev": true 89 | }, 90 | "arrify": { 91 | "version": "1.0.1", 92 | "resolved": "http://registry.npm.taobao.org/arrify/download/arrify-1.0.1.tgz", 93 | "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", 94 | "dev": true 95 | }, 96 | "babel-code-frame": { 97 | "version": "6.22.0", 98 | "resolved": "http://registry.npm.taobao.org/babel-code-frame/download/babel-code-frame-6.22.0.tgz", 99 | "integrity": "sha1-AnYgvuVnqIwyVhV05/0IAdMxGOQ=", 100 | "dev": true, 101 | "requires": { 102 | "chalk": "1.1.3", 103 | "esutils": "2.0.2", 104 | "js-tokens": "3.0.2" 105 | } 106 | }, 107 | "balanced-match": { 108 | "version": "1.0.0", 109 | "resolved": "http://registry.npm.taobao.org/balanced-match/download/balanced-match-1.0.0.tgz", 110 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 111 | "dev": true 112 | }, 113 | "brace-expansion": { 114 | "version": "1.1.8", 115 | "resolved": "http://registry.npm.taobao.org/brace-expansion/download/brace-expansion-1.1.8.tgz", 116 | "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", 117 | "dev": true, 118 | "requires": { 119 | "balanced-match": "1.0.0", 120 | "concat-map": "0.0.1" 121 | } 122 | }, 123 | "builtin-modules": { 124 | "version": "1.1.1", 125 | "resolved": "http://registry.npm.taobao.org/builtin-modules/download/builtin-modules-1.1.1.tgz", 126 | "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", 127 | "dev": true 128 | }, 129 | "caller-path": { 130 | "version": "0.1.0", 131 | "resolved": "http://registry.npm.taobao.org/caller-path/download/caller-path-0.1.0.tgz", 132 | "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", 133 | "dev": true, 134 | "requires": { 135 | "callsites": "0.2.0" 136 | } 137 | }, 138 | "callsites": { 139 | "version": "0.2.0", 140 | "resolved": "http://registry.npm.taobao.org/callsites/download/callsites-0.2.0.tgz", 141 | "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", 142 | "dev": true 143 | }, 144 | "chalk": { 145 | "version": "1.1.3", 146 | "resolved": "http://registry.npm.taobao.org/chalk/download/chalk-1.1.3.tgz", 147 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", 148 | "dev": true, 149 | "requires": { 150 | "ansi-styles": "2.2.1", 151 | "escape-string-regexp": "1.0.5", 152 | "has-ansi": "2.0.0", 153 | "strip-ansi": "3.0.1", 154 | "supports-color": "2.0.0" 155 | } 156 | }, 157 | "circular-json": { 158 | "version": "0.3.3", 159 | "resolved": "http://registry.npm.taobao.org/circular-json/download/circular-json-0.3.3.tgz", 160 | "integrity": "sha1-gVyZ6oT2gJUp0vRXkb34JxE1LWY=", 161 | "dev": true 162 | }, 163 | "cli-cursor": { 164 | "version": "2.1.0", 165 | "resolved": "http://registry.npm.taobao.org/cli-cursor/download/cli-cursor-2.1.0.tgz", 166 | "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", 167 | "dev": true, 168 | "requires": { 169 | "restore-cursor": "2.0.0" 170 | } 171 | }, 172 | "cli-width": { 173 | "version": "2.1.0", 174 | "resolved": "http://registry.npm.taobao.org/cli-width/download/cli-width-2.1.0.tgz", 175 | "integrity": "sha1-sjTKIJsp72b8UY2bmNWEewDt8Ao=", 176 | "dev": true 177 | }, 178 | "co": { 179 | "version": "4.6.0", 180 | "resolved": "http://registry.npm.taobao.org/co/download/co-4.6.0.tgz", 181 | "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", 182 | "dev": true 183 | }, 184 | "color-convert": { 185 | "version": "1.9.0", 186 | "resolved": "http://registry.npm.taobao.org/color-convert/download/color-convert-1.9.0.tgz", 187 | "integrity": "sha1-Gsz5fdc5uYO/mU1W/sj5WFNkG3o=", 188 | "dev": true, 189 | "requires": { 190 | "color-name": "1.1.3" 191 | } 192 | }, 193 | "color-name": { 194 | "version": "1.1.3", 195 | "resolved": "http://registry.npm.taobao.org/color-name/download/color-name-1.1.3.tgz", 196 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 197 | "dev": true 198 | }, 199 | "concat-map": { 200 | "version": "0.0.1", 201 | "resolved": "http://registry.npm.taobao.org/concat-map/download/concat-map-0.0.1.tgz", 202 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 203 | "dev": true 204 | }, 205 | "concat-stream": { 206 | "version": "1.6.0", 207 | "resolved": "http://registry.npm.taobao.org/concat-stream/download/concat-stream-1.6.0.tgz", 208 | "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", 209 | "dev": true, 210 | "requires": { 211 | "inherits": "2.0.3", 212 | "readable-stream": "2.3.3", 213 | "typedarray": "0.0.6" 214 | } 215 | }, 216 | "contains-path": { 217 | "version": "0.1.0", 218 | "resolved": "http://registry.npm.taobao.org/contains-path/download/contains-path-0.1.0.tgz", 219 | "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", 220 | "dev": true 221 | }, 222 | "core-util-is": { 223 | "version": "1.0.2", 224 | "resolved": "http://registry.npm.taobao.org/core-util-is/download/core-util-is-1.0.2.tgz", 225 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", 226 | "dev": true 227 | }, 228 | "cross-spawn": { 229 | "version": "5.1.0", 230 | "resolved": "http://registry.npm.taobao.org/cross-spawn/download/cross-spawn-5.1.0.tgz", 231 | "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", 232 | "dev": true, 233 | "requires": { 234 | "lru-cache": "4.1.1", 235 | "shebang-command": "1.2.0", 236 | "which": "1.2.14" 237 | } 238 | }, 239 | "debug": { 240 | "version": "2.6.8", 241 | "resolved": "http://registry.npm.taobao.org/debug/download/debug-2.6.8.tgz", 242 | "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", 243 | "dev": true, 244 | "requires": { 245 | "ms": "2.0.0" 246 | } 247 | }, 248 | "deep-is": { 249 | "version": "0.1.3", 250 | "resolved": "http://registry.npm.taobao.org/deep-is/download/deep-is-0.1.3.tgz", 251 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", 252 | "dev": true 253 | }, 254 | "del": { 255 | "version": "2.2.2", 256 | "resolved": "http://registry.npm.taobao.org/del/download/del-2.2.2.tgz", 257 | "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", 258 | "dev": true, 259 | "requires": { 260 | "globby": "5.0.0", 261 | "is-path-cwd": "1.0.0", 262 | "is-path-in-cwd": "1.0.0", 263 | "object-assign": "4.1.1", 264 | "pify": "2.3.0", 265 | "pinkie-promise": "2.0.1", 266 | "rimraf": "2.6.1" 267 | } 268 | }, 269 | "doctrine": { 270 | "version": "2.0.0", 271 | "resolved": "http://registry.npm.taobao.org/doctrine/download/doctrine-2.0.0.tgz", 272 | "integrity": "sha1-xz2NKQnSIpHhoAejlYBNqLZl/mM=", 273 | "dev": true, 274 | "requires": { 275 | "esutils": "2.0.2", 276 | "isarray": "1.0.0" 277 | } 278 | }, 279 | "error-ex": { 280 | "version": "1.3.1", 281 | "resolved": "http://registry.npm.taobao.org/error-ex/download/error-ex-1.3.1.tgz", 282 | "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", 283 | "dev": true, 284 | "requires": { 285 | "is-arrayish": "0.2.1" 286 | } 287 | }, 288 | "escape-string-regexp": { 289 | "version": "1.0.5", 290 | "resolved": "http://registry.npm.taobao.org/escape-string-regexp/download/escape-string-regexp-1.0.5.tgz", 291 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 292 | "dev": true 293 | }, 294 | "eslint": { 295 | "version": "4.3.0", 296 | "resolved": "http://registry.npm.taobao.org/eslint/download/eslint-4.3.0.tgz", 297 | "integrity": "sha1-/NfJY3a780yF7mftABKimWQrEI8=", 298 | "dev": true, 299 | "requires": { 300 | "ajv": "5.2.2", 301 | "babel-code-frame": "6.22.0", 302 | "chalk": "1.1.3", 303 | "concat-stream": "1.6.0", 304 | "cross-spawn": "5.1.0", 305 | "debug": "2.6.8", 306 | "doctrine": "2.0.0", 307 | "eslint-scope": "3.7.1", 308 | "espree": "3.4.3", 309 | "esquery": "1.0.0", 310 | "estraverse": "4.2.0", 311 | "esutils": "2.0.2", 312 | "file-entry-cache": "2.0.0", 313 | "functional-red-black-tree": "1.0.1", 314 | "glob": "7.1.2", 315 | "globals": "9.18.0", 316 | "ignore": "3.3.3", 317 | "imurmurhash": "0.1.4", 318 | "inquirer": "3.2.1", 319 | "is-resolvable": "1.0.0", 320 | "js-yaml": "3.9.1", 321 | "json-stable-stringify": "1.0.1", 322 | "levn": "0.3.0", 323 | "lodash": "4.17.4", 324 | "minimatch": "3.0.4", 325 | "mkdirp": "0.5.1", 326 | "natural-compare": "1.4.0", 327 | "optionator": "0.8.2", 328 | "path-is-inside": "1.0.2", 329 | "pluralize": "4.0.0", 330 | "progress": "2.0.0", 331 | "require-uncached": "1.0.3", 332 | "semver": "5.4.1", 333 | "strip-json-comments": "2.0.1", 334 | "table": "4.0.1", 335 | "text-table": "0.2.0" 336 | } 337 | }, 338 | "eslint-config-airbnb-base": { 339 | "version": "11.3.1", 340 | "resolved": "http://registry.npm.taobao.org/eslint-config-airbnb-base/download/eslint-config-airbnb-base-11.3.1.tgz", 341 | "integrity": "sha1-wKsQjJvu1QPLmZ5MYPTvmO2g7TA=", 342 | "dev": true, 343 | "requires": { 344 | "eslint-restricted-globals": "0.1.1" 345 | } 346 | }, 347 | "eslint-import-resolver-node": { 348 | "version": "0.3.1", 349 | "resolved": "http://registry.npm.taobao.org/eslint-import-resolver-node/download/eslint-import-resolver-node-0.3.1.tgz", 350 | "integrity": "sha1-RCJXTN5mqaewmZOO5NUIoZng48w=", 351 | "dev": true, 352 | "requires": { 353 | "debug": "2.6.8", 354 | "resolve": "1.4.0" 355 | } 356 | }, 357 | "eslint-module-utils": { 358 | "version": "2.1.1", 359 | "resolved": "http://registry.npm.taobao.org/eslint-module-utils/download/eslint-module-utils-2.1.1.tgz", 360 | "integrity": "sha1-q67IJBd2E7ipWymWOeG2+s9HNEk=", 361 | "dev": true, 362 | "requires": { 363 | "debug": "2.6.8", 364 | "pkg-dir": "1.0.0" 365 | } 366 | }, 367 | "eslint-plugin-import": { 368 | "version": "2.7.0", 369 | "resolved": "http://registry.npm.taobao.org/eslint-plugin-import/download/eslint-plugin-import-2.7.0.tgz", 370 | "integrity": "sha1-Id4zOAue+1X1720uIQ7A4H5/pp8=", 371 | "dev": true, 372 | "requires": { 373 | "builtin-modules": "1.1.1", 374 | "contains-path": "0.1.0", 375 | "debug": "2.6.8", 376 | "doctrine": "1.5.0", 377 | "eslint-import-resolver-node": "0.3.1", 378 | "eslint-module-utils": "2.1.1", 379 | "has": "1.0.1", 380 | "lodash.cond": "4.5.2", 381 | "minimatch": "3.0.4", 382 | "read-pkg-up": "2.0.0" 383 | }, 384 | "dependencies": { 385 | "doctrine": { 386 | "version": "1.5.0", 387 | "resolved": "http://registry.npm.taobao.org/doctrine/download/doctrine-1.5.0.tgz", 388 | "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", 389 | "dev": true, 390 | "requires": { 391 | "esutils": "2.0.2", 392 | "isarray": "1.0.0" 393 | } 394 | } 395 | } 396 | }, 397 | "eslint-restricted-globals": { 398 | "version": "0.1.1", 399 | "resolved": "http://registry.npm.taobao.org/eslint-restricted-globals/download/eslint-restricted-globals-0.1.1.tgz", 400 | "integrity": "sha1-NfDVy8ZMLj7WLpO0saevBbp+1Nc=", 401 | "dev": true 402 | }, 403 | "eslint-scope": { 404 | "version": "3.7.1", 405 | "resolved": "http://registry.npm.taobao.org/eslint-scope/download/eslint-scope-3.7.1.tgz", 406 | "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", 407 | "dev": true, 408 | "requires": { 409 | "esrecurse": "4.2.0", 410 | "estraverse": "4.2.0" 411 | } 412 | }, 413 | "espree": { 414 | "version": "3.4.3", 415 | "resolved": "http://registry.npm.taobao.org/espree/download/espree-3.4.3.tgz", 416 | "integrity": "sha1-KRC1zNSc6JPC//+qtP2LOjG4I3Q=", 417 | "dev": true, 418 | "requires": { 419 | "acorn": "5.1.1", 420 | "acorn-jsx": "3.0.1" 421 | } 422 | }, 423 | "esprima": { 424 | "version": "4.0.0", 425 | "resolved": "http://registry.npm.taobao.org/esprima/download/esprima-4.0.0.tgz", 426 | "integrity": "sha1-RJnt3NERDgshi6zy+n9/WfVcqAQ=", 427 | "dev": true 428 | }, 429 | "esquery": { 430 | "version": "1.0.0", 431 | "resolved": "http://registry.npm.taobao.org/esquery/download/esquery-1.0.0.tgz", 432 | "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=", 433 | "dev": true, 434 | "requires": { 435 | "estraverse": "4.2.0" 436 | } 437 | }, 438 | "esrecurse": { 439 | "version": "4.2.0", 440 | "resolved": "http://registry.npm.taobao.org/esrecurse/download/esrecurse-4.2.0.tgz", 441 | "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", 442 | "dev": true, 443 | "requires": { 444 | "estraverse": "4.2.0", 445 | "object-assign": "4.1.1" 446 | } 447 | }, 448 | "estraverse": { 449 | "version": "4.2.0", 450 | "resolved": "http://registry.npm.taobao.org/estraverse/download/estraverse-4.2.0.tgz", 451 | "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", 452 | "dev": true 453 | }, 454 | "esutils": { 455 | "version": "2.0.2", 456 | "resolved": "http://registry.npm.taobao.org/esutils/download/esutils-2.0.2.tgz", 457 | "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", 458 | "dev": true 459 | }, 460 | "external-editor": { 461 | "version": "2.0.4", 462 | "resolved": "http://registry.npm.taobao.org/external-editor/download/external-editor-2.0.4.tgz", 463 | "integrity": "sha1-HtkZnanL/i7y96MbL96LDRI2iXI=", 464 | "dev": true, 465 | "requires": { 466 | "iconv-lite": "0.4.18", 467 | "jschardet": "1.5.0", 468 | "tmp": "0.0.31" 469 | } 470 | }, 471 | "fast-deep-equal": { 472 | "version": "1.0.0", 473 | "resolved": "http://registry.npm.taobao.org/fast-deep-equal/download/fast-deep-equal-1.0.0.tgz", 474 | "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=", 475 | "dev": true 476 | }, 477 | "fast-levenshtein": { 478 | "version": "2.0.6", 479 | "resolved": "http://registry.npm.taobao.org/fast-levenshtein/download/fast-levenshtein-2.0.6.tgz", 480 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", 481 | "dev": true 482 | }, 483 | "figures": { 484 | "version": "2.0.0", 485 | "resolved": "http://registry.npm.taobao.org/figures/download/figures-2.0.0.tgz", 486 | "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", 487 | "dev": true, 488 | "requires": { 489 | "escape-string-regexp": "1.0.5" 490 | } 491 | }, 492 | "file-entry-cache": { 493 | "version": "2.0.0", 494 | "resolved": "http://registry.npm.taobao.org/file-entry-cache/download/file-entry-cache-2.0.0.tgz", 495 | "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", 496 | "dev": true, 497 | "requires": { 498 | "flat-cache": "1.2.2", 499 | "object-assign": "4.1.1" 500 | } 501 | }, 502 | "find-up": { 503 | "version": "1.1.2", 504 | "resolved": "http://registry.npm.taobao.org/find-up/download/find-up-1.1.2.tgz", 505 | "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", 506 | "dev": true, 507 | "requires": { 508 | "path-exists": "2.1.0", 509 | "pinkie-promise": "2.0.1" 510 | } 511 | }, 512 | "flat-cache": { 513 | "version": "1.2.2", 514 | "resolved": "http://registry.npm.taobao.org/flat-cache/download/flat-cache-1.2.2.tgz", 515 | "integrity": "sha1-+oZxTnLCHbiGAXYezy9VXRq8a5Y=", 516 | "dev": true, 517 | "requires": { 518 | "circular-json": "0.3.3", 519 | "del": "2.2.2", 520 | "graceful-fs": "4.1.11", 521 | "write": "0.2.1" 522 | } 523 | }, 524 | "fs.realpath": { 525 | "version": "1.0.0", 526 | "resolved": "http://registry.npm.taobao.org/fs.realpath/download/fs.realpath-1.0.0.tgz", 527 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 528 | "dev": true 529 | }, 530 | "function-bind": { 531 | "version": "1.1.0", 532 | "resolved": "http://registry.npm.taobao.org/function-bind/download/function-bind-1.1.0.tgz", 533 | "integrity": "sha1-FhdnFMgBeY5Ojyz391KUZ7tKV3E=", 534 | "dev": true 535 | }, 536 | "functional-red-black-tree": { 537 | "version": "1.0.1", 538 | "resolved": "http://registry.npm.taobao.org/functional-red-black-tree/download/functional-red-black-tree-1.0.1.tgz", 539 | "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", 540 | "dev": true 541 | }, 542 | "glob": { 543 | "version": "7.1.2", 544 | "resolved": "http://registry.npm.taobao.org/glob/download/glob-7.1.2.tgz", 545 | "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=", 546 | "dev": true, 547 | "requires": { 548 | "fs.realpath": "1.0.0", 549 | "inflight": "1.0.6", 550 | "inherits": "2.0.3", 551 | "minimatch": "3.0.4", 552 | "once": "1.4.0", 553 | "path-is-absolute": "1.0.1" 554 | } 555 | }, 556 | "globals": { 557 | "version": "9.18.0", 558 | "resolved": "http://registry.npm.taobao.org/globals/download/globals-9.18.0.tgz", 559 | "integrity": "sha1-qjiWs+abSH8X4x7SFD1pqOMMLYo=", 560 | "dev": true 561 | }, 562 | "globby": { 563 | "version": "5.0.0", 564 | "resolved": "http://registry.npm.taobao.org/globby/download/globby-5.0.0.tgz", 565 | "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", 566 | "dev": true, 567 | "requires": { 568 | "array-union": "1.0.2", 569 | "arrify": "1.0.1", 570 | "glob": "7.1.2", 571 | "object-assign": "4.1.1", 572 | "pify": "2.3.0", 573 | "pinkie-promise": "2.0.1" 574 | } 575 | }, 576 | "graceful-fs": { 577 | "version": "4.1.11", 578 | "resolved": "http://registry.npm.taobao.org/graceful-fs/download/graceful-fs-4.1.11.tgz", 579 | "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", 580 | "dev": true 581 | }, 582 | "has": { 583 | "version": "1.0.1", 584 | "resolved": "http://registry.npm.taobao.org/has/download/has-1.0.1.tgz", 585 | "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", 586 | "dev": true, 587 | "requires": { 588 | "function-bind": "1.1.0" 589 | } 590 | }, 591 | "has-ansi": { 592 | "version": "2.0.0", 593 | "resolved": "http://registry.npm.taobao.org/has-ansi/download/has-ansi-2.0.0.tgz", 594 | "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", 595 | "dev": true, 596 | "requires": { 597 | "ansi-regex": "2.1.1" 598 | } 599 | }, 600 | "has-flag": { 601 | "version": "2.0.0", 602 | "resolved": "http://registry.npm.taobao.org/has-flag/download/has-flag-2.0.0.tgz", 603 | "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", 604 | "dev": true 605 | }, 606 | "hosted-git-info": { 607 | "version": "2.5.0", 608 | "resolved": "http://registry.npm.taobao.org/hosted-git-info/download/hosted-git-info-2.5.0.tgz", 609 | "integrity": "sha1-bWDjSzq7yDEwYsO3mO+NkBoHrzw=", 610 | "dev": true 611 | }, 612 | "iconv-lite": { 613 | "version": "0.4.18", 614 | "resolved": "http://registry.npm.taobao.org/iconv-lite/download/iconv-lite-0.4.18.tgz", 615 | "integrity": "sha1-I9hlaxaq5nQqwpcy6o8DNqR4nPI=", 616 | "dev": true 617 | }, 618 | "ignore": { 619 | "version": "3.3.3", 620 | "resolved": "http://registry.npm.taobao.org/ignore/download/ignore-3.3.3.tgz", 621 | "integrity": "sha1-QyNS5XrM2HqzEQ6C0/6g5HgSFW0=", 622 | "dev": true 623 | }, 624 | "imurmurhash": { 625 | "version": "0.1.4", 626 | "resolved": "http://registry.npm.taobao.org/imurmurhash/download/imurmurhash-0.1.4.tgz", 627 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", 628 | "dev": true 629 | }, 630 | "inflight": { 631 | "version": "1.0.6", 632 | "resolved": "http://registry.npm.taobao.org/inflight/download/inflight-1.0.6.tgz", 633 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 634 | "dev": true, 635 | "requires": { 636 | "once": "1.4.0", 637 | "wrappy": "1.0.2" 638 | } 639 | }, 640 | "inherits": { 641 | "version": "2.0.3", 642 | "resolved": "http://registry.npm.taobao.org/inherits/download/inherits-2.0.3.tgz", 643 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", 644 | "dev": true 645 | }, 646 | "inquirer": { 647 | "version": "3.2.1", 648 | "resolved": "http://registry.npm.taobao.org/inquirer/download/inquirer-3.2.1.tgz", 649 | "integrity": "sha1-Bs6w9UD0XKVIwX1oQJWYeCZfoXU=", 650 | "dev": true, 651 | "requires": { 652 | "ansi-escapes": "2.0.0", 653 | "chalk": "2.0.1", 654 | "cli-cursor": "2.1.0", 655 | "cli-width": "2.1.0", 656 | "external-editor": "2.0.4", 657 | "figures": "2.0.0", 658 | "lodash": "4.17.4", 659 | "mute-stream": "0.0.7", 660 | "run-async": "2.3.0", 661 | "rx-lite": "4.0.8", 662 | "rx-lite-aggregates": "4.0.8", 663 | "string-width": "2.1.1", 664 | "strip-ansi": "4.0.0", 665 | "through": "2.3.8" 666 | }, 667 | "dependencies": { 668 | "ansi-regex": { 669 | "version": "3.0.0", 670 | "resolved": "http://registry.npm.taobao.org/ansi-regex/download/ansi-regex-3.0.0.tgz", 671 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", 672 | "dev": true 673 | }, 674 | "ansi-styles": { 675 | "version": "3.2.0", 676 | "resolved": "http://registry.npm.taobao.org/ansi-styles/download/ansi-styles-3.2.0.tgz", 677 | "integrity": "sha1-wVm41b4PnlpvNG2rlPFs4CIWG4g=", 678 | "dev": true, 679 | "requires": { 680 | "color-convert": "1.9.0" 681 | } 682 | }, 683 | "chalk": { 684 | "version": "2.0.1", 685 | "resolved": "http://registry.npm.taobao.org/chalk/download/chalk-2.0.1.tgz", 686 | "integrity": "sha1-2+xJQ20q4V9TYRTnbRRlbNvA9E0=", 687 | "dev": true, 688 | "requires": { 689 | "ansi-styles": "3.2.0", 690 | "escape-string-regexp": "1.0.5", 691 | "supports-color": "4.2.1" 692 | } 693 | }, 694 | "strip-ansi": { 695 | "version": "4.0.0", 696 | "resolved": "http://registry.npm.taobao.org/strip-ansi/download/strip-ansi-4.0.0.tgz", 697 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 698 | "dev": true, 699 | "requires": { 700 | "ansi-regex": "3.0.0" 701 | } 702 | }, 703 | "supports-color": { 704 | "version": "4.2.1", 705 | "resolved": "http://registry.npm.taobao.org/supports-color/download/supports-color-4.2.1.tgz", 706 | "integrity": "sha1-ZaS7JjHpDgJCDbpVVMN1pHVLuDY=", 707 | "dev": true, 708 | "requires": { 709 | "has-flag": "2.0.0" 710 | } 711 | } 712 | } 713 | }, 714 | "is-arrayish": { 715 | "version": "0.2.1", 716 | "resolved": "http://registry.npm.taobao.org/is-arrayish/download/is-arrayish-0.2.1.tgz", 717 | "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", 718 | "dev": true 719 | }, 720 | "is-builtin-module": { 721 | "version": "1.0.0", 722 | "resolved": "http://registry.npm.taobao.org/is-builtin-module/download/is-builtin-module-1.0.0.tgz", 723 | "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", 724 | "dev": true, 725 | "requires": { 726 | "builtin-modules": "1.1.1" 727 | } 728 | }, 729 | "is-fullwidth-code-point": { 730 | "version": "2.0.0", 731 | "resolved": "http://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-2.0.0.tgz", 732 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 733 | "dev": true 734 | }, 735 | "is-path-cwd": { 736 | "version": "1.0.0", 737 | "resolved": "http://registry.npm.taobao.org/is-path-cwd/download/is-path-cwd-1.0.0.tgz", 738 | "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", 739 | "dev": true 740 | }, 741 | "is-path-in-cwd": { 742 | "version": "1.0.0", 743 | "resolved": "http://registry.npm.taobao.org/is-path-in-cwd/download/is-path-in-cwd-1.0.0.tgz", 744 | "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", 745 | "dev": true, 746 | "requires": { 747 | "is-path-inside": "1.0.0" 748 | } 749 | }, 750 | "is-path-inside": { 751 | "version": "1.0.0", 752 | "resolved": "http://registry.npm.taobao.org/is-path-inside/download/is-path-inside-1.0.0.tgz", 753 | "integrity": "sha1-/AbloWg/vaE95mev9xe7wQpI838=", 754 | "dev": true, 755 | "requires": { 756 | "path-is-inside": "1.0.2" 757 | } 758 | }, 759 | "is-promise": { 760 | "version": "2.1.0", 761 | "resolved": "http://registry.npm.taobao.org/is-promise/download/is-promise-2.1.0.tgz", 762 | "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", 763 | "dev": true 764 | }, 765 | "is-resolvable": { 766 | "version": "1.0.0", 767 | "resolved": "http://registry.npm.taobao.org/is-resolvable/download/is-resolvable-1.0.0.tgz", 768 | "integrity": "sha1-jfV8YeouPFAUCNEA+wE8+NbgzGI=", 769 | "dev": true, 770 | "requires": { 771 | "tryit": "1.0.3" 772 | } 773 | }, 774 | "isarray": { 775 | "version": "1.0.0", 776 | "resolved": "http://registry.npm.taobao.org/isarray/download/isarray-1.0.0.tgz", 777 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 778 | "dev": true 779 | }, 780 | "isexe": { 781 | "version": "2.0.0", 782 | "resolved": "http://registry.npm.taobao.org/isexe/download/isexe-2.0.0.tgz", 783 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 784 | "dev": true 785 | }, 786 | "js-tokens": { 787 | "version": "3.0.2", 788 | "resolved": "http://registry.npm.taobao.org/js-tokens/download/js-tokens-3.0.2.tgz", 789 | "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", 790 | "dev": true 791 | }, 792 | "js-yaml": { 793 | "version": "3.9.1", 794 | "resolved": "http://registry.npm.taobao.org/js-yaml/download/js-yaml-3.9.1.tgz", 795 | "integrity": "sha1-CHdc69/dNZIJ8NKs04PI+GppBKA=", 796 | "dev": true, 797 | "requires": { 798 | "argparse": "1.0.9", 799 | "esprima": "4.0.0" 800 | } 801 | }, 802 | "jschardet": { 803 | "version": "1.5.0", 804 | "resolved": "http://registry.npm.taobao.org/jschardet/download/jschardet-1.5.0.tgz", 805 | "integrity": "sha1-ph8xAwalpxGI4bGs0IrdPPuwix4=", 806 | "dev": true 807 | }, 808 | "json-schema-traverse": { 809 | "version": "0.3.1", 810 | "resolved": "http://registry.npm.taobao.org/json-schema-traverse/download/json-schema-traverse-0.3.1.tgz", 811 | "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", 812 | "dev": true 813 | }, 814 | "json-stable-stringify": { 815 | "version": "1.0.1", 816 | "resolved": "http://registry.npm.taobao.org/json-stable-stringify/download/json-stable-stringify-1.0.1.tgz", 817 | "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", 818 | "dev": true, 819 | "requires": { 820 | "jsonify": "0.0.0" 821 | } 822 | }, 823 | "jsonify": { 824 | "version": "0.0.0", 825 | "resolved": "http://registry.npm.taobao.org/jsonify/download/jsonify-0.0.0.tgz", 826 | "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", 827 | "dev": true 828 | }, 829 | "levn": { 830 | "version": "0.3.0", 831 | "resolved": "http://registry.npm.taobao.org/levn/download/levn-0.3.0.tgz", 832 | "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", 833 | "dev": true, 834 | "requires": { 835 | "prelude-ls": "1.1.2", 836 | "type-check": "0.3.2" 837 | } 838 | }, 839 | "load-json-file": { 840 | "version": "2.0.0", 841 | "resolved": "http://registry.npm.taobao.org/load-json-file/download/load-json-file-2.0.0.tgz", 842 | "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", 843 | "dev": true, 844 | "requires": { 845 | "graceful-fs": "4.1.11", 846 | "parse-json": "2.2.0", 847 | "pify": "2.3.0", 848 | "strip-bom": "3.0.0" 849 | } 850 | }, 851 | "locate-path": { 852 | "version": "2.0.0", 853 | "resolved": "http://registry.npm.taobao.org/locate-path/download/locate-path-2.0.0.tgz", 854 | "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", 855 | "dev": true, 856 | "requires": { 857 | "p-locate": "2.0.0", 858 | "path-exists": "3.0.0" 859 | }, 860 | "dependencies": { 861 | "path-exists": { 862 | "version": "3.0.0", 863 | "resolved": "http://registry.npm.taobao.org/path-exists/download/path-exists-3.0.0.tgz", 864 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", 865 | "dev": true 866 | } 867 | } 868 | }, 869 | "lodash": { 870 | "version": "4.17.4", 871 | "resolved": "http://registry.npm.taobao.org/lodash/download/lodash-4.17.4.tgz", 872 | "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", 873 | "dev": true 874 | }, 875 | "lodash.cond": { 876 | "version": "4.5.2", 877 | "resolved": "http://registry.npm.taobao.org/lodash.cond/download/lodash.cond-4.5.2.tgz", 878 | "integrity": "sha1-9HGh2khr5g9quVXRcRVSPdHSVdU=", 879 | "dev": true 880 | }, 881 | "lru-cache": { 882 | "version": "4.1.1", 883 | "resolved": "http://registry.npm.taobao.org/lru-cache/download/lru-cache-4.1.1.tgz", 884 | "integrity": "sha1-Yi4y6CSItJJ5EUpPns9F581rulU=", 885 | "dev": true, 886 | "requires": { 887 | "pseudomap": "1.0.2", 888 | "yallist": "2.1.2" 889 | } 890 | }, 891 | "mimic-fn": { 892 | "version": "1.1.0", 893 | "resolved": "http://registry.npm.taobao.org/mimic-fn/download/mimic-fn-1.1.0.tgz", 894 | "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=", 895 | "dev": true 896 | }, 897 | "minimatch": { 898 | "version": "3.0.4", 899 | "resolved": "http://registry.npm.taobao.org/minimatch/download/minimatch-3.0.4.tgz", 900 | "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", 901 | "dev": true, 902 | "requires": { 903 | "brace-expansion": "1.1.8" 904 | } 905 | }, 906 | "minimist": { 907 | "version": "0.0.8", 908 | "resolved": "http://registry.npm.taobao.org/minimist/download/minimist-0.0.8.tgz", 909 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 910 | "dev": true 911 | }, 912 | "mkdirp": { 913 | "version": "0.5.1", 914 | "resolved": "http://registry.npm.taobao.org/mkdirp/download/mkdirp-0.5.1.tgz", 915 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 916 | "dev": true, 917 | "requires": { 918 | "minimist": "0.0.8" 919 | } 920 | }, 921 | "ms": { 922 | "version": "2.0.0", 923 | "resolved": "http://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz", 924 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 925 | "dev": true 926 | }, 927 | "mute-stream": { 928 | "version": "0.0.7", 929 | "resolved": "http://registry.npm.taobao.org/mute-stream/download/mute-stream-0.0.7.tgz", 930 | "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", 931 | "dev": true 932 | }, 933 | "natural-compare": { 934 | "version": "1.4.0", 935 | "resolved": "http://registry.npm.taobao.org/natural-compare/download/natural-compare-1.4.0.tgz", 936 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", 937 | "dev": true 938 | }, 939 | "normalize-package-data": { 940 | "version": "2.4.0", 941 | "resolved": "http://registry.npm.taobao.org/normalize-package-data/download/normalize-package-data-2.4.0.tgz", 942 | "integrity": "sha1-EvlaMH1YNSB1oEkHuErIvpisAS8=", 943 | "dev": true, 944 | "requires": { 945 | "hosted-git-info": "2.5.0", 946 | "is-builtin-module": "1.0.0", 947 | "semver": "5.4.1", 948 | "validate-npm-package-license": "3.0.1" 949 | } 950 | }, 951 | "object-assign": { 952 | "version": "4.1.1", 953 | "resolved": "http://registry.npm.taobao.org/object-assign/download/object-assign-4.1.1.tgz", 954 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", 955 | "dev": true 956 | }, 957 | "once": { 958 | "version": "1.4.0", 959 | "resolved": "http://registry.npm.taobao.org/once/download/once-1.4.0.tgz", 960 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 961 | "dev": true, 962 | "requires": { 963 | "wrappy": "1.0.2" 964 | } 965 | }, 966 | "onetime": { 967 | "version": "2.0.1", 968 | "resolved": "http://registry.npm.taobao.org/onetime/download/onetime-2.0.1.tgz", 969 | "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", 970 | "dev": true, 971 | "requires": { 972 | "mimic-fn": "1.1.0" 973 | } 974 | }, 975 | "optionator": { 976 | "version": "0.8.2", 977 | "resolved": "http://registry.npm.taobao.org/optionator/download/optionator-0.8.2.tgz", 978 | "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", 979 | "dev": true, 980 | "requires": { 981 | "deep-is": "0.1.3", 982 | "fast-levenshtein": "2.0.6", 983 | "levn": "0.3.0", 984 | "prelude-ls": "1.1.2", 985 | "type-check": "0.3.2", 986 | "wordwrap": "1.0.0" 987 | } 988 | }, 989 | "os-tmpdir": { 990 | "version": "1.0.2", 991 | "resolved": "http://registry.npm.taobao.org/os-tmpdir/download/os-tmpdir-1.0.2.tgz", 992 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", 993 | "dev": true 994 | }, 995 | "p-limit": { 996 | "version": "1.1.0", 997 | "resolved": "http://registry.npm.taobao.org/p-limit/download/p-limit-1.1.0.tgz", 998 | "integrity": "sha1-sH/y2aXYi+yAYDWJWiurZqJ5iLw=", 999 | "dev": true 1000 | }, 1001 | "p-locate": { 1002 | "version": "2.0.0", 1003 | "resolved": "http://registry.npm.taobao.org/p-locate/download/p-locate-2.0.0.tgz", 1004 | "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", 1005 | "dev": true, 1006 | "requires": { 1007 | "p-limit": "1.1.0" 1008 | } 1009 | }, 1010 | "parse-json": { 1011 | "version": "2.2.0", 1012 | "resolved": "http://registry.npm.taobao.org/parse-json/download/parse-json-2.2.0.tgz", 1013 | "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", 1014 | "dev": true, 1015 | "requires": { 1016 | "error-ex": "1.3.1" 1017 | } 1018 | }, 1019 | "path-exists": { 1020 | "version": "2.1.0", 1021 | "resolved": "http://registry.npm.taobao.org/path-exists/download/path-exists-2.1.0.tgz", 1022 | "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", 1023 | "dev": true, 1024 | "requires": { 1025 | "pinkie-promise": "2.0.1" 1026 | } 1027 | }, 1028 | "path-is-absolute": { 1029 | "version": "1.0.1", 1030 | "resolved": "http://registry.npm.taobao.org/path-is-absolute/download/path-is-absolute-1.0.1.tgz", 1031 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 1032 | "dev": true 1033 | }, 1034 | "path-is-inside": { 1035 | "version": "1.0.2", 1036 | "resolved": "http://registry.npm.taobao.org/path-is-inside/download/path-is-inside-1.0.2.tgz", 1037 | "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", 1038 | "dev": true 1039 | }, 1040 | "path-parse": { 1041 | "version": "1.0.5", 1042 | "resolved": "http://registry.npm.taobao.org/path-parse/download/path-parse-1.0.5.tgz", 1043 | "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", 1044 | "dev": true 1045 | }, 1046 | "path-type": { 1047 | "version": "2.0.0", 1048 | "resolved": "http://registry.npm.taobao.org/path-type/download/path-type-2.0.0.tgz", 1049 | "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", 1050 | "dev": true, 1051 | "requires": { 1052 | "pify": "2.3.0" 1053 | } 1054 | }, 1055 | "pify": { 1056 | "version": "2.3.0", 1057 | "resolved": "http://registry.npm.taobao.org/pify/download/pify-2.3.0.tgz", 1058 | "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", 1059 | "dev": true 1060 | }, 1061 | "pinkie": { 1062 | "version": "2.0.4", 1063 | "resolved": "http://registry.npm.taobao.org/pinkie/download/pinkie-2.0.4.tgz", 1064 | "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", 1065 | "dev": true 1066 | }, 1067 | "pinkie-promise": { 1068 | "version": "2.0.1", 1069 | "resolved": "http://registry.npm.taobao.org/pinkie-promise/download/pinkie-promise-2.0.1.tgz", 1070 | "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", 1071 | "dev": true, 1072 | "requires": { 1073 | "pinkie": "2.0.4" 1074 | } 1075 | }, 1076 | "pkg-dir": { 1077 | "version": "1.0.0", 1078 | "resolved": "http://registry.npm.taobao.org/pkg-dir/download/pkg-dir-1.0.0.tgz", 1079 | "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", 1080 | "dev": true, 1081 | "requires": { 1082 | "find-up": "1.1.2" 1083 | } 1084 | }, 1085 | "pluralize": { 1086 | "version": "4.0.0", 1087 | "resolved": "http://registry.npm.taobao.org/pluralize/download/pluralize-4.0.0.tgz", 1088 | "integrity": "sha1-WbcIwcAZCi9pLxx2GMRGsFL9F2I=", 1089 | "dev": true 1090 | }, 1091 | "prelude-ls": { 1092 | "version": "1.1.2", 1093 | "resolved": "http://registry.npm.taobao.org/prelude-ls/download/prelude-ls-1.1.2.tgz", 1094 | "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", 1095 | "dev": true 1096 | }, 1097 | "process-nextick-args": { 1098 | "version": "1.0.7", 1099 | "resolved": "http://registry.npm.taobao.org/process-nextick-args/download/process-nextick-args-1.0.7.tgz", 1100 | "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", 1101 | "dev": true 1102 | }, 1103 | "progress": { 1104 | "version": "2.0.0", 1105 | "resolved": "http://registry.npm.taobao.org/progress/download/progress-2.0.0.tgz", 1106 | "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=", 1107 | "dev": true 1108 | }, 1109 | "pseudomap": { 1110 | "version": "1.0.2", 1111 | "resolved": "http://registry.npm.taobao.org/pseudomap/download/pseudomap-1.0.2.tgz", 1112 | "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", 1113 | "dev": true 1114 | }, 1115 | "read-pkg": { 1116 | "version": "2.0.0", 1117 | "resolved": "http://registry.npm.taobao.org/read-pkg/download/read-pkg-2.0.0.tgz", 1118 | "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", 1119 | "dev": true, 1120 | "requires": { 1121 | "load-json-file": "2.0.0", 1122 | "normalize-package-data": "2.4.0", 1123 | "path-type": "2.0.0" 1124 | } 1125 | }, 1126 | "read-pkg-up": { 1127 | "version": "2.0.0", 1128 | "resolved": "http://registry.npm.taobao.org/read-pkg-up/download/read-pkg-up-2.0.0.tgz", 1129 | "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", 1130 | "dev": true, 1131 | "requires": { 1132 | "find-up": "2.1.0", 1133 | "read-pkg": "2.0.0" 1134 | }, 1135 | "dependencies": { 1136 | "find-up": { 1137 | "version": "2.1.0", 1138 | "resolved": "http://registry.npm.taobao.org/find-up/download/find-up-2.1.0.tgz", 1139 | "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", 1140 | "dev": true, 1141 | "requires": { 1142 | "locate-path": "2.0.0" 1143 | } 1144 | } 1145 | } 1146 | }, 1147 | "readable-stream": { 1148 | "version": "2.3.3", 1149 | "resolved": "http://registry.npm.taobao.org/readable-stream/download/readable-stream-2.3.3.tgz", 1150 | "integrity": "sha1-No8lEtefnUb9/HE0mueHi7weuVw=", 1151 | "dev": true, 1152 | "requires": { 1153 | "core-util-is": "1.0.2", 1154 | "inherits": "2.0.3", 1155 | "isarray": "1.0.0", 1156 | "process-nextick-args": "1.0.7", 1157 | "safe-buffer": "5.1.1", 1158 | "string_decoder": "1.0.3", 1159 | "util-deprecate": "1.0.2" 1160 | } 1161 | }, 1162 | "require-uncached": { 1163 | "version": "1.0.3", 1164 | "resolved": "http://registry.npm.taobao.org/require-uncached/download/require-uncached-1.0.3.tgz", 1165 | "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", 1166 | "dev": true, 1167 | "requires": { 1168 | "caller-path": "0.1.0", 1169 | "resolve-from": "1.0.1" 1170 | } 1171 | }, 1172 | "resolve": { 1173 | "version": "1.4.0", 1174 | "resolved": "http://registry.npm.taobao.org/resolve/download/resolve-1.4.0.tgz", 1175 | "integrity": "sha1-p1vgHFPaJdk0qY69DkxKcxL5KoY=", 1176 | "dev": true, 1177 | "requires": { 1178 | "path-parse": "1.0.5" 1179 | } 1180 | }, 1181 | "resolve-from": { 1182 | "version": "1.0.1", 1183 | "resolved": "http://registry.npm.taobao.org/resolve-from/download/resolve-from-1.0.1.tgz", 1184 | "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", 1185 | "dev": true 1186 | }, 1187 | "restore-cursor": { 1188 | "version": "2.0.0", 1189 | "resolved": "http://registry.npm.taobao.org/restore-cursor/download/restore-cursor-2.0.0.tgz", 1190 | "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", 1191 | "dev": true, 1192 | "requires": { 1193 | "onetime": "2.0.1", 1194 | "signal-exit": "3.0.2" 1195 | } 1196 | }, 1197 | "rimraf": { 1198 | "version": "2.6.1", 1199 | "resolved": "http://registry.npm.taobao.org/rimraf/download/rimraf-2.6.1.tgz", 1200 | "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=", 1201 | "dev": true, 1202 | "requires": { 1203 | "glob": "7.1.2" 1204 | } 1205 | }, 1206 | "run-async": { 1207 | "version": "2.3.0", 1208 | "resolved": "http://registry.npm.taobao.org/run-async/download/run-async-2.3.0.tgz", 1209 | "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", 1210 | "dev": true, 1211 | "requires": { 1212 | "is-promise": "2.1.0" 1213 | } 1214 | }, 1215 | "rx-lite": { 1216 | "version": "4.0.8", 1217 | "resolved": "http://registry.npm.taobao.org/rx-lite/download/rx-lite-4.0.8.tgz", 1218 | "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", 1219 | "dev": true 1220 | }, 1221 | "rx-lite-aggregates": { 1222 | "version": "4.0.8", 1223 | "resolved": "http://registry.npm.taobao.org/rx-lite-aggregates/download/rx-lite-aggregates-4.0.8.tgz", 1224 | "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", 1225 | "dev": true, 1226 | "requires": { 1227 | "rx-lite": "4.0.8" 1228 | } 1229 | }, 1230 | "safe-buffer": { 1231 | "version": "5.1.1", 1232 | "resolved": "http://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.1.1.tgz", 1233 | "integrity": "sha1-iTMSr2myEj3vcfV4iQAWce6yyFM=", 1234 | "dev": true 1235 | }, 1236 | "semver": { 1237 | "version": "5.4.1", 1238 | "resolved": "http://registry.npm.taobao.org/semver/download/semver-5.4.1.tgz", 1239 | "integrity": "sha1-4FnAnYVx8FQII3M0M1BdOi8AsY4=", 1240 | "dev": true 1241 | }, 1242 | "shebang-command": { 1243 | "version": "1.2.0", 1244 | "resolved": "http://registry.npm.taobao.org/shebang-command/download/shebang-command-1.2.0.tgz", 1245 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", 1246 | "dev": true, 1247 | "requires": { 1248 | "shebang-regex": "1.0.0" 1249 | } 1250 | }, 1251 | "shebang-regex": { 1252 | "version": "1.0.0", 1253 | "resolved": "http://registry.npm.taobao.org/shebang-regex/download/shebang-regex-1.0.0.tgz", 1254 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", 1255 | "dev": true 1256 | }, 1257 | "signal-exit": { 1258 | "version": "3.0.2", 1259 | "resolved": "http://registry.npm.taobao.org/signal-exit/download/signal-exit-3.0.2.tgz", 1260 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", 1261 | "dev": true 1262 | }, 1263 | "slice-ansi": { 1264 | "version": "0.0.4", 1265 | "resolved": "http://registry.npm.taobao.org/slice-ansi/download/slice-ansi-0.0.4.tgz", 1266 | "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", 1267 | "dev": true 1268 | }, 1269 | "spdx-correct": { 1270 | "version": "1.0.2", 1271 | "resolved": "http://registry.npm.taobao.org/spdx-correct/download/spdx-correct-1.0.2.tgz", 1272 | "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", 1273 | "dev": true, 1274 | "requires": { 1275 | "spdx-license-ids": "1.2.2" 1276 | } 1277 | }, 1278 | "spdx-expression-parse": { 1279 | "version": "1.0.4", 1280 | "resolved": "http://registry.npm.taobao.org/spdx-expression-parse/download/spdx-expression-parse-1.0.4.tgz", 1281 | "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=", 1282 | "dev": true 1283 | }, 1284 | "spdx-license-ids": { 1285 | "version": "1.2.2", 1286 | "resolved": "http://registry.npm.taobao.org/spdx-license-ids/download/spdx-license-ids-1.2.2.tgz", 1287 | "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", 1288 | "dev": true 1289 | }, 1290 | "sprintf-js": { 1291 | "version": "1.0.3", 1292 | "resolved": "http://registry.npm.taobao.org/sprintf-js/download/sprintf-js-1.0.3.tgz", 1293 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 1294 | "dev": true 1295 | }, 1296 | "string_decoder": { 1297 | "version": "1.0.3", 1298 | "resolved": "http://registry.npm.taobao.org/string_decoder/download/string_decoder-1.0.3.tgz", 1299 | "integrity": "sha1-D8Z9fBQYJd6UKC3VNr7GubzoYKs=", 1300 | "dev": true, 1301 | "requires": { 1302 | "safe-buffer": "5.1.1" 1303 | } 1304 | }, 1305 | "string-width": { 1306 | "version": "2.1.1", 1307 | "resolved": "http://registry.npm.taobao.org/string-width/download/string-width-2.1.1.tgz", 1308 | "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", 1309 | "dev": true, 1310 | "requires": { 1311 | "is-fullwidth-code-point": "2.0.0", 1312 | "strip-ansi": "4.0.0" 1313 | }, 1314 | "dependencies": { 1315 | "ansi-regex": { 1316 | "version": "3.0.0", 1317 | "resolved": "http://registry.npm.taobao.org/ansi-regex/download/ansi-regex-3.0.0.tgz", 1318 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", 1319 | "dev": true 1320 | }, 1321 | "strip-ansi": { 1322 | "version": "4.0.0", 1323 | "resolved": "http://registry.npm.taobao.org/strip-ansi/download/strip-ansi-4.0.0.tgz", 1324 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 1325 | "dev": true, 1326 | "requires": { 1327 | "ansi-regex": "3.0.0" 1328 | } 1329 | } 1330 | } 1331 | }, 1332 | "strip-ansi": { 1333 | "version": "3.0.1", 1334 | "resolved": "http://registry.npm.taobao.org/strip-ansi/download/strip-ansi-3.0.1.tgz", 1335 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 1336 | "dev": true, 1337 | "requires": { 1338 | "ansi-regex": "2.1.1" 1339 | } 1340 | }, 1341 | "strip-bom": { 1342 | "version": "3.0.0", 1343 | "resolved": "http://registry.npm.taobao.org/strip-bom/download/strip-bom-3.0.0.tgz", 1344 | "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", 1345 | "dev": true 1346 | }, 1347 | "strip-json-comments": { 1348 | "version": "2.0.1", 1349 | "resolved": "http://registry.npm.taobao.org/strip-json-comments/download/strip-json-comments-2.0.1.tgz", 1350 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", 1351 | "dev": true 1352 | }, 1353 | "supports-color": { 1354 | "version": "2.0.0", 1355 | "resolved": "http://registry.npm.taobao.org/supports-color/download/supports-color-2.0.0.tgz", 1356 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", 1357 | "dev": true 1358 | }, 1359 | "table": { 1360 | "version": "4.0.1", 1361 | "resolved": "http://registry.npm.taobao.org/table/download/table-4.0.1.tgz", 1362 | "integrity": "sha1-qBFsEz+sLGH0pCCrbN9cTWHw5DU=", 1363 | "dev": true, 1364 | "requires": { 1365 | "ajv": "4.11.8", 1366 | "ajv-keywords": "1.5.1", 1367 | "chalk": "1.1.3", 1368 | "lodash": "4.17.4", 1369 | "slice-ansi": "0.0.4", 1370 | "string-width": "2.1.1" 1371 | }, 1372 | "dependencies": { 1373 | "ajv": { 1374 | "version": "4.11.8", 1375 | "resolved": "http://registry.npm.taobao.org/ajv/download/ajv-4.11.8.tgz", 1376 | "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", 1377 | "dev": true, 1378 | "requires": { 1379 | "co": "4.6.0", 1380 | "json-stable-stringify": "1.0.1" 1381 | } 1382 | } 1383 | } 1384 | }, 1385 | "text-table": { 1386 | "version": "0.2.0", 1387 | "resolved": "http://registry.npm.taobao.org/text-table/download/text-table-0.2.0.tgz", 1388 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", 1389 | "dev": true 1390 | }, 1391 | "through": { 1392 | "version": "2.3.8", 1393 | "resolved": "http://registry.npm.taobao.org/through/download/through-2.3.8.tgz", 1394 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", 1395 | "dev": true 1396 | }, 1397 | "tmp": { 1398 | "version": "0.0.31", 1399 | "resolved": "http://registry.npm.taobao.org/tmp/download/tmp-0.0.31.tgz", 1400 | "integrity": "sha1-jzirlDjhcxXl29izZX6L+yd65Kc=", 1401 | "dev": true, 1402 | "requires": { 1403 | "os-tmpdir": "1.0.2" 1404 | } 1405 | }, 1406 | "tryit": { 1407 | "version": "1.0.3", 1408 | "resolved": "http://registry.npm.taobao.org/tryit/download/tryit-1.0.3.tgz", 1409 | "integrity": "sha1-OTvnMKlEb9Hq1tpZoBQwjzbCics=", 1410 | "dev": true 1411 | }, 1412 | "type-check": { 1413 | "version": "0.3.2", 1414 | "resolved": "http://registry.npm.taobao.org/type-check/download/type-check-0.3.2.tgz", 1415 | "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", 1416 | "dev": true, 1417 | "requires": { 1418 | "prelude-ls": "1.1.2" 1419 | } 1420 | }, 1421 | "typedarray": { 1422 | "version": "0.0.6", 1423 | "resolved": "http://registry.npm.taobao.org/typedarray/download/typedarray-0.0.6.tgz", 1424 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", 1425 | "dev": true 1426 | }, 1427 | "util-deprecate": { 1428 | "version": "1.0.2", 1429 | "resolved": "http://registry.npm.taobao.org/util-deprecate/download/util-deprecate-1.0.2.tgz", 1430 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", 1431 | "dev": true 1432 | }, 1433 | "validate-npm-package-license": { 1434 | "version": "3.0.1", 1435 | "resolved": "http://registry.npm.taobao.org/validate-npm-package-license/download/validate-npm-package-license-3.0.1.tgz", 1436 | "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", 1437 | "dev": true, 1438 | "requires": { 1439 | "spdx-correct": "1.0.2", 1440 | "spdx-expression-parse": "1.0.4" 1441 | } 1442 | }, 1443 | "which": { 1444 | "version": "1.2.14", 1445 | "resolved": "http://registry.npm.taobao.org/which/download/which-1.2.14.tgz", 1446 | "integrity": "sha1-mofEN48D6CfOyvGs31bHNsAcFOU=", 1447 | "dev": true, 1448 | "requires": { 1449 | "isexe": "2.0.0" 1450 | } 1451 | }, 1452 | "wordwrap": { 1453 | "version": "1.0.0", 1454 | "resolved": "http://registry.npm.taobao.org/wordwrap/download/wordwrap-1.0.0.tgz", 1455 | "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", 1456 | "dev": true 1457 | }, 1458 | "wrappy": { 1459 | "version": "1.0.2", 1460 | "resolved": "http://registry.npm.taobao.org/wrappy/download/wrappy-1.0.2.tgz", 1461 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 1462 | "dev": true 1463 | }, 1464 | "write": { 1465 | "version": "0.2.1", 1466 | "resolved": "http://registry.npm.taobao.org/write/download/write-0.2.1.tgz", 1467 | "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", 1468 | "dev": true, 1469 | "requires": { 1470 | "mkdirp": "0.5.1" 1471 | } 1472 | }, 1473 | "yallist": { 1474 | "version": "2.1.2", 1475 | "resolved": "http://registry.npm.taobao.org/yallist/download/yallist-2.1.2.tgz", 1476 | "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", 1477 | "dev": true 1478 | } 1479 | } 1480 | } 1481 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "fp-code", 3 | "version": "1.0.0", 4 | "description": "my functional programing code resp", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "./node_modules/mocha/bin/mocha --compilers js:babel-register" 8 | }, 9 | "repository": { 10 | "type": "git", 11 | "url": "git+https://github.com/sunyongjian/FP-Code.git" 12 | }, 13 | "keywords": [ 14 | "javascript", 15 | "functional" 16 | ], 17 | "babel": { 18 | "presets": [ 19 | [ 20 | "env", 21 | { 22 | "targets": { 23 | "node": "current" 24 | } 25 | } 26 | ] 27 | ] 28 | }, 29 | "author": "sunyongjian", 30 | "license": "ISC", 31 | "bugs": { 32 | "url": "https://github.com/sunyongjian/FP-Code/issues" 33 | }, 34 | "homepage": "https://github.com/sunyongjian/FP-Code#readme", 35 | "dependencies": { 36 | "babel-runtime": "^6.26.0", 37 | "immutable": "^3.8.1" 38 | }, 39 | "devDependencies": { 40 | "babel-plugin-transform-runtime": "^6.23.0", 41 | "babel-preset-env": "^1.6.0", 42 | "babel-register": "^6.26.0", 43 | "chai": "^4.1.2", 44 | "eslint": "^4.3.0", 45 | "eslint-config-airbnb": "^15.1.0", 46 | "eslint-config-airbnb-base": "^11.3.1", 47 | "eslint-plugin-import": "^2.7.0", 48 | "mocha": "^3.5.0" 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /src/README.md: -------------------------------------------------------------------------------- 1 | ## 首先 2 | > 写多了命令式的语言,去学这样一个函数式编程思维,是有点难度的,但是它确实可以大大的增加的你效率,以及减少你的bug率,用户体验很好,你会很容易的迷上这种编程思维。从下面的图可以看出,随着使用经验的增长,你的产出效率,和自我评价的变化... 3 | 4 | ![image](../image/fb_hurts.png) 5 | 6 | 7 | ## 本质 8 | ### 图灵机 9 | 是数学家图灵在 1936 年提出的一种抽象计算模型,它的基本思想是用机器来模拟人们用纸笔进行数学运算的过程,从而创造出一台能够模拟人类所能进行的任何计算过程的机器。但是由于历史原因(比如设备的推广造价等),这种机器并没有推广开来,而是我们现在用的这种计算机模型(冯诺依曼)。 10 | 11 | ### λ演算 12 | 它是一套用于研究函数定义、函数应用和递归的形式系统。如果说图灵机产生的是一种思想,那λ演算可是鼻祖了,对之后的函数式语言产生了巨大影响。它既可以被看作一种简单的程序设计语言,用于描述计算过程,也可以被看作一个数学对象,用于推导证明一些命题[Benjamin C. Pierce]。 13 | 14 | ## 作为编程范式 15 | 16 | 17 | ### 编程范式 18 | > 范即模范之意,范式即模式、方法。编程范式一类典型的编程风格,是指从事软件工程的一类典型的风格,是编程语言的一种分类方式,它并不针对那种编程语言。就编程语言而言,一种编程语言也可以适用多种编程范式。 19 | 20 | ### 跟命令式(过程化)的区别 21 | 命令式是模拟计算机机器的系统结构,通过计算机指令的顺序排列,告诉计算机如何进行计算工作。从本质上讲,它是“冯.诺伊曼机“运行机制的抽象,它的编程思维方式源于计算机指令的顺序排列。它的特点就是自上而下的分析问题,分步骤的解决问题。而函数式是数学上的抽象,把计算用数学表达式描述出来,从而求值。 22 | 23 | ### 跟面向对象的区别 24 | 面向对象的设计思想和设计模式已经稳定的进入编程语言的主流。核心就是“万物皆对象”。它把程序中的问题,抽象成个体,也就是对象,利用封装让每个对象都有自己独特的属性和方法,来降低整个程序的耦合度。而最后解决复杂问题的程序,就是很多的对象结合起来,彼此之间相互传递消息,互相作用。 25 | 26 | 与面向对象把问题抽象成不同的“名词”、对象不同,函数式是把一个复杂的问题,分解成多个“动词”、函数。面向对象的程序内部,会通过对象间的交互引起变化,就是对象 A 会引起 B 的属性变化,复杂的程序更会有许多相互细微的状态变化混合形成。而函数式的程序则努力减少可见状态的变化,减少副作用。每个函数都有固定的输入和输出,不会改变初始值,而是返回一个新的结果。 27 | 28 | 不过共同的地方在于,无论是对象的抽象,还是方法的抽象,最后都是通过“组合”的方式,实现解决更复杂的问题,尽管这个“组合”的方式不尽相同。后面我们会介绍函数式的组合。 29 | 30 | 31 | ## 概念 32 | > 先介绍几个函数式里面的概念 33 | 34 | - 函数这个词指的是数学中,自变量的映射,是变量和自变量的一对一,而不是 function 这个概念。 35 | - 一个函数的值仅仅由函数参数的值决定,不依赖于其他状态。 36 | - 函数式中的变量,不同于命令式中的变量,没有存储单元,而是代数值,只是一个名词(变量)。 37 | - 变量值是不可变的,比如 ```x = x + 1``` 是不成立的,因为在数学上是没有这样的等式的。 38 | - 循环语句,条件语句也不是命令式编程的控制语句,而是函数的语法糖。比如循环就是通过递归去模拟的。 39 | 40 | ## 特性 41 | > 函数式编程的几个特点 42 | 43 | ### 函数是“一等公民” 44 | [first-class](https://github.com/sunyongjian/FP-Code/blob/master/src/feature/firstClass.md) 45 | 46 | ### 没有副作用 47 | side effect,指的是函数在运行过程中,对外部的数据造成了影响,产生了函数本身运算之外的其他影响,这个就是副作用。具体参照 48 | [pureFunction](https://github.com/sunyongjian/FP-Code/blob/master/src/feature/pureFunction.js) 49 | 50 | ### 只用表达式 51 | "表达式"(expression)是一个单纯的运算过程,总是有返回值;"语句"(statement)是执行某种操作,没有返回值。函数式编程要求,只使用表达式,不使用语句。也就是说,每一步都是单纯的运算,而且都有返回值。[引用](http://www.ruanyifeng.com/blog/2012/04/functional_programming.html) 52 | 53 | ### 引用透明 54 | 产生副作用的对立就是纯函数。当我们的程式都应用纯函数,那我们这段程式就是引用透明的。因为我们可以把程式中的任何一段函数代码,替换成它所得到的结果。如果用一句话来说:如果程式中的一段代码可以替换成它执行后的结果,而且程式的结果不会有影响,那我们就说对这段代码的引用是透明的。 55 | 56 | ## 抽象 57 | [把问题抽象](https://github.com/sunyongjian/FP-Code/tree/master/src/introduction) 58 | 59 | ## 衍生 60 | > 暂且我还没有理好结构,我不知道把高阶函数,柯理化,函数组合,functor因子,偏函数应用等概念放到那。暂且归于衍生。 61 | ### 高阶函数 ([HOF](https://github.com/sunyongjian/FP-Code/tree/master/src/highOrderFunction)) 62 | - [reduce](https://github.com/sunyongjian/FP-Code/blob/master/src/highOrderFunction/reduce.js) 63 | 64 | ### 柯理化([curring](https://github.com/sunyongjian/FP-Code/tree/master/src/curry)) 65 | 66 | ### 函数组合([compose](https://github.com/sunyongjian/FP-Code/tree/master/src/compose)) 67 | 68 | 69 | ### 不可变数据([immutable data](https://github.com/sunyongjian/FP-Code/tree/master/src/immutable)) 70 | 71 | 72 | ## 应用 73 | 74 | ### 缓存函数([Memoization](https://github.com/sunyongjian/FP-Code/blob/master/src/apply/memoize.js)) -------------------------------------------------------------------------------- /src/apply/README.md: -------------------------------------------------------------------------------- 1 | ## Introduction 2 | 利用函数式的一些特性,在日常项目之中的应用。 3 | 4 | 5 | ### 缓存函数 6 | 利用了高阶函数和 js 中闭包的思想,通过 memoize 函数把一些计算函数(运算频率较高的)处理,比如 upperCase,得到一个新的函数 meUpperCase。新的函数调用的时候,会把参数对应结果 ```{key: value}``` 保存到一个映射表 cache 中,大多数是对象或者数组。下次再调用 meUpperCase,如果参数在 cache 中存在,就直接把结果返回,省去了再执行计算的代码。在 js 中,cache 的访问是通过闭包实现的,也就是在 memoize 执行的作用域中定义。缓存函数在需要大量重复计算的程序中,能够起到很好的性能优化效果。 7 | 8 | ### 惰性函数 9 | 惰性函数跟缓存函数有些类似,都是为了避免重复执行代码 -------------------------------------------------------------------------------- /src/apply/memoize.js: -------------------------------------------------------------------------------- 1 | // 单个参数 2 | const memoize = (f) => { 3 | const cache = {}; 4 | return (str) => { 5 | if (!cache[str]) { 6 | cache[str] = f(str); 7 | } 8 | return cache[str]; 9 | }; 10 | }; 11 | 12 | const capitalized = (str) => str.slice(0, 1).toUpperCase() + str.slice(1, str.length) 13 | 14 | const memoCap = memoize(capitalized); 15 | 16 | // console.time('capitalized'); 17 | // console.log(memoCap('sunyongjian')); 18 | // console.timeEnd('capitalized'); 19 | 20 | 21 | // console.time('capitalized'); 22 | // console.log(memoCap('sunyongjian')); 23 | // console.timeEnd('capitalized'); 24 | 25 | // console.time('capitalized'); 26 | // console.log(memoCap('sunyongjian')); 27 | // console.timeEnd('capitalized'); 28 | 29 | // console.time('capitalized'); 30 | // console.log(memoCap('sunyongjian')); 31 | // console.timeEnd('capitalized'); 32 | 33 | // 第一次大写的处理可能需要 几毫米,有了缓存后,之后几乎是 0.025ms,节省很多的性能。 34 | 35 | 36 | // 测试一个斐波那契数列,对比一下效率。 37 | 38 | let fibonacci = (n) => { 39 | return n < 2 ? n : fibonacci(n - 1) + fibonacci(n - 2); 40 | }; 41 | 42 | // console.time('fibonacci'); 43 | // console.log(fibonacci(30)); 44 | // console.timeEnd('fibonacci');// 15.8ms 45 | 46 | // // 重写 fibonacci,为了递归调用。 47 | // fibonacci = memoize(fibonacci); 48 | 49 | // console.time('memoizeFib'); 50 | // console.log(fibonacci(30)); 51 | // console.timeEnd('memoizeFib');// 0.145ms 52 | 53 | // 多个参数 54 | 55 | function memoize2(f) { 56 | const cache = {}; 57 | return (...args) => { 58 | const key = args.join(','); 59 | if (!cache[key]) { 60 | cache[key] = f(...args); 61 | } 62 | return cache[key];// 这里是执行函数和缓存其计算值 63 | }; 64 | } 65 | 66 | const add = (a, b) => a + b; 67 | 68 | const memoAdd = memoize2(add); 69 | 70 | console.time('add'); 71 | console.log(memoAdd(2, 4)); 72 | console.timeEnd('add'); 73 | 74 | console.time('add'); 75 | console.log(memoAdd(2, 4)); 76 | console.timeEnd('add'); 77 | 78 | console.time('add'); 79 | console.log(memoAdd(2, 4)); 80 | console.timeEnd('add'); 81 | 82 | console.time('add'); 83 | console.log(memoAdd(2, 4)); 84 | console.timeEnd('add'); 85 | -------------------------------------------------------------------------------- /src/compose/README.md: -------------------------------------------------------------------------------- 1 | ## 函数组合 2 | > 在介绍 reduce 的时候,我们使用过 compose。compose 操作是建立 3 | 4 | ### 什么是组合 5 | 举个例子,两个函数组合: 6 | ```javascript 7 | // f, g 函数, compose 函数 8 | // 通过 compose 函数组合f, g, 可以做这样 f(g(x)) 的操作。 即: 9 | // compose(f, g) -> (x) => f(g(x)) 10 | 11 | var compose = function(f, g) { 12 | return function(x) { 13 | return f(g(x)); 14 | }; 15 | }; 16 | ``` 17 | 18 | ```js 19 | const upperCase = str => str.toUpperCase(); 20 | 21 | const reverse = str => str.split('').reverse().join(''); 22 | 23 | // 比如现在要做一个字符串大写并倒叙的工作,通常是 24 | var str = 'hello'; 25 | var upperStr = upperCase(str); 26 | var reverseStr = reverse(upperStr); 27 | 28 | // 那如果改成 compose,两个函数组合后返回新的函数。 29 | var upperAndReverse = compose(reverse, upperCase); 30 | var result = upperAndReverse(str); 31 | ``` 32 | 33 | 34 | ### compose 满足分配率 35 | 36 | ### 更通用的 compose 函数 37 | 38 | ```js 39 | 40 | varcompose = function(funcs) { 41 | return function(params) { 42 | 43 | } 44 | } 45 | 46 | ``` -------------------------------------------------------------------------------- /src/curry/README.md: -------------------------------------------------------------------------------- 1 | ## 简介 2 | > 柯理化,是把接收多个参数的函数,变换成接收一个单一参数的函数,并返回一个接收余下参数的函数。 3 | 4 | 这个定义显然是很抽象的。形象点来说,之前我的函数是接收多个参数的,柯理化之后呢,就变成了一次只接收单个参数,本来执行一次得到结果的,变成了执行多次。first-class 中的一个例子: 5 | 6 | ```javascript 7 | const add = function(x, y) { 8 | return x + y; 9 | } 10 | console.log(add(1, 2)); 11 | 12 | // currying 后 13 | 14 | const curryAdd = function(x) { 15 | return function(y) { 16 | return x + y; 17 | } 18 | } 19 | console.log(curryAdd(1)(2)); 20 | 21 | ``` 22 | 这样你显然觉得是多此一举的,但是如果换一种写法呢 23 | ```javascript 24 | const add10 = curryAdd(10); 25 | const result = add10(2); 26 | ``` 27 | 通过给 curryAdd 传入 10,我们得到了一个加 10 的函数,返回的函数,通过闭包,记住了 curryAdd 的参数,也就是说之后如果我们有同样的加 10 的操作,就不需要在执行两次 curryAdd 了,只需要执行 add10。当代码很多的时候,这种减少执行步骤的操作还是有必要的。 28 | 29 | ### 左右柯理化 30 | 柯理化把参数拆解了,上面的 curryAdd 是从左往右处理的,也就是从第一个参数开始,就是左柯理化。如果从右开始,就是右柯理化。如: 31 | ```javascript 32 | // x + y => y, x 33 | const rightCurryAdd = function(y) { 34 | return function(x) { 35 | return y + x; 36 | } 37 | } 38 | const tenAdd = rightCurryAdd(10); 39 | const result1 = tenAdd(2); 40 | ``` 41 | 我们可以看到,返回的函数意义已经变了,是 10 去加某个数,不过加法是支持交换律的,所以最后的结果是相同的。如果是除法呢: 42 | ```javascript 43 | // div => division 44 | const leftCurryDiv(x) { 45 | return function(y) { 46 | return x/y; 47 | } 48 | } 49 | const tendiv = leftCurryDiv(10); 50 | 51 | const rightCurryDiv(y) { 52 | return funtion(x) { 53 | return x/y; 54 | } 55 | } 56 | const divTen = rightCurryDiv(10); 57 | ``` 58 | 两个函数的意义不一样,一个是做除数,一个是被除数了。不过方向其实并不重要,选择怎么处理看个人的喜好,只是两种方式会有区别。另外,手动的,一次次的定义这些 curry 函数,实在是有点繁琐,我们不能用一次定义一次吧。所以就需要自动去柯理化参数的函数。 59 | 60 | 61 | ### 自动柯理化参数 62 | 63 | ```javascript 64 | function currying(fn) { 65 | var args = [].slice.call(arguments, 1); 66 | return function() { 67 | var newArgs = [].concat.apply(args, arguments); 68 | return fn.apply(null, newArgs); 69 | } 70 | } 71 | 72 | // next 73 | const add10 = currying(add, 10); 74 | 75 | // es6 写更方便 76 | const currying = (fn, ...ahead) => (...behind) => fn(...ahead, ...behind); 77 | // 效果是一样的 78 | ``` 79 | 80 | 81 | ## 为什么要有柯理化 82 | 与其说为什么要有柯理化,不如说在 lambda 演算定义函数的时候,一个函数只能接收一个参数,这就决定了它必须通过某种技巧,让表达式去处理多个参数的运算,比如加法。所以,柯理化算是其中的一个技巧,通过返回函数,接收第二个参数,实现类似加法的操作。 83 | 84 | ### 多参的危险性 85 | 通常我们在实现一个方法的时候,涉及到多个值的操作,多参函数是再正常不过的写法,但是有时候,这种函数结合的时候,却容易出现问题。举个常见的栗子,猜猜看会得到什么结果。 86 | ```javascript 87 | console.log([1, 2, 3].map(parseInt)) 88 | ``` 89 | 一眼看过去可能会觉得是[1, 2, 3],但其实是 [1, NaN, NaN].这就是 map 函数作为高阶函数的时候,给它的参数,parseInt 传了两个参数。parseInt 恰巧第二个值是有意义的,就会造成这种不稳定的,危险的现象。 90 | 91 | 一个解决办法是,让传给 map 函数的实参函数,变成单一值的函数。 92 | 93 | ```javascript 94 | console.log([1, 2, 3].map((x) => parseInt(x))); 95 | ``` 96 | 97 | 当然,这也不算是一个很经典的栗子,只是说,多参可能存在的风险。但是,不是说我们要拒绝多参数函数,现代编程的大多数情况下,多参数确实会提高一些效率,简化一些步骤。 98 | 99 | ### 操作数组的例子 100 | 现在有一个需求,一组数据,我们进行操作。例子还没想好... 101 | -------------------------------------------------------------------------------- /src/curry/index.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sunyongjian/FP-Code/4a33e5cfea3b605a58c16b4067d7b57272e17b0a/src/curry/index.js -------------------------------------------------------------------------------- /src/feature/README.md: -------------------------------------------------------------------------------- 1 | ## 函数式编程的特性 -------------------------------------------------------------------------------- /src/feature/firstClass.md: -------------------------------------------------------------------------------- 1 | ## 一等公民 2 | 我一直觉得“一等公民”这个词翻译过来一看是很容易产生歧义的,英文是 first-class objects(first-class citizens)。首先我们来解释一下 first-class 是什么。首先,类型规定了值的可取范围,比如 int, string, class等等,这就是类型。根据类型的值的可赋值情况,可以把类型分成三类: 3 | - first-class 类型的值可以传给子程序作为参数,可以从子程序里返回,可以赋给变量。大多数程序设计语言里,整型、字符类型等简单类型都是一级的。 4 | - second-class 该等级类型的值可以传给子程序作为参数,但是不能从子程序里返回,也不能赋给变量。 5 | - third-class 该等级类型的值连作为参数传递也不行。 6 | [参考](https://www.zhihu.com/question/27460623) 7 | 那我们就理解了什么是 first-class 了。在函数式编程的思想中,函数是 first-class 的,这个概念是 Christopher Strachey 提出的,并有几个原则,是我们上面提到的。函数: 8 | - 可以被命名为变量 9 | - 可以作为程序的参数 10 | - 可以作为程序的返回值 11 | - 可以包含在数据结构里 12 | 这么看来,在 JS 中 function 是满足以上几个原则的。我们通过代码来详细解释以下这几个原则 13 | 1. 作为变量 14 | ```javascript 15 | const add = function (x, y) { 16 | return x + y; 17 | } 18 | ``` 19 | 20 | 2. 参数 21 | ```javascript 22 | const base = [1, 2, 3]; 23 | const double = function (num) { 24 | return num * 2; 25 | } 26 | const result = base.map(double); 27 | // double 就是 map 函数的参数 28 | ``` 29 | 3. 返回值 30 | ```javascript 31 | function currying (fn, ...ahead) { 32 | return function (...behind) { 33 | return fn(...ahead, ...behind); 34 | } 35 | } 36 | const add = function(x, y) { 37 | return x + y; 38 | } 39 | const add2 = currying(add, 2); 40 | const num = 1; 41 | const result = add2(add2(add2(add2(num)))); 42 | ``` 43 | currying 函数执行后的返回值就是一个函数。由于是例子,是我随性写的... 你可以先不去关注代码在干什么,后面会提到curry 的概念。 44 | 4. 数据结构 45 | ```javascript 46 | const add = function(x, y) { 47 | return x + y; 48 | } 49 | const obj = { 50 | add: add, 51 | } 52 | const ary = [add]; 53 | ``` -------------------------------------------------------------------------------- /src/feature/pureFunction.js: -------------------------------------------------------------------------------- 1 | const { log } = require('../utils'); 2 | 3 | // 首先我们从操作数组的方法开始 4 | const ary = [1, 2, 3, 4, 5]; 5 | 6 | ary.push(6); 7 | 8 | ary.pop(6); 9 | 10 | ary.unshift(0); 11 | 12 | ary.shift(0); 13 | 14 | ary.splice(3, 5); 15 | 16 | const result = ary.concat([4, 5]); 17 | 18 | const copy = result.slice(); 19 | 20 | const double = copy.map(item => item * 2); 21 | 22 | log(result, copy, double, 'aa'); 23 | 24 | double.reverse(); 25 | 26 | // 回忆一下 👆 的方法,返回值是什么,还有会不会对元素组造成改变。 27 | // -------------------- -------------------- -------------------- -------------------- 28 | 29 | // 像 push pop 这种对原数组有修改操作的,因为原数组被永久的改变了,即产生了副作用。 30 | // 而我们更期待一个稳定的输出。换一种说法就是固定的输入对应固定的输出, 31 | // 也就是我们中学数学学的函数映射关系。f(x) = x * 2; f(1) = 2, f(2) = 4 32 | // 比如这个求三倍的函数 33 | function triple(x) { 34 | return x * 3; 35 | } 36 | 37 | const y1 = triple(2); 38 | 39 | // 与之对应的就是 Side Effects, 产生副作用的函数 40 | 41 | export var y2; 42 | 43 | function tripleEffect(x) { 44 | y2 = x * 3; 45 | } 46 | tripleEffect(3); 47 | tripleEffect(3); 48 | 49 | // tripleEffect 也是求三倍,只不过他是比较偏过程,更有局限性的,如果需要操作其他 y 值, 50 | // 还需要定义另一个函数。另外它也永久的改变了 y2 的值,再执行一次 tripleEffect(3), 51 | // y2 已经变成了之前的 9 倍。然而业务中的代码显然没有这么简单,很容易出现你在另一个地方, 52 | // 还需要用到 y2 并进行了副作用的操作,这样你之前用到的 y2 就被 “偷偷摸摸” 的改变了... 53 | // 导致你之前的代码出现了 bug,而你却很难第一时间定位到错误在哪,浪费很多时间调试。 54 | 55 | // 业务中可能出现副作用的地方: 56 | // 发送一个 http 请求函数 57 | // 可变数据 58 | // 打印/log 59 | // 获取用户输入 60 | // DOM 查询 61 | // -------------------- -------------------- -------------------- -------------------- 62 | 63 | // 通过一个简单的例子,介绍纯函数的好处。 64 | // say hi,首字母大写,并在句尾加感叹号。 65 | const personName = 'tom'; 66 | 67 | function sayHi(name) { 68 | return `hi, ${name}`; 69 | } 70 | 71 | function upper(str) { 72 | return `${str.substr(0, 1).toUpperCase()}${str.substr(1, str.length)}`; 73 | } 74 | 75 | function loudly(str) { 76 | return `${str}!`; 77 | } 78 | 79 | console.log(loudly(upper(sayHi(personName)))); 80 | 81 | 82 | // 这里是通过三个纯函数组合实现的一个功能,当然职责单一,减少耦合等思想是很容易结合的。 83 | // 每个函数负责自己的功能,接受参数并返回一个新的 result。纯函数的好处: 84 | // 1.可移植性 85 | // 比如随便一个函数都可以放到任何地方,任意项目运行。尤其是 utils 之类的。 86 | // 2.文档化 87 | // 从函数体就可以看出 sayHi 的作用可能是什么,并且它的参数是一个 name,返回值也会在最后return 88 | // 3.可测试性 89 | // 随意一个函数,只要给定输入,就会得到输出。我们的测试会更容易写。 90 | // 测试代码在 test/pure.test.js 91 | // 比如 triple 和 tripleEffect,triple 是纯函数,给一个输入得到一个输出,测试很容易。但是 tripleEffect 92 | // 的变量依赖于当前的作用域,写测试的时候有局限性,几乎没有单元测试可言。非要测也有办法... 93 | // 4.合理性 94 | // 如果我们写的函数,执行结果可以被一段代码代替,并且不改变程序最后的结果,那这段代码就是引用透明的。 95 | // 以上我们的 sayHi 可以完全替换成某个字符串... 因为函数式是数学推导的过程,中间的任一等式都可被 96 | // 一对一的等价替换。 97 | 98 | export { 99 | triple, 100 | tripleEffect, 101 | sayHi, 102 | upper, 103 | loudly, 104 | }; 105 | -------------------------------------------------------------------------------- /src/highOrderFunction/README.md: -------------------------------------------------------------------------------- 1 | ## HOF 2 | High Order Functions,即高阶函数,至少满足其下两个条件之一: 3 | - 以一个函数作为参数 4 | - 以一个函数作为返回结果 5 | ### 编程的维度看高阶函数 6 | 这都是在满足函数是 "first-class" 的情况下,出现的技巧。函数可以作为程序的参数,也可以作为返回值。 7 | 8 | 9 | ```javascript 10 | function HOF(...){ 11 | return function(...){ 12 | //... 13 | } 14 | } 15 | ``` 16 | 17 | ### 函数作为参数 18 | 比如操作数组的 map,reduce 函数,都是此类。 19 | ```js 20 | const x = [1, 2, 3]; 21 | const y = x.map(function(item) { 22 | return item + 1; 23 | }) 24 | ``` 25 | 26 | [reduce](https://github.com/sunyongjian/FP-Code/blob/master/src/highOrderFunction/reduce.js) 27 | 28 | ### 函数作为返回值 29 | ```js 30 | const add = function(x) { 31 | return function(y) { 32 | return x + y; 33 | } 34 | } 35 | console.log(add(1)(2)); 36 | ``` 37 | 38 | #### 偏函数应用 39 | 通过一个典型的栗子来介绍。比如用 `Object.prototype.toString` 来判断数据类型。 40 | ```js 41 | 42 | const isType = function (type) { 43 | return function(obj) { 44 | if(typeof type !== 'string') { 45 | return new Error('type need string'); 46 | } 47 | const str = type[0].toUpperCase() + type.slice(1); 48 | return Object.prototype.toString.call(obj) === `[object ${str}]`; 49 | } 50 | } 51 | 52 | const isNumber = isType('number'); 53 | console.log(isNumber(1)); 54 | ``` 55 | 56 | isType 返回一个新的函数。不过这种情况也叫偏函数,即把函数的某些参数值固定住,返回一个新的函数,调用这个新函数会更简单。 57 | 58 | #### 节流函数 59 | 一个在 js 中广泛应用的函数。 60 | 61 | ```js 62 | const throttle = wait => fn => { 63 | var timer; 64 | return (...args) => { 65 | if (!timer) { 66 | timer = setTimeout(() => timer = null, wait); 67 | return fn(...args); 68 | } 69 | } 70 | } 71 | ``` 72 | 73 | ```js 74 | const debounce = wait => fn => { 75 | var timer; 76 | return (...args) => { 77 | clearTimeout(timer); 78 | timer = setTimeout(() => { 79 | fn(...args); 80 | }, wait) 81 | } 82 | } 83 | ``` 84 | 85 | 86 | ### 数学的维度看高阶函数 87 | 88 | 在数学中,也叫算子或者泛函。什么是算子呢。 89 | 90 | 首先,记一个 `f: A -> B`,小 f 是 A 到 B 的映射,则可以称 f 就是算子。引入 x,对 x 作用算子 f,就可以获得新的函数 f(x)。如果 x 是一个函数,这就类似于算子接收一个 x,返回了一个新的函数。而泛函,是一个向量空间到实数的映射,也就是它接收的是函数,输入是函数,返回的,输出的是实数。这两个概念的思路跟高级函数是有点类似的,通过 HOF,可以作向量空间 A 到向量空间 B 的映射,也就是映射一个函数到另一个函数。`g(x) = functor(f(x))` 91 | 92 | -------------------------------------------------------------------------------- /src/highOrderFunction/reduce.js: -------------------------------------------------------------------------------- 1 | const { logger } = require('../utils'); 2 | 3 | // 做个 Reverse && UpperCase 的 demo 4 | 5 | // 1. usual 6 | const str = 'hello world'; 7 | const upperCase = str => str.toUpperCase(); 8 | 9 | const reverse = str => str.split('').reverse().join(''); 10 | 11 | // console.log(upperCase(reverse(str))); 12 | 13 | // 2. reduce 14 | 15 | // first simple 16 | const result0 = [reverse, upperCase].reduce((res, cur) => { 17 | return cur(res); 18 | }, str); 19 | 20 | // 3. 然后 reduce 的 functor 可以提取出来,形参叫 state, action 更直观 21 | const reducer = (state, action) => action(state); 22 | const result1 = [reverse, upperCase].reduce(reducer, str); 23 | 24 | // 4. 更进一步我们把参数也放到 funcs 数组的第一项,让 reduce 自动传入 25 | 26 | const result2 = [str, reverse, upperCase].reduce(reducer); 27 | 28 | // 5. 不太优雅,柯理化改造 29 | 30 | const reverseUpper = args => [args, reverse, upperCase].reduce(reducer); 31 | const result3 = reverseUpper(str); 32 | 33 | 34 | // 6. 提取一个公共的方法,去处理函数组合, 以及参数的传入 35 | const compose = (...funcs) => args => funcs.reduce(reducer, args); 36 | const result4 = compose(reverse, upperCase)(str); 37 | 38 | [result0, result1, result2, result3, result4].map(logger); 39 | -------------------------------------------------------------------------------- /src/immutable/README.md: -------------------------------------------------------------------------------- 1 | ## 不可变数据 2 | 不可变数据结构是函数式编程中的基本准则。 3 | 4 | ### 可变/不可变对象 5 | 6 | 可变对象是一个可在其创建后修改状态的对象,而不可变对象则是创建之后,不能再修改状态,对其任何删改操作,都应返回一个新的对象。 7 | 8 | js 中对象可变的好处可能是为了节约内存,相比字符串、数字,它承载的数据量更大更多,不可变带来每次操作都要产生新的对象,新的数据结构,这与 js 设计之初用来做网页中表单验证等简单操作是有悖的。而且,我们最开始也确实感受到可变带来的便捷,但是反之它带来的副作用远超过这种便捷,程序越大代码的可读性,复杂度也越来越高。 9 | 10 | ### 为什么要有不可变数据 11 | 从 js 中的一个栗子开始: 12 | ```js 13 | var x = { 14 | a: 1 15 | } 16 | var y = x; 17 | x.a = 2; 18 | console.log(y); //{ a: 2 } 19 | ``` 20 | 这在我们刚开始学 js 的时候就知道了,`x = y` 是对象赋值引用,两者公用一个对象的空间,所以 x 改动了,y 自然也改变。 21 | 22 | 数组也是一样的: 23 | ```js 24 | var ary = [1, 2, 3]; 25 | var list = ary; 26 | ary.push(4); 27 | console.log(list); // [1, 2, 3, 4] 28 | ``` 29 | 不过字符串和数组就不会。 30 | ```js 31 | var str = 'hello world'; 32 | var sub = str; 33 | str = str.slice(0, 5); 34 | console.log(sub); // 'hello world' 35 | 36 | var a = 1; 37 | var b = a; 38 | a += 2; 39 | console.log(b); // 1 40 | ``` 41 | 42 | 在介绍纯函数的时候(pure function),我们提到过“副作用”,其实可变数据也是容易造成“副作用”。而函数式默认的数据是不可变的,这样我们在执行纯函数的时候,才能确保固定的输入对应固定的输出(我输入一个数组到函数里,返回值必须是一个新数组),而且也不会造成数据的不可见变化。 43 | 44 | ### 数据拷贝 45 | 46 | 在 js 中像上面 `y = x` 的操作显然是不符合函数式编程规范的,这就意味着我们要给新对象(数据)创建一个新的引用,也就是需要数据拷贝。 47 | 48 | #### Object.assign 49 | 像这样: 50 | ```js 51 | const x = { a: 1 }; 52 | 53 | const y = Object.assign({}, x); 54 | x.a = 11; 55 | console.log(y); // { a: 1 } 56 | ``` 57 | 诚然,此次对 y 的赋值,再去改变 x.a 的时候,y.a 并没有发生变化,保持了不变性。你以为就这么简单吗?看另一个栗子: 58 | 59 | ```js 60 | const x = { a: 1, b: { c: 2 } }; 61 | 62 | const y = Object.assign({}, x); 63 | 64 | x.b.c = 22; 65 | 66 | console.log(y); // { a: 1, b: { c: 22}} 67 | ``` 68 | 对 x 的操作,使 y.b.c 也变成了 22。为什么?因为 Object.assign 是浅拷贝,也就是它只会赋值对象第一层的 kv,而当第一层的 value 出现 object/array 的时候,它还是会做赋值引用操作,即 x,y 的 b 共用一个 `{c: 2}` 的地址。还有几个方法也是这样的。 69 | 70 | #### Object.freeze 71 | ```js 72 | const x = { a: 1, b: { c: 2 } }; 73 | const y = Object.freeze(x); 74 | x.a = 11; 75 | console.log(y); 76 | 77 | x.b.c = 22; 78 | 79 | console.log(y); // { a: 1, b: { c: 22}} 80 | ``` 81 | freeze,看起来是真的“冻结”了,不可变了,其实效果是一样的,为了效率,做的浅拷贝。 82 | 83 | #### deconstruction 解构 84 | ```js 85 | const x = { a: 1, b: { c: 2 } }; 86 | const y = { ...x }; 87 | x.a = 11; 88 | console.log(y); 89 | 90 | x.b.c = 22; 91 | 92 | console.log(y); 93 | ``` 94 | es6 中的新方法,解构。数组也一样: 95 | 96 | ```js 97 | const x = [1, 2, [3, 4]]; 98 | const y = [...x]; 99 | x[2][0] = 33; 100 | console.log(y); // [1, 2, [33, 4]] 101 | ``` 102 | 同样是浅拷贝。 103 | 104 | #### deep-clone 105 | - 原生 106 | 107 | 拿上面的栗子来说,我们去实现深拷贝。 108 | ```js 109 | const x = { a: 1, b: { c: 2 } }; 110 | const y = Object.assign({}, x, { 111 | b: Object.assign({}, x.b) 112 | }) 113 | 114 | x.b.c = 22; 115 | 116 | console.log(y); // { a: 1, b: { c: 2 } } 117 | ``` 118 | 119 | 不过这只是嵌套不多的时候,而更深层次的,就需要更复杂的操作了。实际上,deep-clone 确实没有一个统一的方法,需要考虑的地方挺多,比如效率,以及是否应用场景(是否每次都需要 deep-clone)。还有在 js 中,还要加上 hasOwnProperty 这样的判断。写个简单的方法: 120 | ```js 121 | function clone(obj) { 122 | // 类型判断。 isActiveClone 用来防止重复 clone,效率问题。 123 | if (obj === null || typeof obj !== 'object' || 'isActiveClone' in obj) { 124 | return obj; 125 | } 126 | 127 | //可能是 Date 对象 128 | const result = obj instanceof Date ? new Date(obj) : {}; 129 | 130 | for (const key in obj) { 131 | if (Object.prototype.hasOwnProperty.call(obj, key)) { 132 | obj['isActiveClone'] = null; 133 | result[key] = clone(obj[key]); 134 | delete obj['isActiveClone']; 135 | } 136 | } 137 | 138 | return result; 139 | } 140 | 141 | var x = { 142 | a: 1, 143 | b: 2, 144 | c: { 145 | d: 3 146 | } 147 | } 148 | console.log(clone(x)); 149 | ``` 150 | 151 | - JSON 152 | 最简单,偷懒的一种方式,JSON 的序列化再反序列化。 153 | ```js 154 | const y = JSON.parse(JSON.stringify(x)); 155 | ``` 156 | 普通的 string,number,object,array 都是可以做深拷贝的。不过这个方法比较偷懒,是存在坑的,比如不支持 NaN,正则,function 等。举个栗子: 157 | ```js 158 | const x = { 159 | a: function() { 160 | console.log('aaa') 161 | }, 162 | b: NaN, 163 | } 164 | 165 | const y = JSON.parse(JSON.stringify(x)); 166 | console.log(y.b); 167 | y.a() 168 | 169 | ``` 170 | 试一下就知道了。 171 | 172 | - Library 173 | 通常实现 deep-clone 的库:`lodash`,`$.extend(true, )`... 目前最好用的是 `immutable.js`。 174 | 175 | 176 | 177 | 178 | ### 数据持久化 179 | 180 | 不变性可以让数据持久化变得容易。当数据不可变的时候,我们的每次操作,都不会引起初始数据的改变。也就是说在一定时期内,这些数据是永久存在的,而你可以通过读取,实现类似于“回退/切换快照”般的操作。这是我们从函数式编程来简单理解这个概念,而不涉及硬盘存储或者数据库存储的概念。 181 | 182 | 首先,无论数据结构的深浅,每次操作都对整个数据结构进行完整的深拷贝,效率会很低。这就牵扯到在做数据拷贝的时候,利用数据结构,做一些优化。例如,我们可以观察某次操作,到底有没有引起深层次数据结构的变化,如果没有,我们是不是可以只做部分改变,而没变化的地方,还是可以共用的。**这就是部分持久化**。 183 | -------------------------------------------------------------------------------- /src/immutable/index.js: -------------------------------------------------------------------------------- 1 | 2 | const Immutable = require('immutable'); 3 | const a = { a: 1 }; 4 | const b = { b: 2 }; 5 | const aa = Immutable.Map(a); 6 | const bb = Immutable.Map(b); 7 | // console.log(, 'aa'); 8 | for(const val of aa.merge(bb)) { 9 | console.log(typeof val); 10 | } 11 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sunyongjian/FP-Code/4a33e5cfea3b605a58c16b4067d7b57272e17b0a/src/index.js -------------------------------------------------------------------------------- /src/introduction/README.md: -------------------------------------------------------------------------------- 1 | ## 开始函数式 2 | > 体会函数式编程思想的核心,让我们开始转变思想。 3 | ## 抽象 4 | 把问题抽象,确定函数 5 | 6 | ### 把函数作为抽象单元 7 | 8 | 还记得我们在开篇,跟面向对象编程作对比的时候说过,函数式编程思想努力把问题分解,抽象成个体。通俗点讲,就是一个程序通过分解,抽象方法,把复杂的问题提炼成几个方法,而隐藏了每个方法具体的实现细节,这些方法就是抽象单元。白话点就是,比如我要做“开车上路”这件事,我可能分解抽象成,“学驾照”,“弄一辆车”,“开车”...几步,具体我是怎么学的驾照,怎么搞来的一辆车,都是在抽象单元内部实现。 9 | 举个例子:现在有一个数组,我们写一个方法让里面的数翻倍。 10 | ```javascript 11 | // 为了直观,我们用 es5 写。 12 | 13 | var list = [1, 2, 3]; 14 | function doubleAry (ary) { 15 | return ary.map(function(item) { 16 | return item * 2; 17 | }) 18 | } 19 | var doubledList = doubleAry(list); 20 | ``` 21 | 如果要是让数组里的数据都 + 1 呢。是不是还要重新写一个函数,把步骤再实现一遍?假如说数组里出现了不是数字的值怎么办?换一种思路 22 | ```javascript 23 | var list = [1, 2, 3]; 24 | var list1 = [4, '5', 6]; 25 | // 把这些对值的操作都抽象成方法 26 | var double = function(value) { 27 | return value * 2; 28 | } 29 | 30 | var addOne = function(value) { 31 | return value + 1; 32 | } 33 | // 当然这不是它的完整实现 34 | var isNumber = function(value) { 35 | return typeof value === 'number'; 36 | } 37 | 38 | var error = function() { 39 | throw new Error('current value is not a number'); 40 | } 41 | var warn = function() { 42 | console.warn('current value is not a number'); 43 | } 44 | 45 | var operate = addOne; 46 | var abnormal = error; 47 | 48 | var check = function (value) { 49 | if(!isNumber(value)) { 50 | abnormal(); 51 | } 52 | return value; 53 | } 54 | 55 | var mapAry = function(ary) { 56 | return ary.map(function(item) { 57 | return operate(check(item)); 58 | }) 59 | } 60 | 61 | console.log(mapAry(list)); // [2, 3, 4]; 62 | console.log(mapAry(list1)); // [5, "51", 7] && warn 63 | 64 | // 替换 65 | operate = double; 66 | abnormal = warn; 67 | 68 | console.log(mapAry(list)); // [2, 4, 6]; 69 | console.log(mapAry(list1)); // Uncaught Error: current value is not a number 70 | 71 | ``` 72 | 我们把所有的操作都抽象成了方法,比如对数组的操作 ```operate``` 方法和异常校验,我们可以通过重新定义,实现操作的替换。比如 double 换成了 addOne。当然这里用的方式不是最好的,因为还要结合其他思想,这只是在证明,抽象方法带来的方便。由于行为包含在单一的函数中,所以函数可以被提供类似行为的新函数取代,或直接被完全不同的行为所取代。 73 | 74 | 通常可能是这样做的,结合柯理化,map 作为高阶函数的特性,去处理。 75 | ```javascript 76 | var mapAry = function(fn) { 77 | return function(ary) { 78 | return ary.map(fn); 79 | } 80 | } 81 | var doubleAry = mapAry(double); 82 | var addAry = mapAry(addOne); 83 | ``` 84 | 85 | 我这里并没加校验,多个函数同时操作的情况,需要一种类似于管道的操作 compose,后面再讲。 86 | 87 | ### 用函数去封装 88 | 89 | 也是抽象的一种。我们平常接触的面向对象,封装是它的重要思想,但是在 JS 中,可以通过函数去封装。 90 | ```javascript 91 | function list() { 92 | var args = Array.prototype.slice.call(arguments, 0); 93 | 94 | var add = function(x) { 95 | args.push(x); 96 | return obj; 97 | } 98 | 99 | var getByIndex = function(index) { 100 | return args[index]; 101 | } 102 | 103 | var get = function (){ 104 | return args; 105 | } 106 | 107 | var obj = { 108 | get: get, 109 | add: add, 110 | getByIndex: getByIndex, 111 | } 112 | 113 | return obj; 114 | } 115 | 116 | var l = list(1, 2, 3); 117 | console.log(l.getByIndex(1)); 118 | console.log(l.add(4).get()); 119 | ``` 120 | JS 中使用函数去封装,主要是利用了闭包,把变量和方法有效的隐藏起来了,比如上面一个简单的序列 list,并在内部实现了几个方法,以及保存数据。 121 | 122 | 我只是在说明函数也是可以起到封装的效果,并不是说这就一定比面向对象的好,关于如何取舍,还是看你的需求,怎么才是最简单有效的,以及个人喜好。 123 | 124 | 125 | ### 以函数为行为单元 126 | 其实上面的栗子中,“翻倍”,add,getByIndex 这都是行为单元,是把某些“行为”操作,包装成了函数。 127 | 128 | [比较器](https://github.com/sunyongjian/FP-Code/blob/master/src/introduction/index.js) 129 | 130 | ### 数据抽象 131 | -------------------------------------------------------------------------------- /src/introduction/index.js: -------------------------------------------------------------------------------- 1 | const ary = [-1, -5, -33, -22, -1, 0, 2, 3, 22]; 2 | console.log(ary.sort()); 3 | // [ -1, -1, -22, -33, -5, 0, 2, 22, 3 ] 4 | // ary.sort,当 sort 中不传入比较器的时候,默认是按照字符编码的顺序排序,即第一个数字的顺序。 5 | // 当然这是有问题的。 6 | 7 | // 升序 8 | const compare = (x, y) => { 9 | if (x > y) return 1; 10 | if (x < y) return -1; 11 | return 0; 12 | }; 13 | // 比较器抽象成函数 14 | console.log(ary.sort(compare)); 15 | 16 | // [ -33, -22, -5, -1, -1, 0, 2, 3, 22 ] 17 | 18 | // but,这个 compare 函数不通用于比较,比如 19 | if (compare(1, 1)) { 20 | console.log('equal');// no log 21 | } 22 | 23 | // 把 等于或小于的比较 抽象成函数 24 | const thanOrEqual = (x, y) => x >= y; 25 | 26 | if (thanOrEqual(1, 1)) { 27 | console.log('thanOrEqual'); // thanOrEqual 28 | } 29 | 30 | // 改装成 sort 需要的比较器。它接收一个行为函数,返回 sort 所需的比较器函数,然后可以通过传入不同的 behavior,实现不同的比较器 31 | 32 | const compartor = behavior => (x, y) => { 33 | if (behavior(x, y)) return 1; 34 | return -1; 35 | }; 36 | 37 | console.log(ary.sort(compartor(thanOrEqual))); 38 | // [ -33, -22, -5, -1, -1, 0, 2, 3, 22 ] 39 | 40 | // 当然你也可以改成降序的 41 | 42 | const lessOrEqual = (x, y) => x <= y; 43 | 44 | console.log(ary.sort(compartor(lessOrEqual))); 45 | // [22, 3, 2, 0, -1, -1, -5, -22, -33] 46 | 47 | // thanOrEqual, lessOrEqual ... 等等的通用比较函数,不适用于 array.sort,通过中间函数 compartor 48 | // 把 return true/false 的结果,映射成为 1/-1/0,这样就可以被 sort 消费了。 49 | -------------------------------------------------------------------------------- /src/lambda/README.md: -------------------------------------------------------------------------------- 1 | ## 简介 2 | > Lambda 演算可比拟是最根本的编程语言,它包括了一条变换规则(变量替换)和一条将函数抽象化定义的方式。因此普遍公认是一种更接近软件而非硬件的方式。对函数式编程语言造成很大影响,比如Lisp、ML语言和Haskell语言。Lambda演算建立在函数的概念的基础上。纯粹的Lambda演算中,一切都是函数,连值的概念都没有。但是,我们可以用函数构建任何我们需要的东西。 3 | 4 | 所以我在研究函数式编程的时候,一定会搞清楚 lambda 演算到底是什么。 5 | 6 | ## Lambda演算的语法 7 | Lambda演算只有三类表达式: 8 | 9 | 函数定义:Lambda演算中的函数是一个表达式,写成:lambda x . body,表示“一个参数参数为x的函数,它的返回值为body的计算结果。” 这时我们说:Lambda表达式绑定了参数x。 10 | 标识符引用(Identifier reference):标识符引用就是一个名字,这个名字用于匹配函数表达式中的某个参数名。 11 | 函数应用(Function application):函数应用写成把函数值放到它的参数前面的形式,如(lambda x . plus x x) y。 -------------------------------------------------------------------------------- /src/recursion/README.md: -------------------------------------------------------------------------------- 1 | ## 递归 2 | > 函数中模拟循环的方式 -------------------------------------------------------------------------------- /src/utils.js: -------------------------------------------------------------------------------- 1 | const log = (...smt) => { 2 | console.log(...smt); 3 | }; 4 | 5 | const logger = (item, index) => { 6 | console.log(item, index); 7 | }; 8 | module.exports = { 9 | log, 10 | logger, 11 | }; 12 | -------------------------------------------------------------------------------- /test/pure.test.js: -------------------------------------------------------------------------------- 1 | import { expect } from 'chai'; 2 | import { 3 | triple, 4 | y2, 5 | tripleEffect, 6 | sayHi, 7 | upper, 8 | loudly, 9 | } from '../src/feature/pureFunction'; 10 | 11 | describe('get a triple result', () => { 12 | 13 | it('2 * 3 = 6', () => { 14 | expect(triple(2)).equal(6); 15 | }); 16 | it('tripleEffect', () => { // 非要测的话。把 tripleEffect 依赖的变量导出。但是如果依赖多个变量呢? 17 | tripleEffect(2); 18 | expect(y2).equal(6); 19 | }); 20 | }); 21 | 22 | describe('大声的喊你好', () => { 23 | it('get result', () => { 24 | const str1 = sayHi('tom'); 25 | expect(str1).equal('hi, tom'); 26 | 27 | const str2 = upper(str1); 28 | expect(str2).equal('Hi, tom'); 29 | 30 | const str3 = loudly(str2); 31 | expect(str3).equal('Hi, tom!'); 32 | }); 33 | }); 34 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | acorn-jsx@^3.0.0: 6 | version "3.0.1" 7 | resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" 8 | dependencies: 9 | acorn "^3.0.4" 10 | 11 | acorn@^3.0.4: 12 | version "3.3.0" 13 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" 14 | 15 | acorn@^5.1.1: 16 | version "5.1.2" 17 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.1.2.tgz#911cb53e036807cf0fa778dc5d370fbd864246d7" 18 | 19 | ajv-keywords@^1.0.0: 20 | version "1.5.1" 21 | resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.5.1.tgz#314dd0a4b3368fad3dfcdc54ede6171b886daf3c" 22 | 23 | ajv@^4.7.0: 24 | version "4.11.8" 25 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" 26 | dependencies: 27 | co "^4.6.0" 28 | json-stable-stringify "^1.0.1" 29 | 30 | ajv@^5.2.0: 31 | version "5.2.2" 32 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.2.2.tgz#47c68d69e86f5d953103b0074a9430dc63da5e39" 33 | dependencies: 34 | co "^4.6.0" 35 | fast-deep-equal "^1.0.0" 36 | json-schema-traverse "^0.3.0" 37 | json-stable-stringify "^1.0.1" 38 | 39 | ansi-escapes@^2.0.0: 40 | version "2.0.0" 41 | resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-2.0.0.tgz#5bae52be424878dd9783e8910e3fc2922e83c81b" 42 | 43 | ansi-regex@^2.0.0: 44 | version "2.1.1" 45 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 46 | 47 | ansi-regex@^3.0.0: 48 | version "3.0.0" 49 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" 50 | 51 | ansi-styles@^2.2.1: 52 | version "2.2.1" 53 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" 54 | 55 | ansi-styles@^3.1.0: 56 | version "3.2.0" 57 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.0.tgz#c159b8d5be0f9e5a6f346dab94f16ce022161b88" 58 | dependencies: 59 | color-convert "^1.9.0" 60 | 61 | argparse@^1.0.7: 62 | version "1.0.9" 63 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" 64 | dependencies: 65 | sprintf-js "~1.0.2" 66 | 67 | array-union@^1.0.1: 68 | version "1.0.2" 69 | resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" 70 | dependencies: 71 | array-uniq "^1.0.1" 72 | 73 | array-uniq@^1.0.1: 74 | version "1.0.3" 75 | resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" 76 | 77 | arrify@^1.0.0: 78 | version "1.0.1" 79 | resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" 80 | 81 | assertion-error@^1.0.1: 82 | version "1.0.2" 83 | resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.0.2.tgz#13ca515d86206da0bac66e834dd397d87581094c" 84 | 85 | babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: 86 | version "6.26.0" 87 | resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" 88 | dependencies: 89 | chalk "^1.1.3" 90 | esutils "^2.0.2" 91 | js-tokens "^3.0.2" 92 | 93 | babel-core@^6.26.0: 94 | version "6.26.0" 95 | resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.0.tgz#af32f78b31a6fcef119c87b0fd8d9753f03a0bb8" 96 | dependencies: 97 | babel-code-frame "^6.26.0" 98 | babel-generator "^6.26.0" 99 | babel-helpers "^6.24.1" 100 | babel-messages "^6.23.0" 101 | babel-register "^6.26.0" 102 | babel-runtime "^6.26.0" 103 | babel-template "^6.26.0" 104 | babel-traverse "^6.26.0" 105 | babel-types "^6.26.0" 106 | babylon "^6.18.0" 107 | convert-source-map "^1.5.0" 108 | debug "^2.6.8" 109 | json5 "^0.5.1" 110 | lodash "^4.17.4" 111 | minimatch "^3.0.4" 112 | path-is-absolute "^1.0.1" 113 | private "^0.1.7" 114 | slash "^1.0.0" 115 | source-map "^0.5.6" 116 | 117 | babel-generator@^6.26.0: 118 | version "6.26.0" 119 | resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.0.tgz#ac1ae20070b79f6e3ca1d3269613053774f20dc5" 120 | dependencies: 121 | babel-messages "^6.23.0" 122 | babel-runtime "^6.26.0" 123 | babel-types "^6.26.0" 124 | detect-indent "^4.0.0" 125 | jsesc "^1.3.0" 126 | lodash "^4.17.4" 127 | source-map "^0.5.6" 128 | trim-right "^1.0.1" 129 | 130 | babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: 131 | version "6.24.1" 132 | resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" 133 | dependencies: 134 | babel-helper-explode-assignable-expression "^6.24.1" 135 | babel-runtime "^6.22.0" 136 | babel-types "^6.24.1" 137 | 138 | babel-helper-call-delegate@^6.24.1: 139 | version "6.24.1" 140 | resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" 141 | dependencies: 142 | babel-helper-hoist-variables "^6.24.1" 143 | babel-runtime "^6.22.0" 144 | babel-traverse "^6.24.1" 145 | babel-types "^6.24.1" 146 | 147 | babel-helper-define-map@^6.24.1: 148 | version "6.26.0" 149 | resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f" 150 | dependencies: 151 | babel-helper-function-name "^6.24.1" 152 | babel-runtime "^6.26.0" 153 | babel-types "^6.26.0" 154 | lodash "^4.17.4" 155 | 156 | babel-helper-explode-assignable-expression@^6.24.1: 157 | version "6.24.1" 158 | resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" 159 | dependencies: 160 | babel-runtime "^6.22.0" 161 | babel-traverse "^6.24.1" 162 | babel-types "^6.24.1" 163 | 164 | babel-helper-function-name@^6.24.1: 165 | version "6.24.1" 166 | resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" 167 | dependencies: 168 | babel-helper-get-function-arity "^6.24.1" 169 | babel-runtime "^6.22.0" 170 | babel-template "^6.24.1" 171 | babel-traverse "^6.24.1" 172 | babel-types "^6.24.1" 173 | 174 | babel-helper-get-function-arity@^6.24.1: 175 | version "6.24.1" 176 | resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" 177 | dependencies: 178 | babel-runtime "^6.22.0" 179 | babel-types "^6.24.1" 180 | 181 | babel-helper-hoist-variables@^6.24.1: 182 | version "6.24.1" 183 | resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" 184 | dependencies: 185 | babel-runtime "^6.22.0" 186 | babel-types "^6.24.1" 187 | 188 | babel-helper-optimise-call-expression@^6.24.1: 189 | version "6.24.1" 190 | resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" 191 | dependencies: 192 | babel-runtime "^6.22.0" 193 | babel-types "^6.24.1" 194 | 195 | babel-helper-regex@^6.24.1: 196 | version "6.26.0" 197 | resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72" 198 | dependencies: 199 | babel-runtime "^6.26.0" 200 | babel-types "^6.26.0" 201 | lodash "^4.17.4" 202 | 203 | babel-helper-remap-async-to-generator@^6.24.1: 204 | version "6.24.1" 205 | resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" 206 | dependencies: 207 | babel-helper-function-name "^6.24.1" 208 | babel-runtime "^6.22.0" 209 | babel-template "^6.24.1" 210 | babel-traverse "^6.24.1" 211 | babel-types "^6.24.1" 212 | 213 | babel-helper-replace-supers@^6.24.1: 214 | version "6.24.1" 215 | resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" 216 | dependencies: 217 | babel-helper-optimise-call-expression "^6.24.1" 218 | babel-messages "^6.23.0" 219 | babel-runtime "^6.22.0" 220 | babel-template "^6.24.1" 221 | babel-traverse "^6.24.1" 222 | babel-types "^6.24.1" 223 | 224 | babel-helpers@^6.24.1: 225 | version "6.24.1" 226 | resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" 227 | dependencies: 228 | babel-runtime "^6.22.0" 229 | babel-template "^6.24.1" 230 | 231 | babel-messages@^6.23.0: 232 | version "6.23.0" 233 | resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" 234 | dependencies: 235 | babel-runtime "^6.22.0" 236 | 237 | babel-plugin-check-es2015-constants@^6.22.0: 238 | version "6.22.0" 239 | resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" 240 | dependencies: 241 | babel-runtime "^6.22.0" 242 | 243 | babel-plugin-syntax-async-functions@^6.8.0: 244 | version "6.13.0" 245 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" 246 | 247 | babel-plugin-syntax-exponentiation-operator@^6.8.0: 248 | version "6.13.0" 249 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" 250 | 251 | babel-plugin-syntax-trailing-function-commas@^6.22.0: 252 | version "6.22.0" 253 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" 254 | 255 | babel-plugin-transform-async-to-generator@^6.22.0: 256 | version "6.24.1" 257 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761" 258 | dependencies: 259 | babel-helper-remap-async-to-generator "^6.24.1" 260 | babel-plugin-syntax-async-functions "^6.8.0" 261 | babel-runtime "^6.22.0" 262 | 263 | babel-plugin-transform-es2015-arrow-functions@^6.22.0: 264 | version "6.22.0" 265 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" 266 | dependencies: 267 | babel-runtime "^6.22.0" 268 | 269 | babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: 270 | version "6.22.0" 271 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" 272 | dependencies: 273 | babel-runtime "^6.22.0" 274 | 275 | babel-plugin-transform-es2015-block-scoping@^6.23.0: 276 | version "6.26.0" 277 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" 278 | dependencies: 279 | babel-runtime "^6.26.0" 280 | babel-template "^6.26.0" 281 | babel-traverse "^6.26.0" 282 | babel-types "^6.26.0" 283 | lodash "^4.17.4" 284 | 285 | babel-plugin-transform-es2015-classes@^6.23.0: 286 | version "6.24.1" 287 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" 288 | dependencies: 289 | babel-helper-define-map "^6.24.1" 290 | babel-helper-function-name "^6.24.1" 291 | babel-helper-optimise-call-expression "^6.24.1" 292 | babel-helper-replace-supers "^6.24.1" 293 | babel-messages "^6.23.0" 294 | babel-runtime "^6.22.0" 295 | babel-template "^6.24.1" 296 | babel-traverse "^6.24.1" 297 | babel-types "^6.24.1" 298 | 299 | babel-plugin-transform-es2015-computed-properties@^6.22.0: 300 | version "6.24.1" 301 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" 302 | dependencies: 303 | babel-runtime "^6.22.0" 304 | babel-template "^6.24.1" 305 | 306 | babel-plugin-transform-es2015-destructuring@^6.23.0: 307 | version "6.23.0" 308 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" 309 | dependencies: 310 | babel-runtime "^6.22.0" 311 | 312 | babel-plugin-transform-es2015-duplicate-keys@^6.22.0: 313 | version "6.24.1" 314 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" 315 | dependencies: 316 | babel-runtime "^6.22.0" 317 | babel-types "^6.24.1" 318 | 319 | babel-plugin-transform-es2015-for-of@^6.23.0: 320 | version "6.23.0" 321 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" 322 | dependencies: 323 | babel-runtime "^6.22.0" 324 | 325 | babel-plugin-transform-es2015-function-name@^6.22.0: 326 | version "6.24.1" 327 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" 328 | dependencies: 329 | babel-helper-function-name "^6.24.1" 330 | babel-runtime "^6.22.0" 331 | babel-types "^6.24.1" 332 | 333 | babel-plugin-transform-es2015-literals@^6.22.0: 334 | version "6.22.0" 335 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" 336 | dependencies: 337 | babel-runtime "^6.22.0" 338 | 339 | babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015-modules-amd@^6.24.1: 340 | version "6.24.1" 341 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" 342 | dependencies: 343 | babel-plugin-transform-es2015-modules-commonjs "^6.24.1" 344 | babel-runtime "^6.22.0" 345 | babel-template "^6.24.1" 346 | 347 | babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1: 348 | version "6.26.0" 349 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz#0d8394029b7dc6abe1a97ef181e00758dd2e5d8a" 350 | dependencies: 351 | babel-plugin-transform-strict-mode "^6.24.1" 352 | babel-runtime "^6.26.0" 353 | babel-template "^6.26.0" 354 | babel-types "^6.26.0" 355 | 356 | babel-plugin-transform-es2015-modules-systemjs@^6.23.0: 357 | version "6.24.1" 358 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" 359 | dependencies: 360 | babel-helper-hoist-variables "^6.24.1" 361 | babel-runtime "^6.22.0" 362 | babel-template "^6.24.1" 363 | 364 | babel-plugin-transform-es2015-modules-umd@^6.23.0: 365 | version "6.24.1" 366 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" 367 | dependencies: 368 | babel-plugin-transform-es2015-modules-amd "^6.24.1" 369 | babel-runtime "^6.22.0" 370 | babel-template "^6.24.1" 371 | 372 | babel-plugin-transform-es2015-object-super@^6.22.0: 373 | version "6.24.1" 374 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" 375 | dependencies: 376 | babel-helper-replace-supers "^6.24.1" 377 | babel-runtime "^6.22.0" 378 | 379 | babel-plugin-transform-es2015-parameters@^6.23.0: 380 | version "6.24.1" 381 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" 382 | dependencies: 383 | babel-helper-call-delegate "^6.24.1" 384 | babel-helper-get-function-arity "^6.24.1" 385 | babel-runtime "^6.22.0" 386 | babel-template "^6.24.1" 387 | babel-traverse "^6.24.1" 388 | babel-types "^6.24.1" 389 | 390 | babel-plugin-transform-es2015-shorthand-properties@^6.22.0: 391 | version "6.24.1" 392 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" 393 | dependencies: 394 | babel-runtime "^6.22.0" 395 | babel-types "^6.24.1" 396 | 397 | babel-plugin-transform-es2015-spread@^6.22.0: 398 | version "6.22.0" 399 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" 400 | dependencies: 401 | babel-runtime "^6.22.0" 402 | 403 | babel-plugin-transform-es2015-sticky-regex@^6.22.0: 404 | version "6.24.1" 405 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" 406 | dependencies: 407 | babel-helper-regex "^6.24.1" 408 | babel-runtime "^6.22.0" 409 | babel-types "^6.24.1" 410 | 411 | babel-plugin-transform-es2015-template-literals@^6.22.0: 412 | version "6.22.0" 413 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" 414 | dependencies: 415 | babel-runtime "^6.22.0" 416 | 417 | babel-plugin-transform-es2015-typeof-symbol@^6.23.0: 418 | version "6.23.0" 419 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" 420 | dependencies: 421 | babel-runtime "^6.22.0" 422 | 423 | babel-plugin-transform-es2015-unicode-regex@^6.22.0: 424 | version "6.24.1" 425 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" 426 | dependencies: 427 | babel-helper-regex "^6.24.1" 428 | babel-runtime "^6.22.0" 429 | regexpu-core "^2.0.0" 430 | 431 | babel-plugin-transform-exponentiation-operator@^6.22.0: 432 | version "6.24.1" 433 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e" 434 | dependencies: 435 | babel-helper-builder-binary-assignment-operator-visitor "^6.24.1" 436 | babel-plugin-syntax-exponentiation-operator "^6.8.0" 437 | babel-runtime "^6.22.0" 438 | 439 | babel-plugin-transform-regenerator@^6.22.0: 440 | version "6.26.0" 441 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" 442 | dependencies: 443 | regenerator-transform "^0.10.0" 444 | 445 | babel-plugin-transform-runtime@^6.23.0: 446 | version "6.23.0" 447 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.23.0.tgz#88490d446502ea9b8e7efb0fe09ec4d99479b1ee" 448 | dependencies: 449 | babel-runtime "^6.22.0" 450 | 451 | babel-plugin-transform-strict-mode@^6.24.1: 452 | version "6.24.1" 453 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" 454 | dependencies: 455 | babel-runtime "^6.22.0" 456 | babel-types "^6.24.1" 457 | 458 | babel-preset-env@^1.6.0: 459 | version "1.6.0" 460 | resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.6.0.tgz#2de1c782a780a0a5d605d199c957596da43c44e4" 461 | dependencies: 462 | babel-plugin-check-es2015-constants "^6.22.0" 463 | babel-plugin-syntax-trailing-function-commas "^6.22.0" 464 | babel-plugin-transform-async-to-generator "^6.22.0" 465 | babel-plugin-transform-es2015-arrow-functions "^6.22.0" 466 | babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" 467 | babel-plugin-transform-es2015-block-scoping "^6.23.0" 468 | babel-plugin-transform-es2015-classes "^6.23.0" 469 | babel-plugin-transform-es2015-computed-properties "^6.22.0" 470 | babel-plugin-transform-es2015-destructuring "^6.23.0" 471 | babel-plugin-transform-es2015-duplicate-keys "^6.22.0" 472 | babel-plugin-transform-es2015-for-of "^6.23.0" 473 | babel-plugin-transform-es2015-function-name "^6.22.0" 474 | babel-plugin-transform-es2015-literals "^6.22.0" 475 | babel-plugin-transform-es2015-modules-amd "^6.22.0" 476 | babel-plugin-transform-es2015-modules-commonjs "^6.23.0" 477 | babel-plugin-transform-es2015-modules-systemjs "^6.23.0" 478 | babel-plugin-transform-es2015-modules-umd "^6.23.0" 479 | babel-plugin-transform-es2015-object-super "^6.22.0" 480 | babel-plugin-transform-es2015-parameters "^6.23.0" 481 | babel-plugin-transform-es2015-shorthand-properties "^6.22.0" 482 | babel-plugin-transform-es2015-spread "^6.22.0" 483 | babel-plugin-transform-es2015-sticky-regex "^6.22.0" 484 | babel-plugin-transform-es2015-template-literals "^6.22.0" 485 | babel-plugin-transform-es2015-typeof-symbol "^6.23.0" 486 | babel-plugin-transform-es2015-unicode-regex "^6.22.0" 487 | babel-plugin-transform-exponentiation-operator "^6.22.0" 488 | babel-plugin-transform-regenerator "^6.22.0" 489 | browserslist "^2.1.2" 490 | invariant "^2.2.2" 491 | semver "^5.3.0" 492 | 493 | babel-register@^6.26.0: 494 | version "6.26.0" 495 | resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" 496 | dependencies: 497 | babel-core "^6.26.0" 498 | babel-runtime "^6.26.0" 499 | core-js "^2.5.0" 500 | home-or-tmp "^2.0.0" 501 | lodash "^4.17.4" 502 | mkdirp "^0.5.1" 503 | source-map-support "^0.4.15" 504 | 505 | babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0: 506 | version "6.26.0" 507 | resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" 508 | dependencies: 509 | core-js "^2.4.0" 510 | regenerator-runtime "^0.11.0" 511 | 512 | babel-template@^6.24.1, babel-template@^6.26.0: 513 | version "6.26.0" 514 | resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" 515 | dependencies: 516 | babel-runtime "^6.26.0" 517 | babel-traverse "^6.26.0" 518 | babel-types "^6.26.0" 519 | babylon "^6.18.0" 520 | lodash "^4.17.4" 521 | 522 | babel-traverse@^6.24.1, babel-traverse@^6.26.0: 523 | version "6.26.0" 524 | resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" 525 | dependencies: 526 | babel-code-frame "^6.26.0" 527 | babel-messages "^6.23.0" 528 | babel-runtime "^6.26.0" 529 | babel-types "^6.26.0" 530 | babylon "^6.18.0" 531 | debug "^2.6.8" 532 | globals "^9.18.0" 533 | invariant "^2.2.2" 534 | lodash "^4.17.4" 535 | 536 | babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: 537 | version "6.26.0" 538 | resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" 539 | dependencies: 540 | babel-runtime "^6.26.0" 541 | esutils "^2.0.2" 542 | lodash "^4.17.4" 543 | to-fast-properties "^1.0.3" 544 | 545 | babylon@^6.18.0: 546 | version "6.18.0" 547 | resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" 548 | 549 | balanced-match@^1.0.0: 550 | version "1.0.0" 551 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 552 | 553 | brace-expansion@^1.1.7: 554 | version "1.1.8" 555 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" 556 | dependencies: 557 | balanced-match "^1.0.0" 558 | concat-map "0.0.1" 559 | 560 | browser-stdout@1.3.0: 561 | version "1.3.0" 562 | resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.0.tgz#f351d32969d32fa5d7a5567154263d928ae3bd1f" 563 | 564 | browserslist@^2.1.2: 565 | version "2.4.0" 566 | resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-2.4.0.tgz#693ee93d01e66468a6348da5498e011f578f87f8" 567 | dependencies: 568 | caniuse-lite "^1.0.30000718" 569 | electron-to-chromium "^1.3.18" 570 | 571 | builtin-modules@^1.0.0, builtin-modules@^1.1.1: 572 | version "1.1.1" 573 | resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" 574 | 575 | caller-path@^0.1.0: 576 | version "0.1.0" 577 | resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" 578 | dependencies: 579 | callsites "^0.2.0" 580 | 581 | callsites@^0.2.0: 582 | version "0.2.0" 583 | resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" 584 | 585 | caniuse-lite@^1.0.30000718: 586 | version "1.0.30000731" 587 | resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000731.tgz#6f2b9096285af3c7bcf2abe39647bb525d68c842" 588 | 589 | chai@^4.1.2: 590 | version "4.1.2" 591 | resolved "https://registry.yarnpkg.com/chai/-/chai-4.1.2.tgz#0f64584ba642f0f2ace2806279f4f06ca23ad73c" 592 | dependencies: 593 | assertion-error "^1.0.1" 594 | check-error "^1.0.1" 595 | deep-eql "^3.0.0" 596 | get-func-name "^2.0.0" 597 | pathval "^1.0.0" 598 | type-detect "^4.0.0" 599 | 600 | chalk@^1.1.1, chalk@^1.1.3: 601 | version "1.1.3" 602 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" 603 | dependencies: 604 | ansi-styles "^2.2.1" 605 | escape-string-regexp "^1.0.2" 606 | has-ansi "^2.0.0" 607 | strip-ansi "^3.0.0" 608 | supports-color "^2.0.0" 609 | 610 | chalk@^2.0.0, chalk@^2.1.0: 611 | version "2.1.0" 612 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.1.0.tgz#ac5becf14fa21b99c6c92ca7a7d7cfd5b17e743e" 613 | dependencies: 614 | ansi-styles "^3.1.0" 615 | escape-string-regexp "^1.0.5" 616 | supports-color "^4.0.0" 617 | 618 | check-error@^1.0.1: 619 | version "1.0.2" 620 | resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" 621 | 622 | circular-json@^0.3.1: 623 | version "0.3.3" 624 | resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" 625 | 626 | cli-cursor@^2.1.0: 627 | version "2.1.0" 628 | resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" 629 | dependencies: 630 | restore-cursor "^2.0.0" 631 | 632 | cli-width@^2.0.0: 633 | version "2.2.0" 634 | resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" 635 | 636 | co@^4.6.0: 637 | version "4.6.0" 638 | resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" 639 | 640 | color-convert@^1.9.0: 641 | version "1.9.0" 642 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.0.tgz#1accf97dd739b983bf994d56fec8f95853641b7a" 643 | dependencies: 644 | color-name "^1.1.1" 645 | 646 | color-name@^1.1.1: 647 | version "1.1.3" 648 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 649 | 650 | commander@2.9.0: 651 | version "2.9.0" 652 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" 653 | dependencies: 654 | graceful-readlink ">= 1.0.0" 655 | 656 | concat-map@0.0.1: 657 | version "0.0.1" 658 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 659 | 660 | concat-stream@^1.6.0: 661 | version "1.6.0" 662 | resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" 663 | dependencies: 664 | inherits "^2.0.3" 665 | readable-stream "^2.2.2" 666 | typedarray "^0.0.6" 667 | 668 | contains-path@^0.1.0: 669 | version "0.1.0" 670 | resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" 671 | 672 | convert-source-map@^1.5.0: 673 | version "1.5.0" 674 | resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5" 675 | 676 | core-js@^2.4.0, core-js@^2.5.0: 677 | version "2.5.1" 678 | resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.1.tgz#ae6874dc66937789b80754ff5428df66819ca50b" 679 | 680 | core-util-is@~1.0.0: 681 | version "1.0.2" 682 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 683 | 684 | cross-spawn@^5.1.0: 685 | version "5.1.0" 686 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" 687 | dependencies: 688 | lru-cache "^4.0.1" 689 | shebang-command "^1.2.0" 690 | which "^1.2.9" 691 | 692 | debug@2.6.8, debug@^2.6.8: 693 | version "2.6.8" 694 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc" 695 | dependencies: 696 | ms "2.0.0" 697 | 698 | deep-eql@^3.0.0: 699 | version "3.0.1" 700 | resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" 701 | dependencies: 702 | type-detect "^4.0.0" 703 | 704 | deep-is@~0.1.3: 705 | version "0.1.3" 706 | resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" 707 | 708 | del@^2.0.2: 709 | version "2.2.2" 710 | resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" 711 | dependencies: 712 | globby "^5.0.0" 713 | is-path-cwd "^1.0.0" 714 | is-path-in-cwd "^1.0.0" 715 | object-assign "^4.0.1" 716 | pify "^2.0.0" 717 | pinkie-promise "^2.0.0" 718 | rimraf "^2.2.8" 719 | 720 | detect-indent@^4.0.0: 721 | version "4.0.0" 722 | resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" 723 | dependencies: 724 | repeating "^2.0.0" 725 | 726 | diff@3.2.0: 727 | version "3.2.0" 728 | resolved "https://registry.yarnpkg.com/diff/-/diff-3.2.0.tgz#c9ce393a4b7cbd0b058a725c93df299027868ff9" 729 | 730 | doctrine@1.5.0: 731 | version "1.5.0" 732 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" 733 | dependencies: 734 | esutils "^2.0.2" 735 | isarray "^1.0.0" 736 | 737 | doctrine@^2.0.0: 738 | version "2.0.0" 739 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.0.0.tgz#c73d8d2909d22291e1a007a395804da8b665fe63" 740 | dependencies: 741 | esutils "^2.0.2" 742 | isarray "^1.0.0" 743 | 744 | electron-to-chromium@^1.3.18: 745 | version "1.3.21" 746 | resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.21.tgz#a967ebdcfe8ed0083fc244d1894022a8e8113ea2" 747 | 748 | error-ex@^1.2.0: 749 | version "1.3.1" 750 | resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" 751 | dependencies: 752 | is-arrayish "^0.2.1" 753 | 754 | escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: 755 | version "1.0.5" 756 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 757 | 758 | eslint-config-airbnb-base@^11.3.0, eslint-config-airbnb-base@^11.3.1: 759 | version "11.3.2" 760 | resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-11.3.2.tgz#8703b11abe3c88ac7ec2b745b7fdf52e00ae680a" 761 | dependencies: 762 | eslint-restricted-globals "^0.1.1" 763 | 764 | eslint-config-airbnb@^15.1.0: 765 | version "15.1.0" 766 | resolved "https://registry.yarnpkg.com/eslint-config-airbnb/-/eslint-config-airbnb-15.1.0.tgz#fd432965a906e30139001ba830f58f73aeddae8e" 767 | dependencies: 768 | eslint-config-airbnb-base "^11.3.0" 769 | 770 | eslint-import-resolver-node@^0.3.1: 771 | version "0.3.1" 772 | resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.1.tgz#4422574cde66a9a7b099938ee4d508a199e0e3cc" 773 | dependencies: 774 | debug "^2.6.8" 775 | resolve "^1.2.0" 776 | 777 | eslint-module-utils@^2.1.1: 778 | version "2.1.1" 779 | resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.1.1.tgz#abaec824177613b8a95b299639e1b6facf473449" 780 | dependencies: 781 | debug "^2.6.8" 782 | pkg-dir "^1.0.0" 783 | 784 | eslint-plugin-import@^2.7.0: 785 | version "2.7.0" 786 | resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.7.0.tgz#21de33380b9efb55f5ef6d2e210ec0e07e7fa69f" 787 | dependencies: 788 | builtin-modules "^1.1.1" 789 | contains-path "^0.1.0" 790 | debug "^2.6.8" 791 | doctrine "1.5.0" 792 | eslint-import-resolver-node "^0.3.1" 793 | eslint-module-utils "^2.1.1" 794 | has "^1.0.1" 795 | lodash.cond "^4.3.0" 796 | minimatch "^3.0.3" 797 | read-pkg-up "^2.0.0" 798 | 799 | eslint-restricted-globals@^0.1.1: 800 | version "0.1.1" 801 | resolved "https://registry.yarnpkg.com/eslint-restricted-globals/-/eslint-restricted-globals-0.1.1.tgz#35f0d5cbc64c2e3ed62e93b4b1a7af05ba7ed4d7" 802 | 803 | eslint-scope@^3.7.1: 804 | version "3.7.1" 805 | resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8" 806 | dependencies: 807 | esrecurse "^4.1.0" 808 | estraverse "^4.1.1" 809 | 810 | eslint@^4.3.0: 811 | version "4.6.1" 812 | resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.6.1.tgz#ddc7fc7fd70bf93205b0b3449bb16a1e9e7d4950" 813 | dependencies: 814 | ajv "^5.2.0" 815 | babel-code-frame "^6.22.0" 816 | chalk "^2.1.0" 817 | concat-stream "^1.6.0" 818 | cross-spawn "^5.1.0" 819 | debug "^2.6.8" 820 | doctrine "^2.0.0" 821 | eslint-scope "^3.7.1" 822 | espree "^3.5.0" 823 | esquery "^1.0.0" 824 | estraverse "^4.2.0" 825 | esutils "^2.0.2" 826 | file-entry-cache "^2.0.0" 827 | functional-red-black-tree "^1.0.1" 828 | glob "^7.1.2" 829 | globals "^9.17.0" 830 | ignore "^3.3.3" 831 | imurmurhash "^0.1.4" 832 | inquirer "^3.0.6" 833 | is-resolvable "^1.0.0" 834 | js-yaml "^3.9.1" 835 | json-stable-stringify "^1.0.1" 836 | levn "^0.3.0" 837 | lodash "^4.17.4" 838 | minimatch "^3.0.2" 839 | mkdirp "^0.5.1" 840 | natural-compare "^1.4.0" 841 | optionator "^0.8.2" 842 | path-is-inside "^1.0.2" 843 | pluralize "^4.0.0" 844 | progress "^2.0.0" 845 | require-uncached "^1.0.3" 846 | semver "^5.3.0" 847 | strip-ansi "^4.0.0" 848 | strip-json-comments "~2.0.1" 849 | table "^4.0.1" 850 | text-table "~0.2.0" 851 | 852 | espree@^3.5.0: 853 | version "3.5.0" 854 | resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.0.tgz#98358625bdd055861ea27e2867ea729faf463d8d" 855 | dependencies: 856 | acorn "^5.1.1" 857 | acorn-jsx "^3.0.0" 858 | 859 | esprima@^4.0.0: 860 | version "4.0.0" 861 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" 862 | 863 | esquery@^1.0.0: 864 | version "1.0.0" 865 | resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.0.tgz#cfba8b57d7fba93f17298a8a006a04cda13d80fa" 866 | dependencies: 867 | estraverse "^4.0.0" 868 | 869 | esrecurse@^4.1.0: 870 | version "4.2.0" 871 | resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.0.tgz#fa9568d98d3823f9a41d91e902dcab9ea6e5b163" 872 | dependencies: 873 | estraverse "^4.1.0" 874 | object-assign "^4.0.1" 875 | 876 | estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: 877 | version "4.2.0" 878 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" 879 | 880 | esutils@^2.0.2: 881 | version "2.0.2" 882 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" 883 | 884 | external-editor@^2.0.4: 885 | version "2.0.4" 886 | resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.0.4.tgz#1ed9199da9cbfe2ef2f7a31b2fde8b0d12368972" 887 | dependencies: 888 | iconv-lite "^0.4.17" 889 | jschardet "^1.4.2" 890 | tmp "^0.0.31" 891 | 892 | fast-deep-equal@^1.0.0: 893 | version "1.0.0" 894 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz#96256a3bc975595eb36d82e9929d060d893439ff" 895 | 896 | fast-levenshtein@~2.0.4: 897 | version "2.0.6" 898 | resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" 899 | 900 | figures@^2.0.0: 901 | version "2.0.0" 902 | resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" 903 | dependencies: 904 | escape-string-regexp "^1.0.5" 905 | 906 | file-entry-cache@^2.0.0: 907 | version "2.0.0" 908 | resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" 909 | dependencies: 910 | flat-cache "^1.2.1" 911 | object-assign "^4.0.1" 912 | 913 | find-up@^1.0.0: 914 | version "1.1.2" 915 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" 916 | dependencies: 917 | path-exists "^2.0.0" 918 | pinkie-promise "^2.0.0" 919 | 920 | find-up@^2.0.0: 921 | version "2.1.0" 922 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" 923 | dependencies: 924 | locate-path "^2.0.0" 925 | 926 | flat-cache@^1.2.1: 927 | version "1.2.2" 928 | resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.2.2.tgz#fa86714e72c21db88601761ecf2f555d1abc6b96" 929 | dependencies: 930 | circular-json "^0.3.1" 931 | del "^2.0.2" 932 | graceful-fs "^4.1.2" 933 | write "^0.2.1" 934 | 935 | fs.realpath@^1.0.0: 936 | version "1.0.0" 937 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 938 | 939 | function-bind@^1.0.2: 940 | version "1.1.1" 941 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 942 | 943 | functional-red-black-tree@^1.0.1: 944 | version "1.0.1" 945 | resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" 946 | 947 | get-func-name@^2.0.0: 948 | version "2.0.0" 949 | resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" 950 | 951 | glob@7.1.1: 952 | version "7.1.1" 953 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" 954 | dependencies: 955 | fs.realpath "^1.0.0" 956 | inflight "^1.0.4" 957 | inherits "2" 958 | minimatch "^3.0.2" 959 | once "^1.3.0" 960 | path-is-absolute "^1.0.0" 961 | 962 | glob@^7.0.3, glob@^7.0.5, glob@^7.1.2: 963 | version "7.1.2" 964 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" 965 | dependencies: 966 | fs.realpath "^1.0.0" 967 | inflight "^1.0.4" 968 | inherits "2" 969 | minimatch "^3.0.4" 970 | once "^1.3.0" 971 | path-is-absolute "^1.0.0" 972 | 973 | globals@^9.17.0, globals@^9.18.0: 974 | version "9.18.0" 975 | resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" 976 | 977 | globby@^5.0.0: 978 | version "5.0.0" 979 | resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" 980 | dependencies: 981 | array-union "^1.0.1" 982 | arrify "^1.0.0" 983 | glob "^7.0.3" 984 | object-assign "^4.0.1" 985 | pify "^2.0.0" 986 | pinkie-promise "^2.0.0" 987 | 988 | graceful-fs@^4.1.2: 989 | version "4.1.11" 990 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" 991 | 992 | "graceful-readlink@>= 1.0.0": 993 | version "1.0.1" 994 | resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" 995 | 996 | growl@1.9.2: 997 | version "1.9.2" 998 | resolved "https://registry.yarnpkg.com/growl/-/growl-1.9.2.tgz#0ea7743715db8d8de2c5ede1775e1b45ac85c02f" 999 | 1000 | has-ansi@^2.0.0: 1001 | version "2.0.0" 1002 | resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" 1003 | dependencies: 1004 | ansi-regex "^2.0.0" 1005 | 1006 | has-flag@^1.0.0: 1007 | version "1.0.0" 1008 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" 1009 | 1010 | has-flag@^2.0.0: 1011 | version "2.0.0" 1012 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" 1013 | 1014 | has@^1.0.1: 1015 | version "1.0.1" 1016 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28" 1017 | dependencies: 1018 | function-bind "^1.0.2" 1019 | 1020 | he@1.1.1: 1021 | version "1.1.1" 1022 | resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" 1023 | 1024 | home-or-tmp@^2.0.0: 1025 | version "2.0.0" 1026 | resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" 1027 | dependencies: 1028 | os-homedir "^1.0.0" 1029 | os-tmpdir "^1.0.1" 1030 | 1031 | hosted-git-info@^2.1.4: 1032 | version "2.5.0" 1033 | resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.5.0.tgz#6d60e34b3abbc8313062c3b798ef8d901a07af3c" 1034 | 1035 | iconv-lite@^0.4.17: 1036 | version "0.4.19" 1037 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" 1038 | 1039 | ignore@^3.3.3: 1040 | version "3.3.5" 1041 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.5.tgz#c4e715455f6073a8d7e5dae72d2fc9d71663dba6" 1042 | 1043 | immutable@^3.8.1: 1044 | version "3.8.1" 1045 | resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.8.1.tgz#200807f11ab0f72710ea485542de088075f68cd2" 1046 | 1047 | imurmurhash@^0.1.4: 1048 | version "0.1.4" 1049 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 1050 | 1051 | inflight@^1.0.4: 1052 | version "1.0.6" 1053 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 1054 | dependencies: 1055 | once "^1.3.0" 1056 | wrappy "1" 1057 | 1058 | inherits@2, inherits@^2.0.3, inherits@~2.0.3: 1059 | version "2.0.3" 1060 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 1061 | 1062 | inquirer@^3.0.6: 1063 | version "3.2.3" 1064 | resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.2.3.tgz#1c7b1731cf77b934ec47d22c9ac5aa8fe7fbe095" 1065 | dependencies: 1066 | ansi-escapes "^2.0.0" 1067 | chalk "^2.0.0" 1068 | cli-cursor "^2.1.0" 1069 | cli-width "^2.0.0" 1070 | external-editor "^2.0.4" 1071 | figures "^2.0.0" 1072 | lodash "^4.3.0" 1073 | mute-stream "0.0.7" 1074 | run-async "^2.2.0" 1075 | rx-lite "^4.0.8" 1076 | rx-lite-aggregates "^4.0.8" 1077 | string-width "^2.1.0" 1078 | strip-ansi "^4.0.0" 1079 | through "^2.3.6" 1080 | 1081 | invariant@^2.2.2: 1082 | version "2.2.2" 1083 | resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" 1084 | dependencies: 1085 | loose-envify "^1.0.0" 1086 | 1087 | is-arrayish@^0.2.1: 1088 | version "0.2.1" 1089 | resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" 1090 | 1091 | is-builtin-module@^1.0.0: 1092 | version "1.0.0" 1093 | resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" 1094 | dependencies: 1095 | builtin-modules "^1.0.0" 1096 | 1097 | is-finite@^1.0.0: 1098 | version "1.0.2" 1099 | resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" 1100 | dependencies: 1101 | number-is-nan "^1.0.0" 1102 | 1103 | is-fullwidth-code-point@^2.0.0: 1104 | version "2.0.0" 1105 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 1106 | 1107 | is-path-cwd@^1.0.0: 1108 | version "1.0.0" 1109 | resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" 1110 | 1111 | is-path-in-cwd@^1.0.0: 1112 | version "1.0.0" 1113 | resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003be8a9eac04dc" 1114 | dependencies: 1115 | is-path-inside "^1.0.0" 1116 | 1117 | is-path-inside@^1.0.0: 1118 | version "1.0.0" 1119 | resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.0.tgz#fc06e5a1683fbda13de667aff717bbc10a48f37f" 1120 | dependencies: 1121 | path-is-inside "^1.0.1" 1122 | 1123 | is-promise@^2.1.0: 1124 | version "2.1.0" 1125 | resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" 1126 | 1127 | is-resolvable@^1.0.0: 1128 | version "1.0.0" 1129 | resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.0.0.tgz#8df57c61ea2e3c501408d100fb013cf8d6e0cc62" 1130 | dependencies: 1131 | tryit "^1.0.1" 1132 | 1133 | isarray@^1.0.0, isarray@~1.0.0: 1134 | version "1.0.0" 1135 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 1136 | 1137 | isexe@^2.0.0: 1138 | version "2.0.0" 1139 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 1140 | 1141 | js-tokens@^3.0.0, js-tokens@^3.0.2: 1142 | version "3.0.2" 1143 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" 1144 | 1145 | js-yaml@^3.9.1: 1146 | version "3.10.0" 1147 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc" 1148 | dependencies: 1149 | argparse "^1.0.7" 1150 | esprima "^4.0.0" 1151 | 1152 | jschardet@^1.4.2: 1153 | version "1.5.1" 1154 | resolved "https://registry.yarnpkg.com/jschardet/-/jschardet-1.5.1.tgz#c519f629f86b3a5bedba58a88d311309eec097f9" 1155 | 1156 | jsesc@^1.3.0: 1157 | version "1.3.0" 1158 | resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" 1159 | 1160 | jsesc@~0.5.0: 1161 | version "0.5.0" 1162 | resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" 1163 | 1164 | json-schema-traverse@^0.3.0: 1165 | version "0.3.1" 1166 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" 1167 | 1168 | json-stable-stringify@^1.0.1: 1169 | version "1.0.1" 1170 | resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" 1171 | dependencies: 1172 | jsonify "~0.0.0" 1173 | 1174 | json3@3.3.2: 1175 | version "3.3.2" 1176 | resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" 1177 | 1178 | json5@^0.5.1: 1179 | version "0.5.1" 1180 | resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" 1181 | 1182 | jsonify@~0.0.0: 1183 | version "0.0.0" 1184 | resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" 1185 | 1186 | levn@^0.3.0, levn@~0.3.0: 1187 | version "0.3.0" 1188 | resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" 1189 | dependencies: 1190 | prelude-ls "~1.1.2" 1191 | type-check "~0.3.2" 1192 | 1193 | load-json-file@^2.0.0: 1194 | version "2.0.0" 1195 | resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" 1196 | dependencies: 1197 | graceful-fs "^4.1.2" 1198 | parse-json "^2.2.0" 1199 | pify "^2.0.0" 1200 | strip-bom "^3.0.0" 1201 | 1202 | locate-path@^2.0.0: 1203 | version "2.0.0" 1204 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" 1205 | dependencies: 1206 | p-locate "^2.0.0" 1207 | path-exists "^3.0.0" 1208 | 1209 | lodash._baseassign@^3.0.0: 1210 | version "3.2.0" 1211 | resolved "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e" 1212 | dependencies: 1213 | lodash._basecopy "^3.0.0" 1214 | lodash.keys "^3.0.0" 1215 | 1216 | lodash._basecopy@^3.0.0: 1217 | version "3.0.1" 1218 | resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" 1219 | 1220 | lodash._basecreate@^3.0.0: 1221 | version "3.0.3" 1222 | resolved "https://registry.yarnpkg.com/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz#1bc661614daa7fc311b7d03bf16806a0213cf821" 1223 | 1224 | lodash._getnative@^3.0.0: 1225 | version "3.9.1" 1226 | resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" 1227 | 1228 | lodash._isiterateecall@^3.0.0: 1229 | version "3.0.9" 1230 | resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" 1231 | 1232 | lodash.cond@^4.3.0: 1233 | version "4.5.2" 1234 | resolved "https://registry.yarnpkg.com/lodash.cond/-/lodash.cond-4.5.2.tgz#f471a1da486be60f6ab955d17115523dd1d255d5" 1235 | 1236 | lodash.create@3.1.1: 1237 | version "3.1.1" 1238 | resolved "https://registry.yarnpkg.com/lodash.create/-/lodash.create-3.1.1.tgz#d7f2849f0dbda7e04682bb8cd72ab022461debe7" 1239 | dependencies: 1240 | lodash._baseassign "^3.0.0" 1241 | lodash._basecreate "^3.0.0" 1242 | lodash._isiterateecall "^3.0.0" 1243 | 1244 | lodash.isarguments@^3.0.0: 1245 | version "3.1.0" 1246 | resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" 1247 | 1248 | lodash.isarray@^3.0.0: 1249 | version "3.0.4" 1250 | resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" 1251 | 1252 | lodash.keys@^3.0.0: 1253 | version "3.1.2" 1254 | resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" 1255 | dependencies: 1256 | lodash._getnative "^3.0.0" 1257 | lodash.isarguments "^3.0.0" 1258 | lodash.isarray "^3.0.0" 1259 | 1260 | lodash@^4.0.0, lodash@^4.17.4, lodash@^4.3.0: 1261 | version "4.17.4" 1262 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" 1263 | 1264 | loose-envify@^1.0.0: 1265 | version "1.3.1" 1266 | resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" 1267 | dependencies: 1268 | js-tokens "^3.0.0" 1269 | 1270 | lru-cache@^4.0.1: 1271 | version "4.1.1" 1272 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55" 1273 | dependencies: 1274 | pseudomap "^1.0.2" 1275 | yallist "^2.1.2" 1276 | 1277 | mimic-fn@^1.0.0: 1278 | version "1.1.0" 1279 | resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.1.0.tgz#e667783d92e89dbd342818b5230b9d62a672ad18" 1280 | 1281 | minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4: 1282 | version "3.0.4" 1283 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 1284 | dependencies: 1285 | brace-expansion "^1.1.7" 1286 | 1287 | minimist@0.0.8: 1288 | version "0.0.8" 1289 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 1290 | 1291 | mkdirp@0.5.1, mkdirp@^0.5.1: 1292 | version "0.5.1" 1293 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 1294 | dependencies: 1295 | minimist "0.0.8" 1296 | 1297 | mocha@^3.5.0: 1298 | version "3.5.2" 1299 | resolved "https://registry.yarnpkg.com/mocha/-/mocha-3.5.2.tgz#3d5585cc6bd9e43a7c0bd251631abc0fbea0f032" 1300 | dependencies: 1301 | browser-stdout "1.3.0" 1302 | commander "2.9.0" 1303 | debug "2.6.8" 1304 | diff "3.2.0" 1305 | escape-string-regexp "1.0.5" 1306 | glob "7.1.1" 1307 | growl "1.9.2" 1308 | he "1.1.1" 1309 | json3 "3.3.2" 1310 | lodash.create "3.1.1" 1311 | mkdirp "0.5.1" 1312 | supports-color "3.1.2" 1313 | 1314 | ms@2.0.0: 1315 | version "2.0.0" 1316 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 1317 | 1318 | mute-stream@0.0.7: 1319 | version "0.0.7" 1320 | resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" 1321 | 1322 | natural-compare@^1.4.0: 1323 | version "1.4.0" 1324 | resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" 1325 | 1326 | normalize-package-data@^2.3.2: 1327 | version "2.4.0" 1328 | resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" 1329 | dependencies: 1330 | hosted-git-info "^2.1.4" 1331 | is-builtin-module "^1.0.0" 1332 | semver "2 || 3 || 4 || 5" 1333 | validate-npm-package-license "^3.0.1" 1334 | 1335 | number-is-nan@^1.0.0: 1336 | version "1.0.1" 1337 | resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" 1338 | 1339 | object-assign@^4.0.1: 1340 | version "4.1.1" 1341 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 1342 | 1343 | once@^1.3.0: 1344 | version "1.4.0" 1345 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1346 | dependencies: 1347 | wrappy "1" 1348 | 1349 | onetime@^2.0.0: 1350 | version "2.0.1" 1351 | resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" 1352 | dependencies: 1353 | mimic-fn "^1.0.0" 1354 | 1355 | optionator@^0.8.2: 1356 | version "0.8.2" 1357 | resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" 1358 | dependencies: 1359 | deep-is "~0.1.3" 1360 | fast-levenshtein "~2.0.4" 1361 | levn "~0.3.0" 1362 | prelude-ls "~1.1.2" 1363 | type-check "~0.3.2" 1364 | wordwrap "~1.0.0" 1365 | 1366 | os-homedir@^1.0.0: 1367 | version "1.0.2" 1368 | resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" 1369 | 1370 | os-tmpdir@^1.0.1, os-tmpdir@~1.0.1: 1371 | version "1.0.2" 1372 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 1373 | 1374 | p-limit@^1.1.0: 1375 | version "1.1.0" 1376 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.1.0.tgz#b07ff2d9a5d88bec806035895a2bab66a27988bc" 1377 | 1378 | p-locate@^2.0.0: 1379 | version "2.0.0" 1380 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" 1381 | dependencies: 1382 | p-limit "^1.1.0" 1383 | 1384 | parse-json@^2.2.0: 1385 | version "2.2.0" 1386 | resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" 1387 | dependencies: 1388 | error-ex "^1.2.0" 1389 | 1390 | path-exists@^2.0.0: 1391 | version "2.1.0" 1392 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" 1393 | dependencies: 1394 | pinkie-promise "^2.0.0" 1395 | 1396 | path-exists@^3.0.0: 1397 | version "3.0.0" 1398 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" 1399 | 1400 | path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: 1401 | version "1.0.1" 1402 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1403 | 1404 | path-is-inside@^1.0.1, path-is-inside@^1.0.2: 1405 | version "1.0.2" 1406 | resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" 1407 | 1408 | path-parse@^1.0.5: 1409 | version "1.0.5" 1410 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" 1411 | 1412 | path-type@^2.0.0: 1413 | version "2.0.0" 1414 | resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" 1415 | dependencies: 1416 | pify "^2.0.0" 1417 | 1418 | pathval@^1.0.0: 1419 | version "1.1.0" 1420 | resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0" 1421 | 1422 | pify@^2.0.0: 1423 | version "2.3.0" 1424 | resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" 1425 | 1426 | pinkie-promise@^2.0.0: 1427 | version "2.0.1" 1428 | resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" 1429 | dependencies: 1430 | pinkie "^2.0.0" 1431 | 1432 | pinkie@^2.0.0: 1433 | version "2.0.4" 1434 | resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" 1435 | 1436 | pkg-dir@^1.0.0: 1437 | version "1.0.0" 1438 | resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" 1439 | dependencies: 1440 | find-up "^1.0.0" 1441 | 1442 | pluralize@^4.0.0: 1443 | version "4.0.0" 1444 | resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-4.0.0.tgz#59b708c1c0190a2f692f1c7618c446b052fd1762" 1445 | 1446 | prelude-ls@~1.1.2: 1447 | version "1.1.2" 1448 | resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" 1449 | 1450 | private@^0.1.6, private@^0.1.7: 1451 | version "0.1.7" 1452 | resolved "https://registry.yarnpkg.com/private/-/private-0.1.7.tgz#68ce5e8a1ef0a23bb570cc28537b5332aba63ef1" 1453 | 1454 | process-nextick-args@~1.0.6: 1455 | version "1.0.7" 1456 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" 1457 | 1458 | progress@^2.0.0: 1459 | version "2.0.0" 1460 | resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" 1461 | 1462 | pseudomap@^1.0.2: 1463 | version "1.0.2" 1464 | resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" 1465 | 1466 | read-pkg-up@^2.0.0: 1467 | version "2.0.0" 1468 | resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" 1469 | dependencies: 1470 | find-up "^2.0.0" 1471 | read-pkg "^2.0.0" 1472 | 1473 | read-pkg@^2.0.0: 1474 | version "2.0.0" 1475 | resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" 1476 | dependencies: 1477 | load-json-file "^2.0.0" 1478 | normalize-package-data "^2.3.2" 1479 | path-type "^2.0.0" 1480 | 1481 | readable-stream@^2.2.2: 1482 | version "2.3.3" 1483 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" 1484 | dependencies: 1485 | core-util-is "~1.0.0" 1486 | inherits "~2.0.3" 1487 | isarray "~1.0.0" 1488 | process-nextick-args "~1.0.6" 1489 | safe-buffer "~5.1.1" 1490 | string_decoder "~1.0.3" 1491 | util-deprecate "~1.0.1" 1492 | 1493 | regenerate@^1.2.1: 1494 | version "1.3.2" 1495 | resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.2.tgz#d1941c67bad437e1be76433add5b385f95b19260" 1496 | 1497 | regenerator-runtime@^0.11.0: 1498 | version "0.11.0" 1499 | resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz#7e54fe5b5ccd5d6624ea6255c3473be090b802e1" 1500 | 1501 | regenerator-transform@^0.10.0: 1502 | version "0.10.1" 1503 | resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" 1504 | dependencies: 1505 | babel-runtime "^6.18.0" 1506 | babel-types "^6.19.0" 1507 | private "^0.1.6" 1508 | 1509 | regexpu-core@^2.0.0: 1510 | version "2.0.0" 1511 | resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" 1512 | dependencies: 1513 | regenerate "^1.2.1" 1514 | regjsgen "^0.2.0" 1515 | regjsparser "^0.1.4" 1516 | 1517 | regjsgen@^0.2.0: 1518 | version "0.2.0" 1519 | resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" 1520 | 1521 | regjsparser@^0.1.4: 1522 | version "0.1.5" 1523 | resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" 1524 | dependencies: 1525 | jsesc "~0.5.0" 1526 | 1527 | repeating@^2.0.0: 1528 | version "2.0.1" 1529 | resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" 1530 | dependencies: 1531 | is-finite "^1.0.0" 1532 | 1533 | require-uncached@^1.0.3: 1534 | version "1.0.3" 1535 | resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" 1536 | dependencies: 1537 | caller-path "^0.1.0" 1538 | resolve-from "^1.0.0" 1539 | 1540 | resolve-from@^1.0.0: 1541 | version "1.0.1" 1542 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" 1543 | 1544 | resolve@^1.2.0: 1545 | version "1.4.0" 1546 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.4.0.tgz#a75be01c53da25d934a98ebd0e4c4a7312f92a86" 1547 | dependencies: 1548 | path-parse "^1.0.5" 1549 | 1550 | restore-cursor@^2.0.0: 1551 | version "2.0.0" 1552 | resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" 1553 | dependencies: 1554 | onetime "^2.0.0" 1555 | signal-exit "^3.0.2" 1556 | 1557 | rimraf@^2.2.8: 1558 | version "2.6.1" 1559 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d" 1560 | dependencies: 1561 | glob "^7.0.5" 1562 | 1563 | run-async@^2.2.0: 1564 | version "2.3.0" 1565 | resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" 1566 | dependencies: 1567 | is-promise "^2.1.0" 1568 | 1569 | rx-lite-aggregates@^4.0.8: 1570 | version "4.0.8" 1571 | resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" 1572 | dependencies: 1573 | rx-lite "*" 1574 | 1575 | rx-lite@*, rx-lite@^4.0.8: 1576 | version "4.0.8" 1577 | resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" 1578 | 1579 | safe-buffer@~5.1.0, safe-buffer@~5.1.1: 1580 | version "5.1.1" 1581 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" 1582 | 1583 | "semver@2 || 3 || 4 || 5", semver@^5.3.0: 1584 | version "5.4.1" 1585 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" 1586 | 1587 | shebang-command@^1.2.0: 1588 | version "1.2.0" 1589 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" 1590 | dependencies: 1591 | shebang-regex "^1.0.0" 1592 | 1593 | shebang-regex@^1.0.0: 1594 | version "1.0.0" 1595 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" 1596 | 1597 | signal-exit@^3.0.2: 1598 | version "3.0.2" 1599 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" 1600 | 1601 | slash@^1.0.0: 1602 | version "1.0.0" 1603 | resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" 1604 | 1605 | slice-ansi@0.0.4: 1606 | version "0.0.4" 1607 | resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" 1608 | 1609 | source-map-support@^0.4.15: 1610 | version "0.4.18" 1611 | resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" 1612 | dependencies: 1613 | source-map "^0.5.6" 1614 | 1615 | source-map@^0.5.6: 1616 | version "0.5.7" 1617 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" 1618 | 1619 | spdx-correct@~1.0.0: 1620 | version "1.0.2" 1621 | resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" 1622 | dependencies: 1623 | spdx-license-ids "^1.0.2" 1624 | 1625 | spdx-expression-parse@~1.0.0: 1626 | version "1.0.4" 1627 | resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c" 1628 | 1629 | spdx-license-ids@^1.0.2: 1630 | version "1.2.2" 1631 | resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" 1632 | 1633 | sprintf-js@~1.0.2: 1634 | version "1.0.3" 1635 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 1636 | 1637 | string-width@^2.0.0, string-width@^2.1.0: 1638 | version "2.1.1" 1639 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" 1640 | dependencies: 1641 | is-fullwidth-code-point "^2.0.0" 1642 | strip-ansi "^4.0.0" 1643 | 1644 | string_decoder@~1.0.3: 1645 | version "1.0.3" 1646 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" 1647 | dependencies: 1648 | safe-buffer "~5.1.0" 1649 | 1650 | strip-ansi@^3.0.0: 1651 | version "3.0.1" 1652 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 1653 | dependencies: 1654 | ansi-regex "^2.0.0" 1655 | 1656 | strip-ansi@^4.0.0: 1657 | version "4.0.0" 1658 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" 1659 | dependencies: 1660 | ansi-regex "^3.0.0" 1661 | 1662 | strip-bom@^3.0.0: 1663 | version "3.0.0" 1664 | resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" 1665 | 1666 | strip-json-comments@~2.0.1: 1667 | version "2.0.1" 1668 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 1669 | 1670 | supports-color@3.1.2: 1671 | version "3.1.2" 1672 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.1.2.tgz#72a262894d9d408b956ca05ff37b2ed8a6e2a2d5" 1673 | dependencies: 1674 | has-flag "^1.0.0" 1675 | 1676 | supports-color@^2.0.0: 1677 | version "2.0.0" 1678 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" 1679 | 1680 | supports-color@^4.0.0: 1681 | version "4.4.0" 1682 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.4.0.tgz#883f7ddabc165142b2a61427f3352ded195d1a3e" 1683 | dependencies: 1684 | has-flag "^2.0.0" 1685 | 1686 | table@^4.0.1: 1687 | version "4.0.1" 1688 | resolved "https://registry.yarnpkg.com/table/-/table-4.0.1.tgz#a8116c133fac2c61f4a420ab6cdf5c4d61f0e435" 1689 | dependencies: 1690 | ajv "^4.7.0" 1691 | ajv-keywords "^1.0.0" 1692 | chalk "^1.1.1" 1693 | lodash "^4.0.0" 1694 | slice-ansi "0.0.4" 1695 | string-width "^2.0.0" 1696 | 1697 | text-table@~0.2.0: 1698 | version "0.2.0" 1699 | resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" 1700 | 1701 | through@^2.3.6: 1702 | version "2.3.8" 1703 | resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" 1704 | 1705 | tmp@^0.0.31: 1706 | version "0.0.31" 1707 | resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.31.tgz#8f38ab9438e17315e5dbd8b3657e8bfb277ae4a7" 1708 | dependencies: 1709 | os-tmpdir "~1.0.1" 1710 | 1711 | to-fast-properties@^1.0.3: 1712 | version "1.0.3" 1713 | resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" 1714 | 1715 | trim-right@^1.0.1: 1716 | version "1.0.1" 1717 | resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" 1718 | 1719 | tryit@^1.0.1: 1720 | version "1.0.3" 1721 | resolved "https://registry.yarnpkg.com/tryit/-/tryit-1.0.3.tgz#393be730a9446fd1ead6da59a014308f36c289cb" 1722 | 1723 | type-check@~0.3.2: 1724 | version "0.3.2" 1725 | resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" 1726 | dependencies: 1727 | prelude-ls "~1.1.2" 1728 | 1729 | type-detect@^4.0.0: 1730 | version "4.0.3" 1731 | resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.3.tgz#0e3f2670b44099b0b46c284d136a7ef49c74c2ea" 1732 | 1733 | typedarray@^0.0.6: 1734 | version "0.0.6" 1735 | resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" 1736 | 1737 | util-deprecate@~1.0.1: 1738 | version "1.0.2" 1739 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 1740 | 1741 | validate-npm-package-license@^3.0.1: 1742 | version "3.0.1" 1743 | resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" 1744 | dependencies: 1745 | spdx-correct "~1.0.0" 1746 | spdx-expression-parse "~1.0.0" 1747 | 1748 | which@^1.2.9: 1749 | version "1.3.0" 1750 | resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" 1751 | dependencies: 1752 | isexe "^2.0.0" 1753 | 1754 | wordwrap@~1.0.0: 1755 | version "1.0.0" 1756 | resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" 1757 | 1758 | wrappy@1: 1759 | version "1.0.2" 1760 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1761 | 1762 | write@^0.2.1: 1763 | version "0.2.1" 1764 | resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" 1765 | dependencies: 1766 | mkdirp "^0.5.1" 1767 | 1768 | yallist@^2.1.2: 1769 | version "2.1.2" 1770 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" 1771 | --------------------------------------------------------------------------------