├── .czrc ├── .editorconfig ├── .eslintignore ├── .eslintrc.js ├── .gitignore ├── .huskyrc.json ├── .npmignore ├── .nvmrc ├── .prettierrc.js ├── .travis.yml ├── CHANGELOG.md ├── LICENSE ├── README.md ├── breakpoints ├── calculators.js ├── helpers.js ├── media-queries.js └── validators.js ├── commitlint.config.js ├── features ├── base │ ├── index.js │ └── index.spec.js ├── between │ ├── index.js │ └── index.spec.js ├── bubbling-atrule │ └── index.js ├── bubbling-rule │ ├── index.js │ └── index.spec.js ├── down │ ├── index.js │ └── index.spec.js ├── elements.js ├── nested-rule │ ├── index.js │ └── index.spec.js ├── only │ ├── index.js │ └── index.spec.js ├── root │ ├── default-root.js │ ├── elements.js │ ├── fluid-root.js │ ├── index.js │ └── index.spec.js ├── step-function │ ├── index.js │ └── index.spec.js ├── step │ ├── index.js │ └── index.spec.js └── up │ ├── index.js │ └── index.spec.js ├── helpers └── index.js ├── img └── msunit.jpg ├── index.js ├── jest.config.js ├── lint-staged.config.js ├── mocks ├── breakpoints-map.js └── user-config.js ├── package.json ├── release.config.js ├── run.js ├── sandbox ├── dist │ └── index.css ├── package.json ├── postcss.config.js ├── src │ └── index.css └── yarn.lock ├── utils └── index.js └── yarn.lock /.czrc: -------------------------------------------------------------------------------- 1 | 2 | { 3 | "path": "cz-conventional-changelog" 4 | } -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # EditorConfig helps developers define and maintain consistent 2 | # coding styles between different editors and IDEs 3 | # editorconfig.org 4 | 5 | root = true 6 | 7 | [*] 8 | 9 | # Change these settings to your own preference 10 | indent_style = space 11 | indent_size = 2 12 | 13 | # We recommend you to keep these unchanged 14 | end_of_line = lf 15 | charset = utf-8 16 | trim_trailing_whitespace = true 17 | insert_final_newline = true 18 | 19 | [*.md] 20 | trim_trailing_whitespace = false -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | sandbox/ -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | extends: ['airbnb-base', 'prettier'], 3 | plugins: ['prettier', 'jest'], 4 | env: { 5 | node: true, 6 | mocha: true, 7 | jasmine: true, 8 | }, 9 | rules: { 10 | 'no-console': 2, 11 | 'arrow-body-style': 2, 12 | 'newline-before-return': 2, 13 | 'no-unused-vars': 2, 14 | 'no-param-reassign': 0, 15 | 'import/no-extraneous-dependencies': 0, 16 | 'no-use-before-define': 0, 17 | }, 18 | }; 19 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/ignore-files/ for more about ignoring files. 2 | 3 | # Dependencies 4 | node_modules/ 5 | 6 | 7 | # Test coverage 8 | coverage 9 | 10 | # Logs 11 | npm-debug.log* 12 | yarn-debug.log* 13 | yarn-error.log* 14 | 15 | # Editors and IDEs 16 | .idea 17 | .vscode/* 18 | !.vscode/settings.json 19 | !.vscode/tasks.json 20 | !.vscode/launch.json 21 | !.vscode/extensions.json 22 | 23 | # Misc 24 | .DS_Store -------------------------------------------------------------------------------- /.huskyrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "hooks": { 3 | "pre-commit": "lint-staged", 4 | "commit-msg": "commitlint -E HUSKY_GIT_PARAMS" 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | .gitignore 2 | .editorconfig 3 | sandbox/ 4 | node_modules/ 5 | npm-debug.log 6 | *.test.js 7 | .travis.yml 8 | run.js 9 | release.config.js 10 | package.json 11 | lint-staged.config.js 12 | jest.config.js 13 | commitlint.config.js 14 | .prettierrc.js 15 | .nvmrc 16 | .huskyrc.json 17 | .eslintrc.js 18 | .eslintignore 19 | .czrc 20 | -------------------------------------------------------------------------------- /.nvmrc: -------------------------------------------------------------------------------- 1 | v10.15.3 -------------------------------------------------------------------------------- /.prettierrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | trailingComma: 'all', 3 | singleQuote: true, 4 | arrowParens: 'always', 5 | }; 6 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | cache: yarn 3 | node_js: 4 | - node 5 | - '10' 6 | os: 7 | - linux 8 | - osx 9 | branches: 10 | only: 11 | - master 12 | - "/^greenkeeper/.*$/" 13 | script: 14 | - npm test 15 | after_success: 16 | - yarn coverage 17 | jobs: 18 | include: 19 | - stage: release 20 | if: branch IN (master, next) 21 | node_js: node 22 | script: 23 | - npx semantic-release 24 | env: 25 | - secure: mbHVtUiVYw3flLupYQKPQ8PXV2wyIoZf4NmI9pLzI9EMlYh3kGLi5l1XLN1rVxudj7xJoDbKctRLFuICuHGRkL4D4rl0AaAQE48/5+TMDHQGuncr9mKxPyoAbR+08HiMu9Igoi42cvOZt5nPOWJy6ZYGtWhYuOjT1hUcV3hT5oe0wGB7UFHqekb2TqLlVxE5eG7go4IC5ZQQrAshF01946Qt6GmVbTDKTKSq4G+Fzl6smzswOe9XrxM2lAkuqwZltQ/l1zbGs1H9t0aakkafqE6x0cbhzqaPQvoUuLQAL+zzWepOqmRHH1TIUcbm/1cWsbzXTu9APgOcuWs87q7cdKm9N18wQIF/E2XS21z7PFJKDtRgoUxIXkvsOP0OngyIJjY4qzbJv/FsE4O14/9V+U86/dKd9ykgZEKmgD8tJQswC4TN1Z3axJD61WHXCdaItH/mlplCeq2IXM9hpUHc5/UOqhiA6LrbN+tjOKGzrFqRBKPz6VFV8/FmoAW0dMauWSQwqNQToB7QQowpvd67xZlq33+mJiRVHq1fu1bOK25CHuoiyjhLBhmYW6cTxz/3oHp8tA1Gm9T2MaaKvDE/h+CyJItU0oidfQ0/XaQK58eYhQjdpk3UuJsPC+bkHCKd5mW801r9aqL8Umn9IYNr+/nt2TbXQS+E5YUOjmRZvH8= 26 | - secure: XpsjH9kJ9vPZZsqyOdcRLJcVQAPsq7+KcYwvbePQy1k5p2oTLFUUGjhCZgTuw9vgM4LEcRqC+Kw4yiiBRhW9vfza9L6oYWwWisdu4toEu2cSA/KXx6iq+tgVwzPrI6dpNExin1ggEhTjuwFB7S5z8pDL2hiU3BgYJK8WOPW61SW6+R3LICSiIGldEmz5E5M5uvOoBPWlvIAnBKOp81fFvOXKe7FYtYKXy1L8VfdpJA7Q87bUHxPMCoAxD1NJFKpsTrdGSMlQp0pq/Kp98RtVBu0LUnHb69By4gOwyMJ5D/UYrzXJbBzYwaj6EyGfsLVDrRK7mghmIKdkA5wSkJWhdubffEIpM551JB8NCqAV6YWAeM/Ojly9bCHlMpIUlMpi56KT7A5TuXPfU+Htbq2BLkt86MzbvM+ry00q46GQhApL2L9l/3w9EavXuOSxYMF51ysm5lFqRKtCbERNmulnpdB30E0phrUbGc1LLkSRxt/GqVPeLUWEjavK7IdeXUvDiFTc1virT4v1aYkXodOnvWIjem9Zc93tEuR8YNSi+8nQqa/BxhZyDOyzyKDQRW/r19lxmgP2oBkpQ0KbjjPCG9WyistG847AFxr7LfRWQbM4pYP/xEKHTW3LjoSQisE8sK2jHDkv66L0IAcvH0Apb9nGkoJCV51FEj1vWZxuFuM= 27 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | ## [5.1.1](https://github.com/typographist/postcss/compare/v5.1.0...v5.1.1) (2019-11-12) 2 | 3 | 4 | ### Bug Fixes 5 | 6 | * fix function "calcMaxWidth" ([5d80431](https://github.com/typographist/postcss/commit/5d804318fb1fdd25d9852faf5458002c3847d6dd)) 7 | 8 | # [5.1.0](https://github.com/typographist/postcss/compare/v5.0.4...v5.1.0) (2019-11-12) 9 | 10 | 11 | ### Features 12 | 13 | * add ratios ([12940bb](https://github.com/typographist/postcss/commit/12940bb980dce94a5953df2ed18440fa87a6d79a)) 14 | 15 | ## [5.0.4](https://github.com/typographist/postcss/compare/v5.0.3...v5.0.4) (2019-10-13) 16 | 17 | 18 | ### Bug Fixes 19 | 20 | * add export default for plugin ([6f01227](https://github.com/typographist/postcss/commit/6f01227bea9136ebfc28b1e03f9c2ec8b5b0fbbc)) 21 | * fix path for plugin ([b04929c](https://github.com/typographist/postcss/commit/b04929c2c7ad675d3b3fcd99e1bd5a15e4efd2b9)) 22 | 23 | ## [5.0.3](https://github.com/typographist/postcss/compare/v5.0.2...v5.0.3) (2019-07-29) 24 | 25 | 26 | ### Bug Fixes 27 | 28 | * fix function "makeRootProp" ([52c9c83](https://github.com/typographist/postcss/commit/52c9c83)) 29 | * fix regExp NOT_BREAKPOINT_NAMES ([aa20921](https://github.com/typographist/postcss/commit/aa20921)) 30 | * fix validation for breakpoint names ([d35692f](https://github.com/typographist/postcss/commit/d35692f)) 31 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Maxim Alyoshin mgreen097@gmail.com 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | this software and associated documentation files (the "Software"), to deal in 7 | the Software without restriction, including without limitation the rights to 8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software is furnished to do so, 10 | subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 17 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 18 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 19 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

Demo

