123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 |
- // @ts-nocheck
-
- 'use strict';
-
- const valueParser = require('postcss-value-parser');
-
- const declarationValueIndex = require('../../utils/declarationValueIndex');
- const getDeclarationValue = require('../../utils/getDeclarationValue');
- const report = require('../../utils/report');
- const ruleMessages = require('../../utils/ruleMessages');
- const setDeclarationValue = require('../../utils/setDeclarationValue');
- const validateOptions = require('../../utils/validateOptions');
-
- const ruleName = 'color-function-notation';
-
- const messages = ruleMessages(ruleName, {
- expected: (primary) => `Expected ${primary} color-function notation`,
- });
-
- const LEGACY_FUNCS = new Set(['rgba', 'hsla']);
- const LEGACY_NOTATION_FUNCS = new Set(['rgb', 'rgba', 'hsl', 'hsla']);
-
- function rule(primary, secondary, context) {
- return (root, result) => {
- const validOptions = validateOptions(result, ruleName, {
- actual: primary,
- possible: ['modern', 'legacy'],
- });
-
- if (!validOptions) return;
-
- root.walkDecls((decl) => {
- let needsFix = false;
- const parsedValue = valueParser(getDeclarationValue(decl));
-
- parsedValue.walk((node) => {
- const { value, type, sourceIndex, nodes } = node;
-
- if (type !== 'function') return;
-
- if (!LEGACY_NOTATION_FUNCS.has(value.toLowerCase())) return;
-
- if (primary === 'modern' && !hasCommas(node)) return;
-
- if (primary === 'legacy' && hasCommas(node)) return;
-
- if (context.fix && primary === 'modern') {
- let commaCount = 0;
-
- // Convert punctuation
- node.nodes = nodes.map((childNode) => {
- if (isComma(childNode)) {
- // Non-alpha commas to space and alpha commas to slashes
- if (commaCount < 2) {
- childNode.type = 'space';
- childNode.value = atLeastOneSpace(childNode.after);
- commaCount++;
- } else {
- childNode.value = '/';
- childNode.before = atLeastOneSpace(childNode.before);
- childNode.after = atLeastOneSpace(childNode.after);
- }
- }
-
- return childNode;
- });
-
- // Remove trailing 'a' from legacy function name
- if (LEGACY_FUNCS.has(node.value.toLowerCase())) {
- node.value = node.value.slice(0, -1);
- }
-
- needsFix = true;
-
- return;
- }
-
- report({
- message: messages.expected(primary),
- node: decl,
- index: declarationValueIndex(decl) + sourceIndex,
- result,
- ruleName,
- });
- });
-
- if (needsFix) {
- setDeclarationValue(decl, parsedValue.toString());
- }
- });
- };
- }
-
- function atLeastOneSpace(whitespace) {
- return whitespace !== '' ? whitespace : ' ';
- }
-
- function isComma(node) {
- return node.type === 'div' && node.value === ',';
- }
-
- function hasCommas(node) {
- return node.nodes && node.nodes.some((childNode) => isComma(childNode));
- }
-
- rule.ruleName = ruleName;
- rule.messages = messages;
- module.exports = rule;
|