blob: 22ecfbce439785466e356e946dbb586afc53cd84 [file] [log] [blame]
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _has = require('has');
var _has2 = _interopRequireDefault(_has);
var _postcss = require('postcss');
var _postcss2 = _interopRequireDefault(_postcss);
var _postcssValueParser = require('postcss-value-parser');
var _postcssValueParser2 = _interopRequireDefault(_postcssValueParser);
var _cssnanoUtilGetMatch = require('cssnano-util-get-match');
var _cssnanoUtilGetMatch2 = _interopRequireDefault(_cssnanoUtilGetMatch);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function getValues(list, { value }, index) {
if (index % 2 === 0) {
return [...list, parseFloat(value)];
}
return list;
}
function matrix3d(node, values) {
// matrix3d(a, b, 0, 0, c, d, 0, 0, 0, 0, 1, 0, tx, ty, 0, 1) => matrix(a, b, c, d, tx, ty)
if (values[15] && values[2] === 0 && values[3] === 0 && values[6] === 0 && values[7] === 0 && values[8] === 0 && values[9] === 0 && values[10] === 1 && values[11] === 0 && values[14] === 0 && values[15] === 1) {
const { nodes } = node;
node.value = 'matrix';
node.nodes = [nodes[0], // a
nodes[1], // ,
nodes[2], // b
nodes[3], // ,
nodes[8], // c
nodes[9], // ,
nodes[10], // d
nodes[11], // ,
nodes[24], // tx
nodes[25], // ,
nodes[26]];
}
}
const rotate3dMappings = [['rotateX', [1, 0, 0]], // rotate3d(1, 0, 0, a) => rotateX(a)
['rotateY', [0, 1, 0]], // rotate3d(0, 1, 0, a) => rotateY(a)
['rotate', [0, 0, 1]]];
const rotate3dMatch = (0, _cssnanoUtilGetMatch2.default)(rotate3dMappings);
function rotate3d(node, values) {
const { nodes } = node;
const match = rotate3dMatch(values.slice(0, 3));
if (match.length) {
node.value = match;
node.nodes = [nodes[6]];
}
}
function rotateZ(node) {
// rotateZ(rz) => rotate(rz)
node.value = 'rotate';
}
function scale(node, values) {
const { nodes } = node;
if (!nodes[2]) {
return;
}
const [first, second] = values;
// scale(sx, sy) => scale(sx)
if (first === second) {
node.nodes = [nodes[0]];
return;
}
// scale(sx, 1) => scaleX(sx)
if (second === 1) {
node.value = 'scaleX';
node.nodes = [nodes[0]];
return;
}
// scale(1, sy) => scaleY(sy)
if (first === 1) {
node.value = 'scaleY';
node.nodes = [nodes[2]];
return;
}
}
function scale3d(node, values) {
const { nodes } = node;
const [first, second, third] = values;
// scale3d(sx, 1, 1) => scaleX(sx)
if (second === 1 && third === 1) {
node.value = 'scaleX';
node.nodes = [nodes[0]];
return;
}
// scale3d(1, sy, 1) => scaleY(sy)
if (first === 1 && third === 1) {
node.value = 'scaleY';
node.nodes = [nodes[2]];
return;
}
// scale3d(1, 1, sz) => scaleZ(sz)
if (first === 1 && second === 1) {
node.value = 'scaleZ';
node.nodes = [nodes[4]];
return;
}
}
function translate(node, values) {
const { nodes } = node;
if (!nodes[2]) {
return;
}
// translate(tx, 0) => translate(tx)
if (values[1] === 0) {
node.nodes = [nodes[0]];
return;
}
// translate(0, ty) => translateY(ty)
if (values[0] === 0) {
node.value = 'translateY';
node.nodes = [nodes[2]];
return;
}
}
function translate3d(node, values) {
const { nodes } = node;
// translate3d(0, 0, tz) => translateZ(tz)
if (values[0] === 0 && values[1] === 0) {
node.value = 'translateZ';
node.nodes = [nodes[4]];
}
}
const reducers = {
matrix3d,
rotate3d,
rotateZ,
scale,
scale3d,
translate,
translate3d
};
function normalizeReducerName(name) {
const lowerCasedName = name.toLowerCase();
if (lowerCasedName === 'rotatez') {
return 'rotateZ';
}
return lowerCasedName;
}
function reduce(node) {
const { nodes, type, value } = node;
const normalizedReducerName = normalizeReducerName(value);
if (type === 'function' && (0, _has2.default)(reducers, normalizedReducerName)) {
reducers[normalizedReducerName](node, nodes.reduce(getValues, []));
}
return false;
}
exports.default = _postcss2.default.plugin('postcss-reduce-transforms', () => {
return css => {
const cache = {};
css.walkDecls(/transform$/i, decl => {
const value = decl.value;
if (cache[value]) {
decl.value = cache[value];
return;
}
const result = (0, _postcssValueParser2.default)(value).walk(reduce).toString();
decl.value = result;
cache[value] = result;
});
};
});
module.exports = exports['default'];