1.16.0 • Published 2 years ago

postcss-prefix-selector v1.16.0

Weekly downloads
202,706
License
MIT
Repository
github
Last release
2 years ago

postcss-prefix-selector

NPM version Build status Test coverage License Downloads Gitpod ready-to-code

Prefix every CSS selector with a custom namespace .a => .prefix .a

Table of Contents

Install

$ npm install postcss-prefix-selector

Usage with PostCSS

const prefixer = require('postcss-prefix-selector')

// css to be processed
const css = fs.readFileSync("input.css", "utf8")

const out = postcss().use(prefixer({
  prefix: '.some-selector',
  exclude: ['.c'],

  // Optional transform callback for case-by-case overrides
  transform: function (prefix, selector, prefixedSelector, filePath, rule) {
    if (selector === 'body') {
      return 'body' + prefix;
    } else {
      return prefixedSelector;
    }
  }
})).process(css).css

Using the options above and the CSS below...

body {
  background: red;
}

.a, .b {
  color: aqua;
}

.c {
  color: coral;
}

You will get the following output

body.some-selector {
  background: red;
}

.some-selector .a, .some-selector .b {
  color: aqua;
}

.c {
  color: coral;
}

Usage with webpack

Use it like you'd use any other PostCSS plugin. If you also have autoprefixer in your webpack config then make sure that postcss-prefix-selector is called first. This is needed to avoid running the prefixer twice on both standard selectors and vendor specific ones (ex: @keyframes and @webkit-keyframes).

module: {
  rules: [{
    test: /\.css$/,
    use: [
      require.resolve('style-loader'),
      require.resolve('css-loader'),
      {
        loader: require.resolve('postcss-loader'),
        options: {
          postcssOptions: {
            plugins: {
              "postcss-prefix-selector": {
                prefix: '.my-prefix',
                transform(prefix, selector, prefixedSelector, filePath, rule) {
                  if (selector.match(/^(html|body)/)) {
                    return selector.replace(/^([^\s]*)/, `$1 ${prefix}`);
                  }
                  
                  if (filePath.match(/node_modules/)) {
                    return selector; // Do not prefix styles imported from node_modules
                  }
                  
                  const annotation = rule.prev();
                  if (annotation?.type === 'comment' && annotation.text.trim() === 'no-prefix') {
                    return selector; // Do not prefix style rules that are preceded by: /* no-prefix */
                  }

                  return prefixedSelector;
                },
              },
              autoprefixer: {
                browsers: ['last 4 versions']
              }
            }
          }
        }
      }
    ]
  }]
}

Options

NameTypeDescription
prefixstringThis string is added before every CSS selector
excludestring[] or RegExp[]It's possible to avoid prefixing some selectors by passing an array of selectors
transformFunctionIn cases where you may want to use the prefix differently for different selectors, it is possible to pass in a custom transform method
ignoreFilesstring[] or RegExp[]List of ignored files for processing
includeFilesstring[] or RegExp[]List of included files for processing

Maintainer

This project was originally created by @jongleberry and is being maintained by @RadValentin. If you have any questions, feel free to ping the latter.

Contribute

Please contribute! If you have any questions or bugs, open an issue. Or, open a pull request with a fix.

This project uses Mocha. If you submit a PR, please add appropriate tests and make sure that everything is green for your branch.

License

MIT © 2015-2022 Jonathan Ong.

@omnia/tooling-vue@ephesus/ephesus-coreeleventy-plugin-slinkitymapintegratedvuer-12labours@everything-registry/sub-chunk-2461react-krax-componentsseek-style-guide-webpackdivi-scriptscss-scope-module-federation-pluginbuild-plugin-stark-modulebuild-react-11typostcss-prefix-selector-browserprefix-selector-loader@cor-web/cor-design-system@crh-fe/codease-clichayns-toolkitcgj-svg-bakerbcs-buildstyles-toolkitsugarcoatcustomised-mapintegratedvuer@fishx-vite/preset-fishx@duhongwei/hotpack-postcss@ephesus/cli@faizanhaider/iconsax@prestashopcorp/smb-edition-homepage@porosjs/preset-umi@shawnfarsai/scale-ui@reborndevelopers/design-system-toolbox@zalastax/nolb-postcss-p@sentre/craco-plugins@tehsurfer/mapintegratedvueramit-design-system@webcon/js-custom-control-build@umijs/preset-umiarena-plugin-cliargos-id-form-main@12-labours/mapintegratedvuersvg-bakersvg-baker-neoelsvg-baker-tmpsvg-baker-updatesvg2tsswt-divi-scriptssvg-mixerg4elogicfreelancexhs-mp-compiler-new-clixhs-mp-compiler-clikrax-ui-componentstpa-style-webpack-plugintowify-ngc-esbuildghost-spiritglimmer-uivmd@gaea-team/master-spa@gaea-team/slave-spa@mapstore/project@loglib/ui@lordbeanbag/vite-plugin-svg-icons-monorepo@markmiro/framer-components@infinitebrahmanuniverse/nolb-postcss-plighting-plugin-miniprogram2@leo-burnett-melbourne/svg-baker@leo-burnett-melbourne/svg-mixermsync-plugin-dev1msync-plugin-mvbmsnt-svg-bakermortystack@neikop/rainbowkitnode-red-contrib-ui-svgngc-esbuildng-estest@nichoth/vmd@openeuropa/bcl-buildernx-ng-esbuildnymphea
1.16.0

2 years ago

1.15.0

2 years ago

1.14.0

2 years ago

1.13.0

3 years ago

1.12.0

3 years ago

1.11.0

3 years ago

1.10.0

3 years ago

1.9.0

3 years ago

1.8.0

3 years ago

1.7.2

5 years ago

1.7.1

5 years ago

1.7.0

5 years ago

1.6.0

7 years ago

1.5.0

7 years ago

1.4.0

8 years ago

1.3.0

9 years ago

1.2.0

9 years ago

1.1.0

9 years ago

1.0.0

9 years ago