blob: 2e1618b4d36775a9f8310a0c65bb05eac5daacc3 [file] [log] [blame]
'use strict';
const vendor = require('./vendor');
/**
* Extract each list using the internal API of Autoprefixer 10.2.5.
*
* @see https://github.com/postcss/autoprefixer/tree/10.2.5
*
* @example
* const autoprefixer = require('autoprefixer');
* const Browsers = require('autoprefixer/lib/browsers');
* const Prefixes = require('autoprefixer/lib/prefixes');
* const utils = require('autoprefixer/lib/utils');
*
* const prefixes = new Prefixes(autoprefixer.data.prefixes, new Browsers(autoprefixer.data.browsers, []));
*/
/**
* @example
* Object.keys(prefixes.remove).filter((s) => s.startsWith('@'));
*/
const AT_RULES = new Set([
'@-khtml-keyframes',
'@-moz-keyframes',
'@-ms-keyframes',
'@-ms-viewport',
'@-o-keyframes',
'@-o-viewport',
'@-webkit-keyframes',
'@resolution',
]);
/**
* @example
* prefixes.remove.selectors.map((s) => s.prefixed);
*/
const SELECTORS = new Set([
':-moz-any-link',
':-moz-full-screen',
':-moz-placeholder',
':-moz-placeholder-shown',
':-moz-read-only',
':-moz-read-write',
':-ms-fullscreen',
':-ms-input-placeholder',
':-webkit-any-link',
':-webkit-full-screen',
'::-moz-placeholder',
'::-moz-selection',
'::-ms-input-placeholder',
'::-webkit-backdrop',
'::-webkit-input-placeholder',
]);
/**
* @example
* Object.entries(autoprefixer.data.prefixes)
* .filter(([key, value]) => !value.selector && !value.props && !key.startsWith('@'))
* .map(([key, value]) => key);
*/
const PROPERTIES = new Set([
'align-content',
'align-items',
'align-self',
'animation',
'animation-delay',
'animation-direction',
'animation-duration',
'animation-fill-mode',
'animation-iteration-count',
'animation-name',
'animation-play-state',
'animation-timing-function',
'appearance',
'backdrop-filter',
'backface-visibility',
'background-clip',
'background-origin',
'background-size',
'border-block-end',
'border-block-start',
'border-bottom-left-radius',
'border-bottom-right-radius',
'border-image',
'border-inline-end',
'border-inline-start',
'border-radius',
'border-top-left-radius',
'border-top-right-radius',
'box-decoration-break',
'box-shadow',
'box-sizing',
'break-after',
'break-before',
'break-inside',
'clip-path',
'color-adjust',
'column-count',
'column-fill',
'column-gap',
'column-rule',
'column-rule-color',
'column-rule-style',
'column-rule-width',
'column-span',
'column-width',
'columns',
'filter',
'flex',
'flex-basis',
'flex-direction',
'flex-flow',
'flex-grow',
'flex-shrink',
'flex-wrap',
'flow-from',
'flow-into',
'font-feature-settings',
'font-kerning',
'font-language-override',
'font-variant-ligatures',
'grid-area',
'grid-column',
'grid-column-align',
'grid-column-end',
'grid-column-start',
'grid-row',
'grid-row-align',
'grid-row-end',
'grid-row-start',
'grid-template',
'grid-template-areas',
'grid-template-columns',
'grid-template-rows',
'hyphens',
'image-rendering',
'justify-content',
'margin-block-end',
'margin-block-start',
'margin-inline-end',
'margin-inline-start',
'mask',
'mask-border',
'mask-border-outset',
'mask-border-repeat',
'mask-border-slice',
'mask-border-source',
'mask-border-width',
'mask-clip',
'mask-composite',
'mask-image',
'mask-origin',
'mask-position',
'mask-repeat',
'mask-size',
'object-fit',
'object-position',
'order',
'overscroll-behavior',
'padding-block-end',
'padding-block-start',
'padding-inline-end',
'padding-inline-start',
'perspective',
'perspective-origin',
'place-self',
'region-fragment',
'scroll-snap-coordinate',
'scroll-snap-destination',
'scroll-snap-points-x',
'scroll-snap-points-y',
'scroll-snap-type',
'shape-image-threshold',
'shape-margin',
'shape-outside',
'tab-size',
'text-align-last',
'text-decoration',
'text-decoration-color',
'text-decoration-line',
'text-decoration-skip',
'text-decoration-skip-ink',
'text-decoration-style',
'text-emphasis',
'text-emphasis-color',
'text-emphasis-position',
'text-emphasis-style',
'text-orientation',
'text-overflow',
'text-size-adjust',
'text-spacing',
'touch-action',
'transform',
'transform-origin',
'transform-style',
'transition',
'transition-delay',
'transition-duration',
'transition-property',
'transition-timing-function',
'user-select',
'writing-mode',
]);
/**
* @example
* Object.values(prefixes.remove)
* .filter((p) => Array.isArray(p.values))
* .flatMap((p) => p.values)
* .map((p) => utils.removeNote(p.prefixed)) // normalize '-webkit- old'
* .filter((p) => !p.endsWith('-')); // remove '-webkit-' only
*
* @see https://github.com/stylelint/stylelint/pull/5312/files#r636018013
*/
const PROPERTY_VALUES = new Set([
'-moz-available',
'-moz-box',
'-moz-calc',
'-moz-crisp-edges',
'-moz-element',
'-moz-fit-content',
'-moz-grab',
'-moz-grabbing',
'-moz-inline-box',
'-moz-isolate',
'-moz-isolate-override',
'-moz-linear-gradient',
'-moz-max-content',
'-moz-min-content',
'-moz-plaintext',
'-moz-radial-gradient',
'-moz-repeating-linear-gradient',
'-moz-repeating-radial-gradient',
'-moz-zoom-in',
'-moz-zoom-out',
'-ms-flexbox',
'-ms-grid',
'-ms-inline-flexbox',
'-ms-inline-grid',
'-ms-linear-gradient',
'-ms-radial-gradient',
'-ms-repeating-linear-gradient',
'-ms-repeating-radial-gradient',
'-o-linear-gradient',
'-o-pixelated',
'-o-radial-gradient',
'-o-repeating-linear-gradient',
'-o-repeating-radial-gradient',
'-webkit-box',
'-webkit-calc',
'-webkit-cross-fade',
'-webkit-fill-available',
'-webkit-filter',
'-webkit-fit-content',
'-webkit-flex',
'-webkit-grab',
'-webkit-grabbing',
'-webkit-image-set',
'-webkit-inline-box',
'-webkit-inline-flex',
'-webkit-isolate',
'-webkit-linear-gradient',
'-webkit-max-content',
'-webkit-min-content',
'-webkit-optimize-contrast',
'-webkit-radial-gradient',
'-webkit-repeating-linear-gradient',
'-webkit-repeating-radial-gradient',
'-webkit-sticky',
'-webkit-zoom-in',
'-webkit-zoom-out',
]);
/**
* 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 AT_RULES.has(`@${identifier.toLowerCase()}`);
},
/**
* @param {string} identifier
* @returns {boolean}
*/
selector(identifier) {
return SELECTORS.has(identifier.toLowerCase());
},
/**
* @param {string} identifier
* @returns {boolean}
*/
mediaFeatureName(identifier) {
return identifier.toLowerCase().includes('device-pixel-ratio');
},
/**
* @param {string} identifier
* @returns {boolean}
*/
property(identifier) {
const ident = identifier.toLowerCase();
// HACK: `interpolation-mode` does not exist. This is an IE extension for `image-rendering`.
// See <https://developer.mozilla.org/en-US/docs/Web/CSS/image-rendering#examples>
if (ident === '-ms-interpolation-mode') {
return true;
}
if (vendor.prefix(ident).length === 0) {
return false;
}
return PROPERTIES.has(vendor.unprefixed(ident));
},
/**
* @param {string} value
* @returns {boolean}
*/
propertyValue(value) {
return PROPERTY_VALUES.has(value.toLowerCase());
},
/**
* @param {string} value
* @returns {string}
*/
unprefix(value) {
return value.replace(/-\w+-/, '');
},
};