├── .editorconfig ├── .gitattributes ├── .github └── workflows │ └── test.yml ├── .gitignore ├── .rollup.js ├── .tape.js ├── CHANGELOG.md ├── CONTRIBUTING.md ├── INSTALL.md ├── LICENSE.md ├── README.md ├── package.json ├── src ├── index.js ├── onCSSDeclaration.js └── options.js └── test ├── basic.css ├── basic.expect.css └── basic.preserve-false.expect.css /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | end_of_line = lf 6 | indent_style = tab 7 | insert_final_newline = true 8 | trim_trailing_whitespace = true 9 | 10 | [*.md] 11 | trim_trailing_whitespace = false 12 | 13 | [*.{json,md,yml}] 14 | indent_size = 2 15 | indent_style = space 16 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto eol=lf 2 | -------------------------------------------------------------------------------- /.github/workflows/test.yml: -------------------------------------------------------------------------------- 1 | name: test 2 | on: 3 | push: 4 | 5 | jobs: 6 | test: 7 | runs-on: ubuntu-latest 8 | strategy: 9 | matrix: 10 | node: [12, 14, 16] 11 | steps: 12 | - uses: actions/checkout@v2 13 | - uses: actions/setup-node@v2 14 | with: 15 | node-version: ${{ matrix.node }} 16 | 17 | - run: npm install --ignore-scripts 18 | - run: npm run test 19 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | dist 2 | node_modules 3 | package-lock.json 4 | yarn.lock 5 | *.log* 6 | *.result.css 7 | .* 8 | !.editorconfig 9 | !.gitattributes 10 | !.gitignore 11 | !.rollup.js 12 | !.tape.js 13 | !.github 14 | -------------------------------------------------------------------------------- /.rollup.js: -------------------------------------------------------------------------------- 1 | import babel from '@rollup/plugin-babel'; 2 | 3 | export default { 4 | input: 'src/index.js', 5 | output: [ 6 | { file: 'dist/index.js', format: 'cjs', sourcemap: true, exports: 'default' }, 7 | { file: 'dist/index.mjs', format: 'esm', sourcemap: true, exports: 'default' } 8 | ], 9 | plugins: [ 10 | babel({ 11 | babelHelpers: 'bundled', 12 | presets: [ 13 | ['@babel/preset-env', { 14 | corejs: 3, 15 | loose: true, 16 | modules: false, 17 | targets: { node: 10 }, 18 | useBuiltIns: 'entry' 19 | }] 20 | ] 21 | }), 22 | ], 23 | onwarn(warning, warn) { 24 | if (warning.code !== 'UNRESOLVED_IMPORT') warn(warning) 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /.tape.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'basic': { 3 | message: 'supports basic usage', 4 | warnings: 1, 5 | }, 6 | 'basic:preserve-false': { 7 | message: 'supports { preserve: false } usage', 8 | warnings: 1, 9 | options: { 10 | preserve: false 11 | } 12 | } 13 | }; 14 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changes to PostCSS Place Properties 2 | 3 | ## 7.0.1 (November 18, 2021) 4 | 5 | - Added: Safeguards against postcss-values-parser potentially throwing an error. 6 | - Updated: postcss-value-parser to 6.0.1 (patch) 7 | 8 | ## 7.0.0 (September 17, 2021) 9 | 10 | - Updated: Support for PostCS 8+ (major). 11 | - Updated: Support for Node 12+ (major). 12 | 13 | ## 6.0.0 (January 12, 2021) 14 | 15 | - Updated: Support for PostCSS v8+ 16 | - Updated: PostCSS Values Parser to 4.x 17 | 18 | ## 5.0.0 (April 26, 2020) 19 | 20 | - Updated: PostCSS to 7.0.27 (patch) 21 | - Updated: PostCSS Values Parser to 3.2.1 (major) 22 | - Updated: Support for Node v10+ 23 | 24 | ### 4.0.1 (September 18, 2018) 25 | 26 | - Updated: PostCSS Values Parser 2 (patch for this project) 27 | 28 | ### 4.0.0 (September 17, 2018) 29 | 30 | - Updated: Support for PostCSS v7+ 31 | - Updated: Support for Node v6+ 32 | 33 | ### 3.0.1 (May 8, 2018) 34 | 35 | - Updated: `postcss-values-parser` to v1.5.0 (major) 36 | - Updated: `postcss` to v6.0.22 (patch) 37 | 38 | ### 2.0.0 (June 30, 2017) 39 | 40 | - Added: Node 4+ compatibility 41 | - Added: PostCSS 6+ compatibility 42 | 43 | ### 1.0.2 (December 8, 2016) 44 | 45 | - Updated: Use destructing assignment on plugin options 46 | - Updated: Use template literals 47 | 48 | ### 1.0.1 (December 6, 2016) 49 | 50 | - Updated: boilerplate conventions (`postcss-tape`) 51 | 52 | ### 1.0.0 (November 25, 2016) 53 | 54 | - Initial version 55 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing to PostCSS Place Properties 2 | 3 | You want to help? You rock! Now, take a moment to be sure your contributions 4 | make sense to everyone else. 5 | 6 | ## Reporting Issues 7 | 8 | Found a problem? Want a new feature? 9 | 10 | - See if your issue or idea has [already been reported]. 11 | - Provide a [reduced test case] or a [live example]. 12 | 13 | Remember, a bug is a _demonstrable problem_ caused by _our_ code. 14 | 15 | ## Submitting Pull Requests 16 | 17 | Pull requests are the greatest contributions, so be sure they are focused in 18 | scope and avoid unrelated commits. 19 | 20 | 1. To begin; [fork this project], clone your fork, and add our upstream. 21 | ```bash 22 | # Clone your fork of the repo into the current directory 23 | git clone git@github.com:YOUR_USER/postcss-place.git 24 | 25 | # Navigate to the newly cloned directory 26 | cd postcss-place 27 | 28 | # Assign the original repo to a remote called "upstream" 29 | git remote add upstream git@github.com:csstools/postcss-place.git 30 | 31 | # Install the tools necessary for testing 32 | npm install 33 | ``` 34 | 35 | 2. Create a branch for your feature or fix: 36 | ```bash 37 | # Move into a new branch for your feature 38 | git checkout -b feature/thing 39 | ``` 40 | ```bash 41 | # Move into a new branch for your fix 42 | git checkout -b fix/something 43 | ``` 44 | 45 | 3. If your code follows our practices, then push your feature branch: 46 | ```bash 47 | # Test current code 48 | npm test 49 | ``` 50 | ```bash 51 | # Push the branch for your new feature 52 | git push origin feature/thing 53 | ``` 54 | ```bash 55 | # Or, push the branch for your update 56 | git push origin update/something 57 | ``` 58 | 59 | That’s it! Now [open a pull request] with a clear title and description. 60 | 61 | [already been reported]: issues 62 | [fork this project]: fork 63 | [live example]: https://codepen.io/pen 64 | [open a pull request]: https://help.github.com/articles/using-pull-requests/ 65 | [reduced test case]: https://css-tricks.com/reduced-test-cases/ 66 | -------------------------------------------------------------------------------- /INSTALL.md: -------------------------------------------------------------------------------- 1 | # Installing PostCSS Place Properties 2 | 3 | [PostCSS Place Properties] runs in all Node environments, with special instructions for: 4 | 5 | | [Node](#node) | [PostCSS CLI](#postcss-cli) | [Webpack](#webpack) | [Create React App](#create-react-app) | [Gulp](#gulp) | [Grunt](#grunt) | 6 | | --- | --- | --- | --- | --- | --- | 7 | 8 | ## Node 9 | 10 | Add [PostCSS Place Properties] to your project: 11 | 12 | ```bash 13 | npm install postcss postcss-place --save-dev 14 | ``` 15 | 16 | Use it as a [PostCSS] plugin: 17 | 18 | ```js 19 | import postcss from 'postcss'; 20 | import postcssPlace from 'postcss-place'; 21 | 22 | postcss([ 23 | postcssPlace(/* pluginOptions */) 24 | ]).process(YOUR_CSS /*, processOptions */); 25 | ``` 26 | 27 | ## PostCSS CLI 28 | 29 | Add [PostCSS CLI] to your project: 30 | 31 | ```bash 32 | npm install postcss-cli --save-dev 33 | ``` 34 | 35 | Use [PostCSS Place Properties] in your `postcss.config.js` configuration file: 36 | 37 | ```js 38 | const postcssPlace = require('postcss-place'); 39 | 40 | module.exports = { 41 | plugins: [ 42 | postcssPlace(/* pluginOptions */) 43 | ] 44 | } 45 | ``` 46 | 47 | ## Webpack 48 | 49 | Add [PostCSS Loader] to your project: 50 | 51 | ```bash 52 | npm install postcss-loader --save-dev 53 | ``` 54 | 55 | Use [PostCSS Place Properties] in your Webpack configuration: 56 | 57 | ```js 58 | import postcssPlace from 'postcss-place'; 59 | 60 | module.exports = { 61 | module: { 62 | rules: [ 63 | { 64 | test: /\.css$/, 65 | use: [ 66 | 'style-loader', 67 | { loader: 'css-loader', options: { importLoaders: 1 } }, 68 | { loader: 'postcss-loader', options: { 69 | ident: 'postcss', 70 | plugins: () => [ 71 | postcssPlace(/* pluginOptions */) 72 | ] 73 | } } 74 | ] 75 | } 76 | ] 77 | } 78 | } 79 | ``` 80 | 81 | ## Create React App 82 | 83 | Add [React App Rewired] and [React App Rewire PostCSS] to your project: 84 | 85 | ```bash 86 | npm install react-app-rewired react-app-rewire-postcss --save-dev 87 | ``` 88 | 89 | Use [React App Rewire PostCSS] and [PostCSS Place Properties] in your 90 | `config-overrides.js` file: 91 | 92 | ```js 93 | import reactAppRewirePostcss from 'react-app-rewire-postcss'; 94 | import postcssPlace from 'postcss-place'; 95 | 96 | export default config => reactAppRewirePostcss(config, { 97 | plugins: () => [ 98 | postcssPlace(/* pluginOptions */) 99 | ] 100 | }); 101 | ``` 102 | 103 | ## Gulp 104 | 105 | Add [Gulp PostCSS] to your project: 106 | 107 | ```bash 108 | npm install gulp-postcss --save-dev 109 | ``` 110 | 111 | Use [PostCSS Place Properties] in your Gulpfile: 112 | 113 | ```js 114 | import postcss from 'gulp-postcss'; 115 | import postcssPlace from 'postcss-place'; 116 | 117 | gulp.task('css', () => gulp.src('./src/*.css').pipe( 118 | postcss([ 119 | postcssPlace(/* pluginOptions */) 120 | ]) 121 | ).pipe( 122 | gulp.dest('.') 123 | )); 124 | ``` 125 | 126 | ## Grunt 127 | 128 | Add [Grunt PostCSS] to your project: 129 | 130 | ```bash 131 | npm install grunt-postcss --save-dev 132 | ``` 133 | 134 | Use [PostCSS Place Properties] in your Gruntfile: 135 | 136 | ```js 137 | import postcssPlace from 'postcss-place'; 138 | 139 | grunt.loadNpmTasks('grunt-postcss'); 140 | 141 | grunt.initConfig({ 142 | postcss: { 143 | options: { 144 | use: [ 145 | postcssPlace(/* pluginOptions */) 146 | ] 147 | }, 148 | dist: { 149 | src: '*.css' 150 | } 151 | } 152 | }); 153 | ``` 154 | 155 | [Gulp PostCSS]: https://github.com/postcss/gulp-postcss 156 | [Grunt PostCSS]: https://github.com/nDmitry/grunt-postcss 157 | [PostCSS]: https://github.com/postcss/postcss 158 | [PostCSS CLI]: https://github.com/postcss/postcss-cli 159 | [PostCSS Loader]: https://github.com/postcss/postcss-loader 160 | [PostCSS Place Properties]: https://github.com/csstools/postcss-place 161 | [React App Rewire PostCSS]: https://github.com/csstools/react-app-rewire-postcss 162 | [React App Rewired]: https://github.com/timarney/react-app-rewired 163 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | # CC0 1.0 Universal 2 | 3 | ## Statement of Purpose 4 | 5 | The laws of most jurisdictions throughout the world automatically confer 6 | exclusive Copyright and Related Rights (defined below) upon the creator and 7 | subsequent owner(s) (each and all, an “owner”) of an original work of 8 | authorship and/or a database (each, a “Work”). 9 | 10 | Certain owners wish to permanently relinquish those rights to a Work for the 11 | purpose of contributing to a commons of creative, cultural and scientific works 12 | (“Commons”) that the public can reliably and without fear of later claims of 13 | infringement build upon, modify, incorporate in other works, reuse and 14 | redistribute as freely as possible in any form whatsoever and for any purposes, 15 | including without limitation commercial purposes. These owners may contribute 16 | to the Commons to promote the ideal of a free culture and the further 17 | production of creative, cultural and scientific works, or to gain reputation or 18 | greater distribution for their Work in part through the use and efforts of 19 | others. 20 | 21 | For these and/or other purposes and motivations, and without any expectation of 22 | additional consideration or compensation, the person associating CC0 with a 23 | Work (the “Affirmer”), to the extent that he or she is an owner of Copyright 24 | and Related Rights in the Work, voluntarily elects to apply CC0 to the Work and 25 | publicly distribute the Work under its terms, with knowledge of his or her 26 | Copyright and Related Rights in the Work and the meaning and intended legal 27 | effect of CC0 on those rights. 28 | 29 | 1. Copyright and Related Rights. A Work made available under CC0 may be 30 | protected by copyright and related or neighboring rights (“Copyright and 31 | Related Rights”). Copyright and Related Rights include, but are not limited 32 | to, the following: 33 | 1. the right to reproduce, adapt, distribute, perform, display, communicate, 34 | and translate a Work; 35 | 2. moral rights retained by the original author(s) and/or performer(s); 36 | 3. publicity and privacy rights pertaining to a person’s image or likeness 37 | depicted in a Work; 38 | 4. rights protecting against unfair competition in regards to a Work, 39 | subject to the limitations in paragraph 4(i), below; 40 | 5. rights protecting the extraction, dissemination, use and reuse of data in 41 | a Work; 42 | 6. database rights (such as those arising under Directive 96/9/EC of the 43 | European Parliament and of the Council of 11 March 1996 on the legal 44 | protection of databases, and under any national implementation thereof, 45 | including any amended or successor version of such directive); and 46 | 7. other similar, equivalent or corresponding rights throughout the world 47 | based on applicable law or treaty, and any national implementations 48 | thereof. 49 | 50 | 2. Waiver. To the greatest extent permitted by, but not in contravention of, 51 | applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and 52 | unconditionally waives, abandons, and surrenders all of Affirmer’s Copyright 53 | and Related Rights and associated claims and causes of action, whether now 54 | known or unknown (including existing as well as future claims and causes of 55 | action), in the Work (i) in all territories worldwide, (ii) for the maximum 56 | duration provided by applicable law or treaty (including future time 57 | extensions), (iii) in any current or future medium and for any number of 58 | copies, and (iv) for any purpose whatsoever, including without limitation 59 | commercial, advertising or promotional purposes (the “Waiver”). Affirmer 60 | makes the Waiver for the benefit of each member of the public at large and 61 | to the detriment of Affirmer’s heirs and successors, fully intending that 62 | such Waiver shall not be subject to revocation, rescission, cancellation, 63 | termination, or any other legal or equitable action to disrupt the quiet 64 | enjoyment of the Work by the public as contemplated by Affirmer’s express 65 | Statement of Purpose. 66 | 67 | 3. Public License Fallback. Should any part of the Waiver for any reason be 68 | judged legally invalid or ineffective under applicable law, then the Waiver 69 | shall be preserved to the maximum extent permitted taking into account 70 | Affirmer’s express Statement of Purpose. In addition, to the extent the 71 | Waiver is so judged Affirmer hereby grants to each affected person a 72 | royalty-free, non transferable, non sublicensable, non exclusive, 73 | irrevocable and unconditional license to exercise Affirmer’s Copyright and 74 | Related Rights in the Work (i) in all territories worldwide, (ii) for the 75 | maximum duration provided by applicable law or treaty (including future time 76 | extensions), (iii) in any current or future medium and for any number of 77 | copies, and (iv) for any purpose whatsoever, including without limitation 78 | commercial, advertising or promotional purposes (the “License”). The License 79 | shall be deemed effective as of the date CC0 was applied by Affirmer to the 80 | Work. Should any part of the License for any reason be judged legally 81 | invalid or ineffective under applicable law, such partial invalidity or 82 | ineffectiveness shall not invalidate the remainder of the License, and in 83 | such case Affirmer hereby affirms that he or she will not (i) exercise any 84 | of his or her remaining Copyright and Related Rights in the Work or (ii) 85 | assert any associated claims and causes of action with respect to the Work, 86 | in either case contrary to Affirmer’s express Statement of Purpose. 87 | 88 | 4. Limitations and Disclaimers. 89 | 1. No trademark or patent rights held by Affirmer are waived, abandoned, 90 | surrendered, licensed or otherwise affected by this document. 91 | 2. Affirmer offers the Work as-is and makes no representations or warranties 92 | of any kind concerning the Work, express, implied, statutory or 93 | otherwise, including without limitation warranties of title, 94 | merchantability, fitness for a particular purpose, non infringement, or 95 | the absence of latent or other defects, accuracy, or the present or 96 | absence of errors, whether or not discoverable, all to the greatest 97 | extent permissible under applicable law. 98 | 3. Affirmer disclaims responsibility for clearing rights of other persons 99 | that may apply to the Work or any use thereof, including without 100 | limitation any person’s Copyright and Related Rights in the Work. 101 | Further, Affirmer disclaims responsibility for obtaining any necessary 102 | consents, permissions or other rights required for any use of the Work. 103 | 4. Affirmer understands and acknowledges that Creative Commons is not a 104 | party to this document and has no duty or obligation with respect to this 105 | CC0 or use of the Work. 106 | 107 | For more information, please see 108 | http://creativecommons.org/publicdomain/zero/1.0/. 109 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |
3 | 4 | # PostCSS Place Properties [