styled-components-test-utils
Version:
Test utils for styled-components compatible with jest, expect, chai and jasmine
89 lines (67 loc) • 2.57 kB
JavaScript
;
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;