├── .eslintrc ├── .gitignore ├── .travis.yml ├── CHANGELOG.md ├── README.md ├── demo.gif ├── index.js ├── package.json ├── test ├── fixtures │ ├── custom.css │ ├── custom.expected.css │ ├── default.css │ ├── default.expected.css │ ├── em.css │ ├── em.expected.css │ ├── fallback.css │ ├── fallback.expected.css │ ├── formatting.css │ ├── formatting.expected.css │ ├── letterspacing.css │ ├── letterspacing.expected.css │ ├── letterspacing_extended.css │ ├── letterspacing_extended.expected.css │ ├── letterspacing_negative.css │ ├── letterspacing_negative.expected.css │ ├── lineheight.css │ ├── lineheight.expected.css │ ├── lineheight_extended.css │ ├── lineheight_extended.expected.css │ ├── mixed.css │ ├── mixed.expected.css │ ├── root.css │ ├── root.expected.css │ ├── shorthand.css │ ├── shorthand.expected.css │ ├── unitless_lineheight.css │ └── unitless_lineheight.expected.css ├── mocha.opts └── test.js └── yarn.lock /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "node": true, 4 | "mocha": true, 5 | "es6": true 6 | }, 7 | "extends": "eslint:recommended", 8 | "rules": { 9 | "indent": [ 10 | "error", 11 | 2, 12 | { "VariableDeclarator": 2 } 13 | ], 14 | "linebreak-style": [ 15 | "error", 16 | "unix" 17 | ], 18 | "quotes": [ 19 | "error", 20 | "single" 21 | ], 22 | "semi": [ 23 | "error", 24 | "always" 25 | ] 26 | } 27 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Deps 2 | node_modules 3 | 4 | # Runtime 5 | *.log 6 | .DS_Store 7 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | sudo: false 2 | language: node_js 3 | node_js: 4 | - 4 5 | - 5 6 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Change Log 2 | 3 | ## [Unreleased](https://github.com/seaneking/postcss-responsive-type/tree/HEAD) 4 | 5 | [Full Changelog](https://github.com/seaneking/postcss-responsive-type/compare/v1.0.0...HEAD) 6 | 7 | **Closed issues:** 8 | 9 | - Publish v1.0.0 on npm registry [\#29](https://github.com/seaneking/postcss-responsive-type/issues/29) 10 | 11 | ## [v1.0.0](https://github.com/seaneking/postcss-responsive-type/tree/v1.0.0) (2017-07-07) 12 | [Full Changelog](https://github.com/seaneking/postcss-responsive-type/compare/v0.6.0...v1.0.0) 13 | 14 | ## [v0.6.0](https://github.com/seaneking/postcss-responsive-type/tree/v0.6.0) (2017-07-07) 15 | [Full Changelog](https://github.com/seaneking/postcss-responsive-type/compare/v0.5.1...v0.6.0) 16 | 17 | **Merged pull requests:** 18 | 19 | - Upgrade postcss and misc dependencies [\#28](https://github.com/seaneking/postcss-responsive-type/pull/28) ([perrin4869](https://github.com/perrin4869)) 20 | 21 | ## [v0.5.1](https://github.com/seaneking/postcss-responsive-type/tree/v0.5.1) (2017-02-13) 22 | [Full Changelog](https://github.com/seaneking/postcss-responsive-type/compare/v0.5.0...v0.5.1) 23 | 24 | **Closed issues:** 25 | 26 | - error in Chrome Develop Tool's mobile debug [\#25](https://github.com/seaneking/postcss-responsive-type/issues/25) 27 | 28 | **Merged pull requests:** 29 | 30 | - Adds support for negative values [\#26](https://github.com/seaneking/postcss-responsive-type/pull/26) ([toreholmberg](https://github.com/toreholmberg)) 31 | 32 | ## [v0.5.0](https://github.com/seaneking/postcss-responsive-type/tree/v0.5.0) (2016-11-25) 33 | [Full Changelog](https://github.com/seaneking/postcss-responsive-type/compare/v0.4.0...v0.5.0) 34 | 35 | **Closed issues:** 36 | 37 | - README example --- incorrect [\#21](https://github.com/seaneking/postcss-responsive-type/issues/21) 38 | - Support responsive line-height [\#18](https://github.com/seaneking/postcss-responsive-type/issues/18) 39 | 40 | **Merged pull requests:** 41 | 42 | - incorrect syntax -- fixes \#21 [\#22](https://github.com/seaneking/postcss-responsive-type/pull/22) ([artisin](https://github.com/artisin)) 43 | 44 | ## [v0.4.0](https://github.com/seaneking/postcss-responsive-type/tree/v0.4.0) (2016-06-17) 45 | [Full Changelog](https://github.com/seaneking/postcss-responsive-type/compare/v0.3.4...v0.4.0) 46 | 47 | **Merged pull requests:** 48 | 49 | - Add support for responsive line height + bonuses [\#20](https://github.com/seaneking/postcss-responsive-type/pull/20) ([perrin4869](https://github.com/perrin4869)) 50 | 51 | ## [v0.3.4](https://github.com/seaneking/postcss-responsive-type/tree/v0.3.4) (2016-06-11) 52 | [Full Changelog](https://github.com/seaneking/postcss-responsive-type/compare/v0.3.3...v0.3.4) 53 | 54 | **Closed issues:** 55 | 56 | - pixrem / cssnext incompatibility ? [\#16](https://github.com/seaneking/postcss-responsive-type/issues/16) 57 | - Use 'em' instead of 'px' for 'font-range' [\#13](https://github.com/seaneking/postcss-responsive-type/issues/13) 58 | - Fallback with media queries [\#12](https://github.com/seaneking/postcss-responsive-type/issues/12) 59 | - Responsive 'px' restriction is not working [\#10](https://github.com/seaneking/postcss-responsive-type/issues/10) 60 | 61 | **Merged pull requests:** 62 | 63 | - Add em related tests and explanation [\#19](https://github.com/seaneking/postcss-responsive-type/pull/19) ([perrin4869](https://github.com/perrin4869)) 64 | 65 | ## [v0.3.3](https://github.com/seaneking/postcss-responsive-type/tree/v0.3.3) (2016-02-18) 66 | [Full Changelog](https://github.com/seaneking/postcss-responsive-type/compare/v0.3.2...v0.3.3) 67 | 68 | **Merged pull requests:** 69 | 70 | - Fix regex for font-size matching [\#11](https://github.com/seaneking/postcss-responsive-type/pull/11) ([adam-beck](https://github.com/adam-beck)) 71 | 72 | ## [v0.3.2](https://github.com/seaneking/postcss-responsive-type/tree/v0.3.2) (2015-12-05) 73 | [Full Changelog](https://github.com/seaneking/postcss-responsive-type/compare/v0.3.1...v0.3.2) 74 | 75 | **Closed issues:** 76 | 77 | - Calc sizing not working in Chrome [\#8](https://github.com/seaneking/postcss-responsive-type/issues/8) 78 | 79 | **Merged pull requests:** 80 | 81 | - Removed space in rules.responsive to prevent breaking in chrome\(v47+\) [\#7](https://github.com/seaneking/postcss-responsive-type/pull/7) ([croesike](https://github.com/croesike)) 82 | - Update docs so responsive-type gets executed [\#5](https://github.com/seaneking/postcss-responsive-type/pull/5) ([quintenvk](https://github.com/quintenvk)) 83 | - Corrected the formula in the documentation [\#4](https://github.com/seaneking/postcss-responsive-type/pull/4) ([aeyoll](https://github.com/aeyoll)) 84 | 85 | ## [v0.3.1](https://github.com/seaneking/postcss-responsive-type/tree/v0.3.1) (2015-09-15) 86 | [Full Changelog](https://github.com/seaneking/postcss-responsive-type/compare/v0.3.0...v0.3.1) 87 | 88 | ## [v0.3.0](https://github.com/seaneking/postcss-responsive-type/tree/v0.3.0) (2015-09-06) 89 | [Full Changelog](https://github.com/seaneking/postcss-responsive-type/compare/v0.2.1...v0.3.0) 90 | 91 | **Closed issues:** 92 | 93 | - Move to PostCSS 5.0 [\#2](https://github.com/seaneking/postcss-responsive-type/issues/2) 94 | 95 | ## [v0.2.1](https://github.com/seaneking/postcss-responsive-type/tree/v0.2.1) (2015-08-27) 96 | [Full Changelog](https://github.com/seaneking/postcss-responsive-type/compare/v0.2.0...v0.2.1) 97 | 98 | **Fixed bugs:** 99 | 100 | - Regression in IE with new sizing logic [\#3](https://github.com/seaneking/postcss-responsive-type/issues/3) 101 | 102 | ## [v0.2.0](https://github.com/seaneking/postcss-responsive-type/tree/v0.2.0) (2015-08-21) 103 | [Full Changelog](https://github.com/seaneking/postcss-responsive-type/compare/v0.1.1...v0.2.0) 104 | 105 | **Closed issues:** 106 | 107 | - Support rem units [\#1](https://github.com/seaneking/postcss-responsive-type/issues/1) 108 | 109 | ## [v0.1.1](https://github.com/seaneking/postcss-responsive-type/tree/v0.1.1) (2015-07-26) 110 | [Full Changelog](https://github.com/seaneking/postcss-responsive-type/compare/v0.1.0...v0.1.1) 111 | 112 | ## [v0.1.0](https://github.com/seaneking/postcss-responsive-type/tree/v0.1.0) (2015-07-26) 113 | 114 | 115 | \* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)* -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # PostCSS Responsive Type 2 | [![NPM version][npm-badge]][npm-url] [![NPM downloads][downloads-badge]][npm-url] [![Build Status][travis-badge]][travis-url] 3 | 4 | Generate automagical fluid typography, with new `responsive` properties for `font-size`, `line-height`, and `letter-spacing`. Built on [PostCSS][postcss]. 5 | 6 | ![Responsive Type Demo][demo] 7 | 8 | Inspired by [this post][post]. 9 | 10 | _Part of [Rucksack - CSS Superpowers](https://github.com/madeleineostoja/rucksack)_ 11 | 12 | ### Contents 13 | 14 | - [Usage](#usage) 15 | - [Quick start](#quick-start) 16 | - [Specify parameters](#specify-parameters) 17 | - [Expanded syntax](#expanded-syntax) 18 | - [Responsive `line-height` and `letter-spacing`](#responsive-line-height-and-letter-spacing) 19 | - [Defaults](#defaults) 20 | - [Browser Support](#browser-support) 21 | 22 | ## Usage 23 | 24 | #### Quick start 25 | 26 | ```css 27 | html { 28 | font-size: responsive; 29 | } 30 | ``` 31 | 32 | > **Pro tip:** set a reaponsive font-size on `html` and use `rem` units throughout your project to make your whole UI fluid 33 | 34 | #### Specify parameters 35 | 36 | Units can be in px, rem, or em. When using em units, be sure that the `font-range` is specified in em as well. 37 | 38 | ```css 39 | html { 40 | font-size: responsive 12px 21px; /* min-size, max-size */ 41 | font-range: 420px 1280px; /* viewport widths between which font-size is fluid */ 42 | } 43 | ``` 44 | 45 | #### Expanded syntax 46 | 47 | ```css 48 | html { 49 | font-size: responsive; 50 | min-font-size: 12px; 51 | max-font-size: 21px; 52 | lower-font-range: 420px; 53 | upper-font-range: 1280px; 54 | } 55 | ``` 56 | 57 | #### Responsive `line-height` and `letter-spacing` 58 | 59 | PostCSS Responsive Type also allows you to set fluid sizes for the `line-height` and `letter-spacing` properties. They have the same syntax and work the same way as responsive font sizes. 60 | 61 | ```css 62 | html { 63 | line-height: responsive 1.2em 1.8em; 64 | line-height-range: 420px 1280px; 65 | 66 | /* or extended syntax: */ 67 | line-height: responsive; 68 | min-line-height: 1.2em; 69 | max-line-height: 1.8em; 70 | lower-line-height-range: 420px; 71 | upper-line-height-range: 1280px; 72 | } 73 | ``` 74 | 75 | ```css 76 | html { 77 | letter-spacing: responsive 0px 4px; 78 | letter-spacing-range: 420px 1280px; 79 | 80 | /* or extended syntax: */ 81 | letter-spacing: responsive; 82 | min-letter-spacing: 0px; 83 | max-letter-spacing: 4px; 84 | lower-letter-spacing-range: 420px; 85 | upper-letter-spacing-range: 1280px; 86 | } 87 | ``` 88 | 89 | > **Note:** Unitless line heights are not supported. 90 | 91 | ## Defaults 92 | To get started you only need to specify the `responsive` property, all other values have sane defaults. 93 | 94 | ##### `font-size` 95 | 96 | - `min-font-size`: 14px 97 | 98 | - `max-font-size`: 21px 99 | 100 | - `lower-font-range`: 420px 101 | 102 | - `upper-font-range`: 1280px 103 | 104 | 105 | ##### `line-height` 106 | 107 | - `min-line-height`: 1.2em 108 | 109 | - `max-line-height`: 1.8em 110 | 111 | - `lower-line-height-range`: 420px 112 | 113 | - `upper-line-height-range`: 1280px 114 | 115 | 116 | ##### `letter-spacing` 117 | 118 | - `min-letter-spacing`: 0px 119 | 120 | - `max-letter-spacing`: 4px 121 | 122 | - `lower-letter-spacing-range`: 420px 123 | 124 | - `upper-letter-spacing-range`: 1280px 125 | 126 | 127 | ## Browser Support 128 | 129 | `postcss-responsive-type` just uses calc, vw units, and media queries behind the scenes, so it works on all modern browsers (IE9+). Although Opera Mini is not supported. 130 | 131 | Legacy browsers will ignore the output `responsive` font-size. You can easily provide a simple static fallback: 132 | 133 | ```css 134 | .foo { 135 | font-size: 16px; 136 | font-size: responsive; 137 | } 138 | ``` 139 | 140 | *** 141 | 142 | MIT © [Sean King](https://twitter.com/seaneking) 143 | 144 | [npm-badge]: https://img.shields.io/npm/v/postcss-responsive-type.svg 145 | [npm-url]: https://npmjs.org/package/postcss-responsive-type 146 | [downloads-badge]: https://img.shields.io/npm/dm/postcss-responsive-type.svg 147 | [travis-badge]: https://travis-ci.org/seaneking/postcss-responsive-type.svg?branch=master 148 | [travis-url]: https://travis-ci.org/seaneking/postcss-responsive-type 149 | [PostCSS]: https://github.com/postcss/postcss 150 | [demo]: /demo.gif?raw=true 151 | [post]: http://madebymike.com.au/writing/precise-control-responsive-typography/ 152 | [poststylus]: https://github.com/seaneking/poststylus 153 | -------------------------------------------------------------------------------- /demo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/madeleineostoja/postcss-responsive-type/365180f29a1b8f9dbf19d97c9a6988d117fff531/demo.gif -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const postcss = require('postcss'); 4 | 5 | const DEFAULT_PARAMS = { 6 | 'font-size': { 7 | minSize: '12px', 8 | maxSize: '21px', 9 | minWidth: '420px', 10 | maxWidth: '1280px' 11 | }, 12 | 'line-height': { 13 | minSize: '1.2em', 14 | maxSize: '1.8em', 15 | minWidth: '420px', 16 | maxWidth: '1280px' 17 | }, 18 | 'letter-spacing': { 19 | minSize: '0px', 20 | maxSize: '4px', 21 | minWidth: '420px', 22 | maxWidth: '1280px' 23 | } 24 | }, 25 | PARAM_RANGE = { 26 | 'font-size': 'font-range', 27 | 'line-height': 'line-height-range', 28 | 'letter-spacing': 'letter-spacing-range' 29 | }, 30 | PARAM_DECLS = { 31 | 'font-size': { 32 | minSize: 'min-font-size', 33 | maxSize: 'max-font-size', 34 | minWidth: 'lower-font-range', 35 | maxWidth: 'upper-font-range' 36 | }, 37 | 'line-height': { 38 | minSize: 'min-line-height', 39 | maxSize: 'max-line-height', 40 | minWidth: 'lower-line-height-range', 41 | maxWidth: 'upper-line-height-range' 42 | }, 43 | 'letter-spacing': { 44 | minSize: 'min-letter-spacing', 45 | maxSize: 'max-letter-spacing', 46 | minWidth: 'lower-letter-spacing-range', 47 | maxWidth: 'upper-letter-spacing-range' 48 | } 49 | }; 50 | 51 | // Assign default root size 52 | let rootSize = '16px'; 53 | 54 | /** 55 | * Extract the unit from a string 56 | * @param {String} value value to extract unit from 57 | * @return {String} unit 58 | */ 59 | function getUnit(value) { 60 | var match = value.match(/px|rem|em/); 61 | 62 | if (match) { 63 | return match.toString(); 64 | } 65 | return null; 66 | } 67 | 68 | /** 69 | * Px -> Rem converter 70 | * @param {String} px pixel value 71 | * @return {String} rem value 72 | */ 73 | function pxToRem(px) { 74 | return parseFloat(px) / parseFloat(rootSize) + 'rem'; 75 | } 76 | 77 | function fetchResponsiveSizes(rule, declName, cb) { 78 | rule.walkDecls(declName, decl => { 79 | 80 | if (decl.value.indexOf('responsive') > -1) { 81 | let vals = decl.value.match(/-?\d*\.?\d+(?:\w+)?/g); 82 | 83 | if (vals) { 84 | cb(vals[0], vals[1]); 85 | } 86 | } 87 | }); 88 | } 89 | 90 | function fetchRangeSizes(rule, declName, cb) { 91 | rule.walkDecls(declName, decl => { 92 | let vals = decl.value.split(/\s+/); 93 | 94 | cb(vals[0], vals[1]); 95 | decl.remove(); 96 | }); 97 | } 98 | 99 | function fetchParams(rule, declName) { 100 | let params = Object.assign({}, DEFAULT_PARAMS[declName]), 101 | rangeDecl; 102 | 103 | // Fetch params from shorthand declName, i.e., font-size or line-height, etc 104 | fetchResponsiveSizes(rule, declName, (minSize, maxSize) => { 105 | params.minSize = minSize; 106 | params.maxSize = maxSize; 107 | }); 108 | 109 | // Fetch params from shorthand font-range or line-height-range 110 | fetchRangeSizes(rule, PARAM_RANGE[declName], (minSize, maxSize) => { 111 | params.minWidth = minSize; 112 | params.maxWidth = maxSize; 113 | }); 114 | 115 | // Fetch parameters from expanded properties 116 | rangeDecl = PARAM_DECLS[declName]; 117 | 118 | Object.keys(rangeDecl).forEach(param => { 119 | rule.walkDecls(rangeDecl[param], decl => { 120 | params[param] = decl.value.trim(); 121 | decl.remove(); 122 | }); 123 | }); 124 | 125 | return params; 126 | } 127 | 128 | /** 129 | * Build new responsive type rules 130 | * @param {object} rule old CSS rule 131 | * @return {object} object of new CSS rules 132 | */ 133 | function buildRules(rule, declName, params, result) { 134 | let rules = {}, 135 | minSize = params.minSize, 136 | maxSize = params.maxSize, 137 | minWidth, 138 | maxWidth, 139 | sizeUnit = getUnit(params.minSize), 140 | maxSizeUnit = getUnit(params.maxSize), 141 | widthUnit = getUnit(params.minWidth), 142 | maxWidthUnit = getUnit(params.maxWidth), 143 | sizeDiff, 144 | rangeDiff; 145 | 146 | if (sizeUnit === null) { 147 | throw rule.error('sizes with unitless values are not supported'); 148 | } 149 | 150 | if (sizeUnit !== maxSizeUnit && widthUnit !== maxWidthUnit) { 151 | rule.warn(result, 'min/max unit types must match'); 152 | } 153 | 154 | if (sizeUnit === 'rem' && widthUnit === 'px') { 155 | minWidth = pxToRem(params.minWidth); 156 | maxWidth = pxToRem(params.maxWidth); 157 | } else if (sizeUnit === widthUnit || sizeUnit === 'rem' && widthUnit === 'em') { 158 | minWidth = params.minWidth; 159 | maxWidth = params.maxWidth; 160 | } else { 161 | rule.warn(result, 'this combination of units is not supported'); 162 | } 163 | 164 | // Build the responsive type decleration 165 | sizeDiff = parseFloat(maxSize) - parseFloat(minSize); 166 | rangeDiff = parseFloat(maxWidth) - parseFloat(minWidth); 167 | 168 | rules.responsive = 'calc(' + minSize + ' + ' + sizeDiff + ' * ((100vw - ' + minWidth + ') / ' + rangeDiff + '))'; 169 | 170 | // Build the media queries 171 | rules.minMedia = postcss.atRule({ 172 | name: 'media', 173 | params: 'screen and (max-width: ' + params.minWidth + ')' 174 | }); 175 | 176 | rules.maxMedia = postcss.atRule({ 177 | name: 'media', 178 | params: 'screen and (min-width: ' + params.maxWidth + ')' 179 | }); 180 | 181 | // Add the required content to new media queries 182 | rules.minMedia.append({ 183 | selector: rule.selector 184 | }).walkRules(selector => { 185 | selector.append({ 186 | prop: declName, 187 | value: params.minSize 188 | }); 189 | }); 190 | 191 | rules.maxMedia.append({ 192 | selector: rule.selector 193 | }).walkRules(selector => { 194 | selector.append({ 195 | prop: declName, 196 | value: params.maxSize 197 | }); 198 | }); 199 | 200 | return rules; 201 | } 202 | 203 | const plugin = () => ({ 204 | postcssPlugin: 'postcss-responsive-type', 205 | Once(root, { result }) { 206 | root.walkRules(function (rule) { 207 | let thisRule, newRules; 208 | 209 | // Check root font-size (for rem units) 210 | if (rule.selector.indexOf('html') > -1) { 211 | rule.walkDecls('font-size', decl => { 212 | if (decl.value.indexOf('px') > -1) { 213 | rootSize = decl.value; 214 | } 215 | }); 216 | } 217 | 218 | rule.walkDecls(/^(font-size|line-height|letter-spacing)$/, decl => { 219 | let params; 220 | 221 | // If decl doesn't contain responsve keyword, exit 222 | if (decl.value.indexOf('responsive') === -1) { 223 | return; 224 | } 225 | 226 | thisRule = decl.parent; 227 | params = fetchParams(thisRule, decl.prop); 228 | newRules = buildRules(thisRule, decl.prop, params, result); 229 | 230 | // Insert the base responsive decleration 231 | if (decl.value.indexOf('responsive') > -1) { 232 | decl.replaceWith({ prop: decl.prop, value: newRules.responsive }); 233 | } 234 | 235 | // Insert the media queries 236 | thisRule.parent.insertAfter(thisRule, newRules.minMedia); 237 | thisRule.parent.insertAfter(thisRule, newRules.maxMedia); 238 | }); 239 | }); 240 | } 241 | }); 242 | 243 | plugin.postcss = true; 244 | 245 | module.exports = plugin; -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "postcss-responsive-type", 3 | "version": "1.0.0", 4 | "description": "PostCSS plugin that adds responsive magic to font-size", 5 | "keywords": [ 6 | "postcss", 7 | "css", 8 | "postcss-plugin", 9 | "typography" 10 | ], 11 | "license": "MIT", 12 | "repository": { 13 | "type": "git", 14 | "url": "https://github.com/seaneking/postcss-responsive-type.git" 15 | }, 16 | "author": "Sean King ", 17 | "maintainers": [ 18 | { 19 | "name": "Sean King", 20 | "email": "sean@simpla.io", 21 | "web": "http://simpla.io" 22 | } 23 | ], 24 | "bugs": { 25 | "url": "https://github.com/seaneking/postcss-responsive-type/issues" 26 | }, 27 | "homepage": "https://github.com/seaneking/postcss-responsive-type", 28 | "devDependencies": { 29 | "chai": "^4.0.2", 30 | "eslint": "^4.1.1", 31 | "mocha": "^3.4.2", 32 | "postcss": "^8.4.6" 33 | }, 34 | "peerDependencies": { 35 | "postcss": "^8.4.6" 36 | }, 37 | "scripts": { 38 | "test": "mocha test", 39 | "posttest": "eslint ." 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /test/fixtures/custom.css: -------------------------------------------------------------------------------- 1 | .foo { 2 | font-size: responsive; 3 | min-font-size: 10px; 4 | max-font-size: 30px; 5 | lower-font-range: 300px; 6 | upper-font-range: 900px; 7 | } 8 | -------------------------------------------------------------------------------- /test/fixtures/custom.expected.css: -------------------------------------------------------------------------------- 1 | .foo { 2 | font-size: calc(10px + 20 * ((100vw - 300px) / 600)); 3 | } 4 | @media screen and (min-width: 900px) { 5 | .foo { 6 | font-size: 30px; 7 | } 8 | } 9 | @media screen and (max-width: 300px) { 10 | .foo { 11 | font-size: 10px; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /test/fixtures/default.css: -------------------------------------------------------------------------------- 1 | .foo { 2 | font-size: responsive; 3 | } 4 | 5 | .bar { 6 | foo: bar; 7 | } 8 | -------------------------------------------------------------------------------- /test/fixtures/default.expected.css: -------------------------------------------------------------------------------- 1 | .foo { 2 | font-size: calc(12px + 9 * ((100vw - 420px) / 860)); 3 | } 4 | 5 | @media screen and (min-width: 1280px) { 6 | 7 | .foo { 8 | font-size: 21px; 9 | } 10 | } 11 | 12 | @media screen and (max-width: 420px) { 13 | 14 | .foo { 15 | font-size: 12px; 16 | } 17 | } 18 | 19 | .bar { 20 | foo: bar; 21 | } 22 | -------------------------------------------------------------------------------- /test/fixtures/em.css: -------------------------------------------------------------------------------- 1 | .foo { 2 | font-size: responsive 1em 3em; 3 | font-range: 20em 45em; 4 | } 5 | -------------------------------------------------------------------------------- /test/fixtures/em.expected.css: -------------------------------------------------------------------------------- 1 | .foo { 2 | font-size: calc(1em + 2 * ((100vw - 20em) / 25)); 3 | } 4 | @media screen and (min-width: 45em) { 5 | .foo { 6 | font-size: 3em; 7 | } 8 | } 9 | @media screen and (max-width: 20em) { 10 | .foo { 11 | font-size: 1em; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /test/fixtures/fallback.css: -------------------------------------------------------------------------------- 1 | .foo { 2 | font-size: 16px; 3 | font-size: responsive; 4 | } 5 | -------------------------------------------------------------------------------- /test/fixtures/fallback.expected.css: -------------------------------------------------------------------------------- 1 | .foo { 2 | font-size: 16px; 3 | font-size: calc(12px + 9 * ((100vw - 420px) / 860)); 4 | } 5 | @media screen and (min-width: 1280px) { 6 | .foo { 7 | font-size: 21px; 8 | } 9 | } 10 | @media screen and (max-width: 420px) { 11 | .foo { 12 | font-size: 12px; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /test/fixtures/formatting.css: -------------------------------------------------------------------------------- 1 | .foo { 2 | font-size:responsive 10px 30px ; 3 | lower-font-range: 300px ; 4 | upper-font-range:900px; 5 | } 6 | -------------------------------------------------------------------------------- /test/fixtures/formatting.expected.css: -------------------------------------------------------------------------------- 1 | .foo { 2 | font-size: calc(10px + 20 * ((100vw - 300px) / 600)); 3 | } 4 | @media screen and (min-width: 900px) { 5 | .foo { 6 | font-size: 30px; 7 | } 8 | } 9 | @media screen and (max-width: 300px) { 10 | .foo { 11 | font-size: 10px; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /test/fixtures/letterspacing.css: -------------------------------------------------------------------------------- 1 | .foo { 2 | letter-spacing: responsive 10px 30px; 3 | letter-spacing-range: 300px 900px; 4 | } 5 | -------------------------------------------------------------------------------- /test/fixtures/letterspacing.expected.css: -------------------------------------------------------------------------------- 1 | .foo { 2 | letter-spacing: calc(10px + 20 * ((100vw - 300px) / 600)); 3 | } 4 | @media screen and (min-width: 900px) { 5 | .foo { 6 | letter-spacing: 30px; 7 | } 8 | } 9 | @media screen and (max-width: 300px) { 10 | .foo { 11 | letter-spacing: 10px; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /test/fixtures/letterspacing_extended.css: -------------------------------------------------------------------------------- 1 | .foo { 2 | letter-spacing: responsive; 3 | min-letter-spacing: 10px; 4 | max-letter-spacing: 30px; 5 | letter-spacing-range: 300px 900px; 6 | } 7 | -------------------------------------------------------------------------------- /test/fixtures/letterspacing_extended.expected.css: -------------------------------------------------------------------------------- 1 | .foo { 2 | letter-spacing: calc(10px + 20 * ((100vw - 300px) / 600)); 3 | } 4 | @media screen and (min-width: 900px) { 5 | .foo { 6 | letter-spacing: 30px; 7 | } 8 | } 9 | @media screen and (max-width: 300px) { 10 | .foo { 11 | letter-spacing: 10px; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /test/fixtures/letterspacing_negative.css: -------------------------------------------------------------------------------- 1 | .foo { 2 | letter-spacing: responsive -10px -30px; 3 | letter-spacing-range: 300px 900px; 4 | } 5 | -------------------------------------------------------------------------------- /test/fixtures/letterspacing_negative.expected.css: -------------------------------------------------------------------------------- 1 | .foo { 2 | letter-spacing: calc(-10px + -20 * ((100vw - 300px) / 600)); 3 | } 4 | @media screen and (min-width: 900px) { 5 | .foo { 6 | letter-spacing: -30px; 7 | } 8 | } 9 | @media screen and (max-width: 300px) { 10 | .foo { 11 | letter-spacing: -10px; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /test/fixtures/lineheight.css: -------------------------------------------------------------------------------- 1 | .foo { 2 | line-height: responsive 10px 30px; 3 | line-height-range: 300px 900px; 4 | } 5 | -------------------------------------------------------------------------------- /test/fixtures/lineheight.expected.css: -------------------------------------------------------------------------------- 1 | .foo { 2 | line-height: calc(10px + 20 * ((100vw - 300px) / 600)); 3 | } 4 | @media screen and (min-width: 900px) { 5 | .foo { 6 | line-height: 30px; 7 | } 8 | } 9 | @media screen and (max-width: 300px) { 10 | .foo { 11 | line-height: 10px; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /test/fixtures/lineheight_extended.css: -------------------------------------------------------------------------------- 1 | .foo { 2 | line-height: responsive; 3 | min-line-height: 10px; 4 | max-line-height: 30px; 5 | line-height-range: 300px 900px; 6 | } 7 | -------------------------------------------------------------------------------- /test/fixtures/lineheight_extended.expected.css: -------------------------------------------------------------------------------- 1 | .foo { 2 | line-height: calc(10px + 20 * ((100vw - 300px) / 600)); 3 | } 4 | @media screen and (min-width: 900px) { 5 | .foo { 6 | line-height: 30px; 7 | } 8 | } 9 | @media screen and (max-width: 300px) { 10 | .foo { 11 | line-height: 10px; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /test/fixtures/mixed.css: -------------------------------------------------------------------------------- 1 | .foo { 2 | font-size: responsive 1rem 3rem; 3 | font-range: 420px 1280px; 4 | } 5 | 6 | .bar { 7 | font-size: responsive 1rem 3rem; 8 | font-range: 20em 60em; 9 | } 10 | 11 | .baz { 12 | font-size: responsive 1em 3em; 13 | font-range: 420px 1280px; 14 | } 15 | -------------------------------------------------------------------------------- /test/fixtures/mixed.expected.css: -------------------------------------------------------------------------------- 1 | .foo { 2 | font-size: calc(1rem + 2 * ((100vw - 26.25rem) / 53.75)); 3 | } 4 | 5 | @media screen and (min-width: 1280px) { 6 | 7 | .foo { 8 | font-size: 3rem; 9 | } 10 | } 11 | 12 | @media screen and (max-width: 420px) { 13 | 14 | .foo { 15 | font-size: 1rem; 16 | } 17 | } 18 | 19 | .bar { 20 | font-size: calc(1rem + 2 * ((100vw - 20em) / 40)); 21 | } 22 | 23 | @media screen and (min-width: 60em) { 24 | 25 | .bar { 26 | font-size: 3rem; 27 | } 28 | } 29 | 30 | @media screen and (max-width: 20em) { 31 | 32 | .bar { 33 | font-size: 1rem; 34 | } 35 | } 36 | 37 | .baz { 38 | font-size: calc(1em + 2 * ((100vw - undefined) / NaN)); 39 | } 40 | 41 | @media screen and (min-width: 1280px) { 42 | 43 | .baz { 44 | font-size: 3em; 45 | } 46 | } 47 | 48 | @media screen and (max-width: 420px) { 49 | 50 | .baz { 51 | font-size: 1em; 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /test/fixtures/root.css: -------------------------------------------------------------------------------- 1 | html { 2 | font-size: 10px; 3 | } 4 | 5 | .foo { 6 | font-size: responsive 1.6rem 4.8rem; 7 | font-range: 420px 1280px; 8 | } 9 | -------------------------------------------------------------------------------- /test/fixtures/root.expected.css: -------------------------------------------------------------------------------- 1 | html { 2 | font-size: 10px; 3 | } 4 | 5 | .foo { 6 | font-size: calc(1.6rem + 3.1999999999999997 * ((100vw - 42rem) / 86)); 7 | } 8 | 9 | @media screen and (min-width: 1280px) { 10 | 11 | .foo { 12 | font-size: 4.8rem; 13 | } 14 | } 15 | 16 | @media screen and (max-width: 420px) { 17 | 18 | .foo { 19 | font-size: 1.6rem; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /test/fixtures/shorthand.css: -------------------------------------------------------------------------------- 1 | .foo { 2 | font-size: responsive 10px 30px; 3 | font-range: 300px 900px; 4 | } 5 | -------------------------------------------------------------------------------- /test/fixtures/shorthand.expected.css: -------------------------------------------------------------------------------- 1 | .foo { 2 | font-size: calc(10px + 20 * ((100vw - 300px) / 600)); 3 | } 4 | @media screen and (min-width: 900px) { 5 | .foo { 6 | font-size: 30px; 7 | } 8 | } 9 | @media screen and (max-width: 300px) { 10 | .foo { 11 | font-size: 10px; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /test/fixtures/unitless_lineheight.css: -------------------------------------------------------------------------------- 1 | .foo { 2 | line-height: responsive 1.5 2; 3 | } 4 | -------------------------------------------------------------------------------- /test/fixtures/unitless_lineheight.expected.css: -------------------------------------------------------------------------------- 1 | .foo { 2 | line-height: calc(1.5 + 0.5 * ((100vw - undefined) / NaN)); 3 | } 4 | @media screen and (min-width: 1280px) { 5 | .foo { 6 | line-height: 2; 7 | } 8 | } 9 | @media screen and (max-width: 420px) { 10 | .foo { 11 | line-height: 1.5; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /test/mocha.opts: -------------------------------------------------------------------------------- 1 | --reporter nyan 2 | -------------------------------------------------------------------------------- /test/test.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const postcss = require('postcss'); 4 | const expect = require('chai').expect; 5 | const fs = require('fs'); 6 | const path = require('path'); 7 | const plugin = require('../'); 8 | 9 | function compareWarnings(warnings, expected) { 10 | warnings.forEach((warning, i) => expect(warning).to.contain(expected[i])); 11 | } 12 | 13 | function test(fixture, opts, warnings, done) { 14 | let input = fixture + '.css', 15 | expected = fixture + '.expected.css'; 16 | 17 | input = fs.readFileSync(path.join(__dirname, 'fixtures', input), 'utf8'); 18 | expected = fs.readFileSync(path.join(__dirname, 'fixtures', expected), 'utf8'); 19 | 20 | postcss([ plugin(opts) ]) 21 | .process(input) 22 | .then(result => { 23 | expect(result.css).to.eql(expected); 24 | 25 | if (warnings.length > 0) { 26 | compareWarnings(result.warnings(), warnings); 27 | } else { 28 | expect(result.warnings()).to.be.empty; 29 | } 30 | 31 | done(); 32 | }).catch(done); 33 | } 34 | 35 | describe('postcss-responsive-type', () => { 36 | 37 | it('builds responsive type with defaults', done => test('default', {}, [], done)); 38 | 39 | it('applies custom parameters', done => test('custom', {}, [], done)); 40 | 41 | it('works with shorthand properties', done => test('shorthand', {}, [], done)); 42 | 43 | it('handles mixed units', done => { 44 | test('mixed', {}, [{ 45 | type: 'warning', 46 | text: 'this combination of units is not supported', 47 | line: 11, 48 | column: 1 49 | }], done); 50 | }); 51 | 52 | it('handles em units', done => test('em', {}, [], done)); 53 | 54 | it('properly calculates rem from root font size', done => test('root', {}, [], done)); 55 | 56 | it('doesn\'t kill fallbacks/duplicate properties', done => test('fallback', {}, [], done)); 57 | 58 | it('sanitizes inputs', done => test('formatting', {}, [], done)); 59 | 60 | describe('line height', () => { 61 | it('sets responsive line-height', done => test('lineheight', {}, [], done)); 62 | 63 | it('sets responsive line-height with extended syntax', done => test('lineheight_extended', {}, [], done)); 64 | 65 | it('warns about responsive unitless line-height', done => { 66 | test('unitless_lineheight', {}, [], error => { 67 | expect(error).to.contain({ 68 | name: 'CssSyntaxError', 69 | reason: 'sizes with unitless values are not supported', 70 | plugin: 'postcss-responsive-type', 71 | source: '.foo {\n line-height: responsive 1.5 2;\n}\n', 72 | line: 1, 73 | column: 1 74 | }); 75 | 76 | done(); 77 | }); 78 | }); 79 | }); 80 | 81 | describe('letterspacing', () => { 82 | it('sets responsive letterspacing', done => test('letterspacing', {}, [], done)); 83 | 84 | it('sets responsive letterspacing with extended syntax', done => test('letterspacing_extended', {}, [], done)); 85 | 86 | it('sets responsive letterspacing with negative values', done => test('letterspacing_negative', {}, [], done)); 87 | }); 88 | }); 89 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | acorn-jsx@^3.0.0: 6 | version "3.0.1" 7 | resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" 8 | dependencies: 9 | acorn "^3.0.4" 10 | 11 | acorn@^3.0.4: 12 | version "3.3.0" 13 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" 14 | 15 | acorn@^5.0.1: 16 | version "5.1.1" 17 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.1.1.tgz#53fe161111f912ab999ee887a90a0bc52822fd75" 18 | 19 | ajv-keywords@^1.0.0: 20 | version "1.5.1" 21 | resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.5.1.tgz#314dd0a4b3368fad3dfcdc54ede6171b886daf3c" 22 | 23 | ajv@^4.7.0: 24 | version "4.11.8" 25 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" 26 | dependencies: 27 | co "^4.6.0" 28 | json-stable-stringify "^1.0.1" 29 | 30 | ajv@^5.2.0: 31 | version "5.2.2" 32 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.2.2.tgz#47c68d69e86f5d953103b0074a9430dc63da5e39" 33 | dependencies: 34 | co "^4.6.0" 35 | fast-deep-equal "^1.0.0" 36 | json-schema-traverse "^0.3.0" 37 | json-stable-stringify "^1.0.1" 38 | 39 | ansi-escapes@^2.0.0: 40 | version "2.0.0" 41 | resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-2.0.0.tgz#5bae52be424878dd9783e8910e3fc2922e83c81b" 42 | 43 | ansi-regex@^2.0.0: 44 | version "2.1.1" 45 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 46 | 47 | ansi-regex@^3.0.0: 48 | version "3.0.0" 49 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" 50 | 51 | ansi-styles@^2.2.1: 52 | version "2.2.1" 53 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" 54 | 55 | ansi-styles@^3.1.0: 56 | version "3.2.0" 57 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.0.tgz#c159b8d5be0f9e5a6f346dab94f16ce022161b88" 58 | dependencies: 59 | color-convert "^1.9.0" 60 | 61 | argparse@^1.0.7: 62 | version "1.0.9" 63 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" 64 | dependencies: 65 | sprintf-js "~1.0.2" 66 | 67 | array-union@^1.0.1: 68 | version "1.0.2" 69 | resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" 70 | dependencies: 71 | array-uniq "^1.0.1" 72 | 73 | array-uniq@^1.0.1: 74 | version "1.0.3" 75 | resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" 76 | 77 | arrify@^1.0.0: 78 | version "1.0.1" 79 | resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" 80 | 81 | assertion-error@^1.0.1: 82 | version "1.0.2" 83 | resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.0.2.tgz#13ca515d86206da0bac66e834dd397d87581094c" 84 | 85 | babel-code-frame@^6.22.0: 86 | version "6.22.0" 87 | resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.22.0.tgz#027620bee567a88c32561574e7fd0801d33118e4" 88 | dependencies: 89 | chalk "^1.1.0" 90 | esutils "^2.0.2" 91 | js-tokens "^3.0.0" 92 | 93 | balanced-match@^1.0.0: 94 | version "1.0.0" 95 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 96 | 97 | brace-expansion@^1.1.7: 98 | version "1.1.8" 99 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" 100 | dependencies: 101 | balanced-match "^1.0.0" 102 | concat-map "0.0.1" 103 | 104 | browser-stdout@1.3.0: 105 | version "1.3.0" 106 | resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.0.tgz#f351d32969d32fa5d7a5567154263d928ae3bd1f" 107 | 108 | caller-path@^0.1.0: 109 | version "0.1.0" 110 | resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" 111 | dependencies: 112 | callsites "^0.2.0" 113 | 114 | callsites@^0.2.0: 115 | version "0.2.0" 116 | resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" 117 | 118 | chai@^4.0.2: 119 | version "4.1.1" 120 | resolved "https://registry.yarnpkg.com/chai/-/chai-4.1.1.tgz#66e21279e6f3c6415ff8231878227900e2171b39" 121 | dependencies: 122 | assertion-error "^1.0.1" 123 | check-error "^1.0.1" 124 | deep-eql "^2.0.1" 125 | get-func-name "^2.0.0" 126 | pathval "^1.0.0" 127 | type-detect "^4.0.0" 128 | 129 | chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3: 130 | version "1.1.3" 131 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" 132 | dependencies: 133 | ansi-styles "^2.2.1" 134 | escape-string-regexp "^1.0.2" 135 | has-ansi "^2.0.0" 136 | strip-ansi "^3.0.0" 137 | supports-color "^2.0.0" 138 | 139 | chalk@^2.0.0: 140 | version "2.0.1" 141 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.0.1.tgz#dbec49436d2ae15f536114e76d14656cdbc0f44d" 142 | dependencies: 143 | ansi-styles "^3.1.0" 144 | escape-string-regexp "^1.0.5" 145 | supports-color "^4.0.0" 146 | 147 | check-error@^1.0.1: 148 | version "1.0.2" 149 | resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" 150 | 151 | circular-json@^0.3.1: 152 | version "0.3.3" 153 | resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" 154 | 155 | cli-cursor@^2.1.0: 156 | version "2.1.0" 157 | resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" 158 | dependencies: 159 | restore-cursor "^2.0.0" 160 | 161 | cli-width@^2.0.0: 162 | version "2.1.0" 163 | resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.1.0.tgz#b234ca209b29ef66fc518d9b98d5847b00edf00a" 164 | 165 | co@^4.6.0: 166 | version "4.6.0" 167 | resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" 168 | 169 | color-convert@^1.9.0: 170 | version "1.9.0" 171 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.0.tgz#1accf97dd739b983bf994d56fec8f95853641b7a" 172 | dependencies: 173 | color-name "^1.1.1" 174 | 175 | color-name@^1.1.1: 176 | version "1.1.3" 177 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 178 | 179 | commander@2.9.0: 180 | version "2.9.0" 181 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" 182 | dependencies: 183 | graceful-readlink ">= 1.0.0" 184 | 185 | concat-map@0.0.1: 186 | version "0.0.1" 187 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 188 | 189 | concat-stream@^1.6.0: 190 | version "1.6.0" 191 | resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" 192 | dependencies: 193 | inherits "^2.0.3" 194 | readable-stream "^2.2.2" 195 | typedarray "^0.0.6" 196 | 197 | core-util-is@~1.0.0: 198 | version "1.0.2" 199 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 200 | 201 | cross-spawn@^5.1.0: 202 | version "5.1.0" 203 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" 204 | dependencies: 205 | lru-cache "^4.0.1" 206 | shebang-command "^1.2.0" 207 | which "^1.2.9" 208 | 209 | debug@2.6.8, debug@^2.6.8: 210 | version "2.6.8" 211 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc" 212 | dependencies: 213 | ms "2.0.0" 214 | 215 | deep-eql@^2.0.1: 216 | version "2.0.2" 217 | resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-2.0.2.tgz#b1bac06e56f0a76777686d50c9feb75c2ed7679a" 218 | dependencies: 219 | type-detect "^3.0.0" 220 | 221 | deep-is@~0.1.3: 222 | version "0.1.3" 223 | resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" 224 | 225 | del@^2.0.2: 226 | version "2.2.2" 227 | resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" 228 | dependencies: 229 | globby "^5.0.0" 230 | is-path-cwd "^1.0.0" 231 | is-path-in-cwd "^1.0.0" 232 | object-assign "^4.0.1" 233 | pify "^2.0.0" 234 | pinkie-promise "^2.0.0" 235 | rimraf "^2.2.8" 236 | 237 | diff@3.2.0: 238 | version "3.2.0" 239 | resolved "https://registry.yarnpkg.com/diff/-/diff-3.2.0.tgz#c9ce393a4b7cbd0b058a725c93df299027868ff9" 240 | 241 | doctrine@^2.0.0: 242 | version "2.0.0" 243 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.0.0.tgz#c73d8d2909d22291e1a007a395804da8b665fe63" 244 | dependencies: 245 | esutils "^2.0.2" 246 | isarray "^1.0.0" 247 | 248 | escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: 249 | version "1.0.5" 250 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 251 | 252 | eslint-scope@^3.7.1: 253 | version "3.7.1" 254 | resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8" 255 | dependencies: 256 | esrecurse "^4.1.0" 257 | estraverse "^4.1.1" 258 | 259 | eslint@^4.1.1: 260 | version "4.3.0" 261 | resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.3.0.tgz#fcd7c96376bbf34c85ee67ed0012a299642b108f" 262 | dependencies: 263 | ajv "^5.2.0" 264 | babel-code-frame "^6.22.0" 265 | chalk "^1.1.3" 266 | concat-stream "^1.6.0" 267 | cross-spawn "^5.1.0" 268 | debug "^2.6.8" 269 | doctrine "^2.0.0" 270 | eslint-scope "^3.7.1" 271 | espree "^3.4.3" 272 | esquery "^1.0.0" 273 | estraverse "^4.2.0" 274 | esutils "^2.0.2" 275 | file-entry-cache "^2.0.0" 276 | functional-red-black-tree "^1.0.1" 277 | glob "^7.1.2" 278 | globals "^9.17.0" 279 | ignore "^3.3.3" 280 | imurmurhash "^0.1.4" 281 | inquirer "^3.0.6" 282 | is-resolvable "^1.0.0" 283 | js-yaml "^3.8.4" 284 | json-stable-stringify "^1.0.1" 285 | levn "^0.3.0" 286 | lodash "^4.17.4" 287 | minimatch "^3.0.2" 288 | mkdirp "^0.5.1" 289 | natural-compare "^1.4.0" 290 | optionator "^0.8.2" 291 | path-is-inside "^1.0.2" 292 | pluralize "^4.0.0" 293 | progress "^2.0.0" 294 | require-uncached "^1.0.3" 295 | semver "^5.3.0" 296 | strip-json-comments "~2.0.1" 297 | table "^4.0.1" 298 | text-table "~0.2.0" 299 | 300 | espree@^3.4.3: 301 | version "3.4.3" 302 | resolved "https://registry.yarnpkg.com/espree/-/espree-3.4.3.tgz#2910b5ccd49ce893c2ffffaab4fd8b3a31b82374" 303 | dependencies: 304 | acorn "^5.0.1" 305 | acorn-jsx "^3.0.0" 306 | 307 | esprima@^4.0.0: 308 | version "4.0.0" 309 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" 310 | 311 | esquery@^1.0.0: 312 | version "1.0.0" 313 | resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.0.tgz#cfba8b57d7fba93f17298a8a006a04cda13d80fa" 314 | dependencies: 315 | estraverse "^4.0.0" 316 | 317 | esrecurse@^4.1.0: 318 | version "4.2.0" 319 | resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.0.tgz#fa9568d98d3823f9a41d91e902dcab9ea6e5b163" 320 | dependencies: 321 | estraverse "^4.1.0" 322 | object-assign "^4.0.1" 323 | 324 | estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: 325 | version "4.2.0" 326 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" 327 | 328 | esutils@^2.0.2: 329 | version "2.0.2" 330 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" 331 | 332 | external-editor@^2.0.4: 333 | version "2.0.4" 334 | resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.0.4.tgz#1ed9199da9cbfe2ef2f7a31b2fde8b0d12368972" 335 | dependencies: 336 | iconv-lite "^0.4.17" 337 | jschardet "^1.4.2" 338 | tmp "^0.0.31" 339 | 340 | fast-deep-equal@^1.0.0: 341 | version "1.0.0" 342 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz#96256a3bc975595eb36d82e9929d060d893439ff" 343 | 344 | fast-levenshtein@~2.0.4: 345 | version "2.0.6" 346 | resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" 347 | 348 | figures@^2.0.0: 349 | version "2.0.0" 350 | resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" 351 | dependencies: 352 | escape-string-regexp "^1.0.5" 353 | 354 | file-entry-cache@^2.0.0: 355 | version "2.0.0" 356 | resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" 357 | dependencies: 358 | flat-cache "^1.2.1" 359 | object-assign "^4.0.1" 360 | 361 | flat-cache@^1.2.1: 362 | version "1.2.2" 363 | resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.2.2.tgz#fa86714e72c21db88601761ecf2f555d1abc6b96" 364 | dependencies: 365 | circular-json "^0.3.1" 366 | del "^2.0.2" 367 | graceful-fs "^4.1.2" 368 | write "^0.2.1" 369 | 370 | fs.realpath@^1.0.0: 371 | version "1.0.0" 372 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 373 | 374 | functional-red-black-tree@^1.0.1: 375 | version "1.0.1" 376 | resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" 377 | 378 | get-func-name@^2.0.0: 379 | version "2.0.0" 380 | resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" 381 | 382 | glob@7.1.1: 383 | version "7.1.1" 384 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" 385 | dependencies: 386 | fs.realpath "^1.0.0" 387 | inflight "^1.0.4" 388 | inherits "2" 389 | minimatch "^3.0.2" 390 | once "^1.3.0" 391 | path-is-absolute "^1.0.0" 392 | 393 | glob@^7.0.3, glob@^7.0.5, glob@^7.1.2: 394 | version "7.1.2" 395 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" 396 | dependencies: 397 | fs.realpath "^1.0.0" 398 | inflight "^1.0.4" 399 | inherits "2" 400 | minimatch "^3.0.4" 401 | once "^1.3.0" 402 | path-is-absolute "^1.0.0" 403 | 404 | globals@^9.17.0: 405 | version "9.18.0" 406 | resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" 407 | 408 | globby@^5.0.0: 409 | version "5.0.0" 410 | resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" 411 | dependencies: 412 | array-union "^1.0.1" 413 | arrify "^1.0.0" 414 | glob "^7.0.3" 415 | object-assign "^4.0.1" 416 | pify "^2.0.0" 417 | pinkie-promise "^2.0.0" 418 | 419 | graceful-fs@^4.1.2: 420 | version "4.1.11" 421 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" 422 | 423 | "graceful-readlink@>= 1.0.0": 424 | version "1.0.1" 425 | resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" 426 | 427 | growl@1.9.2: 428 | version "1.9.2" 429 | resolved "https://registry.yarnpkg.com/growl/-/growl-1.9.2.tgz#0ea7743715db8d8de2c5ede1775e1b45ac85c02f" 430 | 431 | has-ansi@^2.0.0: 432 | version "2.0.0" 433 | resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" 434 | dependencies: 435 | ansi-regex "^2.0.0" 436 | 437 | has-flag@^1.0.0: 438 | version "1.0.0" 439 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" 440 | 441 | has-flag@^2.0.0: 442 | version "2.0.0" 443 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" 444 | 445 | iconv-lite@^0.4.17: 446 | version "0.4.18" 447 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.18.tgz#23d8656b16aae6742ac29732ea8f0336a4789cf2" 448 | 449 | ignore@^3.3.3: 450 | version "3.3.3" 451 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.3.tgz#432352e57accd87ab3110e82d3fea0e47812156d" 452 | 453 | imurmurhash@^0.1.4: 454 | version "0.1.4" 455 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 456 | 457 | inflight@^1.0.4: 458 | version "1.0.6" 459 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 460 | dependencies: 461 | once "^1.3.0" 462 | wrappy "1" 463 | 464 | inherits@2, inherits@^2.0.3, inherits@~2.0.3: 465 | version "2.0.3" 466 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 467 | 468 | inquirer@^3.0.6: 469 | version "3.2.1" 470 | resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.2.1.tgz#06ceb0f540f45ca548c17d6840959878265fa175" 471 | dependencies: 472 | ansi-escapes "^2.0.0" 473 | chalk "^2.0.0" 474 | cli-cursor "^2.1.0" 475 | cli-width "^2.0.0" 476 | external-editor "^2.0.4" 477 | figures "^2.0.0" 478 | lodash "^4.3.0" 479 | mute-stream "0.0.7" 480 | run-async "^2.2.0" 481 | rx-lite "^4.0.8" 482 | rx-lite-aggregates "^4.0.8" 483 | string-width "^2.1.0" 484 | strip-ansi "^4.0.0" 485 | through "^2.3.6" 486 | 487 | is-fullwidth-code-point@^2.0.0: 488 | version "2.0.0" 489 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 490 | 491 | is-path-cwd@^1.0.0: 492 | version "1.0.0" 493 | resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" 494 | 495 | is-path-in-cwd@^1.0.0: 496 | version "1.0.0" 497 | resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003be8a9eac04dc" 498 | dependencies: 499 | is-path-inside "^1.0.0" 500 | 501 | is-path-inside@^1.0.0: 502 | version "1.0.0" 503 | resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.0.tgz#fc06e5a1683fbda13de667aff717bbc10a48f37f" 504 | dependencies: 505 | path-is-inside "^1.0.1" 506 | 507 | is-promise@^2.1.0: 508 | version "2.1.0" 509 | resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" 510 | 511 | is-resolvable@^1.0.0: 512 | version "1.0.0" 513 | resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.0.0.tgz#8df57c61ea2e3c501408d100fb013cf8d6e0cc62" 514 | dependencies: 515 | tryit "^1.0.1" 516 | 517 | isarray@^1.0.0, isarray@~1.0.0: 518 | version "1.0.0" 519 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 520 | 521 | isexe@^2.0.0: 522 | version "2.0.0" 523 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 524 | 525 | js-tokens@^3.0.0: 526 | version "3.0.2" 527 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" 528 | 529 | js-yaml@^3.8.4: 530 | version "3.9.1" 531 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.9.1.tgz#08775cebdfdd359209f0d2acd383c8f86a6904a0" 532 | dependencies: 533 | argparse "^1.0.7" 534 | esprima "^4.0.0" 535 | 536 | jschardet@^1.4.2: 537 | version "1.5.0" 538 | resolved "https://registry.yarnpkg.com/jschardet/-/jschardet-1.5.0.tgz#a61f310306a5a71188e1b1acd08add3cfbb08b1e" 539 | 540 | json-schema-traverse@^0.3.0: 541 | version "0.3.1" 542 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" 543 | 544 | json-stable-stringify@^1.0.1: 545 | version "1.0.1" 546 | resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" 547 | dependencies: 548 | jsonify "~0.0.0" 549 | 550 | json3@3.3.2: 551 | version "3.3.2" 552 | resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" 553 | 554 | jsonify@~0.0.0: 555 | version "0.0.0" 556 | resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" 557 | 558 | levn@^0.3.0, levn@~0.3.0: 559 | version "0.3.0" 560 | resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" 561 | dependencies: 562 | prelude-ls "~1.1.2" 563 | type-check "~0.3.2" 564 | 565 | lodash._baseassign@^3.0.0: 566 | version "3.2.0" 567 | resolved "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e" 568 | dependencies: 569 | lodash._basecopy "^3.0.0" 570 | lodash.keys "^3.0.0" 571 | 572 | lodash._basecopy@^3.0.0: 573 | version "3.0.1" 574 | resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" 575 | 576 | lodash._basecreate@^3.0.0: 577 | version "3.0.3" 578 | resolved "https://registry.yarnpkg.com/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz#1bc661614daa7fc311b7d03bf16806a0213cf821" 579 | 580 | lodash._getnative@^3.0.0: 581 | version "3.9.1" 582 | resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" 583 | 584 | lodash._isiterateecall@^3.0.0: 585 | version "3.0.9" 586 | resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" 587 | 588 | lodash.create@3.1.1: 589 | version "3.1.1" 590 | resolved "https://registry.yarnpkg.com/lodash.create/-/lodash.create-3.1.1.tgz#d7f2849f0dbda7e04682bb8cd72ab022461debe7" 591 | dependencies: 592 | lodash._baseassign "^3.0.0" 593 | lodash._basecreate "^3.0.0" 594 | lodash._isiterateecall "^3.0.0" 595 | 596 | lodash.isarguments@^3.0.0: 597 | version "3.1.0" 598 | resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" 599 | 600 | lodash.isarray@^3.0.0: 601 | version "3.0.4" 602 | resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" 603 | 604 | lodash.keys@^3.0.0: 605 | version "3.1.2" 606 | resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" 607 | dependencies: 608 | lodash._getnative "^3.0.0" 609 | lodash.isarguments "^3.0.0" 610 | lodash.isarray "^3.0.0" 611 | 612 | lodash@^4.0.0, lodash@^4.17.4, lodash@^4.3.0: 613 | version "4.17.4" 614 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" 615 | 616 | lru-cache@^4.0.1: 617 | version "4.1.1" 618 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55" 619 | dependencies: 620 | pseudomap "^1.0.2" 621 | yallist "^2.1.2" 622 | 623 | mimic-fn@^1.0.0: 624 | version "1.1.0" 625 | resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.1.0.tgz#e667783d92e89dbd342818b5230b9d62a672ad18" 626 | 627 | minimatch@^3.0.2, minimatch@^3.0.4: 628 | version "3.0.4" 629 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 630 | dependencies: 631 | brace-expansion "^1.1.7" 632 | 633 | minimist@0.0.8: 634 | version "0.0.8" 635 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 636 | 637 | mkdirp@0.5.1, mkdirp@^0.5.1: 638 | version "0.5.1" 639 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 640 | dependencies: 641 | minimist "0.0.8" 642 | 643 | mocha@^3.4.2: 644 | version "3.5.0" 645 | resolved "https://registry.yarnpkg.com/mocha/-/mocha-3.5.0.tgz#1328567d2717f997030f8006234bce9b8cd72465" 646 | dependencies: 647 | browser-stdout "1.3.0" 648 | commander "2.9.0" 649 | debug "2.6.8" 650 | diff "3.2.0" 651 | escape-string-regexp "1.0.5" 652 | glob "7.1.1" 653 | growl "1.9.2" 654 | json3 "3.3.2" 655 | lodash.create "3.1.1" 656 | mkdirp "0.5.1" 657 | supports-color "3.1.2" 658 | 659 | ms@2.0.0: 660 | version "2.0.0" 661 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 662 | 663 | mute-stream@0.0.7: 664 | version "0.0.7" 665 | resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" 666 | 667 | nanoid@^3.2.0: 668 | version "3.3.1" 669 | resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.1.tgz#6347a18cac88af88f58af0b3594b723d5e99bb35" 670 | integrity sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw== 671 | 672 | natural-compare@^1.4.0: 673 | version "1.4.0" 674 | resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" 675 | 676 | object-assign@^4.0.1: 677 | version "4.1.1" 678 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 679 | 680 | once@^1.3.0: 681 | version "1.4.0" 682 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 683 | dependencies: 684 | wrappy "1" 685 | 686 | onetime@^2.0.0: 687 | version "2.0.1" 688 | resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" 689 | dependencies: 690 | mimic-fn "^1.0.0" 691 | 692 | optionator@^0.8.2: 693 | version "0.8.2" 694 | resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" 695 | dependencies: 696 | deep-is "~0.1.3" 697 | fast-levenshtein "~2.0.4" 698 | levn "~0.3.0" 699 | prelude-ls "~1.1.2" 700 | type-check "~0.3.2" 701 | wordwrap "~1.0.0" 702 | 703 | os-tmpdir@~1.0.1: 704 | version "1.0.2" 705 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 706 | 707 | path-is-absolute@^1.0.0: 708 | version "1.0.1" 709 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 710 | 711 | path-is-inside@^1.0.1, path-is-inside@^1.0.2: 712 | version "1.0.2" 713 | resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" 714 | 715 | pathval@^1.0.0: 716 | version "1.1.0" 717 | resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0" 718 | 719 | picocolors@^1.0.0: 720 | version "1.0.0" 721 | resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" 722 | integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== 723 | 724 | pify@^2.0.0: 725 | version "2.3.0" 726 | resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" 727 | 728 | pinkie-promise@^2.0.0: 729 | version "2.0.1" 730 | resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" 731 | dependencies: 732 | pinkie "^2.0.0" 733 | 734 | pinkie@^2.0.0: 735 | version "2.0.4" 736 | resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" 737 | 738 | pluralize@^4.0.0: 739 | version "4.0.0" 740 | resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-4.0.0.tgz#59b708c1c0190a2f692f1c7618c446b052fd1762" 741 | 742 | postcss@^8.4.6: 743 | version "8.4.6" 744 | resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.6.tgz#c5ff3c3c457a23864f32cb45ac9b741498a09ae1" 745 | integrity sha512-OovjwIzs9Te46vlEx7+uXB0PLijpwjXGKXjVGGPIGubGpq7uh5Xgf6D6FiJ/SzJMBosHDp6a2hiXOS97iBXcaA== 746 | dependencies: 747 | nanoid "^3.2.0" 748 | picocolors "^1.0.0" 749 | source-map-js "^1.0.2" 750 | 751 | prelude-ls@~1.1.2: 752 | version "1.1.2" 753 | resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" 754 | 755 | process-nextick-args@~1.0.6: 756 | version "1.0.7" 757 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" 758 | 759 | progress@^2.0.0: 760 | version "2.0.0" 761 | resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" 762 | 763 | pseudomap@^1.0.2: 764 | version "1.0.2" 765 | resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" 766 | 767 | readable-stream@^2.2.2: 768 | version "2.3.3" 769 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" 770 | dependencies: 771 | core-util-is "~1.0.0" 772 | inherits "~2.0.3" 773 | isarray "~1.0.0" 774 | process-nextick-args "~1.0.6" 775 | safe-buffer "~5.1.1" 776 | string_decoder "~1.0.3" 777 | util-deprecate "~1.0.1" 778 | 779 | require-uncached@^1.0.3: 780 | version "1.0.3" 781 | resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" 782 | dependencies: 783 | caller-path "^0.1.0" 784 | resolve-from "^1.0.0" 785 | 786 | resolve-from@^1.0.0: 787 | version "1.0.1" 788 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" 789 | 790 | restore-cursor@^2.0.0: 791 | version "2.0.0" 792 | resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" 793 | dependencies: 794 | onetime "^2.0.0" 795 | signal-exit "^3.0.2" 796 | 797 | rimraf@^2.2.8: 798 | version "2.6.1" 799 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d" 800 | dependencies: 801 | glob "^7.0.5" 802 | 803 | run-async@^2.2.0: 804 | version "2.3.0" 805 | resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" 806 | dependencies: 807 | is-promise "^2.1.0" 808 | 809 | rx-lite-aggregates@^4.0.8: 810 | version "4.0.8" 811 | resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" 812 | dependencies: 813 | rx-lite "*" 814 | 815 | rx-lite@*, rx-lite@^4.0.8: 816 | version "4.0.8" 817 | resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" 818 | 819 | safe-buffer@~5.1.0, safe-buffer@~5.1.1: 820 | version "5.1.1" 821 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" 822 | 823 | semver@^5.3.0: 824 | version "5.4.1" 825 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" 826 | 827 | shebang-command@^1.2.0: 828 | version "1.2.0" 829 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" 830 | dependencies: 831 | shebang-regex "^1.0.0" 832 | 833 | shebang-regex@^1.0.0: 834 | version "1.0.0" 835 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" 836 | 837 | signal-exit@^3.0.2: 838 | version "3.0.2" 839 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" 840 | 841 | slice-ansi@0.0.4: 842 | version "0.0.4" 843 | resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" 844 | 845 | source-map-js@^1.0.2: 846 | version "1.0.2" 847 | resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" 848 | integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== 849 | 850 | sprintf-js@~1.0.2: 851 | version "1.0.3" 852 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 853 | 854 | string-width@^2.0.0, string-width@^2.1.0: 855 | version "2.1.1" 856 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" 857 | dependencies: 858 | is-fullwidth-code-point "^2.0.0" 859 | strip-ansi "^4.0.0" 860 | 861 | string_decoder@~1.0.3: 862 | version "1.0.3" 863 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" 864 | dependencies: 865 | safe-buffer "~5.1.0" 866 | 867 | strip-ansi@^3.0.0: 868 | version "3.0.1" 869 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 870 | dependencies: 871 | ansi-regex "^2.0.0" 872 | 873 | strip-ansi@^4.0.0: 874 | version "4.0.0" 875 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" 876 | dependencies: 877 | ansi-regex "^3.0.0" 878 | 879 | strip-json-comments@~2.0.1: 880 | version "2.0.1" 881 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 882 | 883 | supports-color@3.1.2: 884 | version "3.1.2" 885 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.1.2.tgz#72a262894d9d408b956ca05ff37b2ed8a6e2a2d5" 886 | dependencies: 887 | has-flag "^1.0.0" 888 | 889 | supports-color@^2.0.0: 890 | version "2.0.0" 891 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" 892 | 893 | supports-color@^4.0.0: 894 | version "4.2.1" 895 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.2.1.tgz#65a4bb2631e90e02420dba5554c375a4754bb836" 896 | dependencies: 897 | has-flag "^2.0.0" 898 | 899 | table@^4.0.1: 900 | version "4.0.1" 901 | resolved "https://registry.yarnpkg.com/table/-/table-4.0.1.tgz#a8116c133fac2c61f4a420ab6cdf5c4d61f0e435" 902 | dependencies: 903 | ajv "^4.7.0" 904 | ajv-keywords "^1.0.0" 905 | chalk "^1.1.1" 906 | lodash "^4.0.0" 907 | slice-ansi "0.0.4" 908 | string-width "^2.0.0" 909 | 910 | text-table@~0.2.0: 911 | version "0.2.0" 912 | resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" 913 | 914 | through@^2.3.6: 915 | version "2.3.8" 916 | resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" 917 | 918 | tmp@^0.0.31: 919 | version "0.0.31" 920 | resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.31.tgz#8f38ab9438e17315e5dbd8b3657e8bfb277ae4a7" 921 | dependencies: 922 | os-tmpdir "~1.0.1" 923 | 924 | tryit@^1.0.1: 925 | version "1.0.3" 926 | resolved "https://registry.yarnpkg.com/tryit/-/tryit-1.0.3.tgz#393be730a9446fd1ead6da59a014308f36c289cb" 927 | 928 | type-check@~0.3.2: 929 | version "0.3.2" 930 | resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" 931 | dependencies: 932 | prelude-ls "~1.1.2" 933 | 934 | type-detect@^3.0.0: 935 | version "3.0.0" 936 | resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-3.0.0.tgz#46d0cc8553abb7b13a352b0d6dea2fd58f2d9b55" 937 | 938 | type-detect@^4.0.0: 939 | version "4.0.3" 940 | resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.3.tgz#0e3f2670b44099b0b46c284d136a7ef49c74c2ea" 941 | 942 | typedarray@^0.0.6: 943 | version "0.0.6" 944 | resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" 945 | 946 | util-deprecate@~1.0.1: 947 | version "1.0.2" 948 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 949 | 950 | which@^1.2.9: 951 | version "1.3.0" 952 | resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" 953 | dependencies: 954 | isexe "^2.0.0" 955 | 956 | wordwrap@~1.0.0: 957 | version "1.0.0" 958 | resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" 959 | 960 | wrappy@1: 961 | version "1.0.2" 962 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 963 | 964 | write@^0.2.1: 965 | version "0.2.1" 966 | resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" 967 | dependencies: 968 | mkdirp "^0.5.1" 969 | 970 | yallist@^2.1.2: 971 | version "2.1.2" 972 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" 973 | --------------------------------------------------------------------------------