|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143 |
- # PostCSS Runner Guidelines
-
- A PostCSS runner is a tool that processes CSS through a user-defined list
- of plugins; for example, [`postcss-cli`] or [`gulp‑postcss`].
- These rules are mandatory for any such runners.
-
- For single-plugin tools, like [`gulp-autoprefixer`],
- these rules are not mandatory but are highly recommended.
-
- See also [ClojureWerkz’s recommendations] for open source projects.
-
- [ClojureWerkz’s recommendations]: http://blog.clojurewerkz.org/blog/2013/04/20/how-to-make-your-open-source-project-really-awesome/
- [`gulp-autoprefixer`]: https://github.com/sindresorhus/gulp-autoprefixer
- [`gulp‑postcss`]: https://github.com/w0rm/gulp-postcss
- [`postcss-cli`]: https://github.com/postcss/postcss-cli
-
- ## 1. API
-
- ### 1.1. Accept functions in plugin parameters
-
- If your runner uses a config file, it must be written in JavaScript, so that
- it can support plugins which accept a function, such as [`postcss-assets`]:
-
- ```js
- module.exports = [
- require('postcss-assets')({
- cachebuster: function (file) {
- return fs.statSync(file).mtime.getTime().toString(16)
- }
- })
- ]
- ```
-
- [`postcss-assets`]: https://github.com/borodean/postcss-assets
-
- ## 2. Processing
-
- ### 2.1. Set `from` and `to` processing options
-
- To ensure that PostCSS generates source maps and displays better syntax errors,
- runners must specify the `from` and `to` options. If your runner does not handle
- writing to disk (for example, a gulp transform), you should set both options
- to point to the same file:
-
- ```js
- processor.process({ from: file.path, to: file.path })
- ```
-
- ### 2.2. Use only the asynchronous API
-
- PostCSS runners must use only the asynchronous API.
- The synchronous API is provided only for debugging, is slower,
- and can’t work with asynchronous plugins.
-
- ```js
- processor.process(opts).then(result => {
- // processing is finished
- });
- ```
-
- ### 2.3. Use only the public PostCSS API
-
- PostCSS runners must not rely on undocumented properties or methods,
- which may be subject to change in any minor release. The public API
- is described in [API docs].
-
- [API docs]: http://api.postcss.org/
-
- ## 3. Output
-
- ### 3.1. Don’t show JS stack for `CssSyntaxError`
-
- PostCSS runners must not show a stack trace for CSS syntax errors,
- as the runner can be used by developers who are not familiar with JavaScript.
- Instead, handle such errors gracefully:
-
- ```js
- processor.process(opts).catch(error => {
- if (error.name === 'CssSyntaxError') {
- process.stderr.write(error.message + error.showSourceCode())
- } else {
- throw error
- }
- })
- ```
-
- ### 3.2. Display `result.warnings()`
-
- PostCSS runners must output warnings from `result.warnings()`:
-
- ```js
- result.warnings().forEach(warn => {
- process.stderr.write(warn.toString())
- })
- ```
-
- See also [postcss-log-warnings] and [postcss-messages] plugins.
-
- [postcss-log-warnings]: https://github.com/davidtheclark/postcss-log-warnings
- [postcss-messages]: https://github.com/postcss/postcss-messages
-
- ### 3.3. Allow the user to write source maps to different files
-
- PostCSS by default will inline source maps in the generated file; however,
- PostCSS runners must provide an option to save the source map in a different
- file:
-
- ```js
- if (result.map) {
- fs.writeFile(opts.to + '.map', result.map.toString())
- }
- ```
-
- ## 4. Documentation
-
- ### 4.1. Document your runner in English
-
- PostCSS runners must have their `README.md` wrote in English. Do not be afraid
- of your English skills, as the open source community will fix your errors.
-
- Of course, you are welcome to write documentation in other languages;
- just name them appropriately (e.g. `README.ja.md`).
-
- ### 4.2. Maintain a changelog
-
- PostCSS runners must describe changes of all releases in a separate file,
- such as `ChangeLog.md`, `History.md`, or with [GitHub Releases].
- Visit [Keep A Changelog] for more information on how to write one of these.
-
- Of course, you should use [SemVer].
-
- [Keep A Changelog]: http://keepachangelog.com/
- [GitHub Releases]: https://help.github.com/articles/creating-releases/
- [SemVer]: http://semver.org/
-
- ### 4.3. `postcss-runner` keyword in `package.json`
-
- PostCSS runners written for npm must have the `postcss-runner` keyword
- in their `package.json`. This special keyword will be useful for feedback about
- the PostCSS ecosystem.
-
- For packages not published to npm, this is not mandatory, but recommended
- if the package format is allowed to contain keywords.
|