├── .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 |
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 |
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 |
--------------------------------------------------------------------------------