From 4891e070779fe45c144a20d129ad00a0fe49fe1d Mon Sep 17 00:00:00 2001 From: Simon Lydell Date: Sat, 30 May 2015 01:19:52 +0200 Subject: [PATCH] Allow to display warnings in the browser Inspired by postcss-messages. Then why not use that plugin? Well, look at the diff of index.js: - console.log(warningLog); + if (!('console' in options && !options.console)) { + console.log(warningLog); + } + + if (options.browser) { + result.root.append(formatBrowser(warningLog)); + } The only difference is how to display the warnings! There's no need to duplicate the rest of features between the two plugins. This fixes postcss/postcss-messages#8, postcss/postcss-messages#9 and postcss/postcss-messages#10. As opposed to postcss-messages, this implementation: - Inserts the messages at `head::before` instead of `html::before`. While `html::before` is unlikely to conflict with other styles, `head::before` is even less so! In fact, it should be _extremely_ unlikely to conflict. - Does not allow to change the selector. Because of the above point there's no need to. - Does not use `::after` if `::before` was already used in the CSS. Again, because of the first point there is no need to. - Does not allow to change the styling. There's no way to change the styling when logging to the console either. Also, @ai said: > BTW, options is a lack in UX. You should better think more about default > options and styles, rather than add options for every case. https://github.com/postcss/postcss-messages/issues/3#issuecomment-89226780 - Uses simpler styling. KISS. It is still similar to postcss-messages. - Properly escapes the CSS content string. --- .gitignore | 1 + README.md | 15 ++++++++++++--- example-browser.png | Bin 0 -> 29700 bytes example-console.png | Bin 0 -> 21139 bytes example.png | Bin 23478 -> 0 bytes index.js | 9 ++++++++- lib/formatBrowser.js | 27 ++++++++++++++++++++++++++ lib/style.css | 29 ++++++++++++++++++++++++++++ package.json | 4 +++- test/forVisual.css | 12 ++++-------- test/formatBrowser.js | 27 ++++++++++++++++++++++++++ test/index.js | 1 + test/visual.html | 5 +++++ test/visual.js | 43 ++++++++++++++++++------------------------ 14 files changed, 135 insertions(+), 38 deletions(-) create mode 100644 example-browser.png create mode 100644 example-console.png delete mode 100644 example.png create mode 100644 lib/formatBrowser.js create mode 100644 lib/style.css create mode 100644 test/formatBrowser.js create mode 100644 test/visual.html diff --git a/.gitignore b/.gitignore index 3ae2f52..d5cd16b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ node_modules *.log tmp +/test/compiled.css diff --git a/README.md b/README.md index f2fcd8a..bcdfd26 100644 --- a/README.md +++ b/README.md @@ -1,16 +1,17 @@ # postcss-log-warnings [![Build Status](https://travis-ci.org/davidtheclark/postcss-log-warnings.svg?branch=master)](https://travis-ci.org/davidtheclark/postcss-log-warnings) -Log PostCSS warnings in the console. +Log PostCSS warnings in the console and in the browser. ## Purpose As of PostCSS 4.1, a single PostCSS process can accumulate warnings from all of the plugins it uses. Presumably, plugin authors want you to see those warnings. -So this plugin exists to read the accumulated warnings (or warnings from only the plugins you've specified), format them for human legibility, and print them to the console. +So this plugin exists to read the accumulated warnings (or warnings from only the plugins you've specified), format them for human legibility, and print them to the console, display them in the browser or both. ## Example Output -![Example](example.png?raw=true) +![Console example](example-console.png?raw=true) +![Browser example](example-browser.png?raw=true) ## Installation @@ -42,6 +43,14 @@ gulp.task('css', function() { ### Options +- **console** (boolean, default = `true`) + + Whether or not to log to the console. + +- **browser** (boolean, default = `false`) + + Whether or not to display warnings in the browser. (This works by injecting `head::before { content: '{warnings}' }` (and some nice styling of it) into the CSS.) + - **keepWarnings** (boolean, default = `false`) If true, the plugin will *not* clear the warnings after it logs them (by default, it will clear them). Other plugins will then have access to these warnings and might re-print them. diff --git a/example-browser.png b/example-browser.png new file mode 100644 index 0000000000000000000000000000000000000000..1f93a8d5dc673dbecfeab0c9a8d45f82494c1fe8 GIT binary patch literal 29700 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 literal 0 HcmV?d00001 diff --git a/example-console.png b/example-console.png new file mode 100644 index 0000000000000000000000000000000000000000..c3b82533c964f993c7f5ecd68dd3a0b43a082e60 GIT binary patch literal 21139 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 DGsxuf literal 0 HcmV?d00001 diff --git a/example.png b/example.png deleted file mode 100644 index b6b5953bee167d0d2fd5fa954e67a259adefe138..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23478 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 diff --git a/index.js b/index.js index 40734c9..011a03b 100644 --- a/index.js +++ b/index.js @@ -3,6 +3,7 @@ var postcss = require('postcss'); var chalk = require('chalk'); var processResult = require('./lib/processResult'); +var formatBrowser = require('./lib/formatBrowser'); module.exports = postcss.plugin('postcss-log-warnings', function(options) { options = options || {}; @@ -12,7 +13,13 @@ module.exports = postcss.plugin('postcss-log-warnings', function(options) { if (!warningLog) return; - console.log(warningLog); + if (!('console' in options && !options.console)) { + console.log(warningLog); + } + + if (options.browser) { + result.root.append(formatBrowser(warningLog)); + } if (options.throwError) { throw new Error(chalk.red.bold('\n** postcss-log-warnings: warnings were found **')); diff --git a/lib/formatBrowser.js b/lib/formatBrowser.js new file mode 100644 index 0000000..1d046cf --- /dev/null +++ b/lib/formatBrowser.js @@ -0,0 +1,27 @@ +'use strict'; + +var fs = require('fs'); +var chalk = require('chalk'); + +var style = fs.readFileSync(require.resolve('./style.css')).toString(); + +module.exports = function(warningLog) { + var output = escapeCssStringContents(chalk.stripColor(warningLog.trim())); + return style.replace('$OUTPUT', output); +}; + +function escapeCssStringContents(stringContents) { + return stringContents.split('').map(function(ch) { + switch (ch) { + case '\n': + case '\r': + return '\\A '; + case '\\': + case '\'': + case '"': + return '\\' + ch; + default: + return ch; + } + }).join(''); +} diff --git a/lib/style.css b/lib/style.css new file mode 100644 index 0000000..6b9dc24 --- /dev/null +++ b/lib/style.css @@ -0,0 +1,29 @@ +head { + display: block; +} + +head::before, head::after { + position: fixed; + top: 0; + z-index: 2147483647; /* Maximum value browsers accept. */ + min-height: 3em; + font: 14px/1.2 monospace; + color: white; +} + +head::before { + content: '$OUTPUT'; + left: 0; + right: 0; + padding: 1em; + padding-left: 5em; /* Add room for the warning sign. */ + background: #DF4F5E; + white-space: pre; +} + +head::after { + content: '\26A0'; /* Warning sign. */ + left: 0.25em; + font-size: 5em; + line-height: 1; +} diff --git a/package.json b/package.json index 642dcd3..584847d 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,8 @@ "scripts": { "lint": "eslint .", "test": "npm run lint && tape test", - "visual": "node test/visual.js" + "visual": "node test/visual.js console", + "visual-browser": "node test/visual.js browser" }, "repository": { "type": "git", @@ -25,6 +26,7 @@ "devDependencies": { "eslint": "0.20.0", "lodash": "3.8.0", + "postcss-bem-linter": "0.3.0", "tape": "4.0.0" }, "dependencies": { diff --git a/test/forVisual.css b/test/forVisual.css index 719e621..39cdc2d 100644 --- a/test/forVisual.css +++ b/test/forVisual.css @@ -1,12 +1,8 @@ -body { +/** @define HamSandwich */ +.Ham.Sandwich { color: pink; } -div { - color: orange; - background: blue; -} - -p { - color: yellow; +:root a { + font-weight: bold; } diff --git a/test/formatBrowser.js b/test/formatBrowser.js new file mode 100644 index 0000000..941e284 --- /dev/null +++ b/test/formatBrowser.js @@ -0,0 +1,27 @@ +'use strict'; + +var test = require('tape'); +var formatBrowser = require('../lib/formatBrowser'); +var chalk = require('chalk'); + +var input = [ + '', + '|', + '||', + '" |"', + '\' |\'', + '\r', + chalk.red('foo'), + '' +].join('\n').replace(/\|/g, '\\'); + +var escaped = '|||A |||||A |" |||"|A |\' |||\'|A |A |A foo'.replace(/\|/g, '\\'); + +test('formatBrowser with really tricky input', function(t) { + t.ok( + formatBrowser(input).indexOf('content: \'' + escaped + '\'') !== -1, + 'includes escaped content' + ); + + t.end(); +}); diff --git a/test/index.js b/test/index.js index ac2671f..bc2e5c9 100644 --- a/test/index.js +++ b/test/index.js @@ -1,3 +1,4 @@ 'use strict'; require('./processResult'); +require('./formatBrowser'); diff --git a/test/visual.html b/test/visual.html new file mode 100644 index 0000000..49c24bf --- /dev/null +++ b/test/visual.html @@ -0,0 +1,5 @@ + + +visual warnings test + +

There's your visual confirmation that it works.

diff --git a/test/visual.js b/test/visual.js index ead4bd4..ac871fd 100644 --- a/test/visual.js +++ b/test/visual.js @@ -1,37 +1,30 @@ 'use strict'; var postcss = require('postcss'); +var bemLinter = require('postcss-bem-linter'); var logWarnings = require('..'); var fs = require('fs'); -var rejectColors = postcss.plugin('reject-colors', function() { - return function(css, result) { - css.eachDecl(function(decl) { - if (decl.prop === 'color') { - result.warn('no colors allowed', { node: decl }); - } - }); - }; -}); - -var rejectBackgrounds = postcss.plugin('reject-backgrounds', function() { - return function(css, result) { - css.eachDecl(function(decl) { - if (decl.prop === 'background') { - result.warn('no backgrounds allowed', { node: decl }); - } - }); - }; -}); +var display = process.argv[2] || 'console'; -fs.readFile('test/forVisual.css', { encoding: 'utf8' }, function(err, data) { - if (err) throw err; +fs.readFile('test/forVisual.css', { encoding: 'utf8' }, function(readErr, data) { + if (readErr) throw readErr; postcss() - .use(rejectColors()) - .use(rejectBackgrounds()) - .use(logWarnings({ throwError: true })) + .use(bemLinter()) + .use(logWarnings({ + console: display === 'console', + browser: display === 'browser', + throwError: display === 'console' + })) .process(data, { from: 'test/forVisual.css' }) - .then(function() { + .then(function(result) { + fs.writeFile('test/compiled.css', result.css, function(writeErr) { + if (writeErr) throw writeErr; + console.log('Now open test/visual.html in a browser!'); + }); + }) + .catch(function(ourErr) { + console.log(ourErr); console.log('There\'s your visual confirmation that it works.'); }); });