// NOTICE: This file is generated by Rollup. To modify it, // please instead edit the ESM counterpart and rebuild with Rollup (npm run build). 'use strict'; const nodeFieldIndices = require('../../utils/nodeFieldIndices.cjs'); const getAtRuleParams = require('../../utils/getAtRuleParams.cjs'); const getDeclarationValue = require('../../utils/getDeclarationValue.cjs'); const getRuleSelector = require('../../utils/getRuleSelector.cjs'); const report = require('../../utils/report.cjs'); const ruleMessages = require('../../utils/ruleMessages.cjs'); const validateOptions = require('../../utils/validateOptions.cjs'); const ruleName = 'no-irregular-whitespace'; const messages = ruleMessages(ruleName, { rejected: 'Unexpected irregular whitespace', }); const meta = { url: 'https://stylelint.io/user-guide/rules/no-irregular-whitespace', }; const IRREGULAR_WHITESPACES = [ '\u000B', // Line Tabulation (\v) - '\u000C', // Form Feed (\f) - '\u00A0', // No-Break Space - '\u0085', // Next Line '\u1680', // Ogham Space Mark '\u180E', // Mongolian Vowel Separator - '\uFEFF', // Zero Width No-Break Space - '\u2000', // En Quad '\u2001', // Em Quad '\u2002', // En Space - '\u2003', // Em Space - '\u2004', // Tree-Per-Em '\u2005', // Four-Per-Em '\u2006', // Six-Per-Em '\u2007', // Figure Space '\u2008', // Punctuation Space - '\u2009', // Thin Space '\u200A', // Hair Space '\u200B', // Zero Width Space - '\u2028', // Line Separator '\u2029', // Paragraph Separator '\u202F', // Narrow No-Break Space '\u205F', // Medium Mathematical Space '\u3000', // Ideographic Space ]; const IRREGULAR_WHITESPACES_PATTERN = new RegExp(`([${IRREGULAR_WHITESPACES.join('')}]+)`, 'g'); /** * @param {string} str * @returns {Array<{index: number, length: number}>} */ const findIrregularWhitespace = (str) => { return Array.from(str.matchAll(IRREGULAR_WHITESPACES_PATTERN)).map((match) => { return { index: match.index, length: match[0].length, }; }); }; /** @type {import('stylelint').CoreRules[ruleName]} */ const rule = (primary) => { return (root, result) => { const validOptions = validateOptions(result, ruleName, { actual: primary }); if (!validOptions) { return; } /** * @template {import('postcss').Node} T * @param {T} node * @param {string | undefined} value * @param {(node: T) => number} getIndex */ const validate = (node, value, getIndex) => { if (!value) return; const issues = findIrregularWhitespace(value); if (!issues.length) return; const startIndex = getIndex(node); issues.forEach(({ index, length }) => { report({ ruleName, result, message: messages.rejected, node, index: startIndex + index, endIndex: startIndex + index + length, }); }); }; root.walkAtRules((atRule) => { validate(atRule, atRule.raws.before, zeroIndex); validate(atRule, atRule.name, oneIndex); validate(atRule, atRule.raws.afterName, nodeFieldIndices.atRuleAfterNameIndex); validate(atRule, getAtRuleParams(atRule), nodeFieldIndices.atRuleParamIndex); validate(atRule, atRule.raws.between, nodeFieldIndices.atRuleBetweenIndex); validate(atRule, atRule.raws.after, nodeFieldIndices.atRuleAfterIndex); }); root.walkRules((ruleNode) => { validate(ruleNode, ruleNode.raws.before, zeroIndex); validate(ruleNode, getRuleSelector(ruleNode), zeroIndex); validate(ruleNode, ruleNode.raws.between, nodeFieldIndices.ruleBetweenIndex); validate(ruleNode, ruleNode.raws.after, nodeFieldIndices.ruleAfterIndex); }); root.walkDecls((decl) => { validate(decl, decl.raws.before, zeroIndex); validate(decl, decl.prop, zeroIndex); validate(decl, decl.raws.between, nodeFieldIndices.declarationBetweenIndex); validate(decl, getDeclarationValue(decl), nodeFieldIndices.declarationValueIndex); }); }; }; function zeroIndex() { return 0; } function oneIndex() { return 1; } rule.ruleName = ruleName; rule.messages = messages; rule.meta = meta; module.exports = rule;