├── .editorconfig ├── .gitignore ├── CHANGELOG.md ├── LICENSE ├── README.md ├── bin └── fount.js ├── doc ├── compare.md ├── contour-direction.md ├── font-types.md ├── fontforge.md ├── img │ ├── fillrule-compare.png │ ├── fillrule-evenodd.png │ ├── fillrule-nonzero.png │ ├── foic.gif │ └── fouc.gif ├── implementation.md └── web-font-performance.md ├── package.json ├── sample ├── config.json └── svg │ ├── browser.svg │ ├── calendar.svg │ ├── custom-selected.svg │ ├── custom.svg │ ├── decorate.svg │ ├── polygon-fixed.svg │ ├── polygon.svg │ ├── rect-fixed.svg │ ├── rect.svg │ └── shop.svg ├── scripts ├── correct-direction.py └── test-fontforge.py ├── src ├── config-schema.js ├── index.js ├── log.js ├── svg │ ├── index.js │ ├── load.js │ └── optimize.js └── validate-config.js ├── templates ├── LICENSE.pug ├── README.txt ├── bootstrap.styl ├── css │ ├── animation.css │ ├── css-codes.pug │ ├── css-embedded.pug │ ├── css-ie7-codes.pug │ ├── css-ie7.pug │ └── css.pug ├── demo.pug └── font │ └── svg.tpl └── yarn.lock /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | end_of_line = lf 5 | trim_trailing_whitespace = true 6 | insert_final_newline = true 7 | 8 | [*.js] 9 | indent_style = space 10 | indent_size = 2 11 | 12 | [*.py] 13 | indent_style = space 14 | indent_size = 4 15 | 16 | [*.md] 17 | trim_trailing_whitespace = false 18 | 19 | [*.jade] 20 | trim_trailing_whitespace = false 21 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | *.log 3 | build 4 | node_modules 5 | .vscode 6 | .idea 7 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Change logs 2 | 3 | ## 2.3.0 (2020-04-12) 4 | 5 | * 升级包依赖至最新 6 | * 使用 `pugjs` 替换 `jade` 7 | * 微调 demo 页面样式 8 | 9 | ## 2.2.0 (2019-11-07) 10 | 11 | * 升级依赖保本版 12 | * 增加 Node.js `API` 的使用文档 13 | 14 | ## 2.1.1 (2018-10-26) 15 | 16 | * 修复 `svgo` 代码问题 17 | 18 | ## 2.1.0 (2018-10-25) 19 | 20 | * 关闭 `svgo` 中的 `convertPathData` 优化,会引起边粗细不一致的问题 21 | 22 | ## 2.0.0 (2017.02.08) 23 | 24 | * 项目开源,重命名为iconfount(因为npm包名被占用) 25 | 26 | ## 1.0.9 (2017.01.16) 27 | 28 | * output现在是相对配置文件的路径,和glyphDir保持一致 29 | 30 | ## 1.0.8 (2016.12.22) 31 | 32 | * 调整外部工具检测的报错流程 33 | 34 | ## 1.0.7 (2016.12.21) 35 | 36 | * 调用外部命令时先判断命令是否存在,ttfautohint貌似会fail silently 37 | * 在部分文件里添加了fontello的license 38 | 39 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | Copyright (c) 2016-present Youzan.com 3 | 4 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 5 | 6 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 7 | 8 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 9 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # iconfount 2 | 3 | `iconfount`是一个离线icon font生成工具,支持从多个svg文件生成一套字体以及对应的样式文件。 4 | 5 | [![NPM](https://nodei.co/npm/iconfount.png?downloads=true)](https://nodei.co/npm/iconfount/) 6 | 7 | ## 字体文件兼容性 8 | 9 | 1. 桌面端浏览器:IE6+, Safari, FF, Chrome 10 | 2. 移动端浏览器:绝大部分系统都没有问题,部分*非常老*的安卓系统或者某些古董浏览器可能会有问题。不支持Windows Mobile IE9。 11 | 12 | ## 安装 13 | 14 | `ynpm install -g iconfount` or `yarn global add iconfount`. 15 | 16 | ## 第三方依赖 17 | 18 | 这些依赖是可选的,用到特定选项时才需要安装。 19 | 20 | 1. ttfautohint: `brew install ttfautohint`, `hinting`是`true`的时候需要安装 21 | 2. fontforge: 参见[安装fontforge](https://github.com/youzan/iconfount/blob/master/doc/fontforge.md), 图标`correct_contour_direction`为`true`时需要安装 22 | 23 | ## 使用 24 | 25 | ### CLI 26 | 27 | ```text 28 | Usage: iconfount --config file [options] 29 | 30 | Options: 31 | --help print this message and exit [boolean] 32 | -c, --config config file to read [required] 33 | -t, --test test configuration and exit [boolean] 34 | ``` 35 | 36 | ### API 37 | 38 | #### iconfount(config): buildConfig 39 | 40 | * `config` - config file to read [required] 41 | * `buildConfig` - full config for generate, include svg infos [promise] 42 | 43 | ``` js 44 | const iconfount = require('iconfount') 45 | 46 | iconfount('file') 47 | ``` 48 | 49 | ## 输出文件 50 | 51 | ```text 52 | ├── LICENSE.txt 版权信息 53 | ├── README.txt 说明文件 54 | ├── codes.json 字符的详细定义,可用于外部工具生成样式代码 55 | ├── config.json 调试用,请忽略 56 | ├── css 57 | │   ├── animation.css 调试用,动画 58 | │   ├── zenticons-codes.css 只包含字符codepoint的css文件 59 | │   ├── zenticons-embedded.css 区别在于WOFF内联了,规避CORS时有用 60 | │   ├── zenticons-ie7-codes.css IE7专用 61 | │   ├── zenticons-ie7.css IE7专用 62 | │   └── zenticons.css 完整的样式,包括font-face以及各个字符的样式 63 | ├── demo.html 预览文件 64 | └── font 65 | ├── zenticons-db0a845be8.eot IE专用 66 | ├── zenticons-db0a845be8.svg 老的Safari专用 67 | ├── zenticons-db0a845be8.ttf 68 | ├── zenticons-db0a845be8.woff 69 | └── zenticons-db0a845be8.woff2 70 | ``` 71 | 72 | css目录下已经提供了两种样式选择:完整的和只包含字符定义的css。如果仍不能满足需求,可以使用`codes.json` 73 | 文件自己生成样式。 74 | 75 | 76 | ## 示例 77 | 78 | `sample`目录下提供了一个示例配置。 79 | 80 | ## 配置文件 81 | 82 | 支持`json`或者`js`文件,`js`文件的话直接`export`一个包含配置信息的对象。 83 | 84 | `sample/`目录下有一个示例配置文件,仅供参考。 85 | 86 | `doc/`目录下有一些文档,对详细理解一些配置有帮助。 87 | 88 | ### 参数 89 | 90 | #### name 91 | 92 | type: `string` 93 | 94 | required: `false` 95 | 96 | default: `'iconfount'` 97 | 98 | 字体名字,最好英文吧 99 | 100 | #### output 101 | 102 | type: `string` 103 | 104 | required: `true` 105 | 106 | 输出字体、样式以及示例文件的目录,可以是相对路径或者绝对路径 107 | 108 | #### hinting 109 | 110 | type: `boolean` 111 | 112 | required: `false` 113 | 114 | default: `false` 115 | 116 | 是否使用`ttfautohint`对字体文件做hint,需要安装`ttfautohint`。 117 | 建议开启。 118 | 119 | #### units_per_em 120 | 121 | type: `number` 122 | 123 | required: `false` 124 | 125 | default: `1000` 126 | 127 | 简单理解为单个svg图标的画板大小,[detail](https://www.w3.org/TR/SVG/fonts.html#FontFaceElementUnitsPerEmAttribute) 128 | 不清楚的话不要设置。 129 | 130 | #### ascent 131 | 132 | type: `number` 133 | 134 | required: `false` 135 | 136 | default: `850` 137 | 138 | 从baseline到最高字符顶部的高度, [detail](https://www.w3.org/TR/SVG/fonts.html#FontFaceElementAscentAttribute) 139 | 不清楚的话不要设置。 140 | 141 | #### weight 142 | 143 | type: `number` 144 | 145 | required: `false` 146 | 147 | default: `400` 148 | 149 | 字体的粗细,和`font-weight`属性一致 150 | 151 | #### start_codepoint 152 | 153 | type: `number` 154 | 155 | required: `false` 156 | 157 | default: `59392`, 即`0xE800`。 158 | 159 | 最小`0xE000`(`57344`),最大`0xF8FF`(`63743`),这个区间是 160 | Unicode的[Private Use Area](https://en.wikipedia.org/wiki/Private_Use_Areas#Private_Use_Areas), 161 | 虽然planes 15 and 16也是Private Use Areas,但是我们不支持这两个区间。 162 | 163 | #### glyphs_dir 164 | 165 | type: `string` 166 | 167 | required: `true` 168 | 169 | 存放svg文件的根目录,**如果是相对路径,必须是相对当前配置文件的路径**。 170 | 171 | #### glyphs 172 | 173 | type: `Array.` 174 | 175 | required: `true` 176 | 177 | 所有图标的定义,每个图标有如下几个属性. 178 | 179 | ##### glyphs.keywords 180 | 181 | type: `Array.` 182 | 183 | required: `false` 184 | 185 | default: `[]` 186 | 187 | 图标的一些tag,主要是描述图标的作用. 188 | 189 | ##### glyphs.src 190 | 191 | type: `string` 192 | 193 | required: `true` 194 | 195 | 图标相对`glyphs_dir`的路径。 196 | 197 | ##### glyphs.css 198 | 199 | type: `string` 200 | 201 | required: `true` 202 | 203 | 图标的CSS名字,图标最终的class是`${meta.css_prefix_text}${css}`,如果`meta.css_use_suffix` 204 | 是`true`,图标最终的class是`${css}${meta.css_prefix_text}`。 205 | 206 | ##### glyphs.correct_contour_direction 207 | 208 | type: `boolean` 209 | 210 | required: `false` 211 | 212 | default: `false` 213 | 214 | 是否使用`fontforge`对字符做轮廓方向修正,需要安装`fontforge`。 215 | 视情况开启,如果生成的字符填充位置不正常,再考虑开启。不过做好是让设计修改原图的路径方向,具体请看 216 | `doc/contour-direction.md` 217 | 218 | #### meta 219 | 220 | type: `Object` 221 | 222 | required: `false` 223 | 224 | 一些元数据 225 | 226 | ##### meta.author 227 | 228 | type: `string` 229 | 230 | required: `false` 231 | 232 | default: `''` 233 | 234 | 字体的作者 235 | 236 | ##### meta.license 237 | 238 | type: `string` 239 | 240 | required: `false` 241 | 242 | default: `''` 243 | 244 | 字体的许可协议 245 | 246 | ##### meta.license_url 247 | 248 | type: `string` 249 | 250 | required: `false` 251 | 252 | default: `''` 253 | 254 | 字体许可协议链接 255 | 256 | ##### meta.homepage 257 | 258 | type: `string` 259 | 260 | required: `false` 261 | 262 | default: `''` 263 | 264 | 字体主页 265 | 266 | ##### meta.css_prefix_text 267 | 268 | type: `boolean` 269 | 270 | required: `false` 271 | 272 | default: `'icon-'` 273 | 274 | 图标css前缀。 275 | 276 | #### meta.css_use_suffix 277 | 278 | type: `boolean` 279 | 280 | required: `false` 281 | 282 | default: `false` 283 | 284 | 如果为`true`, `meta.css_prefix_text`将被用作css后缀。 285 | 286 | ##### meta.columns 287 | 288 | type: `number` 289 | 290 | required: `false` 291 | 292 | default: `4` 293 | 294 | 示例页面中每行的列数。 295 | 296 | ##### meta.filename_hash 297 | 298 | type: `boolean` 299 | 300 | required: `false` 301 | 302 | default: `true` 303 | 304 | 是否在文件名中加入随机字符串,确保每次生成的文件名都不同。 305 | 306 | ## License 307 | 308 | iconfount's code (all files) is distributed under MIT license. See 309 | [LICENSE](https://github.com/youzan/iconfount/blob/master/LICENSE) file for details. 310 | 311 | Many thanks to the [fontello](https://github.com/fontello/fontello) project. 312 | -------------------------------------------------------------------------------- /bin/fount.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | 'use strict'; 4 | 5 | var argv = require('yargs') 6 | .usage('Usage: $0 --config file [options]') 7 | .demand('config') 8 | .version() 9 | .describe({ 10 | config: 'config file to read', 11 | test: 'test configuration and exit', 12 | version: 'show version number and quit' 13 | }) 14 | .alias('c', 'config') 15 | .alias('t', 'test') 16 | .alias('v', 'version') 17 | .boolean('test') 18 | .help('help', 'print this message and exit') 19 | .argv; 20 | 21 | var build = require('../src'); 22 | var validate = require('../src/validate-config'); 23 | var log = require('../src/log'); 24 | 25 | function main() { 26 | var configFile = argv.config; 27 | 28 | var errors = validate(configFile); 29 | 30 | if (errors) { 31 | log.error(errors); 32 | process.exit(-1); 33 | } 34 | 35 | if (argv.test) { 36 | process.exit(0); 37 | } 38 | 39 | build(configFile); 40 | } 41 | main(); 42 | -------------------------------------------------------------------------------- /doc/compare.md: -------------------------------------------------------------------------------- 1 | # iconfount和fontello的区别 2 | 3 | iconfount的实现复用了很多[fontello](https://github.com/fontello/fontello)的代码和库。 4 | 5 | svg预处理和demo文件模版都是来自fontello,做了很小的修改。 6 | 7 | 字体生成主要使用了fontello的子项目:`svg2ttf`,`ttf2eot`, `ttf2woff`以及`ttf2woff2`。 8 | 9 | 相比fontello的Browser-Server结构, iconfount是一个命令行工具。 10 | 11 | iconfount包含了字符轮廓自动修正的功能,这个是fontello不支持的。 12 | 13 | iconfount的配置文件并不兼容fontello。 14 | -------------------------------------------------------------------------------- /doc/contour-direction.md: -------------------------------------------------------------------------------- 1 | # 关于SVG的`fill-rule`以及TTF的字符轮廓方向(glyph contour direction) 2 | 3 | 由于Sketch在设计界的流行,支持导入Sketch生成的SVG文件是`iconfount`的一个目标。但是Sketch导出的 4 | SVG文件烂是公认的事实,由于TTF文件并不能100%支持SVG的特性,所以转换的时候有些东西其实是会被丢掉的。 5 | 我们要做的是尽可能保留SVG文件对字符形状的描述,至于颜色之类的根本不重要。 6 | 7 | 这个事情要从Sketch生成的SVG文件中的一个attribute说起, `fill-rule`。这个attribute在SVG中有 8 | 两个值(实际是三个,但是`inherit`对我们来说没有实际意义),`nonzero`(默认)和`evenodd`。最新 9 | 版本(40.x)的Sketch生成的SVG文件的`fill-rule`似乎永远都是`evenodd`,但是TTF的填充算法只支持 10 | `nonzero`,这两种模式的效果在同一个图像中有时候是不一样的。 11 | 12 | ## SVG路径 13 | 14 | SVG支持的基础图形包括,矩形(``)、圆(``)、椭圆(``)以及多边形(``) 15 | 等等,这些基础图形又都可以归结到路径(``)来,它们只是一种‘语法糖’。 16 | 17 | ## `fill-rule`是干什么的? 18 | 19 | 简单来说,这个属性定义了使用什么算法来判断一个点在路径里面还是外面。对于不相交的路径一个点在里面还是 20 | 外面是很直观的,但是对于有重叠的复杂路径,就需要一些规则来确定点在里面还是外面,`full-rule`就是 21 | 定义这个算法的。 22 | 23 | ## `evenodd` 24 | 25 | 这个规则比较简单:从点往任意方向画一条射线,如果这条射线和路径的交点个数是偶数则认为点在路径外; 26 | 如果交点个数是奇数则认为点在路径内。 27 | 28 | ![fillrule-evenodd](img/fillrule-evenodd.png) 29 | 30 | ## `nonzero` 31 | 32 | 这个规则的定义是这样的:从点往任意方向画一条射线,我们维护一个计数,从零开始,如果路径中的某段 33 | 从左向右和射线相交,计数加一;如果路径中的某段从右向左和射线相交,计数减一。最终,如果计数为零则 34 | 点在路径外;如果计数不为零则点在路径内。 35 | 36 | ![fillrule-nonzero](img/fillrule-nonzero.png) 37 | 38 | ## `fill-rule`对生成字体的影响 39 | 40 | 从上面的规则描述中我们知道,`evenodd`判断点在路径内/外与路径的方向是无关的,而`nonzero`是和 41 | 路径方向有关系的,正是这个区别会导致有些SVG生成的字符会出现填充错误的情况。 42 | 43 | ![fillrule-compare](img/fillrule-compare.png) 44 | 45 | ## 解决方案 46 | 47 | 在Sketch中画图的时候据我所知是不显示路径方向的,我们假设所有路径都是顺时针方向,那么一些复杂图形 48 | 在两种`fill-rule`下会显示成不同的样子。如果想让图片在两种模式下显示一样,Sketch中有一个操作可以 49 | 做到,但是比较麻烦,选择不正常的路径在菜单`Layer -> Paths -> Reverse Order`一般可以解决问题。 50 | 这种方式需要人工干预,尤其是在Sketch下无法看到路径方向的情况下操作很不方便。 51 | 52 | `iconfount`的`correct_contour_direction`参数可以控制是否自动修复这些有问题的路径。这个功能需要 53 | 安装`fontforge`,而且有个别情况下这个功能可能无法自动修复这些问题。 54 | -------------------------------------------------------------------------------- /doc/font-types.md: -------------------------------------------------------------------------------- 1 | # Web常用字体类型 2 | 3 | ## ttf 4 | 即TrueType font,80年代由Apple和微软开发,macOS和Windows都原生支持这个格式。绝大多数浏览器都支持这个格式。 5 | 6 | ## woff/woff2 7 | 这是Web Open Font Format的缩写,这个格式是专门为Web开发的,比较新,2009才开始开发,现在是W3C 8 | 的一个标准。WOFF本质上是OpenType或者TrueType的一层封装,主要多了压缩这个特点,适合网络传输。 9 | 绝大多数浏览器都支持这个格式。 10 | 11 | ## eot 12 | Embedded OpenType,微软十几年前搞出来的,只有IE支持,和WOFF是竞争关系。 13 | 14 | ## SVG font 15 | Scalable Vector Graphics font, 缺点是大,不支持hinting,只有老的Safari和Chrome支持,可以认为 16 | 已经被WOFF替代。 17 | 18 | ## 各个格式的兼容性 19 | 20 | | | Chrome | Firefox | Opera | Safari | IE | 21 | |-------|--------|---------|-------|--------|-----| 22 | | TTF | 4 | 3.5 | 10 | 3.1 | 9 | 23 | | WOFF | 5 | 3.6 | 11.10 | 5.1 | 9 | 24 | | WOFF2 | 36 | 39 | 23 | 10 | N/A | 25 | | SVG | 4-37 | N/A | 9-24 | 3.2 | N/A | 26 | | EOT | N/A | N/A | N/A | N/A | 6 | 27 | -------------------------------------------------------------------------------- /doc/fontforge.md: -------------------------------------------------------------------------------- 1 | # fontforge Guide 2 | 3 | 自动修正字体轮廓方向需要安装fontforge。 4 | 5 | 请参考[fontforge官网安装说明](https://fontforge.github.io/en-US/downloads/) 6 | 7 | ## Install fontforge command line tools 8 | 9 | `brew install fontforge` 10 | 11 | > Follow the guide on the screen to install fontforge module to your python path. 12 | 13 | ## Enable ucs2 support in Python 14 | 15 | If you see this error when importing fontforge in Python 16 | 17 | ``` 18 | dlopen(/usr/local/lib/python2.7/site-packages/fontforge.so, 2): Symbol not found: _PyUnicodeUCS2_AsUTF8String 19 | ``` 20 | 21 | Do this: 22 | 23 | ```shell 24 | pyenv uninstall 2.7.11 25 | PYTHON_CONFIGURE_OPTS="--enable-unicode=ucs2" pyenv install 2.7.11 26 | ``` 27 | -------------------------------------------------------------------------------- /doc/img/fillrule-compare.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zent-contrib/iconfount/e661044cb98e37cfc27702c48890f9144263ac2e/doc/img/fillrule-compare.png -------------------------------------------------------------------------------- /doc/img/fillrule-evenodd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zent-contrib/iconfount/e661044cb98e37cfc27702c48890f9144263ac2e/doc/img/fillrule-evenodd.png -------------------------------------------------------------------------------- /doc/img/fillrule-nonzero.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zent-contrib/iconfount/e661044cb98e37cfc27702c48890f9144263ac2e/doc/img/fillrule-nonzero.png -------------------------------------------------------------------------------- /doc/img/foic.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zent-contrib/iconfount/e661044cb98e37cfc27702c48890f9144263ac2e/doc/img/foic.gif -------------------------------------------------------------------------------- /doc/img/fouc.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zent-contrib/iconfount/e661044cb98e37cfc27702c48890f9144263ac2e/doc/img/fouc.gif -------------------------------------------------------------------------------- /doc/implementation.md: -------------------------------------------------------------------------------- 1 | # 实现细节 2 | 3 | ## SVG预处理 4 | iconfount的配置文件主要包括字体的基本信息,拿到这些信息后,首先做的是SVG文件的预处理。由于TTF文件支持 5 | 的特性相比SVG要少很多,所以SVG中很多属性和tag都会被剔除,并且所有图形都会被转换成一个复合路径。 6 | 内部最终会得到一个类似这样的数据来描述一个SVG文件: 7 | 8 | `path`里面包含了这个SVG中最重要的路径描述,也就是SVG所画的图形;`code`是这个SVG图标最终在字体文件 9 | 中对应的字符codepoint,css中引用这个图标就是通过这个数字引用的。 10 | 11 | ```json 12 | { 13 | "src": "custom.svg", 14 | "code": 59392, 15 | "css": "custom", 16 | "keywords": [ 17 | "custom" 18 | ], 19 | "width": 1000, 20 | "d": "M36-79l35-35 0 43c0 44 36 67 150 107 2 1 2 1 3 1 144 50 195 84 195 171 0 2 0 2 0 5 0 6 0 6 0 12 1 13 1 20 1 28l-1 15-10 10c-30 30-57 70-69 116l-4 17-16 7c-8 3-16 12-22 26-9 23-8 50 5 64l11 12-2 16c-1 5-1 5-2 11-4 39-3 72 5 104 7 26 19 49 37 66 37 38 89 60 150 62 59-2 110-24 147-62 18-17 30-39 37-65 9-32 10-65 5-103 0-6 0-6-1-12l-2-15 10-12c13-15 15-43 5-66-5-14-13-23-21-26l-17-7-4-17c-12-46-38-85-69-116l-10-10-1-15c0-27 0-35 0-47 0-84 51-119 191-170 3-1 3-1 6-2 114-42 151-67 151-113l0-35 35 35-928 0z m964-71l0 36 0 35c0 90-54 127-197 180-3 1-3 1-6 2-110 40-145 63-145 103 0 12 1 20 1 46l-36 1 25-26c39 39 73 89 88 149l-34 9 13-33c27 11 48 34 60 65 19 46 16 101-16 139l8-27c1 5 1 5 1 12 5 47 5 88-7 130-10 37-28 70-55 97-50 50-119 80-198 82-82-2-150-32-200-82-28-27-46-61-56-99-11-42-12-83-7-129 1-7 1-7 2-13l9 28c-33-36-37-92-18-138 13-31 33-54 60-65l14 33-35-9c16-60 49-110 88-149l25 26-36-1c0-7 0-13 0-25 0-7 0-7 0-14 0-2 0-2 0-5 0-41-35-64-147-103-2-1-2-1-3-1-145-51-198-86-198-175l0-43 0-36 36 0 928 0 36 0z", 21 | "segments": 86 22 | } 23 | ``` 24 | 25 | 这步预处理只保留了SVG文件中图形的轮廓,颜色之类的信息都会被丢掉,因为这些信息无法转换到TTF中。同时 26 | SVG的路径会被缩放到一个标准尺寸,最终生成TTF时,每个字符的画布尺寸都是一样的,这个过程用了`svgpath` 27 | 来处理各种路径的变换。 28 | 29 | ## 生成字体 30 | 31 | SVG预处理完成后,就开始生成字体文件了,首先生成的是SVG字体文件,SVG字体其实就是一个用SVG文件描述的 32 | 字体文件,格式就是一个SVG文件,所以我们通过一个模版`templates/font/svg.tpl`来生成这个SVG字体文件。 33 | 34 | 有了这个SVG文件后,iconfount就通过`svg2ttf`从SVG字体文件生成等价的TTF字体文件,得到TTF文件后,我们就 35 | 从TTF生成其他类型的字体文件,包括eot, woff, woff2,这些文件本质上都是对TTF文件的一个封装,添加了一些 36 | 元数据和压缩特性,使得这些字体文件更适合在网络环境下使用。 37 | 38 | 这一步的时候同时会生成`config.json`和`codes.json`,`config.json`主要是调试使用的,里面包含了 39 | 最终用来生成字体文件的所有信息;`codes.json`包含了每个字符的详细信息。 40 | 41 | ## 生成CSS和demo 42 | 43 | 字体文件生成完成后,就开始生成CSS文件和demo文件,这些都是通过`templates`下的模版文件生成的。 44 | -------------------------------------------------------------------------------- /doc/web-font-performance.md: -------------------------------------------------------------------------------- 1 | # Web font的性能问题 2 | 3 | 和普通的资源文件一样,字体文件也有加载时间,那么浏览器在加载资源的这段时间如何展示使用了这些字体的 4 | 内容呢?常见的问题大概有两种,相信大家细心的话应该都见过: 5 | 6 | * FOIC(Flash Of Invisible Content),网站打开的时候先是空白的,字体加载完了页面再重绘。 7 | 8 | ![foic](img/foic.gif) 9 | 10 | * FOUC(Flash Of Unstyled Content),网站打开的时候浏览器使用fallback字体渲染,待字体文件 11 | 加载完成后再重绘页面。 12 | 13 | ![fouc](img/fouc.gif) 14 | 15 | 大部分浏览器为了保证页面最终的可用性,都会在加载Web font时设置一个超时,在这段超时时间内,页面一般 16 | 都是被渲染成空白的(不过要小心链接的下划线,和list的样式,会出现很丑的页面);如果超时了浏览器一般 17 | 会用一个fallback字体渲染页面,之后如果字体文件成功下载就会重绘页面并使用web font渲染。 18 | 19 | `font-display`可以设置Web font加载的行为,但是浏览器支持还不好。 20 | 21 | `font-display: auto | block | swap | fallback | optional` 22 | 23 | ## Reference 24 | * [Controlling Font Performance with font-display](https://developers.google.com/web/updates/2016/02/font-display) 25 | * [Web fonts, boy, I don't know](http://meowni.ca/posts/web-fonts/) 26 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "iconfount", 3 | "version": "2.3.2", 4 | "description": "Create web fonts from svg files", 5 | "main": "./src/index.js", 6 | "bin": { 7 | "iconfount": "./bin/fount.js" 8 | }, 9 | "files": [ 10 | "bin/", 11 | "doc/", 12 | "sample/", 13 | "scripts/", 14 | "src/", 15 | "templates/" 16 | ], 17 | "scripts": { 18 | "sample": "node bin/fount.js -c sample/config.json" 19 | }, 20 | "engines": { 21 | "node": ">=8.0.0" 22 | }, 23 | "keywords": [ 24 | "icon", 25 | "font", 26 | "css", 27 | "svg", 28 | "ttf", 29 | "woff" 30 | ], 31 | "author": "Youzan FE", 32 | "license": "MIT", 33 | "dependencies": { 34 | "@xmldom/xmldom": "^0.7.3", 35 | "ajv": "^8.6.2", 36 | "base64-js": "^1.3.1", 37 | "jstransformer-stylus": "^1.5.0", 38 | "lodash": "^4.17.21", 39 | "mkdirp": "^1.0.4", 40 | "pug": "^3.0.2", 41 | "rimraf": "^3.0.0", 42 | "svg2ttf": "^6.0.3", 43 | "svgo": "^2.5.0", 44 | "svgpath": "^2.2.2", 45 | "ttf2eot": "^3.0.0", 46 | "ttf2woff": "^3.0.0", 47 | "ttf2woff2": "^4.0.4", 48 | "winston": "^3.2.1", 49 | "yargs": "^17.1.1" 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /sample/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "demo", 3 | "output": "../build", 4 | "hinting": false, 5 | "units_per_em": 1000, 6 | "ascent": 850, 7 | "weight": 400, 8 | "start_codepoint": 59392, 9 | "glyphs_dir": "./svg", 10 | "glyphs": [{ 11 | "keywords": ["custom"], 12 | "src": "custom.svg", 13 | "css": "custom" 14 | }, { 15 | "keywords": ["custom", "selected"], 16 | "src": "custom-selected.svg", 17 | "css": "custom-selected" 18 | }, { 19 | "keywords": ["decorate"], 20 | "src": "decorate.svg", 21 | "css": "decorate", 22 | "correct_contour_direction": true 23 | }, { 24 | "keywords": ["calendar"], 25 | "src": "calendar.svg", 26 | "css": "calendar", 27 | "correct_contour_direction": true 28 | }, { 29 | "keywords": ["shop"], 30 | "src": "shop.svg", 31 | "css": "shop", 32 | "correct_contour_direction": true 33 | }, { 34 | "keywords": ["browser"], 35 | "src": "browser.svg", 36 | "css": "browser" 37 | }, { 38 | "keywords": ["polygon"], 39 | "src": "polygon.svg", 40 | "css": "polygon" 41 | }, { 42 | "keywords": ["polygon", "fixed"], 43 | "src": "polygon-fixed.svg", 44 | "css": "polygon-fixed" 45 | }, { 46 | "keywords": ["rect"], 47 | "src": "rect.svg", 48 | "css": "rect" 49 | }, { 50 | "keywords": ["rect", "fixed"], 51 | "src": "rect-fixed.svg", 52 | "css": "rect-fixed" 53 | }], 54 | "meta": { 55 | "author": "Youzan FE", 56 | "license": "MIT", 57 | "license_url": "https://opensource.org/licenses/MIT", 58 | "homepage": "http://www.youzan.com", 59 | "css_prefix_text": "demo-icon-", 60 | "css_use_suffix": false, 61 | "columns": 4, 62 | "filename_hash": true 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /sample/svg/browser.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | browser 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /sample/svg/calendar.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 日历一 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /sample/svg/custom-selected.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 客户选中 5 | Created with sketchtool. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /sample/svg/custom.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 客户默认 5 | Created with sketchtool. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /sample/svg/decorate.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 装修店铺 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /sample/svg/polygon-fixed.svg: -------------------------------------------------------------------------------- 1 | 概况默认 2 | -------------------------------------------------------------------------------- /sample/svg/polygon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 概况默认 5 | Created with sketchtool. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /sample/svg/rect-fixed.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /sample/svg/rect.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 商品默认 5 | Created with sketchtool. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /sample/svg/shop.svg: -------------------------------------------------------------------------------- 1 | 未标题-1 -------------------------------------------------------------------------------- /scripts/correct-direction.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | import fontforge 4 | import sys 5 | 6 | def main(): 7 | argv = sys.argv; 8 | if len(argv) < 4: 9 | return; 10 | 11 | ttfInput = argv[1] 12 | ttfOutput = argv[2] 13 | badGlyphs = argv[3:] 14 | 15 | font = fontforge.open(ttfInput) 16 | for codepoint in badGlyphs: 17 | font.selection.select(('more', 'unicode'), int(codepoint)) 18 | font.correctDirection() 19 | font.generate(ttfOutput) 20 | font.close() 21 | 22 | if __name__ == '__main__': 23 | main(); 24 | -------------------------------------------------------------------------------- /scripts/test-fontforge.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | import fontforge 4 | -------------------------------------------------------------------------------- /src/config-schema.js: -------------------------------------------------------------------------------- 1 | // json-schema for font config validation 2 | 3 | "use strict"; 4 | 5 | module.exports = { 6 | type: "object", 7 | additionalProperties: false, 8 | required: ["name", "output", "glyphs", "glyphs_dir"], 9 | properties: { 10 | name: { type: "string" }, 11 | output: { type: "string" }, 12 | hinting: { type: "boolean" }, 13 | units_per_em: { type: "integer", minimum: 10 }, 14 | ascent: { type: "integer", minimum: 10 }, 15 | weight: { type: "number", minimum: 100 }, 16 | copyright: { type: "string" }, 17 | start_codepoint: { type: "number", maximum: 63743, minimum: 57344 }, 18 | glyphs_dir: { type: "string" }, 19 | glyphs: { 20 | type: "array", 21 | minItems: 1, 22 | items: { 23 | type: "object", 24 | properties: { 25 | css: { type: "string" }, 26 | src: { type: "string" }, 27 | keywords: { type: "array", minItems: 1, items: { type: "string" } }, 28 | correct_contour_direction: { type: "boolean" }, 29 | }, 30 | required: ["css", "src"], 31 | }, 32 | }, 33 | meta: { 34 | type: "object", 35 | properties: { 36 | author: { type: "string" }, 37 | license: { type: "string" }, 38 | license_url: { type: "string" }, 39 | homepage: { type: "string" }, 40 | css_prefix_text: { type: "string" }, 41 | css_use_suffix: { type: "boolean" }, 42 | columns: { type: "number" }, 43 | filename_hash: { type: "boolean" }, 44 | }, 45 | }, 46 | }, 47 | }; 48 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Modified from fontello project: https://github.com/fontello/fontello 3 | * 4 | * (The MIT License) 5 | * 6 | * Copyright (C) 2011 by Vitaly Puzrin 7 | * 8 | * Permission is hereby granted, free of charge, to any person obtaining a copy 9 | * of this software and associated documentation files (the "Software"), to deal 10 | * in the Software without restriction, including without limitation the rights 11 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 12 | * copies of the Software, and to permit persons to whom the Software is 13 | * furnished to do so, subject to the following conditions: 14 | * 15 | * The above copyright notice and this permission notice shall be included in 16 | * all copies or substantial portions of the Software. 17 | * 18 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 19 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 20 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 21 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 22 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 23 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 24 | * THE SOFTWARE. 25 | */ 26 | 27 | "use strict"; 28 | 29 | var _ = require("lodash"); 30 | var svgpath = require("svgpath"); 31 | var path = require("path"); 32 | var fs = require("fs"); 33 | var rimraf = require("rimraf"); 34 | var mkdirp = require("mkdirp"); 35 | var svg2ttf = require("svg2ttf"); 36 | var ttf2eot = require("ttf2eot"); 37 | var ttf2woff = require("ttf2woff"); 38 | var ttf2woff2 = require("ttf2woff2"); 39 | var child_process = require("child_process"); 40 | var pug = require("pug"); 41 | var b64 = require("base64-js"); 42 | var crypto = require("crypto"); 43 | var { optimize } = require("svgo"); 44 | 45 | var loadSvg = require("./svg"); 46 | var log = require("./log"); 47 | 48 | var ERROR = { 49 | ttfautohint: "ttfautohint not installed", 50 | fontforge: "fontforge python extension not installed", 51 | }; 52 | 53 | var TEMPLATES_DIR = path.join(__dirname, "../templates"); 54 | var SVG_FONT_TEMPLATE = _.template( 55 | fs.readFileSync(path.join(TEMPLATES_DIR, "font/svg.tpl"), "utf8") 56 | ); 57 | var TEMPLATES = _.reduce( 58 | { 59 | "demo.pug": "demo.html", 60 | "css/css.pug": "css/${FONTNAME}.css", 61 | "css/css-ie7.pug": "css/${FONTNAME}-ie7.css", 62 | "css/css-codes.pug": "css/${FONTNAME}-codes.css", 63 | "css/css-ie7-codes.pug": "css/${FONTNAME}-ie7-codes.css", 64 | "css/css-embedded.pug": "css/${FONTNAME}-embedded.css", 65 | "LICENSE.pug": "LICENSE.txt", 66 | "css/animation.css": "css/animation.css", 67 | "README.txt": "README.txt", 68 | }, 69 | function (templates, outputName, inputName) { 70 | var inputFile = path.join(TEMPLATES_DIR, inputName); 71 | var inputData = fs.readFileSync(inputFile, "utf8"); 72 | var outputData; 73 | 74 | switch (path.extname(inputName)) { 75 | case ".pug": // Pugjs template. 76 | outputData = pug.compile(inputData, { 77 | pretty: true, 78 | filename: inputFile, 79 | }); 80 | break; 81 | 82 | case ".tpl": // Lodash template. 83 | outputData = _.template(inputData); 84 | break; 85 | 86 | default: 87 | // Static file - just do a copy. 88 | outputData = _.constant(inputData); 89 | break; 90 | } 91 | 92 | templates[outputName] = outputData; 93 | return templates; 94 | }, 95 | {} 96 | ); 97 | 98 | function getRandomString() { 99 | var hash = crypto.createHash("sha256"); 100 | var randomNumber = Date.now() + _.random(0, 1, true) * 1000000; 101 | hash.update(randomNumber + ""); 102 | return hash.digest("hex").slice(-10); 103 | } 104 | 105 | /** 106 | * 生成glyphs的json信息,可以给外部工具用来生成代码 107 | * @return {[type]} [description] 108 | */ 109 | function generateGlyphsJson(buildConfig) { 110 | var prefix = buildConfig.meta.css_prefix_text; 111 | var useSuffix = buildConfig.meta.css_use_suffix; 112 | var glyphs = buildConfig.glyphs; 113 | 114 | if (_.isEmpty(glyphs)) { 115 | return []; 116 | } 117 | 118 | return glyphs.map(function (g) { 119 | var css = useSuffix ? g.css + prefix : prefix + g.css; 120 | var hex = "0x" + g.code.toString(16); 121 | return { 122 | name: g.css, 123 | css: css, 124 | hexCodepoint: hex, 125 | codepoint: g.code, 126 | keywords: g.keywords, 127 | }; 128 | }); 129 | } 130 | 131 | function collectGlyphsInfo(config) { 132 | var scale = config.units_per_em / 1000; 133 | var badGlyphs = []; 134 | var result = _.map(config.glyphs, function (glyph) { 135 | var sp = svgpath(glyph.svg.path) 136 | .scale(scale, -scale) 137 | .translate(0, config.ascent) 138 | .abs() 139 | .round(0) 140 | .rel(); 141 | 142 | // 把需要调整路径方向的字符保存起来,后面会交给fontforge处理 143 | if (glyph.correct_contour_direction) { 144 | badGlyphs.push(glyph.code); 145 | } 146 | 147 | return _.assign({}, _.pick(glyph, ["src", "code", "css", "keywords"]), { 148 | width: +(glyph.svg.width * scale).toFixed(1), 149 | d: sp.toString(), 150 | segments: sp.segments.length, 151 | }); 152 | }); 153 | 154 | // Sort result by original codes. 155 | result.sort((a, b) => a.code - b.code); 156 | 157 | return { 158 | glyphs: result, 159 | badGlyphs: badGlyphs, 160 | }; 161 | } 162 | 163 | function fontConfig(config) { 164 | config.hinting = !!config.hinting; 165 | config.correct_contour_direction = !!config.correct_contour_direction; 166 | config.units_per_em = +config.units_per_em || 1000; 167 | config.ascent = +config.ascent || 850; 168 | config.weight = config.weight || 400; 169 | config.copyright = 170 | config.copyright || 171 | "Copyright (C) " + new Date().getFullYear() + " by original authors"; 172 | 173 | var fontname; 174 | if (!_.isEmpty(config.name)) { 175 | fontname = String(config.name).replace(/[^a-z0-9\-_]+/g, "-"); 176 | } else { 177 | fontname = "iconfount"; 178 | } 179 | 180 | var glyphsInfo = collectGlyphsInfo(config); 181 | if (_.isEmpty(glyphsInfo.glyphs)) return null; 182 | 183 | var meta = config.meta || {}; 184 | return { 185 | font: { 186 | fontname, 187 | fullname: fontname, 188 | // !!! IMPORTANT for IE6-8 !!! 189 | // due bug, EOT requires `familyname` begins `fullname` 190 | // https://github.com/fontello/fontello/issues/73?source=cc#issuecomment-7791793 191 | familyname: fontname, 192 | copyright: config.copyright, 193 | ascent: config.ascent, 194 | descent: config.ascent - config.units_per_em, 195 | weight: config.weight, 196 | }, 197 | output: path.resolve(config.output), 198 | hinting: config.hinting, 199 | meta: _.extend({}, meta, { 200 | // Used by the demo page 201 | columns: meta.columns || 4, 202 | css_prefix_text: meta.css_prefix_text || "icon-", 203 | css_use_suffix: Boolean(meta.css_use_suffix), 204 | 205 | // append hash to font file name 206 | filename_hash: Boolean(meta.filename_hash) ? "-" + getRandomString() : "", 207 | }), 208 | glyphs: glyphsInfo.glyphs, 209 | badGlyphs: glyphsInfo.badGlyphs, 210 | }; 211 | } 212 | 213 | function generateFonts(buildConfig) { 214 | var timeStart = Date.now(); 215 | var fontname = buildConfig.font.fontname; 216 | var files; 217 | 218 | log.info("Start generation:"); 219 | 220 | // Collect file paths. 221 | var fileNameHash = buildConfig.meta.filename_hash; 222 | var fontNameWithHash = fontname + fileNameHash; 223 | files = { 224 | codes: path.join(buildConfig.output, "codes.json"), 225 | config: path.join(buildConfig.output, "config.json"), 226 | svg: path.join(buildConfig.output, "font", fontNameWithHash + ".svg"), 227 | ttf: path.join(buildConfig.output, "font", fontNameWithHash + ".ttf"), 228 | ttfUnhinted: path.join( 229 | buildConfig.output, 230 | "font", 231 | fontNameWithHash + "-unhinted.ttf" 232 | ), 233 | ttfDirectionNotCorrected: path.join( 234 | buildConfig.output, 235 | "font", 236 | fontNameWithHash + "-direction-not-corrected.ttf" 237 | ), 238 | eot: path.join(buildConfig.output, "font", fontNameWithHash + ".eot"), 239 | woff: path.join(buildConfig.output, "font", fontNameWithHash + ".woff"), 240 | woff2: path.join(buildConfig.output, "font", fontNameWithHash + ".woff2"), 241 | }; 242 | 243 | // Prepare temporary working directory. 244 | rimraf.sync(buildConfig.output); 245 | mkdirp.sync(buildConfig.output); 246 | mkdirp.sync(path.join(buildConfig.output, "font")); 247 | mkdirp.sync(path.join(buildConfig.output, "css")); 248 | 249 | // Write client config 250 | var configOutput = JSON.stringify(buildConfig, null, 2); 251 | fs.writeFileSync(files.config, configOutput, "utf8"); 252 | log.info("write build config"); 253 | 254 | // Write codes 255 | var codesJSON = JSON.stringify(generateGlyphsJson(buildConfig), null, 2); 256 | fs.writeFileSync(files.codes, codesJSON, "utf8"); 257 | log.info("write codes"); 258 | 259 | // Generate initial SVG font. 260 | var svgOutput = SVG_FONT_TEMPLATE(buildConfig); 261 | fs.writeFileSync(files.svg, svgOutput, "utf8"); 262 | log.info("write svg font"); 263 | 264 | // Convert SVG to TTF 265 | var ttf = svg2ttf(svgOutput, { copyright: buildConfig.font.copyright }); 266 | fs.writeFileSync(files.ttf, Buffer.from(ttf.buffer)); 267 | log.info("write ttf first-pass"); 268 | 269 | // Autohint the resulting TTF. 270 | // Don't allow hinting if font has "strange" glyphs. 271 | // That's useless anyway, and can hang ttfautohint < 1.0 272 | var maxSegments = _.maxBy(buildConfig.glyphs, (glyph) => glyph.segments) 273 | .segments; 274 | if (maxSegments <= 500 && buildConfig.hinting) { 275 | // 貌似未处理的异常被吃掉了,所以先判断命令是否存在 276 | var ttfautohintInstalled = false; 277 | try { 278 | child_process.execFileSync("ttfautohint", ["--version"], { 279 | cwd: process.cwd(), 280 | }); 281 | ttfautohintInstalled = true; 282 | } catch (ex) {} 283 | 284 | if (!ttfautohintInstalled) { 285 | log.error(ERROR.ttfautohint); 286 | process.exit(-2); 287 | } 288 | 289 | log.info("autohint with ttfautohint"); 290 | 291 | fs.renameSync(files.ttf, files.ttfUnhinted); 292 | child_process.execFileSync( 293 | "ttfautohint", 294 | [ 295 | "--no-info", 296 | "--windows-compatibility", 297 | "--symbol", 298 | // temporary workaround for #464 299 | // https://github.com/fontello/fontello/issues/464#issuecomment-202244651 300 | "--fallback-script=latn", 301 | files.ttfUnhinted, 302 | files.ttf, 303 | ], 304 | { cwd: process.cwd() } 305 | ); 306 | 307 | fs.unlinkSync(files.ttfUnhinted); 308 | log.info("write ttf autohint"); 309 | } 310 | 311 | // 主要是处理有些fill-rule设置为evenodd的svg文件,因为ttf支持non-zero的模式,所以会导致 312 | // 生成的字体文件里有些路径被错误填充了 313 | // 这个功能依赖fontforge 314 | if (!_.isEmpty(buildConfig.badGlyphs)) { 315 | // 貌似未处理的异常被吃掉了,所以先判断命令是否存在 316 | var fontforgeInstalled = false; 317 | try { 318 | child_process.execFileSync( 319 | path.resolve(__dirname, "../scripts/test-fontforge.py"), 320 | [], 321 | { cwd: process.cwd() } 322 | ); 323 | fontforgeInstalled = true; 324 | } catch (ex) {} 325 | 326 | if (!fontforgeInstalled) { 327 | log.error(ERROR.fontforge); 328 | process.exit(-1); 329 | } 330 | 331 | log.info("try correct contour direction with fontforge"); 332 | 333 | fs.renameSync(files.ttf, files.ttfDirectionNotCorrected); 334 | child_process.execFileSync( 335 | path.resolve(__dirname, "../scripts/correct-direction.py"), 336 | [files.ttfDirectionNotCorrected, files.ttf].concat(buildConfig.badGlyphs), 337 | { cwd: process.cwd() } 338 | ); 339 | fs.unlinkSync(files.ttfDirectionNotCorrected); 340 | log.info("write ttf correct direction"); 341 | } 342 | 343 | // generate other font types 344 | var ttfOutput = new Uint8Array(fs.readFileSync(files.ttf)); 345 | var eotOutput = ttf2eot(ttfOutput); 346 | fs.writeFileSync(files.eot, Buffer.from(eotOutput)); 347 | log.info("write eot file"); 348 | 349 | var woffOutput = ttf2woff(ttfOutput); 350 | fs.writeFileSync(files.woff, Buffer.from(woffOutput)); 351 | log.info("write woff file"); 352 | 353 | var woff2Output = ttf2woff2(ttfOutput).buffer; 354 | fs.writeFileSync(files.woff2, Buffer.from(woff2Output)); 355 | log.info("write woff2 file"); 356 | 357 | // Write template files. (generate dynamic and copy static) 358 | _.forEach(TEMPLATES, function (templateData, templateName) { 359 | var outputName = templateName.replace("${FONTNAME}", fontname); 360 | var outputFile = path.join(buildConfig.output, outputName); 361 | var outputData = templateData(buildConfig); 362 | 363 | outputData = outputData 364 | .replace("%WOFF64%", b64.fromByteArray(woffOutput)) 365 | .replace("%TTF64%", b64.fromByteArray(ttfOutput)); 366 | 367 | fs.writeFileSync(outputFile, outputData, "utf8"); 368 | }); 369 | log.info("write demo/css files"); 370 | 371 | var timeEnd = Date.now(); 372 | log.info("Generated in " + (timeEnd - timeStart) / 1000); 373 | } 374 | 375 | module.exports = function build(configFile) { 376 | var configFilePath = path.resolve(configFile); 377 | var config = require(configFilePath); 378 | config.start_codepoint = config.start_codepoint || 0xe800; 379 | 380 | // glyphs dir is relative to config file 381 | var glyphsDir = config.glyphs_dir || process.cwd(); 382 | if (!path.isAbsolute(glyphsDir)) { 383 | glyphsDir = path.join(path.dirname(configFilePath), glyphsDir); 384 | } 385 | 386 | // output dir is relative to config file 387 | var outputDir = config.output; 388 | if (!path.isAbsolute(outputDir)) { 389 | outputDir = path.join(path.dirname(configFilePath), outputDir); 390 | } 391 | config.output = outputDir; 392 | 393 | var glyphs = config.glyphs.map(function (glyph) { 394 | var xml = fs.readFileSync(path.join(glyphsDir, glyph.src), "utf-8"); 395 | 396 | const cleanXml = optimize(xml, { 397 | plugins: [{ 398 | name: 'preset-default', 399 | params: { 400 | // 有些软件生成的 SVG 文件虽然本身写的不太对,但是浏览器里渲染是正常的,转换后会导致各种问题 401 | // https://github.com/svg/svgo/issues?q=convertPathData 402 | convertPathData: false 403 | } 404 | }] 405 | 406 | }); 407 | 408 | if (cleanXml.error) { 409 | log.error(cleanXml.error); 410 | process.exit(1); 411 | } 412 | 413 | return loadSvg(cleanXml.data, glyph, config.start_codepoint); 414 | }); 415 | 416 | var buildConfig = fontConfig( 417 | _.extend({}, config, { 418 | glyphs: glyphs, 419 | }) 420 | ); 421 | 422 | generateFonts(buildConfig); 423 | 424 | return buildConfig; 425 | }; 426 | -------------------------------------------------------------------------------- /src/log.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var winston = require('winston'); 4 | 5 | var logger = winston.createLogger({ 6 | transports: [ 7 | new winston.transports.File({ 8 | name: 'filelog', 9 | filename: 'iconfount.log', 10 | level: 'verbose', 11 | }), 12 | new winston.transports.Console({ 13 | level: 'warn', 14 | }), 15 | ], 16 | }); 17 | 18 | module.exports = logger; 19 | -------------------------------------------------------------------------------- /src/svg/index.js: -------------------------------------------------------------------------------- 1 | module.exports = require('./load'); 2 | -------------------------------------------------------------------------------- /src/svg/load.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Modified from fontello project: https://github.com/fontello/fontello 3 | * 4 | * (The MIT License) 5 | * 6 | * Copyright (C) 2011 by Vitaly Puzrin 7 | * 8 | * Permission is hereby granted, free of charge, to any person obtaining a copy 9 | * of this software and associated documentation files (the "Software"), to deal 10 | * in the Software without restriction, including without limitation the rights 11 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 12 | * copies of the Software, and to permit persons to whom the Software is 13 | * furnished to do so, subject to the following conditions: 14 | * 15 | * The above copyright notice and this permission notice shall be included in 16 | * all copies or substantial portions of the Software. 17 | * 18 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 19 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 20 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 21 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 22 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 23 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 24 | * THE SOFTWARE. 25 | */ 26 | 27 | "use strict" 28 | 29 | var _ = require('lodash'); 30 | var SvgPath = require('svgpath'); 31 | 32 | var log = require('../log'); 33 | var optimizeSvg = require('./optimize'); 34 | 35 | var maxAllocatedCodePoint = -1; 36 | 37 | /** 38 | * Load svg image 39 | * @param {String} data svg text content 40 | * @param {Object} glyph glyph metadata 41 | */ 42 | module.exports = function loadSvgImage(data, glyph, defaultCodePoint) { 43 | var allocatedCode = maxAllocatedCodePoint === -1 ? defaultCodePoint : maxAllocatedCodePoint + 1; 44 | maxAllocatedCodePoint = allocatedCode; 45 | 46 | var result = optimizeSvg(data); 47 | if (result.error) { 48 | log.error(result.error); 49 | return; 50 | } 51 | 52 | // Collect ignored tags and attrs 53 | // We need to have array with unique values because 54 | // some tags and attrs have same names (viewBox, style, glyphRef, title). 55 | var skipped = _.union(result.ignoredTags, result.ignoredAttrs); 56 | 57 | if (skipped.length > 0) { 58 | log.warn(glyph.src, {skipped: skipped.toString()}); 59 | } else if (!result.guaranteed) { 60 | log.warn(glyph.src, 'if image doesn\'t look as expected please convert to compound path manually'); 61 | } 62 | 63 | // Scale to standard grid 64 | var scale = 1000 / result.height; 65 | var d = new SvgPath(result.d) 66 | .translate(-result.x, -result.y) 67 | .scale(scale) 68 | .abs() 69 | .round(1) 70 | .toString(); 71 | var width = Math.round(result.width * scale); // new width 72 | 73 | return _.assign({}, glyph, { 74 | code: allocatedCode, 75 | svg: { 76 | path: d, 77 | width 78 | } 79 | }); 80 | } 81 | -------------------------------------------------------------------------------- /src/svg/optimize.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Modified from fontello project: https://github.com/fontello/fontello 3 | * 4 | * (The MIT License) 5 | * 6 | * Copyright (C) 2011 by Vitaly Puzrin 7 | * 8 | * Permission is hereby granted, free of charge, to any person obtaining a copy 9 | * of this software and associated documentation files (the "Software"), to deal 10 | * in the Software without restriction, including without limitation the rights 11 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 12 | * copies of the Software, and to permit persons to whom the Software is 13 | * furnished to do so, subject to the following conditions: 14 | * 15 | * The above copyright notice and this permission notice shall be included in 16 | * all copies or substantial portions of the Software. 17 | * 18 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 19 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 20 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 21 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 22 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 23 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 24 | * THE SOFTWARE. 25 | */ 26 | 27 | // Cleanup svg to be useful for font generation: apply transforms, merge paths and clear everything else 28 | 29 | 'use strict'; 30 | 31 | var XMLDOMParser = require('@xmldom/xmldom').DOMParser; 32 | var _ = require('lodash'); 33 | var SvgPath = require('svgpath'); 34 | 35 | var quietTags = {}; 36 | var notQuietAtts = {}; 37 | 38 | // Ok to skip this attrs 39 | [ 40 | 'desc', 41 | 'title', 42 | 'metadata', 43 | 'defs' 44 | ].forEach(function (key) { quietTags[key] = true; }); 45 | 46 | // Should warn on this attrs skip 47 | [ 48 | 'requiredFeatures', 49 | 'requiredExtensions', 50 | 'systemLanguage', 51 | 'xml:base', 52 | 'xml:lang', 53 | 'xml:space', 54 | 'onfocusin', 55 | 'onfocusout', 56 | 'onactivate', 57 | 'onclick', 58 | 'onmousedown', 59 | 'onmouseup', 60 | 'onmouseover', 61 | 'onmousemove', 62 | 'onmouseout', 63 | 'onload', 64 | 'alignment-baseline', 65 | 'baseline-shift', 66 | 'clip', 67 | 'clip-path', 68 | 'clip-rule', 69 | 'color', 70 | 'color-interpolation', 71 | 'color-interpolation-filters', 72 | 'color-profile', 73 | 'color-rendering', 74 | 'cursor', 75 | 'direction', 76 | 'display', 77 | 'dominant-baseline', 78 | 'enable-background', 79 | 'fill', 80 | 'fill-opacity', 81 | 'fill-rule', 82 | 'filter', 83 | 'flood-color', 84 | 'flood-opacity', 85 | 'font-family', 86 | 'font-size', 87 | 'font-size-adjust', 88 | 'font-stretch', 89 | 'font-style', 90 | 'font-variant', 91 | 'font-weight', 92 | 'glyph-orientation-horizontal', 93 | 'glyph-orientation-vertical', 94 | 'image-rendering', 95 | 'kerning', 96 | 'letter-spacing', 97 | 'lighting-color', 98 | 'marker-end', 99 | 'marker-mid', 100 | 'marker-start', 101 | 'mask', 102 | 'opacity', 103 | 'overflow', 104 | 'pointer-events', 105 | 'shape-rendering', 106 | 'stop-color', 107 | 'stop-opacity', 108 | 'stroke', 109 | 'stroke-dasharray', 110 | 'stroke-dashoffset', 111 | 'stroke-linecap', 112 | 'stroke-linejoin', 113 | 'stroke-miterlimit', 114 | 'stroke-opacity', 115 | 'stroke-width', 116 | 'text-anchor', 117 | 'text-decoration', 118 | 'text-rendering', 119 | 'unicode-bidi', 120 | 'visibility', 121 | 'word-spacing', 122 | 'writing-mode', 123 | 'class', 124 | 'style', 125 | 'externalResourcesRequired', 126 | 'pathLength', 127 | 'externalResourcesRequired' 128 | ].forEach(function (key) { notQuietAtts[key] = true; }); 129 | 130 | /** 131 | * Removing tags which can't be converted. 132 | * 133 | * @param node 134 | * @param ignoredTags Hash with ignored tags 135 | * @param ignoredAttrs Hash with ignored attributes 136 | * @param parentTransforms Text with parent transforms 137 | * @param path 138 | * @returns {{path: String with contains merged path, ignoredTags: *, ignoredAttrs: *, guaranteed: boolean}} 139 | */ 140 | function processTree(node, ignoredTags, ignoredAttrs, parentTransforms, path) { 141 | var guaranteed = true; 142 | _.each(node.childNodes, function (item) { 143 | // If item not Node - skip node . Example: #text - text node, comments 144 | if (item.nodeType !== 1) { 145 | return; 146 | } 147 | // Quiet ignored tags 148 | if (quietTags[item.nodeName]) { 149 | return; 150 | } 151 | 152 | var transforms = (item.getAttribute('transform')) ? parentTransforms + ' ' + item.getAttribute('transform') : 153 | parentTransforms; 154 | // Parse nested tags 155 | if (item.nodeName === 'g') { 156 | var result = processTree(item, ignoredTags, ignoredAttrs, transforms, path); 157 | path = result.path; 158 | guaranteed = guaranteed && result.guaranteed; 159 | } 160 | 161 | // Get d from supported tag, else return 162 | var d = ''; 163 | switch (item.nodeName) { 164 | case 'path' : 165 | d = item.getAttribute('d'); 166 | break; 167 | case 'g' : 168 | break; 169 | default : 170 | ignoredTags[item.nodeName] = true; 171 | return; 172 | } 173 | 174 | var transformedPath = new SvgPath(d).transform(transforms).toString(); 175 | if (path !== '' && transformedPath !== '') { 176 | guaranteed = false; 177 | } 178 | path += transformedPath; 179 | 180 | // Check not supported attributes 181 | _.each(item.attributes, function (item) { 182 | if (notQuietAtts[item.nodeName]) { 183 | guaranteed = false; 184 | ignoredAttrs[item.nodeName] = true; 185 | } 186 | }); 187 | }); 188 | 189 | return { path, ignoredTags, ignoredAttrs, guaranteed }; 190 | } 191 | 192 | /** 193 | * Returns coordinates for svg 194 | * 195 | * @param svg 196 | * @returns {{x: (string|number), 197 | * y: (string|number), 198 | * width: (string), 199 | * height: (string)}} 200 | */ 201 | function getCoordinates(svg) { 202 | // getting viewBox values array 203 | var viewBoxAttr = svg.getAttribute('viewBox'); 204 | var viewBox = _.map( 205 | (viewBoxAttr || '').split(/(?: *, *| +)/g), 206 | function (val) { 207 | return parseFloat(val); 208 | } 209 | ); 210 | 211 | // If viewBox attr has less than 4 digits it's incorrect 212 | if (viewBoxAttr && viewBox.length < 4) { 213 | return { 214 | error : new Error('Svg viewbox attr has less than 4 params') 215 | }; 216 | } 217 | 218 | // getting base parameters 219 | var attr = {}; 220 | _.forEach([ 'x', 'y', 'width', 'height' ], function (key) { 221 | var val = svg.getAttribute(key); 222 | 223 | // TODO: remove and do properly 224 | // Quick hack - ignore values in %. There can be strange cases like 225 | // `width="100%" height="100%" viewbox="0 0 1000 1000"` 226 | if (val.length && val[val.length - 1] !== '%') { 227 | attr[key] = parseFloat(svg.getAttribute(key)); 228 | } 229 | }); 230 | 231 | if (viewBox[2] < 0 || viewBox[3] < 0 || attr.width < 0 || attr.height < 0) { 232 | return { 233 | error : new Error('Svg sizes can`t be negative') 234 | }; 235 | } 236 | 237 | var result = { 238 | x: attr.x || 0, 239 | y: attr.y || 0, 240 | width: attr.width, 241 | height: attr.height, 242 | error: null 243 | }; 244 | 245 | if (!viewBoxAttr) { 246 | // Only svg width & height attrs are set 247 | if (result.width && result.height) { 248 | return result; 249 | } 250 | 251 | // viewBox not set and attrs not set 252 | result.error = new Error('Not implemented yet. There is no width or height'); 253 | // TODO: Need calculate BBox 254 | return result; 255 | } 256 | 257 | /*if ( (result.x !== 0 && viewBox[0] !== 0 && result.x !== viewBox[0]) ) { 258 | result.error = new Error('Not implemented yet. Svg attr x not equals viewbox x'); 259 | // TODO: Need transform 260 | return result; 261 | } 262 | if ( (result.y !== 0 && viewBox[1] !== 0 && result.y !== viewBox[1]) ) { 263 | result.error = new Error('Not implemented yet. Svg attr y not equals viewbox y'); 264 | // TODO: Need transform 265 | return result; 266 | }*/ 267 | 268 | /*if (viewBox[0]) { result.x = viewBox[0]; } 269 | if (viewBox[1]) { result.y = viewBox[1]; }*/ 270 | 271 | // viewBox is set and attrs not set 272 | if (!result.width && !result.height) { 273 | result.width = viewBox[2]; 274 | result.height = viewBox[3]; 275 | return result; 276 | } 277 | 278 | return result; 279 | 280 | /*// viewBox and attrs are set and values on width and height are equals 281 | if (viewBox[2] === result.width && viewBox[3] === result.height) { 282 | return result; 283 | } 284 | 285 | // viewBox is set and one attr not set 286 | if (!result.width || !result.height) { 287 | result.error = new Error('Not implemented yet. Width and height must be set'); 288 | // TODO: Implement BBox. If width or height is setthan implement transform 289 | return result; 290 | } 291 | 292 | // viewBox and attrs are set, but have different sizes. Need to transform image 293 | result.error = new Error('Not implemented yet. Svg viewbox sizes are different with svg sizes'); 294 | // TODO: Implement transform 295 | return result;*/ 296 | } 297 | /** 298 | * 299 | * 300 | * @param xml 301 | * @returns {{d: "", width: number, height: number, x: number, y: number, ignoredTagsTags: Array, 302 | * ignoredAttrs: Array, error: null, guaranteed: boolean}} 303 | */ 304 | module.exports = function optimizeSvg(sourceXml) { 305 | var error = null; 306 | var result = { 307 | d: '', 308 | width: 0, 309 | height: 0, 310 | x: 0, 311 | y: 0, 312 | ignoredTags: [], 313 | ignoredAttrs: [], 314 | error, 315 | guaranteed: false 316 | }; 317 | 318 | var xmlDoc = (new XMLDOMParser({ 319 | errorHandler: { 320 | error(err) { 321 | error = err; 322 | }, 323 | fatalError(err) { 324 | error = err; 325 | } 326 | } 327 | })).parseFromString(sourceXml, 'application/xml'); 328 | 329 | if (error) { 330 | result.error = error; 331 | return result; 332 | } 333 | 334 | var svg = xmlDoc.getElementsByTagName('svg')[0]; 335 | 336 | var processed = processTree(svg, {}, {}, '', ''); 337 | 338 | var coords = getCoordinates(svg); 339 | 340 | if (coords.error) { 341 | result.error = coords.error; 342 | return result; 343 | } 344 | 345 | result.d = processed.path; 346 | result.width = coords.width; 347 | result.height = coords.height; 348 | result.x = coords.x; 349 | result.y = coords.y; 350 | result.guaranteed = processed.guaranteed; 351 | result.ignoredTags = _.keys(processed.ignoredTags); 352 | result.ignoredAttrs = _.keys(processed.ignoredAttrs); 353 | return result; 354 | }; 355 | -------------------------------------------------------------------------------- /src/validate-config.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var Ajv = require('ajv'); 4 | var path = require('path'); 5 | 6 | var schema = require('./config-schema'); 7 | 8 | var ajv = new Ajv({allErrors: true}); 9 | var validate = ajv.compile(schema); 10 | 11 | module.exports = function testConfig(configFile) { 12 | var data = require(path.resolve(configFile)); 13 | var valid = validate(data); 14 | if (!valid) { 15 | return ajv.errorsText(validate.errors); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /templates/LICENSE.pug: -------------------------------------------------------------------------------- 1 | | Font license info 2 | != '\n\n\n' 3 | 4 | | ## #{font.fullname} 5 | != '\n\n' 6 | | #{font.copyright} 7 | != '\n\n' 8 | | Author: #{meta.author} 9 | | License: #{meta.license} (#{meta.license_url}) 10 | | Homepage: #{meta.homepage} 11 | != '\n\n\n' 12 | -------------------------------------------------------------------------------- /templates/README.txt: -------------------------------------------------------------------------------- 1 | This webfont is generated by iconfount. 2 | 3 | 4 | ================================================================================ 5 | Please, note, that you should obey original font licenses, used to make this 6 | webfont pack. Details available in LICENSE.txt file. 7 | 8 | - Usually, it's enough to publish content of LICENSE.txt file somewhere on your 9 | site in "About" section. 10 | 11 | - If your project is open-source, usually, it will be ok to make LICENSE.txt 12 | file publicly available in your repository. 13 | 14 | - Fonts, used in iconfount, don't require a clickable link on your site. 15 | But any kind of additional authors crediting is welcome. 16 | ================================================================================ 17 | 18 | 19 | Comments on output content 20 | --------------------------- 21 | 22 | - /font/* - fonts in different formats 23 | 24 | - /css/* - different kinds of css, for all situations. Should be ok with 25 | twitter bootstrap. Also, you can skip style and assign icon classes 26 | directly to text elements, if you don't mind about IE7. 27 | 28 | - demo.html - demo file, to show your webfont content 29 | 30 | - LICENSE.txt - license info about source fonts, used to build your one. 31 | 32 | - config.json - for debugging only 33 | 34 | 35 | Why so many CSS files ? 36 | ----------------------- 37 | 38 | Because we like to fit all your needs :) 39 | 40 | - basic file, .css - is usually enough, it contains @font-face 41 | and character code definitions 42 | 43 | - *-ie7.css - if you need IE7 support, but still don't wish to put char codes 44 | directly into html 45 | 46 | - *-codes.css and *-ie7-codes.css - if you like to use your own @font-face 47 | rules, but still wish to benefit from css generation. That can be very 48 | convenient for automated asset build systems. When you need to update font - 49 | no need to manually edit files, just override old version with archive 50 | content. 51 | 52 | - *-embedded.css - basic css file, but with embedded WOFF font, to avoid 53 | CORS issues in Firefox and IE9+, when fonts are hosted on the separate domain. 54 | We strongly recommend to resolve this issue by `Access-Control-Allow-Origin` 55 | server headers. But if you ok with dirty hack - this file is for you. Note, 56 | that data url moved to separate @font-face to avoid problems with 0xffff) { code -= 0x10000; surrogate1 = 0xd800 + (code >> 10); surrogate2 = 0xdc00 + (code & 0x3ff); return String.fromCharCode(surrogate1, surrogate2); } else { return String.fromCharCode(code); } } 13 | 14 | - var i, g, css, hex, chr 15 | - for (i in glyphs) 16 | - g = glyphs[i] 17 | - css = meta.css_use_suffix ? g.css + meta.css_prefix_text : meta.css_prefix_text + g.css 18 | - hex = '\\' + g.code.toString(16) 19 | - chr = unichr(g.code) 20 | != '\n' 21 | - if (0xffff < g.code) 22 | | .#{css}:before { content: '#{chr}'; } /* '#{hex}' */ 23 | - else 24 | | .#{css}:before { content: '#{hex}'; } /* '#{chr}' */ 25 | -------------------------------------------------------------------------------- /templates/css/css-embedded.pug: -------------------------------------------------------------------------------- 1 | | /* DO NOT EDIT! Generated by iconfount */ 2 | != '\n' 3 | != '\n' 4 | - var need_charset = false; 5 | - glyphs.forEach(function(g) { if (0xffff < g.code) { need_charset = true; } }) 6 | - if (need_charset) 7 | | @charset "UTF-8"; 8 | != '\n' 9 | != '\n' 10 | | 11 | 12 | | @font-face { 13 | | font-family: '#{font.fontname}'; 14 | | src: url('../font/#{font.fontname}#{meta.filename_hash}.eot'); 15 | | src: url('../font/#{font.fontname}#{meta.filename_hash}.eot?#iefix') format('embedded-opentype'), 16 | | url('../font/#{font.fontname}#{meta.filename_hash}.svg?##{font.fontname}') format('svg'); 17 | | font-weight: normal; 18 | | font-style: normal; 19 | | } 20 | | @font-face { 21 | | font-family: '#{font.fontname}'; 22 | | src: url('data:application/octet-stream;base64,%WOFF64%') format('woff'), 23 | | url('data:application/octet-stream;base64,%TTF64%') format('truetype'); 24 | | } 25 | | /* Chrome hack: SVG is rendered more smooth in Windozze. 100% magic, uncomment if you need it. */ 26 | | /* Note, that will break hinting! In other OS-es font will be not as sharp as it could be */ 27 | | /* 28 | | @media screen and (-webkit-min-device-pixel-ratio:0) { 29 | | @font-face { 30 | | font-family: '#{font.fontname}'; 31 | | src: url('../font/#{font.fontname}#{meta.filename_hash}.svg?##{font.fontname}') format('svg'); 32 | | } 33 | | } 34 | | */ 35 | | 36 | | 37 | - if (!meta.css_use_suffix) 38 | | [class^="#{meta.css_prefix_text}"]:before, [class*=" #{meta.css_prefix_text}"]:before 39 | - else 40 | | [class$="#{meta.css_prefix_text}"]:before, [class*="#{meta.css_prefix_text} "]:before 41 | 42 | | { 43 | | font-family: "#{font.fontname}" !important; 44 | | font-style: normal; 45 | | font-weight: normal; 46 | | speak: none; 47 | | 48 | | display: inline-block; 49 | | text-decoration: inherit; 50 | | width: 1em; 51 | | /* margin-right: .2em; */ 52 | | text-align: center; 53 | | /* opacity: .8; */ 54 | | 55 | | /* For safety - reset parent styles, that can break glyph codes*/ 56 | | font-variant: normal; 57 | | text-transform: none; 58 | | 59 | | /* fix buttons height, for twitter bootstrap */ 60 | | line-height: 1em; 61 | | 62 | | /* Animation center compensation - margins should be symmetric */ 63 | | /* remove if not needed */ 64 | | /* margin-left: .2em; */ 65 | | 66 | | /* you can be more comfortable with increased icons size */ 67 | | /* font-size: 120%; */ 68 | | 69 | | /* Uncomment for 3D effect */ 70 | | /* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */ 71 | | } 72 | 73 | - var unichr = function unichr(code) { if (code > 0xffff) { code -= 0x10000; surrogate1 = 0xd800 + (code >> 10); surrogate2 = 0xdc00 + (code & 0x3ff); return String.fromCharCode(surrogate1, surrogate2); } else { return String.fromCharCode(code); } } 74 | 75 | - var i, g, css, hex, chr 76 | - for (i in glyphs) 77 | - g = glyphs[i] 78 | - css = meta.css_use_suffix ? g.css + meta.css_prefix_text : meta.css_prefix_text + g.css 79 | - hex = '\\' + g.code.toString(16) 80 | - chr = unichr(g.code) 81 | != '\n' 82 | - if (0xffff < g.code) 83 | | .#{css}:before { content: '#{chr}'; } /* '#{hex}' */ 84 | - else 85 | | .#{css}:before { content: '#{hex}'; } /* '#{chr}' */ 86 | -------------------------------------------------------------------------------- /templates/css/css-ie7-codes.pug: -------------------------------------------------------------------------------- 1 | | /* DO NOT EDIT! Generated by iconfount */ 2 | != '\n' 3 | != '\n' 4 | - var unichr = function unichr(code) { if (code > 0xffff) { code -= 0x10000; surrogate1 = 0xd800 + (code >> 10); surrogate2 = 0xdc00 + (code & 0x3ff); return String.fromCharCode(surrogate1, surrogate2); } else { return String.fromCharCode(code); } } 5 | 6 | - var i, g, css, hex, chr 7 | - for (i in glyphs) 8 | - g = glyphs[i] 9 | - css = meta.css_use_suffix ? g.css + meta.css_prefix_text : meta.css_prefix_text + g.css 10 | - hex = g.code.toString(16) 11 | - chr = unichr(g.code) 12 | != '\n' 13 | | .#{css} { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#x#{hex}; '); } 14 | -------------------------------------------------------------------------------- /templates/css/css-ie7.pug: -------------------------------------------------------------------------------- 1 | | /* DO NOT EDIT! Generated by iconfount */ 2 | != '\n' 3 | != '\n' 4 | - if (!meta.css_use_suffix) 5 | | [class^="#{meta.css_prefix_text}"], [class*=" #{meta.css_prefix_text}"] 6 | - else 7 | | [class$="#{meta.css_prefix_text}"], [class*="#{meta.css_prefix_text} "] 8 | 9 | | { 10 | | font-family: '#{font.fontname}' !important; 11 | | font-style: normal; 12 | | font-weight: normal; 13 | | 14 | | /* fix buttons height */ 15 | | line-height: 1em; 16 | | 17 | | /* you can be more comfortable with increased icons size */ 18 | | /* font-size: 120%; */ 19 | | } 20 | | 21 | 22 | - var unichr = function unichr(code) { if (code > 0xffff) { code -= 0x10000; surrogate1 = 0xd800 + (code >> 10); surrogate2 = 0xdc00 + (code & 0x3ff); return String.fromCharCode(surrogate1, surrogate2); } else { return String.fromCharCode(code); } } 23 | 24 | - var i, g, css, hex, chr 25 | - for (i in glyphs) 26 | - g = glyphs[i] 27 | - css = meta.css_use_suffix ? g.css + meta.css_prefix_text : meta.css_prefix_text + g.css 28 | - hex = g.code.toString(16) 29 | - chr = unichr(g.code) 30 | != '\n' 31 | | .#{css} { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#x#{hex}; '); } 32 | -------------------------------------------------------------------------------- /templates/css/css.pug: -------------------------------------------------------------------------------- 1 | | /* DO NOT EDIT! Generated by iconfount */ 2 | != '\n' 3 | != '\n' 4 | - var need_charset = false; 5 | - glyphs.forEach(function(g) { if (0xffff < g.code) { need_charset = true; } }) 6 | - if (need_charset) 7 | | @charset "UTF-8"; 8 | != '\n' 9 | != '\n' 10 | | 11 | 12 | | @font-face { 13 | | font-family: '#{font.fontname}'; 14 | | src: url('../font/#{font.fontname}#{meta.filename_hash}.eot'); 15 | | src: url('../font/#{font.fontname}#{meta.filename_hash}.eot?#iefix') format('embedded-opentype'), 16 | | url('../font/#{font.fontname}#{meta.filename_hash}.woff2') format('woff2'), 17 | | url('../font/#{font.fontname}#{meta.filename_hash}.woff') format('woff'), 18 | | url('../font/#{font.fontname}#{meta.filename_hash}.ttf') format('truetype'), 19 | | url('../font/#{font.fontname}#{meta.filename_hash}.svg?##{font.fontname}') format('svg'); 20 | | font-weight: normal; 21 | | font-style: normal; 22 | | } 23 | | /* Chrome hack: SVG is rendered more smooth in Windozze. 100% magic, uncomment if you need it. */ 24 | | /* Note, that will break hinting! In other OS-es font will be not as sharp as it could be */ 25 | | /* 26 | | @media screen and (-webkit-min-device-pixel-ratio:0) { 27 | | @font-face { 28 | | font-family: '#{font.fontname}'; 29 | | src: url('../font/#{font.fontname}#{meta.filename_hash}.svg?##{font.fontname}') format('svg'); 30 | | } 31 | | } 32 | | */ 33 | | 34 | | 35 | - if (!meta.css_use_suffix) 36 | |[class^="#{meta.css_prefix_text}"]:before, [class*=" #{meta.css_prefix_text}"]:before 37 | - else 38 | |[class$="#{meta.css_prefix_text}"]:before, [class*="#{meta.css_prefix_text} "]:before 39 | 40 | | { 41 | | font-family: "#{font.fontname}" !important; 42 | | font-style: normal; 43 | | font-weight: normal; 44 | | speak: none; 45 | | 46 | | display: inline-block; 47 | | text-decoration: inherit; 48 | | width: 1em; 49 | | text-align: center; 50 | | /* margin-right: .2em; */ 51 | | /* opacity: .8; */ 52 | | 53 | | /* For safety - reset parent styles, that can break glyph codes*/ 54 | | font-variant: normal; 55 | | text-transform: none; 56 | | 57 | | /* fix buttons height, for twitter bootstrap */ 58 | | line-height: 1em; 59 | | 60 | | /* Animation center compensation - margins should be symmetric */ 61 | | /* remove if not needed */ 62 | | /* margin-left: .2em; */ 63 | | 64 | | /* you can be more comfortable with increased icons size */ 65 | | /* font-size: 120%; */ 66 | | 67 | | /* Font smoothing. That was taken from TWBS */ 68 | | -webkit-font-smoothing: antialiased; 69 | | -moz-osx-font-smoothing: grayscale; 70 | | 71 | | /* Uncomment for 3D effect */ 72 | | /* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */ 73 | | } 74 | | 75 | 76 | - var unichr = function unichr(code) { if (code > 0xffff) { code -= 0x10000; surrogate1 = 0xd800 + (code >> 10); surrogate2 = 0xdc00 + (code & 0x3ff); return String.fromCharCode(surrogate1, surrogate2); } else { return String.fromCharCode(code); } } 77 | 78 | - var i, g, css, hex, chr 79 | - for (i in glyphs) 80 | - g = glyphs[i] 81 | - css = meta.css_use_suffix ? g.css + meta.css_prefix_text : meta.css_prefix_text + g.css 82 | - hex = '\\' + g.code.toString(16) 83 | - chr = unichr(g.code) 84 | != '\n' 85 | - if (0xffff < g.code) 86 | | .#{css}:before { content: '#{chr}'; } /* '#{hex}' */ 87 | - else 88 | | .#{css}:before { content: '#{hex}'; } /* '#{chr}' */ 89 | -------------------------------------------------------------------------------- /templates/demo.pug: -------------------------------------------------------------------------------- 1 | doctype html 2 | html 3 | head 4 | 5 | 6 | meta(charset='UTF-8') 7 | 8 | != '' 56 | 57 | link(rel='stylesheet', href=`css/${font.fontname}.css`) 58 | link(rel='stylesheet', href='css/animation.css') 59 | 60 | 61 | script. 62 | function toggleCodes(on) { 63 | var obj = document.getElementById('icons'); 64 | 65 | if (on) { 66 | obj.className += ' codesOn'; 67 | } else { 68 | obj.className = obj.className.replace(' codesOn', ''); 69 | } 70 | } 71 | 72 | body 73 | .container.header 74 | h1 #{font.fullname} 75 | | 76 | small font demo 77 | label.switch 78 | input(type='checkbox', onclick='toggleCodes(this.checked)') 79 | | show codes 80 | 81 | #icons.container 82 | - var col_class = "span" + Math.ceil(12 / meta.columns) 83 | - var rows_total = Math.ceil(glyphs.length / meta.columns) 84 | - for (var row = 0; row < rows_total; row++) 85 | 86 | .row 87 | - for (var col = 0; col < meta.columns && glyphs[row*meta.columns + col]; col++) 88 | 89 | - var g = glyphs[row*meta.columns + col] 90 | 91 | - var css_class = css_name = meta.css_use_suffix ? (g.css || g.file) + meta.css_prefix_text : meta.css_prefix_text + (g.css || g.file) 92 | 93 | - if (g['css-ext']) css_class += ' ' + g['css-ext'] 94 | 95 | - var code = g.code.toString(16) 96 | .the-icons(class=col_class, title=`${css_name}(0x${code})`) 97 | i( 98 | class='demo-icon' 99 | class=css_class 100 | ) 101 | | 102 | span.i-name #{css_name} 103 | span.i-code 0x#{code} 104 | 105 | .container.footer 106 | | This demo page requires IE >= 8, but the icons should work on IE 6 and 7. 107 | |
108 | | Generated by iconfount 109 | -------------------------------------------------------------------------------- /templates/font/svg.tpl: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | ${font.copyright} 5 | 6 | 7 | 8 | <% glyphs.forEach(function(glyph) { %> 9 | 10 | <% }); %> 11 | 12 | 13 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@babel/helper-validator-identifier@^7.12.11": 6 | version "7.12.11" 7 | resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz#c9a1f021917dcb5ccf0d4e453e399022981fc9ed" 8 | integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw== 9 | 10 | "@babel/parser@^7.6.0", "@babel/parser@^7.9.6": 11 | version "7.13.15" 12 | resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.13.15.tgz#8e66775fb523599acb6a289e12929fa5ab0954d8" 13 | integrity sha512-b9COtcAlVEQljy/9fbcMHpG+UIW9ReF+gpaxDHTlZd0c6/UU9ng8zdySAW9sRTzpvcdCHn6bUcbuYUgGzLAWVQ== 14 | 15 | "@babel/types@^7.6.1", "@babel/types@^7.9.6": 16 | version "7.13.14" 17 | resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.13.14.tgz#c35a4abb15c7cd45a2746d78ab328e362cbace0d" 18 | integrity sha512-A2aa3QTkWoyqsZZFl56MLUsfmh7O0gN41IPvXAE/++8ojpbz12SszD7JEGYVdn4f9Kt4amIei07swF1h4AqmmQ== 19 | dependencies: 20 | "@babel/helper-validator-identifier" "^7.12.11" 21 | lodash "^4.17.19" 22 | to-fast-properties "^2.0.0" 23 | 24 | "@dabh/diagnostics@^2.0.2": 25 | version "2.0.2" 26 | resolved "https://registry.yarnpkg.com/@dabh/diagnostics/-/diagnostics-2.0.2.tgz#290d08f7b381b8f94607dc8f471a12c675f9db31" 27 | integrity sha512-+A1YivoVDNNVCdfozHSR8v/jyuuLTMXwjWuxPFlFlUapXoGc+Gj9mDlTDDfrwl7rXCl2tNZ0kE8sIBO6YOn96Q== 28 | dependencies: 29 | colorspace "1.1.x" 30 | enabled "2.0.x" 31 | kuler "^2.0.0" 32 | 33 | "@npmcli/move-file@^1.0.1": 34 | version "1.1.2" 35 | resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-1.1.2.tgz#1a82c3e372f7cae9253eb66d72543d6b8685c674" 36 | integrity sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg== 37 | dependencies: 38 | mkdirp "^1.0.4" 39 | rimraf "^3.0.2" 40 | 41 | "@tootallnate/once@1": 42 | version "1.1.2" 43 | resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" 44 | integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== 45 | 46 | "@trysound/sax@0.1.1": 47 | version "0.1.1" 48 | resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.1.1.tgz#3348564048e7a2d7398c935d466c0414ebb6a669" 49 | integrity sha512-Z6DoceYb/1xSg5+e+ZlPZ9v0N16ZvZ+wYMraFue4HYrE4ttONKtsvruIRf6t9TBR0YvSOfi1hUU0fJfBLCDYow== 50 | 51 | "@xmldom/xmldom@^0.7.2", "@xmldom/xmldom@^0.7.3": 52 | version "0.7.3" 53 | resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.7.3.tgz#55de695f77afd3cc0e5bee0aa900040bc63c0f63" 54 | integrity sha512-8XmJdPut2XGtfFcsNsqEsvMUmAwk7xLq7m+E/GcsU9b5qyFFIsiX4Fvnb5UoQ4wo12Wlm07YFJERoyWUYdbIpw== 55 | 56 | abbrev@1: 57 | version "1.1.1" 58 | resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" 59 | integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== 60 | 61 | acorn@^7.1.1: 62 | version "7.4.1" 63 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" 64 | integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== 65 | 66 | agent-base@6, agent-base@^6.0.2: 67 | version "6.0.2" 68 | resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" 69 | integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== 70 | dependencies: 71 | debug "4" 72 | 73 | agentkeepalive@^4.1.3: 74 | version "4.1.4" 75 | resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.1.4.tgz#d928028a4862cb11718e55227872e842a44c945b" 76 | integrity sha512-+V/rGa3EuU74H6wR04plBb7Ks10FbtUQgRj/FQOG7uUIEuaINI+AiqJR1k6t3SVNs7o7ZjIdus6706qqzVq8jQ== 77 | dependencies: 78 | debug "^4.1.0" 79 | depd "^1.1.2" 80 | humanize-ms "^1.2.1" 81 | 82 | aggregate-error@^3.0.0: 83 | version "3.1.0" 84 | resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" 85 | integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== 86 | dependencies: 87 | clean-stack "^2.0.0" 88 | indent-string "^4.0.0" 89 | 90 | ajv@^8.6.2: 91 | version "8.6.2" 92 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.6.2.tgz#2fb45e0e5fcbc0813326c1c3da535d1881bb0571" 93 | integrity sha512-9807RlWAgT564wT+DjeyU5OFMPjmzxVobvDFmNAhY+5zD6A2ly3jDp6sgnfyDtlIQ+7H97oc/DGCzzfu9rjw9w== 94 | dependencies: 95 | fast-deep-equal "^3.1.1" 96 | json-schema-traverse "^1.0.0" 97 | require-from-string "^2.0.2" 98 | uri-js "^4.2.2" 99 | 100 | ansi-regex@^2.0.0: 101 | version "2.1.1" 102 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 103 | integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= 104 | 105 | ansi-regex@^3.0.0: 106 | version "3.0.0" 107 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" 108 | integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= 109 | 110 | ansi-regex@^5.0.0: 111 | version "5.0.0" 112 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" 113 | integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== 114 | 115 | ansi-styles@^4.0.0: 116 | version "4.3.0" 117 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 118 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 119 | dependencies: 120 | color-convert "^2.0.1" 121 | 122 | aproba@^1.0.3: 123 | version "1.2.0" 124 | resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" 125 | integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== 126 | 127 | are-we-there-yet@~1.1.2: 128 | version "1.1.5" 129 | resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" 130 | integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== 131 | dependencies: 132 | delegates "^1.0.0" 133 | readable-stream "^2.0.6" 134 | 135 | argparse@^2.0.1: 136 | version "2.0.1" 137 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" 138 | integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== 139 | 140 | asap@~2.0.3: 141 | version "2.0.6" 142 | resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" 143 | integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= 144 | 145 | assert-never@^1.2.1: 146 | version "1.2.1" 147 | resolved "https://registry.yarnpkg.com/assert-never/-/assert-never-1.2.1.tgz#11f0e363bf146205fb08193b5c7b90f4d1cf44fe" 148 | integrity sha512-TaTivMB6pYI1kXwrFlEhLeGfOqoDNdTxjCdwRfFFkEA30Eu+k48W34nlok2EYWJfFFzqaEmichdNM7th6M5HNw== 149 | 150 | async@^3.1.0: 151 | version "3.2.0" 152 | resolved "https://registry.yarnpkg.com/async/-/async-3.2.0.tgz#b3a2685c5ebb641d3de02d161002c60fc9f85720" 153 | integrity sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw== 154 | 155 | atob@^2.1.2: 156 | version "2.1.2" 157 | resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" 158 | integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== 159 | 160 | babel-walk@3.0.0-canary-5: 161 | version "3.0.0-canary-5" 162 | resolved "https://registry.yarnpkg.com/babel-walk/-/babel-walk-3.0.0-canary-5.tgz#f66ecd7298357aee44955f235a6ef54219104b11" 163 | integrity sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw== 164 | dependencies: 165 | "@babel/types" "^7.9.6" 166 | 167 | balanced-match@^1.0.0: 168 | version "1.0.0" 169 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 170 | integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= 171 | 172 | base64-js@^1.3.1: 173 | version "1.5.1" 174 | resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" 175 | integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== 176 | 177 | bindings@^1.5.0: 178 | version "1.5.0" 179 | resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" 180 | integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== 181 | dependencies: 182 | file-uri-to-path "1.0.0" 183 | 184 | boolbase@^1.0.0: 185 | version "1.0.0" 186 | resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" 187 | integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= 188 | 189 | brace-expansion@^1.1.7: 190 | version "1.1.11" 191 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 192 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 193 | dependencies: 194 | balanced-match "^1.0.0" 195 | concat-map "0.0.1" 196 | 197 | bufferstreams@^3.0.0: 198 | version "3.0.0" 199 | resolved "https://registry.yarnpkg.com/bufferstreams/-/bufferstreams-3.0.0.tgz#d2cb186cffeb527668341891e523c19539bc4a14" 200 | integrity sha512-Qg0ggJUWJq90vtg4lDsGN9CDWvzBMQxhiEkSOD/sJfYt6BLect3eV1/S6K7SCSKJ34n60rf6U5eUPmQENVE4UA== 201 | dependencies: 202 | readable-stream "^3.4.0" 203 | 204 | cacache@^15.0.5: 205 | version "15.2.0" 206 | resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.2.0.tgz#73af75f77c58e72d8c630a7a2858cb18ef523389" 207 | integrity sha512-uKoJSHmnrqXgthDFx/IU6ED/5xd+NNGe+Bb+kLZy7Ku4P+BaiWEUflAKPZ7eAzsYGcsAGASJZsybXp+quEcHTw== 208 | dependencies: 209 | "@npmcli/move-file" "^1.0.1" 210 | chownr "^2.0.0" 211 | fs-minipass "^2.0.0" 212 | glob "^7.1.4" 213 | infer-owner "^1.0.4" 214 | lru-cache "^6.0.0" 215 | minipass "^3.1.1" 216 | minipass-collect "^1.0.2" 217 | minipass-flush "^1.0.5" 218 | minipass-pipeline "^1.2.2" 219 | mkdirp "^1.0.3" 220 | p-map "^4.0.0" 221 | promise-inflight "^1.0.1" 222 | rimraf "^3.0.2" 223 | ssri "^8.0.1" 224 | tar "^6.0.2" 225 | unique-filename "^1.1.1" 226 | 227 | call-bind@^1.0.2: 228 | version "1.0.2" 229 | resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" 230 | integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== 231 | dependencies: 232 | function-bind "^1.1.1" 233 | get-intrinsic "^1.0.2" 234 | 235 | character-parser@^2.2.0: 236 | version "2.2.0" 237 | resolved "https://registry.yarnpkg.com/character-parser/-/character-parser-2.2.0.tgz#c7ce28f36d4bcd9744e5ffc2c5fcde1c73261fc0" 238 | integrity sha1-x84o821LzZdE5f/CxfzeHHMmH8A= 239 | dependencies: 240 | is-regex "^1.0.3" 241 | 242 | chownr@^2.0.0: 243 | version "2.0.0" 244 | resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" 245 | integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== 246 | 247 | clean-stack@^2.0.0: 248 | version "2.2.0" 249 | resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" 250 | integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== 251 | 252 | cliui@^7.0.2: 253 | version "7.0.4" 254 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" 255 | integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== 256 | dependencies: 257 | string-width "^4.2.0" 258 | strip-ansi "^6.0.0" 259 | wrap-ansi "^7.0.0" 260 | 261 | clone@^2.0.0: 262 | version "2.1.2" 263 | resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" 264 | integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18= 265 | 266 | code-point-at@^1.0.0: 267 | version "1.1.0" 268 | resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" 269 | integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= 270 | 271 | color-convert@^1.9.1: 272 | version "1.9.3" 273 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 274 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 275 | dependencies: 276 | color-name "1.1.3" 277 | 278 | color-convert@^2.0.1: 279 | version "2.0.1" 280 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 281 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 282 | dependencies: 283 | color-name "~1.1.4" 284 | 285 | color-name@1.1.3: 286 | version "1.1.3" 287 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 288 | integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= 289 | 290 | color-name@^1.0.0, color-name@~1.1.4: 291 | version "1.1.4" 292 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 293 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 294 | 295 | color-string@^1.5.2: 296 | version "1.6.0" 297 | resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.6.0.tgz#c3915f61fe267672cb7e1e064c9d692219f6c312" 298 | integrity sha512-c/hGS+kRWJutUBEngKKmk4iH3sD59MBkoxVapS/0wgpCz2u7XsNloxknyvBhzwEs1IbV36D9PwqLPJ2DTu3vMA== 299 | dependencies: 300 | color-name "^1.0.0" 301 | simple-swizzle "^0.2.2" 302 | 303 | color@3.0.x: 304 | version "3.0.0" 305 | resolved "https://registry.yarnpkg.com/color/-/color-3.0.0.tgz#d920b4328d534a3ac8295d68f7bd4ba6c427be9a" 306 | integrity sha512-jCpd5+s0s0t7p3pHQKpnJ0TpQKKdleP71LWcA0aqiljpiuAkOSUFN/dyH8ZwF0hRmFlrIuRhufds1QyEP9EB+w== 307 | dependencies: 308 | color-convert "^1.9.1" 309 | color-string "^1.5.2" 310 | 311 | colorette@^1.3.0: 312 | version "1.3.0" 313 | resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.3.0.tgz#ff45d2f0edb244069d3b772adeb04fed38d0a0af" 314 | integrity sha512-ecORCqbSFP7Wm8Y6lyqMJjexBQqXSF7SSeaTyGGphogUjBlFP9m9o08wy86HL2uB7fMTxtOUzLMk7ogKcxMg1w== 315 | 316 | colors@^1.2.1: 317 | version "1.4.0" 318 | resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" 319 | integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== 320 | 321 | colorspace@1.1.x: 322 | version "1.1.2" 323 | resolved "https://registry.yarnpkg.com/colorspace/-/colorspace-1.1.2.tgz#e0128950d082b86a2168580796a0aa5d6c68d8c5" 324 | integrity sha512-vt+OoIP2d76xLhjwbBaucYlNSpPsrJWPlBTtwCpQKIu6/CSMutyzX93O/Do0qzpH3YoHEes8YEFXyZ797rEhzQ== 325 | dependencies: 326 | color "3.0.x" 327 | text-hex "1.0.x" 328 | 329 | commander@^7.2.0: 330 | version "7.2.0" 331 | resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" 332 | integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== 333 | 334 | concat-map@0.0.1: 335 | version "0.0.1" 336 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 337 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 338 | 339 | console-control-strings@^1.0.0, console-control-strings@~1.1.0: 340 | version "1.1.0" 341 | resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" 342 | integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= 343 | 344 | constantinople@^4.0.1: 345 | version "4.0.1" 346 | resolved "https://registry.yarnpkg.com/constantinople/-/constantinople-4.0.1.tgz#0def113fa0e4dc8de83331a5cf79c8b325213151" 347 | integrity sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw== 348 | dependencies: 349 | "@babel/parser" "^7.6.0" 350 | "@babel/types" "^7.6.1" 351 | 352 | core-util-is@~1.0.0: 353 | version "1.0.2" 354 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 355 | integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= 356 | 357 | css-parse@~2.0.0: 358 | version "2.0.0" 359 | resolved "https://registry.yarnpkg.com/css-parse/-/css-parse-2.0.0.tgz#a468ee667c16d81ccf05c58c38d2a97c780dbfd4" 360 | integrity sha1-pGjuZnwW2BzPBcWMONKpfHgNv9Q= 361 | dependencies: 362 | css "^2.0.0" 363 | 364 | css-select@^4.1.3: 365 | version "4.1.3" 366 | resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.1.3.tgz#a70440f70317f2669118ad74ff105e65849c7067" 367 | integrity sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA== 368 | dependencies: 369 | boolbase "^1.0.0" 370 | css-what "^5.0.0" 371 | domhandler "^4.2.0" 372 | domutils "^2.6.0" 373 | nth-check "^2.0.0" 374 | 375 | css-tree@^1.1.2, css-tree@^1.1.3: 376 | version "1.1.3" 377 | resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" 378 | integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== 379 | dependencies: 380 | mdn-data "2.0.14" 381 | source-map "^0.6.1" 382 | 383 | css-what@^5.0.0: 384 | version "5.0.1" 385 | resolved "https://registry.yarnpkg.com/css-what/-/css-what-5.0.1.tgz#3efa820131f4669a8ac2408f9c32e7c7de9f4cad" 386 | integrity sha512-FYDTSHb/7KXsWICVsxdmiExPjCfRC4qRFBdVwv7Ax9hMnvMmEjP9RfxTEZ3qPZGmADDn2vAKSo9UcN1jKVYscg== 387 | 388 | css@^2.0.0: 389 | version "2.2.4" 390 | resolved "https://registry.yarnpkg.com/css/-/css-2.2.4.tgz#c646755c73971f2bba6a601e2cf2fd71b1298929" 391 | integrity sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw== 392 | dependencies: 393 | inherits "^2.0.3" 394 | source-map "^0.6.1" 395 | source-map-resolve "^0.5.2" 396 | urix "^0.1.0" 397 | 398 | csso@^4.2.0: 399 | version "4.2.0" 400 | resolved "https://registry.yarnpkg.com/csso/-/csso-4.2.0.tgz#ea3a561346e8dc9f546d6febedd50187cf389529" 401 | integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA== 402 | dependencies: 403 | css-tree "^1.1.2" 404 | 405 | cubic2quad@^1.2.1: 406 | version "1.2.1" 407 | resolved "https://registry.yarnpkg.com/cubic2quad/-/cubic2quad-1.2.1.tgz#2442260b72c02ee4b6a2fe998fcc1c4073622286" 408 | integrity sha512-wT5Y7mO8abrV16gnssKdmIhIbA9wSkeMzhh27jAguKrV82i24wER0vL5TGhUJ9dbJNDcigoRZ0IAHFEEEI4THQ== 409 | 410 | debug@4, debug@^4.1.0: 411 | version "4.3.2" 412 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" 413 | integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== 414 | dependencies: 415 | ms "2.1.2" 416 | 417 | debug@~3.1.0: 418 | version "3.1.0" 419 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" 420 | integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== 421 | dependencies: 422 | ms "2.0.0" 423 | 424 | decode-uri-component@^0.2.0: 425 | version "0.2.0" 426 | resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" 427 | integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= 428 | 429 | delegates@^1.0.0: 430 | version "1.0.0" 431 | resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" 432 | integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= 433 | 434 | depd@^1.1.2: 435 | version "1.1.2" 436 | resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" 437 | integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= 438 | 439 | doctypes@^1.1.0: 440 | version "1.1.0" 441 | resolved "https://registry.yarnpkg.com/doctypes/-/doctypes-1.1.0.tgz#ea80b106a87538774e8a3a4a5afe293de489e0a9" 442 | integrity sha1-6oCxBqh1OHdOijpKWv4pPeSJ4Kk= 443 | 444 | dom-serializer@^1.0.1: 445 | version "1.3.1" 446 | resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.3.1.tgz#d845a1565d7c041a95e5dab62184ab41e3a519be" 447 | integrity sha512-Pv2ZluG5ife96udGgEDovOOOA5UELkltfJpnIExPrAk1LTvecolUGn6lIaoLh86d83GiB86CjzciMd9BuRB71Q== 448 | dependencies: 449 | domelementtype "^2.0.1" 450 | domhandler "^4.0.0" 451 | entities "^2.0.0" 452 | 453 | domelementtype@^2.0.1, domelementtype@^2.2.0: 454 | version "2.2.0" 455 | resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.2.0.tgz#9a0b6c2782ed6a1c7323d42267183df9bd8b1d57" 456 | integrity sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A== 457 | 458 | domhandler@^4.0.0, domhandler@^4.2.0: 459 | version "4.2.0" 460 | resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.2.0.tgz#f9768a5f034be60a89a27c2e4d0f74eba0d8b059" 461 | integrity sha512-zk7sgt970kzPks2Bf+dwT/PLzghLnsivb9CcxkvR8Mzr66Olr0Ofd8neSbglHJHaHa2MadfoSdNlKYAaafmWfA== 462 | dependencies: 463 | domelementtype "^2.2.0" 464 | 465 | domutils@^2.6.0: 466 | version "2.7.0" 467 | resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.7.0.tgz#8ebaf0c41ebafcf55b0b72ec31c56323712c5442" 468 | integrity sha512-8eaHa17IwJUPAiB+SoTYBo5mCdeMgdcAoXJ59m6DT1vw+5iLS3gNoqYaRowaBKtGVrOF1Jz4yDTgYKLK2kvfJg== 469 | dependencies: 470 | dom-serializer "^1.0.1" 471 | domelementtype "^2.2.0" 472 | domhandler "^4.2.0" 473 | 474 | emoji-regex@^8.0.0: 475 | version "8.0.0" 476 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" 477 | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== 478 | 479 | enabled@2.0.x: 480 | version "2.0.0" 481 | resolved "https://registry.yarnpkg.com/enabled/-/enabled-2.0.0.tgz#f9dd92ec2d6f4bbc0d5d1e64e21d61cd4665e7c2" 482 | integrity sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ== 483 | 484 | encoding@^0.1.12: 485 | version "0.1.13" 486 | resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" 487 | integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== 488 | dependencies: 489 | iconv-lite "^0.6.2" 490 | 491 | entities@^2.0.0: 492 | version "2.0.0" 493 | resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.0.tgz#68d6084cab1b079767540d80e56a39b423e4abf4" 494 | integrity sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw== 495 | 496 | env-paths@^2.2.0: 497 | version "2.2.1" 498 | resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" 499 | integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== 500 | 501 | err-code@^2.0.2: 502 | version "2.0.3" 503 | resolved "https://registry.yarnpkg.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9" 504 | integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA== 505 | 506 | escalade@^3.1.1: 507 | version "3.1.1" 508 | resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" 509 | integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== 510 | 511 | fast-deep-equal@^3.1.1: 512 | version "3.1.3" 513 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" 514 | integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== 515 | 516 | fast-safe-stringify@^2.0.4: 517 | version "2.0.7" 518 | resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz#124aa885899261f68aedb42a7c080de9da608743" 519 | integrity sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA== 520 | 521 | fecha@^4.2.0: 522 | version "4.2.1" 523 | resolved "https://registry.yarnpkg.com/fecha/-/fecha-4.2.1.tgz#0a83ad8f86ef62a091e22bb5a039cd03d23eecce" 524 | integrity sha512-MMMQ0ludy/nBs1/o0zVOiKTpG7qMbonKUzjJgQFEuvq6INZ1OraKPRAWkBq5vlKLOUMpmNYG1JoN3oDPUQ9m3Q== 525 | 526 | file-uri-to-path@1.0.0: 527 | version "1.0.0" 528 | resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" 529 | integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== 530 | 531 | fn.name@1.x.x: 532 | version "1.1.0" 533 | resolved "https://registry.yarnpkg.com/fn.name/-/fn.name-1.1.0.tgz#26cad8017967aea8731bc42961d04a3d5988accc" 534 | integrity sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw== 535 | 536 | fs-minipass@^2.0.0: 537 | version "2.1.0" 538 | resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" 539 | integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== 540 | dependencies: 541 | minipass "^3.0.0" 542 | 543 | fs.realpath@^1.0.0: 544 | version "1.0.0" 545 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 546 | integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= 547 | 548 | function-bind@^1.1.1: 549 | version "1.1.1" 550 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 551 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== 552 | 553 | gauge@~2.7.3: 554 | version "2.7.4" 555 | resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" 556 | integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= 557 | dependencies: 558 | aproba "^1.0.3" 559 | console-control-strings "^1.0.0" 560 | has-unicode "^2.0.0" 561 | object-assign "^4.1.0" 562 | signal-exit "^3.0.0" 563 | string-width "^1.0.1" 564 | strip-ansi "^3.0.1" 565 | wide-align "^1.1.0" 566 | 567 | get-caller-file@^2.0.5: 568 | version "2.0.5" 569 | resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" 570 | integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== 571 | 572 | get-intrinsic@^1.0.2: 573 | version "1.1.1" 574 | resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" 575 | integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== 576 | dependencies: 577 | function-bind "^1.1.1" 578 | has "^1.0.3" 579 | has-symbols "^1.0.1" 580 | 581 | glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: 582 | version "7.1.6" 583 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" 584 | integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== 585 | dependencies: 586 | fs.realpath "^1.0.0" 587 | inflight "^1.0.4" 588 | inherits "2" 589 | minimatch "^3.0.4" 590 | once "^1.3.0" 591 | path-is-absolute "^1.0.0" 592 | 593 | graceful-fs@^4.2.6: 594 | version "4.2.8" 595 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a" 596 | integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg== 597 | 598 | has-symbols@^1.0.1: 599 | version "1.0.2" 600 | resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" 601 | integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== 602 | 603 | has-unicode@^2.0.0: 604 | version "2.0.1" 605 | resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" 606 | integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= 607 | 608 | has@^1.0.3: 609 | version "1.0.3" 610 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 611 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== 612 | dependencies: 613 | function-bind "^1.1.1" 614 | 615 | http-cache-semantics@^4.1.0: 616 | version "4.1.0" 617 | resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" 618 | integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== 619 | 620 | http-proxy-agent@^4.0.1: 621 | version "4.0.1" 622 | resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" 623 | integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== 624 | dependencies: 625 | "@tootallnate/once" "1" 626 | agent-base "6" 627 | debug "4" 628 | 629 | https-proxy-agent@^5.0.0: 630 | version "5.0.0" 631 | resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" 632 | integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== 633 | dependencies: 634 | agent-base "6" 635 | debug "4" 636 | 637 | humanize-ms@^1.2.1: 638 | version "1.2.1" 639 | resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" 640 | integrity sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0= 641 | dependencies: 642 | ms "^2.0.0" 643 | 644 | iconv-lite@^0.6.2: 645 | version "0.6.3" 646 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" 647 | integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== 648 | dependencies: 649 | safer-buffer ">= 2.1.2 < 3.0.0" 650 | 651 | imurmurhash@^0.1.4: 652 | version "0.1.4" 653 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 654 | integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= 655 | 656 | indent-string@^4.0.0: 657 | version "4.0.0" 658 | resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" 659 | integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== 660 | 661 | infer-owner@^1.0.4: 662 | version "1.0.4" 663 | resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" 664 | integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== 665 | 666 | inflight@^1.0.4: 667 | version "1.0.6" 668 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 669 | integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= 670 | dependencies: 671 | once "^1.3.0" 672 | wrappy "1" 673 | 674 | inherits@2, inherits@^2.0.3, inherits@~2.0.3: 675 | version "2.0.4" 676 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 677 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 678 | 679 | ip@^1.1.5: 680 | version "1.1.5" 681 | resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" 682 | integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= 683 | 684 | is-arrayish@^0.3.1: 685 | version "0.3.2" 686 | resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" 687 | integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== 688 | 689 | is-core-module@^2.2.0: 690 | version "2.2.0" 691 | resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.2.0.tgz#97037ef3d52224d85163f5597b2b63d9afed981a" 692 | integrity sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ== 693 | dependencies: 694 | has "^1.0.3" 695 | 696 | is-expression@^4.0.0: 697 | version "4.0.0" 698 | resolved "https://registry.yarnpkg.com/is-expression/-/is-expression-4.0.0.tgz#c33155962abf21d0afd2552514d67d2ec16fd2ab" 699 | integrity sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A== 700 | dependencies: 701 | acorn "^7.1.1" 702 | object-assign "^4.1.1" 703 | 704 | is-fullwidth-code-point@^1.0.0: 705 | version "1.0.0" 706 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" 707 | integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= 708 | dependencies: 709 | number-is-nan "^1.0.0" 710 | 711 | is-fullwidth-code-point@^2.0.0: 712 | version "2.0.0" 713 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 714 | integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= 715 | 716 | is-fullwidth-code-point@^3.0.0: 717 | version "3.0.0" 718 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" 719 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== 720 | 721 | is-lambda@^1.0.1: 722 | version "1.0.1" 723 | resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" 724 | integrity sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU= 725 | 726 | is-promise@^2.0.0: 727 | version "2.1.0" 728 | resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" 729 | integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= 730 | 731 | is-regex@^1.0.3: 732 | version "1.1.2" 733 | resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.2.tgz#81c8ebde4db142f2cf1c53fc86d6a45788266251" 734 | integrity sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg== 735 | dependencies: 736 | call-bind "^1.0.2" 737 | has-symbols "^1.0.1" 738 | 739 | is-stream@^2.0.0: 740 | version "2.0.0" 741 | resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" 742 | integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== 743 | 744 | isarray@~1.0.0: 745 | version "1.0.0" 746 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 747 | integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= 748 | 749 | isexe@^2.0.0: 750 | version "2.0.0" 751 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 752 | integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= 753 | 754 | js-stringify@^1.0.2: 755 | version "1.0.2" 756 | resolved "https://registry.yarnpkg.com/js-stringify/-/js-stringify-1.0.2.tgz#1736fddfd9724f28a3682adc6230ae7e4e9679db" 757 | integrity sha1-Fzb939lyTyijaCrcYjCufk6Weds= 758 | 759 | json-schema-traverse@^1.0.0: 760 | version "1.0.0" 761 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" 762 | integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== 763 | 764 | jstransformer-stylus@^1.5.0: 765 | version "1.5.0" 766 | resolved "https://registry.yarnpkg.com/jstransformer-stylus/-/jstransformer-stylus-1.5.0.tgz#9e65a9225eda4bd586c5da69d3d3d8661018ebf7" 767 | integrity sha1-nmWpIl7aS9WGxdpp09PYZhAY6/c= 768 | dependencies: 769 | clone "^2.0.0" 770 | stylus "~0.54.5" 771 | 772 | jstransformer@1.0.0: 773 | version "1.0.0" 774 | resolved "https://registry.yarnpkg.com/jstransformer/-/jstransformer-1.0.0.tgz#ed8bf0921e2f3f1ed4d5c1a44f68709ed24722c3" 775 | integrity sha1-7Yvwkh4vPx7U1cGkT2hwntJHIsM= 776 | dependencies: 777 | is-promise "^2.0.0" 778 | promise "^7.0.1" 779 | 780 | kuler@^2.0.0: 781 | version "2.0.0" 782 | resolved "https://registry.yarnpkg.com/kuler/-/kuler-2.0.0.tgz#e2c570a3800388fb44407e851531c1d670b061b3" 783 | integrity sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A== 784 | 785 | lodash@^4.17.10, lodash@^4.17.19, lodash@^4.17.21: 786 | version "4.17.21" 787 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" 788 | integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== 789 | 790 | logform@^2.2.0: 791 | version "2.2.0" 792 | resolved "https://registry.yarnpkg.com/logform/-/logform-2.2.0.tgz#40f036d19161fc76b68ab50fdc7fe495544492f2" 793 | integrity sha512-N0qPlqfypFx7UHNn4B3lzS/b0uLqt2hmuoa+PpuXNYgozdJYAyauF5Ky0BWVjrxDlMWiT3qN4zPq3vVAfZy7Yg== 794 | dependencies: 795 | colors "^1.2.1" 796 | fast-safe-stringify "^2.0.4" 797 | fecha "^4.2.0" 798 | ms "^2.1.1" 799 | triple-beam "^1.3.0" 800 | 801 | lru-cache@^6.0.0: 802 | version "6.0.0" 803 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" 804 | integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== 805 | dependencies: 806 | yallist "^4.0.0" 807 | 808 | make-fetch-happen@^8.0.14: 809 | version "8.0.14" 810 | resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-8.0.14.tgz#aaba73ae0ab5586ad8eaa68bd83332669393e222" 811 | integrity sha512-EsS89h6l4vbfJEtBZnENTOFk8mCRpY5ru36Xe5bcX1KYIli2mkSHqoFsp5O1wMDvTJJzxe/4THpCTtygjeeGWQ== 812 | dependencies: 813 | agentkeepalive "^4.1.3" 814 | cacache "^15.0.5" 815 | http-cache-semantics "^4.1.0" 816 | http-proxy-agent "^4.0.1" 817 | https-proxy-agent "^5.0.0" 818 | is-lambda "^1.0.1" 819 | lru-cache "^6.0.0" 820 | minipass "^3.1.3" 821 | minipass-collect "^1.0.2" 822 | minipass-fetch "^1.3.2" 823 | minipass-flush "^1.0.5" 824 | minipass-pipeline "^1.2.4" 825 | promise-retry "^2.0.1" 826 | socks-proxy-agent "^5.0.0" 827 | ssri "^8.0.0" 828 | 829 | mdn-data@2.0.14: 830 | version "2.0.14" 831 | resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" 832 | integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== 833 | 834 | microbuffer@^1.0.0: 835 | version "1.0.0" 836 | resolved "https://registry.yarnpkg.com/microbuffer/-/microbuffer-1.0.0.tgz#8b3832ed40c87d51f47bb234913a698a756d19d2" 837 | integrity sha1-izgy7UDIfVH0e7I0kTppinVtGdI= 838 | 839 | minimatch@^3.0.4: 840 | version "3.0.4" 841 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 842 | integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== 843 | dependencies: 844 | brace-expansion "^1.1.7" 845 | 846 | minipass-collect@^1.0.2: 847 | version "1.0.2" 848 | resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" 849 | integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== 850 | dependencies: 851 | minipass "^3.0.0" 852 | 853 | minipass-fetch@^1.3.2: 854 | version "1.3.4" 855 | resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-1.3.4.tgz#63f5af868a38746ca7b33b03393ddf8c291244fe" 856 | integrity sha512-TielGogIzbUEtd1LsjZFs47RWuHHfhl6TiCx1InVxApBAmQ8bL0dL5ilkLGcRvuyW/A9nE+Lvn855Ewz8S0PnQ== 857 | dependencies: 858 | minipass "^3.1.0" 859 | minipass-sized "^1.0.3" 860 | minizlib "^2.0.0" 861 | optionalDependencies: 862 | encoding "^0.1.12" 863 | 864 | minipass-flush@^1.0.5: 865 | version "1.0.5" 866 | resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" 867 | integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== 868 | dependencies: 869 | minipass "^3.0.0" 870 | 871 | minipass-pipeline@^1.2.2, minipass-pipeline@^1.2.4: 872 | version "1.2.4" 873 | resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c" 874 | integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== 875 | dependencies: 876 | minipass "^3.0.0" 877 | 878 | minipass-sized@^1.0.3: 879 | version "1.0.3" 880 | resolved "https://registry.yarnpkg.com/minipass-sized/-/minipass-sized-1.0.3.tgz#70ee5a7c5052070afacfbc22977ea79def353b70" 881 | integrity sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g== 882 | dependencies: 883 | minipass "^3.0.0" 884 | 885 | minipass@^3.0.0, minipass@^3.1.0, minipass@^3.1.1, minipass@^3.1.3: 886 | version "3.1.3" 887 | resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.3.tgz#7d42ff1f39635482e15f9cdb53184deebd5815fd" 888 | integrity sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg== 889 | dependencies: 890 | yallist "^4.0.0" 891 | 892 | minizlib@^2.0.0, minizlib@^2.1.1: 893 | version "2.1.2" 894 | resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" 895 | integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== 896 | dependencies: 897 | minipass "^3.0.0" 898 | yallist "^4.0.0" 899 | 900 | mkdirp@^1.0.3, mkdirp@^1.0.4, mkdirp@~1.0.4: 901 | version "1.0.4" 902 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" 903 | integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== 904 | 905 | ms@2.0.0: 906 | version "2.0.0" 907 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 908 | integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= 909 | 910 | ms@2.1.2: 911 | version "2.1.2" 912 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 913 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 914 | 915 | ms@^2.0.0, ms@^2.1.1: 916 | version "2.1.3" 917 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" 918 | integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== 919 | 920 | nan@^2.14.2: 921 | version "2.14.2" 922 | resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.2.tgz#f5376400695168f4cc694ac9393d0c9585eeea19" 923 | integrity sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ== 924 | 925 | node-gyp@^8.1.0: 926 | version "8.1.0" 927 | resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-8.1.0.tgz#81f43283e922d285c886fb0e0f520a7fd431d8c2" 928 | integrity sha512-o2elh1qt7YUp3lkMwY3/l4KF3j/A3fI/Qt4NH+CQQgPJdqGE9y7qnP84cjIWN27Q0jJkrSAhCVDg+wBVNBYdBg== 929 | dependencies: 930 | env-paths "^2.2.0" 931 | glob "^7.1.4" 932 | graceful-fs "^4.2.6" 933 | make-fetch-happen "^8.0.14" 934 | nopt "^5.0.0" 935 | npmlog "^4.1.2" 936 | rimraf "^3.0.2" 937 | semver "^7.3.5" 938 | tar "^6.1.0" 939 | which "^2.0.2" 940 | 941 | nopt@^5.0.0: 942 | version "5.0.0" 943 | resolved "https://registry.yarnpkg.com/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88" 944 | integrity sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ== 945 | dependencies: 946 | abbrev "1" 947 | 948 | npmlog@^4.1.2: 949 | version "4.1.2" 950 | resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" 951 | integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== 952 | dependencies: 953 | are-we-there-yet "~1.1.2" 954 | console-control-strings "~1.1.0" 955 | gauge "~2.7.3" 956 | set-blocking "~2.0.0" 957 | 958 | nth-check@^2.0.0: 959 | version "2.0.0" 960 | resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.0.0.tgz#1bb4f6dac70072fc313e8c9cd1417b5074c0a125" 961 | integrity sha512-i4sc/Kj8htBrAiH1viZ0TgU8Y5XqCaV/FziYK6TBczxmeKm3AEFWqqF3195yKudrarqy7Zu80Ra5dobFjn9X/Q== 962 | dependencies: 963 | boolbase "^1.0.0" 964 | 965 | number-is-nan@^1.0.0: 966 | version "1.0.1" 967 | resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" 968 | integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= 969 | 970 | object-assign@^4.1.0, object-assign@^4.1.1: 971 | version "4.1.1" 972 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 973 | integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= 974 | 975 | once@^1.3.0: 976 | version "1.4.0" 977 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 978 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 979 | dependencies: 980 | wrappy "1" 981 | 982 | one-time@^1.0.0: 983 | version "1.0.0" 984 | resolved "https://registry.yarnpkg.com/one-time/-/one-time-1.0.0.tgz#e06bc174aed214ed58edede573b433bbf827cb45" 985 | integrity sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g== 986 | dependencies: 987 | fn.name "1.x.x" 988 | 989 | p-map@^4.0.0: 990 | version "4.0.0" 991 | resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" 992 | integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== 993 | dependencies: 994 | aggregate-error "^3.0.0" 995 | 996 | pako@^1.0.0: 997 | version "1.0.6" 998 | resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.6.tgz#0101211baa70c4bca4a0f63f2206e97b7dfaf258" 999 | integrity sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg== 1000 | 1001 | path-is-absolute@^1.0.0: 1002 | version "1.0.1" 1003 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1004 | integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 1005 | 1006 | path-parse@^1.0.6: 1007 | version "1.0.7" 1008 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" 1009 | integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== 1010 | 1011 | process-nextick-args@~2.0.0: 1012 | version "2.0.0" 1013 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" 1014 | integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw== 1015 | 1016 | promise-inflight@^1.0.1: 1017 | version "1.0.1" 1018 | resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" 1019 | integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= 1020 | 1021 | promise-retry@^2.0.1: 1022 | version "2.0.1" 1023 | resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-2.0.1.tgz#ff747a13620ab57ba688f5fc67855410c370da22" 1024 | integrity sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g== 1025 | dependencies: 1026 | err-code "^2.0.2" 1027 | retry "^0.12.0" 1028 | 1029 | promise@^7.0.1: 1030 | version "7.3.1" 1031 | resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" 1032 | integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== 1033 | dependencies: 1034 | asap "~2.0.3" 1035 | 1036 | pug-attrs@^3.0.0: 1037 | version "3.0.0" 1038 | resolved "https://registry.yarnpkg.com/pug-attrs/-/pug-attrs-3.0.0.tgz#b10451e0348165e31fad1cc23ebddd9dc7347c41" 1039 | integrity sha512-azINV9dUtzPMFQktvTXciNAfAuVh/L/JCl0vtPCwvOA21uZrC08K/UnmrL+SXGEVc1FwzjW62+xw5S/uaLj6cA== 1040 | dependencies: 1041 | constantinople "^4.0.1" 1042 | js-stringify "^1.0.2" 1043 | pug-runtime "^3.0.0" 1044 | 1045 | pug-code-gen@^3.0.2: 1046 | version "3.0.2" 1047 | resolved "https://registry.yarnpkg.com/pug-code-gen/-/pug-code-gen-3.0.2.tgz#ad190f4943133bf186b60b80de483100e132e2ce" 1048 | integrity sha512-nJMhW16MbiGRiyR4miDTQMRWDgKplnHyeLvioEJYbk1RsPI3FuA3saEP8uwnTb2nTJEKBU90NFVWJBk4OU5qyg== 1049 | dependencies: 1050 | constantinople "^4.0.1" 1051 | doctypes "^1.1.0" 1052 | js-stringify "^1.0.2" 1053 | pug-attrs "^3.0.0" 1054 | pug-error "^2.0.0" 1055 | pug-runtime "^3.0.0" 1056 | void-elements "^3.1.0" 1057 | with "^7.0.0" 1058 | 1059 | pug-error@^2.0.0: 1060 | version "2.0.0" 1061 | resolved "https://registry.yarnpkg.com/pug-error/-/pug-error-2.0.0.tgz#5c62173cb09c34de2a2ce04f17b8adfec74d8ca5" 1062 | integrity sha512-sjiUsi9M4RAGHktC1drQfCr5C5eriu24Lfbt4s+7SykztEOwVZtbFk1RRq0tzLxcMxMYTBR+zMQaG07J/btayQ== 1063 | 1064 | pug-filters@^4.0.0: 1065 | version "4.0.0" 1066 | resolved "https://registry.yarnpkg.com/pug-filters/-/pug-filters-4.0.0.tgz#d3e49af5ba8472e9b7a66d980e707ce9d2cc9b5e" 1067 | integrity sha512-yeNFtq5Yxmfz0f9z2rMXGw/8/4i1cCFecw/Q7+D0V2DdtII5UvqE12VaZ2AY7ri6o5RNXiweGH79OCq+2RQU4A== 1068 | dependencies: 1069 | constantinople "^4.0.1" 1070 | jstransformer "1.0.0" 1071 | pug-error "^2.0.0" 1072 | pug-walk "^2.0.0" 1073 | resolve "^1.15.1" 1074 | 1075 | pug-lexer@^5.0.1: 1076 | version "5.0.1" 1077 | resolved "https://registry.yarnpkg.com/pug-lexer/-/pug-lexer-5.0.1.tgz#ae44628c5bef9b190b665683b288ca9024b8b0d5" 1078 | integrity sha512-0I6C62+keXlZPZkOJeVam9aBLVP2EnbeDw3An+k0/QlqdwH6rv8284nko14Na7c0TtqtogfWXcRoFE4O4Ff20w== 1079 | dependencies: 1080 | character-parser "^2.2.0" 1081 | is-expression "^4.0.0" 1082 | pug-error "^2.0.0" 1083 | 1084 | pug-linker@^4.0.0: 1085 | version "4.0.0" 1086 | resolved "https://registry.yarnpkg.com/pug-linker/-/pug-linker-4.0.0.tgz#12cbc0594fc5a3e06b9fc59e6f93c146962a7708" 1087 | integrity sha512-gjD1yzp0yxbQqnzBAdlhbgoJL5qIFJw78juN1NpTLt/mfPJ5VgC4BvkoD3G23qKzJtIIXBbcCt6FioLSFLOHdw== 1088 | dependencies: 1089 | pug-error "^2.0.0" 1090 | pug-walk "^2.0.0" 1091 | 1092 | pug-load@^3.0.0: 1093 | version "3.0.0" 1094 | resolved "https://registry.yarnpkg.com/pug-load/-/pug-load-3.0.0.tgz#9fd9cda52202b08adb11d25681fb9f34bd41b662" 1095 | integrity sha512-OCjTEnhLWZBvS4zni/WUMjH2YSUosnsmjGBB1An7CsKQarYSWQ0GCVyd4eQPMFJqZ8w9xgs01QdiZXKVjk92EQ== 1096 | dependencies: 1097 | object-assign "^4.1.1" 1098 | pug-walk "^2.0.0" 1099 | 1100 | pug-parser@^6.0.0: 1101 | version "6.0.0" 1102 | resolved "https://registry.yarnpkg.com/pug-parser/-/pug-parser-6.0.0.tgz#a8fdc035863a95b2c1dc5ebf4ecf80b4e76a1260" 1103 | integrity sha512-ukiYM/9cH6Cml+AOl5kETtM9NR3WulyVP2y4HOU45DyMim1IeP/OOiyEWRr6qk5I5klpsBnbuHpwKmTx6WURnw== 1104 | dependencies: 1105 | pug-error "^2.0.0" 1106 | token-stream "1.0.0" 1107 | 1108 | pug-runtime@^3.0.0, pug-runtime@^3.0.1: 1109 | version "3.0.1" 1110 | resolved "https://registry.yarnpkg.com/pug-runtime/-/pug-runtime-3.0.1.tgz#f636976204723f35a8c5f6fad6acda2a191b83d7" 1111 | integrity sha512-L50zbvrQ35TkpHwv0G6aLSuueDRwc/97XdY8kL3tOT0FmhgG7UypU3VztfV/LATAvmUfYi4wNxSajhSAeNN+Kg== 1112 | 1113 | pug-strip-comments@^2.0.0: 1114 | version "2.0.0" 1115 | resolved "https://registry.yarnpkg.com/pug-strip-comments/-/pug-strip-comments-2.0.0.tgz#f94b07fd6b495523330f490a7f554b4ff876303e" 1116 | integrity sha512-zo8DsDpH7eTkPHCXFeAk1xZXJbyoTfdPlNR0bK7rpOMuhBYb0f5qUVCO1xlsitYd3w5FQTK7zpNVKb3rZoUrrQ== 1117 | dependencies: 1118 | pug-error "^2.0.0" 1119 | 1120 | pug-walk@^2.0.0: 1121 | version "2.0.0" 1122 | resolved "https://registry.yarnpkg.com/pug-walk/-/pug-walk-2.0.0.tgz#417aabc29232bb4499b5b5069a2b2d2a24d5f5fe" 1123 | integrity sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ== 1124 | 1125 | pug@^3.0.2: 1126 | version "3.0.2" 1127 | resolved "https://registry.yarnpkg.com/pug/-/pug-3.0.2.tgz#f35c7107343454e43bc27ae0ff76c731b78ea535" 1128 | integrity sha512-bp0I/hiK1D1vChHh6EfDxtndHji55XP/ZJKwsRqrz6lRia6ZC2OZbdAymlxdVFwd1L70ebrVJw4/eZ79skrIaw== 1129 | dependencies: 1130 | pug-code-gen "^3.0.2" 1131 | pug-filters "^4.0.0" 1132 | pug-lexer "^5.0.1" 1133 | pug-linker "^4.0.0" 1134 | pug-load "^3.0.0" 1135 | pug-parser "^6.0.0" 1136 | pug-runtime "^3.0.1" 1137 | pug-strip-comments "^2.0.0" 1138 | 1139 | punycode@^2.1.0: 1140 | version "2.1.1" 1141 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" 1142 | integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== 1143 | 1144 | readable-stream@^2.0.6, readable-stream@^2.3.7: 1145 | version "2.3.7" 1146 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" 1147 | integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== 1148 | dependencies: 1149 | core-util-is "~1.0.0" 1150 | inherits "~2.0.3" 1151 | isarray "~1.0.0" 1152 | process-nextick-args "~2.0.0" 1153 | safe-buffer "~5.1.1" 1154 | string_decoder "~1.1.1" 1155 | util-deprecate "~1.0.1" 1156 | 1157 | readable-stream@^3.4.0: 1158 | version "3.6.0" 1159 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" 1160 | integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== 1161 | dependencies: 1162 | inherits "^2.0.3" 1163 | string_decoder "^1.1.1" 1164 | util-deprecate "^1.0.1" 1165 | 1166 | require-directory@^2.1.1: 1167 | version "2.1.1" 1168 | resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" 1169 | integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= 1170 | 1171 | require-from-string@^2.0.2: 1172 | version "2.0.2" 1173 | resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" 1174 | integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== 1175 | 1176 | resolve-url@^0.2.1: 1177 | version "0.2.1" 1178 | resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" 1179 | integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= 1180 | 1181 | resolve@^1.15.1: 1182 | version "1.20.0" 1183 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" 1184 | integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== 1185 | dependencies: 1186 | is-core-module "^2.2.0" 1187 | path-parse "^1.0.6" 1188 | 1189 | retry@^0.12.0: 1190 | version "0.12.0" 1191 | resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" 1192 | integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= 1193 | 1194 | rimraf@^3.0.0, rimraf@^3.0.2: 1195 | version "3.0.2" 1196 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" 1197 | integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== 1198 | dependencies: 1199 | glob "^7.1.3" 1200 | 1201 | safe-buffer@~5.1.0, safe-buffer@~5.1.1: 1202 | version "5.1.2" 1203 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 1204 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 1205 | 1206 | safe-buffer@~5.2.0: 1207 | version "5.2.0" 1208 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" 1209 | integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== 1210 | 1211 | "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.1.2: 1212 | version "2.1.2" 1213 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 1214 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 1215 | 1216 | sax@~1.2.4: 1217 | version "1.2.4" 1218 | resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" 1219 | integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== 1220 | 1221 | semver@^6.3.0: 1222 | version "6.3.0" 1223 | resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" 1224 | integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== 1225 | 1226 | semver@^7.3.5: 1227 | version "7.3.5" 1228 | resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" 1229 | integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== 1230 | dependencies: 1231 | lru-cache "^6.0.0" 1232 | 1233 | set-blocking@~2.0.0: 1234 | version "2.0.0" 1235 | resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" 1236 | integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= 1237 | 1238 | signal-exit@^3.0.0: 1239 | version "3.0.2" 1240 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" 1241 | integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= 1242 | 1243 | simple-swizzle@^0.2.2: 1244 | version "0.2.2" 1245 | resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" 1246 | integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo= 1247 | dependencies: 1248 | is-arrayish "^0.3.1" 1249 | 1250 | smart-buffer@^4.1.0: 1251 | version "4.2.0" 1252 | resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" 1253 | integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== 1254 | 1255 | socks-proxy-agent@^5.0.0: 1256 | version "5.0.1" 1257 | resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-5.0.1.tgz#032fb583048a29ebffec2e6a73fca0761f48177e" 1258 | integrity sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ== 1259 | dependencies: 1260 | agent-base "^6.0.2" 1261 | debug "4" 1262 | socks "^2.3.3" 1263 | 1264 | socks@^2.3.3: 1265 | version "2.6.1" 1266 | resolved "https://registry.yarnpkg.com/socks/-/socks-2.6.1.tgz#989e6534a07cf337deb1b1c94aaa44296520d30e" 1267 | integrity sha512-kLQ9N5ucj8uIcxrDwjm0Jsqk06xdpBjGNQtpXy4Q8/QY2k+fY7nZH8CARy+hkbG+SGAovmzzuauCpBlb8FrnBA== 1268 | dependencies: 1269 | ip "^1.1.5" 1270 | smart-buffer "^4.1.0" 1271 | 1272 | source-map-resolve@^0.5.2: 1273 | version "0.5.3" 1274 | resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" 1275 | integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== 1276 | dependencies: 1277 | atob "^2.1.2" 1278 | decode-uri-component "^0.2.0" 1279 | resolve-url "^0.2.1" 1280 | source-map-url "^0.4.0" 1281 | urix "^0.1.0" 1282 | 1283 | source-map-url@^0.4.0: 1284 | version "0.4.1" 1285 | resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" 1286 | integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== 1287 | 1288 | source-map@^0.6.1: 1289 | version "0.6.1" 1290 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" 1291 | integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== 1292 | 1293 | source-map@^0.7.3: 1294 | version "0.7.3" 1295 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" 1296 | integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== 1297 | 1298 | ssri@^8.0.0, ssri@^8.0.1: 1299 | version "8.0.1" 1300 | resolved "https://registry.yarnpkg.com/ssri/-/ssri-8.0.1.tgz#638e4e439e2ffbd2cd289776d5ca457c4f51a2af" 1301 | integrity sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ== 1302 | dependencies: 1303 | minipass "^3.1.1" 1304 | 1305 | stable@^0.1.8: 1306 | version "0.1.8" 1307 | resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" 1308 | integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== 1309 | 1310 | stack-trace@0.0.x: 1311 | version "0.0.10" 1312 | resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" 1313 | integrity sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA= 1314 | 1315 | string-width@^1.0.1: 1316 | version "1.0.2" 1317 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" 1318 | integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= 1319 | dependencies: 1320 | code-point-at "^1.0.0" 1321 | is-fullwidth-code-point "^1.0.0" 1322 | strip-ansi "^3.0.0" 1323 | 1324 | "string-width@^1.0.2 || 2": 1325 | version "2.1.1" 1326 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" 1327 | integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== 1328 | dependencies: 1329 | is-fullwidth-code-point "^2.0.0" 1330 | strip-ansi "^4.0.0" 1331 | 1332 | string-width@^4.1.0, string-width@^4.2.0: 1333 | version "4.2.2" 1334 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz#dafd4f9559a7585cfba529c6a0a4f73488ebd4c5" 1335 | integrity sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA== 1336 | dependencies: 1337 | emoji-regex "^8.0.0" 1338 | is-fullwidth-code-point "^3.0.0" 1339 | strip-ansi "^6.0.0" 1340 | 1341 | string_decoder@^1.1.1: 1342 | version "1.3.0" 1343 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" 1344 | integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== 1345 | dependencies: 1346 | safe-buffer "~5.2.0" 1347 | 1348 | string_decoder@~1.1.1: 1349 | version "1.1.1" 1350 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" 1351 | integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== 1352 | dependencies: 1353 | safe-buffer "~5.1.0" 1354 | 1355 | strip-ansi@^3.0.0, strip-ansi@^3.0.1: 1356 | version "3.0.1" 1357 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 1358 | integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= 1359 | dependencies: 1360 | ansi-regex "^2.0.0" 1361 | 1362 | strip-ansi@^4.0.0: 1363 | version "4.0.0" 1364 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" 1365 | integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= 1366 | dependencies: 1367 | ansi-regex "^3.0.0" 1368 | 1369 | strip-ansi@^6.0.0: 1370 | version "6.0.0" 1371 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" 1372 | integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== 1373 | dependencies: 1374 | ansi-regex "^5.0.0" 1375 | 1376 | stylus@~0.54.5: 1377 | version "0.54.8" 1378 | resolved "https://registry.yarnpkg.com/stylus/-/stylus-0.54.8.tgz#3da3e65966bc567a7b044bfe0eece653e099d147" 1379 | integrity sha512-vr54Or4BZ7pJafo2mpf0ZcwA74rpuYCZbxrHBsH8kbcXOwSfvBFwsRfpGO5OD5fhG5HDCFW737PKaawI7OqEAg== 1380 | dependencies: 1381 | css-parse "~2.0.0" 1382 | debug "~3.1.0" 1383 | glob "^7.1.6" 1384 | mkdirp "~1.0.4" 1385 | safer-buffer "^2.1.2" 1386 | sax "~1.2.4" 1387 | semver "^6.3.0" 1388 | source-map "^0.7.3" 1389 | 1390 | svg2ttf@^6.0.3: 1391 | version "6.0.3" 1392 | resolved "https://registry.yarnpkg.com/svg2ttf/-/svg2ttf-6.0.3.tgz#7b92978ff124b2a583d21e1208b9675e245e56d1" 1393 | integrity sha512-CgqMyZrbOPpc+WqH7aga4JWkDPso23EgypLsbQ6gN3uoPWwwiLjXvzgrwGADBExvCRJrWFzAeK1bSoSpE7ixSQ== 1394 | dependencies: 1395 | "@xmldom/xmldom" "^0.7.2" 1396 | argparse "^2.0.1" 1397 | cubic2quad "^1.2.1" 1398 | lodash "^4.17.10" 1399 | microbuffer "^1.0.0" 1400 | svgpath "^2.1.5" 1401 | 1402 | svgo@^2.5.0: 1403 | version "2.5.0" 1404 | resolved "https://registry.yarnpkg.com/svgo/-/svgo-2.5.0.tgz#3c9051b606d85a02fcb59f459b19970d2cc2c9bf" 1405 | integrity sha512-FSdBOOo271VyF/qZnOn1PgwCdt1v4Dx0Sey+U1jgqm1vqRYjPGdip0RGrFW6ItwtkBB8rHgHk26dlVr0uCs82Q== 1406 | dependencies: 1407 | "@trysound/sax" "0.1.1" 1408 | colorette "^1.3.0" 1409 | commander "^7.2.0" 1410 | css-select "^4.1.3" 1411 | css-tree "^1.1.3" 1412 | csso "^4.2.0" 1413 | stable "^0.1.8" 1414 | 1415 | svgpath@^2.1.5, svgpath@^2.2.2: 1416 | version "2.3.1" 1417 | resolved "https://registry.yarnpkg.com/svgpath/-/svgpath-2.3.1.tgz#b102334bebd2244b4818460ba2ebad52716a0d43" 1418 | integrity sha512-wNz6lCoj+99GMoyU7SozTfPqiLHz6WcJYZ30Z+F4lF/gPtxWHBCpZ4DhoDI0+oZ0dObKyYsJdSPGbL2mJq/qCg== 1419 | 1420 | tar@^6.0.2, tar@^6.1.0: 1421 | version "6.1.11" 1422 | resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.11.tgz#6760a38f003afa1b2ffd0ffe9e9abbd0eab3d621" 1423 | integrity sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA== 1424 | dependencies: 1425 | chownr "^2.0.0" 1426 | fs-minipass "^2.0.0" 1427 | minipass "^3.0.0" 1428 | minizlib "^2.1.1" 1429 | mkdirp "^1.0.3" 1430 | yallist "^4.0.0" 1431 | 1432 | text-hex@1.0.x: 1433 | version "1.0.0" 1434 | resolved "https://registry.yarnpkg.com/text-hex/-/text-hex-1.0.0.tgz#69dc9c1b17446ee79a92bf5b884bb4b9127506f5" 1435 | integrity sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg== 1436 | 1437 | to-fast-properties@^2.0.0: 1438 | version "2.0.0" 1439 | resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" 1440 | integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= 1441 | 1442 | token-stream@1.0.0: 1443 | version "1.0.0" 1444 | resolved "https://registry.yarnpkg.com/token-stream/-/token-stream-1.0.0.tgz#cc200eab2613f4166d27ff9afc7ca56d49df6eb4" 1445 | integrity sha1-zCAOqyYT9BZtJ/+a/HylbUnfbrQ= 1446 | 1447 | triple-beam@^1.2.0, triple-beam@^1.3.0: 1448 | version "1.3.0" 1449 | resolved "https://registry.yarnpkg.com/triple-beam/-/triple-beam-1.3.0.tgz#a595214c7298db8339eeeee083e4d10bd8cb8dd9" 1450 | integrity sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw== 1451 | 1452 | ttf2eot@^3.0.0: 1453 | version "3.0.0" 1454 | resolved "https://registry.yarnpkg.com/ttf2eot/-/ttf2eot-3.0.0.tgz#4a72b48a6a8c90beee4614d2ddbf5de062b23997" 1455 | integrity sha512-Y/ymhhYr/lLkf66BnLQBs3LjttPDE+1BJcFHq/oJN5SnZTacMWVdPfGLB5eIVnC2iT9gZ2ls/Bre2zbKq6hNsA== 1456 | dependencies: 1457 | argparse "^2.0.1" 1458 | 1459 | ttf2woff2@^4.0.4: 1460 | version "4.0.4" 1461 | resolved "https://registry.yarnpkg.com/ttf2woff2/-/ttf2woff2-4.0.4.tgz#a995856dc0cc6f4b12ea38c5de7ab289b645ef26" 1462 | integrity sha512-pdt/q89D6VmWToUkiwrUo/OrQtmHGr2iBl3GQriHE6xq0cnteb8gJF8UitOdXmFTX8ajKgb3HMGKpKAsCJM61g== 1463 | dependencies: 1464 | bindings "^1.5.0" 1465 | bufferstreams "^3.0.0" 1466 | nan "^2.14.2" 1467 | node-gyp "^8.1.0" 1468 | 1469 | ttf2woff@^3.0.0: 1470 | version "3.0.0" 1471 | resolved "https://registry.yarnpkg.com/ttf2woff/-/ttf2woff-3.0.0.tgz#bd0fc0157e428b7a9a30340f78adf72fb741962a" 1472 | integrity sha512-OvmFcj70PhmAsVQKfC15XoKH55cRWuaRzvr2fpTNhTNer6JBpG8n6vOhRrIgxMjcikyYt88xqYXMMVapJ4Rjvg== 1473 | dependencies: 1474 | argparse "^2.0.1" 1475 | pako "^1.0.0" 1476 | 1477 | unique-filename@^1.1.1: 1478 | version "1.1.1" 1479 | resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" 1480 | integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== 1481 | dependencies: 1482 | unique-slug "^2.0.0" 1483 | 1484 | unique-slug@^2.0.0: 1485 | version "2.0.2" 1486 | resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" 1487 | integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== 1488 | dependencies: 1489 | imurmurhash "^0.1.4" 1490 | 1491 | uri-js@^4.2.2: 1492 | version "4.2.2" 1493 | resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" 1494 | integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== 1495 | dependencies: 1496 | punycode "^2.1.0" 1497 | 1498 | urix@^0.1.0: 1499 | version "0.1.0" 1500 | resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" 1501 | integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= 1502 | 1503 | util-deprecate@^1.0.1, util-deprecate@~1.0.1: 1504 | version "1.0.2" 1505 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 1506 | integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= 1507 | 1508 | void-elements@^3.1.0: 1509 | version "3.1.0" 1510 | resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-3.1.0.tgz#614f7fbf8d801f0bb5f0661f5b2f5785750e4f09" 1511 | integrity sha1-YU9/v42AHwu18GYfWy9XhXUOTwk= 1512 | 1513 | which@^2.0.2: 1514 | version "2.0.2" 1515 | resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" 1516 | integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== 1517 | dependencies: 1518 | isexe "^2.0.0" 1519 | 1520 | wide-align@^1.1.0: 1521 | version "1.1.3" 1522 | resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" 1523 | integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== 1524 | dependencies: 1525 | string-width "^1.0.2 || 2" 1526 | 1527 | winston-transport@^4.4.0: 1528 | version "4.4.0" 1529 | resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.4.0.tgz#17af518daa690d5b2ecccaa7acf7b20ca7925e59" 1530 | integrity sha512-Lc7/p3GtqtqPBYYtS6KCN3c77/2QCev51DvcJKbkFPQNoj1sinkGwLGFDxkXY9J6p9+EPnYs+D90uwbnaiURTw== 1531 | dependencies: 1532 | readable-stream "^2.3.7" 1533 | triple-beam "^1.2.0" 1534 | 1535 | winston@^3.2.1: 1536 | version "3.3.3" 1537 | resolved "https://registry.yarnpkg.com/winston/-/winston-3.3.3.tgz#ae6172042cafb29786afa3d09c8ff833ab7c9170" 1538 | integrity sha512-oEXTISQnC8VlSAKf1KYSSd7J6IWuRPQqDdo8eoRNaYKLvwSb5+79Z3Yi1lrl6KDpU6/VWaxpakDAtb1oQ4n9aw== 1539 | dependencies: 1540 | "@dabh/diagnostics" "^2.0.2" 1541 | async "^3.1.0" 1542 | is-stream "^2.0.0" 1543 | logform "^2.2.0" 1544 | one-time "^1.0.0" 1545 | readable-stream "^3.4.0" 1546 | stack-trace "0.0.x" 1547 | triple-beam "^1.3.0" 1548 | winston-transport "^4.4.0" 1549 | 1550 | with@^7.0.0: 1551 | version "7.0.2" 1552 | resolved "https://registry.yarnpkg.com/with/-/with-7.0.2.tgz#ccee3ad542d25538a7a7a80aad212b9828495bac" 1553 | integrity sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w== 1554 | dependencies: 1555 | "@babel/parser" "^7.9.6" 1556 | "@babel/types" "^7.9.6" 1557 | assert-never "^1.2.1" 1558 | babel-walk "3.0.0-canary-5" 1559 | 1560 | wrap-ansi@^7.0.0: 1561 | version "7.0.0" 1562 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" 1563 | integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== 1564 | dependencies: 1565 | ansi-styles "^4.0.0" 1566 | string-width "^4.1.0" 1567 | strip-ansi "^6.0.0" 1568 | 1569 | wrappy@1: 1570 | version "1.0.2" 1571 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1572 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 1573 | 1574 | y18n@^5.0.5: 1575 | version "5.0.8" 1576 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" 1577 | integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== 1578 | 1579 | yallist@^4.0.0: 1580 | version "4.0.0" 1581 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" 1582 | integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== 1583 | 1584 | yargs-parser@^20.2.2: 1585 | version "20.2.7" 1586 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.7.tgz#61df85c113edfb5a7a4e36eb8aa60ef423cbc90a" 1587 | integrity sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw== 1588 | 1589 | yargs@^17.1.1: 1590 | version "17.1.1" 1591 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.1.1.tgz#c2a8091564bdb196f7c0a67c1d12e5b85b8067ba" 1592 | integrity sha512-c2k48R0PwKIqKhPMWjeiF6y2xY/gPMUlro0sgxqXpbOIohWiLNXWslsootttv7E1e73QPAMQSg5FeySbVcpsPQ== 1593 | dependencies: 1594 | cliui "^7.0.2" 1595 | escalade "^3.1.1" 1596 | get-caller-file "^2.0.5" 1597 | require-directory "^2.1.1" 1598 | string-width "^4.2.0" 1599 | y18n "^5.0.5" 1600 | yargs-parser "^20.2.2" 1601 | --------------------------------------------------------------------------------