├── .editorconfig ├── .gitattributes ├── .gitignore ├── .travis.yml ├── CHANGELOG.md ├── LICENSE ├── README.md ├── cli.js ├── config.js ├── fixtures ├── find-package │ ├── deep │ │ └── style.css │ ├── node_modules │ │ ├── .yarn-integrity │ │ ├── prettier │ │ │ ├── index.js │ │ │ └── package.json │ │ └── stylelint │ │ │ ├── lib │ │ │ └── index.js │ │ │ └── package.json │ ├── package.json │ └── style.css ├── less.less ├── package.json └── style.css ├── index.js ├── package.json ├── src ├── cli.js ├── index.js └── utils.js ├── test.js ├── tests ├── error-after-format.css ├── error-syntax.css ├── less.less ├── nestes.css ├── package.json ├── rules │ └── color-no-invalid-hex.css └── test-disable-rules.css └── yarn.lock /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | indent_style = space 5 | indent_size = 4 6 | end_of_line = lf 7 | charset = utf-8 8 | trim_trailing_whitespace = true 9 | insert_final_newline = true 10 | 11 | [{*.yml}] 12 | indent_style = space 13 | indent_size = 2 14 | 15 | [*.md] 16 | trim_trailing_whitespace = false 17 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | logs 2 | *.log 3 | .DS_Store 4 | pids 5 | *.pid 6 | *.seed 7 | coverage 8 | node_modules 9 | .eslintcache 10 | .esm-cache 11 | .vscode 12 | .nyc_output 13 | coverage.lcov 14 | !fixtures/find-package/node_modules 15 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - '8' 4 | - '6' 5 | after_script: 6 | - 'yarn cov:report' 7 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | 2 | ## [0.4.2](https://github.com/hugomrdias/prettier-stylelint/compare/v0.4.1...v0.4.2) (2017-09-25) 3 | 4 | 5 | ### Bug Fixes 6 | 7 | * add repo url ([0be9ac6](https://github.com/hugomrdias/prettier-stylelint/commit/0be9ac6)) 8 | 9 | 10 | 11 | 12 | ## [0.4.1](https://github.com/hugomrdias/prettier-stylelint/compare/v0.4.0...v0.4.1) (2017-09-25) 13 | 14 | 15 | 16 | 17 | # [0.4.0](https://github.com/hugomrdias/prettier-stylelint/compare/v0.3.2...v0.4.0) (2017-09-25) 18 | 19 | 20 | ### Features 21 | 22 | * lookup prettier config and relative package import, plus more tests ([bbc651a](https://github.com/hugomrdias/prettier-stylelint/commit/bbc651a)) 23 | 24 | 25 | 26 | 27 | ## [0.3.2](https://github.com/hugomrdias/prettier-stylelint/compare/v0.3.1...v0.3.2) (2017-09-21) 28 | 29 | 30 | ### Bug Fixes 31 | 32 | * dont re use the same linter instance because we can't invalidate the config cache ([b6e1f7b](https://github.com/hugomrdias/prettier-stylelint/commit/b6e1f7b)) 33 | 34 | 35 | 36 | 37 | ## [0.3.1](https://github.com/hugomrdias/prettier-stylelint/compare/v0.3.0...v0.3.1) (2017-09-21) 38 | 39 | 40 | ### Bug Fixes 41 | 42 | * fix tests and update deps ([fa9ee6e](https://github.com/hugomrdias/prettier-stylelint/commit/fa9ee6e)) 43 | * vscode extension PR url ([6da9874](https://github.com/hugomrdias/prettier-stylelint/commit/6da9874)) 44 | 45 | 46 | 47 | 48 | # [0.3.0](https://github.com/hugomrdias/prettier-stylelint/compare/v0.2.3...v0.3.0) (2017-09-19) 49 | 50 | 51 | ### Features 52 | 53 | * no more temp file to fix with stylelint ([d78b40c](https://github.com/hugomrdias/prettier-stylelint/commit/d78b40c)) 54 | 55 | 56 | 57 | 58 | ## [0.2.3](https://github.com/hugomrdias/prettier-stylelint/compare/v0.2.1...v0.2.3) (2017-09-19) 59 | 60 | 61 | ### Bug Fixes 62 | 63 | * changelog commit again ([57426d4](https://github.com/hugomrdias/prettier-stylelint/commit/57426d4)) 64 | 65 | 66 | 67 | 68 | ## [0.2.1](https://github.com/hugomrdias/prettier-stylelint/compare/v0.2.0...v0.2.1) (2017-09-19) 69 | 70 | 71 | ### Bug Fixes 72 | 73 | * add version to build changelog with np ([b925156](https://github.com/hugomrdias/prettier-stylelint/commit/b925156)) 74 | 75 | 76 | ### Features 77 | 78 | * add changelog ([2839723](https://github.com/hugomrdias/prettier-stylelint/commit/2839723)) 79 | 80 | 81 | 82 | 83 | # [0.2.0](https://github.com/hugomrdias/prettier-stylelint/compare/v0.1.1...v0.2.0) (2017-09-14) 84 | 85 | 86 | ### Bug Fixes 87 | 88 | * no need to check for arrays anymore ([cc27ee9](https://github.com/hugomrdias/prettier-stylelint/commit/cc27ee9)) 89 | 90 | 91 | ### Features 92 | 93 | * support extends and add compatibility stylelint config ([5698124](https://github.com/hugomrdias/prettier-stylelint/commit/5698124)) 94 | 95 | 96 | 97 | 98 | ## [0.1.1](https://github.com/hugomrdias/prettier-stylelint/compare/v0.1.0...v0.1.1) (2017-09-13) 99 | 100 | 101 | 102 | 103 | # [0.1.0](https://github.com/hugomrdias/prettier-stylelint/compare/v0.0.1...v0.1.0) (2017-09-13) 104 | 105 | 106 | ### Features 107 | 108 | * finish cli ([3e2a6ff](https://github.com/hugomrdias/prettier-stylelint/commit/3e2a6ff)) 109 | 110 | 111 | 112 | 113 | ## [0.0.1](https://github.com/hugomrdias/prettier-stylelint/compare/6dbf2f7...v0.0.1) (2017-09-12) 114 | 115 | 116 | ### Bug Fixes 117 | 118 | * cleanup cli ([abf97a2](https://github.com/hugomrdias/prettier-stylelint/commit/abf97a2)) 119 | * make this test pass needs further investigation ([208de52](https://github.com/hugomrdias/prettier-stylelint/commit/208de52)) 120 | * make this test pass needs further investigation ([f83496b](https://github.com/hugomrdias/prettier-stylelint/commit/f83496b)) 121 | * remove [@std](https://github.com/std)/esm cause it breaks in vscode extension ([fa198eb](https://github.com/hugomrdias/prettier-stylelint/commit/fa198eb)) 122 | 123 | 124 | ### Features 125 | 126 | * add initial implementation for the formatter and cli ([6dbf2f7](https://github.com/hugomrdias/prettier-stylelint/commit/6dbf2f7)) 127 | * add more tests and test custom syntax support ([a1c813b](https://github.com/hugomrdias/prettier-stylelint/commit/a1c813b)) 128 | 129 | 130 | 131 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) Hugo Dias (https://hugodias.me) 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, 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, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # prettier-stylelint [![NPM Version](https://img.shields.io/npm/v/prettier-stylelint.svg)](https://www.npmjs.com/package/prettier-stylelint) [![NPM Downloads](https://img.shields.io/npm/dt/prettier-stylelint.svg)](https://www.npmjs.com/package/prettier-stylelint) [![NPM License](https://img.shields.io/npm/l/prettier-stylelint.svg)](https://www.npmjs.com/package/prettier-stylelint) [![Build Status](https://travis-ci.org/hugomrdias/prettier-stylelint.svg?branch=master)](https://travis-ci.org/hugomrdias/prettier-stylelint) [![codecov](https://codecov.io/gh/hugomrdias/prettier-stylelint/branch/master/graph/badge.svg)](https://codecov.io/gh/hugomrdias/prettier-stylelint) 2 | > Format your styles with ease! 3 | 4 | code > prettier > stylelint > formatted code 5 | 6 | prettier-stylelint attempts to create a prettier config based on the stylelint config, then format with prettier followed by stylelint --fix. So after that you should end up with formatted code with no linting errors. 7 | 8 | ## Install 9 | 10 | ```bash 11 | yarn add prettier-stylelint -D 12 | npm install prettier-stylelint --save-dev 13 | ``` 14 | 15 | ## Usage 16 | This package has a stylelint config to disable some rules that conflict with prettier. 17 | 18 | 19 | ```json 20 | "stylelint": { 21 | "extends": [ 22 | "stylelint-config-idiomatic-order", 23 | "./node_modules/prettier-stylelint/config.js" 24 | ], 25 | "rules": { 26 | "indentation": 4, 27 | "string-quotes": "single" 28 | } 29 | } 30 | 31 | ``` 32 | 33 | After adding the disabling config you can just `prettier-stylelint --write` and its done. Check the CLI options below for more information. 34 | Also in a near future we should have support for prettier-stylelint in `prettier-vscode` follow this [PR](https://github.com/prettier/prettier-vscode/pull/218). 35 | 36 | 37 | ### API 38 | ```js 39 | const format = require('prettier-eslint') 40 | const sourceCode = 'a[id="foo"] { content: "x"; }' 41 | const options = { 42 | text: sourceCode 43 | } 44 | const formatted = format(options) 45 | 46 | 47 | // formatted 48 | a[id='foo'] { 49 | content: 'x'; 50 | } 51 | ``` 52 | 53 | ### CLI Options 54 | 55 | The cli automatically ignores `.gitignore` and `.prettierignore`. 56 | 57 | >**NOTE:** It is recommended that you keep your files under source control and committed 58 | > before running `prettier-stylelint --write` as it will overwrite your files! 59 | 60 | 61 | ``` 62 | Usage 63 | $ prettier-stylelint [ ...] 64 | 65 | Options 66 | --ignore Additional paths to ignore [Can be set multiple times] 67 | --extension Additional extension to lint [Can be set multiple times] 68 | --cwd= Working directory for files 69 | --stdin Validate/fix code from stdin ('prettier-stylelint -' also works) 70 | --write Edit files in place (DRAGONS AHEAD !!) 71 | --quiet -q Only log stderr 72 | 73 | Examples 74 | $ prettier-stylelint 75 | $ prettier-stylelint index.js 76 | $ prettier-stylelint *.js !foo.js 77 | $ echo 'a[id="foo"] { content: "x"; }' | prettier-stylelint --stdin 78 | 79 | Default pattern when no arguments: 80 | **/*.{css,scss,less,sss} 81 | ``` 82 | 83 | ## Related 84 | 85 | - [prettier-vscode](https://github.com/esbenp/prettier-vscode) - prettier vscode extension 86 | - [prettier-eslint](https://github.com/prettier/prettier-eslint) - the inspiration for this package 87 | - [stylelint](https://github.com/stylelint/stylelint) - the linter ^^ 88 | 89 | ## License 90 | 91 | MIT © [Hugo Dias](https://hugodias.me) 92 | -------------------------------------------------------------------------------- /cli.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 'use strict'; 3 | 4 | const debug = require('debug')('prettier-stylelint'); 5 | const importLocal = require('import-local'); 6 | 7 | // Prefer the local installation of prettier-stylelint 8 | if (importLocal(__filename)) { 9 | debug('Using local install of prettier-stylelint cli'); 10 | } else { 11 | try { 12 | require('./src/cli'); 13 | } catch (err) { 14 | console.error(`\n ${err.message}`); 15 | process.exit(1); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /config.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | module.exports = { 4 | rules: { 5 | 'function-comma-newline-after': null, 6 | 'function-comma-newline-before': null, 7 | 'function-comma-space-after': null, 8 | 'function-comma-space-before': null, 9 | 'function-max-empty-lines': null, 10 | 'function-parentheses-newline-inside': null, 11 | 'function-parentheses-space-inside': null, 12 | // prettier doesnt care about this space lets keep it here 13 | // "function-whitespace-after": "always"|"never", 14 | 'value-list-comma-newline-after': null, 15 | 'value-list-comma-newline-before': null, 16 | 'value-list-comma-space-after': null, 17 | 'value-list-comma-space-before': null, 18 | 'value-list-max-empty-lines': null, 19 | // this is fixable but lets keep it 20 | // 'custom-property-empty-line-before': 'never' 21 | 'declaration-bang-space-after': 'never', 22 | 'declaration-bang-space-before': 'always', 23 | 'declaration-colon-newline-after': null, 24 | 'declaration-colon-space-after': null, 25 | 'declaration-colon-space-before': null, 26 | 'declaration-block-semicolon-newline-after': null, 27 | 'declaration-block-semicolon-newline-before': null, 28 | 'declaration-block-semicolon-space-after': null, 29 | 'declaration-block-semicolon-space-before': null, 30 | // prettier always adds the trailing semicolon 31 | 'declaration-block-trailing-semicolon': null, 32 | 'block-closing-brace-empty-line-before': null, 33 | 'block-closing-brace-newline-after': null, 34 | 'block-closing-brace-newline-before': null, 35 | 'block-closing-brace-space-after': null, 36 | 'block-closing-brace-space-before': null, 37 | 'block-opening-brace-newline-after': null, 38 | 'block-opening-brace-newline-before': null, 39 | 'block-opening-brace-space-after': null, 40 | 'block-opening-brace-space-before': null, 41 | 'selector-attribute-brackets-space-inside': 'never', 42 | // prettier doesnt care about this space 43 | // 'selector-attribute-operator-space-after': 'never' 44 | // 'selector-attribute-operator-space-before': 'never' 45 | 'selector-attribute-quotes': 'always', 46 | 'selector-combinator-space-after': 'always', 47 | 'selector-combinator-space-before': 'always', 48 | 'selector-descendant-combinator-no-non-space': true, 49 | 'selector-pseudo-class-parentheses-space-inside': 'never', 50 | 'selector-list-comma-newline-after': null, 51 | 'selector-list-comma-newline-before': null, 52 | 'selector-list-comma-space-after': null, 53 | 'selector-list-comma-space-before': null, 54 | 'media-feature-colon-space-after': 'always', 55 | 'media-feature-colon-space-before': 'never', 56 | 'media-feature-parentheses-space-inside': 'never', 57 | // prettier doesnt care about this space 58 | // 'media-feature-range-operator-space-after': 'always', 59 | // 'media-feature-range-operator-space-before': 'always' 60 | 'media-query-list-comma-newline-after': null, 61 | 'media-query-list-comma-newline-before': null, 62 | 'media-query-list-comma-space-after': 'always', 63 | 'media-query-list-comma-space-before': 'never', 64 | 'at-rule-name-newline-after': null, 65 | 'at-rule-name-space-after': 'always', 66 | 'at-rule-semicolon-newline-after': null, 67 | 'at-rule-semicolon-space-before': 'never', 68 | // prettier doesnt care about this whitespace 69 | // 'comment-whitespace-inside': 'always' 70 | 71 | // debatable ( this also checks comments which prettier doesnt care) 72 | 'max-empty-lines': null, 73 | 'no-eol-whitespace': null 74 | } 75 | }; 76 | -------------------------------------------------------------------------------- /fixtures/find-package/deep/style.css: -------------------------------------------------------------------------------- 1 | @media print { 2 | a { 3 | color: #ffffff; 4 | background-position: top left, 5 | top right; 6 | } 7 | } 8 | 9 | 10 | 11 | 12 | a[id="foo"] { content: "x"; } 13 | -------------------------------------------------------------------------------- /fixtures/find-package/node_modules/.yarn-integrity: -------------------------------------------------------------------------------- 1 | { 2 | "modulesFolders": [ 3 | "node_modules" 4 | ], 5 | "flags": [], 6 | "linkedModules": [], 7 | "topLevelPatterns": [ 8 | "prettier@1.6.0", 9 | "stylelint@8.0.0" 10 | ], 11 | "lockfileEntries": { 12 | "ajv-keywords@^1.0.0": "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.5.1.tgz#314dd0a4b3368fad3dfcdc54ede6171b886daf3c", 13 | "ajv@^4.7.0": "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536", 14 | "ansi-regex@^2.0.0": "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df", 15 | "ansi-regex@^3.0.0": "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998", 16 | "ansi-styles@^2.2.1": "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe", 17 | "ansi-styles@^3.1.0": "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.0.tgz#c159b8d5be0f9e5a6f346dab94f16ce022161b88", 18 | "argparse@^1.0.7": "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86", 19 | "arr-diff@^2.0.0": "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf", 20 | "arr-flatten@^1.0.1": "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1", 21 | "array-find-index@^1.0.1": "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1", 22 | "array-union@^1.0.1": "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39", 23 | "array-uniq@^1.0.1": "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6", 24 | "array-unique@^0.2.1": "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53", 25 | "arrify@^1.0.0": "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d", 26 | "autoprefixer@^7.1.2": "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-7.1.4.tgz#960847dbaa4016bc8e8e52ec891cbf8f1257a748", 27 | "balanced-match@^1.0.0": "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767", 28 | "brace-expansion@^1.1.7": "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292", 29 | "braces@^1.8.2": "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7", 30 | "browserslist@^2.4.0": "https://registry.yarnpkg.com/browserslist/-/browserslist-2.4.0.tgz#693ee93d01e66468a6348da5498e011f578f87f8", 31 | "builtin-modules@^1.0.0": "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f", 32 | "camelcase-keys@^2.0.0": "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7", 33 | "camelcase@^2.0.0": "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f", 34 | "caniuse-lite@^1.0.30000718": "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000738.tgz#1820c3c9adb9a117e311a5bdca1d25bc34288eba", 35 | "caniuse-lite@^1.0.30000726": "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000738.tgz#1820c3c9adb9a117e311a5bdca1d25bc34288eba", 36 | "chalk@^1.0.0": "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98", 37 | "chalk@^1.1.1": "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98", 38 | "chalk@^1.1.3": "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98", 39 | "chalk@^2.0.1": "https://registry.yarnpkg.com/chalk/-/chalk-2.1.0.tgz#ac5becf14fa21b99c6c92ca7a7d7cfd5b17e743e", 40 | "chalk@^2.1.0": "https://registry.yarnpkg.com/chalk/-/chalk-2.1.0.tgz#ac5becf14fa21b99c6c92ca7a7d7cfd5b17e743e", 41 | "circular-json@^0.3.1": "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66", 42 | "clone-regexp@^1.0.0": "https://registry.yarnpkg.com/clone-regexp/-/clone-regexp-1.0.0.tgz#eae0a2413f55c0942f818c229fefce845d7f3b1c", 43 | "co@^4.6.0": "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184", 44 | "color-convert@^1.9.0": "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.0.tgz#1accf97dd739b983bf994d56fec8f95853641b7a", 45 | "color-name@^1.1.1": "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25", 46 | "concat-map@0.0.1": "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b", 47 | "cosmiconfig@^2.1.3": "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-2.2.2.tgz#6173cebd56fac042c1f4390edf7af6c07c7cb892", 48 | "currently-unhandled@^0.4.1": "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea", 49 | "debug@^2.6.8": "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f", 50 | "decamelize@^1.1.2": "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290", 51 | "del@^2.0.2": "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8", 52 | "electron-to-chromium@^1.3.18": "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.22.tgz#4322d52c151406e3eaef74ad02676883e8416418", 53 | "error-ex@^1.2.0": "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc", 54 | "escape-string-regexp@^1.0.2": "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4", 55 | "escape-string-regexp@^1.0.5": "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4", 56 | "esprima@^4.0.0": "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804", 57 | "execall@^1.0.0": "https://registry.yarnpkg.com/execall/-/execall-1.0.0.tgz#73d0904e395b3cab0658b08d09ec25307f29bb73", 58 | "expand-brackets@^0.1.4": "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b", 59 | "expand-range@^1.8.1": "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337", 60 | "extglob@^0.3.1": "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1", 61 | "file-entry-cache@^2.0.0": "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361", 62 | "filename-regex@^2.0.0": "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26", 63 | "fill-range@^2.1.0": "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723", 64 | "find-up@^1.0.0": "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f", 65 | "flat-cache@^1.2.1": "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.2.2.tgz#fa86714e72c21db88601761ecf2f555d1abc6b96", 66 | "flatten@^1.0.2": "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782", 67 | "for-in@^1.0.1": "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80", 68 | "for-own@^0.1.4": "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce", 69 | "fs.realpath@^1.0.0": "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f", 70 | "get-stdin@^4.0.1": "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe", 71 | "get-stdin@^5.0.1": "https://registry.yarnpkg.com/get-stdin/-/get-stdin-5.0.1.tgz#122e161591e21ff4c52530305693f20e6393a398", 72 | "glob-base@^0.3.0": "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4", 73 | "glob-parent@^2.0.0": "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28", 74 | "glob@^7.0.3": "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15", 75 | "glob@^7.0.5": "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15", 76 | "globby@^5.0.0": "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d", 77 | "globby@^6.1.0": "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c", 78 | "globjoin@^0.1.4": "https://registry.yarnpkg.com/globjoin/-/globjoin-0.1.4.tgz#2f4494ac8919e3767c5cbb691e9f463324285d43", 79 | "graceful-fs@^4.1.2": "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658", 80 | "has-ansi@^2.0.0": "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91", 81 | "has-flag@^1.0.0": "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa", 82 | "has-flag@^2.0.0": "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51", 83 | "hosted-git-info@^2.1.4": "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.5.0.tgz#6d60e34b3abbc8313062c3b798ef8d901a07af3c", 84 | "html-tags@^2.0.0": "https://registry.yarnpkg.com/html-tags/-/html-tags-2.0.0.tgz#10b30a386085f43cede353cc8fa7cb0deeea668b", 85 | "ignore@^3.3.3": "https://registry.yarnpkg.com/ignore/-/ignore-3.3.5.tgz#c4e715455f6073a8d7e5dae72d2fc9d71663dba6", 86 | "imurmurhash@^0.1.4": "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea", 87 | "indent-string@^2.1.0": "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80", 88 | "indexes-of@^1.0.1": "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607", 89 | "inflight@^1.0.4": "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9", 90 | "inherits@2": "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de", 91 | "is-arrayish@^0.2.1": "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d", 92 | "is-buffer@^1.1.5": "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.5.tgz#1f3b26ef613b214b88cbca23cc6c01d87961eecc", 93 | "is-builtin-module@^1.0.0": "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe", 94 | "is-directory@^0.3.1": "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1", 95 | "is-dotfile@^1.0.0": "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1", 96 | "is-equal-shallow@^0.1.3": "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534", 97 | "is-extendable@^0.1.1": "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89", 98 | "is-extglob@^1.0.0": "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0", 99 | "is-finite@^1.0.0": "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa", 100 | "is-fullwidth-code-point@^2.0.0": "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f", 101 | "is-glob@^2.0.0": "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863", 102 | "is-glob@^2.0.1": "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863", 103 | "is-number@^2.1.0": "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f", 104 | "is-number@^3.0.0": "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195", 105 | "is-path-cwd@^1.0.0": "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d", 106 | "is-path-in-cwd@^1.0.0": "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003be8a9eac04dc", 107 | "is-path-inside@^1.0.0": "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.0.tgz#fc06e5a1683fbda13de667aff717bbc10a48f37f", 108 | "is-posix-bracket@^0.1.0": "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4", 109 | "is-primitive@^2.0.0": "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575", 110 | "is-regexp@^1.0.0": "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069", 111 | "is-supported-regexp-flag@^1.0.0": "https://registry.yarnpkg.com/is-supported-regexp-flag/-/is-supported-regexp-flag-1.0.0.tgz#8b520c85fae7a253382d4b02652e045576e13bb8", 112 | "is-utf8@^0.2.0": "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72", 113 | "isarray@1.0.0": "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11", 114 | "isobject@^2.0.0": "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89", 115 | "js-base64@^2.1.9": "https://registry.yarnpkg.com/js-base64/-/js-base64-2.3.2.tgz#a79a923666372b580f8e27f51845c6f7e8fbfbaf", 116 | "js-yaml@^3.4.3": "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc", 117 | "json-stable-stringify@^1.0.1": "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af", 118 | "jsonify@~0.0.0": "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73", 119 | "kind-of@^3.0.2": "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64", 120 | "kind-of@^4.0.0": "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57", 121 | "known-css-properties@^0.2.0": "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.2.0.tgz#899c94be368e55b42d7db8d5be7d73a4a4a41454", 122 | "load-json-file@^1.0.0": "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0", 123 | "lodash@^4.0.0": "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae", 124 | "lodash@^4.1.0": "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae", 125 | "lodash@^4.17.4": "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae", 126 | "log-symbols@^1.0.2": "https://registry.yarnpkg.com/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18", 127 | "loud-rejection@^1.0.0": "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f", 128 | "map-obj@^1.0.0": "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d", 129 | "map-obj@^1.0.1": "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d", 130 | "mathml-tag-names@^2.0.1": "https://registry.yarnpkg.com/mathml-tag-names/-/mathml-tag-names-2.0.1.tgz#8d41268168bf86d1102b98109e28e531e7a34578", 131 | "meow@^3.7.0": "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb", 132 | "micromatch@^2.3.11": "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565", 133 | "minimatch@^3.0.4": "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083", 134 | "minimist@0.0.8": "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d", 135 | "minimist@^1.1.3": "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284", 136 | "minimist@^1.2.0": "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284", 137 | "mkdirp@^0.5.1": "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903", 138 | "ms@2.0.0": "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8", 139 | "normalize-package-data@^2.3.2": "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f", 140 | "normalize-package-data@^2.3.4": "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f", 141 | "normalize-path@^2.0.1": "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9", 142 | "normalize-range@^0.1.2": "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942", 143 | "normalize-selector@^0.2.0": "https://registry.yarnpkg.com/normalize-selector/-/normalize-selector-0.2.0.tgz#d0b145eb691189c63a78d201dc4fdb1293ef0c03", 144 | "num2fraction@^1.2.2": "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede", 145 | "number-is-nan@^1.0.0": "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d", 146 | "object-assign@^4.0.1": "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863", 147 | "object-assign@^4.1.0": "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863", 148 | "object.omit@^2.0.0": "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa", 149 | "once@^1.3.0": "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1", 150 | "os-homedir@^1.0.1": "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3", 151 | "parse-glob@^3.0.4": "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c", 152 | "parse-json@^2.2.0": "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9", 153 | "path-exists@^2.0.0": "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b", 154 | "path-is-absolute@^1.0.0": "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f", 155 | "path-is-inside@^1.0.1": "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53", 156 | "path-type@^1.0.0": "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441", 157 | "pify@^2.0.0": "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c", 158 | "pify@^3.0.0": "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176", 159 | "pinkie-promise@^2.0.0": "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa", 160 | "pinkie@^2.0.0": "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870", 161 | "postcss-less@^1.1.0": "https://registry.yarnpkg.com/postcss-less/-/postcss-less-1.1.0.tgz#bdcc76be64c4324d873fbc5cd9fa2e799e4305fa", 162 | "postcss-media-query-parser@^0.2.3": "https://registry.yarnpkg.com/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz#27b39c6f4d94f81b1a73b8f76351c609e5cef244", 163 | "postcss-reporter@^4.0.0": "https://registry.yarnpkg.com/postcss-reporter/-/postcss-reporter-4.0.0.tgz#13356c365c36783adde88e28e09dbba6ec6c6501", 164 | "postcss-resolve-nested-selector@^0.1.1": "https://registry.yarnpkg.com/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz#29ccbc7c37dedfac304e9fff0bf1596b3f6a0e4e", 165 | "postcss-scss@^1.0.2": "https://registry.yarnpkg.com/postcss-scss/-/postcss-scss-1.0.2.tgz#ff45cf3354b879ee89a4eb68680f46ac9bb14f94", 166 | "postcss-selector-parser@^2.2.3": "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz#f9437788606c3c9acee16ffe8d8b16297f27bb90", 167 | "postcss-value-parser@^3.2.3": "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz#87f38f9f18f774a4ab4c8a232f5c5ce8872a9d15", 168 | "postcss-value-parser@^3.3.0": "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz#87f38f9f18f774a4ab4c8a232f5c5ce8872a9d15", 169 | "postcss@^5.2.16": "https://registry.yarnpkg.com/postcss/-/postcss-5.2.17.tgz#cf4f597b864d65c8a492b2eabe9d706c879c388b", 170 | "postcss@^6.0.0": "https://registry.yarnpkg.com/postcss/-/postcss-6.0.12.tgz#6b0155089d2d212f7bd6a0cecd4c58c007403535", 171 | "postcss@^6.0.11": "https://registry.yarnpkg.com/postcss/-/postcss-6.0.12.tgz#6b0155089d2d212f7bd6a0cecd4c58c007403535", 172 | "postcss@^6.0.3": "https://registry.yarnpkg.com/postcss/-/postcss-6.0.12.tgz#6b0155089d2d212f7bd6a0cecd4c58c007403535", 173 | "postcss@^6.0.6": "https://registry.yarnpkg.com/postcss/-/postcss-6.0.12.tgz#6b0155089d2d212f7bd6a0cecd4c58c007403535", 174 | "preserve@^0.2.0": "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b", 175 | "prettier@1.6.0": "https://registry.yarnpkg.com/prettier/-/prettier-1.6.0.tgz#23e9c68251f440feb847f558821bead21765919a", 176 | "randomatic@^1.1.3": "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.7.tgz#c7abe9cc8b87c0baa876b19fde83fd464797e38c", 177 | "read-pkg-up@^1.0.1": "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02", 178 | "read-pkg@^1.0.0": "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28", 179 | "redent@^1.0.0": "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde", 180 | "regex-cache@^0.4.2": "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd", 181 | "remove-trailing-separator@^1.0.1": "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef", 182 | "repeat-element@^1.1.2": "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a", 183 | "repeat-string@^1.5.2": "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637", 184 | "repeating@^2.0.0": "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda", 185 | "require-from-string@^1.1.0": "https://registry.yarnpkg.com/require-from-string/-/require-from-string-1.2.1.tgz#529c9ccef27380adfec9a2f965b649bbee636418", 186 | "resolve-from@^3.0.0": "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748", 187 | "rimraf@^2.2.8": "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36", 188 | "semver@2 || 3 || 4 || 5": "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e", 189 | "signal-exit@^3.0.0": "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d", 190 | "slice-ansi@0.0.4": "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35", 191 | "source-map@^0.5.6": "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc", 192 | "source-map@^0.5.7": "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc", 193 | "spdx-correct@~1.0.0": "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40", 194 | "spdx-expression-parse@~1.0.0": "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c", 195 | "spdx-license-ids@^1.0.2": "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57", 196 | "specificity@^0.3.1": "https://registry.yarnpkg.com/specificity/-/specificity-0.3.1.tgz#f1b068424ce317ae07478d95de3c21cf85e8d567", 197 | "sprintf-js@~1.0.2": "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c", 198 | "string-width@^2.0.0": "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e", 199 | "string-width@^2.1.0": "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e", 200 | "strip-ansi@^3.0.0": "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf", 201 | "strip-ansi@^4.0.0": "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f", 202 | "strip-bom@^2.0.0": "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e", 203 | "strip-indent@^1.0.1": "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2", 204 | "style-search@^0.1.0": "https://registry.yarnpkg.com/style-search/-/style-search-0.1.0.tgz#7958c793e47e32e07d2b5cafe5c0bf8e12e77902", 205 | "stylelint@8.0.0": "https://registry.yarnpkg.com/stylelint/-/stylelint-8.0.0.tgz#87611211776cb315c93fcf6c58bc261d3c92612e", 206 | "sugarss@^1.0.0": "https://registry.yarnpkg.com/sugarss/-/sugarss-1.0.0.tgz#65e51b3958432fb70d5451a68bb33e32d0cf1ef7", 207 | "supports-color@^2.0.0": "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7", 208 | "supports-color@^3.2.3": "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6", 209 | "supports-color@^4.0.0": "https://registry.yarnpkg.com/supports-color/-/supports-color-4.4.0.tgz#883f7ddabc165142b2a61427f3352ded195d1a3e", 210 | "supports-color@^4.4.0": "https://registry.yarnpkg.com/supports-color/-/supports-color-4.4.0.tgz#883f7ddabc165142b2a61427f3352ded195d1a3e", 211 | "svg-tags@^1.0.0": "https://registry.yarnpkg.com/svg-tags/-/svg-tags-1.0.0.tgz#58f71cee3bd519b59d4b2a843b6c7de64ac04764", 212 | "table@^4.0.1": "https://registry.yarnpkg.com/table/-/table-4.0.1.tgz#a8116c133fac2c61f4a420ab6cdf5c4d61f0e435", 213 | "trim-newlines@^1.0.0": "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613", 214 | "uniq@^1.0.1": "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff", 215 | "validate-npm-package-license@^3.0.1": "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc", 216 | "wrappy@1": "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f", 217 | "write@^0.2.1": "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" 218 | }, 219 | "files": [], 220 | "artifacts": {} 221 | } -------------------------------------------------------------------------------- /fixtures/find-package/node_modules/prettier/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "prettier", 3 | "version": "1.6.0", 4 | "description": "Prettier is an opinionated code formatter", 5 | "bin": { 6 | "prettier": "./bin/prettier.js" 7 | }, 8 | "repository": "prettier/prettier", 9 | "homepage": "https://prettier.io", 10 | "author": "James Long", 11 | "license": "MIT", 12 | "main": "./index.js", 13 | "devDependencies": { 14 | "babel-cli": "6.24.1", 15 | "babel-preset-es2015": "6.24.1", 16 | "codecov": "2.2.0", 17 | "cross-env": "5.0.1", 18 | "cross-spawn": "5.1.0", 19 | "eslint": "4.1.1", 20 | "eslint-friendly-formatter": "3.0.0", 21 | "eslint-plugin-import": "2.6.1", 22 | "eslint-plugin-prettier": "2.1.2", 23 | "eslint-plugin-react": "7.1.0", 24 | "jest": "20.0.0", 25 | "mkdirp": "^0.5.1", 26 | "prettier": "1.5.2", 27 | "rimraf": "2.6.1", 28 | "rollup": "0.41.1", 29 | "rollup-plugin-commonjs": "7.0.0", 30 | "rollup-plugin-json": "2.1.0", 31 | "rollup-plugin-node-builtins": "2.0.0", 32 | "rollup-plugin-node-globals": "1.1.0", 33 | "rollup-plugin-node-resolve": "2.0.0", 34 | "rollup-plugin-replace": "1.1.1", 35 | "shelljs": "0.7.8", 36 | "sw-toolbox": "3.6.0", 37 | "uglify-es": "3.0.15", 38 | "webpack": "2.6.1" 39 | }, 40 | "scripts": { 41 | "test": "jest", 42 | "test-integration": "jest tests_integration", 43 | "lint": "cross-env EFF_NO_LINK_RULES=true eslint . --format node_modules/eslint-friendly-formatter", 44 | "build": "./scripts/build/build.js" 45 | } 46 | } -------------------------------------------------------------------------------- /fixtures/find-package/node_modules/stylelint/lib/index.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | const checkAgainstRule = require("./utils/checkAgainstRule"); 4 | const createPlugin = require("./createPlugin"); 5 | const createRuleTester = require("./testUtils/createRuleTester"); 6 | const createStylelint = require("./createStylelint"); 7 | const formatters = require("./formatters"); 8 | const postcssPlugin = require("./postcssPlugin"); 9 | const report = require("./utils/report"); 10 | const ruleMessages = require("./utils/ruleMessages"); 11 | const rules = require("./rules"); 12 | const standalone = require("./standalone"); 13 | const validateOptions = require("./utils/validateOptions"); 14 | 15 | const api = postcssPlugin; 16 | 17 | api.utils = { 18 | report, 19 | ruleMessages, 20 | validateOptions, 21 | checkAgainstRule 22 | }; 23 | 24 | api.lint = standalone; 25 | api.rules = rules; 26 | api.formatters = formatters; 27 | api.createPlugin = createPlugin; 28 | api.createRuleTester = createRuleTester; 29 | api.createLinter = createStylelint; 30 | 31 | module.exports = api; 32 | -------------------------------------------------------------------------------- /fixtures/find-package/node_modules/stylelint/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "stylelint", 3 | "version": "8.0.0", 4 | "description": "A mighty, modern CSS linter.", 5 | "keywords": [ 6 | "css", 7 | "less", 8 | "scss", 9 | "sugarss", 10 | "lint", 11 | "linter", 12 | "stylelint" 13 | ], 14 | "authors": [ 15 | "David Clark", 16 | "Maxime Thirouin", 17 | "Richard Hallows" 18 | ], 19 | "license": "MIT", 20 | "homepage": "https://stylelint.io", 21 | "repository": { 22 | "type": "git", 23 | "url": "https://github.com/stylelint/stylelint.git" 24 | }, 25 | "main": "lib/index.js", 26 | "bin": "bin/stylelint.js", 27 | "files": [ 28 | "bin", 29 | "CONTRIBUTING.md", 30 | "decls/*.js", 31 | "docs", 32 | "lib", 33 | "VISION.md", 34 | "!**/__tests__" 35 | ], 36 | "engines": { 37 | "node": ">=4.2.1" 38 | }, 39 | "dependencies": { 40 | "autoprefixer": "^7.1.2", 41 | "balanced-match": "^1.0.0", 42 | "chalk": "^2.0.1", 43 | "cosmiconfig": "^2.1.3", 44 | "debug": "^2.6.8", 45 | "execall": "^1.0.0", 46 | "file-entry-cache": "^2.0.0", 47 | "get-stdin": "^5.0.1", 48 | "globby": "^6.1.0", 49 | "globjoin": "^0.1.4", 50 | "html-tags": "^2.0.0", 51 | "ignore": "^3.3.3", 52 | "imurmurhash": "^0.1.4", 53 | "known-css-properties": "^0.2.0", 54 | "lodash": "^4.17.4", 55 | "log-symbols": "^1.0.2", 56 | "mathml-tag-names": "^2.0.1", 57 | "meow": "^3.7.0", 58 | "micromatch": "^2.3.11", 59 | "normalize-selector": "^0.2.0", 60 | "pify": "^3.0.0", 61 | "postcss": "^6.0.6", 62 | "postcss-less": "^1.1.0", 63 | "postcss-media-query-parser": "^0.2.3", 64 | "postcss-reporter": "^4.0.0", 65 | "postcss-resolve-nested-selector": "^0.1.1", 66 | "postcss-scss": "^1.0.2", 67 | "postcss-selector-parser": "^2.2.3", 68 | "postcss-value-parser": "^3.3.0", 69 | "resolve-from": "^3.0.0", 70 | "specificity": "^0.3.1", 71 | "string-width": "^2.1.0", 72 | "style-search": "^0.1.0", 73 | "sugarss": "^1.0.0", 74 | "svg-tags": "^1.0.0", 75 | "table": "^4.0.1" 76 | }, 77 | "devDependencies": { 78 | "benchmark": "^2.1.4", 79 | "common-tags": "^1.4.0", 80 | "coveralls": "^2.13.1", 81 | "cp-file": "^4.2.0", 82 | "d3-queue": "^3.0.7", 83 | "del": "^3.0.0", 84 | "eslint": "~4.2.0", 85 | "eslint-config-stylelint": "^7.0.0", 86 | "file-exists-promise": "^1.0.2", 87 | "flow-bin": "^0.50.0", 88 | "fs-promise": "^2.0.3", 89 | "husky": "^0.14.3", 90 | "jest": "^20.0.4", 91 | "lint-staged": "^4.0.1", 92 | "npm-run-all": "^4.0.2", 93 | "npmpub": "^3.1.0", 94 | "postcss-import": "^10.0.0", 95 | "postcss-safe-parser": "^3.0.1", 96 | "prettier": "^1.5.3", 97 | "remark-cli": "^3.0.1", 98 | "remark-preset-lint-consistent": "^2.0.0", 99 | "remark-preset-lint-recommended": "^2.0.0", 100 | "remark-validate-links": "^6.1.0", 101 | "request": "^2.81.0", 102 | "strip-ansi": "^4.0.0" 103 | }, 104 | "scripts": { 105 | "precommit": "lint-staged", 106 | "benchmark-rule": "node scripts/benchmark-rule.js", 107 | "dry-release": "npmpub --dry --verbose", 108 | "flow": "flow", 109 | "jest": "jest", 110 | "lint:js": "eslint . --cache", 111 | "lint:md": "remark . --quiet --frail", 112 | "lint": "npm-run-all --parallel lint:*", 113 | "pretest": "npm-run-all --serial lint flow", 114 | "release": "npmpub", 115 | "test": "jest --coverage", 116 | "watch": "jest --watch" 117 | }, 118 | "lint-staged": { 119 | "*.js": [ 120 | "prettier --write", 121 | "git add" 122 | ] 123 | }, 124 | "eslintConfig": { 125 | "extends": [ 126 | "stylelint" 127 | ], 128 | "globals": { 129 | "testRule": true 130 | } 131 | }, 132 | "jest": { 133 | "clearMocks": true, 134 | "collectCoverage": false, 135 | "collectCoverageFrom": [ 136 | "lib/**/*.js" 137 | ], 138 | "coverageDirectory": "./.coverage/", 139 | "coverageReporters": [ 140 | "lcov", 141 | "text-summary" 142 | ], 143 | "coverageThreshold": { 144 | "global": { 145 | "branches": 75, 146 | "functions": 75, 147 | "lines": 75, 148 | "statements": 75 149 | } 150 | }, 151 | "setupFiles": [ 152 | "./jest-setup.js" 153 | ], 154 | "testEnvironment": "node", 155 | "roots": [ 156 | "lib", 157 | "system-tests" 158 | ], 159 | "testRegex": ".*\\.test\\.js$|rules/.*/__tests__/.*\\.js$" 160 | }, 161 | "greenkeeper": { 162 | "label": "PR: review needed" 163 | }, 164 | "remarkConfig": { 165 | "plugins": [ 166 | "preset-lint-recommended", 167 | "preset-lint-consistent", 168 | [ 169 | "validate-links", 170 | { 171 | "repository": "stylelint/stylelint" 172 | } 173 | ] 174 | ] 175 | } 176 | } 177 | -------------------------------------------------------------------------------- /fixtures/find-package/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "prettier-stylelint", 3 | "version": "0.3.0", 4 | "description": "code > prettier > stylelint > formatted code", 5 | "author": "Hugo Dias (http://hugodias.me/)", 6 | "license": "MIT", 7 | "dependencies": { 8 | "prettier": "1.6.0", 9 | "stylelint": "8.0.0" 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /fixtures/find-package/style.css: -------------------------------------------------------------------------------- 1 | @media print { 2 | a { 3 | color: #ffffff; 4 | background-position: top left, 5 | top right; 6 | } 7 | } 8 | 9 | 10 | 11 | 12 | a[id="foo"] { content: "x"; } 13 | -------------------------------------------------------------------------------- /fixtures/less.less: -------------------------------------------------------------------------------- 1 | @base: #f938ab; 2 | 3 | .box-shadow(@style, @c) when (iscolor(@c)) { 4 | -webkit-box-shadow: @style @c; 5 | box-shadow: @style @c; 6 | } 7 | .box-shadow(@style, @alpha: 50%) when (isnumber(@alpha)) { 8 | .box-shadow(@style, rgba(0, 0, 0, @alpha)); 9 | } 10 | .box { 11 | color: saturate(@base, 5%); 12 | border-color: lighten(@base, 30%); 13 | div { .box-shadow(0 0 5px, 30%) } 14 | } 15 | -------------------------------------------------------------------------------- /fixtures/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "stylelint": { 3 | "rules": { 4 | "string-quotes": ["single"], 5 | "indentation": [ 6 | 4, 7 | { 8 | "except": ["value"] 9 | } 10 | ], 11 | "color-hex-case": ["upper"], 12 | "color-hex-length": ["short"], 13 | "block-no-empty": null, 14 | "color-no-invalid-hex": true, 15 | "comment-empty-line-before": [ 16 | "always", 17 | { 18 | "ignore": ["stylelint-commands", "after-comment"] 19 | } 20 | ], 21 | "declaration-colon-space-after": ["always"], 22 | "max-empty-lines": [2], 23 | "rule-empty-line-before": [ 24 | "always", 25 | { 26 | "except": ["first-nested"], 27 | "ignore": ["after-comment"] 28 | } 29 | ], 30 | "unit-whitelist": ["em", "rem", "%", "s"] 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /fixtures/style.css: -------------------------------------------------------------------------------- 1 | @media print { 2 | a { 3 | color: #ffffff; 4 | background-position: top left, 5 | top right; 6 | } 7 | } 8 | 9 | 10 | 11 | 12 | a[id="foo"] { content: "x"; } 13 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | module.exports = require('./src/index.js'); 4 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "prettier-stylelint", 3 | "version": "0.4.2", 4 | "description": "code > prettier > stylelint > formatted code", 5 | "repository": "hugomrdias/prettier-stylelint", 6 | "main": "index.js", 7 | "bin": "./cli.js", 8 | "author": "Hugo Dias (http://hugodias.me/)", 9 | "license": "MIT", 10 | "keywords": [ 11 | "stylelint", 12 | "prettier", 13 | "style", 14 | "lint", 15 | "linter", 16 | "validate", 17 | "code style", 18 | "strict", 19 | "check" 20 | ], 21 | "scripts": { 22 | "test": "nyc ava", 23 | "lint": "eslint --cache *.js src/*.js", 24 | "validate": "run-p lint test", 25 | "precommit": "yarn validate", 26 | "version": "yarn changelog && git add CHANGELOG.md", 27 | "cov": "yarn test && nyc report --reporter=html && hs coverage -s -o -c-1", 28 | "cov:report": "nyc report --reporter=text-lcov > coverage.lcov && codecov", 29 | "changelog": "conventional-changelog -p angular -i CHANGELOG.md -s -r 0" 30 | }, 31 | "devDependencies": { 32 | "ava": "^0.22.0", 33 | "codecov": "^2.3.0", 34 | "conventional-changelog-cli": "^1.3.3", 35 | "eslint": "^4.7.1", 36 | "eslint-config-halo": "^2.4.1", 37 | "http-serve": "^1.0.1", 38 | "husky": "^0.14.3", 39 | "np": "^2.16.0", 40 | "npm-run-all": "^4.1.1", 41 | "nyc": "^11.2.1", 42 | "stylelint-config-recommended": "^1.0.0" 43 | }, 44 | "dependencies": { 45 | "cosmiconfig": "^3.0.1", 46 | "debug": "^3.0.1", 47 | "get-stdin": "^5.0.1", 48 | "globby": "^6.1.0", 49 | "ignore": "^3.3.5", 50 | "import-local": "^0.1.1", 51 | "meow": "^3.7.0", 52 | "pify": "^3.0.0", 53 | "prettier": "^1.7.0", 54 | "resolve-from": "^4.0.0", 55 | "stylelint": "^8.1.1", 56 | "temp-write": "^3.3.0", 57 | "tempy": "^0.2.1", 58 | "update-notifier": "^2.2.0" 59 | }, 60 | "eslintConfig": { 61 | "extends": "halo/node" 62 | }, 63 | "stylelint": { 64 | "extends": [ 65 | "stylelint-config-recommended", 66 | "./config" 67 | ], 68 | "rules": { 69 | "string-quotes": [ 70 | "single" 71 | ], 72 | "indentation": [ 73 | 4, 74 | { 75 | "except": [ 76 | "value" 77 | ] 78 | } 79 | ], 80 | "color-hex-case": [ 81 | "upper" 82 | ], 83 | "color-hex-length": [ 84 | "short" 85 | ] 86 | } 87 | }, 88 | "prettier": { 89 | "printWidth": 80, 90 | "tabWidth": 4, 91 | "useTabs": false, 92 | "semi": false, 93 | "singleQuote": true, 94 | "trailingComma": "none", 95 | "bracketSpacing": true, 96 | "jsxBracketSameLine": false 97 | } 98 | } 99 | -------------------------------------------------------------------------------- /src/cli.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | /* eslint-disable import/unambiguous */ 3 | 'use strict'; 4 | 5 | const fs = require('fs'); 6 | const updateNotifier = require('update-notifier'); 7 | const meow = require('meow'); 8 | const globby = require('globby'); 9 | const getStdin = require('get-stdin'); 10 | const pify = require('pify'); 11 | const { arrify, ignore } = require('./utils'); 12 | const { format } = require('./index'); 13 | 14 | const cli = meow( 15 | ` 16 | Usage 17 | $ prettier-stylelint [ ...] 18 | 19 | Options 20 | --ignore Additional paths to ignore [Can be set multiple times] 21 | --extension Additional extension to lint [Can be set multiple times] 22 | --cwd= Working directory for files 23 | --stdin Validate/fix code from stdin ('prettier-stylelint -' also works) 24 | --write Edit files in place (DRAGONS AHEAD !!) 25 | --quiet -q Only log std.err 26 | 27 | Examples 28 | $ prettier-stylelint 29 | $ prettier-stylelint index.js 30 | $ prettier-stylelint *.js !foo.js 31 | $ echo 'a[id="foo"] { content: "x"; }' | prettier-stylelint --stdin 32 | 33 | Default pattern when no arguments: 34 | **/*.{css,scss,less,sss} 35 | `, 36 | { 37 | string: ['_', 'ignore', 'extension', 'cwd'], 38 | boolean: ['stdin', 'write'], 39 | default: { 40 | cwd: process.cwd(), 41 | write: false, 42 | quiet: false 43 | }, 44 | alias: { q: 'quiet' } 45 | } 46 | ); 47 | 48 | updateNotifier({ pkg: cli.pkg }).notify(); 49 | 50 | let input = cli.input; 51 | const opts = cli.flags; 52 | const DEFAULT_EXTENSION = ['css', 'scss', 'less', 'sss']; 53 | const DEFAULT_PATTERN = `**/*.{${DEFAULT_EXTENSION.join(',')}}`; 54 | const DEFAULT_IGNORE = [ 55 | '**/node_modules/**', 56 | '**/bower_components/**', 57 | 'flow-typed/**', 58 | 'coverage/**', 59 | '{tmp,temp}/**', 60 | '**/*.min.{css,scss,less,sss}', 61 | '**/bundle.{css,scss,less,sss}', 62 | 'fixture{-*,}.{css,scss,less,sss}', 63 | 'fixture{s,}/**', 64 | '{test,tests,spec,__tests__}/fixture{s,}/**', 65 | 'vendor/**', 66 | 'dist/**' 67 | ]; 68 | 69 | const options = { 70 | ignore: DEFAULT_IGNORE.concat(arrify(opts.ignore)), 71 | extensions: DEFAULT_EXTENSION.concat(arrify(opts.extension)), 72 | cwd: opts.cwd, 73 | write: opts.write, 74 | quiet: opts.quiet 75 | }; 76 | 77 | if (input[0] === '-') { 78 | opts.stdin = true; 79 | input.shift(); 80 | } 81 | if (opts.stdin) { 82 | getStdin() 83 | .then(str => 84 | format({ 85 | filepath: opts.cwd, 86 | text: str 87 | }).then(source => process.stdout.write(source)) 88 | ) 89 | .catch((err) => { 90 | console.error(err.stack || err); 91 | process.exitCode = 1; 92 | }); 93 | } else { 94 | const isEmptyPatterns = input.length === 0; 95 | 96 | input = isEmptyPatterns ? [DEFAULT_PATTERN] : arrify(input); 97 | 98 | globby(input, { 99 | ignore: options.ignore, 100 | nodir: true, 101 | cwd: options.cwd 102 | }) 103 | .then((paths) => { 104 | paths = ignore(paths, options); 105 | 106 | return Promise.all( 107 | paths.map(path => 108 | format({ 109 | text: fs.readFileSync(path, 'utf8'), 110 | filePath: path, 111 | quiet: options.quiet 112 | }) 113 | .then((formatted) => { 114 | if (!options.quiet) { 115 | console.log(formatted); 116 | } 117 | if (options.write) { 118 | return pify(fs.writeFile)(path, formatted); 119 | } 120 | 121 | return formatted; 122 | }) 123 | .catch((err) => { 124 | console.error( 125 | `prettier-stylelint [ERROR]: There was an error formatting "${path}"\n` 126 | ); 127 | console.error(err.stack || err); 128 | console.error('\n'); 129 | process.exitCode = 1; 130 | }) 131 | ) 132 | ); 133 | }) 134 | .catch((err) => { 135 | console.error(err.stack || err); 136 | process.exitCode = 1; 137 | }); 138 | } 139 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const fs = require('fs'); 4 | const path = require('path'); 5 | const resolveFrom = require('resolve-from'); 6 | const debug = require('debug')('prettier-stylelint:main'); 7 | 8 | /** 9 | * Resolve Config for the given file 10 | * 11 | * @export 12 | * @param {string} file - filepath 13 | * @param {Object} options - options 14 | * @returns {Promise} - 15 | */ 16 | function resolveConfig({ 17 | filePath, 18 | stylelintPath, 19 | stylelintConfig, 20 | prettierOptions 21 | }) { 22 | const resolve = resolveConfig.resolve; 23 | const stylelint = requireRelative(stylelintPath, filePath, 'stylelint'); 24 | const linterAPI = stylelint.createLinter(); 25 | 26 | if (stylelintConfig) { 27 | return Promise.resolve(resolve(stylelintConfig, prettierOptions)); 28 | } 29 | 30 | return linterAPI 31 | .getConfigForFile(filePath) 32 | .then(({ config }) => resolve(config, prettierOptions)); 33 | } 34 | 35 | resolveConfig.resolve = (stylelintConfig, prettierOptions = {}) => { 36 | const { rules } = stylelintConfig; 37 | 38 | if (rules['max-line-length']) { 39 | const printWidth = rules['max-line-length'][0]; 40 | 41 | prettierOptions.printWidth = printWidth; 42 | } 43 | 44 | if (rules['string-quotes']) { 45 | const quotes = rules['string-quotes'][0]; 46 | 47 | if (quotes === 'single') { 48 | prettierOptions.singleQuote = true; 49 | } 50 | } 51 | 52 | if (rules.indentation) { 53 | const indentation = rules.indentation[0]; 54 | 55 | if (indentation === 'tab') { 56 | prettierOptions.useTabs = true; 57 | prettierOptions.tabWidth = 2; 58 | } else { 59 | prettierOptions.useTabs = false; 60 | prettierOptions.tabWidth = indentation; 61 | } 62 | } 63 | prettierOptions.parser = 'postcss'; 64 | debug('prettier %O', prettierOptions); 65 | debug('linter %O', stylelintConfig); 66 | 67 | return [prettierOptions, stylelintConfig]; 68 | }; 69 | 70 | function stylelinter(code, { filePath, stylelintPath }) { 71 | const stylelint = requireRelative(stylelintPath, filePath, 'stylelint'); 72 | const linterAPI = stylelint.createLinter({ fix: true }); 73 | 74 | return linterAPI 75 | ._lintSource({ 76 | code, 77 | codeFilename: filePath 78 | }) 79 | .then((result) => { 80 | const fixed = result.root.toString(result.opts.syntax); 81 | 82 | return fixed; 83 | }); 84 | } 85 | 86 | function requireRelative(path, filePath, packageName) { 87 | try { 88 | if (path) { 89 | return require(resolveFrom(path, packageName)); 90 | } 91 | 92 | return require(resolveFrom(filePath, packageName)); 93 | } catch (err) { 94 | return require(packageName); 95 | } 96 | } 97 | 98 | function getPrettierConfig(filePath, prettierPath) { 99 | const prettier = requireRelative(prettierPath, filePath, 'prettier'); 100 | 101 | // NOTE: Backward-compatibility with old prettier versions (<1.7) 102 | // that don't have ``resolveConfig.sync` method. 103 | return typeof prettier.resolveConfig.sync === 'undefined' ? 104 | {} : 105 | prettier.resolveConfig.sync(filePath); 106 | } 107 | 108 | function format({ 109 | filePath = '', 110 | text = fs.readFileSync(filePath, 'utf8'), 111 | prettierPath, 112 | stylelintPath, 113 | prettierOptions = getPrettierConfig(filePath, prettierPath), 114 | stylelintConfig 115 | }) { 116 | const options = { 117 | filePath: path.isAbsolute(filePath) ? 118 | filePath : 119 | path.resolve(process.cwd(), filePath), 120 | text, 121 | prettierPath, 122 | stylelintPath, 123 | stylelintConfig, 124 | prettierOptions 125 | }; 126 | const prettier = requireRelative(prettierPath, filePath, 'prettier'); 127 | 128 | return resolveConfig(options).then(([prettierConfig]) => 129 | stylelinter(prettier.format(text, prettierConfig), options) 130 | ); 131 | } 132 | 133 | exports.format = format; 134 | exports.resolveConfig = resolveConfig; 135 | exports.getPrettierConfig = getPrettierConfig; 136 | -------------------------------------------------------------------------------- /src/utils.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const fs = require('fs'); 4 | const path = require('path'); 5 | const debug = require('debug')('prettier-stylelint:utils'); 6 | const ignore = require('ignore'); 7 | 8 | exports.arrify = function(val) { 9 | if (val === null || val === undefined) { 10 | return []; 11 | } 12 | 13 | return Array.isArray(val) ? val : [val]; 14 | }; 15 | 16 | exports.ignore = function(paths, options) { 17 | const ignorer = ignore(); 18 | const gitignore = path.resolve(options.cwd, '.gitignore'); 19 | const prettierignore = path.resolve(options.cwd, '.prettierignore'); 20 | 21 | try { 22 | ignorer.add(fs.readFileSync(gitignore, 'utf8').toString()); 23 | } catch (err) { 24 | debug('.gitignore error', err.message); 25 | } 26 | 27 | try { 28 | ignorer.add(fs.readFileSync(prettierignore, 'utf8').toString()); 29 | } catch (err) { 30 | debug('.prettierignore error', err.message); 31 | } 32 | 33 | paths = ignorer.filter(paths); 34 | 35 | // Filter out unwanted file extensions 36 | // For silly users that don't specify an extension in the glob pattern 37 | if (paths.length > 0) { 38 | paths = paths.filter((filePath) => { 39 | const ext = path.extname(filePath).replace('.', ''); 40 | 41 | return options.extensions.indexOf(ext) !== -1; 42 | }); 43 | } 44 | 45 | return paths; 46 | }; 47 | -------------------------------------------------------------------------------- /test.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const fs = require('fs'); 4 | const test = require('ava'); 5 | const tempWrite = require('temp-write'); 6 | const stylelint = require('stylelint'); 7 | const resolveFrom = require('resolve-from'); 8 | const { format, resolveConfig, getPrettierConfig } = require('./index'); 9 | 10 | const linterAPI = stylelint.createLinter({ fix: true }); 11 | 12 | test('resolveConfig', t => 13 | resolveConfig({ filePath: './fixtures/style.css' }).then(config => 14 | t.deepEqual(config[1], { 15 | rules: { 16 | 'string-quotes': ['single'], 17 | 'indentation': [4, { except: ['value'] }], 18 | 'color-hex-case': ['upper'], 19 | 'color-hex-length': ['short'], 20 | 'block-no-empty': null, 21 | 'color-no-invalid-hex': [true], 22 | 'comment-empty-line-before': [ 23 | 'always', 24 | { ignore: ['stylelint-commands', 'after-comment'] } 25 | ], 26 | 'declaration-colon-space-after': ['always'], 27 | 'max-empty-lines': [2], 28 | 'rule-empty-line-before': [ 29 | 'always', 30 | { 31 | except: ['first-nested'], 32 | ignore: ['after-comment'] 33 | } 34 | ], 35 | 'unit-whitelist': [['em', 'rem', '%', 's']] 36 | } 37 | }) 38 | )); 39 | 40 | test('resolveConfig not found fallback process.cwd', (t) => { 41 | const tempPath = tempWrite.sync( 42 | 'a[id="foo"] { content: "x"; }', 43 | 'test.css' 44 | ); 45 | 46 | return resolveConfig({ filePath: tempPath }).then((config) => { 47 | t.is(config[1].rules['function-comma-newline-after'], null); 48 | 49 | return config; 50 | }); 51 | }); 52 | 53 | test('resolveConfig shortcircuit ', t => 54 | resolveConfig({ stylelintConfig: { rules: { 'max-line-length': [20] } } }).then((config) => { 55 | t.is(config[0].printWidth, 20); 56 | 57 | return config; 58 | })); 59 | 60 | test('resolve string quotes === double ', (t) => { 61 | const config = resolveConfig.resolve({ rules: { 'string-quotes': ['double'] } }); 62 | 63 | t.is(config[0].singleQuote, undefined); 64 | }); 65 | 66 | test('resolve indentation === tab', (t) => { 67 | const config = resolveConfig.resolve({ rules: { indentation: ['tab'] } }); 68 | 69 | t.plan(2); 70 | t.is(config[0].useTabs, true); 71 | t.is(config[0].tabWidth, 2); 72 | }); 73 | 74 | test('resolveConfig prettier merge', t => 75 | resolveConfig({ 76 | filePath: './fixtures/style.css', 77 | prettierOptions: getPrettierConfig('./fixtures/style.css') 78 | }).then((config) => { 79 | t.is(config[0].semi, false); 80 | 81 | return config; 82 | })); 83 | 84 | test('format', (t) => { 85 | const source = fs.readFileSync('./fixtures/style.css', 'utf8'); 86 | 87 | return format({ 88 | text: source, 89 | filePath: './fixtures/style.css' 90 | }).then((source) => { 91 | t.is( 92 | source, 93 | `@media print { 94 | a { 95 | color: #FFF; 96 | background-position: top left, top right; 97 | } 98 | } 99 | 100 | a[id='foo'] { 101 | content: 'x'; 102 | } 103 | ` 104 | ); 105 | 106 | return source; 107 | }); 108 | }); 109 | 110 | test('format without code but with filePath', t => 111 | format({ filePath: './fixtures/style.css' }).then((source) => { 112 | t.is( 113 | source, 114 | `@media print { 115 | a { 116 | color: #FFF; 117 | background-position: top left, top right; 118 | } 119 | } 120 | 121 | a[id='foo'] { 122 | content: 'x'; 123 | } 124 | ` 125 | ); 126 | 127 | return source; 128 | })); 129 | 130 | test('format less', (t) => { 131 | const source = fs.readFileSync('./fixtures/less.less', 'utf8'); 132 | 133 | return format({ 134 | text: source, 135 | filePath: './fixtures/less.less' 136 | }).then((source) => { 137 | t.is( 138 | source, 139 | `@base: #F938AB; 140 | 141 | .box-shadow(@style, @c) when (iscolor(@c)) { 142 | -webkit-box-shadow: @style @c; 143 | box-shadow: @style @c; 144 | } 145 | .box-shadow(@style, @alpha: 50%) when (isnumber(@alpha)) { 146 | .box-shadow(@style, rgba(0, 0, 0, @alpha)); 147 | } 148 | 149 | .box { 150 | color: saturate(@base, 5%); 151 | border-color: lighten(@base, 30%); 152 | 153 | div { 154 | .box-shadow(0 0 5px, 30%); 155 | } 156 | } 157 | ` 158 | ); 159 | 160 | return source; 161 | }); 162 | }); 163 | 164 | test('format with syntax error from prettier', (t) => { 165 | const source = fs.readFileSync('./tests/error-syntax.css', 'utf8'); 166 | 167 | return format({ 168 | text: source, 169 | filePath: './tests/error-syntax.css' 170 | }).catch((err) => { 171 | t.is(err.name, 'SyntaxError'); 172 | }); 173 | }); 174 | 175 | test('alternate stylelint format', (t) => { 176 | const source = fs.readFileSync('./fixtures/style.css', 'utf8'); 177 | 178 | return linterAPI 179 | ._lintSource({ 180 | code: source 181 | // codeFilename: process.cwd() 182 | // codeFilename: path.resolve(process.cwd(), './tests/less.less') 183 | // filePath: path.resolve(process.cwd(), './fixtures/style.css') 184 | }) 185 | .then((result) => { 186 | const fixed = result.root.toString(result.opts.syntax); 187 | 188 | t.is( 189 | result.root.toString(result.opts.syntax), 190 | `@media print { 191 | a { 192 | color: #FFF; 193 | background-position: top left, 194 | top right; 195 | } 196 | } 197 | 198 | 199 | 200 | 201 | a[id="foo"] { content: "x"; } 202 | ` 203 | ); 204 | 205 | return fixed; 206 | }); 207 | }); 208 | 209 | test('resolve relative package', (t) => { 210 | const path = resolveFrom('./fixtures/find-package/style.css', 'prettier'); 211 | 212 | t.is('1.6.0', require(path).version); 213 | }); 214 | 215 | test('resolve relative package deep', (t) => { 216 | const path = resolveFrom( 217 | './fixtures/find-package/deep/style.css', 218 | 'prettier' 219 | ); 220 | 221 | t.is('1.6.0', require(path).version); 222 | }); 223 | 224 | test('resolve relative package fallback', (t) => { 225 | const path = resolveFrom('./fixtures/style.css', 'prettier'); 226 | 227 | t.is('1.7.0', require(path).version); 228 | }); 229 | 230 | test('resolve relative package null', (t) => { 231 | const path = resolveFrom(__filename, 'prettier'); 232 | 233 | t.is('1.7.0', require(path).version); 234 | }); 235 | -------------------------------------------------------------------------------- /tests/error-after-format.css: -------------------------------------------------------------------------------- 1 | @media print { 2 | a { 3 | color: #ffffff; 4 | background-position: top left, 5 | top right; 6 | } 7 | } 8 | 9 | 10 | 11 | 12 | a[id="foo"] { content: "x"; } 13 | a { color: #fff1az; } 14 | -------------------------------------------------------------------------------- /tests/error-syntax.css: -------------------------------------------------------------------------------- 1 | a { color: #fff1az; 2 | -------------------------------------------------------------------------------- /tests/less.less: -------------------------------------------------------------------------------- 1 | @base: #f938ab; 2 | 3 | .box-shadow(@style, @c) when (iscolor(@c)) { 4 | -webkit-box-shadow: @style @c; 5 | box-shadow: @style @c; 6 | } 7 | .box-shadow(@style, @alpha: 50%) when (isnumber(@alpha)) { 8 | .box-shadow(@style, rgba(0, 0, 0, @alpha)); 9 | } 10 | .box { 11 | color: saturate(@base, 5%); 12 | border-color: lighten(@base, 30%); 13 | div { .box-shadow(0 0 5px, 30%) } 14 | } 15 | -------------------------------------------------------------------------------- /tests/nestes.css: -------------------------------------------------------------------------------- 1 | @media print { 2 | a { 3 | color: #ffffff; 4 | background-position: top left, 5 | top right; 6 | } 7 | } 8 | 9 | 10 | 11 | 12 | a[id="foo"] { content: "x"; } 13 | -------------------------------------------------------------------------------- /tests/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "stylelint": { 3 | "extends": ["stylelint-config-recommended", "./config"], 4 | "rules": { 5 | "string-quotes": "single", 6 | "indentation": [ 7 | 4, 8 | { 9 | "except": ["value"] 10 | } 11 | ], 12 | "color-hex-case": "upper", 13 | "color-hex-length": "short", 14 | "unit-whitelist": ["em", "rem", "%", "s", "px"] 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /tests/rules/color-no-invalid-hex.css: -------------------------------------------------------------------------------- 1 | a { color: #000; } 2 | a { color: #000f; } 3 | a { color: #fff1a0; } 4 | a { color: #123450aa; } 5 | 6 | a { color: #00; } 7 | a { color: #fff1az; } 8 | a { color: #12345aa; } 9 | -------------------------------------------------------------------------------- /tests/test-disable-rules.css: -------------------------------------------------------------------------------- 1 | /** this file formatted with prettier-stylelint MUST NOT HAVE ANY ERROR **/ 2 | /* ./cli.js tests/test-disable-rules.css --write -q */ 3 | 4 | /* https://github.com/hugomrdias/prettier-stylelint/issues/1 */ 5 | 6 | /* only prettier or only stylelint might have errors*/ 7 | 8 | a { 9 | transform: translate(1, 1); 10 | } 11 | 12 | a { 13 | transform: translate(1, 1); 14 | } 15 | 16 | a { 17 | transform: translate(1, 1); 18 | } 19 | 20 | a { 21 | transform: translate(1, 1); 22 | } 23 | 24 | @font-face { 25 | font-family: 'foo'; 26 | src: url('foo.ttf'); 27 | } 28 | 29 | a { 30 | background: url('x.jpg'); 31 | } 32 | 33 | a { 34 | transform: translate(1, 1)scale(3); 35 | } 36 | 37 | a { 38 | transform: translate(1, 1) scale(3); 39 | } 40 | 41 | a { 42 | padding: calc(1 * 2px), calc(2 * 5px); 43 | } 44 | 45 | a { 46 | background-size: 0, 0; 47 | } 48 | 49 | a { 50 | box-shadow: inset 0 2px 0 #DCFFA6, 0 2px 5px #000, inset 0 2px 0 #DCFFA6, 51 | 0 2px 5px #000, inset 0 2px 0 #DCFFA6, 0 2px 5px #000; 52 | } 53 | 54 | a { 55 | top: 10px; 56 | --foo: pink; 57 | --bar: red; 58 | } 59 | 60 | a { 61 | color: pink !important; 62 | } 63 | 64 | a { 65 | color: pink !important; 66 | } 67 | 68 | a { 69 | color: pink !important; 70 | } 71 | 72 | a { 73 | color: pink !important; 74 | } 75 | 76 | a { 77 | color: pink !important; 78 | } 79 | 80 | a { 81 | box-shadow: 0 0 0 1px #5B9DD9, 0 0 2px 1px rgba(30, 140, 190, 0.8); 82 | } 83 | 84 | a { 85 | --foo: pink; 86 | 87 | top: 5px; 88 | } 89 | 90 | a { 91 | color: pink; /* end-of-line comment 92 | containing a newline */ 93 | top: 0; 94 | } 95 | 96 | a { 97 | color: pink; /* end-of-line comment */ 98 | top: 0; 99 | } 100 | 101 | a { 102 | color: pink; 103 | top: 0; 104 | } 105 | 106 | a { 107 | background: orange; 108 | color: pink; 109 | } 110 | 111 | a { 112 | background: orange; 113 | color: pink; 114 | } 115 | 116 | a { 117 | color: pink; 118 | } 119 | 120 | a { 121 | color: pink; 122 | } 123 | 124 | a { 125 | color: pink; 126 | } 127 | 128 | b { 129 | color: red; 130 | } 131 | 132 | a { 133 | color: pink; 134 | } 135 | 136 | [target='_blank '] { 137 | color: pink; 138 | } 139 | 140 | [target='_blank '] { 141 | color: pink; 142 | } 143 | 144 | [target ='_blank'] { 145 | color: pink; 146 | } 147 | 148 | [target = '_blank'] { 149 | color: pink; 150 | } 151 | 152 | [title='flower'] { 153 | color: pink; 154 | } 155 | 156 | [target='_blank'] { 157 | color: pink; 158 | } 159 | 160 | [class^='top'] { 161 | color: pink; 162 | } 163 | 164 | a + b { 165 | color: pink; 166 | } 167 | 168 | a > b { 169 | color: pink; 170 | } 171 | 172 | .foo .bar { 173 | color: pink; 174 | } 175 | 176 | input:not([type='submit']) { 177 | color: pink; 178 | } 179 | 180 | a::first-letter { 181 | color: pink; 182 | } 183 | 184 | a:first-letter { 185 | color: pink; 186 | } 187 | 188 | a, 189 | b { 190 | color: pink; 191 | } 192 | 193 | a, 194 | b { 195 | color: pink; 196 | } 197 | 198 | a { 199 | color: pink; 200 | } 201 | b { 202 | color: pink; 203 | } 204 | 205 | @media (max-width: 600px) { 206 | color: pink; 207 | } 208 | 209 | @media (max-width: 600px) { 210 | color: pink; 211 | } 212 | 213 | @media (width >= 600px) { 214 | color: pink; 215 | } 216 | 217 | @media (width >= 600px) { 218 | color: pink; 219 | } 220 | 221 | @media (width >= 600px) { 222 | color: pink; 223 | } 224 | 225 | @media screen and (color), projection and (color) { 226 | color: pink; 227 | } 228 | 229 | @media screen and (color), projection and (color) { 230 | color: pink; 231 | } 232 | 233 | @charset "UTF-8"; 234 | 235 | @import 'x.css' screen and (orientation: landscape); 236 | 237 | @media (min-width: 700px) and (orientation: landscape) { 238 | color: pink; 239 | } 240 | 241 | @import url('responsive/gt768.css'), screen and (min-width: 768px); 242 | 243 | @media (min-width: 700px) { 244 | color: pink; 245 | } 246 | 247 | @media (min-width: 700px) { 248 | color: pink; 249 | } 250 | 251 | @import url('x.css'); 252 | 253 | @media (min-width: 700px) { 254 | color: pink; 255 | } 256 | 257 | @import url('x.css'); /* end-of-line comment */ 258 | 259 | a { 260 | color: pink; 261 | } 262 | 263 | @import url('x.css'); 264 | @import url('y.css'); 265 | 266 | @import 'components/buttons'; 267 | 268 | a { 269 | color: pink; 270 | } 271 | /* comment */ 272 | 273 | a { 274 | color: pink; 275 | } 276 | 277 | /* comment */ 278 | 279 | a { 280 | /* comment */ 281 | color: pink; 282 | } 283 | 284 | /** comment**/ 285 | /** comment**/ 286 | 287 | /*comment*/ 288 | 289 | a { 290 | color: pink; 291 | } 292 | 293 | b { 294 | color: pink; 295 | } 296 | 297 | /** 298 | * Call me Ishmael. 299 | * 300 | * 301 | * 302 | * Some years ago -- never mind how log precisely -- ... 303 | */ 304 | 305 | a { 306 | color: pink; 307 | } 308 | 309 | b { 310 | color: pink; 311 | } 312 | 313 | a { 314 | background: linear-gradient(red, blue); 315 | } 316 | 317 | a { 318 | color: pink; 319 | } 320 | --------------------------------------------------------------------------------