From acff41e7c98c087870e945f31a7358f502fcd4b8 Mon Sep 17 00:00:00 2001 From: fisker Cheung Date: Tue, 10 Mar 2020 07:14:34 +0800 Subject: [PATCH] Update `postcss-less` to v3 (#6981) --- package.json | 2 +- src/language-css/parser-postcss.js | 93 +++++++++++++------ src/language-css/printer-postcss.js | 73 +++++++++++++-- src/language-css/utils.js | 13 ++- .../css_case/__snapshots__/jsfmt.spec.js.snap | 12 ++- tests/css_case/case.less | 3 + .../__snapshots__/jsfmt.spec.js.snap | 28 +++--- .../css_less/__snapshots__/jsfmt.spec.js.snap | 51 +++++++++- tests/css_less/function-each.less | 18 ++++ yarn.lock | 88 +++--------------- 10 files changed, 248 insertions(+), 133 deletions(-) create mode 100644 tests/css_less/function-each.less diff --git a/package.json b/package.json index 4136460bf..fc3ee612a 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,7 @@ "minimatch": "3.0.4", "minimist": "1.2.0", "n-readlines": "1.0.0", - "postcss-less": "2.0.0", + "postcss-less": "3.1.4", "postcss-media-query-parser": "0.2.3", "postcss-scss": "2.0.0", "postcss-selector-parser": "2.2.3", diff --git a/src/language-css/parser-postcss.js b/src/language-css/parser-postcss.js index 5b39019f4..7232ab955 100644 --- a/src/language-css/parser-postcss.js +++ b/src/language-css/parser-postcss.js @@ -4,7 +4,7 @@ const createError = require("../common/parser-create-error"); const parseFrontMatter = require("../utils/front-matter"); const lineColumnToIndex = require("../utils/line-column-to-index"); const { hasPragma } = require("./pragma"); -const { isSCSS, isSCSSNestedPropertyNode } = require("./utils"); +const { isLessParser, isSCSS, isSCSSNestedPropertyNode } = require("./utils"); function parseValueNodes(nodes) { let parenGroup = { @@ -199,10 +199,10 @@ function parseSelector(selector) { // the content of the comment as selectors which turns it into complete // garbage. Better to print the whole selector as-is and not try to parse // and reformat it. - if (selector.match(/\/\/|\/\*/)) { + if (/\/\/|\/\*/.test(selector)) { return { type: "selector-unknown", - value: selector.replace(/^ +/, "").replace(/ +$/, "") + value: selector.trim() }; } @@ -283,16 +283,6 @@ function parseNestedCSS(node, options) { node.raws.selector = selector; } - // postcss-less@2.0.0 parse `custom-selector` as `css-decl` - if ( - options.parser === "css" && - node.type === "css-decl" && - node.prop === "@custom-selector" - ) { - selector = node.value; - node.raws.value = selector; - } - let value = ""; if (typeof node.value === "string") { @@ -385,6 +375,64 @@ function parseNestedCSS(node, options) { node.value = parseValue(value); } + if (node.type === "css-atrule") { + if (isLessParser(options)) { + // mixin + if (node.mixin) { + const source = + node.raws.identifier + + node.name + + node.raws.afterName + + node.raws.params; + node.selector = parseSelector(source); + delete node.params; + return node; + } + + // function + if (node.function) { + return node; + } + } + + // only css support custom-selector + if (options.parser === "css" && node.name === "custom-selector") { + const customSelector = node.params.match(/:--\S+?\s+/)[0].trim(); + node.customSelector = customSelector; + node.selector = parseSelector( + node.params.slice(customSelector.length).trim() + ); + delete node.params; + return node; + } + + if (isLessParser(options)) { + // Whitespace between variable and colon + if (node.name.includes(":") && !node.params) { + node.variable = true; + const parts = node.name.split(":"); + node.name = parts[0]; + node.value = parseValue(parts.slice(1).join(":")); + } + + // Missing whitespace between variable and colon + if ( + !["page", "nest"].includes(node.name) && + node.params && + node.params[0] === ":" + ) { + node.variable = true; + node.value = parseValue(node.params.slice(1)); + } + + // Less variable + if (node.variable) { + delete node.params; + return node; + } + } + } + if (node.type === "css-atrule" && params.length > 0) { const { name } = node; const lowercasedName = node.name.toLowerCase(); @@ -417,6 +465,8 @@ function parseNestedCSS(node, options) { } if (lowercasedName === "import") { + node.import = true; + delete node.filename; node.params = parseValue(params); return node; } @@ -450,16 +500,6 @@ function parseNestedCSS(node, options) { return node; } - if (name === "custom-selector") { - const customSelector = params.match(/:--\S+?\s+/)[0].trim(); - - node.customSelector = customSelector; - node.selector = parseSelector(params.slice(customSelector.length)); - delete node.params; - - return node; - } - if (["media", "custom-media"].includes(lowercasedName)) { if (params.includes("#{")) { // Workaround for media at rule with scss interpolation @@ -513,13 +553,6 @@ function requireParser(isSCSSParser) { return require("postcss-scss"); } - // TODO: Remove this hack when this issue is fixed: - // https://github.com/shellscape/postcss-less/issues/88 - const LessParser = require("postcss-less/dist/less-parser"); - LessParser.prototype.atrule = function(...args) { - return Object.getPrototypeOf(LessParser.prototype).atrule.apply(this, args); - }; - return require("postcss-less"); } diff --git a/src/language-css/printer-postcss.js b/src/language-css/printer-postcss.js index 0ba88d504..a795e8ef7 100644 --- a/src/language-css/printer-postcss.js +++ b/src/language-css/printer-postcss.js @@ -39,6 +39,7 @@ const { isWideKeywords, isSCSS, isLastNode, + isLessParser, isSCSSControlDirectiveNode, isDetachedRulesetDeclarationNode, isRelationalOperatorNode, @@ -68,7 +69,8 @@ const { isWordNode, isColonNode, isMediaAndSupportsKeywords, - isColorAdjusterFuncNode + isColorAdjusterFuncNode, + lastLineHasInlineComment } = require("./utils"); function shouldPrintComma(options) { @@ -115,12 +117,20 @@ function genericPrint(path, options, print) { options.locStart(node), options.locEnd(node) ); + const rawText = node.raws.text || node.text; // Workaround a bug where the location is off. // https://github.com/postcss/postcss-scss/issues/63 if (!text.includes(rawText)) { - if (node.raws.inline) { - return concat(["// ", rawText]); + if (node.raws.inline || node.inline) { + const needBreakAfter = !( + node.source.input.css.split(/[\r\n]/)[node.source.end.line] || "" + ).trim(); + return concat([ + "//", + node.raws.left + rawText, + needBreakAfter ? line : "" + ]); } return concat(["/* ", rawText, " */"]); } @@ -132,7 +142,12 @@ function genericPrint(path, options, print) { node.important ? " !important" : "", node.nodes ? concat([ - " {", + node.selector && + node.selector.type === "selector-unknown" && + lastLineHasInlineComment(node.selector.value) + ? line + : " ", + "{", node.nodes.length > 0 ? indent( concat([hardline, printNodeSequence(path, options, print)]) @@ -189,6 +204,52 @@ function genericPrint(path, options, print) { } case "css-atrule": { const parentNode = path.getParentNode(); + const isTemplatePlaceholderNodeWithoutSemiColon = + isTemplatePlaceholderNode(node) && + !parentNode.raws.semicolon && + options.originalText[options.locEnd(node) - 1] !== ";"; + + if (isLessParser(options)) { + if (node.mixin) { + return concat([ + path.call(print, "selector"), + node.important ? " !important" : "", + isTemplatePlaceholderNodeWithoutSemiColon ? "" : ";" + ]); + } + + if (node.function) { + return concat([ + node.name, + concat([path.call(print, "params")]), + isTemplatePlaceholderNodeWithoutSemiColon ? "" : ";" + ]); + } + + if (node.variable) { + return concat([ + "@", + node.name, + ": ", + node.value ? concat([path.call(print, "value")]) : "", + node.raws.between.trim() ? node.raws.between.trim() + " " : "", + node.nodes + ? concat([ + "{", + indent( + concat([ + node.nodes.length > 0 ? softline : "", + printNodeSequence(path, options, print) + ]) + ), + softline, + "}" + ]) + : "", + isTemplatePlaceholderNodeWithoutSemiColon ? "" : ";" + ]); + } + } return concat([ "@", @@ -242,9 +303,7 @@ function genericPrint(path, options, print) { softline, "}" ]) - : isTemplatePlaceholderNode(node) && - !parentNode.raws.semicolon && - options.originalText[options.locEnd(node) - 1] !== ";" + : isTemplatePlaceholderNodeWithoutSemiColon ? "" : ";" ]); diff --git a/src/language-css/utils.js b/src/language-css/utils.js index 90f3e041d..cb688d5a8 100644 --- a/src/language-css/utils.js +++ b/src/language-css/utils.js @@ -379,6 +379,15 @@ function isColorAdjusterFuncNode(node) { return colorAdjusterFunctions.includes(node.value.toLowerCase()); } +// TODO: only check `less` when we don't use `less` to parse `css` +function isLessParser(options) { + return options.parser === "css" || options.parser === "less"; +} + +function lastLineHasInlineComment(text) { + return /\/\//.test(text.split(/[\r\n]/).pop()); +} + module.exports = { getAncestorCounter, getAncestorNode, @@ -392,6 +401,7 @@ module.exports = { isWideKeywords, isSCSS, isLastNode, + isLessParser, isSCSSControlDirectiveNode, isDetachedRulesetDeclarationNode, isRelationalOperatorNode, @@ -424,5 +434,6 @@ module.exports = { isWordNode, isColonNode, isMediaAndSupportsKeywords, - isColorAdjusterFuncNode + isColorAdjusterFuncNode, + lastLineHasInlineComment }; diff --git a/tests/css_case/__snapshots__/jsfmt.spec.js.snap b/tests/css_case/__snapshots__/jsfmt.spec.js.snap index 75cef87b0..760205991 100644 --- a/tests/css_case/__snapshots__/jsfmt.spec.js.snap +++ b/tests/css_case/__snapshots__/jsfmt.spec.js.snap @@ -217,6 +217,7 @@ $KeepScssVar: val; @KeepDetachedRuleset(); + &:extend(.Keep ALL); &:EXTEND(.Keep ALL); .Keep; @@ -224,6 +225,8 @@ $KeepScssVar: val; .Keep(4PX)!IMPORTANT; .Keep() when (@Keep=Keep); .Keep() when (@Keep=12PX); + .Keep() when (@Keep="12px"); + .Keep() when (@Keep="12PX"); .Keep() when (@Keep=Keep12PX); } @@ -308,7 +311,7 @@ svg[viewBox] linearGradient, --Keep-custom-Prop: red; background: Var(--Keep-custom-Prop); animation-name: KeepAnimationName; - important: something !IMPORTANT; + important: something !important; font-family: initial; padding: unset; border: inherit; @@ -364,13 +367,16 @@ $KeepScssVar: val; @KeepDetachedRuleset(); - &: EXTEND(.Keep ALL); + &:extend(.Keep ALL); + &:EXTEND(.Keep ALL); .Keep; .Keep(); .Keep(4px) !important; .Keep() when (@Keep=Keep); - .Keep() when (@Keep=12PX); + .Keep() when (@Keep=12px); + .Keep() when (@Keep="12px"); + .Keep() when (@Keep="12PX"); .Keep() when (@Keep=Keep12PX); } diff --git a/tests/css_case/case.less b/tests/css_case/case.less index 1e1ecaa97..cc8be8e72 100644 --- a/tests/css_case/case.less +++ b/tests/css_case/case.less @@ -72,6 +72,7 @@ $KeepScssVar: val; @KeepDetachedRuleset(); + &:extend(.Keep ALL); &:EXTEND(.Keep ALL); .Keep; @@ -79,6 +80,8 @@ $KeepScssVar: val; .Keep(4PX)!IMPORTANT; .Keep() when (@Keep=Keep); .Keep() when (@Keep=12PX); + .Keep() when (@Keep="12px"); + .Keep() when (@Keep="12PX"); .Keep() when (@Keep=Keep12PX); } diff --git a/tests/css_comments/__snapshots__/jsfmt.spec.js.snap b/tests/css_comments/__snapshots__/jsfmt.spec.js.snap index e96fb1bf9..947f04d46 100644 --- a/tests/css_comments/__snapshots__/jsfmt.spec.js.snap +++ b/tests/css_comments/__snapshots__/jsfmt.spec.js.snap @@ -1000,8 +1000,7 @@ input:not(/* comment 125 */[/* comment 126 */disabled/* comment 127 */]/* commen , /* comment 21 */ .element -/* comment 22 */ - { +/* comment 22 */ { } /* comment 23 */ @@ -1011,8 +1010,7 @@ input:not(/* comment 125 */[/* comment 126 */disabled/* comment 127 */]/* commen .element /* comment 27 */ .element -/* comment 28 */ - { +/* comment 28 */ { } /* comment 29 */ @@ -1024,8 +1022,7 @@ input:not(/* comment 125 */[/* comment 126 */disabled/* comment 127 */]/* commen > /* comment 35 */ .element -/* comment 36 */ - { +/* comment 36 */ { } /* comment 37 */ @@ -1037,8 +1034,7 @@ input:not(/* comment 125 */[/* comment 126 */disabled/* comment 127 */]/* commen + /* comment 43 */ .element -/* comment 44 */ - { +/* comment 44 */ { } /* comment 45 */ @@ -1050,8 +1046,7 @@ input:not(/* comment 125 */[/* comment 126 */disabled/* comment 127 */]/* commen ~ /* comment 51 */ .element -/* comment 52 */ - { +/* comment 52 */ { } /* comment 53 */ @@ -1063,8 +1058,7 @@ input:not(/* comment 125 */[/* comment 126 */disabled/* comment 127 */]/* commen >>> /* comment 59 */ .element -/* comment 60 */ - { +/* comment 60 */ { } a[/* comment 61 */target/* comment 62 */] { @@ -1292,7 +1286,7 @@ printWidth: 80 &[data-field-id="1"], // comment 4 &[data-field-id="2"], // comment 5 &[data-field-id="3"], // comment 6 - { + { background: green; } } @@ -1300,7 +1294,7 @@ printWidth: 80 // comment 7 .field // comment 8 - { +{ // comment 9 // comment 10 &[data-field-id="1"], // comment 11 @@ -1311,7 +1305,7 @@ printWidth: 80 // comment 16 &[data-field-id="3"], // comment 17 // comment 18 - { + { // comment 19 // comment 20 background: green; @@ -1325,7 +1319,7 @@ printWidth: 80 // comment 25 .bar // comment 26 - { +{ } .foo @@ -1334,7 +1328,7 @@ printWidth: 80 // comment 28 .bar // comment 29 - { +{ } ================================================================================ diff --git a/tests/css_less/__snapshots__/jsfmt.spec.js.snap b/tests/css_less/__snapshots__/jsfmt.spec.js.snap index 56f29e8e9..7fe3a1de9 100644 --- a/tests/css_less/__snapshots__/jsfmt.spec.js.snap +++ b/tests/css_less/__snapshots__/jsfmt.spec.js.snap @@ -1,5 +1,52 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP +exports[`function-each.less 1`] = ` +====================================options===================================== +parsers: ["less"] +printWidth: 80 + | printWidth +=====================================input====================================== +// http://lesscss.org/functions/#list-functions-each + +@selectors: blue, green, red; + +each(@selectors, { + .sel-@{value} { + a: b; + } +}); + + +// TODO: fix this +each(@selectors, +{ + .sel-@{value} { +a: b; + } +}); + +=====================================output===================================== +// http://lesscss.org/functions/#list-functions-each + +@selectors: blue, green, red; + +each(@selectors, { + .sel-@{value} { + a: b; + } +}); + +// TODO: fix this +each(@selectors, +{ + .sel-@{value} { +a: b; + } +}); + +================================================================================ +`; + exports[`less.less 1`] = ` ====================================options===================================== parsers: ["less"] @@ -2744,7 +2791,9 @@ div { header { background-color: blue; - .desktop-and-old-ie({background-color: red;}); + .desktop-and-old-ie({ + background-color: red; + }); } header { diff --git a/tests/css_less/function-each.less b/tests/css_less/function-each.less new file mode 100644 index 000000000..8b0e66478 --- /dev/null +++ b/tests/css_less/function-each.less @@ -0,0 +1,18 @@ +// http://lesscss.org/functions/#list-functions-each + +@selectors: blue, green, red; + +each(@selectors, { + .sel-@{value} { + a: b; + } +}); + + +// TODO: fix this +each(@selectors, +{ + .sel-@{value} { +a: b; + } +}); diff --git a/yarn.lock b/yarn.lock index be2b90a7b..5cf42c99d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1510,11 +1510,6 @@ ansi-escapes@^4.2.1: dependencies: type-fest "^0.8.1" -ansi-regex@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= - ansi-regex@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" @@ -1530,11 +1525,6 @@ ansi-regex@^5.0.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== -ansi-styles@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" - integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= - ansi-styles@^3.2.0, ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" @@ -2082,17 +2072,6 @@ chalk@3.0.0, chalk@^3.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" - integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= - dependencies: - ansi-styles "^2.2.1" - escape-string-regexp "^1.0.2" - has-ansi "^2.0.0" - strip-ansi "^3.0.0" - supports-color "^2.0.0" - character-entities-legacy@^1.0.0: version "1.1.3" resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.3.tgz#3c729991d9293da0ede6dddcaf1f2ce1009ee8b4" @@ -3049,7 +3028,7 @@ escape-string-regexp@2.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== -escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: +escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= @@ -3850,13 +3829,6 @@ har-validator@~5.1.0: ajv "^6.5.5" har-schema "^2.0.0" -has-ansi@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" - integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= - dependencies: - ansi-regex "^2.0.0" - has-ansi@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-3.0.0.tgz#36077ef1d15f333484aa7fa77a28606f1c655b37" @@ -3864,11 +3836,6 @@ has-ansi@^3.0.0: dependencies: ansi-regex "^3.0.0" -has-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" - integrity sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo= - has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" @@ -4964,11 +4931,6 @@ jest@25.1.0: import-local "^3.0.2" jest-cli "^25.1.0" -js-base64@^2.1.9: - version "2.5.1" - resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.5.1.tgz#1efa39ef2c5f7980bb1784ade4a8af2de3291121" - integrity sha512-M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw== - "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -6110,12 +6072,12 @@ posix-character-classes@^0.1.0: resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= -postcss-less@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/postcss-less/-/postcss-less-2.0.0.tgz#5d190b8e057ca446d60fe2e2587ad791c9029fb8" - integrity sha512-pPNsVnpCB13nBMOcl5GVh8JGmB0JGFjqkLUDzKdVpptFFKEe9wFdEzvh2j4lD2AD+7qcrUfw9Ta+oi5+Fw7jjQ== +postcss-less@3.1.4: + version "3.1.4" + resolved "https://registry.yarnpkg.com/postcss-less/-/postcss-less-3.1.4.tgz#369f58642b5928ef898ffbc1a6e93c958304c5ad" + integrity sha512-7TvleQWNM2QLcHqvudt3VYjULVB49uiW6XzEUFmvwHzvsOEF5MwBrIXZDJQvJNFGjJQTzSzZnDoCJ8h/ljyGXA== dependencies: - postcss "^5.2.16" + postcss "^7.0.14" postcss-media-query-parser@0.2.3: version "0.2.3" @@ -6147,16 +6109,6 @@ postcss-values-parser@2.0.1: indexes-of "^1.0.1" uniq "^1.0.1" -postcss@^5.2.16: - version "5.2.18" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.18.tgz#badfa1497d46244f6390f58b319830d9107853c5" - integrity sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg== - dependencies: - chalk "^1.1.3" - js-base64 "^2.1.9" - source-map "^0.5.6" - supports-color "^3.2.3" - postcss@^7.0.0: version "7.0.26" resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.26.tgz#5ed615cfcab35ba9bbb82414a4fa88ea10429587" @@ -6166,6 +6118,15 @@ postcss@^7.0.0: source-map "^0.6.1" supports-color "^6.1.0" +postcss@^7.0.14: + version "7.0.27" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.27.tgz#cc67cdc6b0daa375105b7c424a85567345fc54d9" + integrity sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ== + dependencies: + chalk "^2.4.2" + source-map "^0.6.1" + supports-color "^6.1.0" + prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" @@ -7295,13 +7256,6 @@ strip-ansi@6.0.0, strip-ansi@^6.0.0: dependencies: ansi-regex "^5.0.0" -strip-ansi@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= - dependencies: - ansi-regex "^2.0.0" - strip-ansi@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" @@ -7339,18 +7293,6 @@ stubs@^3.0.0: resolved "https://registry.yarnpkg.com/stubs/-/stubs-3.0.0.tgz#e8d2ba1fa9c90570303c030b6900f7d5f89abe5b" integrity sha1-6NK6H6nJBXAwPAMLaQD31fiavls= -supports-color@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" - integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= - -supports-color@^3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" - integrity sha1-ZawFBLOVQXHYpklGsq48u4pfVPY= - dependencies: - has-flag "^1.0.0" - supports-color@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"