UNPKG

babel-plugin-styled-components-px2vw

Version:
213 lines (212 loc) 8.35 kB
"use strict"; 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, }; });