2 | 3 | # Typographist 4 | 5 | ## Documentation 6 | 7 | - [Introduction](#introduction) 8 | - [Getting Started](#getting-started) 9 | 10 | - [Installation](#installation) 11 | - [Configuration](#configuration) 12 | - [base](#base) 13 | - [line-height](#line-height) 14 | - [ratio](#ratio) 15 | - [breakpoint](#breakpoint) 16 | - [typographist with webpack](#typographist-with-webpack) 17 | - [typographist with gulp](#typographist-with-gulp) 18 | 19 | CSS 20 | 21 | - [PostCSS syntax hightlight](#postcss-syntax-hightlight) 22 | - [Syntax peculiarity](#syntax-peculiarity) 23 | - [Root font size](#root-font-size) 24 | - [Base font size](#base-font-size) 25 | - [Breakpoints](#breakpoints) 26 | - [Step unit](#step-unit) 27 | - [T-step function](#t-step-function) 28 | - [Nesting](#nesting) 29 | 30 | ## Introduction 31 | 32 | ### What is a Typographist? 33 | 34 | The Typographist is a mobile first progressive toolkit for web designers and developers that allows you to build interfaces with responsive graphics. Having absorbed the best qualities of Sassline and Gutenberg, it significantly simplifies the process of improving typography on the web. 35 | The framework's objective is to provide developers with the most simple, powerful and flexible tool that will take over all the routine work in the form of complex calculations. The Typographist builds a basic grid to establish the correct vertical rhythm on the basis of rem, and also establishes macro-tipography, which allows paying special attention to micro-tipographic details. Also the toolkit is perfectly combined with css grid layout. 36 | 37 | ### Base type \* line-height = leading 38 | 39 | The correct vertical rhythm leads to a constant distance between the elements, which helps to clarify the structure and order of the contents and to associate it with other elements. The ultimate goal of the program is to draw the reader's attention to the text and improve the readability in general. 40 | 41 | ### Root font-size = ½ leading 42 | 43 | Typographist works by setting the root font-size as half the line-height of the standard paragraph text. The height of the baseline grid is then effectively set at 2, with increments at each 1rem. This makes it a pleasant and easy tool for creating harmony of content in your layout and typography. This is based off a technique for setting text in print documents. 44 | 45 | ## Getting Started 46 | 47 | ### Installation 48 | 49 | To install the stable version: 50 | 51 | **yarn** 52 | 53 | ``` 54 | yarn add postcss @typographist/postcss -D 55 | ``` 56 | 57 | **npm** 58 | 59 | ``` 60 | npm i postcss @typographist/postcss 61 | ``` 62 | 63 | ### Configuration 64 | 65 | 1. Connect Typographist 66 | 67 | requireJs 68 | 69 | ```js 70 | const { typographist, ratios } = require('@typographist/postcss'); 71 | ``` 72 | 73 | es6 modules 74 | 75 | ```js 76 | import { typographist, ratios } from ' @typographist/postcss'; 77 | ``` 78 | 79 | #### Base 80 | 81 | 2. Set font size for standard paragraph text. For example, I set 16px, but you can choose one that you like. Feel free to constantly experiment. 82 | Base is set for each breakpoint. 83 | 84 | ```js 85 | typographist({ 86 | base: '16px', 87 | }); 88 | ``` 89 | 90 | #### Line-height 91 | 92 | 3. Set the line-height. For example, I set 1.4. It is not necessary to specify at each breakpoint. Each next breakpoint inherits the value of line-height from the previous breakpoint. 93 | 94 | ```js 95 | typographist({ 96 | base: '16px', 97 | lineHeight: 1.4, 98 | }); 99 | ``` 100 | 101 | #### Ratio 102 | 103 | 4. Set the ratio. To do this, we use Tim Brown's Modular Scale. For example, I set a ratio equal to the minor second (~1.067) Let's see what happened. It is not necessary to specify at each breakpoint. Each next breakpoint inherits the value of line-height from the previous breakpoint. 104 | 105 | ```js 106 | typographist({ 107 | base: '16px', 108 | lineHeight: 1.4, 109 | ratio: ratios.MINOR_SECOND, 110 | }); 111 | ``` 112 | 113 | ##### Ratios 114 | 115 | | function | ratio | decimal value | 116 | | ---------------- | :-----: | :-----------: | 117 | | AUGMENTED_FOURTH | 1:√2 | 1.41421 | 118 | | DOUBLE_OCTAVE | 1:4 | 4 | 119 | | GOLDEN_SECTION | 1:1.618 | 1.618034 | 120 | | MAJOR_ELEVENTH | 3:8 | 2.666666667 | 121 | | MAJOR_SECOND | 8:9 | 1.125 | 122 | | MAJOR_SEVENTH | 8:15 | 1.875 | 123 | | MAJOR_SIXTH | 3:5 | 1.666666667 | 124 | | MAJOR_TENTH | 2:5 | 2.5 | 125 | | MAJOR_THIRD | 4:5 | 1.25 | 126 | | MAJOR_TWELFTH | 1:3 | 3 | 127 | | MINOR_SECOND | 15:16 | 1.066666667 | 128 | | MINOR_SEVENTH | 9:16 | 1.777777778 | 129 | | MINOR_THIRD | 5:6 | 1.2 | 130 | | OCTAVE | 1:2 | 2 | 131 | | PERFECT_FIFTH | 2:3 | 1.5 | 132 | | PERFECT_FOURTH | 3:4 | 1.333333333 | 133 | | PHI | 1:1.618 | 1.618034 | 134 | 135 | #### Breakpoint 136 | 137 | 5. Set the breakpoint name and breakpoint value. 138 | 139 | ```js 140 | typographist({ 141 | base: '16px', 142 | lineHeight: 1.4, 143 | ratio: ratios.MINOR_SECOND, 144 | tablet: { 145 | breakpoint: '768px', 146 | }, 147 | }); 148 | ``` 149 | 150 | You are free to choose any breakpoint name, and you can specify just how many breakpoints you need. If you are used to naming breakpoints as in bootstrap, nothing prevents you from using the usual names. 151 | 152 | ```js 153 | typographist({ 154 | base: '16px', 155 | lineHeight: 1.4, 156 | ratio: ratios.MINOR_SECOND, 157 | sm: { 158 | // your code 159 | }, 160 | md: { 161 | // your code 162 | }, 163 | lg: { 164 | // your code 165 | }, 166 | xl: { 167 | // you code 168 | }, 169 | }); 170 | ``` 171 | 172 | 6. Let's set base, line-height, and ratio for each breakpoint. For the tablet, I set the ratio to a major second = 1.125. For the desktop it will be equal to the minor third = 1.2. 173 | 174 | ```js 175 | typographist({ 176 | base: '16px', 177 | lineHeight: 1.4, 178 | ratio: ratios.MINOR_SECOND, 179 | tablet: { 180 | breakpoint: '768px', 181 | base: '17px', 182 | ratio: ratios.MAJOR_SECOND, 183 | }, 184 | desktop: { 185 | breakpoint: '992px', 186 | base: '18px', 187 | ratio: ratios.MINOR_THIRD, 188 | }, 189 | lgDesktop: { 190 | breakpoint: '1200px', 191 | base: '20px', 192 | }, 193 | }), 194 | ``` 195 | 196 | You probably noticed that I did not set a ratio for a breakpoint named lgDesktop. It's all right. As mentioned earlier, this value will be inherited from the previous breakpoint. 197 | 198 | I hope it was not difficult for you. The idea of such a simple configuration I borrowed from Skott Kellum and his remarkable project modularscale-sass. Well? Fasten your seat belts. This is where the fun begins.) 199 | 200 | #### Typographist with Webpack 201 | 202 | You need to create a `postcss.config.js` or `.postcssrc.js` 203 | 204 | ```js 205 | const { typographist, ratios } = require('typographist'); 206 | 207 | module.exports = () => ({ 208 | plugins: [ 209 | typographist({ 210 | base: '16px', 211 | lineHeight: 1.4, 212 | ratio: ratios.MINOR_SECOND, 213 | tablet: { 214 | breakpoint: '768px', 215 | base: '17px', 216 | ratio: ratios.MAJOR_SECOND, 217 | }, 218 | desktop: { 219 | breakpoint: '992px', 220 | base: '18px', 221 | ratio: ratios.MINOR_THIRD, 222 | }, 223 | lgDesktop: { 224 | breakpoint: '1200px', 225 | base: '20px', 226 | }, 227 | }), 228 | ], 229 | }); 230 | ``` 231 | 232 | #### Typographist with Gulp 233 | 234 | ```js 235 | const gulp = require('gulp'); 236 | const gulpIf = require('gulp-if'); 237 | const postcss = require('gulp-postcss'); 238 | const sourcemaps = require('gulp-sourcemaps'); 239 | const rename = require('gulp-rename'); 240 | const cssnano = require('gulp-cssnano'); 241 | const notify = require('gulp-notify'); 242 | const combine = require('stream-combiner2').obj; 243 | const { typographist, ratios } = require('typographist'); 244 | 245 | const processors = [ 246 | typographist({ 247 | base: '16px', 248 | lineHeight: 1.4, 249 | ratio: ratios.MINOR_SECOND, 250 | tablet: { 251 | breakpoint: '768px', 252 | base: '17px', 253 | ratio: ratios.MAJOR_SECOND, 254 | }, 255 | desktop: { 256 | breakpoint: '992px', 257 | base: '18px', 258 | ratio: ratios.MINOR_THIRD, 259 | }, 260 | lgDesktop: { 261 | breakpoint: '1200px', 262 | base: '20px', 263 | }, 264 | }), 265 | ]; 266 | 267 | const IS_DEVELOPMENT = 268 | !process.env.NODE_ENV || process.env.NODE_ENV === 'development'; 269 | 270 | gulp.task('styles', () => 271 | combine( 272 | gulp.src('./entryDir/entry.css'), 273 | gulpIf(IS_DEVELOPMENT, sourcemaps.init()), 274 | postcss(processors), 275 | gulpIf(IS_DEVELOPMENT, sourcemaps.write()), 276 | gulpIf(!IS_DEVELOPMENT, combine(cssnano())), 277 | rename('main.css'), 278 | gulp.dest('./outputDir/'), 279 | ).on('error', notify.onError()), 280 | ); 281 | ``` 282 | 283 | ## CSS 284 | 285 | ### Postcss syntax hightlight 286 | 287 | If you use vscode as the code editor. To avoid conflicts with the linter and to correctly postcss syntax highlighting, install the plugin PostCSS syntax. 288 | 289 | ### Root font size 290 | 291 | Input 292 | Set the root font-size. 293 | 294 | ```css 295 | :root { 296 | @root; 297 | } 298 | ``` 299 | 300 | Output 301 | 302 | ```css 303 | :root { 304 | --tablet: 768px; 305 | --desktop: 992px; 306 | --lg-desktop: 1200px; 307 | font-size: 68.75%; 308 | } 309 | @media screen and (min-width: 48em) { 310 | :root { 311 | font-size: 75%; 312 | } 313 | } 314 | @media screen and (min-width: 62em) { 315 | :root { 316 | font-size: 81.25%; 317 | } 318 | } 319 | @media screen and (min-width: 75em) { 320 | :root { 321 | font-size: 87.5%; 322 | } 323 | } 324 | ``` 325 | 326 | Using the @ root directive, we calculated the size of the root font for each breakpoint. Also now we have the opportunity to link our css and javascript to native css variables. The value of each breakpoint is converted to em. 327 | 328 | Input 329 | 330 | ```css 331 | :root { 332 | @root (fluid); 333 | } 334 | ``` 335 | 336 | Output 337 | 338 | ```css 339 | :root { 340 | --tablet: 768px; 341 | --desktop: 992px; 342 | --lg-desktop: 1200px; 343 | font-size: 68.75%; 344 | } 345 | @media screen and (min-width: 48em) { 346 | :root { 347 | font-size: calc(68.75% + 2 * ((100vw - 48em) / 224)); 348 | } 349 | } 350 | @media screen and (min-width: 62em) { 351 | :root { 352 | font-size: calc(81.25% + 1 * ((100vw - 62em) / 208)); 353 | } 354 | } 355 | @media screen and (min-width: 75em) { 356 | :root { 357 | font-size: 87.5%; 358 | } 359 | } 360 | ``` 361 | 362 | Now our font and layout have become elastic. It is possible to have precise control over responsive typography. Using calc() and viewport units you can create fluid type that scales perfectly between specific pixel values, within a specific viewport range. 363 | This was made possible by Mike Riethmuller and his formula. 364 | 365 | ### Base font size 366 | 367 | Input 368 | 369 | ```css 370 | body { 371 | @base; 372 | } 373 | ``` 374 | 375 | Output 376 | 377 | ```css 378 | body { 379 | font-size: 1.4545454545454546rem; 380 | line-height: 2rem; 381 | } 382 | @media screen and (min-width: 48em) { 383 | body { 384 | font-size: 1.4166666666666667rem; 385 | } 386 | } 387 | @media screen and (min-width: 62em) { 388 | body { 389 | font-size: 1.3846153846153846rem; 390 | } 391 | } 392 | @media screen and (min-width: 75em) { 393 | body { 394 | font-size: 1.4285714285714286rem; 395 | } 396 | } 397 | ``` 398 | 399 | The @ t-base directive sets the size of the base font to rem for each breakpoint, and also sets line-height: 2rem. 400 | 401 | ### Breakpoints 402 | 403 | #### @up 404 | 405 | @up takes as parameters the names of breakpoints, values in pixels or ems. 406 | 407 | Input 408 | 409 | ```css 410 | .your-class { 411 | @up (desktop) { 412 | /* your code */ 413 | } 414 | } 415 | ``` 416 | 417 | Output 418 | 419 | ```css 420 | @media screen and (min-width: 62em) { 421 | .your-class { 422 | /* your code */ 423 | } 424 | } 425 | ``` 426 | 427 | #### @down 428 | 429 | @down takes as parameters the names of breakpoints, values in pixels or ems. 430 | Input 431 | 432 | ```css 433 | .your-class { 434 | @down (desktop) { 435 | /* your code */ 436 | } 437 | } 438 | ``` 439 | 440 | Output 441 | 442 | ```css 443 | @media screen and (max-width: 74.99875em) { 444 | .your-class { 445 | /* your code */ 446 | } 447 | } 448 | ``` 449 | 450 | #### @only 451 | 452 | @only takes as parameters parameters only the names of breakpoints. 453 | 454 | Input 455 | 456 | ```css 457 | .your-class { 458 | @only (desktop) { 459 | /* your code */ 460 | } 461 | ``` 462 | 463 | Output 464 | 465 | ```css 466 | @media screen and (min-width: 62em) and (max-width: 74.99875em) { 467 | .test { 468 | /* your code */ 469 | } 470 | } 471 | ``` 472 | 473 | #### @between 474 | 475 | @between takes as parameters the names of breakpoints, values in pixels or ems. 476 | 477 | Input 478 | 479 | ```css 480 | .your-class @between(tablet, desktop) { 481 | /* your code */ 482 | } 483 | ``` 484 | 485 | Output 486 | 487 | ```css 488 | @media screen and (min-width: 48em) and (max-width: 74.99875em) { 489 | .your-class { 490 | /* your code */ 491 | } 492 | } 493 | ``` 494 | 495 | ### Step unit 496 | 497 | Set the font size from the position in the modular scale. 498 | 499 | position in modular scale 500 | 501 | To convert step to rem, use directives @up, @down, or @only. 502 | 503 | input 504 | 505 | ```css 506 | h1 { 507 | font-size: 6step; 508 | 509 | @-above (tablet) { 510 | font-size: 6step; 511 | } 512 | 513 | @up (desktop) { 514 | font-size: 6step; 515 | } 516 | 517 | @up (lg-desktop) { 518 | font-size: 6step; 519 | } 520 | } 521 | ``` 522 | 523 | Output 524 | 525 | ```css 526 | h1 { 527 | font-size: 2.1818181818181817rem; 528 | } 529 | @media screen and (min-width: 48em) { 530 | h1 { 531 | font-size: 2.8333333333333335rem; 532 | } 533 | } 534 | @media screen and (min-width: 62em) { 535 | h1 { 536 | font-size: 4.153846153846154rem; 537 | } 538 | } 539 | @media screen and (min-width: 75em) { 540 | h1 { 541 | font-size: 4.285714285714286rem; 542 | } 543 | } 544 | ``` 545 | 546 | Step unit is converted to rem. 547 | 548 | This approach is useful if you want to dramatically increase the font size on any of the breakpoints, but in most cases it is too cumbersome and we force you to duplicate the code every time. For this I have something better for you! 549 | 550 | ### step function 551 | 552 | With step function we do the same much faster and more gracefully. 553 | 554 | Input 555 | 556 | ```css 557 | h1 { 558 | font-size: step(6); 559 | } 560 | ``` 561 | 562 | Output 563 | 564 | ```css 565 | h1 { 566 | font-size: 2.1818181818181817rem; 567 | } 568 | @media screen and (min-width: 48em) { 569 | h1 { 570 | font-size: 2.8333333333333335rem; 571 | } 572 | } 573 | @media screen and (min-width: 62em) { 574 | h1 { 575 | font-size: 4.153846153846154rem; 576 | } 577 | } 578 | @media screen and (min-width: 75em) { 579 | h1 { 580 | font-size: 4.285714285714286rem; 581 | } 582 | } 583 | ``` 584 | 585 | ### Nesting 586 | 587 | Inheritance the name of the parent class. Do this as you are used to in sass, less and stylus. 588 | 589 | Input 590 | 591 | ```css 592 | .your-class { 593 | border: 1px solid gray; 594 | 595 | &__inner { 596 | padding: 1rem; 597 | } 598 | 599 | &__inner_active { 600 | background-color: rebeccapurple; 601 | } 602 | 603 | &:hover { 604 | border: 1px solid black; 605 | } 606 | } 607 | ``` 608 | 609 | Output 610 | 611 | ```css 612 | .your-class { 613 | border: 1px solid gray; 614 | } 615 | .your-class__inner { 616 | padding: 1rem; 617 | } 618 | .your-class__inner_active { 619 | background-color: rebeccapurple; 620 | } 621 | .your-class:hover { 622 | border: 1px solid black; 623 | } 624 | ``` 625 | 626 | MIT License 627 | 628 | Copyright (c) 2018 Maxim Alyoshin 629 | 630 | Permission is hereby granted, free of charge, to any person obtaining a copy 631 | of this software and associated documentation files (the "Software"), to deal 632 | in the Software without restriction, including without limitation the rights 633 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 634 | copies of the Software, and to permit persons to whom the Software is 635 | furnished to do so, subject to the following conditions: 636 | 637 | The above copyright notice and this permission notice shall be included in all 638 | copies or substantial portions of the Software. 639 | 640 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 641 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 642 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 643 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 644 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 645 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 646 | SOFTWARE. 647 | -------------------------------------------------------------------------------- /breakpoints/calculators.js: -------------------------------------------------------------------------------- 1 | const { toEm, toPx, toEmOrNot, hasEm, camelize } = require('../utils'); 2 | const { getNextBreakpointValue } = require('./helpers'); 3 | 4 | // normalizeBreakParams :: [String] -> String 5 | const normalizeBreakParams = (x) => camelize(String(x)); 6 | 7 | // calcMaxBreakValue :: (String | Number) -> Number 8 | const calcMaxBreakValue = (x) => toEm(parseFloat(x) - 0.02); 9 | 10 | // calcMinWidth :: Object -> [String] -> String 11 | exports.calcMinWidth = (breakpoints) => (breakpoint) => { 12 | const breakParams = normalizeBreakParams(breakpoint); 13 | 14 | return breakpoints[breakParams] 15 | ? toEm(breakpoints[breakParams].value) 16 | : toEmOrNot(breakParams); 17 | }; 18 | 19 | // calcMaxWidth :: Object -> String -> String 20 | exports.calcMaxWidth = (breakpoints) => (breakpoint) => { 21 | const breakParams = normalizeBreakParams(breakpoint); 22 | 23 | if (breakpoints[breakParams]) { 24 | const nextBreakpointValue = getNextBreakpointValue( 25 | breakParams, 26 | breakpoints, 27 | ); 28 | 29 | return calcMaxBreakValue(nextBreakpointValue); 30 | } 31 | 32 | if (hasEm(breakParams)) { 33 | return calcMaxBreakValue(toPx(breakParams)); 34 | } 35 | 36 | return calcMaxBreakValue(breakParams); 37 | }; 38 | -------------------------------------------------------------------------------- /breakpoints/helpers.js: -------------------------------------------------------------------------------- 1 | const { toKebabCase } = require('../utils'); 2 | 3 | const NOT_BREAKPOINT_NAMES = /^\(([a-z0-9-]+(,?[a-z0-9-]+)?)\).*$/i; 4 | const ALL_CHARACTERS_BEFORE_COLON = /^\(.+\):?/; 5 | const SPACES = /\s/g; 6 | 7 | // getOrientation :: String -> String 8 | const getOrientation = (x) => x.replace(ALL_CHARACTERS_BEFORE_COLON, ''); 9 | 10 | // getBreakpointValues :: String -> [String] 11 | const getBreakpointValues = (params) => 12 | params 13 | .replace(SPACES, '') 14 | .replace(NOT_BREAKPOINT_NAMES, '$1') 15 | .split(','); 16 | 17 | // makeBreakpointList :: Object -> [String] 18 | const makeBreakpointList = (x) => 19 | Object.keys(x) 20 | .slice(1) 21 | .map(toKebabCase) 22 | .join(', '); 23 | 24 | // withMinWidth :: String -> String 25 | const withMinWidth = (x) => `(min-width: ${x})`; 26 | 27 | // withMaxMedia :: String -> String 28 | const withMaxWidth = (x) => `(max-width: ${x})`; 29 | 30 | // withMinAndMaxWidth :: (String, String) -> String 31 | const withMinAndMaxWidth = (min, max) => 32 | `(min-width: ${min}) and (max-width: ${max})`; 33 | 34 | // withOrientationOrNot :: String -> String -> String 35 | const withOrientationOrNot = (orientation) => (params) => 36 | orientation ? `${params} and (orientation: ${orientation})` : params; 37 | 38 | // antecedentBreakName :: Object -> String 39 | const antecedentBreakName = (x) => Object.keys(x)[Object.keys(x).length - 2]; 40 | 41 | // getlastBreakIndex :: Object -> Number 42 | const getlastBreakIndex = (x) => Object.keys(x).length - 1; 43 | 44 | // getCurrentIndex :: (String, Object) -> Number 45 | const getCurrentIndex = (name, breakpoints) => 46 | Object.keys(breakpoints).indexOf(name); 47 | 48 | // getNextBreakpointValue :: String -> Object -> String 49 | const getNextBreakpointValue = (name, breakpoints) => { 50 | const currentIndex = getCurrentIndex(name, breakpoints); 51 | const nextBreakpointName = Object.keys(breakpoints)[currentIndex + 1]; 52 | 53 | return breakpoints[nextBreakpointName].value; 54 | }; 55 | 56 | module.exports = { 57 | getOrientation, 58 | getBreakpointValues, 59 | makeBreakpointList, 60 | withMinWidth, 61 | withMaxWidth, 62 | withMinAndMaxWidth, 63 | withOrientationOrNot, 64 | antecedentBreakName, 65 | getlastBreakIndex, 66 | getCurrentIndex, 67 | getNextBreakpointValue, 68 | }; 69 | -------------------------------------------------------------------------------- /breakpoints/media-queries.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable consistent-return */ 2 | const { pipe } = require('@typographist/core'); 3 | const { 4 | getOrientation, 5 | getBreakpointValues, 6 | withMinWidth, 7 | withMaxWidth, 8 | withMinAndMaxWidth, 9 | withOrientationOrNot, 10 | } = require('./helpers'); 11 | const { calcMinWidth, calcMaxWidth } = require('./calculators'); 12 | const { 13 | validateOrientation, 14 | validateBreakpointValue, 15 | lastBreakpointOrNot, 16 | hasTwoArguments, 17 | } = require('./validators'); 18 | 19 | // up :: (Object, Object) -> String | Void 20 | exports.up = (atrule, breakpoints) => { 21 | validateOrientation(atrule); 22 | validateBreakpointValue(breakpoints, atrule); 23 | 24 | // String -> String 25 | return pipe( 26 | getBreakpointValues, 27 | calcMinWidth(breakpoints), 28 | withMinWidth, 29 | withOrientationOrNot(getOrientation(atrule.params)), 30 | )(atrule.params); 31 | }; 32 | 33 | // down :: (Object, Object) -> String | Void 34 | exports.down = (atrule, breakpoints) => { 35 | validateOrientation(atrule); 36 | validateBreakpointValue(breakpoints, atrule); 37 | lastBreakpointOrNot(breakpoints, atrule); 38 | 39 | // String -> String 40 | return pipe( 41 | getBreakpointValues, 42 | calcMaxWidth(breakpoints), 43 | withMaxWidth, 44 | withOrientationOrNot(getOrientation(atrule.params)), 45 | )(atrule.params); 46 | }; 47 | 48 | // only :: (Object, Object) -> String | Void 49 | exports.only = (atrule, breakpoints) => { 50 | const { params } = atrule; 51 | 52 | validateOrientation(atrule); 53 | validateBreakpointValue(breakpoints, atrule); 54 | lastBreakpointOrNot(breakpoints, atrule); 55 | 56 | // min :: String -> String 57 | const min = pipe(getBreakpointValues, calcMinWidth(breakpoints)); 58 | 59 | // max :: String -> String 60 | const max = pipe(getBreakpointValues, calcMaxWidth(breakpoints)); 61 | 62 | const mediaQueries = withMinAndMaxWidth(min(params), max(params)); 63 | const withOrientation = withOrientationOrNot(getOrientation(params)); 64 | 65 | return withOrientation(mediaQueries); 66 | }; 67 | 68 | // only :: (Object, Object) -> String | Void 69 | exports.between = (atrule, breakpoints) => { 70 | const { params } = atrule; 71 | hasTwoArguments(atrule); 72 | validateBreakpointValue(breakpoints, atrule); 73 | validateOrientation(atrule); 74 | lastBreakpointOrNot(breakpoints, atrule); 75 | 76 | // min :: [String] -> String 77 | const min = (x) => { 78 | const [head] = getBreakpointValues(x); 79 | 80 | return calcMinWidth(breakpoints)(head); 81 | }; 82 | 83 | // max :: [String] -> String 84 | const max = (x) => { 85 | const [, ...tail] = getBreakpointValues(x); 86 | 87 | return calcMaxWidth(breakpoints)(tail); 88 | }; 89 | 90 | const mediaQueries = withMinAndMaxWidth(min(params), max(params)); 91 | const withOrientation = withOrientationOrNot(getOrientation(params)); 92 | 93 | return withOrientation(mediaQueries); 94 | }; 95 | -------------------------------------------------------------------------------- /breakpoints/validators.js: -------------------------------------------------------------------------------- 1 | const { camelize } = require('../utils'); 2 | 3 | const { 4 | getOrientation, 5 | getBreakpointValues, 6 | makeBreakpointList, 7 | getCurrentIndex, 8 | getlastBreakIndex, 9 | } = require('./helpers'); 10 | 11 | const HAS_PX_OR_EM = /\d+(\.\d+)?(px|em)/; 12 | const PREFIX = '[typographist]:'; 13 | 14 | // hasPxOrEm :: String -> Boolean 15 | const hasPxOrEm = (x) => HAS_PX_OR_EM.test(x); 16 | 17 | // validateOrientation :: Object -> Void 18 | const validateOrientation = (atrule) => { 19 | const orientation = getOrientation(atrule.params); 20 | const isValid = /portrait|landscape/.test(orientation) || orientation === ''; 21 | 22 | if (!isValid) { 23 | throw atrule.error( 24 | `${PREFIX} '${orientation}' is invalid orientation. Use 'portrait' or 'landscape'. Example: @up(tablet):portrait.`, 25 | ); 26 | } 27 | }; 28 | 29 | // validateBreakpointValue :: (Object, Object) -> Void 30 | const validateBreakpointValue = (breakpoints, atrule) => { 31 | getBreakpointValues(atrule.params).forEach((param) => { 32 | if (/[A-Z]/.test(param)) { 33 | throw atrule.error( 34 | `${PREFIX} '${param}' is invalid breakpoint name. Set the name to lowercase, use kebab case notation. Example: 'desktop' or 'lg-desktop'.`, 35 | ); 36 | } 37 | 38 | const isValidValue = !!breakpoints[camelize(param)] || hasPxOrEm(param); 39 | 40 | if (!isValidValue) { 41 | throw atrule.error( 42 | `${PREFIX} '${param}' is invalid breakpoint name. Use '${makeBreakpointList( 43 | breakpoints, 44 | )}' or values with pixels or ems. Example: @up(tablet) or @up(1200px) or @up(60em).`, 45 | ); 46 | } 47 | }); 48 | }; 49 | 50 | // lastBreakpointOrNot :: (Object, Object) -> Void 51 | const lastBreakpointOrNot = (breakpoints, atrule) => { 52 | const breakpointName = getBreakpointValues(atrule.params); 53 | const currentIndex = getCurrentIndex(breakpointName, breakpoints); 54 | const lastBreakIndex = getlastBreakIndex(breakpoints); 55 | 56 | if (currentIndex === lastBreakIndex) { 57 | throw atrule.error( 58 | `${PREFIX} Don't use '${breakpointName}' because it doesn't have a maximum width.`, 59 | ); 60 | } 61 | }; 62 | 63 | const hasTwoArguments = ({ params }) => { 64 | const args = getBreakpointValues(params).length; 65 | 66 | if (args < 2) { 67 | throw new Error( 68 | `${PREFIX} '@between' must have two arguments. The first is the minimum breakpoint, the second is the maximum break point.'`, 69 | ); 70 | } 71 | }; 72 | 73 | module.exports = { 74 | validateOrientation, 75 | validateBreakpointValue, 76 | lastBreakpointOrNot, 77 | hasPxOrEm, 78 | hasTwoArguments, 79 | }; 80 | -------------------------------------------------------------------------------- /commitlint.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | extends: ['@commitlint/config-conventional'], 3 | }; 4 | -------------------------------------------------------------------------------- /features/base/index.js: -------------------------------------------------------------------------------- 1 | const { rule, decl } = require('postcss'); 2 | const { toRem } = require('@typographist/core'); 3 | const { fontSizeProp, mediaQuery } = require('../elements'); 4 | 5 | // base :: (Object, Object) -> Void 6 | exports.renderBase = (atrule, breakpointsMap) => { 7 | const { 8 | initial: { root, base }, 9 | ...breaks 10 | } = breakpointsMap; 11 | 12 | if (atrule.parent && isBody(atrule.parent)) { 13 | Object.values(breaks) 14 | .reverse() 15 | .map((b) => { 16 | const body = bodyProp().append(fontSizeProp(toRem(b.root, b.base))); 17 | 18 | return atrule.parent.after(mediaQuery(b.value).append(body)); 19 | }); 20 | 21 | atrule.replaceWith(fontSizeProp(toRem(root, base)), lineHeightProp()); 22 | } else { 23 | throw atrule.error( 24 | `[typographist]: use the ${atrule} only with the 'body' selector.`, 25 | ); 26 | } 27 | }; 28 | 29 | // isBody :: Object -> Boolean 30 | function isBody({ selector }) { 31 | return selector === 'body'; 32 | } 33 | 34 | // bodyProp :: () -> Void 35 | function bodyProp() { 36 | return rule({ 37 | selector: 'body', 38 | }); 39 | } 40 | 41 | // lineHeightProp :: () -> Void 42 | function lineHeightProp() { 43 | return decl({ 44 | prop: 'line-height', 45 | value: '2rem', 46 | }); 47 | } 48 | -------------------------------------------------------------------------------- /features/base/index.spec.js: -------------------------------------------------------------------------------- 1 | const run = require('../../run'); 2 | const { userConfig } = require('../../mocks/user-config'); 3 | 4 | describe('@base', () => { 5 | it( 6 | 'should replace @base with css variables with breakpoint values, ' + 7 | 'the font size specified in percent, specify the font size for each breakpoint', 8 | () => { 9 | const source = ` 10 | body { 11 | @base; 12 | }`; 13 | 14 | const compiled = ` 15 | body { 16 | font-size: 1.6rem; 17 | line-height: 2rem; 18 | } 19 | @media (min-width: 36em) { 20 | body { 21 | font-size: 1.619047619047619rem; 22 | } 23 | } 24 | @media (min-width: 48em) { 25 | body { 26 | font-size: 1.565217391304348rem; 27 | } 28 | } 29 | @media (min-width: 62em) { 30 | body { 31 | font-size: 1.6rem; 32 | } 33 | } 34 | @media (min-width: 75em) { 35 | body { 36 | font-size: 1.6153846153846154rem; 37 | } 38 | }`; 39 | 40 | return run(source, compiled, userConfig); 41 | }, 42 | ); 43 | }); 44 | -------------------------------------------------------------------------------- /features/between/index.js: -------------------------------------------------------------------------------- 1 | const { between } = require('../../breakpoints/media-queries'); 2 | 3 | exports.renderBetween = (atrule, makeBreakpointsMap) => { 4 | atrule.name = 'media'; 5 | atrule.params = between(atrule, makeBreakpointsMap); 6 | }; 7 | -------------------------------------------------------------------------------- /features/between/index.spec.js: -------------------------------------------------------------------------------- 1 | const run = require('../../run'); 2 | const { userConfig } = require('../../mocks/user-config'); 3 | 4 | describe('@between', () => { 5 | it('should replace @between(tablet, desktop)', () => { 6 | const source = ` 7 | .test { 8 | @between(tablet, desktop) { 9 | color: hotpink; 10 | } 11 | }`; 12 | 13 | const compiled = ` 14 | @media (min-width: 36em) and (max-width: 61.99875em) { 15 | .test { 16 | color: hotpink; 17 | } 18 | }`; 19 | 20 | return run(source, compiled, userConfig); 21 | }); 22 | 23 | it('should replace @between(1000px, 2000px)', () => { 24 | const source = ` 25 | .test { 26 | @between(1000px, 2000px) { 27 | color: hotpink; 28 | } 29 | }`; 30 | 31 | const compiled = ` 32 | @media (min-width: 62.5em) and (max-width: 124.99875em) { 33 | .test { 34 | color: hotpink; 35 | } 36 | }`; 37 | 38 | return run(source, compiled, userConfig); 39 | }); 40 | 41 | it('should replace @between(30em, 50em)', () => { 42 | const source = ` 43 | .test { 44 | @between(30em, 50em) { 45 | color: hotpink; 46 | } 47 | }`; 48 | 49 | const compiled = ` 50 | @media (min-width: 30em) and (max-width: 49.99875em) { 51 | .test { 52 | color: hotpink; 53 | } 54 | }`; 55 | 56 | return run(source, compiled, userConfig); 57 | }); 58 | }); 59 | 60 | describe('@between atrule with orientation', () => { 61 | it('should replace @between(30em, 50em):landscape', () => { 62 | const source = ` 63 | .test { 64 | @between(30em, 50em):landscape { 65 | color: hotpink; 66 | } 67 | }`; 68 | 69 | const compiled = ` 70 | @media (min-width: 30em) and (max-width: 49.99875em) and (orientation: landscape) { 71 | .test { 72 | color: hotpink; 73 | } 74 | }`; 75 | 76 | return run(source, compiled, userConfig); 77 | }); 78 | 79 | it('should replace @between(30em, 50em):portrait ', () => { 80 | const source = ` 81 | .test { 82 | @between(30em, 50em):portrait { 83 | color: hotpink; 84 | } 85 | }`; 86 | 87 | const compiled = ` 88 | @media (min-width: 30em) and (max-width: 49.99875em) and (orientation: portrait) { 89 | .test { 90 | color: hotpink; 91 | } 92 | }`; 93 | 94 | return run(source, compiled, userConfig); 95 | }); 96 | }); 97 | -------------------------------------------------------------------------------- /features/bubbling-atrule/index.js: -------------------------------------------------------------------------------- 1 | const { cleanNode, transformAfterNodes } = require('../../helpers'); 2 | 3 | exports.isBubblingAtrule = ({ parent, name }) => 4 | isValidMediaQuery(name) && parent && parent.type === 'rule'; 5 | 6 | exports.bubblingAtrule = (atrule) => { 7 | cleanNode(atrule); 8 | transformAfterNodes(atrule); 9 | 10 | const parentClone = atrule.parent.clone(); 11 | const innerNodes = atrule.nodes.map(cleanNode); 12 | 13 | atrule.prepend(cleanNode(parentClone).removeAll()); 14 | 15 | cleanNode(parentClone) 16 | .removeAll() 17 | .append(innerNodes); 18 | 19 | const parent = atrule.parent.after(atrule); 20 | cleanNode(atrule); 21 | 22 | if (!parent.nodes.length) parent.remove(); 23 | }; 24 | 25 | function isValidMediaQuery(name) { 26 | return /^(up|down|only|between)$/.test(name); 27 | } 28 | -------------------------------------------------------------------------------- /features/bubbling-rule/index.js: -------------------------------------------------------------------------------- 1 | const { cleanNode, transformAfterNodes } = require('../../helpers'); 2 | 3 | // isBubblingRule :: Object -> Boolean 4 | exports.isBubblingRule = ({ parent, selector }) => 5 | parent && parent.type === 'rule' && !isNestedSelector(selector); 6 | 7 | // bubblingRule :: Object -> Void 8 | exports.bubblingRule = (rule) => { 9 | cleanNode(rule); 10 | transformAfterNodes(rule); 11 | rule.selector = `${rule.parent.selector} ${rule.selector}`; 12 | const parent = rule.parent.after(rule); 13 | cleanNode(rule); 14 | 15 | if (!parent.nodes.length) parent.remove(); 16 | }; 17 | 18 | // isNestedSelector :: String -> Boolean 19 | function isNestedSelector(selector) { 20 | return /&/.test(selector); 21 | } 22 | -------------------------------------------------------------------------------- /features/bubbling-rule/index.spec.js: -------------------------------------------------------------------------------- 1 | const run = require('../../run'); 2 | const { userConfig } = require('../../mocks/user-config'); 3 | 4 | describe('bubbling rule', () => { 5 | it('should transform bubbling rule', () => { 6 | const source = ` 7 | :global { 8 | .test { 9 | color: red; 10 | } 11 | 12 | .some-item { 13 | font-size: 1rem; 14 | } 15 | } 16 | 17 | :local { 18 | .item { 19 | width: 200px; 20 | } 21 | }`; 22 | 23 | const compiled = ` 24 | :global .test { 25 | color: red; 26 | } 27 | :global .some-item { 28 | font-size: 1rem; 29 | } 30 | :local .item { 31 | width: 200px; 32 | }`; 33 | 34 | return run(source, compiled, userConfig); 35 | }); 36 | }); 37 | -------------------------------------------------------------------------------- /features/down/index.js: -------------------------------------------------------------------------------- 1 | const { down } = require('../../breakpoints/media-queries'); 2 | 3 | exports.renderDown = (atrule, breakpointsMap) => { 4 | atrule.name = 'media'; 5 | atrule.params = down(atrule, breakpointsMap); 6 | }; 7 | -------------------------------------------------------------------------------- /features/down/index.spec.js: -------------------------------------------------------------------------------- 1 | const run = require('../../run'); 2 | const { userConfig } = require('../../mocks/user-config'); 3 | 4 | describe('@down', () => { 5 | it('should replace @down(desktop) with @media (min-width: 61.99875em)', () => { 6 | const source = ` 7 | .test { 8 | @down (desktop) { 9 | background-color: gold; 10 | } 11 | }`; 12 | 13 | const compiled = ` 14 | @media (max-width: 61.99875em) { 15 | .test { 16 | background-color: gold; 17 | } 18 | }`; 19 | 20 | return run(source, compiled, userConfig); 21 | }); 22 | 23 | it('should replace @down(1000px) with @media (min-width: 62.5em)', () => { 24 | const source = ` 25 | .test { 26 | @down (1000px) { 27 | background-color: gold; 28 | } 29 | }`; 30 | 31 | const compiled = ` 32 | @media (max-width: 62.49875em) { 33 | .test { 34 | background-color: gold; 35 | } 36 | }`; 37 | 38 | return run(source, compiled, userConfig); 39 | }); 40 | 41 | it('should replace @down(40em) with @media (min-width: 40em)', () => { 42 | const source = ` 43 | .test { 44 | @down (40em) { 45 | background-color: gold; 46 | } 47 | }`; 48 | 49 | const compiled = ` 50 | @media (max-width: 39.99875em) { 51 | .test { 52 | background-color: gold; 53 | } 54 | }`; 55 | 56 | return run(source, compiled, userConfig); 57 | }); 58 | }); 59 | 60 | describe('@down atrule with orientation', () => { 61 | it('should replace @down(desktop):landscape with @media (min-width: 61.99875em) and (orientation: landscape)', () => { 62 | const source = ` 63 | .test { 64 | @down (desktop):landscape { 65 | background-color: gold; 66 | } 67 | }`; 68 | 69 | const compiled = ` 70 | @media (max-width: 61.99875em) and (orientation: landscape) { 71 | .test { 72 | background-color: gold; 73 | } 74 | }`; 75 | 76 | return run(source, compiled, userConfig); 77 | }); 78 | 79 | it('should replace @down(desktop):portrait with @media (min-width: 61.99875em) and (orientation: portrait)', () => { 80 | const source = ` 81 | .test { 82 | @down (desktop):portrait { 83 | background-color: gold; 84 | } 85 | }`; 86 | 87 | const compiled = ` 88 | @media (max-width: 61.99875em) and (orientation: portrait) { 89 | .test { 90 | background-color: gold; 91 | } 92 | }`; 93 | 94 | return run(source, compiled, userConfig); 95 | }); 96 | }); 97 | -------------------------------------------------------------------------------- /features/elements.js: -------------------------------------------------------------------------------- 1 | const { toEm } = require('@typographist/core'); 2 | const { decl, atRule } = require('postcss'); 3 | 4 | // fontSizeProp :: (String | Number) -> Void 5 | exports.fontSizeProp = (size) => 6 | decl({ 7 | prop: 'font-size', 8 | value: size, 9 | }); 10 | 11 | // mediaQuery :: String -> Object 12 | exports.mediaQuery = (minWidth) => 13 | atRule({ 14 | name: 'media ', 15 | params: `(min-width: ${toEm(minWidth)})`, 16 | }); 17 | -------------------------------------------------------------------------------- /features/nested-rule/index.js: -------------------------------------------------------------------------------- 1 | const { cleanNode, transformAfterNodes } = require('../../helpers'); 2 | 3 | const LAST_COMMA = /,\s*$/; 4 | const LINE_BREAKS_AND_SPACES = /[\n\s]/g; 5 | const COMMA_AND_NEW_LINE = ',\n'; 6 | 7 | // isNestedRule :: Object -> Boolean 8 | exports.isNestedRule = ({ parent, selector }) => 9 | parent && parent.type === 'rule' && isNestedSelector(selector); 10 | 11 | // nestedRule :: Object -> Void 12 | exports.nestedRule = (rule) => { 13 | cleanNode(rule); 14 | transformAfterNodes(rule); 15 | rule.nodes.map(cleanNode); 16 | const selectorName = makeNestedSelectorNames(rule); 17 | 18 | rule.selector = replaceLastComma(selectorName); 19 | rule.parent.selector = replaceLastComma(rule.parent.selector); 20 | 21 | rule.parent.after(rule); 22 | cleanNode(rule); 23 | 24 | if (!rule.nodes.length) { 25 | rule.remove(); 26 | } 27 | }; 28 | 29 | // makeNestedSelectorName :: Object -> String 30 | function makeNestedSelectorNames(rule) { 31 | const parentSelectors = getRawRules(rule.parent.selector); 32 | const nestedSelectors = getRawRules(rule.selector); 33 | 34 | let selectorName = ''; 35 | for (let i = 0; i < parentSelectors.length; i += 1) { 36 | for (let j = 0; j < nestedSelectors.length; j += 1) { 37 | selectorName += 38 | makeSelectorName(nestedSelectors[j], parentSelectors[i]) + 39 | COMMA_AND_NEW_LINE; 40 | } 41 | } 42 | 43 | return selectorName; 44 | } 45 | 46 | // makeSelectorName :: (String, String) -> String 47 | function makeSelectorName(replaceable, replacer) { 48 | return replaceable.replace(/&/, replacer); 49 | } 50 | 51 | // getRawRules :: String -> [String] 52 | function getRawRules(rule) { 53 | return rule 54 | .replace(LAST_COMMA, '') 55 | .replace(LINE_BREAKS_AND_SPACES, '') 56 | .split(','); 57 | } 58 | 59 | // isNestedSelector :: String -> Boolean 60 | function isNestedSelector(selector) { 61 | return /&/.test(selector); 62 | } 63 | 64 | // replaceLastComma :: String -> String 65 | function replaceLastComma(selector) { 66 | return selector.replace(LAST_COMMA, ''); 67 | } 68 | -------------------------------------------------------------------------------- /features/nested-rule/index.spec.js: -------------------------------------------------------------------------------- 1 | const run = require('../../run'); 2 | const { userConfig } = require('../../mocks/user-config'); 3 | 4 | describe('nested rules', () => { 5 | it('should transform nested rule', () => { 6 | const source = ` 7 | .test, 8 | .some-test { 9 | font-size: 1rem; 10 | 11 | &__wrap, 12 | &__inner { 13 | font-size: 2rem; 14 | 15 | &:hover { 16 | background-color: pink; 17 | } 18 | } 19 | }`; 20 | 21 | const compiled = ` 22 | .test, 23 | .some-test { 24 | font-size: 1rem 25 | } 26 | .test__wrap, 27 | .test__inner, 28 | .some-test__wrap, 29 | .some-test__inner { 30 | font-size: 2rem; 31 | } 32 | .test__wrap:hover, 33 | .test__inner:hover, 34 | .some-test__wrap:hover, 35 | .some-test__inner:hover { 36 | background-color: pink; 37 | }`; 38 | 39 | return run(source, compiled, userConfig); 40 | }); 41 | }); 42 | -------------------------------------------------------------------------------- /features/only/index.js: -------------------------------------------------------------------------------- 1 | const { only } = require('../../breakpoints/media-queries'); 2 | 3 | exports.renderOnly = (atrule, breakpointsMap) => { 4 | atrule.name = 'media'; 5 | atrule.params = only(atrule, breakpointsMap); 6 | }; 7 | -------------------------------------------------------------------------------- /features/only/index.spec.js: -------------------------------------------------------------------------------- 1 | const run = require('../../run'); 2 | const { userConfig } = require('../../mocks/user-config'); 3 | 4 | describe('@only', () => { 5 | it('should replace @only(desktop) with @media (min-width: 48em) and (max-width: 61.99875em)', () => { 6 | const source = ` 7 | .test { 8 | @only (desktop) { 9 | background-color: rebeccapurple; 10 | } 11 | }`; 12 | 13 | const compiled = ` 14 | @media (min-width: 48em) and (max-width: 61.99875em) { 15 | .test { 16 | background-color: rebeccapurple; 17 | } 18 | }`; 19 | 20 | return run(source, compiled, userConfig); 21 | }); 22 | }); 23 | 24 | describe('@only atrule with orientation', () => { 25 | it('should replace @only(desktop):landscape with @media (min-width: 48em) and (max-width: 61.99875em) and (orientation: landscape)', () => { 26 | const source = ` 27 | .test { 28 | @only (desktop):landscape { 29 | background-color: rebeccapurple; 30 | } 31 | }`; 32 | 33 | const compiled = ` 34 | @media (min-width: 48em) and (max-width: 61.99875em) and (orientation: landscape) { 35 | .test { 36 | background-color: rebeccapurple; 37 | } 38 | }`; 39 | 40 | return run(source, compiled, userConfig); 41 | }); 42 | 43 | it('should replace @only(desktop):portrait with @media (min-width: 48em) and (max-width: 61.99875em) and (orientation: portrait)', () => { 44 | const source = ` 45 | .test { 46 | @only (desktop):portrait { 47 | background-color: rebeccapurple; 48 | } 49 | }`; 50 | 51 | const compiled = ` 52 | @media (min-width: 48em) and (max-width: 61.99875em) and (orientation: portrait) { 53 | .test { 54 | background-color: rebeccapurple; 55 | } 56 | }`; 57 | 58 | return run(source, compiled, userConfig); 59 | }); 60 | }); 61 | -------------------------------------------------------------------------------- /features/root/default-root.js: -------------------------------------------------------------------------------- 1 | const { percentage } = require('@typographist/core'); 2 | const { mediaQuery, fontSizeProp } = require('../elements'); 3 | const { makeRootProp, cssVariable } = require('./elements'); 4 | 5 | // isDefaultRoot :: Object -> Boolean 6 | exports.isDefaultRoot = ({ parent, params }) => 7 | parent && /:root|html/.test(parent.selector) && params === ''; 8 | 9 | // defaultRoot :: (Object, Object) -> Void 10 | exports.defaultRoot = (atrule, breakpointsMap) => { 11 | const { initial: firstBreakpoint, ...breaks } = breakpointsMap; 12 | const breakpoints = Object.values(breaks); 13 | 14 | addRootSizesForEachBreaks(atrule, breakpoints); 15 | addCssVariables(atrule, breaks); 16 | const fontSize = percentage(firstBreakpoint.root); 17 | atrule.replaceWith(fontSizeProp(fontSize)); 18 | }; 19 | 20 | // addCssVariables :: (Object, Object) -> [Object] 21 | function addCssVariables(atrule, breakpoints) { 22 | return Object.keys(breakpoints).map((key) => 23 | atrule.before(cssVariable(key, breakpoints[key].value)), 24 | ); 25 | } 26 | 27 | // addRootSizesForEachBreaks :: (Object, [Object]) -> Void 28 | function addRootSizesForEachBreaks(atrule, breaks) { 29 | breaks.reverse().map(({ root, value }) => { 30 | const fontSize = fontSizeProp(percentage(root)); 31 | const rootSelector = makeRootProp(atrule.parent).append(fontSize); 32 | 33 | return atrule.parent.after(mediaQuery(value).append(rootSelector)); 34 | }); 35 | } 36 | -------------------------------------------------------------------------------- /features/root/elements.js: -------------------------------------------------------------------------------- 1 | const { rule, decl } = require('postcss'); 2 | const { toKebabCase } = require('../../utils'); 3 | 4 | // makeRootProp :: Object -> Object 5 | exports.makeRootProp = ({ selector }) => 6 | rule({ 7 | selector, 8 | }); 9 | 10 | // cssVariable :: (String, String) -> Object 11 | exports.cssVariable = (name, value) => 12 | decl({ 13 | prop: `--${toKebabCase(name)}`, 14 | value, 15 | }); 16 | -------------------------------------------------------------------------------- /features/root/fluid-root.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable consistent-return */ 2 | /* eslint-disable array-callback-return */ 3 | const { percentage, toEm } = require('@typographist/core'); 4 | 5 | const { mediaQuery, fontSizeProp } = require('../elements'); 6 | const { makeRootProp, cssVariable } = require('./elements'); 7 | 8 | // isFluidRoot :: Object -> Boolean 9 | exports.isFluidRoot = ({ parent, params }) => 10 | parent && /:root|html/.test(parent.selector) && params === '(fluid)'; 11 | 12 | // defaultRoot :: (Object, Object) -> Void 13 | exports.fluidRoot = (atrule, breakpointsMap) => { 14 | const { initial: firstBreakpoint, ...breaks } = breakpointsMap; 15 | 16 | addRootSizeForEachBreakpoints(atrule, Object.values(breakpointsMap)); 17 | addCssVariables(atrule, breaks); 18 | const fontSize = percentage(firstBreakpoint.root); 19 | atrule.replaceWith(fontSizeProp(fontSize)); 20 | }; 21 | 22 | // addRootSizeForEachBreakpoints :: (Object, [Object]) -> Void 23 | function addRootSizeForEachBreakpoints(atrule, breaks) { 24 | breaks.reverse().map((_, index) => { 25 | const nextIndex = index + 1; 26 | const prevIndex = index - 1; 27 | 28 | if (index !== 0 && breaks[nextIndex]) { 29 | const currentRoot = breaks[index].root; 30 | const prevRoot = breaks[nextIndex].root; 31 | const rootDiff = currentRoot - prevRoot; 32 | 33 | const nextBreak = parseFloat(breaks[prevIndex].value); 34 | const currentBreak = parseFloat(breaks[index].value); 35 | const breaksDiff = nextBreak - currentBreak; 36 | const root = percentage(prevRoot); 37 | const breakpoint = toEm(currentBreak); 38 | 39 | const fontSize = fontSizeProp( 40 | `calc(${root} + ${rootDiff} * ((100vw - ${breakpoint}) / ${breaksDiff}))`, 41 | ); 42 | const rootSelector = makeRootProp(atrule.parent).append(fontSize); 43 | 44 | return atrule.parent.after( 45 | mediaQuery(breaks[index].value).append(rootSelector), 46 | ); 47 | } 48 | 49 | if (index === 0) { 50 | const root = percentage(breaks[index].root); 51 | const fontSize = fontSizeProp(root); 52 | const rootSelector = makeRootProp(atrule.parent).append(fontSize); 53 | 54 | return atrule.parent.after( 55 | mediaQuery(breaks[index].value).append(rootSelector), 56 | ); 57 | } 58 | }); 59 | } 60 | 61 | // addCssVariables :: (Object, Object) -> [Object] 62 | function addCssVariables(atrule, breakpoints) { 63 | return Object.keys(breakpoints).map((key) => 64 | atrule.before(cssVariable(key, breakpoints[key].value)), 65 | ); 66 | } 67 | -------------------------------------------------------------------------------- /features/root/index.js: -------------------------------------------------------------------------------- 1 | const { isDefaultRoot, defaultRoot } = require('./default-root'); 2 | const { isFluidRoot, fluidRoot } = require('./fluid-root'); 3 | 4 | exports.isRoot = ({ parent }) => parent && parent.selector === ':root'; 5 | 6 | exports.renderRoot = (atrule, breakpointsMap) => { 7 | if (atrule.parent && isRootSelector(atrule.parent)) { 8 | if (isDefaultRoot(atrule)) { 9 | defaultRoot(atrule, breakpointsMap); 10 | } 11 | 12 | if (isFluidRoot(atrule)) { 13 | fluidRoot(atrule, breakpointsMap); 14 | } 15 | } else { 16 | throw atrule.error( 17 | `[typographist]: use the ${atrule} with the ':root' or 'html' selectors.`, 18 | ); 19 | } 20 | }; 21 | 22 | function isRootSelector({ selector }) { 23 | return /:root|html/.test(selector); 24 | } 25 | -------------------------------------------------------------------------------- /features/root/index.spec.js: -------------------------------------------------------------------------------- 1 | const run = require('../../run'); 2 | const { userConfig } = require('../../mocks/user-config'); 3 | 4 | describe('@root atrule', () => { 5 | it('should relpace "@root;" with native css', () => { 6 | const source = ` 7 | :root { 8 | @root; 9 | }`; 10 | 11 | const compiled = ` 12 | :root { 13 | --tablet: 576px; 14 | --desktop: 768px; 15 | --lg-desktop: 992px; 16 | --xl-desktop: 1200px; 17 | font-size: 62.5%; 18 | } 19 | @media (min-width: 36em) { 20 | :root { 21 | font-size: 65.625%; 22 | } 23 | } 24 | @media (min-width: 48em) { 25 | :root { 26 | font-size: 71.875%; 27 | } 28 | } 29 | @media (min-width: 62em) { 30 | :root { 31 | font-size: 78.125%; 32 | } 33 | } 34 | @media (min-width: 75em) { 35 | :root { 36 | font-size: 81.25%; 37 | } 38 | }`; 39 | 40 | return run(source, compiled, userConfig); 41 | }); 42 | }); 43 | 44 | it('should replace "@root(fluid)" with native css', () => { 45 | const source = ` 46 | :root { 47 | @root(fluid); 48 | }`; 49 | 50 | const compiled = ` 51 | :root { 52 | --tablet: 576px; 53 | --desktop: 768px; 54 | --lg-desktop: 992px; 55 | --xl-desktop: 1200px; 56 | font-size: 62.5%; 57 | } 58 | @media (min-width: 36em) { 59 | :root { 60 | font-size: calc(62.5% + 0.5 * ((100vw - 36em) / 192)); 61 | } 62 | } 63 | @media (min-width: 48em) { 64 | :root { 65 | font-size: calc(65.625% + 1 * ((100vw - 48em) / 224)); 66 | } 67 | } 68 | @media (min-width: 62em) { 69 | :root { 70 | font-size: calc(71.875% + 1 * ((100vw - 62em) / 208)); 71 | } 72 | } 73 | @media (min-width: 75em) { 74 | :root { 75 | font-size: 81.25%; 76 | } 77 | }`; 78 | 79 | return run(source, compiled, userConfig); 80 | }); 81 | -------------------------------------------------------------------------------- /features/step-function/index.js: -------------------------------------------------------------------------------- 1 | const { rule } = require('postcss'); 2 | 3 | const { mediaQuery, fontSizeProp } = require('../elements'); 4 | const { makeBreakpointName, calcFontSize } = require('../../utils'); 5 | 6 | const FONT_SIZE_PROP = /^font-size$/; 7 | const STEP_FUNCTION_WITH_VALUE = /^step\(.+?\)$/; 8 | const STEP_WITH_PARENTHESES = /step\(/; 9 | const INVERCE_PARENTHESES = /\)$/; 10 | 11 | // isStepFunction :: Object -> Boolean 12 | exports.isStepFunction = ({ prop, value }) => 13 | FONT_SIZE_PROP.test(prop) && STEP_FUNCTION_WITH_VALUE.test(value); 14 | 15 | // stepFunction :: (Object, Object) -> Void 16 | exports.stepFunction = (decl, breakpointsMap) => { 17 | const stepToRem = calcFontSize(breakpointsMap); 18 | const target = makeTarget(decl.value); 19 | 20 | tailOfBreaksEntries(breakpointsMap) 21 | .reverse() 22 | .map(([name, { value }]) => { 23 | const fontSize = fontSizeProp( 24 | stepToRem(target, makeBreakpointName(name)), 25 | ); 26 | const selectorWithFontSize = parentSelector(decl.parent).append(fontSize); 27 | 28 | return decl.parent.after(mediaQuery(value).append(selectorWithFontSize)); 29 | }); 30 | 31 | decl.replaceWith(fontSizeProp(stepToRem(target))); 32 | }; 33 | 34 | // tailOfBreaksEntries :: Object -> Object 35 | function tailOfBreaksEntries({ initial, ...breaks }) { 36 | return Object.entries(breaks); 37 | } 38 | 39 | // makeTarget :: String -> String 40 | function makeTarget(x) { 41 | return x.replace(STEP_WITH_PARENTHESES, '').replace(INVERCE_PARENTHESES, ''); 42 | } 43 | 44 | // parentSelector :: Object -> Object 45 | function parentSelector({ selector }) { 46 | return rule({ 47 | selector, 48 | }); 49 | } 50 | -------------------------------------------------------------------------------- /features/step-function/index.spec.js: -------------------------------------------------------------------------------- 1 | const run = require('../../run'); 2 | const { userConfig } = require('../../mocks/user-config'); 3 | 4 | describe('transform t-step function', () => { 5 | it('should replace the t-step function with the font size in rem for each breakpoint', () => { 6 | const source = ` 7 | h1 { 8 | font-size: step(6); 9 | }`; 10 | 11 | const compiled = ` 12 | h1 { 13 | font-size: 2.4rem; 14 | } 15 | @media (min-width: 36em) { 16 | h1 { 17 | font-size: 3.238095238095238rem; 18 | } 19 | } 20 | @media (min-width: 48em) { 21 | h1 { 22 | font-size: 3.130434782608696rem; 23 | } 24 | } 25 | @media (min-width: 62em) { 26 | h1 { 27 | font-size: 4.8rem; 28 | } 29 | } 30 | @media (min-width: 75em) { 31 | h1 { 32 | font-size: 4.846153846153846rem; 33 | } 34 | }`; 35 | 36 | return run(source, compiled, userConfig); 37 | }); 38 | }); 39 | -------------------------------------------------------------------------------- /features/step/index.js: -------------------------------------------------------------------------------- 1 | const { makeBreakpointName, calcFontSize } = require('../../utils'); 2 | 3 | const FONT_SIZE_PROP = /^font-size$/; 4 | const VAL_WITH_STEP = /^-?\d+(\.\d+)?step$/; 5 | const SUITABLE_MEDIA_QUERIES = /^((up|down|only)$)|((up|down|only):(landscape|portrait))$/; 6 | 7 | const ERROR_MESSAGE = `[typographist]: Use @up, @down or @only to calculate the step.`; 8 | 9 | // isStep :: Object -> Boolean 10 | exports.isStep = ({ prop, value }) => 11 | hasFontSizeProp(prop) && hasStepUnit(value); 12 | 13 | // step :: (Object, Object) -> Void 14 | exports.step = (decl, breakpointsMap) => { 15 | const target = getTarget(decl); 16 | const stepToRem = calcFontSize(breakpointsMap); 17 | const closestRule = getClosestRule(decl); 18 | const { type, name, params } = closestRule; 19 | 20 | if (type === 'root') { 21 | decl.value = stepToRem(target); 22 | } 23 | 24 | if (isSuitableMedia(name)) { 25 | decl.value = stepToRem(target, makeBreakpointName(params)); 26 | } 27 | 28 | if (name === 'between') { 29 | throw decl.error(ERROR_MESSAGE); 30 | } 31 | }; 32 | 33 | // hasFontSizeProp :: String -> Boolean 34 | function hasFontSizeProp(prop) { 35 | return FONT_SIZE_PROP.test(prop); 36 | } 37 | 38 | // isAppropriateMedia :: String -> Boolean 39 | function isSuitableMedia(x) { 40 | return SUITABLE_MEDIA_QUERIES.test(x); 41 | } 42 | 43 | // hasStepUnit :: String -> Boolean 44 | function hasStepUnit(value) { 45 | return VAL_WITH_STEP.test(value); 46 | } 47 | 48 | // getClosestRule :: Object -> Object 49 | function getClosestRule({ parent }) { 50 | let selectorParent = parent; 51 | 52 | while (selectorParent && selectorParent.type !== 'atrule') { 53 | selectorParent = selectorParent.parent; 54 | if (selectorParent.type === 'root') { 55 | return selectorParent; 56 | } 57 | } 58 | 59 | return selectorParent; 60 | } 61 | 62 | // getTarget :: Object -> String 63 | function getTarget({ value }) { 64 | return value.replace(/step/, ''); 65 | } 66 | -------------------------------------------------------------------------------- /features/step/index.spec.js: -------------------------------------------------------------------------------- 1 | const run = require('../../run'); 2 | const { userConfig } = require('../../mocks/user-config'); 3 | 4 | describe('transform step unit function', () => { 5 | it('should transform from step to rem if @up atrule is set.', () => { 6 | const source = ` 7 | .test { 8 | @up(desktop) { 9 | font-size: 2step; 10 | } 11 | }`; 12 | const compiled = ` 13 | @media (min-width: 48em) { 14 | .test { 15 | font-size: 2rem; 16 | } 17 | }`; 18 | 19 | return run(source, compiled, userConfig); 20 | }); 21 | it('should transform step to rem if @down is set.', () => { 22 | const source = ` 23 | .test { 24 | @down(desktop) { 25 | font-size: 2step; 26 | } 27 | }`; 28 | const compiled = ` 29 | @media (max-width: 61.99875em) { 30 | .test { 31 | font-size: 2rem; 32 | } 33 | }`; 34 | 35 | return run(source, compiled, userConfig); 36 | }); 37 | it('should transform step to rem if @only is set.', () => { 38 | const source = ` 39 | .test { 40 | @only(desktop) { 41 | font-size: 2step; 42 | } 43 | }`; 44 | const compiled = ` 45 | @media (min-width: 48em) and (max-width: 61.99875em) { 46 | .test { 47 | font-size: 2rem; 48 | } 49 | }`; 50 | 51 | return run(source, compiled, userConfig); 52 | }); 53 | }); 54 | -------------------------------------------------------------------------------- /features/up/index.js: -------------------------------------------------------------------------------- 1 | const { up } = require('../../breakpoints/media-queries'); 2 | 3 | // up :: (Object, Object) -> Void 4 | exports.renderUp = (atrule, breakpointsMap) => { 5 | atrule.name = 'media'; 6 | atrule.params = up(atrule, breakpointsMap); 7 | }; 8 | -------------------------------------------------------------------------------- /features/up/index.spec.js: -------------------------------------------------------------------------------- 1 | const run = require('../../run'); 2 | const { userConfig } = require('../../mocks/user-config'); 3 | 4 | describe('@up atrule', () => { 5 | it('should replace @up(desktop) with valid media query', () => { 6 | const source = ` 7 | .test { 8 | @up(desktop) { 9 | background-color: orange; 10 | } 11 | }`; 12 | 13 | const compiled = ` 14 | @media (min-width: 48em) { 15 | .test { 16 | background-color: orange; 17 | } 18 | }`; 19 | 20 | return run(source, compiled, userConfig); 21 | }); 22 | 23 | it('should replace @up(1000px) with valid media query', () => { 24 | const source = ` 25 | .test { 26 | @up(1000px) { 27 | background-color: orange; 28 | } 29 | }`; 30 | 31 | const compiled = ` 32 | @media (min-width: 62.5em) { 33 | .test { 34 | background-color: orange; 35 | } 36 | }`; 37 | 38 | return run(source, compiled, userConfig); 39 | }); 40 | 41 | it('should replace @up(40em) with valid media query', () => { 42 | const source = ` 43 | .test { 44 | @up(40em) { 45 | background-color: orange; 46 | } 47 | }`; 48 | 49 | const compiled = ` 50 | @media (min-width: 40em) { 51 | .test { 52 | background-color: orange; 53 | } 54 | }`; 55 | 56 | return run(source, compiled, userConfig); 57 | }); 58 | }); 59 | 60 | describe('@up atrule with orientation', () => { 61 | it('should replace @up(40em):landscape with valid media query', () => { 62 | const source = ` 63 | .test { 64 | @up(40em):landscape { 65 | background-color: orange; 66 | } 67 | }`; 68 | 69 | const compiled = ` 70 | @media (min-width: 40em) and (orientation: landscape) { 71 | .test { 72 | background-color: orange; 73 | } 74 | }`; 75 | 76 | return run(source, compiled, userConfig); 77 | }); 78 | 79 | it('should replace @up(40em):portrait with valid media query', () => { 80 | const source = ` 81 | .test { 82 | @up(40em):portrait { 83 | background-color: orange; 84 | } 85 | }`; 86 | 87 | const compiled = ` 88 | @media (min-width: 40em) and (orientation: portrait) { 89 | .test { 90 | background-color: orange; 91 | } 92 | }`; 93 | 94 | return run(source, compiled, userConfig); 95 | }); 96 | }); 97 | -------------------------------------------------------------------------------- /helpers/index.js: -------------------------------------------------------------------------------- 1 | const cleanNode = (node) => { 2 | node.raws = { 3 | ...(node.raws.between ? { between: node.raws.between } : {}), 4 | ...{ semicolon: true }, 5 | ...(node.raws.important ? { important: node.raws.important } : {}), 6 | }; 7 | 8 | return node; 9 | }; 10 | 11 | const transformAfterNodes = (node) => { 12 | const affectedNodes = node.parent.nodes 13 | .slice(node.parent.nodes.indexOf(node) + 1) 14 | .map(cleanNode); 15 | 16 | if (affectedNodes.length) { 17 | const afterParent = cleanNode(node.parent.clone()).removeAll(); 18 | node.parent.after(afterParent); 19 | afterParent.append(affectedNodes); 20 | 21 | return afterParent; 22 | } 23 | 24 | return null; 25 | }; 26 | 27 | module.exports = { 28 | cleanNode, 29 | transformAfterNodes, 30 | }; 31 | -------------------------------------------------------------------------------- /img/msunit.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/typographist/postcss/b15085b2b9165b9d578ae3a2e1fb3729985d7d75/img/msunit.jpg -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | const { plugin } = require('postcss'); 2 | const { ratios, makeBreakpointsMap } = require('@typographist/core'); 3 | const { isStep, step } = require('./features/step'); 4 | const { isStepFunction, stepFunction } = require('./features/step-function'); 5 | const { isBubblingRule, bubblingRule } = require('./features/bubbling-rule'); 6 | const { isNestedRule, nestedRule } = require('./features/nested-rule'); 7 | 8 | const { 9 | isBubblingAtrule, 10 | bubblingAtrule, 11 | } = require('./features/bubbling-atrule'); 12 | 13 | const { renderUp } = require('./features/up'); 14 | const { renderBase } = require('./features/base'); 15 | const { renderDown } = require('./features/down'); 16 | const { renderBetween } = require('./features/between'); 17 | const { renderOnly } = require('./features/only'); 18 | const { renderRoot } = require('./features/root'); 19 | 20 | const defaultConfig = { 21 | base: '16px', 22 | lineHeight: 1.5, 23 | ratio: 1.333, 24 | }; 25 | 26 | const typographist = plugin( 27 | 'typographist', 28 | (config = defaultConfig) => (root) => { 29 | const breakpointsMap = makeBreakpointsMap(config); 30 | 31 | root.walkDecls((decl) => { 32 | if (isStep(decl)) { 33 | step(decl, breakpointsMap); 34 | } 35 | 36 | if (isStepFunction(decl, breakpointsMap)) { 37 | stepFunction(decl, breakpointsMap); 38 | } 39 | }); 40 | 41 | root.walkAtRules((atrule) => { 42 | if (isBubblingAtrule(atrule)) { 43 | bubblingAtrule(atrule); 44 | } 45 | }); 46 | 47 | root.walkAtRules((atrule) => { 48 | const atrules = { 49 | root: renderRoot, 50 | base: renderBase, 51 | up: renderUp, 52 | down: renderDown, 53 | only: renderOnly, 54 | between: renderBetween, 55 | }; 56 | 57 | if (atrules[atrule.name]) { 58 | atrules[atrule.name](atrule, breakpointsMap); 59 | } 60 | }); 61 | 62 | root.walkRules((rule) => { 63 | if (isBubblingRule(rule)) { 64 | bubblingRule(rule); 65 | } 66 | 67 | if (isNestedRule(rule)) { 68 | nestedRule(rule); 69 | } 70 | }); 71 | 72 | // Remove empty rules. 73 | root.walkRules((rule) => { 74 | if (!rule.nodes.length) rule.remove(); 75 | }); 76 | }, 77 | ); 78 | 79 | module.exports = { 80 | ratios, 81 | typographist, 82 | }; 83 | -------------------------------------------------------------------------------- /jest.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | collectCoverage: false, 3 | transform: { 4 | '^.+\\.js$': 'babel-jest', 5 | }, 6 | testRegex: '(/__tests__/.*|(\\.|/)(test|spec))\\.js$', 7 | moduleFileExtensions: ['js', 'json', 'node'], 8 | }; 9 | -------------------------------------------------------------------------------- /lint-staged.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | '*.{js}': ['eslint --fix', 'prettier --write', 'git add'], 3 | }; 4 | -------------------------------------------------------------------------------- /mocks/breakpoints-map.js: -------------------------------------------------------------------------------- 1 | exports.breakpointsMap = [ 2 | { 3 | root: 12, 4 | base: [16, 33], 5 | lineHeight: 1.5, 6 | ratio: 1.1880883987824906, 7 | value: '0px', 8 | name: 'default', 9 | }, 10 | { 11 | root: 13, 12 | base: 17, 13 | name: 'tablet', 14 | value: '640px', 15 | lineHeight: 1.5, 16 | ratio: 1.1880883987824906, 17 | }, 18 | { 19 | root: 16, 20 | base: 18, 21 | lineHeight: 1.7, 22 | ratio: 1.333, 23 | name: 'desktop', 24 | value: '1024px', 25 | }, 26 | { 27 | root: 17, 28 | base: 20, 29 | name: 'lgDesktop', 30 | value: '1200px', 31 | lineHeight: 1.7, 32 | ratio: 1.333, 33 | }, 34 | { 35 | root: 19, 36 | base: 22, 37 | name: 'xlDesktop', 38 | value: '1600px', 39 | lineHeight: 1.7, 40 | ratio: 1.333, 41 | }, 42 | ]; 43 | -------------------------------------------------------------------------------- /mocks/user-config.js: -------------------------------------------------------------------------------- 1 | exports.userConfig = { 2 | base: '16px', 3 | lineHeight: 1.25, 4 | ratio: 1.067, 5 | tablet: { 6 | breakpoint: '576px', 7 | base: '17px', 8 | ratio: 1.125, 9 | }, 10 | desktop: { 11 | breakpoint: '768px', 12 | base: '18px', 13 | }, 14 | lgDesktop: { 15 | breakpoint: '992px', 16 | base: '20px', 17 | ratio: 1.2, 18 | }, 19 | xlDesktop: { 20 | breakpoint: '1200px', 21 | base: '21px', 22 | }, 23 | }; 24 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@typographist/postcss", 3 | "version": "5.1.1", 4 | "description": "Toolkit for the rapid construction of interfaces with high quality typography.", 5 | "main": "index.js", 6 | "scripts": { 7 | "commit": "cross-env npx git-cz", 8 | "coverage": "cross-env cat ./coverage/lcov.info | coveralls", 9 | "pretty": "cross-env prettier './**/**/**.{json,js}' --write", 10 | "lint:all": "cross-env eslint --fix .", 11 | "lint:file": "cross-env eslint --fix", 12 | "semantic-release": "npx semantic-release", 13 | "test": "npm run test:code", 14 | "test:watch": "cross-env jest --coverage --watch", 15 | "test:code": "cross-env jest --coverage" 16 | }, 17 | "license": "MIT", 18 | "homepage": "https://github.com/typographist/postcss#readme", 19 | "repository": { 20 | "type": "git", 21 | "url": "https://github.com/typographist/postcss.git" 22 | }, 23 | "bugs": { 24 | "url": "https://github.com/typographist/postcss/issues" 25 | }, 26 | "author": "mg901 ", 27 | "keywords": [ 28 | "postcss", 29 | "css-in-js", 30 | "design", 31 | "golden-ratio", 32 | "modular", 33 | "micro-module", 34 | "vertical-rhythm", 35 | "fluid-typography", 36 | "responsive-typography", 37 | "typography", 38 | "web-typography", 39 | "modular-scale", 40 | "musical-scales", 41 | "ratio", 42 | "scale", 43 | "typographist" 44 | ], 45 | "publishConfig": { 46 | "access": "public" 47 | }, 48 | "peerDependencies": { 49 | "postcss": "^7.0.21" 50 | }, 51 | "devDependencies": { 52 | "@commitlint/cli": "^8.2.0", 53 | "@commitlint/config-conventional": "^8.2.0", 54 | "@semantic-release/changelog": "^3.0.4", 55 | "@semantic-release/commit-analyzer": "^6.2.0", 56 | "@semantic-release/git": "^7.0.16", 57 | "@semantic-release/github": "^5.5.0", 58 | "@semantic-release/npm": "^5.2.0", 59 | "@semantic-release/release-notes-generator": "^7.2.0", 60 | "commitizen": "^4.0.3", 61 | "coveralls": "^3.0.5", 62 | "cross-env": "^6.0.3", 63 | "cz-conventional-changelog": "^3.0.2", 64 | "eslint": "^6.5.1", 65 | "eslint-config-airbnb-base": "^14.0.0", 66 | "eslint-config-prettier": "^6.4.0", 67 | "eslint-plugin-import": "^2.18.2", 68 | "eslint-plugin-jest": "^23.0.3", 69 | "eslint-plugin-prettier": "^3.1.1", 70 | "husky": "^3.0.8", 71 | "jest": "^24.8.0", 72 | "lint-staged": "^9.4.2", 73 | "nyc": "14.1.1", 74 | "postcss": "^7.0.21", 75 | "prettier": "^1.18.2", 76 | "rimraf": "^3.0.0" 77 | }, 78 | "dependencies": { 79 | "@typographist/core": "^21.0.0" 80 | } 81 | } 82 | -------------------------------------------------------------------------------- /release.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | branch: 'master', 3 | plugins: [ 4 | '@semantic-release/commit-analyzer', 5 | '@semantic-release/release-notes-generator', 6 | '@semantic-release/changelog', 7 | '@semantic-release/npm', 8 | '@semantic-release/git', 9 | '@semantic-release/github', 10 | ], 11 | }; 12 | -------------------------------------------------------------------------------- /run.js: -------------------------------------------------------------------------------- 1 | const postcss = require('postcss'); 2 | const { typographist } = require('.'); 3 | 4 | module.exports = (input, output, config) => 5 | postcss([typographist(config)]) 6 | .process(input, { from: undefined }) 7 | .then((result) => { 8 | expect(result.css).toEqual(output); 9 | expect(result.warnings().length).toBe(0); 10 | }); 11 | -------------------------------------------------------------------------------- /sandbox/dist/index.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --tablet: 768px; 3 | --desktop: 992px; 4 | --lg-desktop: 1200px; 5 | font-size: 75%; 6 | } 7 | 8 | @media (min-width: 48em) { 9 | :root { 10 | font-size: calc(75% + 1 * ((100vw - 48em) / 224)); 11 | } 12 | } 13 | 14 | @media (min-width: 62em) { 15 | :root { 16 | font-size: calc(81.25% + 1.5 * ((100vw - 62em) / 208)); 17 | } 18 | } 19 | 20 | @media (min-width: 75em) { 21 | :root { 22 | font-size: 100%; 23 | } 24 | } 25 | 26 | body { 27 | font-size: 1.3333333333333333rem; 28 | line-height: 2rem; 29 | } 30 | 31 | @media (min-width: 48em) { 32 | body { 33 | font-size: 1.3076923076923077rem; 34 | } 35 | } 36 | 37 | @media (min-width: 62em) { 38 | body { 39 | font-size: 1.3103448275862069rem; 40 | } 41 | } 42 | 43 | @media (min-width: 75em) { 44 | body { 45 | font-size: 1.3125rem; 46 | } 47 | } 48 | 49 | h1 { 50 | font-size: 1.4166666666666667rem; 51 | } 52 | 53 | @media (min-width: 48em) { 54 | h1 { 55 | font-size: 1.4615384615384615rem; 56 | } 57 | } 58 | 59 | @media (min-width: 62em) { 60 | h1 { 61 | font-size: 1.5862068965517242rem; 62 | } 63 | } 64 | 65 | @media (min-width: 75em) { 66 | h1 { 67 | font-size: 1.5625rem; 68 | } 69 | } 70 | 71 | .foo { 72 | color: red; 73 | font-size: 1.3333333333333333rem; 74 | } 75 | 76 | @media (min-width: 48em) and (max-width: 61.99875em) and (orientation: portrait) { 77 | .foo { 78 | color: black; 79 | font-size: 2.076923076923077rem; 80 | } 81 | } 82 | 83 | @media (min-width: 48em) and (max-width: 74.99875em) and (orientation: landscape) { 84 | .foo { 85 | color: lightblue; 86 | } 87 | } 88 | 89 | @media (max-width: 61.99875em) and (orientation: portrait) { 90 | .foo { 91 | color: green; 92 | font-size: 1.4615384615384615rem; 93 | } 94 | } 95 | 96 | @media (min-width: 62em) and (orientation: landscape) { 97 | .foo { 98 | color: gold; 99 | font-size: 1.8620689655172413rem; 100 | } 101 | } 102 | -------------------------------------------------------------------------------- /sandbox/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "sandbox", 3 | "version": "1.0.0", 4 | "license": "MIT", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "npx postcss src/index.css -o dist/index.css -w" 8 | }, 9 | "devDependencies": { 10 | "postcss-cli": "^6.1.3" 11 | }, 12 | "dependencies": { 13 | "@typographist/postcss": "^5.1.0", 14 | "postcss": "^7.0.21" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /sandbox/postcss.config.js: -------------------------------------------------------------------------------- 1 | const { typographist, ratios } = require('@typographist/postcss'); 2 | 3 | module.exports = { 4 | plugins: [ 5 | typographist({ 6 | base: '16px', 7 | lineHeight: 1.5, 8 | ratio: ratios.MINOR_SECOND, 9 | tablet: { 10 | breakpoint: '768px', 11 | base: '17px', 12 | ratio: ratios.MAJOR_SECOND, 13 | }, 14 | desktop: { 15 | breakpoint: '992px', 16 | base: '19px', 17 | ratio: ratios.MINOR_THIRD, 18 | }, 19 | lgDesktop: { 20 | breakpoint: '1200px', 21 | base: '21px', 22 | }, 23 | }), 24 | ], 25 | }; 26 | -------------------------------------------------------------------------------- /sandbox/src/index.css: -------------------------------------------------------------------------------- 1 | :root { 2 | @root (fluid); 3 | } 4 | 5 | body { 6 | @base; 7 | } 8 | 9 | h1 { 10 | font-size: step(1); 11 | } 12 | 13 | .foo { 14 | color: red; 15 | font-size: 0step; 16 | 17 | @only (tablet): portrait { 18 | color: black; 19 | font-size: 4step; 20 | } 21 | 22 | @between (tablet, desktop):landscape { 23 | color: lightblue; 24 | } 25 | 26 | @down (tablet):portrait { 27 | color: green; 28 | font-size: 1step; 29 | } 30 | 31 | @up (desktop):landscape { 32 | color: gold; 33 | font-size: 2step; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /sandbox/yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@mrmlnc/readdir-enhanced@^2.2.1": 6 | version "2.2.1" 7 | resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" 8 | integrity sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g== 9 | dependencies: 10 | call-me-maybe "^1.0.1" 11 | glob-to-regexp "^0.3.0" 12 | 13 | "@nodelib/fs.stat@^1.1.2": 14 | version "1.1.3" 15 | resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" 16 | integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== 17 | 18 | "@types/events@*": 19 | version "3.0.0" 20 | resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" 21 | integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g== 22 | 23 | "@types/glob@^7.1.1": 24 | version "7.1.1" 25 | resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575" 26 | integrity sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w== 27 | dependencies: 28 | "@types/events" "*" 29 | "@types/minimatch" "*" 30 | "@types/node" "*" 31 | 32 | "@types/minimatch@*": 33 | version "3.0.3" 34 | resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" 35 | integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== 36 | 37 | "@types/node@*": 38 | version "12.6.8" 39 | resolved "https://registry.yarnpkg.com/@types/node/-/node-12.6.8.tgz#e469b4bf9d1c9832aee4907ba8a051494357c12c" 40 | integrity sha512-aX+gFgA5GHcDi89KG5keey2zf0WfZk/HAQotEamsK2kbey+8yGKcson0hbK8E+v0NArlCJQCqMP161YhV6ZXLg== 41 | 42 | "@typographist/core@^21.0.0": 43 | version "21.0.1" 44 | resolved "https://registry.yarnpkg.com/@typographist/core/-/core-21.0.1.tgz#95a205939055a91150555f97432f179ed592bfa2" 45 | integrity sha512-PCf/AGk8JCOo5XSkwgxWABelvCllBzti+nh8oYjhv9A6mrZJ0lTyePrU4s3Y9bYu9ao/viCX5pcDNgEZHhiPhA== 46 | 47 | "@typographist/postcss@^5.1.0": 48 | version "5.1.0" 49 | resolved "https://registry.yarnpkg.com/@typographist/postcss/-/postcss-5.1.0.tgz#29faeb50a47d8f193f471a402c0ca4da498c2e3d" 50 | integrity sha512-H46DDJygt3BrWVZLyftBk5dQHa1WWg0m0YwVtBU9l7POZa4nS1O/K15kar5FT5FNUYzI4aTjFoqoBiOfIVZg2g== 51 | dependencies: 52 | "@typographist/core" "^21.0.0" 53 | postcss "^7.0.18" 54 | 55 | abbrev@1: 56 | version "1.1.1" 57 | resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" 58 | integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== 59 | 60 | ansi-regex@^2.0.0: 61 | version "2.1.1" 62 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 63 | integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= 64 | 65 | ansi-regex@^3.0.0: 66 | version "3.0.0" 67 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" 68 | integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= 69 | 70 | ansi-styles@^3.2.1: 71 | version "3.2.1" 72 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 73 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 74 | dependencies: 75 | color-convert "^1.9.0" 76 | 77 | anymatch@^2.0.0: 78 | version "2.0.0" 79 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" 80 | integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== 81 | dependencies: 82 | micromatch "^3.1.4" 83 | normalize-path "^2.1.1" 84 | 85 | aproba@^1.0.3: 86 | version "1.2.0" 87 | resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" 88 | integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== 89 | 90 | are-we-there-yet@~1.1.2: 91 | version "1.1.5" 92 | resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" 93 | integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== 94 | dependencies: 95 | delegates "^1.0.0" 96 | readable-stream "^2.0.6" 97 | 98 | argparse@^1.0.7: 99 | version "1.0.10" 100 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" 101 | integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== 102 | dependencies: 103 | sprintf-js "~1.0.2" 104 | 105 | arr-diff@^4.0.0: 106 | version "4.0.0" 107 | resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" 108 | integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= 109 | 110 | arr-flatten@^1.1.0: 111 | version "1.1.0" 112 | resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" 113 | integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== 114 | 115 | arr-union@^3.1.0: 116 | version "3.1.0" 117 | resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" 118 | integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= 119 | 120 | array-union@^1.0.2: 121 | version "1.0.2" 122 | resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" 123 | integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= 124 | dependencies: 125 | array-uniq "^1.0.1" 126 | 127 | array-uniq@^1.0.1: 128 | version "1.0.3" 129 | resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" 130 | integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= 131 | 132 | array-unique@^0.3.2: 133 | version "0.3.2" 134 | resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" 135 | integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= 136 | 137 | assign-symbols@^1.0.0: 138 | version "1.0.0" 139 | resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" 140 | integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= 141 | 142 | async-each@^1.0.1: 143 | version "1.0.3" 144 | resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" 145 | integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== 146 | 147 | atob@^2.1.1: 148 | version "2.1.2" 149 | resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" 150 | integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== 151 | 152 | balanced-match@^1.0.0: 153 | version "1.0.0" 154 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 155 | integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= 156 | 157 | base@^0.11.1: 158 | version "0.11.2" 159 | resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" 160 | integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== 161 | dependencies: 162 | cache-base "^1.0.1" 163 | class-utils "^0.3.5" 164 | component-emitter "^1.2.1" 165 | define-property "^1.0.0" 166 | isobject "^3.0.1" 167 | mixin-deep "^1.2.0" 168 | pascalcase "^0.1.1" 169 | 170 | binary-extensions@^1.0.0: 171 | version "1.13.1" 172 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" 173 | integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== 174 | 175 | brace-expansion@^1.1.7: 176 | version "1.1.11" 177 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 178 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 179 | dependencies: 180 | balanced-match "^1.0.0" 181 | concat-map "0.0.1" 182 | 183 | braces@^2.3.1, braces@^2.3.2: 184 | version "2.3.2" 185 | resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" 186 | integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== 187 | dependencies: 188 | arr-flatten "^1.1.0" 189 | array-unique "^0.3.2" 190 | extend-shallow "^2.0.1" 191 | fill-range "^4.0.0" 192 | isobject "^3.0.1" 193 | repeat-element "^1.1.2" 194 | snapdragon "^0.8.1" 195 | snapdragon-node "^2.0.1" 196 | split-string "^3.0.2" 197 | to-regex "^3.0.1" 198 | 199 | cache-base@^1.0.1: 200 | version "1.0.1" 201 | resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" 202 | integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== 203 | dependencies: 204 | collection-visit "^1.0.0" 205 | component-emitter "^1.2.1" 206 | get-value "^2.0.6" 207 | has-value "^1.0.0" 208 | isobject "^3.0.1" 209 | set-value "^2.0.0" 210 | to-object-path "^0.3.0" 211 | union-value "^1.0.0" 212 | unset-value "^1.0.0" 213 | 214 | call-me-maybe@^1.0.1: 215 | version "1.0.1" 216 | resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" 217 | integrity sha1-JtII6onje1y95gJQoV8DHBak1ms= 218 | 219 | caller-callsite@^2.0.0: 220 | version "2.0.0" 221 | resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" 222 | integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ= 223 | dependencies: 224 | callsites "^2.0.0" 225 | 226 | caller-path@^2.0.0: 227 | version "2.0.0" 228 | resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" 229 | integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ= 230 | dependencies: 231 | caller-callsite "^2.0.0" 232 | 233 | callsites@^2.0.0: 234 | version "2.0.0" 235 | resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" 236 | integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= 237 | 238 | camelcase@^5.0.0: 239 | version "5.3.1" 240 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" 241 | integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== 242 | 243 | chalk@^2.0.1, chalk@^2.1.0, chalk@^2.4.1, chalk@^2.4.2: 244 | version "2.4.2" 245 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" 246 | integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== 247 | dependencies: 248 | ansi-styles "^3.2.1" 249 | escape-string-regexp "^1.0.5" 250 | supports-color "^5.3.0" 251 | 252 | chokidar@^2.0.0: 253 | version "2.1.6" 254 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.6.tgz#b6cad653a929e244ce8a834244164d241fa954c5" 255 | integrity sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g== 256 | dependencies: 257 | anymatch "^2.0.0" 258 | async-each "^1.0.1" 259 | braces "^2.3.2" 260 | glob-parent "^3.1.0" 261 | inherits "^2.0.3" 262 | is-binary-path "^1.0.0" 263 | is-glob "^4.0.0" 264 | normalize-path "^3.0.0" 265 | path-is-absolute "^1.0.0" 266 | readdirp "^2.2.1" 267 | upath "^1.1.1" 268 | optionalDependencies: 269 | fsevents "^1.2.7" 270 | 271 | chownr@^1.1.1: 272 | version "1.1.2" 273 | resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.2.tgz#a18f1e0b269c8a6a5d3c86eb298beb14c3dd7bf6" 274 | integrity sha512-GkfeAQh+QNy3wquu9oIZr6SS5x7wGdSgNQvD10X3r+AZr1Oys22HW8kAmDMvNg2+Dm0TeGaEuO8gFwdBXxwO8A== 275 | 276 | class-utils@^0.3.5: 277 | version "0.3.6" 278 | resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" 279 | integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== 280 | dependencies: 281 | arr-union "^3.1.0" 282 | define-property "^0.2.5" 283 | isobject "^3.0.0" 284 | static-extend "^0.1.1" 285 | 286 | cliui@^4.0.0: 287 | version "4.1.0" 288 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" 289 | integrity sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ== 290 | dependencies: 291 | string-width "^2.1.1" 292 | strip-ansi "^4.0.0" 293 | wrap-ansi "^2.0.0" 294 | 295 | code-point-at@^1.0.0: 296 | version "1.1.0" 297 | resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" 298 | integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= 299 | 300 | collection-visit@^1.0.0: 301 | version "1.0.0" 302 | resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" 303 | integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= 304 | dependencies: 305 | map-visit "^1.0.0" 306 | object-visit "^1.0.0" 307 | 308 | color-convert@^1.9.0: 309 | version "1.9.3" 310 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 311 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 312 | dependencies: 313 | color-name "1.1.3" 314 | 315 | color-name@1.1.3: 316 | version "1.1.3" 317 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 318 | integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= 319 | 320 | component-emitter@^1.2.1: 321 | version "1.3.0" 322 | resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" 323 | integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== 324 | 325 | concat-map@0.0.1: 326 | version "0.0.1" 327 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 328 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 329 | 330 | console-control-strings@^1.0.0, console-control-strings@~1.1.0: 331 | version "1.1.0" 332 | resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" 333 | integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= 334 | 335 | copy-descriptor@^0.1.0: 336 | version "0.1.1" 337 | resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" 338 | integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= 339 | 340 | core-util-is@~1.0.0: 341 | version "1.0.2" 342 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 343 | integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= 344 | 345 | cosmiconfig@^5.0.0: 346 | version "5.2.1" 347 | resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" 348 | integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== 349 | dependencies: 350 | import-fresh "^2.0.0" 351 | is-directory "^0.3.1" 352 | js-yaml "^3.13.1" 353 | parse-json "^4.0.0" 354 | 355 | cross-spawn@^6.0.0: 356 | version "6.0.5" 357 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" 358 | integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== 359 | dependencies: 360 | nice-try "^1.0.4" 361 | path-key "^2.0.1" 362 | semver "^5.5.0" 363 | shebang-command "^1.2.0" 364 | which "^1.2.9" 365 | 366 | debug@^2.2.0, debug@^2.3.3: 367 | version "2.6.9" 368 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 369 | integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== 370 | dependencies: 371 | ms "2.0.0" 372 | 373 | debug@^3.2.6: 374 | version "3.2.6" 375 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" 376 | integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== 377 | dependencies: 378 | ms "^2.1.1" 379 | 380 | decamelize@^1.2.0: 381 | version "1.2.0" 382 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" 383 | integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= 384 | 385 | decode-uri-component@^0.2.0: 386 | version "0.2.0" 387 | resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" 388 | integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= 389 | 390 | deep-extend@^0.6.0: 391 | version "0.6.0" 392 | resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" 393 | integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== 394 | 395 | define-property@^0.2.5: 396 | version "0.2.5" 397 | resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" 398 | integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= 399 | dependencies: 400 | is-descriptor "^0.1.0" 401 | 402 | define-property@^1.0.0: 403 | version "1.0.0" 404 | resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" 405 | integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= 406 | dependencies: 407 | is-descriptor "^1.0.0" 408 | 409 | define-property@^2.0.2: 410 | version "2.0.2" 411 | resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" 412 | integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== 413 | dependencies: 414 | is-descriptor "^1.0.2" 415 | isobject "^3.0.1" 416 | 417 | delegates@^1.0.0: 418 | version "1.0.0" 419 | resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" 420 | integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= 421 | 422 | dependency-graph@^0.8.0: 423 | version "0.8.0" 424 | resolved "https://registry.yarnpkg.com/dependency-graph/-/dependency-graph-0.8.0.tgz#2da2d35ed852ecc24a5d6c17788ba57c3708755b" 425 | integrity sha512-DCvzSq2UiMsuLnj/9AL484ummEgLtZIcRS7YvtO38QnpX3vqh9nJ8P+zhu8Ja+SmLrBHO2iDbva20jq38qvBkQ== 426 | 427 | detect-libc@^1.0.2: 428 | version "1.0.3" 429 | resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" 430 | integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= 431 | 432 | dir-glob@^2.2.2: 433 | version "2.2.2" 434 | resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.2.2.tgz#fa09f0694153c8918b18ba0deafae94769fc50c4" 435 | integrity sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw== 436 | dependencies: 437 | path-type "^3.0.0" 438 | 439 | end-of-stream@^1.1.0: 440 | version "1.4.1" 441 | resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" 442 | integrity sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q== 443 | dependencies: 444 | once "^1.4.0" 445 | 446 | error-ex@^1.3.1: 447 | version "1.3.2" 448 | resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" 449 | integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== 450 | dependencies: 451 | is-arrayish "^0.2.1" 452 | 453 | escape-string-regexp@^1.0.5: 454 | version "1.0.5" 455 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 456 | integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= 457 | 458 | esprima@^4.0.0: 459 | version "4.0.1" 460 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" 461 | integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== 462 | 463 | execa@^1.0.0: 464 | version "1.0.0" 465 | resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" 466 | integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== 467 | dependencies: 468 | cross-spawn "^6.0.0" 469 | get-stream "^4.0.0" 470 | is-stream "^1.1.0" 471 | npm-run-path "^2.0.0" 472 | p-finally "^1.0.0" 473 | signal-exit "^3.0.0" 474 | strip-eof "^1.0.0" 475 | 476 | expand-brackets@^2.1.4: 477 | version "2.1.4" 478 | resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" 479 | integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= 480 | dependencies: 481 | debug "^2.3.3" 482 | define-property "^0.2.5" 483 | extend-shallow "^2.0.1" 484 | posix-character-classes "^0.1.0" 485 | regex-not "^1.0.0" 486 | snapdragon "^0.8.1" 487 | to-regex "^3.0.1" 488 | 489 | extend-shallow@^2.0.1: 490 | version "2.0.1" 491 | resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" 492 | integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= 493 | dependencies: 494 | is-extendable "^0.1.0" 495 | 496 | extend-shallow@^3.0.0, extend-shallow@^3.0.2: 497 | version "3.0.2" 498 | resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" 499 | integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= 500 | dependencies: 501 | assign-symbols "^1.0.0" 502 | is-extendable "^1.0.1" 503 | 504 | extglob@^2.0.4: 505 | version "2.0.4" 506 | resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" 507 | integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== 508 | dependencies: 509 | array-unique "^0.3.2" 510 | define-property "^1.0.0" 511 | expand-brackets "^2.1.4" 512 | extend-shallow "^2.0.1" 513 | fragment-cache "^0.2.1" 514 | regex-not "^1.0.0" 515 | snapdragon "^0.8.1" 516 | to-regex "^3.0.1" 517 | 518 | fast-glob@^2.2.6: 519 | version "2.2.7" 520 | resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.7.tgz#6953857c3afa475fff92ee6015d52da70a4cd39d" 521 | integrity sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw== 522 | dependencies: 523 | "@mrmlnc/readdir-enhanced" "^2.2.1" 524 | "@nodelib/fs.stat" "^1.1.2" 525 | glob-parent "^3.1.0" 526 | is-glob "^4.0.0" 527 | merge2 "^1.2.3" 528 | micromatch "^3.1.10" 529 | 530 | fill-range@^4.0.0: 531 | version "4.0.0" 532 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" 533 | integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= 534 | dependencies: 535 | extend-shallow "^2.0.1" 536 | is-number "^3.0.0" 537 | repeat-string "^1.6.1" 538 | to-regex-range "^2.1.0" 539 | 540 | find-up@^3.0.0: 541 | version "3.0.0" 542 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" 543 | integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== 544 | dependencies: 545 | locate-path "^3.0.0" 546 | 547 | for-in@^1.0.2: 548 | version "1.0.2" 549 | resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" 550 | integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= 551 | 552 | fragment-cache@^0.2.1: 553 | version "0.2.1" 554 | resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" 555 | integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= 556 | dependencies: 557 | map-cache "^0.2.2" 558 | 559 | fs-extra@^7.0.0: 560 | version "7.0.1" 561 | resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" 562 | integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== 563 | dependencies: 564 | graceful-fs "^4.1.2" 565 | jsonfile "^4.0.0" 566 | universalify "^0.1.0" 567 | 568 | fs-minipass@^1.2.5: 569 | version "1.2.6" 570 | resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.6.tgz#2c5cc30ded81282bfe8a0d7c7c1853ddeb102c07" 571 | integrity sha512-crhvyXcMejjv3Z5d2Fa9sf5xLYVCF5O1c71QxbVnbLsmYMBEvDAftewesN/HhY03YRoA7zOMxjNGrF5svGaaeQ== 572 | dependencies: 573 | minipass "^2.2.1" 574 | 575 | fs.realpath@^1.0.0: 576 | version "1.0.0" 577 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 578 | integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= 579 | 580 | fsevents@^1.2.7: 581 | version "1.2.9" 582 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.9.tgz#3f5ed66583ccd6f400b5a00db6f7e861363e388f" 583 | integrity sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw== 584 | dependencies: 585 | nan "^2.12.1" 586 | node-pre-gyp "^0.12.0" 587 | 588 | gauge@~2.7.3: 589 | version "2.7.4" 590 | resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" 591 | integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= 592 | dependencies: 593 | aproba "^1.0.3" 594 | console-control-strings "^1.0.0" 595 | has-unicode "^2.0.0" 596 | object-assign "^4.1.0" 597 | signal-exit "^3.0.0" 598 | string-width "^1.0.1" 599 | strip-ansi "^3.0.1" 600 | wide-align "^1.1.0" 601 | 602 | get-caller-file@^1.0.1: 603 | version "1.0.3" 604 | resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" 605 | integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== 606 | 607 | get-stdin@^6.0.0: 608 | version "6.0.0" 609 | resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b" 610 | integrity sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g== 611 | 612 | get-stream@^4.0.0: 613 | version "4.1.0" 614 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" 615 | integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== 616 | dependencies: 617 | pump "^3.0.0" 618 | 619 | get-value@^2.0.3, get-value@^2.0.6: 620 | version "2.0.6" 621 | resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" 622 | integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= 623 | 624 | glob-parent@^3.1.0: 625 | version "3.1.0" 626 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" 627 | integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= 628 | dependencies: 629 | is-glob "^3.1.0" 630 | path-dirname "^1.0.0" 631 | 632 | glob-to-regexp@^0.3.0: 633 | version "0.3.0" 634 | resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" 635 | integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs= 636 | 637 | glob@^7.1.3: 638 | version "7.1.4" 639 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" 640 | integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== 641 | dependencies: 642 | fs.realpath "^1.0.0" 643 | inflight "^1.0.4" 644 | inherits "2" 645 | minimatch "^3.0.4" 646 | once "^1.3.0" 647 | path-is-absolute "^1.0.0" 648 | 649 | globby@^9.0.0: 650 | version "9.2.0" 651 | resolved "https://registry.yarnpkg.com/globby/-/globby-9.2.0.tgz#fd029a706c703d29bdd170f4b6db3a3f7a7cb63d" 652 | integrity sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg== 653 | dependencies: 654 | "@types/glob" "^7.1.1" 655 | array-union "^1.0.2" 656 | dir-glob "^2.2.2" 657 | fast-glob "^2.2.6" 658 | glob "^7.1.3" 659 | ignore "^4.0.3" 660 | pify "^4.0.1" 661 | slash "^2.0.0" 662 | 663 | graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6: 664 | version "4.2.0" 665 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.0.tgz#8d8fdc73977cb04104721cb53666c1ca64cd328b" 666 | integrity sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg== 667 | 668 | has-flag@^3.0.0: 669 | version "3.0.0" 670 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 671 | integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= 672 | 673 | has-unicode@^2.0.0: 674 | version "2.0.1" 675 | resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" 676 | integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= 677 | 678 | has-value@^0.3.1: 679 | version "0.3.1" 680 | resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" 681 | integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= 682 | dependencies: 683 | get-value "^2.0.3" 684 | has-values "^0.1.4" 685 | isobject "^2.0.0" 686 | 687 | has-value@^1.0.0: 688 | version "1.0.0" 689 | resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" 690 | integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= 691 | dependencies: 692 | get-value "^2.0.6" 693 | has-values "^1.0.0" 694 | isobject "^3.0.0" 695 | 696 | has-values@^0.1.4: 697 | version "0.1.4" 698 | resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" 699 | integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= 700 | 701 | has-values@^1.0.0: 702 | version "1.0.0" 703 | resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" 704 | integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= 705 | dependencies: 706 | is-number "^3.0.0" 707 | kind-of "^4.0.0" 708 | 709 | iconv-lite@^0.4.4: 710 | version "0.4.24" 711 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 712 | integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== 713 | dependencies: 714 | safer-buffer ">= 2.1.2 < 3" 715 | 716 | ignore-walk@^3.0.1: 717 | version "3.0.1" 718 | resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" 719 | integrity sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ== 720 | dependencies: 721 | minimatch "^3.0.4" 722 | 723 | ignore@^4.0.3: 724 | version "4.0.6" 725 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" 726 | integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== 727 | 728 | import-cwd@^2.0.0: 729 | version "2.1.0" 730 | resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-2.1.0.tgz#aa6cf36e722761285cb371ec6519f53e2435b0a9" 731 | integrity sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk= 732 | dependencies: 733 | import-from "^2.1.0" 734 | 735 | import-fresh@^2.0.0: 736 | version "2.0.0" 737 | resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" 738 | integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY= 739 | dependencies: 740 | caller-path "^2.0.0" 741 | resolve-from "^3.0.0" 742 | 743 | import-from@^2.1.0: 744 | version "2.1.0" 745 | resolved "https://registry.yarnpkg.com/import-from/-/import-from-2.1.0.tgz#335db7f2a7affd53aaa471d4b8021dee36b7f3b1" 746 | integrity sha1-M1238qev/VOqpHHUuAId7ja387E= 747 | dependencies: 748 | resolve-from "^3.0.0" 749 | 750 | inflight@^1.0.4: 751 | version "1.0.6" 752 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 753 | integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= 754 | dependencies: 755 | once "^1.3.0" 756 | wrappy "1" 757 | 758 | inherits@2, inherits@^2.0.3, inherits@~2.0.3: 759 | version "2.0.4" 760 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 761 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 762 | 763 | ini@~1.3.0: 764 | version "1.3.5" 765 | resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" 766 | integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== 767 | 768 | invert-kv@^2.0.0: 769 | version "2.0.0" 770 | resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" 771 | integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== 772 | 773 | is-accessor-descriptor@^0.1.6: 774 | version "0.1.6" 775 | resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" 776 | integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= 777 | dependencies: 778 | kind-of "^3.0.2" 779 | 780 | is-accessor-descriptor@^1.0.0: 781 | version "1.0.0" 782 | resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" 783 | integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== 784 | dependencies: 785 | kind-of "^6.0.0" 786 | 787 | is-arrayish@^0.2.1: 788 | version "0.2.1" 789 | resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" 790 | integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= 791 | 792 | is-binary-path@^1.0.0: 793 | version "1.0.1" 794 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" 795 | integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= 796 | dependencies: 797 | binary-extensions "^1.0.0" 798 | 799 | is-buffer@^1.1.5: 800 | version "1.1.6" 801 | resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" 802 | integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== 803 | 804 | is-data-descriptor@^0.1.4: 805 | version "0.1.4" 806 | resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" 807 | integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= 808 | dependencies: 809 | kind-of "^3.0.2" 810 | 811 | is-data-descriptor@^1.0.0: 812 | version "1.0.0" 813 | resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" 814 | integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== 815 | dependencies: 816 | kind-of "^6.0.0" 817 | 818 | is-descriptor@^0.1.0: 819 | version "0.1.6" 820 | resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" 821 | integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== 822 | dependencies: 823 | is-accessor-descriptor "^0.1.6" 824 | is-data-descriptor "^0.1.4" 825 | kind-of "^5.0.0" 826 | 827 | is-descriptor@^1.0.0, is-descriptor@^1.0.2: 828 | version "1.0.2" 829 | resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" 830 | integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== 831 | dependencies: 832 | is-accessor-descriptor "^1.0.0" 833 | is-data-descriptor "^1.0.0" 834 | kind-of "^6.0.2" 835 | 836 | is-directory@^0.3.1: 837 | version "0.3.1" 838 | resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" 839 | integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= 840 | 841 | is-extendable@^0.1.0, is-extendable@^0.1.1: 842 | version "0.1.1" 843 | resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" 844 | integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= 845 | 846 | is-extendable@^1.0.1: 847 | version "1.0.1" 848 | resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" 849 | integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== 850 | dependencies: 851 | is-plain-object "^2.0.4" 852 | 853 | is-extglob@^2.1.0, is-extglob@^2.1.1: 854 | version "2.1.1" 855 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 856 | integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= 857 | 858 | is-fullwidth-code-point@^1.0.0: 859 | version "1.0.0" 860 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" 861 | integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= 862 | dependencies: 863 | number-is-nan "^1.0.0" 864 | 865 | is-fullwidth-code-point@^2.0.0: 866 | version "2.0.0" 867 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 868 | integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= 869 | 870 | is-glob@^3.1.0: 871 | version "3.1.0" 872 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" 873 | integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= 874 | dependencies: 875 | is-extglob "^2.1.0" 876 | 877 | is-glob@^4.0.0: 878 | version "4.0.1" 879 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" 880 | integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== 881 | dependencies: 882 | is-extglob "^2.1.1" 883 | 884 | is-number@^3.0.0: 885 | version "3.0.0" 886 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" 887 | integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= 888 | dependencies: 889 | kind-of "^3.0.2" 890 | 891 | is-plain-object@^2.0.3, is-plain-object@^2.0.4: 892 | version "2.0.4" 893 | resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" 894 | integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== 895 | dependencies: 896 | isobject "^3.0.1" 897 | 898 | is-stream@^1.1.0: 899 | version "1.1.0" 900 | resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" 901 | integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= 902 | 903 | is-windows@^1.0.2: 904 | version "1.0.2" 905 | resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" 906 | integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== 907 | 908 | isarray@1.0.0, isarray@~1.0.0: 909 | version "1.0.0" 910 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 911 | integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= 912 | 913 | isexe@^2.0.0: 914 | version "2.0.0" 915 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 916 | integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= 917 | 918 | isobject@^2.0.0: 919 | version "2.1.0" 920 | resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" 921 | integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= 922 | dependencies: 923 | isarray "1.0.0" 924 | 925 | isobject@^3.0.0, isobject@^3.0.1: 926 | version "3.0.1" 927 | resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" 928 | integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= 929 | 930 | js-yaml@^3.13.1: 931 | version "3.13.1" 932 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" 933 | integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== 934 | dependencies: 935 | argparse "^1.0.7" 936 | esprima "^4.0.0" 937 | 938 | json-parse-better-errors@^1.0.1: 939 | version "1.0.2" 940 | resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" 941 | integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== 942 | 943 | jsonfile@^4.0.0: 944 | version "4.0.0" 945 | resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" 946 | integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= 947 | optionalDependencies: 948 | graceful-fs "^4.1.6" 949 | 950 | kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: 951 | version "3.2.2" 952 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" 953 | integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= 954 | dependencies: 955 | is-buffer "^1.1.5" 956 | 957 | kind-of@^4.0.0: 958 | version "4.0.0" 959 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" 960 | integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= 961 | dependencies: 962 | is-buffer "^1.1.5" 963 | 964 | kind-of@^5.0.0: 965 | version "5.1.0" 966 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" 967 | integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== 968 | 969 | kind-of@^6.0.0, kind-of@^6.0.2: 970 | version "6.0.2" 971 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" 972 | integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== 973 | 974 | lcid@^2.0.0: 975 | version "2.0.0" 976 | resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" 977 | integrity sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA== 978 | dependencies: 979 | invert-kv "^2.0.0" 980 | 981 | locate-path@^3.0.0: 982 | version "3.0.0" 983 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" 984 | integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== 985 | dependencies: 986 | p-locate "^3.0.0" 987 | path-exists "^3.0.0" 988 | 989 | lodash@^4.17.11: 990 | version "4.17.15" 991 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" 992 | integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== 993 | 994 | log-symbols@^2.2.0: 995 | version "2.2.0" 996 | resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" 997 | integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg== 998 | dependencies: 999 | chalk "^2.0.1" 1000 | 1001 | map-age-cleaner@^0.1.1: 1002 | version "0.1.3" 1003 | resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" 1004 | integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== 1005 | dependencies: 1006 | p-defer "^1.0.0" 1007 | 1008 | map-cache@^0.2.2: 1009 | version "0.2.2" 1010 | resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" 1011 | integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= 1012 | 1013 | map-visit@^1.0.0: 1014 | version "1.0.0" 1015 | resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" 1016 | integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= 1017 | dependencies: 1018 | object-visit "^1.0.0" 1019 | 1020 | mem@^4.0.0: 1021 | version "4.3.0" 1022 | resolved "https://registry.yarnpkg.com/mem/-/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178" 1023 | integrity sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w== 1024 | dependencies: 1025 | map-age-cleaner "^0.1.1" 1026 | mimic-fn "^2.0.0" 1027 | p-is-promise "^2.0.0" 1028 | 1029 | merge2@^1.2.3: 1030 | version "1.2.3" 1031 | resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.2.3.tgz#7ee99dbd69bb6481689253f018488a1b902b0ed5" 1032 | integrity sha512-gdUU1Fwj5ep4kplwcmftruWofEFt6lfpkkr3h860CXbAB9c3hGb55EOL2ali0Td5oebvW0E1+3Sr+Ur7XfKpRA== 1033 | 1034 | micromatch@^3.1.10, micromatch@^3.1.4: 1035 | version "3.1.10" 1036 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" 1037 | integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== 1038 | dependencies: 1039 | arr-diff "^4.0.0" 1040 | array-unique "^0.3.2" 1041 | braces "^2.3.1" 1042 | define-property "^2.0.2" 1043 | extend-shallow "^3.0.2" 1044 | extglob "^2.0.4" 1045 | fragment-cache "^0.2.1" 1046 | kind-of "^6.0.2" 1047 | nanomatch "^1.2.9" 1048 | object.pick "^1.3.0" 1049 | regex-not "^1.0.0" 1050 | snapdragon "^0.8.1" 1051 | to-regex "^3.0.2" 1052 | 1053 | mimic-fn@^2.0.0: 1054 | version "2.1.0" 1055 | resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" 1056 | integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== 1057 | 1058 | minimatch@^3.0.4: 1059 | version "3.0.4" 1060 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 1061 | integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== 1062 | dependencies: 1063 | brace-expansion "^1.1.7" 1064 | 1065 | minimist@0.0.8: 1066 | version "0.0.8" 1067 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 1068 | integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= 1069 | 1070 | minimist@^1.2.0: 1071 | version "1.2.0" 1072 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" 1073 | integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= 1074 | 1075 | minipass@^2.2.1, minipass@^2.3.5: 1076 | version "2.3.5" 1077 | resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848" 1078 | integrity sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA== 1079 | dependencies: 1080 | safe-buffer "^5.1.2" 1081 | yallist "^3.0.0" 1082 | 1083 | minizlib@^1.2.1: 1084 | version "1.2.1" 1085 | resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.2.1.tgz#dd27ea6136243c7c880684e8672bb3a45fd9b614" 1086 | integrity sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA== 1087 | dependencies: 1088 | minipass "^2.2.1" 1089 | 1090 | mixin-deep@^1.2.0: 1091 | version "1.3.2" 1092 | resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" 1093 | integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== 1094 | dependencies: 1095 | for-in "^1.0.2" 1096 | is-extendable "^1.0.1" 1097 | 1098 | mkdirp@^0.5.0, mkdirp@^0.5.1: 1099 | version "0.5.1" 1100 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 1101 | integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= 1102 | dependencies: 1103 | minimist "0.0.8" 1104 | 1105 | ms@2.0.0: 1106 | version "2.0.0" 1107 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 1108 | integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= 1109 | 1110 | ms@^2.1.1: 1111 | version "2.1.2" 1112 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 1113 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 1114 | 1115 | nan@^2.12.1: 1116 | version "2.14.0" 1117 | resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" 1118 | integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== 1119 | 1120 | nanomatch@^1.2.9: 1121 | version "1.2.13" 1122 | resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" 1123 | integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== 1124 | dependencies: 1125 | arr-diff "^4.0.0" 1126 | array-unique "^0.3.2" 1127 | define-property "^2.0.2" 1128 | extend-shallow "^3.0.2" 1129 | fragment-cache "^0.2.1" 1130 | is-windows "^1.0.2" 1131 | kind-of "^6.0.2" 1132 | object.pick "^1.3.0" 1133 | regex-not "^1.0.0" 1134 | snapdragon "^0.8.1" 1135 | to-regex "^3.0.1" 1136 | 1137 | needle@^2.2.1: 1138 | version "2.4.0" 1139 | resolved "https://registry.yarnpkg.com/needle/-/needle-2.4.0.tgz#6833e74975c444642590e15a750288c5f939b57c" 1140 | integrity sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg== 1141 | dependencies: 1142 | debug "^3.2.6" 1143 | iconv-lite "^0.4.4" 1144 | sax "^1.2.4" 1145 | 1146 | nice-try@^1.0.4: 1147 | version "1.0.5" 1148 | resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" 1149 | integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== 1150 | 1151 | node-pre-gyp@^0.12.0: 1152 | version "0.12.0" 1153 | resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.12.0.tgz#39ba4bb1439da030295f899e3b520b7785766149" 1154 | integrity sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A== 1155 | dependencies: 1156 | detect-libc "^1.0.2" 1157 | mkdirp "^0.5.1" 1158 | needle "^2.2.1" 1159 | nopt "^4.0.1" 1160 | npm-packlist "^1.1.6" 1161 | npmlog "^4.0.2" 1162 | rc "^1.2.7" 1163 | rimraf "^2.6.1" 1164 | semver "^5.3.0" 1165 | tar "^4" 1166 | 1167 | nopt@^4.0.1: 1168 | version "4.0.1" 1169 | resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" 1170 | integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00= 1171 | dependencies: 1172 | abbrev "1" 1173 | osenv "^0.1.4" 1174 | 1175 | normalize-path@^2.1.1: 1176 | version "2.1.1" 1177 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" 1178 | integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= 1179 | dependencies: 1180 | remove-trailing-separator "^1.0.1" 1181 | 1182 | normalize-path@^3.0.0: 1183 | version "3.0.0" 1184 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" 1185 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== 1186 | 1187 | npm-bundled@^1.0.1: 1188 | version "1.0.6" 1189 | resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.6.tgz#e7ba9aadcef962bb61248f91721cd932b3fe6bdd" 1190 | integrity sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g== 1191 | 1192 | npm-packlist@^1.1.6: 1193 | version "1.4.4" 1194 | resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.4.tgz#866224233850ac534b63d1a6e76050092b5d2f44" 1195 | integrity sha512-zTLo8UcVYtDU3gdeaFu2Xu0n0EvelfHDGuqtNIn5RO7yQj4H1TqNdBc/yZjxnWA0PVB8D3Woyp0i5B43JwQ6Vw== 1196 | dependencies: 1197 | ignore-walk "^3.0.1" 1198 | npm-bundled "^1.0.1" 1199 | 1200 | npm-run-path@^2.0.0: 1201 | version "2.0.2" 1202 | resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" 1203 | integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= 1204 | dependencies: 1205 | path-key "^2.0.0" 1206 | 1207 | npmlog@^4.0.2: 1208 | version "4.1.2" 1209 | resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" 1210 | integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== 1211 | dependencies: 1212 | are-we-there-yet "~1.1.2" 1213 | console-control-strings "~1.1.0" 1214 | gauge "~2.7.3" 1215 | set-blocking "~2.0.0" 1216 | 1217 | number-is-nan@^1.0.0: 1218 | version "1.0.1" 1219 | resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" 1220 | integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= 1221 | 1222 | object-assign@^4.1.0: 1223 | version "4.1.1" 1224 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 1225 | integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= 1226 | 1227 | object-copy@^0.1.0: 1228 | version "0.1.0" 1229 | resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" 1230 | integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= 1231 | dependencies: 1232 | copy-descriptor "^0.1.0" 1233 | define-property "^0.2.5" 1234 | kind-of "^3.0.3" 1235 | 1236 | object-visit@^1.0.0: 1237 | version "1.0.1" 1238 | resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" 1239 | integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= 1240 | dependencies: 1241 | isobject "^3.0.0" 1242 | 1243 | object.pick@^1.3.0: 1244 | version "1.3.0" 1245 | resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" 1246 | integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= 1247 | dependencies: 1248 | isobject "^3.0.1" 1249 | 1250 | once@^1.3.0, once@^1.3.1, once@^1.4.0: 1251 | version "1.4.0" 1252 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1253 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 1254 | dependencies: 1255 | wrappy "1" 1256 | 1257 | os-homedir@^1.0.0: 1258 | version "1.0.2" 1259 | resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" 1260 | integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= 1261 | 1262 | os-locale@^3.0.0: 1263 | version "3.1.0" 1264 | resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" 1265 | integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q== 1266 | dependencies: 1267 | execa "^1.0.0" 1268 | lcid "^2.0.0" 1269 | mem "^4.0.0" 1270 | 1271 | os-tmpdir@^1.0.0: 1272 | version "1.0.2" 1273 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 1274 | integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= 1275 | 1276 | osenv@^0.1.4: 1277 | version "0.1.5" 1278 | resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" 1279 | integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== 1280 | dependencies: 1281 | os-homedir "^1.0.0" 1282 | os-tmpdir "^1.0.0" 1283 | 1284 | p-defer@^1.0.0: 1285 | version "1.0.0" 1286 | resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" 1287 | integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww= 1288 | 1289 | p-finally@^1.0.0: 1290 | version "1.0.0" 1291 | resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" 1292 | integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= 1293 | 1294 | p-is-promise@^2.0.0: 1295 | version "2.1.0" 1296 | resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" 1297 | integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== 1298 | 1299 | p-limit@^2.0.0: 1300 | version "2.2.0" 1301 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.0.tgz#417c9941e6027a9abcba5092dd2904e255b5fbc2" 1302 | integrity sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ== 1303 | dependencies: 1304 | p-try "^2.0.0" 1305 | 1306 | p-locate@^3.0.0: 1307 | version "3.0.0" 1308 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" 1309 | integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== 1310 | dependencies: 1311 | p-limit "^2.0.0" 1312 | 1313 | p-try@^2.0.0: 1314 | version "2.2.0" 1315 | resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" 1316 | integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== 1317 | 1318 | parse-json@^4.0.0: 1319 | version "4.0.0" 1320 | resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" 1321 | integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= 1322 | dependencies: 1323 | error-ex "^1.3.1" 1324 | json-parse-better-errors "^1.0.1" 1325 | 1326 | pascalcase@^0.1.1: 1327 | version "0.1.1" 1328 | resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" 1329 | integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= 1330 | 1331 | path-dirname@^1.0.0: 1332 | version "1.0.2" 1333 | resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" 1334 | integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= 1335 | 1336 | path-exists@^3.0.0: 1337 | version "3.0.0" 1338 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" 1339 | integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= 1340 | 1341 | path-is-absolute@^1.0.0: 1342 | version "1.0.1" 1343 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1344 | integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 1345 | 1346 | path-key@^2.0.0, path-key@^2.0.1: 1347 | version "2.0.1" 1348 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" 1349 | integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= 1350 | 1351 | path-type@^3.0.0: 1352 | version "3.0.0" 1353 | resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" 1354 | integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== 1355 | dependencies: 1356 | pify "^3.0.0" 1357 | 1358 | pify@^2.3.0: 1359 | version "2.3.0" 1360 | resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" 1361 | integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= 1362 | 1363 | pify@^3.0.0: 1364 | version "3.0.0" 1365 | resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" 1366 | integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= 1367 | 1368 | pify@^4.0.1: 1369 | version "4.0.1" 1370 | resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" 1371 | integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== 1372 | 1373 | posix-character-classes@^0.1.0: 1374 | version "0.1.1" 1375 | resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" 1376 | integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= 1377 | 1378 | postcss-cli@^6.1.3: 1379 | version "6.1.3" 1380 | resolved "https://registry.yarnpkg.com/postcss-cli/-/postcss-cli-6.1.3.tgz#a9eec3e9cde4aaa90170546baf706f8af6f8ecec" 1381 | integrity sha512-eieqJU+OR1OFc/lQqMsDmROTJpoMZFvoAQ+82utBQ8/8qGMTfH9bBSPsTdsagYA8uvNzxHw2I2cNSSJkLAGhvw== 1382 | dependencies: 1383 | chalk "^2.1.0" 1384 | chokidar "^2.0.0" 1385 | dependency-graph "^0.8.0" 1386 | fs-extra "^7.0.0" 1387 | get-stdin "^6.0.0" 1388 | globby "^9.0.0" 1389 | postcss "^7.0.0" 1390 | postcss-load-config "^2.0.0" 1391 | postcss-reporter "^6.0.0" 1392 | pretty-hrtime "^1.0.3" 1393 | read-cache "^1.0.0" 1394 | yargs "^12.0.1" 1395 | 1396 | postcss-load-config@^2.0.0: 1397 | version "2.1.0" 1398 | resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-2.1.0.tgz#c84d692b7bb7b41ddced94ee62e8ab31b417b003" 1399 | integrity sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q== 1400 | dependencies: 1401 | cosmiconfig "^5.0.0" 1402 | import-cwd "^2.0.0" 1403 | 1404 | postcss-reporter@^6.0.0: 1405 | version "6.0.1" 1406 | resolved "https://registry.yarnpkg.com/postcss-reporter/-/postcss-reporter-6.0.1.tgz#7c055120060a97c8837b4e48215661aafb74245f" 1407 | integrity sha512-LpmQjfRWyabc+fRygxZjpRxfhRf9u/fdlKf4VHG4TSPbV2XNsuISzYW1KL+1aQzx53CAppa1bKG4APIB/DOXXw== 1408 | dependencies: 1409 | chalk "^2.4.1" 1410 | lodash "^4.17.11" 1411 | log-symbols "^2.2.0" 1412 | postcss "^7.0.7" 1413 | 1414 | postcss@^7.0.0, postcss@^7.0.7: 1415 | version "7.0.17" 1416 | resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.17.tgz#4da1bdff5322d4a0acaab4d87f3e782436bad31f" 1417 | integrity sha512-546ZowA+KZ3OasvQZHsbuEpysvwTZNGJv9EfyCQdsIDltPSWHAeTQ5fQy/Npi2ZDtLI3zs7Ps/p6wThErhm9fQ== 1418 | dependencies: 1419 | chalk "^2.4.2" 1420 | source-map "^0.6.1" 1421 | supports-color "^6.1.0" 1422 | 1423 | postcss@^7.0.18, postcss@^7.0.21: 1424 | version "7.0.21" 1425 | resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.21.tgz#06bb07824c19c2021c5d056d5b10c35b989f7e17" 1426 | integrity sha512-uIFtJElxJo29QC753JzhidoAhvp/e/Exezkdhfmt8AymWT6/5B7W1WmponYWkHk2eg6sONyTch0A3nkMPun3SQ== 1427 | dependencies: 1428 | chalk "^2.4.2" 1429 | source-map "^0.6.1" 1430 | supports-color "^6.1.0" 1431 | 1432 | pretty-hrtime@^1.0.3: 1433 | version "1.0.3" 1434 | resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1" 1435 | integrity sha1-t+PqQkNaTJsnWdmeDyAesZWALuE= 1436 | 1437 | process-nextick-args@~2.0.0: 1438 | version "2.0.1" 1439 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" 1440 | integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== 1441 | 1442 | pump@^3.0.0: 1443 | version "3.0.0" 1444 | resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" 1445 | integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== 1446 | dependencies: 1447 | end-of-stream "^1.1.0" 1448 | once "^1.3.1" 1449 | 1450 | rc@^1.2.7: 1451 | version "1.2.8" 1452 | resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" 1453 | integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== 1454 | dependencies: 1455 | deep-extend "^0.6.0" 1456 | ini "~1.3.0" 1457 | minimist "^1.2.0" 1458 | strip-json-comments "~2.0.1" 1459 | 1460 | read-cache@^1.0.0: 1461 | version "1.0.0" 1462 | resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" 1463 | integrity sha1-5mTvMRYRZsl1HNvo28+GtftY93Q= 1464 | dependencies: 1465 | pify "^2.3.0" 1466 | 1467 | readable-stream@^2.0.2, readable-stream@^2.0.6: 1468 | version "2.3.6" 1469 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" 1470 | integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== 1471 | dependencies: 1472 | core-util-is "~1.0.0" 1473 | inherits "~2.0.3" 1474 | isarray "~1.0.0" 1475 | process-nextick-args "~2.0.0" 1476 | safe-buffer "~5.1.1" 1477 | string_decoder "~1.1.1" 1478 | util-deprecate "~1.0.1" 1479 | 1480 | readdirp@^2.2.1: 1481 | version "2.2.1" 1482 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" 1483 | integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== 1484 | dependencies: 1485 | graceful-fs "^4.1.11" 1486 | micromatch "^3.1.10" 1487 | readable-stream "^2.0.2" 1488 | 1489 | regex-not@^1.0.0, regex-not@^1.0.2: 1490 | version "1.0.2" 1491 | resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" 1492 | integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== 1493 | dependencies: 1494 | extend-shallow "^3.0.2" 1495 | safe-regex "^1.1.0" 1496 | 1497 | remove-trailing-separator@^1.0.1: 1498 | version "1.1.0" 1499 | resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" 1500 | integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= 1501 | 1502 | repeat-element@^1.1.2: 1503 | version "1.1.3" 1504 | resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" 1505 | integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== 1506 | 1507 | repeat-string@^1.6.1: 1508 | version "1.6.1" 1509 | resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" 1510 | integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= 1511 | 1512 | require-directory@^2.1.1: 1513 | version "2.1.1" 1514 | resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" 1515 | integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= 1516 | 1517 | require-main-filename@^1.0.1: 1518 | version "1.0.1" 1519 | resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" 1520 | integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= 1521 | 1522 | resolve-from@^3.0.0: 1523 | version "3.0.0" 1524 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" 1525 | integrity sha1-six699nWiBvItuZTM17rywoYh0g= 1526 | 1527 | resolve-url@^0.2.1: 1528 | version "0.2.1" 1529 | resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" 1530 | integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= 1531 | 1532 | ret@~0.1.10: 1533 | version "0.1.15" 1534 | resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" 1535 | integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== 1536 | 1537 | rimraf@^2.6.1: 1538 | version "2.6.3" 1539 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" 1540 | integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== 1541 | dependencies: 1542 | glob "^7.1.3" 1543 | 1544 | safe-buffer@^5.1.2: 1545 | version "5.2.0" 1546 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" 1547 | integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== 1548 | 1549 | safe-buffer@~5.1.0, safe-buffer@~5.1.1: 1550 | version "5.1.2" 1551 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 1552 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 1553 | 1554 | safe-regex@^1.1.0: 1555 | version "1.1.0" 1556 | resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" 1557 | integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= 1558 | dependencies: 1559 | ret "~0.1.10" 1560 | 1561 | "safer-buffer@>= 2.1.2 < 3": 1562 | version "2.1.2" 1563 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 1564 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 1565 | 1566 | sax@^1.2.4: 1567 | version "1.2.4" 1568 | resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" 1569 | integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== 1570 | 1571 | semver@^5.3.0, semver@^5.5.0: 1572 | version "5.7.0" 1573 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b" 1574 | integrity sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA== 1575 | 1576 | set-blocking@^2.0.0, set-blocking@~2.0.0: 1577 | version "2.0.0" 1578 | resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" 1579 | integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= 1580 | 1581 | set-value@^2.0.0, set-value@^2.0.1: 1582 | version "2.0.1" 1583 | resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" 1584 | integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== 1585 | dependencies: 1586 | extend-shallow "^2.0.1" 1587 | is-extendable "^0.1.1" 1588 | is-plain-object "^2.0.3" 1589 | split-string "^3.0.1" 1590 | 1591 | shebang-command@^1.2.0: 1592 | version "1.2.0" 1593 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" 1594 | integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= 1595 | dependencies: 1596 | shebang-regex "^1.0.0" 1597 | 1598 | shebang-regex@^1.0.0: 1599 | version "1.0.0" 1600 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" 1601 | integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= 1602 | 1603 | signal-exit@^3.0.0: 1604 | version "3.0.2" 1605 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" 1606 | integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= 1607 | 1608 | slash@^2.0.0: 1609 | version "2.0.0" 1610 | resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" 1611 | integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== 1612 | 1613 | snapdragon-node@^2.0.1: 1614 | version "2.1.1" 1615 | resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" 1616 | integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== 1617 | dependencies: 1618 | define-property "^1.0.0" 1619 | isobject "^3.0.0" 1620 | snapdragon-util "^3.0.1" 1621 | 1622 | snapdragon-util@^3.0.1: 1623 | version "3.0.1" 1624 | resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" 1625 | integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== 1626 | dependencies: 1627 | kind-of "^3.2.0" 1628 | 1629 | snapdragon@^0.8.1: 1630 | version "0.8.2" 1631 | resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" 1632 | integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== 1633 | dependencies: 1634 | base "^0.11.1" 1635 | debug "^2.2.0" 1636 | define-property "^0.2.5" 1637 | extend-shallow "^2.0.1" 1638 | map-cache "^0.2.2" 1639 | source-map "^0.5.6" 1640 | source-map-resolve "^0.5.0" 1641 | use "^3.1.0" 1642 | 1643 | source-map-resolve@^0.5.0: 1644 | version "0.5.2" 1645 | resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" 1646 | integrity sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA== 1647 | dependencies: 1648 | atob "^2.1.1" 1649 | decode-uri-component "^0.2.0" 1650 | resolve-url "^0.2.1" 1651 | source-map-url "^0.4.0" 1652 | urix "^0.1.0" 1653 | 1654 | source-map-url@^0.4.0: 1655 | version "0.4.0" 1656 | resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" 1657 | integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= 1658 | 1659 | source-map@^0.5.6: 1660 | version "0.5.7" 1661 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" 1662 | integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= 1663 | 1664 | source-map@^0.6.1: 1665 | version "0.6.1" 1666 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" 1667 | integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== 1668 | 1669 | split-string@^3.0.1, split-string@^3.0.2: 1670 | version "3.1.0" 1671 | resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" 1672 | integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== 1673 | dependencies: 1674 | extend-shallow "^3.0.0" 1675 | 1676 | sprintf-js@~1.0.2: 1677 | version "1.0.3" 1678 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 1679 | integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= 1680 | 1681 | static-extend@^0.1.1: 1682 | version "0.1.2" 1683 | resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" 1684 | integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= 1685 | dependencies: 1686 | define-property "^0.2.5" 1687 | object-copy "^0.1.0" 1688 | 1689 | string-width@^1.0.1: 1690 | version "1.0.2" 1691 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" 1692 | integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= 1693 | dependencies: 1694 | code-point-at "^1.0.0" 1695 | is-fullwidth-code-point "^1.0.0" 1696 | strip-ansi "^3.0.0" 1697 | 1698 | "string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.1: 1699 | version "2.1.1" 1700 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" 1701 | integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== 1702 | dependencies: 1703 | is-fullwidth-code-point "^2.0.0" 1704 | strip-ansi "^4.0.0" 1705 | 1706 | string_decoder@~1.1.1: 1707 | version "1.1.1" 1708 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" 1709 | integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== 1710 | dependencies: 1711 | safe-buffer "~5.1.0" 1712 | 1713 | strip-ansi@^3.0.0, strip-ansi@^3.0.1: 1714 | version "3.0.1" 1715 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 1716 | integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= 1717 | dependencies: 1718 | ansi-regex "^2.0.0" 1719 | 1720 | strip-ansi@^4.0.0: 1721 | version "4.0.0" 1722 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" 1723 | integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= 1724 | dependencies: 1725 | ansi-regex "^3.0.0" 1726 | 1727 | strip-eof@^1.0.0: 1728 | version "1.0.0" 1729 | resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" 1730 | integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= 1731 | 1732 | strip-json-comments@~2.0.1: 1733 | version "2.0.1" 1734 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 1735 | integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= 1736 | 1737 | supports-color@^5.3.0: 1738 | version "5.5.0" 1739 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 1740 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 1741 | dependencies: 1742 | has-flag "^3.0.0" 1743 | 1744 | supports-color@^6.1.0: 1745 | version "6.1.0" 1746 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" 1747 | integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== 1748 | dependencies: 1749 | has-flag "^3.0.0" 1750 | 1751 | tar@^4: 1752 | version "4.4.10" 1753 | resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.10.tgz#946b2810b9a5e0b26140cf78bea6b0b0d689eba1" 1754 | integrity sha512-g2SVs5QIxvo6OLp0GudTqEf05maawKUxXru104iaayWA09551tFCTI8f1Asb4lPfkBr91k07iL4c11XO3/b0tA== 1755 | dependencies: 1756 | chownr "^1.1.1" 1757 | fs-minipass "^1.2.5" 1758 | minipass "^2.3.5" 1759 | minizlib "^1.2.1" 1760 | mkdirp "^0.5.0" 1761 | safe-buffer "^5.1.2" 1762 | yallist "^3.0.3" 1763 | 1764 | to-object-path@^0.3.0: 1765 | version "0.3.0" 1766 | resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" 1767 | integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= 1768 | dependencies: 1769 | kind-of "^3.0.2" 1770 | 1771 | to-regex-range@^2.1.0: 1772 | version "2.1.1" 1773 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" 1774 | integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= 1775 | dependencies: 1776 | is-number "^3.0.0" 1777 | repeat-string "^1.6.1" 1778 | 1779 | to-regex@^3.0.1, to-regex@^3.0.2: 1780 | version "3.0.2" 1781 | resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" 1782 | integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== 1783 | dependencies: 1784 | define-property "^2.0.2" 1785 | extend-shallow "^3.0.2" 1786 | regex-not "^1.0.2" 1787 | safe-regex "^1.1.0" 1788 | 1789 | union-value@^1.0.0: 1790 | version "1.0.1" 1791 | resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" 1792 | integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== 1793 | dependencies: 1794 | arr-union "^3.1.0" 1795 | get-value "^2.0.6" 1796 | is-extendable "^0.1.1" 1797 | set-value "^2.0.1" 1798 | 1799 | universalify@^0.1.0: 1800 | version "0.1.2" 1801 | resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" 1802 | integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== 1803 | 1804 | unset-value@^1.0.0: 1805 | version "1.0.0" 1806 | resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" 1807 | integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= 1808 | dependencies: 1809 | has-value "^0.3.1" 1810 | isobject "^3.0.0" 1811 | 1812 | upath@^1.1.1: 1813 | version "1.1.2" 1814 | resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.2.tgz#3db658600edaeeccbe6db5e684d67ee8c2acd068" 1815 | integrity sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q== 1816 | 1817 | urix@^0.1.0: 1818 | version "0.1.0" 1819 | resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" 1820 | integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= 1821 | 1822 | use@^3.1.0: 1823 | version "3.1.1" 1824 | resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" 1825 | integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== 1826 | 1827 | util-deprecate@~1.0.1: 1828 | version "1.0.2" 1829 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 1830 | integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= 1831 | 1832 | which-module@^2.0.0: 1833 | version "2.0.0" 1834 | resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" 1835 | integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= 1836 | 1837 | which@^1.2.9: 1838 | version "1.3.1" 1839 | resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" 1840 | integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== 1841 | dependencies: 1842 | isexe "^2.0.0" 1843 | 1844 | wide-align@^1.1.0: 1845 | version "1.1.3" 1846 | resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" 1847 | integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== 1848 | dependencies: 1849 | string-width "^1.0.2 || 2" 1850 | 1851 | wrap-ansi@^2.0.0: 1852 | version "2.1.0" 1853 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" 1854 | integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU= 1855 | dependencies: 1856 | string-width "^1.0.1" 1857 | strip-ansi "^3.0.1" 1858 | 1859 | wrappy@1: 1860 | version "1.0.2" 1861 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1862 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 1863 | 1864 | "y18n@^3.2.1 || ^4.0.0": 1865 | version "4.0.0" 1866 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" 1867 | integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== 1868 | 1869 | yallist@^3.0.0, yallist@^3.0.3: 1870 | version "3.0.3" 1871 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9" 1872 | integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A== 1873 | 1874 | yargs-parser@^11.1.1: 1875 | version "11.1.1" 1876 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-11.1.1.tgz#879a0865973bca9f6bab5cbdf3b1c67ec7d3bcf4" 1877 | integrity sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ== 1878 | dependencies: 1879 | camelcase "^5.0.0" 1880 | decamelize "^1.2.0" 1881 | 1882 | yargs@^12.0.1: 1883 | version "12.0.5" 1884 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13" 1885 | integrity sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw== 1886 | dependencies: 1887 | cliui "^4.0.0" 1888 | decamelize "^1.2.0" 1889 | find-up "^3.0.0" 1890 | get-caller-file "^1.0.1" 1891 | os-locale "^3.0.0" 1892 | require-directory "^2.1.1" 1893 | require-main-filename "^1.0.1" 1894 | set-blocking "^2.0.0" 1895 | string-width "^2.0.0" 1896 | which-module "^2.0.0" 1897 | y18n "^3.2.1 || ^4.0.0" 1898 | yargs-parser "^11.1.1" 1899 | -------------------------------------------------------------------------------- /utils/index.js: -------------------------------------------------------------------------------- 1 | const { toRem, modularScale } = require('@typographist/core'); 2 | 3 | const ALL_CHARACTERS_AFTER_COLON = /:.+\b/; 4 | const ALL_PARENTHESES = /[()]/g; 5 | const HAS_PX_OR_EM = /\d+(\.\d+)?(px|em)/; 6 | const HAS_PX = /\d+(\.\d+)?px/; 7 | const HAS_EM = /\d+(\.\d+)?em/; 8 | const BROWSER_CONTEXT = 16; 9 | const DASH_HYPHEN_WHITESPACE_ANY_CHARACTERS = /[-_\s]+(.)?/g; 10 | const SEPARATE_STRING_INTO_WORDS_WITH_CAPITAL_LETTER = /(?=[A-Z])/; 11 | 12 | // getFirstLetter :: String -> String 13 | const getFirstLetter = (word) => word[0].toLowerCase(); 14 | 15 | // getWordTail :: String -> String 16 | const getWordTail = (word) => 17 | word 18 | .slice(1) 19 | .replace(DASH_HYPHEN_WHITESPACE_ANY_CHARACTERS, (_, chr) => 20 | chr.toUpperCase(), 21 | ); 22 | 23 | // camelize :: String -> String 24 | const camelize = (str) => `${getFirstLetter(str)}${getWordTail(str)}`; 25 | 26 | // normalizeString :: String -> String 27 | const normalizeString = (x) => 28 | x.replace(/([a-z])([A-Z])/g, '$1 $2').toLowerCase(); 29 | 30 | // separateWords :: (Maybe String) -> String -> String 31 | const separateWords = (separator = ' ') => (str) => 32 | str 33 | .split(SEPARATE_STRING_INTO_WORDS_WITH_CAPITAL_LETTER) 34 | .join(separator) 35 | .toLowerCase(); 36 | 37 | // toKebabCase :: String -> String 38 | const toKebabCase = separateWords('-'); 39 | 40 | // toSnakeCase :: String -> String 41 | const toSnakeCase = separateWords('_'); 42 | 43 | // hasPx :: String -> Boolean 44 | const hasPx = (x) => HAS_PX.test(x); 45 | 46 | // hasEm :: String -> Boolean 47 | const hasEm = (x) => HAS_EM.test(x); 48 | 49 | // hasPxOrEm :: String -> Boolean 50 | const hasPxOrEm = (x) => HAS_PX_OR_EM.test(x); 51 | 52 | // toPx :: String -> String 53 | const toPx = (x) => `${parseFloat(x) * BROWSER_CONTEXT}px`; 54 | 55 | // toEm :: String -> String 56 | const toEm = (x) => `${parseFloat(x) / BROWSER_CONTEXT}em`; 57 | 58 | // toEmOrNot :: String -> String 59 | const toEmOrNot = (x) => (hasPx(x) ? toEm(x) : x); 60 | 61 | // toPxOrNot :: String -> String 62 | const toPxOrNot = (x) => (hasEm(x) ? toPx(x) : x); 63 | 64 | // calcFontSize :: Object -> (Number | String, String) -> String 65 | // eslint-disable-next-line consistent-return 66 | const calcFontSize = (breakpoints) => (target, breakName = 'initial') => { 67 | if (breakpoints[breakName]) { 68 | const { root, base, ratio } = breakpoints[breakName]; 69 | 70 | return toRem(root, modularScale(Number(target), base, ratio)); 71 | } 72 | }; 73 | 74 | // makeBreakpointName :: String -> String 75 | const makeBreakpointName = (x) => 76 | camelize( 77 | x.replace(ALL_CHARACTERS_AFTER_COLON, '').replace(ALL_PARENTHESES, ''), 78 | ); 79 | 80 | module.exports = { 81 | getFirstLetter, 82 | getWordTail, 83 | camelize, 84 | normalizeString, 85 | separateWords, 86 | toKebabCase, 87 | toSnakeCase, 88 | hasPx, 89 | hasEm, 90 | toPx, 91 | hasPxOrEm, 92 | toEm, 93 | toEmOrNot, 94 | toPxOrNot, 95 | calcFontSize, 96 | makeBreakpointName, 97 | }; 98 | --------------------------------------------------------------------------------