| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 |
- 'use strict';
- const charset = 'charset';
- // eslint-disable-next-line no-control-regex
- const nonAscii = /[^\x00-\x7F]/;
- /**
- * @typedef {{add?: boolean}} Options
- */
- /**
- * @type {import('postcss').PluginCreator<Options>}
- * @param {Options} opts
- * @return {import('postcss').Plugin}
- */
- function pluginCreator(opts = {}) {
- return {
- postcssPlugin: 'postcss-normalize-' + charset,
- OnceExit(css, { AtRule }) {
- /** @type {import('postcss').AtRule | undefined} */
- let charsetRule;
- /** @type {import('postcss').Node | undefined} */
- let nonAsciiNode;
- css.walk((node) => {
- if (node.type === 'atrule' && node.name === charset) {
- if (!charsetRule) {
- charsetRule = node;
- }
- node.remove();
- } else if (
- !nonAsciiNode &&
- node.parent === css &&
- nonAscii.test(node.toString())
- ) {
- nonAsciiNode = node;
- }
- });
- if (nonAsciiNode) {
- if (!charsetRule && opts.add !== false) {
- charsetRule = new AtRule({
- name: charset,
- params: '"utf-8"',
- });
- }
- if (charsetRule) {
- charsetRule.source = nonAsciiNode.source;
- css.prepend(charsetRule);
- }
- }
- },
- };
- }
- pluginCreator.postcss = true;
- module.exports = pluginCreator;
|