babel-plugin-styled-components-px2vw
Version:
Babel plugin for convert px to vw units of styled-components
213 lines (212 loc) • 8.35 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
var tslib_1 = require("tslib");
var helper_plugin_utils_1 = require("@babel/helper-plugin-utils");
var createPx2vw_1 = tslib_1.__importDefault(require("./createPx2vw"));
var types_1 = require("@babel/types");
var configuration_1 = tslib_1.__importDefault(require("./configuration"));
var replace_1 = require("./replace");
var _px2vw;
var _used = false;
function isStyledTagged(tagged) {
var tag = tagged.tag;
if (types_1.isIdentifier(tag)) {
return isStyled(tag);
}
else if (types_1.isMemberExpression(tag)) {
return isStyledMember(tag);
}
else if (types_1.isCallExpression(tag)) {
return isStyledFunction(tag);
}
return false;
}
function isStyledMember(member) {
if (types_1.isIdentifier(member.object)) {
return isStyled(member.object);
}
else if (types_1.isMemberExpression(member.object)) {
return isStyledMember(member.object);
}
return false;
}
function isStyledFunction(call) {
var callee = call.callee;
if (types_1.isMemberExpression(callee)) {
return isStyledMember(callee);
}
else if (types_1.isIdentifier(callee)) {
return isStyled(callee);
}
else if (types_1.isCallExpression(callee)) {
return isStyledFunction(callee);
}
return false;
}
function isStyled(id) {
return configuration_1.default.config.tags.indexOf(id.name) >= 0;
}
function isPureExpression(node) {
return (types_1.isIdentifier(node) ||
types_1.isCallExpression(node) ||
types_1.isOptionalCallExpression(node) ||
types_1.isBinaryExpression(node) ||
types_1.isStringLiteral(node) ||
types_1.isNumericLiteral(node) ||
types_1.isMemberExpression(node) ||
types_1.isOptionalMemberExpression(node) ||
types_1.isLogicalExpression(node));
}
function createCallPx2vw(px2vw) {
var expressions = [];
for (var _i = 1; _i < arguments.length; _i++) {
expressions[_i - 1] = arguments[_i];
}
_used = true;
return types_1.callExpression(px2vw, expressions);
}
function transformTemplateExpression(expression, px2vw) {
if (types_1.isArrowFunctionExpression(expression)) {
if (types_1.isBlock(expression.body)) {
expression.body = createCallPx2vw(px2vw, types_1.arrowFunctionExpression([], expression.body));
}
else if (isPureExpression(expression.body)) {
expression.body = createCallPx2vw(px2vw, expression.body);
}
else {
expression.body = transformTemplateExpression(expression.body, px2vw);
}
}
else if (types_1.isConditionalExpression(expression)) {
expression.alternate = transformTemplateExpression(expression.alternate, px2vw);
expression.consequent = transformTemplateExpression(expression.consequent, px2vw);
}
else if (types_1.isFunctionExpression(expression)) {
return types_1.arrowFunctionExpression([types_1.restElement(types_1.identifier('args'))], createCallPx2vw(px2vw, expression, types_1.spreadElement(types_1.identifier('args'))));
}
else {
return createCallPx2vw(px2vw, expression);
}
return expression;
}
function transform(template) {
var _a, _b;
if (_px2vw) {
var expressions = tslib_1.__spreadArray(tslib_1.__spreadArray([], template.expressions), template.quasis);
expressions.sort(function (it1, it2) { return (it1.start || 0) - (it2.start || 0); });
var _loop_1 = function (i) {
var expression = expressions[i];
if (types_1.isTemplateElement(expression))
return "continue";
var next = expressions[i + 1];
if (next && types_1.isTemplateElement(next)) {
var text = ((_a = next.value) === null || _a === void 0 ? void 0 : _a.raw) || ((_b = next.value) === null || _b === void 0 ? void 0 : _b.cooked);
var regUnit = new RegExp("^" + configuration_1.default.config.unitToConvert);
if (text && regUnit.test(text)) {
var idx = template.expressions.findIndex(function (it) { return it === expression; });
if (idx !== -1) {
template.expressions[idx] = transformTemplateExpression(expression, _px2vw);
if (next.value && next.value.raw) {
next.value.raw = next.value.raw.replace(regUnit, '');
}
if (next.value && next.value.cooked) {
next.value.cooked = next.value.cooked.replace(regUnit, '');
}
}
}
}
};
for (var i = 0; i < expressions.length; i++) {
_loop_1(i);
}
}
}
exports.default = helper_plugin_utils_1.declare(function (api, options) {
api.assertVersion(7);
configuration_1.default.updateConfig(options);
var templateVisitor = {
TemplateElement: function (path) {
var it = path.node;
if (it.value && it.value.raw) {
it.value.raw = replace_1.replace(it.value.raw);
}
if (it.value && it.value.cooked) {
it.value.cooked = replace_1.replace(it.value.cooked);
}
},
StringLiteral: function (path) {
path.node.value = replace_1.replace(path.node.value);
},
};
if (configuration_1.default.config.transformRuntime) {
templateVisitor.TemplateLiteral = function (path) {
transform(path.node);
};
}
var visitor = {
Program: {
exit: function (programPath) {
if (_used && _px2vw) {
programPath.node.body.push(createPx2vw_1.default(_px2vw, configuration_1.default.config));
}
},
enter: function (programPath, pluginPass) {
var sourceFileName = pluginPass.file.opts.sourceFileName;
var exclude = configuration_1.default.config.exclude;
var include = configuration_1.default.config.include;
if (include && sourceFileName) {
if (include instanceof RegExp) {
if (!include.test(sourceFileName))
return;
}
else if (exclude instanceof Array) {
var flag = false;
for (var i = 0; i < include.length; i++) {
if (include[i].test(sourceFileName)) {
flag = true;
break;
}
}
if (!flag)
return;
}
}
if (exclude && sourceFileName) {
if (exclude instanceof RegExp) {
if (exclude.test(sourceFileName))
return;
}
else if (exclude instanceof Array) {
for (var i = 0; i < exclude.length; i++) {
if (exclude[i].test(sourceFileName))
return;
}
}
}
if (configuration_1.default.config.transformRuntime) {
_px2vw = programPath.scope.generateUidIdentifier('px2vw');
}
else {
_px2vw = undefined;
}
_used = false;
programPath.traverse({
TaggedTemplateExpression: function (path) {
if (isStyledTagged(path.node)) {
path.traverse(templateVisitor);
}
},
CallExpression: function (path) {
if (isStyledFunction(path.node)) {
path.traverse(templateVisitor);
}
},
});
},
},
};
return {
name: 'styled-components-px2vw',
visitor: visitor,
};
});