'use strict'; const _ = require('lodash'); const isCustomPropertySet = require('../utils/isCustomPropertySet'); const isStandardSyntaxSelector = require('../utils/isStandardSyntaxSelector'); /** * Check whether a Node is a standard rule * * @param {import('postcss').Rule | import('postcss-less').Rule} rule * @returns {boolean} */ module.exports = function (rule) { if (rule.type !== 'rule') { return false; } // Get full selector const selector = _.get(rule, 'raws.selector.raw', rule.selector); if (!isStandardSyntaxSelector(rule.selector)) { return false; } // Custom property set (e.g. --custom-property-set: {}) if (isCustomPropertySet(rule)) { return false; } // Called Less mixin (e.g. a { .mixin() }) // @ts-ignore TODO TYPES support LESS and SASS types somehow if (rule.mixin) { return false; } // Less detached rulesets if (selector.startsWith('@') && selector.endsWith(':')) { return false; } // Ignore Less &:extend rule if ('extend' in rule && rule.extend) { return false; } // Ignore mixin or &:extend rule // https://github.com/shellscape/postcss-less/blob/master/lib/less-parser.js#L52 // @ts-ignore TODO TYPES support LESS and SASS types somehow if (rule.params && rule.params[0]) { return false; } // Non-outputting Less mixin definition (e.g. .mixin() {}) if (selector.endsWith(')') && !selector.includes(':')) { return false; } // Less guards if (/when\s+(not\s+)*\(/.test(selector)) { return false; } // Ignore Scss nested properties if (selector.endsWith(':')) { return false; } return true; };