scancss
Version:
A robust CSS stylesheet statistics collector and analyzer
65 lines (51 loc) • 2.02 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.handlePerformanceHacks = handlePerformanceHacks;
var _postcssValuesParser = require('postcss-values-parser');
var _postcssValuesParser2 = _interopRequireDefault(_postcssValuesParser);
var _countUsage = require('../../../calculators/countUsage');
var _isSafeAst = require('../../../predicates/isSafeAst');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
const reTranslate3dHack = /translate3d\(\s*0\s*,\s*0\s*,\s*0\s*\)/i;
const reTranslateZHack = /translateZ\(\s*0\s*\)/i;
const reRotateZHack = /rotateZ\(\s*(360deg|400grad|1turn|6\.2832rad)\s*\)/i;
function walkNodes(nodes, decl, report) {
nodes.forEach(node => {
/* istanbul ignore else */
if (node.type === 'func') {
const wholeFunc = String(node);
const wholeDecl = String(decl);
if (reTranslate3dHack.test(wholeFunc)) {
(0, _countUsage.countUsage)(wholeDecl, report.properties.performanceHacks);
}
if (reTranslateZHack.test(wholeFunc)) {
(0, _countUsage.countUsage)(wholeDecl, report.properties.performanceHacks);
}
if (reRotateZHack.test(wholeFunc)) {
(0, _countUsage.countUsage)(wholeDecl, report.properties.performanceHacks);
}
}
});
}
function handlePerformanceHacks(decl, report) {
if (decl.prop.endsWith('transform')) {
try {
const ast = (0, _postcssValuesParser2.default)(decl.value).parse();
/* istanbul ignore else */
if ((0, _isSafeAst.isSafeAst)(ast)) {
walkNodes(ast.nodes[0].nodes, decl, report);
}
} catch (err) {
/* istanbul ignore next */
/* eslint-disable-next-line no-console */
console.log(`'postcss-values-parser' module error\n${err}`);
}
}
if (decl.prop === 'will-change') {
(0, _countUsage.countUsage)(String(decl), report.properties.performanceHacks);
} else if (decl.prop === 'contain' && decl.value.trim() !== 'none') {
(0, _countUsage.countUsage)(String(decl), report.properties.performanceHacks);
}
}