├── .gitattributes ├── .gitignore ├── README.md ├── SUMMARY.md ├── book.json ├── boot.md ├── code-splitting.md ├── compiler.md ├── data-structure.md ├── data-type.md ├── equality.md ├── function.md ├── hot-swap.md ├── install.md ├── interop.md ├── js-module.md ├── lein-figwheel-emacs.md ├── leiningen.md ├── mutable.md ├── namespace.md ├── package.json ├── persistent.md ├── publish-module.md ├── repl.md ├── tail-recursion.md ├── testing.md ├── ui-programming.md ├── variable.md └── yarn.lock /.gitattributes: -------------------------------------------------------------------------------- 1 | 2 | yarn.lock -diff 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | /_book 3 | node_modules/ 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | ClojureScript 入门指南 3 | ---- 4 | 5 | 网页版 http://cljs-book.clj.im 6 | 7 | > Clojure(读作 "Closure")是 Rich Hickey 发明的一门 Lisp 方言, 它是一门通用编程语言但是着重于函数式编程. 8 | 9 | Clojure 本身编译到 JVM Bytecode 运行, 而 ClojureScript 编译到 JavaScript 运行. 10 | 11 | ClojureScript 在不可变数据和 DSL 构造方面的优势使之非常适合配合 React 进行编程和优化, 同时静态分析和 Macro 也为实际开发带来了很多的便利. 12 | 13 | 要深入学习 ClojureScript 需要阅读大量的 Clojure 教程, 查阅手册, 做练习等等. 14 | 15 | * Clojure 入门教程 https://wizardforcel.gitbooks.io/clojure-fpftj/content/ 16 | * CheatSheet http://cljs.info/cheatsheet/ 17 | 18 | 这份文章指导新手了解 ClojureScript 并入门. 文中依据其文件后缀简称 "cljs". 文档中的 cljs 代码基于 Lumo 或者 shadow-cljs 编译运行. 19 | 20 | 如果你喜欢读英文的教程, 可以阅读 [modern-cljs](https://github.com/magomimmo/modern-cljs#introduction). 21 | 22 | ### Contribute 23 | 24 | [Fork & PR!](https://github.com/clojure-china/cljs-book) 25 | 26 | ```bash 27 | yarn 28 | yarn gitbook build 29 | ``` 30 | -------------------------------------------------------------------------------- /SUMMARY.md: -------------------------------------------------------------------------------- 1 | # Summary 2 | 3 | ## 教程 4 | 5 | * [介绍](README.md) 6 | * [安装运行](install.md) 7 | * [变量](variable.md) 8 | * [函数](function.md) 9 | * [尾递归](tail-recursion.md) 10 | * [数据类型](data-type.md) 11 | * [数据结构](data-structure.md) 12 | * [等价](equality.md) 13 | * [命名空间](namespace.md) 14 | * [互操作](interop.md) 15 | * [不可变数据](persistent.md) 16 | * [可变状态](mutable.md) 17 | * [热替换](hot-swap.md) 18 | * [单元测试](testing.md) 19 | * [图形界面](ui-programming.md) 20 | * [编译过程](compiler.md) 21 | * [JavaScript 模块](js-module.md) 22 | * [发布模块](publish-module.md) 23 | * [Code Splitting](code-splitting.md) 24 | 25 | ## 其他工具 26 | 27 | * [REPL](repl.md) 28 | * [Boot](boot.md) 29 | * [Leiningen](leiningen.md) 30 | * [Leiningen + Figwheel + Emacs 配置](lein-figwheel-emacs.md) 31 | -------------------------------------------------------------------------------- /book.json: -------------------------------------------------------------------------------- 1 | { 2 | "plugins": ["ga"], 3 | "pluginsConfig": { 4 | "ga": { 5 | "token": "UA-41753901-18" 6 | } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /boot.md: -------------------------------------------------------------------------------- 1 | 2 | Boot 3 | ---- 4 | 5 | Boot 是一个建构工具 http://boot-clj.com/ 6 | 7 | ```bash 8 | brew install boot-clj 9 | ``` 10 | 11 | 类似 Gulp, 基于 task 进行组合以及运行, 社区有一些常用插件: 12 | 13 | https://github.com/boot-clj/boot/wiki/Community-Tasks 14 | 15 | 16 | Boot 通过命令行启动, 通过 `build.boot` 文件配置. 17 | `build.boot` 实际上是一个 Clojure 脚本, 运行时被读取. 18 | 19 | ### task 20 | 21 | 任务, 大概相当于 Gulp 里的 task, 可以从命令行调用. 22 | 任务可以进行组合, 一次顺序执行多个任务. 23 | 简单的 task 可以通过这个 Macro 定义: 24 | 25 | ```clojure 26 | (deftask null-task 27 | "Does nothing." 28 | [] 29 | (fn [next-task] 30 | (fn [fileset] 31 | (next-task fileset)))) 32 | ``` 33 | 34 | 多个 task 可以通过 `comp` 函数组合然后执行: 35 | 36 | https://github.com/boot-clj/boot/wiki/Tasks 37 | 38 | ### Boot environment 39 | 40 | Boot 的环境变量, 通过 `set-env!` 进行修改, 常用的环境变量: 41 | 42 | * `resource-paths` 作为源码输入, 也能够进入 jar 包里 43 | * `source-paths` 作为源码输入, 但不能进入 jar 包里 44 | * `asset-paths` 作为静态资源输入, 也能够进入 jar 包里 45 | * `dependencies` 整个项目的依赖 46 | 47 | 完整的环境变量的列表参考 Wiki: 48 | 49 | https://github.com/boot-clj/boot/wiki/Boot-Environment 50 | 51 | ### Java environment 52 | 53 | 大致相当于 Boot 的配置文件, 主要是一般可以是: 54 | 55 | ```clojure 56 | =>> cat ~/.boot/boot.properties 57 | #http://boot-clj.com 58 | #Wed Mar 23 17:58:25 CST 2016 59 | BOOT_CLOJURE_NAME=org.clojure/clojure 60 | BOOT_CLOJURE_VERSION=1.8.0 61 | BOOT_VERSION=2.5.5 62 | BOOT_EMIT_TARGET=no 63 | ``` 64 | 65 | 注意 `BOOT_EMIT_TARGET` 这个环境变量在 Boot 中有过大的调整. 66 | 原来 Boot 默认会输入内容到 target, 后来建议关闭这个行为. 67 | 68 | https://github.com/boot-clj/boot/wiki/Configuring-Boot 69 | 70 | ### target 71 | 72 | target 现在是一个 task, 运行 task 会把文件默认输出到 `target/` 路径. 73 | target task 调用时可以通过 `:dir` 设置路径的位置, 但一般不用设置. 74 | 75 | ```clojure 76 | (target :dir #{"compiled/"}) 77 | ``` 78 | 79 | ### fileset 80 | 81 | 大致可以认为是文件的集合, 也是 task 之间传递的主要内容. 82 | 从前面提到的 `source-paths` 等路径开始读取, 但根据参数不同而有不同特性. 83 | 其实 task 运行主要就是针对文件操作, 其中经常用到临时文件. 84 | 相对于 Gulp 使用文件流, Boot 使用的是 fileset 和临时文件. 85 | 86 | https://github.com/boot-clj/boot/wiki/Filesets 87 | 88 | ### Options 89 | 90 | 定义 task 参数时, 可以通过这套 DSL 定义参数的名称和类型, 91 | 一般不写 task 或者插件不需要深入. 比较复杂, 需要看文档才能明白用途: 92 | 93 | ```clojure 94 | (deftask options 95 | "Demonstrate the task options DSL." 96 | [a a-option VAL kw "The option." 97 | c counter int "The counter." 98 | e entry VAL sym "An entrypoint symbol." 99 | f flag bool "Enable flag." 100 | o o-option VAL str "The other option."] 101 | *opts*) 102 | ``` 103 | 104 | https://github.com/boot-clj/boot/wiki/Task-Options-DSL 105 | 106 | ### 例子 107 | 108 | 一个编译 cljs 的简单配置, 编译 `src/` 里的文件到 `target/`: 109 | 110 | ```clojure 111 | (set-env! 112 | :dependencies '[[org.clojure/clojurescript "1.9.36" :scope "test"] 113 | [org.clojure/clojure "1.8.0" :scope "test"] 114 | [adzerk/boot-cljs "1.7.170-3" :scope "test"]]) 115 | 116 | (require '[adzerk.boot-cljs :refer [cljs]]) 117 | 118 | (deftask build-advanced [] 119 | (set-env! 120 | :source-paths #{"src"}) 121 | (comp 122 | (cljs :optimizations :advanced) 123 | (target))) 124 | ``` 125 | -------------------------------------------------------------------------------- /code-splitting.md: -------------------------------------------------------------------------------- 1 | 2 | Code Splitting 3 | ---- 4 | 5 | shadow-cljs 支持 Code splitting, 以及 Long term caching, 参考这个例子: 6 | https://github.com/minimal-xyz/minimal-shadow-cljs-release 7 | 8 | ```edn 9 | {:source-paths ["src/"] 10 | :dependencies [] 11 | :builds {:app {:output-dir "dist/" 12 | :target :browser 13 | :asset-path "." 14 | :modules {:main {:entries [app.main] 15 | :depends-on #{:lib}} 16 | :lib {:entries [app.lib]}} 17 | :release {:module-hash-names true}}}} 18 | ``` 19 | 20 | 其中 `:modules` 配置中指定打包最终会生成 `main.js` 和 `lib.js` 两个文件. 21 | 以及 HTML 中需要指定 `lib` 需要在 `main` 之前加载, 以保证依赖关系. 22 | 23 | `:module-hash-names` 选项会在文件名上增加 MD5 信息. 24 | -------------------------------------------------------------------------------- /compiler.md: -------------------------------------------------------------------------------- 1 | 2 | 编译过程 3 | ---- 4 | 5 | Clojure 语言本身是编译到 JVM Bytecode, 而 ClojureScript 则是编译到 JavaScript. 6 | 7 | ### Macros 8 | 9 | Clojure(Script) 编译过程大概经历三个阶段: 10 | 11 | * 读取: 经字符串, 将 Macro 进行展开 12 | * 分析: 基于读取的符号构建 AST 13 | * 生成: 产生目标输出, 比如编译到 JavaScript 14 | 15 | ![](http://farm6.staticflickr.com/5341/7110268565_de4998482b_n_d.jpg) 16 | 17 | 这个过程对于 Clojure 和 ClojureScript 来说类似, 细节参考 [Compilation Pipeline](http://blog.fogus.me/2012/04/25/the-clojurescript-compilation-pipeline/). 18 | 19 | 比如这样一段 ClojureScript 代码, [参考 Mike 的文章](http://blog.fikesfarm.com/posts/2017-08-17-closure-compiler-in-planck.html): 20 | 21 | ```clojure 22 | (defn f [long-name] 23 | (let [process (fn [foo] 24 | (str "abc" "def" 25 | (+ 1 2 3) foo))] 26 | (process long-name))) 27 | ``` 28 | 29 | 通过 ClojureScript 的编译器会被编译成: 30 | 31 | ```js 32 | function foo$core$g(long_name) { 33 | var process = function(foo__$1) { 34 | return ["abc", "def", 35 | cljs.core.str.cljs$core$IFn$_invoke$arity$1(1 + 2 + 3), 36 | cljs.core.str.cljs$core$IFn$_invoke$arity$1(foo__$1) 37 | ].join(""); 38 | }; 39 | return process.call(null, long_name); 40 | } 41 | ``` 42 | 43 | ### Google Closure Compiler 44 | 45 | 对于 JavaScript 而言, 在上线之前仍然需要进行优化, 比如前端常用 Uglify 优化代码体积. 46 | 在 cljs 社区, 普遍使用 Google Closure Compiler 进行优化, 可以做一些更深层的优化, 可以得到: 47 | 48 | ```js 49 | function(a) { return ["abcdef", 50 | cljs.core.str.cljs$core$IFn$_invoke$arity$1(6), 51 | cljs.core.str.cljs$core$IFn$_invoke$arity$1(a)].join(""); 52 | } 53 | ``` 54 | 55 | 可以得到代码被进一步简化了, 甚至部分的代码被预先做了计算. 56 | 57 | cljs 编译器生成的代码可读性并不是那么好, 在使用有些函数的情况下会更加难读. 58 | cljs 生成的代码本身针对 Google Closure Compiler 优化, 并且严重依赖 Dead Code Elimination 功能来控制体积. 59 | 60 | Google Closure Compiler 主要有 [4 个编译选项](https://developers.google.com/closure/compiler/docs/compilation_levels#simple_optimizations): 61 | 62 | * `:none` 不做任何优化, 不合并文件 63 | * `:whitespace` 去除空白, 合并文件 64 | * `:simple` 合并文件, 重命名局部变量 65 | * `:advanced` 合并文件, 去除无用代码, 压缩混淆代码 66 | 67 | 由于 Google Closure Compiler 基于 Java 实现, 所以大部分 cljs 编译过程依赖 JVM. 68 | 比如 Lein 和 Boot 就基于 JVM 环境运行, 而 shadow-cljs 会调用系统的 JVM. 69 | 70 | 另一种办法是把 cljs 的编译器整个编译到 JavaScript, 同时使用 Closure Compiler 的 JavaScript 版本. 71 | 这种情况当中使用的 cljs 称为 Self-hosted ClojureScript, 有时也叫 Bootstraped ClojureScript. 72 | 比如 Planck 和 Lumo 就用了 Self-hosted ClojureScript, 可以使用 Node.js 来编译 cljs. 73 | 使用 Self-hosted cljs 相对而言冷启动较快, 但编译速度较慢, 适合在 REPL 中使用. 74 | 不过在 Self-hosted cljs 当中某些语言特性的细节会不同, 比如 Macro 的用法等等. 75 | -------------------------------------------------------------------------------- /data-structure.md: -------------------------------------------------------------------------------- 1 | 2 | 数据结构 3 | ---- 4 | 5 | ### Collection 和 Sequence 6 | 7 | Clojure 常用的数据结构有 List, Map, Vector, Set. 8 | 他们都属于 Collection, [之间的关系大致是这样](https://www.brainonfire.net/files/seqs-and-colls/main.html): 9 | 10 | ![](https://www.brainonfire.net/files/seqs-and-colls/collection-properties-venn.png) 11 | 12 | 属于 Clojure 当中实现的数据结构都是 Collection. 编码当中会遇到 Host 平台的数据类型, 不属于 Collection. 13 | 14 | 实现了 Collection 的接口的数据结构都支持这些函数: `=`, `count`, `conj`, `empty`, `seq`. 15 | 实现了 Sequence 的接口的数据结构支持这些函数: `first`, `rest`, `next`. 16 | 17 | 关于数据结构的细节推荐阅读 [Collections and Sequences in Clojure](http://clojure-doc.org/articles/language/collections_and_sequences.html). 18 | 19 | Clojure 中的数据结构被设计成不可变的, 用来配合函数式编程. 这和主流编程语言存在区别. 20 | 21 | ### Sequence & List 22 | 23 | Clojure 中的 List 是单链表. 适合从头部访问, 而不适合随机访问. Clojure 采用 Lisp 语法来定义 List: 24 | 25 | ```clojure 26 | '(1 2 3 4) 27 | ; (1 2 3 4) 28 | (list? '(1 2 3 4)) 29 | ; true 30 | ``` 31 | 32 | 这个语法实际上等同于 `quote`: 33 | 34 | ```clojure 35 | (quote (1 2 3 4)) 36 | ; (1 2 3 4) 37 | ``` 38 | 39 | 或者通过调用的写法可以创建 List: 40 | 41 | ```clojure 42 | (list 1 2 3 4) 43 | ; (1 2 3 4) 44 | ``` 45 | 46 | Sequence 是一种抽象的数据结构, List 本身是一种 Sequence, 同时 Sequence 本身可以表示惰性的列表. 47 | 48 | ```clojure 49 | (type (range)) 50 | ; cljs.core/Range 51 | (seq? (range)) 52 | ; true 53 | ``` 54 | 55 | 可以用 `seq` 函数来创建 Sequence, 不过可以粗略地把它被 List 混在一起理解和使用: 56 | 57 | ```clojure 58 | (seq [1 2 3]) 59 | ; (1 2 3) 60 | ``` 61 | 62 | 常用的操作: 63 | 64 | ```clojure 65 | (first (list 1 2 3 4)) 66 | ; 1 67 | (rest (list 1 2 3 4)) 68 | ; (2 3 4) 69 | (cons 1 '(2 3 4 5 6)) 70 | ; (1 2 3 4 5 6) 71 | ``` 72 | 73 | ### Vector 74 | 75 | Vector 支持随机访问, 通过 `[]` 语法可以快速定义: 76 | 77 | ```clojure 78 | [1 2 3 4] 79 | ; [1 2 3 4] 80 | (vector? []) 81 | ; true 82 | ``` 83 | 84 | 也支持是用 `vec` 和 `vector` 函数通过调用的方式定义: 85 | 86 | ```clojure 87 | (vector 1 2 3 4) 88 | ; [1 2 3 4] 89 | (vec '(1 2 3 4)) 90 | ; [1 2 3 4] 91 | ``` 92 | 93 | 常用的操作比如: 94 | 95 | ```clojure 96 | (get [:a :b :c :d] 1) 97 | ; :b 98 | (nth [:a :b :c :d] 1) 99 | ; :b 100 | (peek [1 2 3 4]) 101 | ; 4 102 | (pop [1 2 3]) 103 | ; [1 2] 104 | (conj [1 2 3] 4) 105 | ; [1 2 3 4] 106 | (subvec [1 2 3] 1 2) ; 截取向量 107 | ; [2] 108 | ``` 109 | 110 | ### Map 111 | 112 | Map 是关联列表, 可以通过 `{}` 语法定义 Map, 其中 `,` 等同于空白. 一般键和值的类型没有具体限制: 113 | 114 | ```clojure 115 | {:a "a", "b" 3, 4 []} 116 | ; {:a "a", "b" 3, 4 []} 117 | (map? {}) 118 | ; true 119 | ``` 120 | 121 | 一般使用当中会用 Keyword 来作为键: 122 | 123 | ```clojure 124 | {:name "Clojure", :born 2007} 125 | ``` 126 | 127 | 除了通过语法, 也可以用 `hash-map` 等函数通过调用的方式创建: 128 | 129 | ```clojure 130 | (hash-map 1 2 3 4) 131 | ; {1 2, 3 4} 132 | (zipmap [:a :b :c] [1 2 3]) 133 | ; {:a 1, :b 2, :c 3} 134 | ``` 135 | 136 | 常用的操作有: 137 | 138 | ```clojure 139 | (:a {:a 1}) 140 | ; 1 141 | (assoc {:a 1, :b 2} :c 3) 142 | ; {:a 1, :b 2, :c 3} 143 | (dissoc {:a 1} :b 2) 144 | ; {:a 1} 145 | (contains? {:a 1} :b) 146 | ; false 147 | (merge {:a 1} {:b 2}) 148 | ; {:a 1, :b 2} 149 | (update {:a 1} :a inc) 150 | ; {:a 2} 151 | ``` 152 | 153 | ### Set 154 | 155 | 集合, 相同的元素之允许出现一次, 可以用 `#{}` 语法创建: 156 | 157 | ```clojure 158 | #{1 2 3} 159 | ; #{1 2 3} 160 | (set? #{}) 161 | ; true 162 | ``` 163 | 164 | 或者通过调用的方式创建: 165 | 166 | ```clojure 167 | (hash-set 1 2 3) 168 | ; #{1 2 3} 169 | (set [1 2 3]) 170 | ; #{1 2 3} 171 | ``` 172 | 173 | 常用的操作有: 174 | 175 | ```clojure 176 | (conj #{1 2 3} 4) 177 | ; #{1 2 3 4} 178 | (disj #{1 2 3} 3) 179 | ; #{1 2} 180 | (contains? #{1 2 3} 4) 181 | ; false 182 | ``` 183 | 184 | 此外 `clojure.set` 提供了其他一些集合的常用函数. 185 | 186 | ### 常用函数 187 | 188 | 推荐去 [Cheatsheet](http://cljs.info/cheatsheet/) 了解有哪些语言本身提供的函数. 189 | 190 | * `into` 191 | 192 | 除了前面提到的函数, 还可以通过 `into` 来做强制数据结构转换: 193 | 194 | ```clojure 195 | (into [] '(1 2 3)) 196 | ; [1 2 3] 197 | (into #{} '(1 2 3)) 198 | ; #{1 2 3} 199 | (into '() [1 2 3]) 200 | ; (3 2 1) 201 | (into {} [[:a 1] [:b 2]]) 202 | ; {:a 1, :b 2} 203 | ``` 204 | 205 | * `first` 206 | 207 | `first` 取出 Sequence 的第一个元素, 但是对于 Map 来说能获取键值对: 208 | 209 | ```clojure 210 | (first [1 2 3]) 211 | ; 1 212 | (first '(1 2 3)) 213 | ; 1 214 | (first #{1 2 3}) 215 | ; 1 216 | (first {:a 1 :b 2}) 217 | ; [:a 1] 218 | ``` 219 | 220 | * `map` 221 | 222 | 注意 `map` 函数返回的是 Sequence, 并不是和原始的数据类型一致, 而且 `reduce` 等函数也是这样的: 223 | 224 | ```clojure 225 | (map inc [1 2 3]) 226 | ; (2 3 4) 227 | (map inc '(1 2 3)) 228 | ; (2 3 4) 229 | (map inc #{1 2 3}) 230 | ; (2 3 4) 231 | (map identity {:a 1 :b 2}) 232 | ; ([:a 1] [:b 2]) 233 | ``` 234 | 235 | 具体到 Vector 的情况下, 可使用 `mapv` 来得到 Vector 类型的结果, 或者用 `into` 强行转换: 236 | 237 | ```clojure 238 | (mapv identity {:a 1 :b 2}) 239 | ; [[:a 1] [:b 2]] 240 | (into [] (map identity {:a 1 :b 2})) 241 | ; [[:a 1] [:b 2]] 242 | ``` 243 | 244 | * `peek`, `pop` 和 `conj` 245 | 246 | 由于 Sequence 和 Vector 存在区别, 有些函数虽然通用, 但是效果并不一样: 247 | 248 | ```clojure 249 | (peek [1 2 3]) 250 | ; 3 251 | (peek '(1 2 3)) 252 | ; 1 253 | (pop '(1 2 3)) 254 | ; (2 3) 255 | (pop [1 2 3]) 256 | ; [1 2] 257 | (conj [1 2 3] 4) 258 | ; [1 2 3 4] 259 | (conj '(1 2 3) 4) 260 | ; (4 1 2 3) 261 | ``` 262 | 263 | * `count` 264 | 265 | ```clojure 266 | (count '(1 2 3)) 267 | ; 3 268 | (count [1 2 3]) 269 | ; 3 270 | (count "123") 271 | ; 3 272 | (count #{1 2 3}) 273 | ; 3 274 | (count {:a 1 :b 2 :c 3}) 275 | ; 3 276 | ``` 277 | 278 | 对于长度为 `0` 可以用 `empty?` 函数来判断: 279 | 280 | ```clojure 281 | (empty? []) 282 | ; true 283 | (empty? {}) 284 | ; true 285 | (empty? #{}) 286 | ; true 287 | (empty? '()) 288 | ; true 289 | ``` 290 | 291 | * `assoc-in` 和 `update-in` 292 | 293 | 对于嵌套比较深的数据结构, 会用到这些函数, 主要是 Vector, Map 或者混用两种类型: 294 | 295 | ```clojure 296 | (get-in {:a [1 2 3]} [:a 0]) 297 | ; 1 298 | (assoc-in {:a [1 2 3]} [:a 0] 4) 299 | ; {:a [4 2 3]} 300 | (update-in {:a [1 2 3]} [:a 0] inc) 301 | ; {:a [2 2 3]} 302 | ``` 303 | 304 | 更多的函数还是建议阅读 [Cheatsheet](http://cljs.info/cheatsheet/) 305 | -------------------------------------------------------------------------------- /data-type.md: -------------------------------------------------------------------------------- 1 | 2 | 数据类型 3 | ---- 4 | 5 | 可以通过 `(type x)` 来获取 `x` 的类型. 6 | 7 | ### 来自 JavaScript 的数据类型 8 | 9 | * `nil`, 对应 `null` 10 | * Number 11 | * Boolean 12 | * String 13 | * RegExp 14 | 15 | cljs 当中正则的语法是 `#"\\d"` 对应 js 里 `/\d/`. 16 | 17 | `\d` 本来是字符类型, 在 js 环境中成了 String. 18 | 19 | ### ClojureScript 其他常用的类型 20 | 21 | * Keyword, `:demo`, 或者从 String 生成 `(keyword "demo")`. 22 | * Symbol, `'demo`, 或者从 String 生成 `(symbol "demo")`. 23 | * Atom, `(atom 1)`, 这个写法实际上是把 Number 放进 Atom 里边. 24 | * Vector, `[1 2 3 4]`. 也可以写成 `(vector 1 2 3 4)`. 25 | * List, `'(1 2 3 4)`, 单引号. 也可以写成 `(list 1 2 3 4)`. 26 | * HashMap, `{:a 1 :b 2}`. 也可以写成 `(hash-map :a 1 :b 2)`. 27 | * HashSet, `#{1 2 3 4}`, 元素是唯一的. 也可以写成 `(hash-set 1 2 3 4)`. 28 | 29 | 在 ClojureScript 当中还有其他一些可是使用的列表类型. 30 | 31 | 可以用内置函数来判断类型: 32 | 33 | ```clojure 34 | (string? "x") 35 | ; true 36 | (keyword :a) 37 | ; :a 38 | (number? 1) 39 | ; true 40 | (boolean? true) 41 | ; true 42 | (some? nil) 43 | ; false 44 | (nil? nil) 45 | ; true 46 | (fn? (fn [])) 47 | ; true 48 | ``` 49 | 50 | ### 类型转换 51 | 52 | String: 53 | 54 | ```clojure 55 | (str :a) 56 | ; ":a" 57 | (str 1) 58 | ; "1" 59 | (name :a) 60 | ; "a" 61 | ``` 62 | 63 | Keyword: 64 | 65 | ```clojure 66 | (keyword "a") 67 | ; :a 68 | ``` 69 | 70 | Boolean: 71 | 72 | ```clojure 73 | (boolean "true") 74 | ; true 75 | (boolean 1) 76 | ; true 77 | ``` 78 | 79 | Number: 80 | 81 | ```clojure 82 | (js/parseInt "11") 83 | ; 11 84 | (js/parseFloat "11") 85 | ; 11 86 | ``` 87 | 88 | ### 自定义类型 89 | 90 | 通过 `defrecord` 可以定义新的类型, 不过本质上是 HashMap: 91 | 92 | ```clojure 93 | (defrecord Address [street city state zip]) 94 | ; cljs.user/Address 95 | ``` 96 | 97 | 实现一个实例: 98 | 99 | ```clojure 100 | (Address. "200 N Mangum" "Durham" "NC" 27701) 101 | ; #cljs.user.Address{:street "200 N Mangum", :city "Durham", :state "NC", :zip 27701} 102 | ``` 103 | 104 | 由于同时会生成对应的 Macro, 用 `->Address` 也是一样的: 105 | 106 | ```clojure 107 | (->Address "200 N Mangum" "Durham" "NC" 27701) 108 | ; #cljs.user.Address{:street "200 N Mangum", :city "Durham", :state "NC", :zip 27701} 109 | ``` 110 | -------------------------------------------------------------------------------- /equality.md: -------------------------------------------------------------------------------- 1 | 2 | 等价 3 | ---- 4 | 5 | cljs 的数据结构是在 js 基础之上实现的. 数值类型的数据可以直接判断. 6 | 一般通过 `(= a b)` 判断 `a` 和 `b` 的内容是否一致. 7 | Collection 类型数据除了 `=` 函数之外, 8 | 还可以使用 `identical?` 函数判断两个数据的引用是否一致. 9 | 10 | ```clojure 11 | (identical? {} {}) 12 | ; true 13 | (identical? {:a 1} {:a 1}) 14 | ; false 15 | (= {:a 1} {:a 1}) 16 | ; true 17 | (def a {a 1}) 18 | ; #'cljs.user/a 19 | (identical? a a) 20 | ; true 21 | ``` 22 | 23 | 判断引用所需要的步骤往往很少, 所以几乎没有多少开销. 24 | 而递归判断内容一致很可能需要对数据结构进行遍历, 影响性能. 25 | -------------------------------------------------------------------------------- /function.md: -------------------------------------------------------------------------------- 1 | 2 | 函数 3 | ---- 4 | 5 | ### 基本定义 6 | 7 | 最简单的函数定义是: 8 | 9 | ```clojure 10 | (defn f1 [x y] 11 | (+ x y)) 12 | ; #'cljs.user/f1 13 | ``` 14 | 15 | 借助匿名函数也可以函数定义, 不过这样可能损失一些静态检查的好处: 16 | 17 | ```clojure 18 | (def f2 (fn [x y] 19 | (+ x y))) 20 | ; #'cljs.user/f2 21 | ``` 22 | 23 | 如果函数参数个数不确定, 可以用 `&` 把后边的参数合并成一个 list: 24 | 25 | ```clojure 26 | (defn f3 [x1 & xs] 27 | (print x1) 28 | (print xs)) 29 | ; #'cljs.user/f3 30 | ``` 31 | 32 | 根据参数个数的不同, 函数可以被重载: 33 | 34 | ```clojure 35 | (defn f4 [x] (+ x 1)) 36 | ; #'cljs.user/f4 37 | (defn f4 [x y] (+ x y 1)) 38 | ; #'cljs.user/f4 39 | ``` 40 | 41 | 也可以简写在一个表达式当中: 42 | 43 | ```clojure 44 | (defn f4 45 | ([x] (+ x 1)) 46 | ([x y] (+ x y 1))) 47 | ; #'cljs.user/f4 48 | ``` 49 | 50 | ### 调用函数 51 | 52 | 函数调用比较简单, 注意有个 `apply` 函数可以改变参数的传递方式: 53 | 54 | ```clojure 55 | (f1 1 2) 56 | ; 3 57 | (apply f1 (list 1 2)) 58 | ; 3 59 | ``` 60 | -------------------------------------------------------------------------------- /hot-swap.md: -------------------------------------------------------------------------------- 1 | 2 | 热替换 3 | ---- 4 | 5 | 在运行时替换代码, 主要是两类的: 6 | 7 | * ClojureScript 编译工具自动替换代码 8 | * 从 REPL 当中刷新代码重新引入命名空间 9 | 10 | ### shadow-cljs 11 | 12 | 在 `shadow-cljs.edn` 当中配置了 `:devtools` 就会自动激活热替换. 13 | 14 | ### REPL 15 | 16 | 跟 Clojure REPL 类似, ClojureScript 有命令行工具可以替换命名空间, 17 | 主要是 Planck 和 Lumo, 比如 Lumo: 18 | 19 | ```clojure 20 | (require '[x.y :as y] :reload) 21 | ``` 22 | 23 | 就可以重新编译 `x.y` 对应的代码(使用缓存的情况下也要注意缓存). 24 | 主要用在后端. 25 | 26 | ### `boot-reload` 27 | 28 | https://github.com/adzerk-oss/boot-reload 29 | 30 | Boot 插件用于实现基本的热替换功能. 31 | 32 | ### figwheel 33 | 34 | https://github.com/bhauman/lein-figwheel 35 | 36 | 基于 Leiningen 实现的 ClojureScript 编译和热替换的工具. 37 | -------------------------------------------------------------------------------- /install.md: -------------------------------------------------------------------------------- 1 | 2 | 安装运行 3 | ---- 4 | 5 | ClojureScript 的编译依赖 Java, 后来逐渐完成了 JavaScript 实现的 Self-hosted ClojureScript, 也就是能在 JavaScript 环境当中直接编译 ClojureScript. 6 | 7 | 这份文档当中使用 Lumo 作为 REPL 和脚本的执行工具, 使用 shadow-cljs 作为项目的建构工具. 8 | 9 | ### Lumo 10 | 11 | 一个基于 Self-hosted ClojureScript 开发的运行在 V8 的环境 https://github.com/anmonteiro/lumo 12 | 13 | ```bash 14 | brew install lumo 15 | ``` 16 | 17 | Lumo 借助 V8 的 Snapshot 特性优化了启动速度. 同时支持在运行时引用 npm 模块. 后来 Lumo 也加入了 ClojureScript 建构的功能. 18 | 19 | 它的使用体验类似 `node`, 可以直接启动 REPL: 20 | 21 | ```bash 22 | $ lumo 23 | Lumo 1.8.0 24 | ClojureScript 1.9.946 25 | Node.js v9.2.0 26 | Docs: (doc function-name-here) 27 | (find-doc "part-of-name-here") 28 | Source: (source function-name-here) 29 | Exit: Control+D or :cljs/quit or exit 30 | 31 | cljs.user=> (println "demo") 32 | demo 33 | nil 34 | cljs.user=> 35 | ``` 36 | 37 | 也可以用 Lumo 运行脚本, 比如 `demo.cljs` 文件: 38 | 39 | ```clojure 40 | (println "this is a demo") 41 | (println (+ 1 2)) 42 | (def a 1) 43 | (println a) 44 | ``` 45 | 46 | 可以命令运行执行: 47 | 48 | ```bash 49 | lumo demo.cljs 50 | ``` 51 | 52 | Lumo 和 Clojure 一样, 依赖 classpaths 来查找依赖, classpaths 可以是路径或者是 jar 包. 在 Clojure 中可以查看: 53 | 54 | ```bash 55 | clj -Spath 56 | src:/Users/chen/.m2/repository/org/clojure/clojure/1.9.0/clojure-1.9.0.jar:/Users/chen/.m2/repository/org/clojure/spec.alpha/0.1.143/spec.alpha-0.1.143.jar:/Users/chen/.m2/repository/org/clojure/core.specs.alpha/0.1.24/core.specs.alpha-0.1.24.jar 57 | ``` 58 | 59 | 可以看到 `src/` 是默认在搜索路径当中的, 对于 Lumo 使用 classpath 可以这样配合: 60 | 61 | ```bash 62 | lumo -c `clj -Spath` 63 | ``` 64 | 65 | ### shadow-cljs 66 | 67 | shadow-cljs 是专为 ClojureScript 开发定制的精简的编译器, 提供了一些对非 Java 用户而言相对友好的功能 https://github.com/thheller/shadow-cljs 68 | 69 | 可以通过 npm 直接安装: 70 | 71 | ```bash 72 | npm install -g shadow-cljs 73 | ``` 74 | 75 | shadow-cljs 使用 `shadow-cljs.edn` 作为配置文件, 比如: 76 | 77 | ```edn 78 | {:source-paths ["src"] 79 | :dependencies [] 80 | :builds {:app {:output-dir "target/" 81 | :asset-path "." 82 | :target :browser 83 | :modules {:main {:entries [app.main]}} 84 | :devtools {:after-load app.main/reload!}}}} 85 | ``` 86 | 87 | 运行 `watch` 子命令的表示启动开发环境, 同时监视 `src/` 目录中的代码改变, 激活热替换功能: 88 | 89 | ```bash 90 | shadow-cljs watch app 91 | ``` 92 | 93 | 运行 `release` 子命令可以编译优化整个项目: 94 | 95 | ```bash 96 | shadow-cljs release app 97 | ``` 98 | 99 | 这里的 `app` 对应配置当中的 build-id `:app`. 100 | 101 | shadow-cljs 运行中需要 Java 环境, 需要保证在系统当中安装 Java: 102 | 103 | http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 104 | 105 | ### 通过 clj 启动 106 | 107 | 最新版本的 ClojureScript 完善了对 clj 命令的支持, 基于 `deps.edn` 文件的依赖: 108 | 109 | ```edn 110 | {:deps {org.clojure/clojurescript {:mvn/version "1.10.238"}}} 111 | ``` 112 | 113 | 能够从命令行直接启动 cljs 代码, 打开一个 REPL: 114 | 115 | ```bash 116 | clj --main cljs.main --repl 117 | ``` 118 | 119 | 具体步骤参考官网的 Guide 操作 https://clojurescript.org/guides/quick-start 120 | 121 | ### 其他方案 122 | 123 | 其他的 REPL 环境还有 planck. 其他 cljs 编译方案也有基于 Boot, Lein, 甚至也可以直接调用 Java API 进行编译. 124 | 如果需要, 可以查询相关资料尝试. 125 | -------------------------------------------------------------------------------- /interop.md: -------------------------------------------------------------------------------- 1 | 2 | JavaScript 互操作 3 | ---- 4 | 5 | 调用宿主语言代码最直接的办法就是通过 interop. 6 | JavaScript 的全局变量可以通过 `js` 命名空间访问. 7 | 对象的方法调用可以写成: 8 | 9 | ```clojure 10 | (.log js/console "demo") ; console.log('demo') 11 | ``` 12 | 13 | 访问对象的属性需要添加连字符: 14 | 15 | ```clojure 16 | (.-name obj) ; obj.name 17 | ``` 18 | 19 | 对象的实例化可以用 cljs 写, 注意结尾有点号: 20 | 21 | ```clojure 22 | (js/Date.) ; new Date() 23 | ``` 24 | 25 | 当然用 `new` 也不是不可以: 26 | 27 | ```clojure 28 | (new js/Date) ; new Date() 29 | ``` 30 | 31 | 在一般用到 interop 比较局限. 但有时会用到复杂对象. 32 | 复合数据结构直接转换通过 `clj->js` `js->clj` 两个函数进行. 33 | 34 | 需要复杂的数据结构还有一些复杂的操作, 可以看这篇文章: 35 | 36 | http://www.spacjer.com/blog/2014/09/12/clojurescript-javascript-interop/ 37 | 38 | 以及这个视频: 39 | 40 | https://lambdaisland.com/episodes/clojurescript-interop 41 | -------------------------------------------------------------------------------- /js-module.md: -------------------------------------------------------------------------------- 1 | 2 | JavaScript 模块 3 | ---- 4 | 5 | ### 前端 6 | 7 | shadow-cljs 当中对 npm 模块有比较成熟的支持, 通过 `ns` 可以声明依赖: 8 | 9 | ```clojure 10 | (ns app.main (:require ["fs" :as fs])) 11 | 12 | (fs/readFileSync "package.json" "utf8") 13 | ``` 14 | 15 | 注意这里 `fs/` 用的是 `/` 表示 `fs` 类似命名空间. 16 | 17 | 旧的教程里会推荐 http://cljsjs.github.io/ 项目, 但是现在建议转用 shadow-cljs 的写法. 18 | 官方的 ClojureScript 对 `:npm-deps` 已经有越来越好的支持, 未来趋向于更好借助 npm 的资源. 19 | 20 | ### 后端 21 | 22 | 使用 Lumo 运行 ClojureScript 脚本时可以通过 `js/require` 调用 npm 模块. 23 | 另外 ClojureScript 编译后端代码生成的 js 文件也可以直接使用 `js/require`. 24 | -------------------------------------------------------------------------------- /lein-figwheel-emacs.md: -------------------------------------------------------------------------------- 1 | Leiningen + Figwheel + Emacs 配置 2 | ---- 3 | 4 | Lein 通过命令行启动, 通过 `project.clj` 文件配置. 5 | `project.clj` 实际上是一个 Clojure 脚本, 运行时被读取. 6 | 7 | ### Emacs `C-x C-e` eval last cljs sexp 的配置 8 | 9 | * 1.在 `project.clj` 文件里面的 `:dependencies` 引入 10 | 11 | ```clojure 12 | 13 | :dependencies [ ... 14 | [com.cemerick/piggieback "0.2.2-SNAPSHOT"] 15 | ... ] 16 | 17 | 18 | ``` 19 | 20 | 21 | * 2.修改 `project.clj` 文件里面的 `:figwheel` 22 | 23 | ```clojure 24 | 25 | :figwheel {... 26 | :nrepl-port 7003 27 | :nrepl-middleware ["cemerick.piggieback/wrap-cljs-repl"] 28 | ... 29 | } 30 | 31 | ``` 32 | 33 | 34 | 35 | * 3.` lein figwheel` 启动nrepl, 用Emacs的Cider连接nrepl的7003端口,并在浏览器端打开项目的页面 36 | 37 | 在你的Emacs配置里面加入 cljs-client-start, cljs-eval-sexp函数, cider连接完成后,在cider连接的buffer里面执行 ` M-x cljs-client-start ` 并回车两次, 使得cider的cljs客户端连接上浏览器, 完成后你就可以执行 ` C-x C-e ` 执行cljs单个S表达式了 38 | 39 | cljs-eval-sexp函数是方便快速查看cljs变量和简单的表达式测试用的, 快捷键是 ` M-" ` 40 | 41 | 42 | ```elisp 43 | 44 | (defun cljs-client-start () 45 | (interactive) 46 | (progn 47 | (insert "(use 'figwheel-sidecar.repl-api)\n") 48 | (insert "(cljs-repl)\n") 49 | (sleep-for 2) 50 | (rename-buffer (replace-regexp-in-string " " " CLJS " (buffer-name))) 51 | ) 52 | ) 53 | 54 | (defun cljs-eval-sexp (sexp) 55 | (interactive "sClJS-EVAL:") 56 | (cider-interactive-eval sexp) 57 | ) 58 | (define-key global-map (kbd "M-\"") 'cljs-eval-sexp) 59 | 60 | ``` 61 | 62 | -------------------------------------------------------------------------------- /leiningen.md: -------------------------------------------------------------------------------- 1 | 2 | Leiningen 3 | ---- 4 | 5 | Leiningen 是另一个更早的建构工具, 简称 `lein` http://leiningen.org/ 6 | 7 | Boot 配置更加简单灵活, 推荐 Boot. 8 | 不过 Leiningen 发布时间造很多, 用户和插件都更多, 也会用到. 9 | 10 | lein 更像是 Grunt, 配置强大, 然而 Boot 却很容易对 Task 进行组合使用. 11 | 对应 cljs 项目来说, 还是推荐用 Boot. 12 | 13 | ```clojure 14 | brew install leiningen 15 | ``` 16 | -------------------------------------------------------------------------------- /mutable.md: -------------------------------------------------------------------------------- 1 | 2 | 可变状态 3 | ---- 4 | 5 | 数据是不可变的, 但是通过引用实现的状态是可以改变的. 6 | 7 | ### Atom 8 | 9 | Atom 在 Clojure 中可以用于处理事务操作, cljs 由于是单线程, 玩不转. 10 | 不过 Atom 还是用于表示单个同步的状态修改, 用法一般是: 11 | 12 | ```clojure 13 | (def *a (atom 1)) 14 | @*a 15 | (reset! *a 2) 16 | (swap! *a inc) 17 | ``` 18 | 19 | `swap!` 实际上是一个 Macro, 应对 `(reset! *a (inc @a))`. 20 | 21 | Atom 类型的数据可以被监听, 在修改时调用代码: 22 | 23 | ```clojure 24 | (defn handle-change [] 25 | (println "changed")) 26 | (add-watch *a :changes handle-change) 27 | (remove-watch *a :changes) 28 | ``` 29 | 30 | ### 宿主语言 31 | 32 | 另一种模拟可变数据的方式是通过宿主语言的类型系统来提供可变数据. 33 | -------------------------------------------------------------------------------- /namespace.md: -------------------------------------------------------------------------------- 1 | 2 | 命名空间 3 | ---- 4 | 5 | 由于 js 环境极少命名空间管理模块, namespace 相对陌生, 6 | 比如有这样的文件结构, 7 | 8 | ```text 9 | src/ 10 | demo/ 11 | core.cljs 12 | ``` 13 | 14 | 可以看到 `core.cljs` 的路径就是: 15 | 16 | ```bash 17 | src/demo/core.cljs 18 | ``` 19 | 20 | 注意 JVM 环境有个 classpath 的环境变量, 用于判断怎样查找源码, 21 | classpath 对应多个路径, 也可能是 jar 包, 而 jar 包中也是源码, 22 | 对应到这里, 一般 `src/` 路径就在 classpath 当中, 23 | 然后路径跟命名空间是对应的, 所以 `core.cljs` 中定义的命名空间就是: 24 | 25 | ```clojure 26 | (ns demo.core) 27 | ``` 28 | 29 | 如果命名空间中存在连字符 `a-b.core`, 文件名需要特殊处理 `a_b/core.cljs`. 30 | 否则编译过程当中会提示错误, 说文件找不到, 其实是特殊字符的坑. 31 | 32 | 当前命名空间的依赖这样写: 33 | 34 | ```clojure 35 | (ns demo.core 36 | (:require [clojure.string :as string] 37 | [clojure.set :refer [dfference]])) 38 | 39 | (println (string/blank? "")) 40 | (println (difference #{:a} #{:b})) 41 | ``` 42 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "dependencies": { 3 | "gitbook-plugin-ga": "1.0.1" 4 | }, 5 | "devDependencies": { 6 | "gitbook-cli": "^2.3.2", 7 | "http-server": "^0.11.1" 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /persistent.md: -------------------------------------------------------------------------------- 1 | 2 | 不可变数据 3 | ---- 4 | 5 | ClojureScript 中默认采用不可变数据作为底层实现. 6 | 7 | cljs 当中实现了 Persistent Data Structure, 8 | 虽然是不可变数据, 但创建新数据一般会进行结构复用, 9 | 也就是说, 比如下面这个例子, `b` 在内部实现中就可以复用 `a` 的某些部分 10 | 11 | ```clojure 12 | (def a {:a 1 :b 2}) 13 | ; #'cljs.user/a 14 | (assoc a :c 3) 15 | ; {:a 1, :b 2, :c 3} 16 | a 17 | ; {:a 1, :b 2} 18 | ``` 19 | 20 | 比如 Vector 的实现, 底层是一棵树, 通常在操作时能做到结构共享从而做到内存和性能的优化. 21 | 具体可以参考文章: 22 | [part 1](http://hypirion.com/musings/understanding-persistent-vector-pt-1) 23 | [part 2](http://hypirion.com/musings/understanding-persistent-vector-pt-2) 24 | [part 3](http://hypirion.com/musings/understanding-persistent-vector-pt-3) 25 | 26 | 比如 List 的实现, 实际是单链表. 27 | 28 | 关于 HashMap HashSet 等其他的数据结构还需要查阅更多文档... 29 | 30 | 有兴趣可以顺着链接继续翻[不可变数据][blog]. 31 | 32 | [blog]: https://segmentfault.com/a/1190000002957634 33 | -------------------------------------------------------------------------------- /publish-module.md: -------------------------------------------------------------------------------- 1 | 2 | 发布模块 3 | ---- 4 | 5 | ClojureScript 的模块按照 Clojure 的习惯, 是通过 jar 包发布在 https://clojars.org/ 的. 6 | 7 | Clojars 的教程涉及到一些复杂的内容. 我出于习惯使用已有的脚本来发布, 脚本运行时需要修改密码. 8 | 9 | > 注意替换这个脚本当中的账户名和包名, 然后以 `build.boot` 文件通过 Boot 来执行. 10 | 11 | ```clojure 12 | (defn read-password [guide] 13 | (String/valueOf (.readPassword (System/console) guide nil))) 14 | 15 | (set-env! 16 | :resource-paths #{"src"} 17 | :dependencies '[] 18 | :repositories #(conj % ["clojars" {:url "https://clojars.org/repo/" 19 | :username "" 20 | :password (read-password "Clojars password: ")}])) 21 | 22 | (def +version+ "0.1.0") 23 | 24 | (deftask deploy [] 25 | (comp 26 | (pom :project 'your-namespace/your-pacakge 27 | :version +version+ 28 | :description "" 29 | :url "https://github.com/your-org/your-package" 30 | :scm {:url "https://github.com/your-org/your-package"} 31 | :license {"MIT" "http://opensource.org/licenses/mit-license.php"}) 32 | (jar) 33 | (install) 34 | (push :repo "clojars" :gpg-sign false))) 35 | ``` 36 | 37 | 这个脚本跳过 GPG 密钥签名相关的操作, 如果你有需要请自行学习了解. 38 | -------------------------------------------------------------------------------- /repl.md: -------------------------------------------------------------------------------- 1 | 2 | REPL 3 | ---- 4 | 5 | 除了 Lumo, 还有其他一些工具提供 REPL. 6 | 7 | ### Clojure CLI 8 | 9 | 在 Clojure 1.9 当中有了 CLI 的支持, 可以通过 brew 安装: 10 | 11 | ```bash 12 | brew install clojure 13 | ``` 14 | 15 | 创建一个 `deps.edn` 文件, 定义模块依赖: 16 | 17 | ```edn 18 | {:deps {org.clojure/clojurescript {:mvn/version "1.9.946"}}}} 19 | ``` 20 | 21 | 通过 `clj` 命令行启动, 使用 `-m` 参数指定默认运行的 module: 22 | 23 | ```bash 24 | clj -m cljs.repl.node 25 | ``` 26 | 27 | [参考 Twitter](https://twitter.com/mfikes/status/939232383626342400). 28 | 29 | ### Planck 30 | 31 | 一个 macOS 环境的 REPL: http://planck-repl.org/ 32 | 33 | ```bash 34 | brew install planck 35 | ``` 36 | 37 | cljs 其实是自举完成的, 所以有时候可以脱离 JVM 作为编译器直接运行. 38 | 现在也可以运行在的 Windows 和 Linux, 然而安装方式我不清楚. 39 | 40 | ### shadow-cljs 41 | 42 | 可以直接启动 ClojureScript REPL: 43 | 44 | ```bash 45 | shadow-cljs cljs-repl 46 | ``` 47 | 48 | 也可以基于 JVM 启动一个 Clojure 的 REPL: 49 | 50 | ```bash 51 | shadow-cljs clj-repl 52 | ``` 53 | 54 | shadow-cljs 在 REPl 方面的功能相对 Lumo 少很多. 55 | 56 | ### npm 用户 57 | 58 | 有特别的需求的话, 也可以安装一下 npm 版本的 cljs, 59 | 提供了运行 cljs 的 API. 也有个 REPL. 60 | 考虑到 Planck 的 REPL 更优秀, 一般直接用 Planck. 61 | 62 | https://www.npmjs.com/package/clojurescript 63 | -------------------------------------------------------------------------------- /tail-recursion.md: -------------------------------------------------------------------------------- 1 | 2 | 尾递归优化 3 | ---- 4 | 5 | ### `recur` 6 | 7 | 尾递归优化是函数式编程不能缺少的一个性能优化方案. 8 | 没有尾递归, 常有的递归调用也会形成很深的调用栈消耗内存. 9 | cljs 和 Clojure 类似, 都需要通过声明 `recur` 进行优化. 10 | 最终代码会被编译为 `white` 结构的 js 代码,从而提高性能. 11 | 12 | ```clojure 13 | (defn factorial [acc n] 14 | (if (<= n 1) acc 15 | (recur (* acc n) (- n 1)))) 16 | 17 | (factorial 1 10) 18 | ``` 19 | 20 | ### `trampoline` 21 | 22 | `recur` 只能对当前函数进行尾递归, 如果尾递归涉及到多个函数, 23 | 需要借助新的函数作为跳板: 24 | 25 | https://clojuredocs.org/clojure.core/trampoline 26 | -------------------------------------------------------------------------------- /testing.md: -------------------------------------------------------------------------------- 1 | 2 | 单元测试 3 | ---- 4 | 5 | ClojureScript 的测试和 Clojure 语法类似, 通过 `cljs.test` 来提供. 6 | 首先需要引用下面这些函数或者 Macros: 7 | 8 | ```clojure 9 | (ns my-project.tests 10 | (:require [cljs.test :refer-macros [deftest is testing run-tests]])) 11 | ``` 12 | 13 | 然后可以定义一个测试: 14 | 15 | ```clojure 16 | (deftest test-numbers 17 | (is (= 1 1))) 18 | ``` 19 | 20 | 可以参考官方的 [Testing](https://clojurescript.org/tools/testing) 章节来了解细节. 21 | 22 | 最终测试通过 `run-tests` 来运行的. 不过也有可能测试框架当中集成了测试的调用代码. 23 | 24 | ### shadow-cljs 25 | 26 | 在 shadow-cljs 中可以使用 Node.js 程序运行的方式来加载运行测试代码, 比如: 27 | https://github.com/minimal-xyz/minimal-shadow-cljs-test 28 | 29 | 或者 `shadow-cljs test` 直接一次运行测试. 30 | 31 | ### boot-test 32 | 33 | 完成一些配置之后, 可以通过 `boot test` 来运行测试, 参考: 34 | https://github.com/adzerk-oss/boot-test#usage 35 | 36 | ### JVM 37 | 38 | 由于 `.cljc` 后缀的源码文件可以直接在 Clojure(Script) 两个环境加载, 所以可以用 Clojure 的工具链来测试. 39 | -------------------------------------------------------------------------------- /ui-programming.md: -------------------------------------------------------------------------------- 1 | 2 | 界面编程 3 | ---- 4 | 5 | 基本上都是 React 的绑定: 6 | 7 | * Reagent http://reagent-project.github.io/ 8 | * Om https://github.com/omcljs/om 9 | * Rum https://github.com/tonsky/rum 10 | 11 | 或者比如重新实现了 Virtual DOM 的类库: 12 | 13 | * Respo http://respo.site/ 14 | -------------------------------------------------------------------------------- /variable.md: -------------------------------------------------------------------------------- 1 | 2 | 变量 3 | ---- 4 | 5 | 在一个命名空间中定义变量可以这样写, 下面的代码可以在 Lumo 当中试验: 6 | 7 | ```clojure 8 | (def a 1) 9 | ; #'cljs.user/a 10 | ``` 11 | 12 | 也有局部的绑定, 通过 `let` 来定义: 13 | 14 | ```clojure 15 | (let [x 1 16 | y 2] 17 | (+ x y)) 18 | ; 3 19 | ``` 20 | 21 | 数据绑定之后, 一不可以修改. 22 | 23 | 在 cljs 环境里用到可变状态, 需要通过 `Atom` 类型定义可变状态: 24 | 25 | ```clojure 26 | (def b (atom 1)) 27 | ; #'cljs.user/b 28 | ``` 29 | 30 | `Atom` 类型是一个引用, 每次读取最新的数据时需要通过 `@b` 语法来取最新的值, 或者 `(deref b)`. 一般为了突出可变状态, 会使用 `*b` 这样的命名习惯. 这样定义和修改状态就是: 31 | 32 | ```clojure 33 | (def *b (atom 1)) 34 | ; #'cljs.user/b 35 | (reset! *b 2) 36 | ; 2 37 | ``` 38 | 39 | 由于前端经常使用热替换机制, 所以专门的函数, 避免热替换后重新计算绑定. 40 | `defonce` 一般是和 `Atom` 类型配合使用: 41 | 42 | ```clojure 43 | (defonce *c (atom 1)) 44 | ; #'cljs.user/*c 45 | ``` 46 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | JSONStream@~1.3.1: 6 | version "1.3.1" 7 | resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.1.tgz#707f761e01dae9e16f1bcf93703b78c70966579a" 8 | dependencies: 9 | jsonparse "^1.2.0" 10 | through ">=2.2.7 <3" 11 | 12 | abbrev@1, abbrev@~1.1.0: 13 | version "1.1.1" 14 | resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" 15 | 16 | abbrev@~1.0.9: 17 | version "1.0.9" 18 | resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" 19 | 20 | agent-base@4, agent-base@^4.1.0: 21 | version "4.1.1" 22 | resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.1.1.tgz#92d8a4fc2524a3b09b3666a33b6c97960f23d6a4" 23 | dependencies: 24 | es6-promisify "^5.0.0" 25 | 26 | agentkeepalive@^3.3.0: 27 | version "3.3.0" 28 | resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-3.3.0.tgz#6d5de5829afd3be2712201a39275fd11c651857c" 29 | dependencies: 30 | humanize-ms "^1.2.1" 31 | 32 | ajv@^4.9.1: 33 | version "4.11.8" 34 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" 35 | dependencies: 36 | co "^4.6.0" 37 | json-stable-stringify "^1.0.1" 38 | 39 | ajv@^5.1.0: 40 | version "5.2.3" 41 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.2.3.tgz#c06f598778c44c6b161abafe3466b81ad1814ed2" 42 | dependencies: 43 | co "^4.6.0" 44 | fast-deep-equal "^1.0.0" 45 | json-schema-traverse "^0.3.0" 46 | json-stable-stringify "^1.0.1" 47 | 48 | ansi-align@^2.0.0: 49 | version "2.0.0" 50 | resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f" 51 | dependencies: 52 | string-width "^2.0.0" 53 | 54 | ansi-regex@^2.0.0: 55 | version "2.1.1" 56 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 57 | 58 | ansi-regex@^3.0.0, ansi-regex@~3.0.0: 59 | version "3.0.0" 60 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" 61 | 62 | ansi-styles@^2.2.1: 63 | version "2.2.1" 64 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" 65 | 66 | ansi-styles@^3.1.0: 67 | version "3.2.0" 68 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.0.tgz#c159b8d5be0f9e5a6f346dab94f16ce022161b88" 69 | dependencies: 70 | color-convert "^1.9.0" 71 | 72 | ansi@^0.3.0, ansi@~0.3.1: 73 | version "0.3.1" 74 | resolved "https://registry.yarnpkg.com/ansi/-/ansi-0.3.1.tgz#0c42d4fb17160d5a9af1e484bace1c66922c1b21" 75 | 76 | ansicolors@~0.3.2: 77 | version "0.3.2" 78 | resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.3.2.tgz#665597de86a9ffe3aa9bfbe6cae5c6ea426b4979" 79 | 80 | ansistyles@~0.1.3: 81 | version "0.1.3" 82 | resolved "https://registry.yarnpkg.com/ansistyles/-/ansistyles-0.1.3.tgz#5de60415bda071bb37127854c864f41b23254539" 83 | 84 | aproba@^1.0.3, aproba@^1.1.1: 85 | version "1.2.0" 86 | resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" 87 | 88 | aproba@~1.1.2: 89 | version "1.1.2" 90 | resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.1.2.tgz#45c6629094de4e96f693ef7eab74ae079c240fc1" 91 | 92 | archy@~1.0.0: 93 | version "1.0.0" 94 | resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" 95 | 96 | are-we-there-yet@~1.1.2: 97 | version "1.1.4" 98 | resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d" 99 | dependencies: 100 | delegates "^1.0.0" 101 | readable-stream "^2.0.6" 102 | 103 | asap@^2.0.0: 104 | version "2.0.6" 105 | resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" 106 | 107 | asn1@~0.2.3: 108 | version "0.2.3" 109 | resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" 110 | 111 | assert-plus@1.0.0, assert-plus@^1.0.0: 112 | version "1.0.0" 113 | resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" 114 | 115 | assert-plus@^0.2.0: 116 | version "0.2.0" 117 | resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" 118 | 119 | async-some@~1.0.2: 120 | version "1.0.2" 121 | resolved "https://registry.yarnpkg.com/async-some/-/async-some-1.0.2.tgz#4d8a81620d5958791b5b98f802d3207776e95509" 122 | dependencies: 123 | dezalgo "^1.0.2" 124 | 125 | async@^1.5.2: 126 | version "1.5.2" 127 | resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" 128 | 129 | async@^2.0.1: 130 | version "2.5.0" 131 | resolved "https://registry.yarnpkg.com/async/-/async-2.5.0.tgz#843190fd6b7357a0b9e1c956edddd5ec8462b54d" 132 | dependencies: 133 | lodash "^4.14.0" 134 | 135 | asynckit@^0.4.0: 136 | version "0.4.0" 137 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 138 | 139 | aws-sign2@~0.6.0: 140 | version "0.6.0" 141 | resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" 142 | 143 | aws-sign2@~0.7.0: 144 | version "0.7.0" 145 | resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" 146 | 147 | aws4@^1.2.1, aws4@^1.6.0: 148 | version "1.6.0" 149 | resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" 150 | 151 | balanced-match@^1.0.0: 152 | version "1.0.0" 153 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 154 | 155 | bash-color@0.0.4: 156 | version "0.0.4" 157 | resolved "https://registry.yarnpkg.com/bash-color/-/bash-color-0.0.4.tgz#e9be8ce33540cada4881768c59bd63865736e913" 158 | 159 | bcrypt-pbkdf@^1.0.0: 160 | version "1.0.1" 161 | resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" 162 | dependencies: 163 | tweetnacl "^0.14.3" 164 | 165 | bl@^1.0.0: 166 | version "1.2.1" 167 | resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.1.tgz#cac328f7bee45730d404b692203fcb590e172d5e" 168 | dependencies: 169 | readable-stream "^2.0.5" 170 | 171 | bl@~1.1.2: 172 | version "1.1.2" 173 | resolved "https://registry.yarnpkg.com/bl/-/bl-1.1.2.tgz#fdca871a99713aa00d19e3bbba41c44787a65398" 174 | dependencies: 175 | readable-stream "~2.0.5" 176 | 177 | block-stream@*, block-stream@0.0.9: 178 | version "0.0.9" 179 | resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" 180 | dependencies: 181 | inherits "~2.0.0" 182 | 183 | bluebird@^3.5.0, bluebird@~3.5.0: 184 | version "3.5.0" 185 | resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.0.tgz#791420d7f551eea2897453a8a77653f96606d67c" 186 | 187 | boom@2.x.x: 188 | version "2.10.1" 189 | resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" 190 | dependencies: 191 | hoek "2.x.x" 192 | 193 | boom@4.x.x: 194 | version "4.3.1" 195 | resolved "https://registry.yarnpkg.com/boom/-/boom-4.3.1.tgz#4f8a3005cb4a7e3889f749030fd25b96e01d2e31" 196 | dependencies: 197 | hoek "4.x.x" 198 | 199 | boom@5.x.x: 200 | version "5.2.0" 201 | resolved "https://registry.yarnpkg.com/boom/-/boom-5.2.0.tgz#5dd9da6ee3a5f302077436290cb717d3f4a54e02" 202 | dependencies: 203 | hoek "4.x.x" 204 | 205 | boxen@^1.0.0: 206 | version "1.2.1" 207 | resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.2.1.tgz#0f11e7fe344edb9397977fc13ede7f64d956481d" 208 | dependencies: 209 | ansi-align "^2.0.0" 210 | camelcase "^4.0.0" 211 | chalk "^2.0.1" 212 | cli-boxes "^1.0.0" 213 | string-width "^2.0.0" 214 | term-size "^1.2.0" 215 | widest-line "^1.0.0" 216 | 217 | brace-expansion@^1.1.7: 218 | version "1.1.8" 219 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" 220 | dependencies: 221 | balanced-match "^1.0.0" 222 | concat-map "0.0.1" 223 | 224 | buffer-shims@^1.0.0: 225 | version "1.0.0" 226 | resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" 227 | 228 | builtin-modules@^1.0.0: 229 | version "1.1.1" 230 | resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" 231 | 232 | builtins@0.0.7: 233 | version "0.0.7" 234 | resolved "https://registry.yarnpkg.com/builtins/-/builtins-0.0.7.tgz#355219cd6cf18dbe7c01cc7fd2dce765cfdc549a" 235 | 236 | builtins@^1.0.3: 237 | version "1.0.3" 238 | resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" 239 | 240 | cacache@^9.2.9, cacache@~9.2.9: 241 | version "9.2.9" 242 | resolved "https://registry.yarnpkg.com/cacache/-/cacache-9.2.9.tgz#f9d7ffe039851ec94c28290662afa4dd4bb9e8dd" 243 | dependencies: 244 | bluebird "^3.5.0" 245 | chownr "^1.0.1" 246 | glob "^7.1.2" 247 | graceful-fs "^4.1.11" 248 | lru-cache "^4.1.1" 249 | mississippi "^1.3.0" 250 | mkdirp "^0.5.1" 251 | move-concurrently "^1.0.1" 252 | promise-inflight "^1.0.1" 253 | rimraf "^2.6.1" 254 | ssri "^4.1.6" 255 | unique-filename "^1.1.0" 256 | y18n "^3.2.1" 257 | 258 | call-limit@~1.1.0: 259 | version "1.1.0" 260 | resolved "https://registry.yarnpkg.com/call-limit/-/call-limit-1.1.0.tgz#6fd61b03f3da42a2cd0ec2b60f02bd0e71991fea" 261 | 262 | camelcase@^4.0.0: 263 | version "4.1.0" 264 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" 265 | 266 | capture-stack-trace@^1.0.0: 267 | version "1.0.0" 268 | resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz#4a6fa07399c26bba47f0b2496b4d0fb408c5550d" 269 | 270 | caseless@~0.11.0: 271 | version "0.11.0" 272 | resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7" 273 | 274 | caseless@~0.12.0: 275 | version "0.12.0" 276 | resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" 277 | 278 | chalk@^1.0.0, chalk@^1.1.1: 279 | version "1.1.3" 280 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" 281 | dependencies: 282 | ansi-styles "^2.2.1" 283 | escape-string-regexp "^1.0.2" 284 | has-ansi "^2.0.0" 285 | strip-ansi "^3.0.0" 286 | supports-color "^2.0.0" 287 | 288 | chalk@^2.0.1: 289 | version "2.1.0" 290 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.1.0.tgz#ac5becf14fa21b99c6c92ca7a7d7cfd5b17e743e" 291 | dependencies: 292 | ansi-styles "^3.1.0" 293 | escape-string-regexp "^1.0.5" 294 | supports-color "^4.0.0" 295 | 296 | char-spinner@~1.0.1: 297 | version "1.0.1" 298 | resolved "https://registry.yarnpkg.com/char-spinner/-/char-spinner-1.0.1.tgz#e6ea67bd247e107112983b7ab0479ed362800081" 299 | 300 | chmodr@~1.0.2: 301 | version "1.0.2" 302 | resolved "https://registry.yarnpkg.com/chmodr/-/chmodr-1.0.2.tgz#04662b932d0f02ec66deaa2b0ea42811968e3eb9" 303 | 304 | chownr@^1.0.1, chownr@~1.0.1: 305 | version "1.0.1" 306 | resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181" 307 | 308 | cli-boxes@^1.0.0: 309 | version "1.0.0" 310 | resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" 311 | 312 | clone@^1.0.2: 313 | version "1.0.2" 314 | resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.2.tgz#260b7a99ebb1edfe247538175f783243cb19d149" 315 | 316 | cmd-shim@~2.0.2: 317 | version "2.0.2" 318 | resolved "https://registry.yarnpkg.com/cmd-shim/-/cmd-shim-2.0.2.tgz#6fcbda99483a8fd15d7d30a196ca69d688a2efdb" 319 | dependencies: 320 | graceful-fs "^4.1.2" 321 | mkdirp "~0.5.0" 322 | 323 | co@^4.6.0: 324 | version "4.6.0" 325 | resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" 326 | 327 | code-point-at@^1.0.0: 328 | version "1.1.0" 329 | resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" 330 | 331 | color-convert@^1.9.0: 332 | version "1.9.0" 333 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.0.tgz#1accf97dd739b983bf994d56fec8f95853641b7a" 334 | dependencies: 335 | color-name "^1.1.1" 336 | 337 | color-name@^1.1.1: 338 | version "1.1.3" 339 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 340 | 341 | colors@1.0.3: 342 | version "1.0.3" 343 | resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" 344 | 345 | columnify@~1.5.4: 346 | version "1.5.4" 347 | resolved "https://registry.yarnpkg.com/columnify/-/columnify-1.5.4.tgz#4737ddf1c7b69a8a7c340570782e947eec8e78bb" 348 | dependencies: 349 | strip-ansi "^3.0.0" 350 | wcwidth "^1.0.0" 351 | 352 | combined-stream@^1.0.5, combined-stream@~1.0.5: 353 | version "1.0.5" 354 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" 355 | dependencies: 356 | delayed-stream "~1.0.0" 357 | 358 | commander@2.11.0, commander@^2.9.0: 359 | version "2.11.0" 360 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563" 361 | 362 | concat-map@0.0.1: 363 | version "0.0.1" 364 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 365 | 366 | concat-stream@^1.5.0, concat-stream@^1.5.2: 367 | version "1.6.0" 368 | resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" 369 | dependencies: 370 | inherits "^2.0.3" 371 | readable-stream "^2.2.2" 372 | typedarray "^0.0.6" 373 | 374 | config-chain@~1.1.10, config-chain@~1.1.11: 375 | version "1.1.11" 376 | resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.11.tgz#aba09747dfbe4c3e70e766a6e41586e1859fc6f2" 377 | dependencies: 378 | ini "^1.3.4" 379 | proto-list "~1.2.1" 380 | 381 | configstore@^3.0.0: 382 | version "3.1.1" 383 | resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.1.tgz#094ee662ab83fad9917678de114faaea8fcdca90" 384 | dependencies: 385 | dot-prop "^4.1.0" 386 | graceful-fs "^4.1.2" 387 | make-dir "^1.0.0" 388 | unique-string "^1.0.0" 389 | write-file-atomic "^2.0.0" 390 | xdg-basedir "^3.0.0" 391 | 392 | console-control-strings@^1.0.0, console-control-strings@~1.1.0: 393 | version "1.1.0" 394 | resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" 395 | 396 | copy-concurrently@^1.0.0: 397 | version "1.0.5" 398 | resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" 399 | dependencies: 400 | aproba "^1.1.1" 401 | fs-write-stream-atomic "^1.0.8" 402 | iferr "^0.1.5" 403 | mkdirp "^0.5.1" 404 | rimraf "^2.5.4" 405 | run-queue "^1.0.0" 406 | 407 | core-util-is@1.0.2, core-util-is@~1.0.0: 408 | version "1.0.2" 409 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 410 | 411 | corser@~2.0.0: 412 | version "2.0.1" 413 | resolved "https://registry.yarnpkg.com/corser/-/corser-2.0.1.tgz#8eda252ecaab5840dcd975ceb90d9370c819ff87" 414 | 415 | create-error-class@^3.0.0: 416 | version "3.0.2" 417 | resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" 418 | dependencies: 419 | capture-stack-trace "^1.0.0" 420 | 421 | cross-spawn@^5.0.1: 422 | version "5.1.0" 423 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" 424 | dependencies: 425 | lru-cache "^4.0.1" 426 | shebang-command "^1.2.0" 427 | which "^1.2.9" 428 | 429 | cryptiles@2.x.x: 430 | version "2.0.5" 431 | resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" 432 | dependencies: 433 | boom "2.x.x" 434 | 435 | cryptiles@3.x.x: 436 | version "3.1.2" 437 | resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-3.1.2.tgz#a89fbb220f5ce25ec56e8c4aa8a4fd7b5b0d29fe" 438 | dependencies: 439 | boom "5.x.x" 440 | 441 | crypto-random-string@^1.0.0: 442 | version "1.0.0" 443 | resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" 444 | 445 | cyclist@~0.2.2: 446 | version "0.2.2" 447 | resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640" 448 | 449 | dashdash@^1.12.0: 450 | version "1.14.1" 451 | resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" 452 | dependencies: 453 | assert-plus "^1.0.0" 454 | 455 | debug@2, debug@^2.2.0, debug@^2.4.1: 456 | version "2.6.9" 457 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 458 | dependencies: 459 | ms "2.0.0" 460 | 461 | debuglog@^1.0.1: 462 | version "1.0.1" 463 | resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" 464 | 465 | deep-extend@~0.4.0: 466 | version "0.4.2" 467 | resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f" 468 | 469 | defaults@^1.0.3: 470 | version "1.0.3" 471 | resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" 472 | dependencies: 473 | clone "^1.0.2" 474 | 475 | delayed-stream@~1.0.0: 476 | version "1.0.0" 477 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 478 | 479 | delegates@^1.0.0: 480 | version "1.0.0" 481 | resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" 482 | 483 | detect-indent@~5.0.0: 484 | version "5.0.0" 485 | resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d" 486 | 487 | dezalgo@^1.0.0, dezalgo@^1.0.1, dezalgo@^1.0.2, dezalgo@~1.0.3: 488 | version "1.0.3" 489 | resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.3.tgz#7f742de066fc748bc8db820569dddce49bf0d456" 490 | dependencies: 491 | asap "^2.0.0" 492 | wrappy "1" 493 | 494 | dot-prop@^4.1.0: 495 | version "4.2.0" 496 | resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" 497 | dependencies: 498 | is-obj "^1.0.0" 499 | 500 | duplexer3@^0.1.4: 501 | version "0.1.4" 502 | resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" 503 | 504 | duplexify@^3.1.2, duplexify@^3.4.2: 505 | version "3.5.1" 506 | resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.5.1.tgz#4e1516be68838bc90a49994f0b39a6e5960befcd" 507 | dependencies: 508 | end-of-stream "^1.0.0" 509 | inherits "^2.0.1" 510 | readable-stream "^2.0.0" 511 | stream-shift "^1.0.0" 512 | 513 | ecc-jsbn@~0.1.1: 514 | version "0.1.1" 515 | resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" 516 | dependencies: 517 | jsbn "~0.1.0" 518 | 519 | ecstatic@^3.0.0: 520 | version "3.2.0" 521 | resolved "https://registry.yarnpkg.com/ecstatic/-/ecstatic-3.2.0.tgz#1b1aee1ca7c6b99cfb5cf6c9b26b481b90c4409f" 522 | dependencies: 523 | he "^1.1.1" 524 | mime "^1.4.1" 525 | minimist "^1.1.0" 526 | url-join "^2.0.2" 527 | 528 | editor@~1.0.0: 529 | version "1.0.0" 530 | resolved "https://registry.yarnpkg.com/editor/-/editor-1.0.0.tgz#60c7f87bd62bcc6a894fa8ccd6afb7823a24f742" 531 | 532 | encoding@^0.1.11: 533 | version "0.1.12" 534 | resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" 535 | dependencies: 536 | iconv-lite "~0.4.13" 537 | 538 | end-of-stream@^1.0.0, end-of-stream@^1.1.0: 539 | version "1.4.0" 540 | resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.0.tgz#7a90d833efda6cfa6eac0f4949dbb0fad3a63206" 541 | dependencies: 542 | once "^1.4.0" 543 | 544 | err-code@^1.0.0: 545 | version "1.1.2" 546 | resolved "https://registry.yarnpkg.com/err-code/-/err-code-1.1.2.tgz#06e0116d3028f6aef4806849eb0ea6a748ae6960" 547 | 548 | "errno@>=0.1.1 <0.2.0-0": 549 | version "0.1.4" 550 | resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.4.tgz#b896e23a9e5e8ba33871fc996abd3635fc9a1c7d" 551 | dependencies: 552 | prr "~0.0.0" 553 | 554 | es6-promise@^4.0.3: 555 | version "4.1.1" 556 | resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.1.1.tgz#8811e90915d9a0dba36274f0b242dbda78f9c92a" 557 | 558 | es6-promisify@^5.0.0: 559 | version "5.0.0" 560 | resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" 561 | dependencies: 562 | es6-promise "^4.0.3" 563 | 564 | escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: 565 | version "1.0.5" 566 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 567 | 568 | eventemitter3@1.x.x: 569 | version "1.2.0" 570 | resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-1.2.0.tgz#1c86991d816ad1e504750e73874224ecf3bec508" 571 | 572 | execa@^0.7.0: 573 | version "0.7.0" 574 | resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" 575 | dependencies: 576 | cross-spawn "^5.0.1" 577 | get-stream "^3.0.0" 578 | is-stream "^1.1.0" 579 | npm-run-path "^2.0.0" 580 | p-finally "^1.0.0" 581 | signal-exit "^3.0.0" 582 | strip-eof "^1.0.0" 583 | 584 | extend@~3.0.0, extend@~3.0.1: 585 | version "3.0.1" 586 | resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" 587 | 588 | extsprintf@1.3.0, extsprintf@^1.2.0: 589 | version "1.3.0" 590 | resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" 591 | 592 | fast-deep-equal@^1.0.0: 593 | version "1.0.0" 594 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz#96256a3bc975595eb36d82e9929d060d893439ff" 595 | 596 | flush-write-stream@^1.0.0: 597 | version "1.0.2" 598 | resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.0.2.tgz#c81b90d8746766f1a609a46809946c45dd8ae417" 599 | dependencies: 600 | inherits "^2.0.1" 601 | readable-stream "^2.0.4" 602 | 603 | forever-agent@~0.6.1: 604 | version "0.6.1" 605 | resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" 606 | 607 | form-data@~1.0.0-rc4: 608 | version "1.0.1" 609 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-1.0.1.tgz#ae315db9a4907fa065502304a66d7733475ee37c" 610 | dependencies: 611 | async "^2.0.1" 612 | combined-stream "^1.0.5" 613 | mime-types "^2.1.11" 614 | 615 | form-data@~2.1.1: 616 | version "2.1.4" 617 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1" 618 | dependencies: 619 | asynckit "^0.4.0" 620 | combined-stream "^1.0.5" 621 | mime-types "^2.1.12" 622 | 623 | form-data@~2.3.1: 624 | version "2.3.1" 625 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.1.tgz#6fb94fbd71885306d73d15cc497fe4cc4ecd44bf" 626 | dependencies: 627 | asynckit "^0.4.0" 628 | combined-stream "^1.0.5" 629 | mime-types "^2.1.12" 630 | 631 | from2@^1.3.0: 632 | version "1.3.0" 633 | resolved "https://registry.yarnpkg.com/from2/-/from2-1.3.0.tgz#88413baaa5f9a597cfde9221d86986cd3c061dfd" 634 | dependencies: 635 | inherits "~2.0.1" 636 | readable-stream "~1.1.10" 637 | 638 | from2@^2.1.0: 639 | version "2.3.0" 640 | resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" 641 | dependencies: 642 | inherits "^2.0.1" 643 | readable-stream "^2.0.0" 644 | 645 | fs-extra@3.0.1: 646 | version "3.0.1" 647 | resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-3.0.1.tgz#3794f378c58b342ea7dbbb23095109c4b3b62291" 648 | dependencies: 649 | graceful-fs "^4.1.2" 650 | jsonfile "^3.0.0" 651 | universalify "^0.1.0" 652 | 653 | fs-vacuum@~1.2.10, fs-vacuum@~1.2.9: 654 | version "1.2.10" 655 | resolved "https://registry.yarnpkg.com/fs-vacuum/-/fs-vacuum-1.2.10.tgz#b7629bec07a4031a2548fdf99f5ecf1cc8b31e36" 656 | dependencies: 657 | graceful-fs "^4.1.2" 658 | path-is-inside "^1.0.1" 659 | rimraf "^2.5.2" 660 | 661 | fs-write-stream-atomic@^1.0.8, fs-write-stream-atomic@~1.0.10, fs-write-stream-atomic@~1.0.8: 662 | version "1.0.10" 663 | resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" 664 | dependencies: 665 | graceful-fs "^4.1.2" 666 | iferr "^0.1.5" 667 | imurmurhash "^0.1.4" 668 | readable-stream "1 || 2" 669 | 670 | fs.realpath@^1.0.0: 671 | version "1.0.0" 672 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 673 | 674 | fstream-ignore@^1.0.0: 675 | version "1.0.5" 676 | resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" 677 | dependencies: 678 | fstream "^1.0.0" 679 | inherits "2" 680 | minimatch "^3.0.0" 681 | 682 | fstream-npm@~1.1.1: 683 | version "1.1.1" 684 | resolved "https://registry.yarnpkg.com/fstream-npm/-/fstream-npm-1.1.1.tgz#6b9175db6239a83d8209e232426c494dbb29690c" 685 | dependencies: 686 | fstream-ignore "^1.0.0" 687 | inherits "2" 688 | 689 | fstream-npm@~1.2.1: 690 | version "1.2.1" 691 | resolved "https://registry.yarnpkg.com/fstream-npm/-/fstream-npm-1.2.1.tgz#08c4a452f789dcbac4c89a4563c902b2c862fd5b" 692 | dependencies: 693 | fstream-ignore "^1.0.0" 694 | inherits "2" 695 | 696 | fstream@^1.0.0, fstream@^1.0.2, fstream@~1.0.10, fstream@~1.0.11: 697 | version "1.0.11" 698 | resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" 699 | dependencies: 700 | graceful-fs "^4.1.2" 701 | inherits "~2.0.0" 702 | mkdirp ">=0.5 0" 703 | rimraf "2" 704 | 705 | gauge@~1.2.5: 706 | version "1.2.7" 707 | resolved "https://registry.yarnpkg.com/gauge/-/gauge-1.2.7.tgz#e9cec5483d3d4ee0ef44b60a7d99e4935e136d93" 708 | dependencies: 709 | ansi "^0.3.0" 710 | has-unicode "^2.0.0" 711 | lodash.pad "^4.1.0" 712 | lodash.padend "^4.1.0" 713 | lodash.padstart "^4.1.0" 714 | 715 | gauge@~2.6.0: 716 | version "2.6.0" 717 | resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.6.0.tgz#d35301ad18e96902b4751dcbbe40f4218b942a46" 718 | dependencies: 719 | aproba "^1.0.3" 720 | console-control-strings "^1.0.0" 721 | has-color "^0.1.7" 722 | has-unicode "^2.0.0" 723 | object-assign "^4.1.0" 724 | signal-exit "^3.0.0" 725 | string-width "^1.0.1" 726 | strip-ansi "^3.0.1" 727 | wide-align "^1.1.0" 728 | 729 | gauge@~2.7.3: 730 | version "2.7.4" 731 | resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" 732 | dependencies: 733 | aproba "^1.0.3" 734 | console-control-strings "^1.0.0" 735 | has-unicode "^2.0.0" 736 | object-assign "^4.1.0" 737 | signal-exit "^3.0.0" 738 | string-width "^1.0.1" 739 | strip-ansi "^3.0.1" 740 | wide-align "^1.1.0" 741 | 742 | generate-function@^2.0.0: 743 | version "2.0.0" 744 | resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74" 745 | 746 | generate-object-property@^1.1.0: 747 | version "1.2.0" 748 | resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0" 749 | dependencies: 750 | is-property "^1.0.0" 751 | 752 | genfun@^4.0.1: 753 | version "4.0.1" 754 | resolved "https://registry.yarnpkg.com/genfun/-/genfun-4.0.1.tgz#ed10041f2e4a7f1b0a38466d17a5c3e27df1dfc1" 755 | 756 | get-stream@^3.0.0: 757 | version "3.0.0" 758 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" 759 | 760 | getpass@^0.1.1: 761 | version "0.1.7" 762 | resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" 763 | dependencies: 764 | assert-plus "^1.0.0" 765 | 766 | gitbook-cli@^2.3.2: 767 | version "2.3.2" 768 | resolved "https://registry.yarnpkg.com/gitbook-cli/-/gitbook-cli-2.3.2.tgz#5e893582e1f743f6fa920c3c3eb36b62ea4a31a0" 769 | dependencies: 770 | bash-color "0.0.4" 771 | commander "2.11.0" 772 | fs-extra "3.0.1" 773 | lodash "4.17.4" 774 | npm "5.1.0" 775 | npmi "1.0.1" 776 | optimist "0.6.1" 777 | q "1.5.0" 778 | semver "5.3.0" 779 | tmp "0.0.31" 780 | user-home "2.0.0" 781 | 782 | gitbook-plugin-ga@1.0.1: 783 | version "1.0.1" 784 | resolved "https://registry.yarnpkg.com/gitbook-plugin-ga/-/gitbook-plugin-ga-1.0.1.tgz#c85d7b8c01640c4bb3dc3b231ab9fe74aa6e521b" 785 | 786 | github-url-from-git@~1.4.0: 787 | version "1.4.0" 788 | resolved "https://registry.yarnpkg.com/github-url-from-git/-/github-url-from-git-1.4.0.tgz#285e6b520819001bde128674704379e4ff03e0de" 789 | 790 | github-url-from-username-repo@~1.0.2: 791 | version "1.0.2" 792 | resolved "https://registry.yarnpkg.com/github-url-from-username-repo/-/github-url-from-username-repo-1.0.2.tgz#7dd79330d2abe69c10c2cef79714c97215791dfa" 793 | 794 | glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@~7.1.2: 795 | version "7.1.2" 796 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" 797 | dependencies: 798 | fs.realpath "^1.0.0" 799 | inflight "^1.0.4" 800 | inherits "2" 801 | minimatch "^3.0.4" 802 | once "^1.3.0" 803 | path-is-absolute "^1.0.0" 804 | 805 | glob@~7.0.6: 806 | version "7.0.6" 807 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.0.6.tgz#211bafaf49e525b8cd93260d14ab136152b3f57a" 808 | dependencies: 809 | fs.realpath "^1.0.0" 810 | inflight "^1.0.4" 811 | inherits "2" 812 | minimatch "^3.0.2" 813 | once "^1.3.0" 814 | path-is-absolute "^1.0.0" 815 | 816 | got@^6.7.1: 817 | version "6.7.1" 818 | resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" 819 | dependencies: 820 | create-error-class "^3.0.0" 821 | duplexer3 "^0.1.4" 822 | get-stream "^3.0.0" 823 | is-redirect "^1.0.0" 824 | is-retry-allowed "^1.0.0" 825 | is-stream "^1.0.0" 826 | lowercase-keys "^1.0.0" 827 | safe-buffer "^5.0.1" 828 | timed-out "^4.0.0" 829 | unzip-response "^2.0.1" 830 | url-parse-lax "^1.0.0" 831 | 832 | graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@~4.1.11, graceful-fs@~4.1.6: 833 | version "4.1.11" 834 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" 835 | 836 | har-schema@^1.0.5: 837 | version "1.0.5" 838 | resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" 839 | 840 | har-schema@^2.0.0: 841 | version "2.0.0" 842 | resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" 843 | 844 | har-validator@~2.0.6: 845 | version "2.0.6" 846 | resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-2.0.6.tgz#cdcbc08188265ad119b6a5a7c8ab70eecfb5d27d" 847 | dependencies: 848 | chalk "^1.1.1" 849 | commander "^2.9.0" 850 | is-my-json-valid "^2.12.4" 851 | pinkie-promise "^2.0.0" 852 | 853 | har-validator@~4.2.1: 854 | version "4.2.1" 855 | resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a" 856 | dependencies: 857 | ajv "^4.9.1" 858 | har-schema "^1.0.5" 859 | 860 | har-validator@~5.0.3: 861 | version "5.0.3" 862 | resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd" 863 | dependencies: 864 | ajv "^5.1.0" 865 | har-schema "^2.0.0" 866 | 867 | has-ansi@^2.0.0: 868 | version "2.0.0" 869 | resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" 870 | dependencies: 871 | ansi-regex "^2.0.0" 872 | 873 | has-color@^0.1.7: 874 | version "0.1.7" 875 | resolved "https://registry.yarnpkg.com/has-color/-/has-color-0.1.7.tgz#67144a5260c34fc3cca677d041daf52fe7b78b2f" 876 | 877 | has-flag@^2.0.0: 878 | version "2.0.0" 879 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" 880 | 881 | has-unicode@^2.0.0, has-unicode@~2.0.1: 882 | version "2.0.1" 883 | resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" 884 | 885 | hawk@~3.1.3: 886 | version "3.1.3" 887 | resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" 888 | dependencies: 889 | boom "2.x.x" 890 | cryptiles "2.x.x" 891 | hoek "2.x.x" 892 | sntp "1.x.x" 893 | 894 | hawk@~6.0.2: 895 | version "6.0.2" 896 | resolved "https://registry.yarnpkg.com/hawk/-/hawk-6.0.2.tgz#af4d914eb065f9b5ce4d9d11c1cb2126eecc3038" 897 | dependencies: 898 | boom "4.x.x" 899 | cryptiles "3.x.x" 900 | hoek "4.x.x" 901 | sntp "2.x.x" 902 | 903 | he@^1.1.1: 904 | version "1.1.1" 905 | resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" 906 | 907 | hoek@2.x.x: 908 | version "2.16.3" 909 | resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" 910 | 911 | hoek@4.x.x: 912 | version "4.2.0" 913 | resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.0.tgz#72d9d0754f7fe25ca2d01ad8f8f9a9449a89526d" 914 | 915 | hosted-git-info@^2.1.4, hosted-git-info@^2.1.5, hosted-git-info@^2.4.2, hosted-git-info@~2.5.0: 916 | version "2.5.0" 917 | resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.5.0.tgz#6d60e34b3abbc8313062c3b798ef8d901a07af3c" 918 | 919 | hosted-git-info@~2.1.5: 920 | version "2.1.5" 921 | resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.1.5.tgz#0ba81d90da2e25ab34a332e6ec77936e1598118b" 922 | 923 | http-cache-semantics@^3.7.3: 924 | version "3.7.3" 925 | resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-3.7.3.tgz#2f35c532ecd29f1e5413b9af833b724a3c6f7f72" 926 | 927 | http-proxy-agent@^2.0.0: 928 | version "2.0.0" 929 | resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-2.0.0.tgz#46482a2f0523a4d6082551709f469cb3e4a85ff4" 930 | dependencies: 931 | agent-base "4" 932 | debug "2" 933 | 934 | http-proxy@^1.8.1: 935 | version "1.16.2" 936 | resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.16.2.tgz#06dff292952bf64dbe8471fa9df73066d4f37742" 937 | dependencies: 938 | eventemitter3 "1.x.x" 939 | requires-port "1.x.x" 940 | 941 | http-server@^0.11.1: 942 | version "0.11.1" 943 | resolved "https://registry.yarnpkg.com/http-server/-/http-server-0.11.1.tgz#2302a56a6ffef7f9abea0147d838a5e9b6b6a79b" 944 | dependencies: 945 | colors "1.0.3" 946 | corser "~2.0.0" 947 | ecstatic "^3.0.0" 948 | http-proxy "^1.8.1" 949 | opener "~1.4.0" 950 | optimist "0.6.x" 951 | portfinder "^1.0.13" 952 | union "~0.4.3" 953 | 954 | http-signature@~1.1.0: 955 | version "1.1.1" 956 | resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" 957 | dependencies: 958 | assert-plus "^0.2.0" 959 | jsprim "^1.2.2" 960 | sshpk "^1.7.0" 961 | 962 | http-signature@~1.2.0: 963 | version "1.2.0" 964 | resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" 965 | dependencies: 966 | assert-plus "^1.0.0" 967 | jsprim "^1.2.2" 968 | sshpk "^1.7.0" 969 | 970 | https-proxy-agent@^2.0.0: 971 | version "2.1.0" 972 | resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.1.0.tgz#1391bee7fd66aeabc0df2a1fa90f58954f43e443" 973 | dependencies: 974 | agent-base "^4.1.0" 975 | debug "^2.4.1" 976 | 977 | humanize-ms@^1.2.1: 978 | version "1.2.1" 979 | resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" 980 | dependencies: 981 | ms "^2.0.0" 982 | 983 | iconv-lite@~0.4.13: 984 | version "0.4.19" 985 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" 986 | 987 | iferr@^0.1.5, iferr@~0.1.5: 988 | version "0.1.5" 989 | resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" 990 | 991 | import-lazy@^2.1.0: 992 | version "2.1.0" 993 | resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" 994 | 995 | imurmurhash@^0.1.4: 996 | version "0.1.4" 997 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 998 | 999 | inflight@^1.0.4, inflight@~1.0.4, inflight@~1.0.6: 1000 | version "1.0.6" 1001 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 1002 | dependencies: 1003 | once "^1.3.0" 1004 | wrappy "1" 1005 | 1006 | inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: 1007 | version "2.0.3" 1008 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 1009 | 1010 | ini@^1.3.4, ini@~1.3.0, ini@~1.3.4: 1011 | version "1.3.4" 1012 | resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" 1013 | 1014 | init-package-json@~1.10.1: 1015 | version "1.10.1" 1016 | resolved "https://registry.yarnpkg.com/init-package-json/-/init-package-json-1.10.1.tgz#cd873a167796befb99612b28762a0b6393fd8f6a" 1017 | dependencies: 1018 | glob "^7.1.1" 1019 | npm-package-arg "^4.0.0 || ^5.0.0" 1020 | promzard "^0.3.0" 1021 | read "~1.0.1" 1022 | read-package-json "1 || 2" 1023 | semver "2.x || 3.x || 4 || 5" 1024 | validate-npm-package-license "^3.0.1" 1025 | validate-npm-package-name "^3.0.0" 1026 | 1027 | init-package-json@~1.9.4: 1028 | version "1.9.6" 1029 | resolved "https://registry.yarnpkg.com/init-package-json/-/init-package-json-1.9.6.tgz#789fc2b74466a4952b9ea77c0575bc78ebd60a61" 1030 | dependencies: 1031 | glob "^7.1.1" 1032 | npm-package-arg "^4.0.0 || ^5.0.0" 1033 | promzard "^0.3.0" 1034 | read "~1.0.1" 1035 | read-package-json "1 || 2" 1036 | semver "2.x || 3.x || 4 || 5" 1037 | validate-npm-package-license "^3.0.1" 1038 | validate-npm-package-name "^3.0.0" 1039 | 1040 | ip@^1.1.4: 1041 | version "1.1.5" 1042 | resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" 1043 | 1044 | is-builtin-module@^1.0.0: 1045 | version "1.0.0" 1046 | resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" 1047 | dependencies: 1048 | builtin-modules "^1.0.0" 1049 | 1050 | is-fullwidth-code-point@^1.0.0: 1051 | version "1.0.0" 1052 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" 1053 | dependencies: 1054 | number-is-nan "^1.0.0" 1055 | 1056 | is-fullwidth-code-point@^2.0.0: 1057 | version "2.0.0" 1058 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 1059 | 1060 | is-my-json-valid@^2.12.4: 1061 | version "2.16.1" 1062 | resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.16.1.tgz#5a846777e2c2620d1e69104e5d3a03b1f6088f11" 1063 | dependencies: 1064 | generate-function "^2.0.0" 1065 | generate-object-property "^1.1.0" 1066 | jsonpointer "^4.0.0" 1067 | xtend "^4.0.0" 1068 | 1069 | is-npm@^1.0.0: 1070 | version "1.0.0" 1071 | resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" 1072 | 1073 | is-obj@^1.0.0: 1074 | version "1.0.1" 1075 | resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" 1076 | 1077 | is-property@^1.0.0: 1078 | version "1.0.2" 1079 | resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" 1080 | 1081 | is-redirect@^1.0.0: 1082 | version "1.0.0" 1083 | resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" 1084 | 1085 | is-retry-allowed@^1.0.0: 1086 | version "1.1.0" 1087 | resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" 1088 | 1089 | is-stream@^1.0.0, is-stream@^1.1.0: 1090 | version "1.1.0" 1091 | resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" 1092 | 1093 | is-typedarray@~1.0.0: 1094 | version "1.0.0" 1095 | resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" 1096 | 1097 | isarray@0.0.1: 1098 | version "0.0.1" 1099 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" 1100 | 1101 | isarray@~1.0.0: 1102 | version "1.0.0" 1103 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 1104 | 1105 | isexe@^2.0.0: 1106 | version "2.0.0" 1107 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 1108 | 1109 | isstream@~0.1.2: 1110 | version "0.1.2" 1111 | resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" 1112 | 1113 | jsbn@~0.1.0: 1114 | version "0.1.1" 1115 | resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" 1116 | 1117 | json-parse-better-errors@^1.0.0: 1118 | version "1.0.1" 1119 | resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.1.tgz#50183cd1b2d25275de069e9e71b467ac9eab973a" 1120 | 1121 | json-schema-traverse@^0.3.0: 1122 | version "0.3.1" 1123 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" 1124 | 1125 | json-schema@0.2.3: 1126 | version "0.2.3" 1127 | resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" 1128 | 1129 | json-stable-stringify@^1.0.1: 1130 | version "1.0.1" 1131 | resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" 1132 | dependencies: 1133 | jsonify "~0.0.0" 1134 | 1135 | json-stringify-safe@~5.0.1: 1136 | version "5.0.1" 1137 | resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" 1138 | 1139 | jsonfile@^3.0.0: 1140 | version "3.0.1" 1141 | resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-3.0.1.tgz#a5ecc6f65f53f662c4415c7675a0331d0992ec66" 1142 | optionalDependencies: 1143 | graceful-fs "^4.1.6" 1144 | 1145 | jsonify@~0.0.0: 1146 | version "0.0.0" 1147 | resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" 1148 | 1149 | jsonparse@^1.2.0: 1150 | version "1.3.1" 1151 | resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" 1152 | 1153 | jsonpointer@^4.0.0: 1154 | version "4.0.1" 1155 | resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9" 1156 | 1157 | jsprim@^1.2.2: 1158 | version "1.4.1" 1159 | resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" 1160 | dependencies: 1161 | assert-plus "1.0.0" 1162 | extsprintf "1.3.0" 1163 | json-schema "0.2.3" 1164 | verror "1.10.0" 1165 | 1166 | latest-version@^3.0.0: 1167 | version "3.1.0" 1168 | resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15" 1169 | dependencies: 1170 | package-json "^4.0.0" 1171 | 1172 | lazy-property@~1.0.0: 1173 | version "1.0.0" 1174 | resolved "https://registry.yarnpkg.com/lazy-property/-/lazy-property-1.0.0.tgz#84ddc4b370679ba8bd4cdcfa4c06b43d57111147" 1175 | 1176 | lockfile@~1.0.1, lockfile@~1.0.3: 1177 | version "1.0.3" 1178 | resolved "https://registry.yarnpkg.com/lockfile/-/lockfile-1.0.3.tgz#2638fc39a0331e9cac1a04b71799931c9c50df79" 1179 | 1180 | lodash._baseuniq@~4.6.0: 1181 | version "4.6.0" 1182 | resolved "https://registry.yarnpkg.com/lodash._baseuniq/-/lodash._baseuniq-4.6.0.tgz#0ebb44e456814af7905c6212fa2c9b2d51b841e8" 1183 | dependencies: 1184 | lodash._createset "~4.0.0" 1185 | lodash._root "~3.0.0" 1186 | 1187 | lodash._createset@~4.0.0: 1188 | version "4.0.3" 1189 | resolved "https://registry.yarnpkg.com/lodash._createset/-/lodash._createset-4.0.3.tgz#0f4659fbb09d75194fa9e2b88a6644d363c9fe26" 1190 | 1191 | lodash._root@~3.0.0: 1192 | version "3.0.1" 1193 | resolved "https://registry.yarnpkg.com/lodash._root/-/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692" 1194 | 1195 | lodash.clonedeep@~4.5.0: 1196 | version "4.5.0" 1197 | resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" 1198 | 1199 | lodash.pad@^4.1.0: 1200 | version "4.5.1" 1201 | resolved "https://registry.yarnpkg.com/lodash.pad/-/lodash.pad-4.5.1.tgz#4330949a833a7c8da22cc20f6a26c4d59debba70" 1202 | 1203 | lodash.padend@^4.1.0: 1204 | version "4.6.1" 1205 | resolved "https://registry.yarnpkg.com/lodash.padend/-/lodash.padend-4.6.1.tgz#53ccba047d06e158d311f45da625f4e49e6f166e" 1206 | 1207 | lodash.padstart@^4.1.0: 1208 | version "4.6.1" 1209 | resolved "https://registry.yarnpkg.com/lodash.padstart/-/lodash.padstart-4.6.1.tgz#d2e3eebff0d9d39ad50f5cbd1b52a7bce6bb611b" 1210 | 1211 | lodash.union@~4.6.0: 1212 | version "4.6.0" 1213 | resolved "https://registry.yarnpkg.com/lodash.union/-/lodash.union-4.6.0.tgz#48bb5088409f16f1821666641c44dd1aaae3cd88" 1214 | 1215 | lodash.uniq@~4.5.0: 1216 | version "4.5.0" 1217 | resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" 1218 | 1219 | lodash.without@~4.4.0: 1220 | version "4.4.0" 1221 | resolved "https://registry.yarnpkg.com/lodash.without/-/lodash.without-4.4.0.tgz#3cd4574a00b67bae373a94b748772640507b7aac" 1222 | 1223 | lodash@4.17.4, lodash@^4.14.0: 1224 | version "4.17.4" 1225 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" 1226 | 1227 | lowercase-keys@^1.0.0: 1228 | version "1.0.0" 1229 | resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306" 1230 | 1231 | lru-cache@^4.0.1, lru-cache@^4.1.1, lru-cache@~4.1.1: 1232 | version "4.1.1" 1233 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55" 1234 | dependencies: 1235 | pseudomap "^1.0.2" 1236 | yallist "^2.1.2" 1237 | 1238 | lru-cache@~4.0.1: 1239 | version "4.0.2" 1240 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.0.2.tgz#1d17679c069cda5d040991a09dbc2c0db377e55e" 1241 | dependencies: 1242 | pseudomap "^1.0.1" 1243 | yallist "^2.0.0" 1244 | 1245 | make-dir@^1.0.0: 1246 | version "1.0.0" 1247 | resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.0.0.tgz#97a011751e91dd87cfadef58832ebb04936de978" 1248 | dependencies: 1249 | pify "^2.3.0" 1250 | 1251 | make-fetch-happen@^2.4.13: 1252 | version "2.5.0" 1253 | resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-2.5.0.tgz#08c22d499f4f30111addba79fe87c98cf01b6bc8" 1254 | dependencies: 1255 | agentkeepalive "^3.3.0" 1256 | cacache "^9.2.9" 1257 | http-cache-semantics "^3.7.3" 1258 | http-proxy-agent "^2.0.0" 1259 | https-proxy-agent "^2.0.0" 1260 | lru-cache "^4.1.1" 1261 | mississippi "^1.2.0" 1262 | node-fetch-npm "^2.0.1" 1263 | promise-retry "^1.1.1" 1264 | socks-proxy-agent "^3.0.0" 1265 | ssri "^4.1.6" 1266 | 1267 | mime-db@~1.30.0: 1268 | version "1.30.0" 1269 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01" 1270 | 1271 | mime-types@^2.1.11, mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.7: 1272 | version "2.1.17" 1273 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.17.tgz#09d7a393f03e995a79f8af857b70a9e0ab16557a" 1274 | dependencies: 1275 | mime-db "~1.30.0" 1276 | 1277 | mime@^1.4.1: 1278 | version "1.6.0" 1279 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" 1280 | 1281 | minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.4, minimatch@~3.0.3: 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 | minimist@^1.1.0, minimist@^1.2.0: 1292 | version "1.2.0" 1293 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" 1294 | 1295 | minimist@~0.0.1: 1296 | version "0.0.10" 1297 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" 1298 | 1299 | mississippi@^1.2.0, mississippi@^1.3.0, mississippi@~1.3.0: 1300 | version "1.3.0" 1301 | resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-1.3.0.tgz#d201583eb12327e3c5c1642a404a9cacf94e34f5" 1302 | dependencies: 1303 | concat-stream "^1.5.0" 1304 | duplexify "^3.4.2" 1305 | end-of-stream "^1.1.0" 1306 | flush-write-stream "^1.0.0" 1307 | from2 "^2.1.0" 1308 | parallel-transform "^1.1.0" 1309 | pump "^1.0.0" 1310 | pumpify "^1.3.3" 1311 | stream-each "^1.1.0" 1312 | through2 "^2.0.0" 1313 | 1314 | mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: 1315 | version "0.5.1" 1316 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 1317 | dependencies: 1318 | minimist "0.0.8" 1319 | 1320 | move-concurrently@^1.0.1, move-concurrently@~1.0.1: 1321 | version "1.0.1" 1322 | resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" 1323 | dependencies: 1324 | aproba "^1.1.1" 1325 | copy-concurrently "^1.0.0" 1326 | fs-write-stream-atomic "^1.0.8" 1327 | mkdirp "^0.5.1" 1328 | rimraf "^2.5.4" 1329 | run-queue "^1.0.3" 1330 | 1331 | ms@2.0.0, ms@^2.0.0: 1332 | version "2.0.0" 1333 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 1334 | 1335 | mute-stream@~0.0.4: 1336 | version "0.0.7" 1337 | resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" 1338 | 1339 | node-fetch-npm@^2.0.1: 1340 | version "2.0.2" 1341 | resolved "https://registry.yarnpkg.com/node-fetch-npm/-/node-fetch-npm-2.0.2.tgz#7258c9046182dca345b4208eda918daf33697ff7" 1342 | dependencies: 1343 | encoding "^0.1.11" 1344 | json-parse-better-errors "^1.0.0" 1345 | safe-buffer "^5.1.1" 1346 | 1347 | node-gyp@~3.6.0, node-gyp@~3.6.2: 1348 | version "3.6.2" 1349 | resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.6.2.tgz#9bfbe54562286284838e750eac05295853fa1c60" 1350 | dependencies: 1351 | fstream "^1.0.0" 1352 | glob "^7.0.3" 1353 | graceful-fs "^4.1.2" 1354 | minimatch "^3.0.2" 1355 | mkdirp "^0.5.0" 1356 | nopt "2 || 3" 1357 | npmlog "0 || 1 || 2 || 3 || 4" 1358 | osenv "0" 1359 | request "2" 1360 | rimraf "2" 1361 | semver "~5.3.0" 1362 | tar "^2.0.0" 1363 | which "1" 1364 | 1365 | node-uuid@~1.4.7: 1366 | version "1.4.8" 1367 | resolved "https://registry.yarnpkg.com/node-uuid/-/node-uuid-1.4.8.tgz#b040eb0923968afabf8d32fb1f17f1167fdab907" 1368 | 1369 | "nopt@2 || 3", nopt@~3.0.6: 1370 | version "3.0.6" 1371 | resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" 1372 | dependencies: 1373 | abbrev "1" 1374 | 1375 | nopt@~4.0.1: 1376 | version "4.0.1" 1377 | resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" 1378 | dependencies: 1379 | abbrev "1" 1380 | osenv "^0.1.4" 1381 | 1382 | normalize-git-url@~3.0.2: 1383 | version "3.0.2" 1384 | resolved "https://registry.yarnpkg.com/normalize-git-url/-/normalize-git-url-3.0.2.tgz#8e5f14be0bdaedb73e07200310aa416c27350fc4" 1385 | 1386 | normalize-package-data@^2.0.0, normalize-package-data@^2.4.0, "normalize-package-data@~1.0.1 || ^2.0.0", normalize-package-data@~2.4.0: 1387 | version "2.4.0" 1388 | resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" 1389 | dependencies: 1390 | hosted-git-info "^2.1.4" 1391 | is-builtin-module "^1.0.0" 1392 | semver "2 || 3 || 4 || 5" 1393 | validate-npm-package-license "^3.0.1" 1394 | 1395 | normalize-package-data@~2.3.5: 1396 | version "2.3.8" 1397 | resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.3.8.tgz#d819eda2a9dedbd1ffa563ea4071d936782295bb" 1398 | dependencies: 1399 | hosted-git-info "^2.1.4" 1400 | is-builtin-module "^1.0.0" 1401 | semver "2 || 3 || 4 || 5" 1402 | validate-npm-package-license "^3.0.1" 1403 | 1404 | npm-cache-filename@~1.0.2: 1405 | version "1.0.2" 1406 | resolved "https://registry.yarnpkg.com/npm-cache-filename/-/npm-cache-filename-1.0.2.tgz#ded306c5b0bfc870a9e9faf823bc5f283e05ae11" 1407 | 1408 | npm-install-checks@~1.0.7: 1409 | version "1.0.7" 1410 | resolved "https://registry.yarnpkg.com/npm-install-checks/-/npm-install-checks-1.0.7.tgz#6d91aeda0ac96801f1ed7aadee116a6c0a086a57" 1411 | dependencies: 1412 | npmlog "0.1 || 1 || 2" 1413 | semver "^2.3.0 || 3.x || 4 || 5" 1414 | 1415 | npm-install-checks@~3.0.0: 1416 | version "3.0.0" 1417 | resolved "https://registry.yarnpkg.com/npm-install-checks/-/npm-install-checks-3.0.0.tgz#d4aecdfd51a53e3723b7b2f93b2ee28e307bc0d7" 1418 | dependencies: 1419 | semver "^2.3.0 || 3.x || 4 || 5" 1420 | 1421 | "npm-package-arg@^3.0.0 || ^4.0.0", npm-package-arg@^4.1.1: 1422 | version "4.2.1" 1423 | resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-4.2.1.tgz#593303fdea85f7c422775f17f9eb7670f680e3ec" 1424 | dependencies: 1425 | hosted-git-info "^2.1.5" 1426 | semver "^5.1.0" 1427 | 1428 | "npm-package-arg@^3.0.0 || ^4.0.0 || ^5.0.0", "npm-package-arg@^4.0.0 || ^5.0.0", npm-package-arg@^5.1.2, npm-package-arg@~5.1.2: 1429 | version "5.1.2" 1430 | resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-5.1.2.tgz#fb18d17bb61e60900d6312619919bd753755ab37" 1431 | dependencies: 1432 | hosted-git-info "^2.4.2" 1433 | osenv "^0.1.4" 1434 | semver "^5.1.0" 1435 | validate-npm-package-name "^3.0.0" 1436 | 1437 | npm-package-arg@~4.1.0: 1438 | version "4.1.1" 1439 | resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-4.1.1.tgz#86d9dca985b4c5e5d59772dfd5de6919998a495a" 1440 | dependencies: 1441 | hosted-git-info "^2.1.4" 1442 | semver "4 || 5" 1443 | 1444 | npm-pick-manifest@^1.0.4: 1445 | version "1.0.4" 1446 | resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-1.0.4.tgz#a5ee6510c1fe7221c0bc0414e70924c14045f7e8" 1447 | dependencies: 1448 | npm-package-arg "^5.1.2" 1449 | semver "^5.3.0" 1450 | 1451 | npm-registry-client@~7.2.1: 1452 | version "7.2.1" 1453 | resolved "https://registry.yarnpkg.com/npm-registry-client/-/npm-registry-client-7.2.1.tgz#c792266b088cc313f8525e7e35248626c723db75" 1454 | dependencies: 1455 | concat-stream "^1.5.2" 1456 | graceful-fs "^4.1.6" 1457 | normalize-package-data "~1.0.1 || ^2.0.0" 1458 | npm-package-arg "^3.0.0 || ^4.0.0" 1459 | once "^1.3.3" 1460 | request "^2.74.0" 1461 | retry "^0.10.0" 1462 | semver "2 >=2.2.1 || 3.x || 4 || 5" 1463 | slide "^1.1.3" 1464 | optionalDependencies: 1465 | npmlog "~2.0.0 || ~3.1.0" 1466 | 1467 | npm-registry-client@~8.4.0: 1468 | version "8.4.0" 1469 | resolved "https://registry.yarnpkg.com/npm-registry-client/-/npm-registry-client-8.4.0.tgz#d52b901685647fc62a4c03eafecb6ceaa5018d4c" 1470 | dependencies: 1471 | concat-stream "^1.5.2" 1472 | graceful-fs "^4.1.6" 1473 | normalize-package-data "~1.0.1 || ^2.0.0" 1474 | npm-package-arg "^3.0.0 || ^4.0.0 || ^5.0.0" 1475 | once "^1.3.3" 1476 | request "^2.74.0" 1477 | retry "^0.10.0" 1478 | semver "2 >=2.2.1 || 3.x || 4 || 5" 1479 | slide "^1.1.3" 1480 | ssri "^4.1.2" 1481 | optionalDependencies: 1482 | npmlog "2 || ^3.1.0 || ^4.0.0" 1483 | 1484 | npm-run-path@^2.0.0: 1485 | version "2.0.2" 1486 | resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" 1487 | dependencies: 1488 | path-key "^2.0.0" 1489 | 1490 | npm-user-validate@~0.1.5: 1491 | version "0.1.5" 1492 | resolved "https://registry.yarnpkg.com/npm-user-validate/-/npm-user-validate-0.1.5.tgz#52465d50c2d20294a57125b996baedbf56c5004b" 1493 | 1494 | npm-user-validate@~1.0.0: 1495 | version "1.0.0" 1496 | resolved "https://registry.yarnpkg.com/npm-user-validate/-/npm-user-validate-1.0.0.tgz#8ceca0f5cea04d4e93519ef72d0557a75122e951" 1497 | 1498 | npm@5.1.0: 1499 | version "5.1.0" 1500 | resolved "https://registry.yarnpkg.com/npm/-/npm-5.1.0.tgz#cf8201e044018e9c89532041c90094541982b2c0" 1501 | dependencies: 1502 | JSONStream "~1.3.1" 1503 | abbrev "~1.1.0" 1504 | ansi-regex "~3.0.0" 1505 | ansicolors "~0.3.2" 1506 | ansistyles "~0.1.3" 1507 | aproba "~1.1.2" 1508 | archy "~1.0.0" 1509 | bluebird "~3.5.0" 1510 | cacache "~9.2.9" 1511 | call-limit "~1.1.0" 1512 | chownr "~1.0.1" 1513 | cmd-shim "~2.0.2" 1514 | columnify "~1.5.4" 1515 | config-chain "~1.1.11" 1516 | detect-indent "~5.0.0" 1517 | dezalgo "~1.0.3" 1518 | editor "~1.0.0" 1519 | fs-vacuum "~1.2.10" 1520 | fs-write-stream-atomic "~1.0.10" 1521 | fstream "~1.0.11" 1522 | fstream-npm "~1.2.1" 1523 | glob "~7.1.2" 1524 | graceful-fs "~4.1.11" 1525 | has-unicode "~2.0.1" 1526 | hosted-git-info "~2.5.0" 1527 | iferr "~0.1.5" 1528 | inflight "~1.0.6" 1529 | inherits "~2.0.3" 1530 | ini "~1.3.4" 1531 | init-package-json "~1.10.1" 1532 | lazy-property "~1.0.0" 1533 | lockfile "~1.0.3" 1534 | lodash._baseuniq "~4.6.0" 1535 | lodash.clonedeep "~4.5.0" 1536 | lodash.union "~4.6.0" 1537 | lodash.uniq "~4.5.0" 1538 | lodash.without "~4.4.0" 1539 | lru-cache "~4.1.1" 1540 | mississippi "~1.3.0" 1541 | mkdirp "~0.5.1" 1542 | move-concurrently "~1.0.1" 1543 | node-gyp "~3.6.2" 1544 | nopt "~4.0.1" 1545 | normalize-package-data "~2.4.0" 1546 | npm-cache-filename "~1.0.2" 1547 | npm-install-checks "~3.0.0" 1548 | npm-package-arg "~5.1.2" 1549 | npm-registry-client "~8.4.0" 1550 | npm-user-validate "~1.0.0" 1551 | npmlog "~4.1.2" 1552 | once "~1.4.0" 1553 | opener "~1.4.3" 1554 | osenv "~0.1.4" 1555 | pacote "~2.7.38" 1556 | path-is-inside "~1.0.2" 1557 | promise-inflight "~1.0.1" 1558 | read "~1.0.7" 1559 | read-cmd-shim "~1.0.1" 1560 | read-installed "~4.0.3" 1561 | read-package-json "~2.0.9" 1562 | read-package-tree "~5.1.6" 1563 | readable-stream "~2.3.2" 1564 | request "~2.81.0" 1565 | retry "~0.10.1" 1566 | rimraf "~2.6.1" 1567 | safe-buffer "~5.1.1" 1568 | semver "~5.3.0" 1569 | sha "~2.0.1" 1570 | slide "~1.1.6" 1571 | sorted-object "~2.0.1" 1572 | sorted-union-stream "~2.1.3" 1573 | ssri "~4.1.6" 1574 | strip-ansi "~4.0.0" 1575 | tar "~2.2.1" 1576 | text-table "~0.2.0" 1577 | uid-number "0.0.6" 1578 | umask "~1.1.0" 1579 | unique-filename "~1.1.0" 1580 | unpipe "~1.0.0" 1581 | update-notifier "~2.2.0" 1582 | uuid "~3.1.0" 1583 | validate-npm-package-name "~3.0.0" 1584 | which "~1.2.14" 1585 | worker-farm "~1.3.1" 1586 | wrappy "~1.0.2" 1587 | write-file-atomic "~2.1.0" 1588 | 1589 | npm@^2.1.12: 1590 | version "2.15.12" 1591 | resolved "https://registry.yarnpkg.com/npm/-/npm-2.15.12.tgz#df7c3ed5a277c3f9d4b5d819b05311d10a200ae6" 1592 | dependencies: 1593 | abbrev "~1.0.9" 1594 | ansi "~0.3.1" 1595 | ansicolors "~0.3.2" 1596 | ansistyles "~0.1.3" 1597 | archy "~1.0.0" 1598 | async-some "~1.0.2" 1599 | block-stream "0.0.9" 1600 | char-spinner "~1.0.1" 1601 | chmodr "~1.0.2" 1602 | chownr "~1.0.1" 1603 | cmd-shim "~2.0.2" 1604 | columnify "~1.5.4" 1605 | config-chain "~1.1.10" 1606 | dezalgo "~1.0.3" 1607 | editor "~1.0.0" 1608 | fs-vacuum "~1.2.9" 1609 | fs-write-stream-atomic "~1.0.8" 1610 | fstream "~1.0.10" 1611 | fstream-npm "~1.1.1" 1612 | github-url-from-git "~1.4.0" 1613 | github-url-from-username-repo "~1.0.2" 1614 | glob "~7.0.6" 1615 | graceful-fs "~4.1.6" 1616 | hosted-git-info "~2.1.5" 1617 | inflight "~1.0.4" 1618 | inherits "~2.0.3" 1619 | ini "~1.3.4" 1620 | init-package-json "~1.9.4" 1621 | lockfile "~1.0.1" 1622 | lru-cache "~4.0.1" 1623 | minimatch "~3.0.3" 1624 | mkdirp "~0.5.1" 1625 | node-gyp "~3.6.0" 1626 | nopt "~3.0.6" 1627 | normalize-git-url "~3.0.2" 1628 | normalize-package-data "~2.3.5" 1629 | npm-cache-filename "~1.0.2" 1630 | npm-install-checks "~1.0.7" 1631 | npm-package-arg "~4.1.0" 1632 | npm-registry-client "~7.2.1" 1633 | npm-user-validate "~0.1.5" 1634 | npmlog "~2.0.4" 1635 | once "~1.4.0" 1636 | opener "~1.4.1" 1637 | osenv "~0.1.3" 1638 | path-is-inside "~1.0.0" 1639 | read "~1.0.7" 1640 | read-installed "~4.0.3" 1641 | read-package-json "~2.0.4" 1642 | readable-stream "~2.1.5" 1643 | realize-package-specifier "~3.0.1" 1644 | request "~2.74.0" 1645 | retry "~0.10.0" 1646 | rimraf "~2.5.4" 1647 | semver "~5.1.0" 1648 | sha "~2.0.1" 1649 | slide "~1.1.6" 1650 | sorted-object "~2.0.0" 1651 | spdx-license-ids "~1.2.2" 1652 | strip-ansi "~3.0.1" 1653 | tar "~2.2.1" 1654 | text-table "~0.2.0" 1655 | uid-number "0.0.6" 1656 | umask "~1.1.0" 1657 | validate-npm-package-license "~3.0.1" 1658 | validate-npm-package-name "~2.2.2" 1659 | which "~1.2.11" 1660 | wrappy "~1.0.2" 1661 | write-file-atomic "~1.1.4" 1662 | 1663 | npmi@1.0.1: 1664 | version "1.0.1" 1665 | resolved "https://registry.yarnpkg.com/npmi/-/npmi-1.0.1.tgz#15d769273547545e6809dcf0ce18aed48b0290e2" 1666 | dependencies: 1667 | npm "^2.1.12" 1668 | semver "^4.1.0" 1669 | 1670 | "npmlog@0 || 1 || 2 || 3 || 4", "npmlog@2 || ^3.1.0 || ^4.0.0", npmlog@~4.1.2: 1671 | version "4.1.2" 1672 | resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" 1673 | dependencies: 1674 | are-we-there-yet "~1.1.2" 1675 | console-control-strings "~1.1.0" 1676 | gauge "~2.7.3" 1677 | set-blocking "~2.0.0" 1678 | 1679 | "npmlog@0.1 || 1 || 2", npmlog@~2.0.4: 1680 | version "2.0.4" 1681 | resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-2.0.4.tgz#98b52530f2514ca90d09ec5b22c8846722375692" 1682 | dependencies: 1683 | ansi "~0.3.1" 1684 | are-we-there-yet "~1.1.2" 1685 | gauge "~1.2.5" 1686 | 1687 | "npmlog@~2.0.0 || ~3.1.0": 1688 | version "3.1.2" 1689 | resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-3.1.2.tgz#2d46fa874337af9498a2f12bb43d8d0be4a36873" 1690 | dependencies: 1691 | are-we-there-yet "~1.1.2" 1692 | console-control-strings "~1.1.0" 1693 | gauge "~2.6.0" 1694 | set-blocking "~2.0.0" 1695 | 1696 | number-is-nan@^1.0.0: 1697 | version "1.0.1" 1698 | resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" 1699 | 1700 | oauth-sign@~0.8.1, oauth-sign@~0.8.2: 1701 | version "0.8.2" 1702 | resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" 1703 | 1704 | object-assign@^4.1.0: 1705 | version "4.1.1" 1706 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 1707 | 1708 | once@^1.3.0, once@^1.3.1, once@^1.3.3, once@^1.4.0, once@~1.4.0: 1709 | version "1.4.0" 1710 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1711 | dependencies: 1712 | wrappy "1" 1713 | 1714 | opener@~1.4.0, opener@~1.4.1, opener@~1.4.3: 1715 | version "1.4.3" 1716 | resolved "https://registry.yarnpkg.com/opener/-/opener-1.4.3.tgz#5c6da2c5d7e5831e8ffa3964950f8d6674ac90b8" 1717 | 1718 | optimist@0.6.1, optimist@0.6.x: 1719 | version "0.6.1" 1720 | resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" 1721 | dependencies: 1722 | minimist "~0.0.1" 1723 | wordwrap "~0.0.2" 1724 | 1725 | os-homedir@^1.0.0: 1726 | version "1.0.2" 1727 | resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" 1728 | 1729 | os-tmpdir@^1.0.0, os-tmpdir@~1.0.1: 1730 | version "1.0.2" 1731 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 1732 | 1733 | osenv@0, osenv@^0.1.4, osenv@~0.1.3, osenv@~0.1.4: 1734 | version "0.1.4" 1735 | resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644" 1736 | dependencies: 1737 | os-homedir "^1.0.0" 1738 | os-tmpdir "^1.0.0" 1739 | 1740 | p-finally@^1.0.0: 1741 | version "1.0.0" 1742 | resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" 1743 | 1744 | package-json@^4.0.0: 1745 | version "4.0.1" 1746 | resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed" 1747 | dependencies: 1748 | got "^6.7.1" 1749 | registry-auth-token "^3.0.1" 1750 | registry-url "^3.0.3" 1751 | semver "^5.1.0" 1752 | 1753 | pacote@~2.7.38: 1754 | version "2.7.38" 1755 | resolved "https://registry.yarnpkg.com/pacote/-/pacote-2.7.38.tgz#5091f8774298c26c3eca24606037f1bb73db74c1" 1756 | dependencies: 1757 | bluebird "^3.5.0" 1758 | cacache "^9.2.9" 1759 | glob "^7.1.2" 1760 | lru-cache "^4.1.1" 1761 | make-fetch-happen "^2.4.13" 1762 | minimatch "^3.0.4" 1763 | mississippi "^1.2.0" 1764 | normalize-package-data "^2.4.0" 1765 | npm-package-arg "^5.1.2" 1766 | npm-pick-manifest "^1.0.4" 1767 | osenv "^0.1.4" 1768 | promise-inflight "^1.0.1" 1769 | promise-retry "^1.1.1" 1770 | protoduck "^4.0.0" 1771 | safe-buffer "^5.1.1" 1772 | semver "^5.3.0" 1773 | ssri "^4.1.6" 1774 | tar-fs "^1.15.3" 1775 | tar-stream "^1.5.4" 1776 | unique-filename "^1.1.0" 1777 | which "^1.2.12" 1778 | 1779 | parallel-transform@^1.1.0: 1780 | version "1.1.0" 1781 | resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.1.0.tgz#d410f065b05da23081fcd10f28854c29bda33b06" 1782 | dependencies: 1783 | cyclist "~0.2.2" 1784 | inherits "^2.0.3" 1785 | readable-stream "^2.1.5" 1786 | 1787 | path-is-absolute@^1.0.0: 1788 | version "1.0.1" 1789 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1790 | 1791 | path-is-inside@^1.0.1, path-is-inside@~1.0.0, path-is-inside@~1.0.2: 1792 | version "1.0.2" 1793 | resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" 1794 | 1795 | path-key@^2.0.0: 1796 | version "2.0.1" 1797 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" 1798 | 1799 | performance-now@^0.2.0: 1800 | version "0.2.0" 1801 | resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" 1802 | 1803 | performance-now@^2.1.0: 1804 | version "2.1.0" 1805 | resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" 1806 | 1807 | pify@^2.3.0: 1808 | version "2.3.0" 1809 | resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" 1810 | 1811 | pinkie-promise@^2.0.0: 1812 | version "2.0.1" 1813 | resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" 1814 | dependencies: 1815 | pinkie "^2.0.0" 1816 | 1817 | pinkie@^2.0.0: 1818 | version "2.0.4" 1819 | resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" 1820 | 1821 | portfinder@^1.0.13: 1822 | version "1.0.13" 1823 | resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.13.tgz#bb32ecd87c27104ae6ee44b5a3ccbf0ebb1aede9" 1824 | dependencies: 1825 | async "^1.5.2" 1826 | debug "^2.2.0" 1827 | mkdirp "0.5.x" 1828 | 1829 | prepend-http@^1.0.1: 1830 | version "1.0.4" 1831 | resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" 1832 | 1833 | process-nextick-args@~1.0.6: 1834 | version "1.0.7" 1835 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" 1836 | 1837 | promise-inflight@^1.0.1, promise-inflight@~1.0.1: 1838 | version "1.0.1" 1839 | resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" 1840 | 1841 | promise-retry@^1.1.1: 1842 | version "1.1.1" 1843 | resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-1.1.1.tgz#6739e968e3051da20ce6497fb2b50f6911df3d6d" 1844 | dependencies: 1845 | err-code "^1.0.0" 1846 | retry "^0.10.0" 1847 | 1848 | promzard@^0.3.0: 1849 | version "0.3.0" 1850 | resolved "https://registry.yarnpkg.com/promzard/-/promzard-0.3.0.tgz#26a5d6ee8c7dee4cb12208305acfb93ba382a9ee" 1851 | dependencies: 1852 | read "1" 1853 | 1854 | proto-list@~1.2.1: 1855 | version "1.2.4" 1856 | resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" 1857 | 1858 | protoduck@^4.0.0: 1859 | version "4.0.0" 1860 | resolved "https://registry.yarnpkg.com/protoduck/-/protoduck-4.0.0.tgz#fe4874d8c7913366cfd9ead12453a22cd3657f8e" 1861 | dependencies: 1862 | genfun "^4.0.1" 1863 | 1864 | prr@~0.0.0: 1865 | version "0.0.0" 1866 | resolved "https://registry.yarnpkg.com/prr/-/prr-0.0.0.tgz#1a84b85908325501411853d0081ee3fa86e2926a" 1867 | 1868 | pseudomap@^1.0.1, pseudomap@^1.0.2: 1869 | version "1.0.2" 1870 | resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" 1871 | 1872 | pump@^1.0.0: 1873 | version "1.0.2" 1874 | resolved "https://registry.yarnpkg.com/pump/-/pump-1.0.2.tgz#3b3ee6512f94f0e575538c17995f9f16990a5d51" 1875 | dependencies: 1876 | end-of-stream "^1.1.0" 1877 | once "^1.3.1" 1878 | 1879 | pumpify@^1.3.3: 1880 | version "1.3.5" 1881 | resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.3.5.tgz#1b671c619940abcaeac0ad0e3a3c164be760993b" 1882 | dependencies: 1883 | duplexify "^3.1.2" 1884 | inherits "^2.0.1" 1885 | pump "^1.0.0" 1886 | 1887 | punycode@^1.4.1: 1888 | version "1.4.1" 1889 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" 1890 | 1891 | q@1.5.0: 1892 | version "1.5.0" 1893 | resolved "https://registry.yarnpkg.com/q/-/q-1.5.0.tgz#dd01bac9d06d30e6f219aecb8253ee9ebdc308f1" 1894 | 1895 | qs@~2.3.3: 1896 | version "2.3.3" 1897 | resolved "https://registry.yarnpkg.com/qs/-/qs-2.3.3.tgz#e9e85adbe75da0bbe4c8e0476a086290f863b404" 1898 | 1899 | qs@~6.2.0: 1900 | version "6.2.3" 1901 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.2.3.tgz#1cfcb25c10a9b2b483053ff39f5dfc9233908cfe" 1902 | 1903 | qs@~6.4.0: 1904 | version "6.4.0" 1905 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" 1906 | 1907 | qs@~6.5.1: 1908 | version "6.5.1" 1909 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" 1910 | 1911 | rc@^1.0.1, rc@^1.1.6: 1912 | version "1.2.1" 1913 | resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.1.tgz#2e03e8e42ee450b8cb3dce65be1bf8974e1dfd95" 1914 | dependencies: 1915 | deep-extend "~0.4.0" 1916 | ini "~1.3.0" 1917 | minimist "^1.2.0" 1918 | strip-json-comments "~2.0.1" 1919 | 1920 | read-cmd-shim@~1.0.1: 1921 | version "1.0.1" 1922 | resolved "https://registry.yarnpkg.com/read-cmd-shim/-/read-cmd-shim-1.0.1.tgz#2d5d157786a37c055d22077c32c53f8329e91c7b" 1923 | dependencies: 1924 | graceful-fs "^4.1.2" 1925 | 1926 | read-installed@~4.0.3: 1927 | version "4.0.3" 1928 | resolved "https://registry.yarnpkg.com/read-installed/-/read-installed-4.0.3.tgz#ff9b8b67f187d1e4c29b9feb31f6b223acd19067" 1929 | dependencies: 1930 | debuglog "^1.0.1" 1931 | read-package-json "^2.0.0" 1932 | readdir-scoped-modules "^1.0.0" 1933 | semver "2 || 3 || 4 || 5" 1934 | slide "~1.1.3" 1935 | util-extend "^1.0.1" 1936 | optionalDependencies: 1937 | graceful-fs "^4.1.2" 1938 | 1939 | "read-package-json@1 || 2", read-package-json@^2.0.0, read-package-json@~2.0.4, read-package-json@~2.0.9: 1940 | version "2.0.12" 1941 | resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-2.0.12.tgz#68ea45f98b3741cb6e10ae3bbd42a605026a6951" 1942 | dependencies: 1943 | glob "^7.1.1" 1944 | json-parse-better-errors "^1.0.0" 1945 | normalize-package-data "^2.0.0" 1946 | slash "^1.0.0" 1947 | optionalDependencies: 1948 | graceful-fs "^4.1.2" 1949 | 1950 | read-package-tree@~5.1.6: 1951 | version "5.1.6" 1952 | resolved "https://registry.yarnpkg.com/read-package-tree/-/read-package-tree-5.1.6.tgz#4f03e83d0486856fb60d97c94882841c2a7b1b7a" 1953 | dependencies: 1954 | debuglog "^1.0.1" 1955 | dezalgo "^1.0.0" 1956 | once "^1.3.0" 1957 | read-package-json "^2.0.0" 1958 | readdir-scoped-modules "^1.0.0" 1959 | 1960 | read@1, read@~1.0.1, read@~1.0.7: 1961 | version "1.0.7" 1962 | resolved "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4" 1963 | dependencies: 1964 | mute-stream "~0.0.4" 1965 | 1966 | "readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@~2.3.2: 1967 | version "2.3.3" 1968 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" 1969 | dependencies: 1970 | core-util-is "~1.0.0" 1971 | inherits "~2.0.3" 1972 | isarray "~1.0.0" 1973 | process-nextick-args "~1.0.6" 1974 | safe-buffer "~5.1.1" 1975 | string_decoder "~1.0.3" 1976 | util-deprecate "~1.0.1" 1977 | 1978 | readable-stream@~1.1.10: 1979 | version "1.1.14" 1980 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" 1981 | dependencies: 1982 | core-util-is "~1.0.0" 1983 | inherits "~2.0.1" 1984 | isarray "0.0.1" 1985 | string_decoder "~0.10.x" 1986 | 1987 | readable-stream@~2.0.5: 1988 | version "2.0.6" 1989 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e" 1990 | dependencies: 1991 | core-util-is "~1.0.0" 1992 | inherits "~2.0.1" 1993 | isarray "~1.0.0" 1994 | process-nextick-args "~1.0.6" 1995 | string_decoder "~0.10.x" 1996 | util-deprecate "~1.0.1" 1997 | 1998 | readable-stream@~2.1.5: 1999 | version "2.1.5" 2000 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.1.5.tgz#66fa8b720e1438b364681f2ad1a63c618448c9d0" 2001 | dependencies: 2002 | buffer-shims "^1.0.0" 2003 | core-util-is "~1.0.0" 2004 | inherits "~2.0.1" 2005 | isarray "~1.0.0" 2006 | process-nextick-args "~1.0.6" 2007 | string_decoder "~0.10.x" 2008 | util-deprecate "~1.0.1" 2009 | 2010 | readdir-scoped-modules@^1.0.0: 2011 | version "1.0.2" 2012 | resolved "https://registry.yarnpkg.com/readdir-scoped-modules/-/readdir-scoped-modules-1.0.2.tgz#9fafa37d286be5d92cbaebdee030dc9b5f406747" 2013 | dependencies: 2014 | debuglog "^1.0.1" 2015 | dezalgo "^1.0.0" 2016 | graceful-fs "^4.1.2" 2017 | once "^1.3.0" 2018 | 2019 | realize-package-specifier@~3.0.1: 2020 | version "3.0.3" 2021 | resolved "https://registry.yarnpkg.com/realize-package-specifier/-/realize-package-specifier-3.0.3.tgz#d0def882952b8de3f67eba5e91199661271f41f4" 2022 | dependencies: 2023 | dezalgo "^1.0.1" 2024 | npm-package-arg "^4.1.1" 2025 | 2026 | registry-auth-token@^3.0.1: 2027 | version "3.3.1" 2028 | resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.3.1.tgz#fb0d3289ee0d9ada2cbb52af5dfe66cb070d3006" 2029 | dependencies: 2030 | rc "^1.1.6" 2031 | safe-buffer "^5.0.1" 2032 | 2033 | registry-url@^3.0.3: 2034 | version "3.1.0" 2035 | resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" 2036 | dependencies: 2037 | rc "^1.0.1" 2038 | 2039 | request@2, request@^2.74.0: 2040 | version "2.83.0" 2041 | resolved "https://registry.yarnpkg.com/request/-/request-2.83.0.tgz#ca0b65da02ed62935887808e6f510381034e3356" 2042 | dependencies: 2043 | aws-sign2 "~0.7.0" 2044 | aws4 "^1.6.0" 2045 | caseless "~0.12.0" 2046 | combined-stream "~1.0.5" 2047 | extend "~3.0.1" 2048 | forever-agent "~0.6.1" 2049 | form-data "~2.3.1" 2050 | har-validator "~5.0.3" 2051 | hawk "~6.0.2" 2052 | http-signature "~1.2.0" 2053 | is-typedarray "~1.0.0" 2054 | isstream "~0.1.2" 2055 | json-stringify-safe "~5.0.1" 2056 | mime-types "~2.1.17" 2057 | oauth-sign "~0.8.2" 2058 | performance-now "^2.1.0" 2059 | qs "~6.5.1" 2060 | safe-buffer "^5.1.1" 2061 | stringstream "~0.0.5" 2062 | tough-cookie "~2.3.3" 2063 | tunnel-agent "^0.6.0" 2064 | uuid "^3.1.0" 2065 | 2066 | request@~2.74.0: 2067 | version "2.74.0" 2068 | resolved "https://registry.yarnpkg.com/request/-/request-2.74.0.tgz#7693ca768bbb0ea5c8ce08c084a45efa05b892ab" 2069 | dependencies: 2070 | aws-sign2 "~0.6.0" 2071 | aws4 "^1.2.1" 2072 | bl "~1.1.2" 2073 | caseless "~0.11.0" 2074 | combined-stream "~1.0.5" 2075 | extend "~3.0.0" 2076 | forever-agent "~0.6.1" 2077 | form-data "~1.0.0-rc4" 2078 | har-validator "~2.0.6" 2079 | hawk "~3.1.3" 2080 | http-signature "~1.1.0" 2081 | is-typedarray "~1.0.0" 2082 | isstream "~0.1.2" 2083 | json-stringify-safe "~5.0.1" 2084 | mime-types "~2.1.7" 2085 | node-uuid "~1.4.7" 2086 | oauth-sign "~0.8.1" 2087 | qs "~6.2.0" 2088 | stringstream "~0.0.4" 2089 | tough-cookie "~2.3.0" 2090 | tunnel-agent "~0.4.1" 2091 | 2092 | request@~2.81.0: 2093 | version "2.81.0" 2094 | resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" 2095 | dependencies: 2096 | aws-sign2 "~0.6.0" 2097 | aws4 "^1.2.1" 2098 | caseless "~0.12.0" 2099 | combined-stream "~1.0.5" 2100 | extend "~3.0.0" 2101 | forever-agent "~0.6.1" 2102 | form-data "~2.1.1" 2103 | har-validator "~4.2.1" 2104 | hawk "~3.1.3" 2105 | http-signature "~1.1.0" 2106 | is-typedarray "~1.0.0" 2107 | isstream "~0.1.2" 2108 | json-stringify-safe "~5.0.1" 2109 | mime-types "~2.1.7" 2110 | oauth-sign "~0.8.1" 2111 | performance-now "^0.2.0" 2112 | qs "~6.4.0" 2113 | safe-buffer "^5.0.1" 2114 | stringstream "~0.0.4" 2115 | tough-cookie "~2.3.0" 2116 | tunnel-agent "^0.6.0" 2117 | uuid "^3.0.0" 2118 | 2119 | requires-port@1.x.x: 2120 | version "1.0.0" 2121 | resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" 2122 | 2123 | retry@^0.10.0, retry@~0.10.0, retry@~0.10.1: 2124 | version "0.10.1" 2125 | resolved "https://registry.yarnpkg.com/retry/-/retry-0.10.1.tgz#e76388d217992c252750241d3d3956fed98d8ff4" 2126 | 2127 | rimraf@2, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@~2.6.1: 2128 | version "2.6.2" 2129 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" 2130 | dependencies: 2131 | glob "^7.0.5" 2132 | 2133 | rimraf@~2.5.4: 2134 | version "2.5.4" 2135 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.5.4.tgz#96800093cbf1a0c86bd95b4625467535c29dfa04" 2136 | dependencies: 2137 | glob "^7.0.5" 2138 | 2139 | run-queue@^1.0.0, run-queue@^1.0.3: 2140 | version "1.0.3" 2141 | resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" 2142 | dependencies: 2143 | aproba "^1.1.1" 2144 | 2145 | safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: 2146 | version "5.1.1" 2147 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" 2148 | 2149 | semver-diff@^2.0.0: 2150 | version "2.1.0" 2151 | resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" 2152 | dependencies: 2153 | semver "^5.0.3" 2154 | 2155 | "semver@2 >=2.2.1 || 3.x || 4 || 5", "semver@2 || 3 || 4 || 5", "semver@2.x || 3.x || 4 || 5", "semver@4 || 5", "semver@^2.3.0 || 3.x || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0: 2156 | version "5.4.1" 2157 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" 2158 | 2159 | semver@5.3.0, semver@~5.3.0: 2160 | version "5.3.0" 2161 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" 2162 | 2163 | semver@^4.1.0: 2164 | version "4.3.6" 2165 | resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" 2166 | 2167 | semver@~5.1.0: 2168 | version "5.1.1" 2169 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.1.1.tgz#a3292a373e6f3e0798da0b20641b9a9c5bc47e19" 2170 | 2171 | set-blocking@~2.0.0: 2172 | version "2.0.0" 2173 | resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" 2174 | 2175 | sha@~2.0.1: 2176 | version "2.0.1" 2177 | resolved "https://registry.yarnpkg.com/sha/-/sha-2.0.1.tgz#6030822fbd2c9823949f8f72ed6411ee5cf25aae" 2178 | dependencies: 2179 | graceful-fs "^4.1.2" 2180 | readable-stream "^2.0.2" 2181 | 2182 | shebang-command@^1.2.0: 2183 | version "1.2.0" 2184 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" 2185 | dependencies: 2186 | shebang-regex "^1.0.0" 2187 | 2188 | shebang-regex@^1.0.0: 2189 | version "1.0.0" 2190 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" 2191 | 2192 | signal-exit@^3.0.0, signal-exit@^3.0.2: 2193 | version "3.0.2" 2194 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" 2195 | 2196 | slash@^1.0.0: 2197 | version "1.0.0" 2198 | resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" 2199 | 2200 | slide@^1.1.3, slide@^1.1.5, slide@~1.1.3, slide@~1.1.6: 2201 | version "1.1.6" 2202 | resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" 2203 | 2204 | smart-buffer@^1.0.13: 2205 | version "1.1.15" 2206 | resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-1.1.15.tgz#7f114b5b65fab3e2a35aa775bb12f0d1c649bf16" 2207 | 2208 | sntp@1.x.x: 2209 | version "1.0.9" 2210 | resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" 2211 | dependencies: 2212 | hoek "2.x.x" 2213 | 2214 | sntp@2.x.x: 2215 | version "2.0.2" 2216 | resolved "https://registry.yarnpkg.com/sntp/-/sntp-2.0.2.tgz#5064110f0af85f7cfdb7d6b67a40028ce52b4b2b" 2217 | dependencies: 2218 | hoek "4.x.x" 2219 | 2220 | socks-proxy-agent@^3.0.0: 2221 | version "3.0.1" 2222 | resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-3.0.1.tgz#2eae7cf8e2a82d34565761539a7f9718c5617659" 2223 | dependencies: 2224 | agent-base "^4.1.0" 2225 | socks "^1.1.10" 2226 | 2227 | socks@^1.1.10: 2228 | version "1.1.10" 2229 | resolved "https://registry.yarnpkg.com/socks/-/socks-1.1.10.tgz#5b8b7fc7c8f341c53ed056e929b7bf4de8ba7b5a" 2230 | dependencies: 2231 | ip "^1.1.4" 2232 | smart-buffer "^1.0.13" 2233 | 2234 | sorted-object@~2.0.0, sorted-object@~2.0.1: 2235 | version "2.0.1" 2236 | resolved "https://registry.yarnpkg.com/sorted-object/-/sorted-object-2.0.1.tgz#7d631f4bd3a798a24af1dffcfbfe83337a5df5fc" 2237 | 2238 | sorted-union-stream@~2.1.3: 2239 | version "2.1.3" 2240 | resolved "https://registry.yarnpkg.com/sorted-union-stream/-/sorted-union-stream-2.1.3.tgz#c7794c7e077880052ff71a8d4a2dbb4a9a638ac7" 2241 | dependencies: 2242 | from2 "^1.3.0" 2243 | stream-iterate "^1.1.0" 2244 | 2245 | spdx-correct@~1.0.0: 2246 | version "1.0.2" 2247 | resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" 2248 | dependencies: 2249 | spdx-license-ids "^1.0.2" 2250 | 2251 | spdx-expression-parse@~1.0.0: 2252 | version "1.0.4" 2253 | resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c" 2254 | 2255 | spdx-license-ids@^1.0.2, spdx-license-ids@~1.2.2: 2256 | version "1.2.2" 2257 | resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" 2258 | 2259 | sshpk@^1.7.0: 2260 | version "1.13.1" 2261 | resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.1.tgz#512df6da6287144316dc4c18fe1cf1d940739be3" 2262 | dependencies: 2263 | asn1 "~0.2.3" 2264 | assert-plus "^1.0.0" 2265 | dashdash "^1.12.0" 2266 | getpass "^0.1.1" 2267 | optionalDependencies: 2268 | bcrypt-pbkdf "^1.0.0" 2269 | ecc-jsbn "~0.1.1" 2270 | jsbn "~0.1.0" 2271 | tweetnacl "~0.14.0" 2272 | 2273 | ssri@^4.1.2, ssri@^4.1.6, ssri@~4.1.6: 2274 | version "4.1.6" 2275 | resolved "https://registry.yarnpkg.com/ssri/-/ssri-4.1.6.tgz#0cb49b6ac84457e7bdd466cb730c3cb623e9a25b" 2276 | dependencies: 2277 | safe-buffer "^5.1.0" 2278 | 2279 | stream-each@^1.1.0: 2280 | version "1.2.0" 2281 | resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.0.tgz#1e95d47573f580d814dc0ff8cd0f66f1ce53c991" 2282 | dependencies: 2283 | end-of-stream "^1.1.0" 2284 | stream-shift "^1.0.0" 2285 | 2286 | stream-iterate@^1.1.0: 2287 | version "1.2.0" 2288 | resolved "https://registry.yarnpkg.com/stream-iterate/-/stream-iterate-1.2.0.tgz#2bd7c77296c1702a46488b8ad41f79865eecd4e1" 2289 | dependencies: 2290 | readable-stream "^2.1.5" 2291 | stream-shift "^1.0.0" 2292 | 2293 | stream-shift@^1.0.0: 2294 | version "1.0.0" 2295 | resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" 2296 | 2297 | string-width@^1.0.1, string-width@^1.0.2: 2298 | version "1.0.2" 2299 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" 2300 | dependencies: 2301 | code-point-at "^1.0.0" 2302 | is-fullwidth-code-point "^1.0.0" 2303 | strip-ansi "^3.0.0" 2304 | 2305 | string-width@^2.0.0: 2306 | version "2.1.1" 2307 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" 2308 | dependencies: 2309 | is-fullwidth-code-point "^2.0.0" 2310 | strip-ansi "^4.0.0" 2311 | 2312 | string_decoder@~0.10.x: 2313 | version "0.10.31" 2314 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" 2315 | 2316 | string_decoder@~1.0.3: 2317 | version "1.0.3" 2318 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" 2319 | dependencies: 2320 | safe-buffer "~5.1.0" 2321 | 2322 | stringstream@~0.0.4, stringstream@~0.0.5: 2323 | version "0.0.5" 2324 | resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" 2325 | 2326 | strip-ansi@^3.0.0, strip-ansi@^3.0.1, strip-ansi@~3.0.1: 2327 | version "3.0.1" 2328 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 2329 | dependencies: 2330 | ansi-regex "^2.0.0" 2331 | 2332 | strip-ansi@^4.0.0, strip-ansi@~4.0.0: 2333 | version "4.0.0" 2334 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" 2335 | dependencies: 2336 | ansi-regex "^3.0.0" 2337 | 2338 | strip-eof@^1.0.0: 2339 | version "1.0.0" 2340 | resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" 2341 | 2342 | strip-json-comments@~2.0.1: 2343 | version "2.0.1" 2344 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 2345 | 2346 | supports-color@^2.0.0: 2347 | version "2.0.0" 2348 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" 2349 | 2350 | supports-color@^4.0.0: 2351 | version "4.4.0" 2352 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.4.0.tgz#883f7ddabc165142b2a61427f3352ded195d1a3e" 2353 | dependencies: 2354 | has-flag "^2.0.0" 2355 | 2356 | tar-fs@^1.15.3: 2357 | version "1.15.3" 2358 | resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-1.15.3.tgz#eccf935e941493d8151028e636e51ce4c3ca7f20" 2359 | dependencies: 2360 | chownr "^1.0.1" 2361 | mkdirp "^0.5.1" 2362 | pump "^1.0.0" 2363 | tar-stream "^1.1.2" 2364 | 2365 | tar-stream@^1.1.2, tar-stream@^1.5.4: 2366 | version "1.5.4" 2367 | resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.5.4.tgz#36549cf04ed1aee9b2a30c0143252238daf94016" 2368 | dependencies: 2369 | bl "^1.0.0" 2370 | end-of-stream "^1.0.0" 2371 | readable-stream "^2.0.0" 2372 | xtend "^4.0.0" 2373 | 2374 | tar@^2.0.0, tar@~2.2.1: 2375 | version "2.2.1" 2376 | resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" 2377 | dependencies: 2378 | block-stream "*" 2379 | fstream "^1.0.2" 2380 | inherits "2" 2381 | 2382 | term-size@^1.2.0: 2383 | version "1.2.0" 2384 | resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69" 2385 | dependencies: 2386 | execa "^0.7.0" 2387 | 2388 | text-table@~0.2.0: 2389 | version "0.2.0" 2390 | resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" 2391 | 2392 | through2@^2.0.0: 2393 | version "2.0.3" 2394 | resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" 2395 | dependencies: 2396 | readable-stream "^2.1.5" 2397 | xtend "~4.0.1" 2398 | 2399 | "through@>=2.2.7 <3": 2400 | version "2.3.8" 2401 | resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" 2402 | 2403 | timed-out@^4.0.0: 2404 | version "4.0.1" 2405 | resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" 2406 | 2407 | tmp@0.0.31: 2408 | version "0.0.31" 2409 | resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.31.tgz#8f38ab9438e17315e5dbd8b3657e8bfb277ae4a7" 2410 | dependencies: 2411 | os-tmpdir "~1.0.1" 2412 | 2413 | tough-cookie@~2.3.0, tough-cookie@~2.3.3: 2414 | version "2.3.3" 2415 | resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.3.tgz#0b618a5565b6dea90bf3425d04d55edc475a7561" 2416 | dependencies: 2417 | punycode "^1.4.1" 2418 | 2419 | tunnel-agent@^0.6.0: 2420 | version "0.6.0" 2421 | resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" 2422 | dependencies: 2423 | safe-buffer "^5.0.1" 2424 | 2425 | tunnel-agent@~0.4.1: 2426 | version "0.4.3" 2427 | resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb" 2428 | 2429 | tweetnacl@^0.14.3, tweetnacl@~0.14.0: 2430 | version "0.14.5" 2431 | resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" 2432 | 2433 | typedarray@^0.0.6: 2434 | version "0.0.6" 2435 | resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" 2436 | 2437 | uid-number@0.0.6: 2438 | version "0.0.6" 2439 | resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" 2440 | 2441 | umask@~1.1.0: 2442 | version "1.1.0" 2443 | resolved "https://registry.yarnpkg.com/umask/-/umask-1.1.0.tgz#f29cebf01df517912bb58ff9c4e50fde8e33320d" 2444 | 2445 | union@~0.4.3: 2446 | version "0.4.6" 2447 | resolved "https://registry.yarnpkg.com/union/-/union-0.4.6.tgz#198fbdaeba254e788b0efcb630bc11f24a2959e0" 2448 | dependencies: 2449 | qs "~2.3.3" 2450 | 2451 | unique-filename@^1.1.0, unique-filename@~1.1.0: 2452 | version "1.1.0" 2453 | resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.0.tgz#d05f2fe4032560871f30e93cbe735eea201514f3" 2454 | dependencies: 2455 | unique-slug "^2.0.0" 2456 | 2457 | unique-slug@^2.0.0: 2458 | version "2.0.0" 2459 | resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.0.tgz#db6676e7c7cc0629878ff196097c78855ae9f4ab" 2460 | dependencies: 2461 | imurmurhash "^0.1.4" 2462 | 2463 | unique-string@^1.0.0: 2464 | version "1.0.0" 2465 | resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" 2466 | dependencies: 2467 | crypto-random-string "^1.0.0" 2468 | 2469 | universalify@^0.1.0: 2470 | version "0.1.1" 2471 | resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.1.tgz#fa71badd4437af4c148841e3b3b165f9e9e590b7" 2472 | 2473 | unpipe@~1.0.0: 2474 | version "1.0.0" 2475 | resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" 2476 | 2477 | unzip-response@^2.0.1: 2478 | version "2.0.1" 2479 | resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" 2480 | 2481 | update-notifier@~2.2.0: 2482 | version "2.2.0" 2483 | resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.2.0.tgz#1b5837cf90c0736d88627732b661c138f86de72f" 2484 | dependencies: 2485 | boxen "^1.0.0" 2486 | chalk "^1.0.0" 2487 | configstore "^3.0.0" 2488 | import-lazy "^2.1.0" 2489 | is-npm "^1.0.0" 2490 | latest-version "^3.0.0" 2491 | semver-diff "^2.0.0" 2492 | xdg-basedir "^3.0.0" 2493 | 2494 | url-join@^2.0.2: 2495 | version "2.0.5" 2496 | resolved "https://registry.yarnpkg.com/url-join/-/url-join-2.0.5.tgz#5af22f18c052a000a48d7b82c5e9c2e2feeda728" 2497 | 2498 | url-parse-lax@^1.0.0: 2499 | version "1.0.0" 2500 | resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" 2501 | dependencies: 2502 | prepend-http "^1.0.1" 2503 | 2504 | user-home@2.0.0: 2505 | version "2.0.0" 2506 | resolved "https://registry.yarnpkg.com/user-home/-/user-home-2.0.0.tgz#9c70bfd8169bc1dcbf48604e0f04b8b49cde9e9f" 2507 | dependencies: 2508 | os-homedir "^1.0.0" 2509 | 2510 | util-deprecate@~1.0.1: 2511 | version "1.0.2" 2512 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 2513 | 2514 | util-extend@^1.0.1: 2515 | version "1.0.3" 2516 | resolved "https://registry.yarnpkg.com/util-extend/-/util-extend-1.0.3.tgz#a7c216d267545169637b3b6edc6ca9119e2ff93f" 2517 | 2518 | uuid@^3.0.0, uuid@^3.1.0, uuid@~3.1.0: 2519 | version "3.1.0" 2520 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04" 2521 | 2522 | validate-npm-package-license@^3.0.1, validate-npm-package-license@~3.0.1: 2523 | version "3.0.1" 2524 | resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" 2525 | dependencies: 2526 | spdx-correct "~1.0.0" 2527 | spdx-expression-parse "~1.0.0" 2528 | 2529 | validate-npm-package-name@^3.0.0, validate-npm-package-name@~3.0.0: 2530 | version "3.0.0" 2531 | resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz#5fa912d81eb7d0c74afc140de7317f0ca7df437e" 2532 | dependencies: 2533 | builtins "^1.0.3" 2534 | 2535 | validate-npm-package-name@~2.2.2: 2536 | version "2.2.2" 2537 | resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-2.2.2.tgz#f65695b22f7324442019a3c7fa39a6e7fd299085" 2538 | dependencies: 2539 | builtins "0.0.7" 2540 | 2541 | verror@1.10.0: 2542 | version "1.10.0" 2543 | resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" 2544 | dependencies: 2545 | assert-plus "^1.0.0" 2546 | core-util-is "1.0.2" 2547 | extsprintf "^1.2.0" 2548 | 2549 | wcwidth@^1.0.0: 2550 | version "1.0.1" 2551 | resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" 2552 | dependencies: 2553 | defaults "^1.0.3" 2554 | 2555 | which@1, which@^1.2.12, which@^1.2.9: 2556 | version "1.3.0" 2557 | resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" 2558 | dependencies: 2559 | isexe "^2.0.0" 2560 | 2561 | which@~1.2.11, which@~1.2.14: 2562 | version "1.2.14" 2563 | resolved "https://registry.yarnpkg.com/which/-/which-1.2.14.tgz#9a87c4378f03e827cecaf1acdf56c736c01c14e5" 2564 | dependencies: 2565 | isexe "^2.0.0" 2566 | 2567 | wide-align@^1.1.0: 2568 | version "1.1.2" 2569 | resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710" 2570 | dependencies: 2571 | string-width "^1.0.2" 2572 | 2573 | widest-line@^1.0.0: 2574 | version "1.0.0" 2575 | resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-1.0.0.tgz#0c09c85c2a94683d0d7eaf8ee097d564bf0e105c" 2576 | dependencies: 2577 | string-width "^1.0.1" 2578 | 2579 | wordwrap@~0.0.2: 2580 | version "0.0.3" 2581 | resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" 2582 | 2583 | worker-farm@~1.3.1: 2584 | version "1.3.1" 2585 | resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.3.1.tgz#4333112bb49b17aa050b87895ca6b2cacf40e5ff" 2586 | dependencies: 2587 | errno ">=0.1.1 <0.2.0-0" 2588 | xtend ">=4.0.0 <4.1.0-0" 2589 | 2590 | wrappy@1, wrappy@~1.0.2: 2591 | version "1.0.2" 2592 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 2593 | 2594 | write-file-atomic@^2.0.0: 2595 | version "2.3.0" 2596 | resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.3.0.tgz#1ff61575c2e2a4e8e510d6fa4e243cce183999ab" 2597 | dependencies: 2598 | graceful-fs "^4.1.11" 2599 | imurmurhash "^0.1.4" 2600 | signal-exit "^3.0.2" 2601 | 2602 | write-file-atomic@~1.1.4: 2603 | version "1.1.4" 2604 | resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-1.1.4.tgz#b1f52dc2e8dc0e3cb04d187a25f758a38a90ca3b" 2605 | dependencies: 2606 | graceful-fs "^4.1.2" 2607 | imurmurhash "^0.1.4" 2608 | slide "^1.1.5" 2609 | 2610 | write-file-atomic@~2.1.0: 2611 | version "2.1.0" 2612 | resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.1.0.tgz#1769f4b551eedce419f0505deae2e26763542d37" 2613 | dependencies: 2614 | graceful-fs "^4.1.11" 2615 | imurmurhash "^0.1.4" 2616 | slide "^1.1.5" 2617 | 2618 | xdg-basedir@^3.0.0: 2619 | version "3.0.0" 2620 | resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" 2621 | 2622 | "xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@~4.0.1: 2623 | version "4.0.1" 2624 | resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" 2625 | 2626 | y18n@^3.2.1: 2627 | version "3.2.1" 2628 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" 2629 | 2630 | yallist@^2.0.0, yallist@^2.1.2: 2631 | version "2.1.2" 2632 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" 2633 | --------------------------------------------------------------------------------