UNPKG

styled-components-test-utils

Version:

Test utils for styled-components compatible with jest, expect, chai and jasmine

89 lines (67 loc) 2.57 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _css = require('css'); var _css2 = _interopRequireDefault(_css); var _getCSS = require('../utils/getCSS'); var _getCSS2 = _interopRequireDefault(_getCSS); var _getClassNames = require('../utils/getClassNames'); var _getClassNames2 = _interopRequireDefault(_getClassNames); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } var includesClassNames = function includesClassNames(classNames, selectors) { return classNames.some(function (className) { return selectors.some(function (selector) { return selector.indexOf(className) > -1; }); }); }; var filterRules = function filterRules(classNames) { return function (rule) { return rule.type === 'rule' && includesClassNames(classNames, rule.selectors) && rule.declarations.length; }; }; var getAtRules = function getAtRules(ast, filter) { return ast.stylesheet.rules.filter(function (rule) { return rule.type === 'media' || rule.type === 'supports'; }).reduce(function (acc, atRule) { // eslint-disable-next-line atRule.rules = atRule.rules.filter(filter); if (atRule.rules.length) { return acc.concat(atRule); } return acc; }, []); }; var getStyle = function getStyle(classNames) { var ast = (0, _getCSS2['default'])(true); var filter = filterRules(classNames); var rules = ast.stylesheet.rules.filter(filter); var atRules = getAtRules(ast, filter); ast.stylesheet.rules = rules.concat(atRules); return _css2['default'].stringify(ast); }; var replaceClassNames = function replaceClassNames(classNames, style, code) { var index = 0; return classNames.reduce(function (acc, className) { if (style.indexOf(className) > -1) { // eslint-disable-next-line return acc.replace(new RegExp(className, 'g'), 'c' + index++); } return acc.replace(new RegExp('(className="[^"]*?)' + className + '\\s?([^"]*")', 'g'), '$1$2'); }, '' + style + (style ? '\n\n' : '') + code); }; var styleSheetSerializer = { test: function test(val) { return val && !val.withStyle && val.$$typeof === Symbol['for']('react.test.json'); }, print: function print(val, _print) { // eslint-disable-next-line val.withStyle = true; var classNames = (0, _getClassNames2['default'])(val); var style = getStyle(classNames); var code = _print(val); return classNames.length ? replaceClassNames(classNames, style, code) : code; } }; exports['default'] = styleSheetSerializer;