'use strict'; const autoprefixer = require('autoprefixer'); const Browsers = require('autoprefixer/lib/browsers'); const Prefixes = require('autoprefixer/lib/prefixes'); /** * Use Autoprefixer's secret powers to determine whether or * not a certain CSS identifier contains a vendor prefix that * Autoprefixer, given the standardized identifier, could add itself. * * Used by `*-no-vendor-prefix-*` rules to find superfluous * vendor prefixes. */ const prefixes = new Prefixes( autoprefixer.data.prefixes, new Browsers(autoprefixer.data.browsers, []), ); /** * Most identifier types have to be looked up in a unique way, * so we're exposing special functions for each. */ module.exports = { /** * @param {string} identifier * @returns {boolean} */ atRuleName(identifier) { return Boolean(prefixes.remove[`@${identifier.toLowerCase()}`]); }, /** * @param {string} identifier * @returns {boolean} */ selector(identifier) { return prefixes.remove.selectors.some((/** @type {{ prefixed: string}} */ selectorObj) => { return identifier.toLowerCase() === selectorObj.prefixed; }); }, /** * @param {string} identifier * @returns {boolean} */ mediaFeatureName(identifier) { return identifier.toLowerCase().includes('device-pixel-ratio'); }, /** * @param {string} identifier * @returns {boolean} */ property(identifier) { return Boolean(autoprefixer.data.prefixes[prefixes.unprefixed(identifier.toLowerCase())]); }, /** * * @param {string} prop * @param {string} value * @returns {boolean} */ propertyValue(prop, value) { const possiblePrefixableValues = (prefixes.remove[prop.toLowerCase()] && prefixes.remove[prop.toLowerCase()].values) || false; return ( possiblePrefixableValues && possiblePrefixableValues.some((/** @type {{ prefixed: string}} */ valueObj) => { return value.toLowerCase() === valueObj.prefixed; }) ); }, /** * * @param {string} value * @returns {string} */ unprefix(value) { return value.replace(/-\w+-/, ''); }, };