340 lines
7.2 KiB
JavaScript
340 lines
7.2 KiB
JavaScript
|
'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+-/, '');
|
||
|
},
|
||
|
};
|