jest-emotion
Advanced tools
Comparing version 10.0.10 to 10.0.11
'use strict'; | ||
Object.defineProperty(exports, '__esModule', { value: true }); | ||
Object.defineProperty(exports, '__esModule', { | ||
value: true | ||
}); | ||
function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; } | ||
function _interopDefault(ex) { | ||
return ex && typeof ex === 'object' && 'default' in ex ? ex['default'] : ex; | ||
} | ||
var chalk = _interopDefault(require('chalk')); | ||
var css = require('css'); | ||
var _objectAssign = _interopDefault(require('object-assign')); | ||
var _extends = _interopDefault(require('@babel/runtime/helpers/extends')); | ||
function _objectWithoutPropertiesLoose(source, excluded) { | ||
if (source == null) return {}; | ||
var target = {}; | ||
var sourceKeys = Object.keys(source); | ||
var key, i; | ||
var _objectWithoutPropertiesLoose = _interopDefault(require('@babel/runtime/helpers/objectWithoutPropertiesLoose')); | ||
for (i = 0; i < sourceKeys.length; i++) { | ||
key = sourceKeys[i]; | ||
if (excluded.indexOf(key) >= 0) continue; | ||
target[key] = source[key]; | ||
} | ||
var css = require('css'); | ||
return target; | ||
} | ||
var chalk = _interopDefault(require('chalk')); | ||
@@ -31,2 +24,3 @@ function defaultClassNameReplacer(className, index) { | ||
var componentSelectorClassNamePattern = /^e[a-zA-Z0-9]+[0-9]+$/; | ||
var replaceClassNames = function replaceClassNames(classNames, styles, code, keys, classNameReplacer) { | ||
@@ -93,9 +87,13 @@ if (classNameReplacer === void 0) { | ||
} | ||
function isEmotionCssPropElementType(val) { | ||
return val.$$typeof === Symbol.for('react.element') && val.type.$$typeof === Symbol.for('react.forward_ref') && val.type.displayName === 'EmotionCssPropInternal'; | ||
} | ||
function isEmotionCssPropEnzymeElement(val) { | ||
return val.$$typeof === Symbol.for('react.test.json') && val.type === 'EmotionCssPropInternal'; | ||
} | ||
var domElementPattern = /^((HTML|SVG)\w*)?Element$/; | ||
function isDOMElement(val) { | ||
@@ -126,4 +124,6 @@ return val.nodeType === 1 && val.constructor && val.constructor.name && domElementPattern.test(val.constructor.name); | ||
} | ||
var keyframesPattern = /^@keyframes\s+(animation-[^{\s]+)+/; | ||
var removeCommentPattern = /\/\*[\s\S]*?\*\//g; | ||
function getStylesFromClassNames(classNames, elements) { | ||
@@ -193,2 +193,3 @@ if (!classNames.length) { | ||
} | ||
function getStyleElements() { | ||
@@ -212,2 +213,3 @@ var elements = Array.from(document.querySelectorAll('style[data-emotion]')); // $FlowFixMe | ||
} | ||
function hasClassNames(classNames, selectors, target) { | ||
@@ -224,5 +226,6 @@ // selectors is the classNames of specific css rule | ||
return selector.includes(target); | ||
return target instanceof RegExp ? target.test(selector) : selector.includes(target); | ||
}); | ||
} | ||
function getMediaRules(rules, media) { | ||
@@ -236,3 +239,2 @@ return rules.filter(function (rule) { | ||
} | ||
/* | ||
@@ -243,2 +245,3 @@ * Taken from | ||
function isA(typeName, value) { | ||
@@ -369,3 +372,3 @@ return Object.prototype.toString.apply(value) === "[object " + typeName + "]"; | ||
var _props = props, | ||
css$$1 = _props.css, | ||
css = _props.css, | ||
__EMOTION_TYPE_PLEASE_DO_NOT_USE__ = _props.__EMOTION_TYPE_PLEASE_DO_NOT_USE__, | ||
@@ -393,3 +396,3 @@ __EMOTION_LABEL_PLEASE_DO_NOT_USE__ = _props.__EMOTION_LABEL_PLEASE_DO_NOT_USE__, | ||
if (isEmotionCssPropElementType(val)) { | ||
return printer(_objectAssign({}, val, { | ||
return printer(_extends({}, val, { | ||
props: filterEmotionProps(val.props), | ||
@@ -424,2 +427,3 @@ type: val.props.__EMOTION_TYPE_PLEASE_DO_NOT_USE__ | ||
test = _createSerializer.test; | ||
var index = { | ||
@@ -429,7 +433,6 @@ print: print, | ||
}; | ||
exports.createSerializer = createSerializer; | ||
exports.default = index; | ||
exports.matchers = matchers; | ||
exports.print = print; | ||
exports.test = test; | ||
exports.default = index; | ||
exports.matchers = matchers; |
'use strict'; | ||
Object.defineProperty(exports, '__esModule', { value: true }); | ||
Object.defineProperty(exports, '__esModule', { | ||
value: true | ||
}); | ||
function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; } | ||
function _interopDefault(ex) { | ||
return ex && typeof ex === 'object' && 'default' in ex ? ex['default'] : ex; | ||
} | ||
var chalk = _interopDefault(require('chalk')); | ||
var css = require('css'); | ||
var _objectAssign = _interopDefault(require('object-assign')); | ||
var _extends = _interopDefault(require('@babel/runtime/helpers/extends')); | ||
function _objectWithoutPropertiesLoose(source, excluded) { | ||
if (source == null) return {}; | ||
var target = {}; | ||
var sourceKeys = Object.keys(source); | ||
var key, i; | ||
var _objectWithoutPropertiesLoose = _interopDefault(require('@babel/runtime/helpers/objectWithoutPropertiesLoose')); | ||
for (i = 0; i < sourceKeys.length; i++) { | ||
key = sourceKeys[i]; | ||
if (excluded.indexOf(key) >= 0) continue; | ||
target[key] = source[key]; | ||
} | ||
var css = require('css'); | ||
return target; | ||
} | ||
var chalk = _interopDefault(require('chalk')); | ||
@@ -31,2 +24,3 @@ function defaultClassNameReplacer(className, index) { | ||
var componentSelectorClassNamePattern = /^e[a-zA-Z0-9]+[0-9]+$/; | ||
var replaceClassNames = function replaceClassNames(classNames, styles, code, keys, classNameReplacer) { | ||
@@ -93,9 +87,13 @@ if (classNameReplacer === void 0) { | ||
} | ||
function isEmotionCssPropElementType(val) { | ||
return val.$$typeof === Symbol.for('react.element') && val.type.$$typeof === Symbol.for('react.forward_ref') && val.type.displayName === 'EmotionCssPropInternal'; | ||
} | ||
function isEmotionCssPropEnzymeElement(val) { | ||
return val.$$typeof === Symbol.for('react.test.json') && val.type === 'EmotionCssPropInternal'; | ||
} | ||
var domElementPattern = /^((HTML|SVG)\w*)?Element$/; | ||
function isDOMElement(val) { | ||
@@ -126,4 +124,6 @@ return val.nodeType === 1 && val.constructor && val.constructor.name && domElementPattern.test(val.constructor.name); | ||
} | ||
var keyframesPattern = /^@keyframes\s+(animation-[^{\s]+)+/; | ||
var removeCommentPattern = /\/\*[\s\S]*?\*\//g; | ||
function getStylesFromClassNames(classNames, elements) { | ||
@@ -193,2 +193,3 @@ if (!classNames.length) { | ||
} | ||
function getStyleElements() { | ||
@@ -212,2 +213,3 @@ var elements = Array.from(document.querySelectorAll('style[data-emotion]')); // $FlowFixMe | ||
} | ||
function hasClassNames(classNames, selectors, target) { | ||
@@ -224,5 +226,6 @@ // selectors is the classNames of specific css rule | ||
return selector.includes(target); | ||
return target instanceof RegExp ? target.test(selector) : selector.includes(target); | ||
}); | ||
} | ||
function getMediaRules(rules, media) { | ||
@@ -236,3 +239,2 @@ return rules.filter(function (rule) { | ||
} | ||
/* | ||
@@ -243,2 +245,3 @@ * Taken from | ||
function isA(typeName, value) { | ||
@@ -369,3 +372,3 @@ return Object.prototype.toString.apply(value) === "[object " + typeName + "]"; | ||
var _props = props, | ||
css$$1 = _props.css, | ||
css = _props.css, | ||
__EMOTION_TYPE_PLEASE_DO_NOT_USE__ = _props.__EMOTION_TYPE_PLEASE_DO_NOT_USE__, | ||
@@ -393,3 +396,3 @@ __EMOTION_LABEL_PLEASE_DO_NOT_USE__ = _props.__EMOTION_LABEL_PLEASE_DO_NOT_USE__, | ||
if (isEmotionCssPropElementType(val)) { | ||
return printer(_objectAssign({}, val, { | ||
return printer(_extends({}, val, { | ||
props: filterEmotionProps(val.props), | ||
@@ -424,2 +427,3 @@ type: val.props.__EMOTION_TYPE_PLEASE_DO_NOT_USE__ | ||
test = _createSerializer.test; | ||
var index = { | ||
@@ -429,7 +433,6 @@ print: print, | ||
}; | ||
exports.createSerializer = createSerializer; | ||
exports.default = index; | ||
exports.matchers = matchers; | ||
exports.print = print; | ||
exports.test = test; | ||
exports.default = index; | ||
exports.matchers = matchers; |
"use strict"; | ||
function _interopDefault(ex) { | ||
return ex && "object" == typeof ex && "default" in ex ? ex.default : ex; | ||
} | ||
Object.defineProperty(exports, "__esModule", { value: !0 }); | ||
var chalk = _interopDefault(require("chalk")), | ||
css = require("css"), | ||
_objectAssign = _interopDefault(require("object-assign")); | ||
function _objectWithoutPropertiesLoose(source, excluded) { | ||
if (null == source) return {}; | ||
var key, | ||
i, | ||
target = {}, | ||
sourceKeys = Object.keys(source); | ||
for (i = 0; i < sourceKeys.length; i++) | ||
(key = sourceKeys[i]), | ||
0 <= excluded.indexOf(key) || (target[key] = source[key]); | ||
return target; | ||
} | ||
Object.defineProperty(exports, "__esModule", { | ||
value: !0 | ||
}); | ||
var _extends = _interopDefault(require("@babel/runtime/helpers/extends")), _objectWithoutPropertiesLoose = _interopDefault(require("@babel/runtime/helpers/objectWithoutPropertiesLoose")), css = require("css"), chalk = _interopDefault(require("chalk")); | ||
function defaultClassNameReplacer(className, index) { | ||
return "emotion-" + index; | ||
} | ||
var componentSelectorClassNamePattern = /^e[a-zA-Z0-9]+[0-9]+$/, | ||
replaceClassNames = function( | ||
classNames, | ||
styles, | ||
code, | ||
keys, | ||
classNameReplacer | ||
) { | ||
void 0 === classNameReplacer && | ||
(classNameReplacer = defaultClassNameReplacer); | ||
var index = 0, | ||
keyPattern = new RegExp("^(" + keys.join("|") + ")-"); | ||
return classNames.reduce(function(acc, className) { | ||
if ( | ||
keyPattern.test(className) || | ||
componentSelectorClassNamePattern.test(className) | ||
) { | ||
var escapedRegex = new RegExp( | ||
className.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"), | ||
"g" | ||
); | ||
return acc.replace(escapedRegex, classNameReplacer(className, index++)); | ||
} | ||
return acc; | ||
}, styles + (styles ? "\n\n" : "") + code); | ||
}, | ||
RULE_TYPES = { media: "media", rule: "rule" }; | ||
var componentSelectorClassNamePattern = /^e[a-zA-Z0-9]+[0-9]+$/, replaceClassNames = function(classNames, styles, code, keys, classNameReplacer) { | ||
void 0 === classNameReplacer && (classNameReplacer = defaultClassNameReplacer); | ||
var index = 0, keyPattern = new RegExp("^(" + keys.join("|") + ")-"); | ||
return classNames.reduce(function(acc, className) { | ||
if (keyPattern.test(className) || componentSelectorClassNamePattern.test(className)) { | ||
var escapedRegex = new RegExp(className.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"), "g"); | ||
return acc.replace(escapedRegex, classNameReplacer(className, index++)); | ||
} | ||
return acc; | ||
}, styles + (styles ? "\n\n" : "") + code); | ||
}, RULE_TYPES = { | ||
media: "media", | ||
rule: "rule" | ||
}; | ||
function getClassNames(selectors, classes) { | ||
return classes ? selectors.concat(classes.split(" ")) : selectors; | ||
} | ||
function getClassNamesFromTestRenderer(selectors, _ref) { | ||
var _ref$props = _ref.props, | ||
props = void 0 === _ref$props ? {} : _ref$props; | ||
var _ref$props = _ref.props, props = void 0 === _ref$props ? {} : _ref$props; | ||
return getClassNames(selectors, props.className || props.class); | ||
} | ||
function shouldDive(node) { | ||
return "function" == typeof node.dive && "string" != typeof node.type(); | ||
} | ||
function isTagWithClassName(node) { | ||
return node.prop("className") && "string" == typeof node.type(); | ||
} | ||
function getClassNamesFromEnzyme(selectors, node) { | ||
var components = (shouldDive(node) ? node.dive() : node).findWhere( | ||
isTagWithClassName | ||
); | ||
return getClassNames( | ||
selectors, | ||
components.length && components.first().prop("className") | ||
); | ||
var components = (shouldDive(node) ? node.dive() : node).findWhere(isTagWithClassName); | ||
return getClassNames(selectors, components.length && components.first().prop("className")); | ||
} | ||
function getClassNamesFromCheerio(selectors, node) { | ||
return getClassNames(selectors, node.attr("class")); | ||
} | ||
function getClassNamesFromDOMElement(selectors, node) { | ||
return getClassNames(selectors, node.getAttribute("class")); | ||
} | ||
function isReactElement(val) { | ||
return val.$$typeof === Symbol.for("react.test.json"); | ||
} | ||
function isEmotionCssPropElementType(val) { | ||
return ( | ||
val.$$typeof === Symbol.for("react.element") && | ||
val.type.$$typeof === Symbol.for("react.forward_ref") && | ||
"EmotionCssPropInternal" === val.type.displayName | ||
); | ||
return val.$$typeof === Symbol.for("react.element") && val.type.$$typeof === Symbol.for("react.forward_ref") && "EmotionCssPropInternal" === val.type.displayName; | ||
} | ||
function isEmotionCssPropEnzymeElement(val) { | ||
return ( | ||
val.$$typeof === Symbol.for("react.test.json") && | ||
"EmotionCssPropInternal" === val.type | ||
); | ||
return val.$$typeof === Symbol.for("react.test.json") && "EmotionCssPropInternal" === val.type; | ||
} | ||
var domElementPattern = /^((HTML|SVG)\w*)?Element$/; | ||
function isDOMElement(val) { | ||
return ( | ||
1 === val.nodeType && | ||
val.constructor && | ||
val.constructor.name && | ||
domElementPattern.test(val.constructor.name) | ||
); | ||
return 1 === val.nodeType && val.constructor && val.constructor.name && domElementPattern.test(val.constructor.name); | ||
} | ||
function isEnzymeElement(val) { | ||
return "function" == typeof val.findWhere; | ||
} | ||
function isCheerioElement(val) { | ||
return "[cheerio object]" === val.cheerio; | ||
} | ||
function getClassNamesFromNodes(nodes) { | ||
return nodes.reduce(function(selectors, node) { | ||
return isReactElement(node) | ||
? getClassNamesFromTestRenderer(selectors, node) | ||
: isEnzymeElement(node) | ||
? getClassNamesFromEnzyme(selectors, node) | ||
: isCheerioElement(node) | ||
? getClassNamesFromCheerio(selectors, node) | ||
: getClassNamesFromDOMElement(selectors, node); | ||
return isReactElement(node) ? getClassNamesFromTestRenderer(selectors, node) : isEnzymeElement(node) ? getClassNamesFromEnzyme(selectors, node) : isCheerioElement(node) ? getClassNamesFromCheerio(selectors, node) : getClassNamesFromDOMElement(selectors, node); | ||
}, []); | ||
} | ||
var keyframesPattern = /^@keyframes\s+(animation-[^{\s]+)+/, | ||
removeCommentPattern = /\/\*[\s\S]*?\*\//g; | ||
var keyframesPattern = /^@keyframes\s+(animation-[^{\s]+)+/, removeCommentPattern = /\/\*[\s\S]*?\*\//g; | ||
function getStylesFromClassNames(classNames, elements) { | ||
@@ -127,10 +100,7 @@ if (!classNames.length) return ""; | ||
if (!keys.length) return ""; | ||
var keyPatten = new RegExp("^(" + keys.join("|") + ")-"), | ||
filteredClassNames = classNames.filter(function(className) { | ||
return keyPatten.test(className); | ||
}); | ||
var keyPatten = new RegExp("^(" + keys.join("|") + ")-"), filteredClassNames = classNames.filter(function(className) { | ||
return keyPatten.test(className); | ||
}); | ||
if (!filteredClassNames.length) return ""; | ||
var selectorPattern = new RegExp("\\.(" + filteredClassNames.join("|") + ")"), | ||
keyframes = {}, | ||
styles = ""; | ||
var selectorPattern = new RegExp("\\.(" + filteredClassNames.join("|") + ")"), keyframes = {}, styles = ""; | ||
elements.forEach(function(element) { | ||
@@ -142,103 +112,76 @@ var rule = element.textContent || ""; | ||
var name = match[1]; | ||
void 0 === keyframes[name] && (keyframes[name] = ""), | ||
(keyframes[name] += rule); | ||
void 0 === keyframes[name] && (keyframes[name] = ""), keyframes[name] += rule; | ||
} | ||
}); | ||
var keyframeNameKeys = Object.keys(keyframes), | ||
keyframesStyles = ""; | ||
var keyframeNameKeys = Object.keys(keyframes), keyframesStyles = ""; | ||
if (keyframeNameKeys.length) { | ||
var keyframesNamePattern = new RegExp(keyframeNameKeys.join("|"), "g"), | ||
keyframesNameCache = {}, | ||
index = 0; | ||
(styles = styles.replace(keyframesNamePattern, function(name) { | ||
return ( | ||
void 0 === keyframesNameCache[name] && | ||
((keyframesNameCache[name] = "animation-" + index++), | ||
(keyframesStyles += keyframes[name])), | ||
keyframesNameCache[name] | ||
); | ||
})), | ||
(keyframesStyles = keyframesStyles.replace(keyframesNamePattern, function( | ||
value | ||
) { | ||
return keyframesNameCache[value]; | ||
})); | ||
var keyframesNamePattern = new RegExp(keyframeNameKeys.join("|"), "g"), keyframesNameCache = {}, index = 0; | ||
styles = styles.replace(keyframesNamePattern, function(name) { | ||
return void 0 === keyframesNameCache[name] && (keyframesNameCache[name] = "animation-" + index++, | ||
keyframesStyles += keyframes[name]), keyframesNameCache[name]; | ||
}), keyframesStyles = keyframesStyles.replace(keyframesNamePattern, function(value) { | ||
return keyframesNameCache[value]; | ||
}); | ||
} | ||
return (keyframesStyles + styles).replace(removeCommentPattern, ""); | ||
} | ||
function getStyleElements() { | ||
return Array.from(document.querySelectorAll("style[data-emotion]")); | ||
} | ||
var unique = function(arr) { | ||
return Array.from(new Set(arr)); | ||
}; | ||
function getKeys(elements) { | ||
return unique( | ||
elements.map(function(element) { | ||
return element.getAttribute("data-emotion"); | ||
}) | ||
).filter(Boolean); | ||
return unique(elements.map(function(element) { | ||
return element.getAttribute("data-emotion"); | ||
})).filter(Boolean); | ||
} | ||
function hasClassNames(classNames, selectors, target) { | ||
return selectors.some(function(selector) { | ||
return target | ||
? selector.includes(target) | ||
: classNames.includes(selector.slice(1)); | ||
return target ? target instanceof RegExp ? target.test(selector) : selector.includes(target) : classNames.includes(selector.slice(1)); | ||
}); | ||
} | ||
function getMediaRules(rules, media) { | ||
return rules | ||
.filter(function(rule) { | ||
var isMediaMatch = | ||
!!rule.media && | ||
rule.media.replace(/\s/g, "").includes(media.replace(/\s/g, "")); | ||
return rule.type === RULE_TYPES.media && isMediaMatch; | ||
}) | ||
.reduce(function(mediaRules, mediaRule) { | ||
return mediaRules.concat(mediaRule.rules); | ||
}, []); | ||
return rules.filter(function(rule) { | ||
var isMediaMatch = !!rule.media && rule.media.replace(/\s/g, "").includes(media.replace(/\s/g, "")); | ||
return rule.type === RULE_TYPES.media && isMediaMatch; | ||
}).reduce(function(mediaRules, mediaRule) { | ||
return mediaRules.concat(mediaRule.rules); | ||
}, []); | ||
} | ||
function isA(typeName, value) { | ||
return Object.prototype.toString.apply(value) === "[object " + typeName + "]"; | ||
} | ||
function isAsymmetric(obj) { | ||
return obj && isA("Function", obj.asymmetricMatch); | ||
} | ||
function valueMatches(declaration, value) { | ||
return value instanceof RegExp | ||
? value.test(declaration.value) | ||
: isAsymmetric(value) | ||
? value.asymmetricMatch(declaration.value) | ||
: value === declaration.value; | ||
return value instanceof RegExp ? value.test(declaration.value) : isAsymmetric(value) ? value.asymmetricMatch(declaration.value) : value === declaration.value; | ||
} | ||
function toHaveStyleRule(received, property, value, options) { | ||
void 0 === options && (options = {}); | ||
var _options = options, | ||
target = _options.target, | ||
media = _options.media, | ||
classNames = getClassNamesFromNodes([received]), | ||
cssString = getStylesFromClassNames(classNames, getStyleElements()), | ||
preparedRules = css.parse(cssString).stylesheet.rules; | ||
var _options = options, target = _options.target, media = _options.media, classNames = getClassNamesFromNodes([ received ]), cssString = getStylesFromClassNames(classNames, getStyleElements()), preparedRules = css.parse(cssString).stylesheet.rules; | ||
media && (preparedRules = getMediaRules(preparedRules, media)); | ||
var declaration = preparedRules | ||
.filter(function(rule) { | ||
return ( | ||
rule.type === RULE_TYPES.rule && | ||
hasClassNames(classNames, rule.selectors, target) | ||
); | ||
}) | ||
.reduce(function(decs, rule) { | ||
return decs.concat(rule.declarations); | ||
}, []) | ||
.filter(function(dec) { | ||
return "declaration" === dec.type && dec.property === property; | ||
}) | ||
.pop(); | ||
if (!declaration) | ||
return { | ||
pass: !1, | ||
message: function() { | ||
return "Property not found: " + property; | ||
} | ||
}; | ||
var declaration = preparedRules.filter(function(rule) { | ||
return rule.type === RULE_TYPES.rule && hasClassNames(classNames, rule.selectors, target); | ||
}).reduce(function(decs, rule) { | ||
return decs.concat(rule.declarations); | ||
}, []).filter(function(dec) { | ||
return "declaration" === dec.type && dec.property === property; | ||
}).pop(); | ||
if (!declaration) return { | ||
pass: !1, | ||
message: function() { | ||
return "Property not found: " + property; | ||
} | ||
}; | ||
var pass = valueMatches(declaration, value); | ||
@@ -248,21 +191,15 @@ return { | ||
message: function() { | ||
return ( | ||
"Expected " + | ||
property + | ||
(pass ? " not " : " ") + | ||
"to match:\n " + | ||
chalk.green(value) + | ||
"\nReceived:\n " + | ||
chalk.red(declaration.value) | ||
); | ||
return "Expected " + property + (pass ? " not " : " ") + "to match:\n " + chalk.green(value) + "\nReceived:\n " + chalk.red(declaration.value); | ||
} | ||
}; | ||
} | ||
var matchers = { toHaveStyleRule: toHaveStyleRule }; | ||
var matchers = { | ||
toHaveStyleRule: toHaveStyleRule | ||
}; | ||
function getNodes(node, nodes) { | ||
if ((void 0 === nodes && (nodes = []), node.children)) { | ||
var _iterator = node.children, | ||
_isArray = Array.isArray(_iterator), | ||
_i = 0; | ||
for (_iterator = _isArray ? _iterator : _iterator[Symbol.iterator](); ; ) { | ||
if (void 0 === nodes && (nodes = []), node.children) { | ||
var _iterator = node.children, _isArray = Array.isArray(_iterator), _i = 0; | ||
for (_iterator = _isArray ? _iterator : _iterator[Symbol.iterator](); ;) { | ||
var _ref; | ||
@@ -281,58 +218,33 @@ if (_isArray) { | ||
} | ||
function getPrettyStylesFromClassNames(classNames, elements) { | ||
var prettyStyles, | ||
styles = getStylesFromClassNames(classNames, elements); | ||
var prettyStyles, styles = getStylesFromClassNames(classNames, elements); | ||
try { | ||
prettyStyles = css.stringify(css.parse(styles)); | ||
} catch (e) { | ||
throw (console.error(e), | ||
new Error( | ||
'There was an error parsing the following css: "' + styles + '"' | ||
)); | ||
throw console.error(e), new Error('There was an error parsing the following css: "' + styles + '"'); | ||
} | ||
return prettyStyles; | ||
} | ||
function filterEmotionProps(props) { | ||
void 0 === props && (props = {}); | ||
var _props = props, | ||
rest = (_props.css, | ||
_props.__EMOTION_TYPE_PLEASE_DO_NOT_USE__, | ||
_props.__EMOTION_LABEL_PLEASE_DO_NOT_USE__, | ||
_objectWithoutPropertiesLoose(_props, [ | ||
"css", | ||
"__EMOTION_TYPE_PLEASE_DO_NOT_USE__", | ||
"__EMOTION_LABEL_PLEASE_DO_NOT_USE__" | ||
])); | ||
return (rest.css = "unknown styles"), rest; | ||
var _props = props, rest = (_props.css, _props.__EMOTION_TYPE_PLEASE_DO_NOT_USE__, | ||
_props.__EMOTION_LABEL_PLEASE_DO_NOT_USE__, _objectWithoutPropertiesLoose(_props, [ "css", "__EMOTION_TYPE_PLEASE_DO_NOT_USE__", "__EMOTION_LABEL_PLEASE_DO_NOT_USE__" ])); | ||
return rest.css = "unknown styles", rest; | ||
} | ||
function createSerializer(_temp) { | ||
var _ref2 = void 0 === _temp ? {} : _temp, | ||
classNameReplacer = _ref2.classNameReplacer, | ||
_ref2$DOMElements = _ref2.DOMElements, | ||
DOMElements = void 0 === _ref2$DOMElements || _ref2$DOMElements, | ||
cache = new WeakSet(); | ||
var _ref2 = void 0 === _temp ? {} : _temp, classNameReplacer = _ref2.classNameReplacer, _ref2$DOMElements = _ref2.DOMElements, DOMElements = void 0 === _ref2$DOMElements || _ref2$DOMElements, cache = new WeakSet(); | ||
return { | ||
test: function(val) { | ||
return ( | ||
val && | ||
((!cache.has(val) && | ||
(isReactElement(val) || (DOMElements && isDOMElement(val)))) || | ||
isEmotionCssPropEnzymeElement(val) || | ||
isEmotionCssPropElementType(val)) | ||
); | ||
return val && (!cache.has(val) && (isReactElement(val) || DOMElements && isDOMElement(val)) || isEmotionCssPropEnzymeElement(val) || isEmotionCssPropElementType(val)); | ||
}, | ||
print: function(val, printer) { | ||
if (isEmotionCssPropEnzymeElement(val)) | ||
return val.children.map(printer).join("\n"); | ||
if (isEmotionCssPropElementType(val)) | ||
return printer( | ||
_objectAssign({}, val, { | ||
props: filterEmotionProps(val.props), | ||
type: val.props.__EMOTION_TYPE_PLEASE_DO_NOT_USE__ | ||
}) | ||
); | ||
var nodes = getNodes(val), | ||
classNames = getClassNamesFromNodes(nodes), | ||
elements = getStyleElements(), | ||
styles = getPrettyStylesFromClassNames(classNames, elements); | ||
if (isEmotionCssPropEnzymeElement(val)) return val.children.map(printer).join("\n"); | ||
if (isEmotionCssPropElementType(val)) return printer(_extends({}, val, { | ||
props: filterEmotionProps(val.props), | ||
type: val.props.__EMOTION_TYPE_PLEASE_DO_NOT_USE__ | ||
})); | ||
var nodes = getNodes(val), classNames = getClassNamesFromNodes(nodes), elements = getStyleElements(), styles = getPrettyStylesFromClassNames(classNames, elements); | ||
nodes.forEach(cache.add, cache); | ||
@@ -342,20 +254,13 @@ var printedVal = printer(val); | ||
var keys = getKeys(elements); | ||
return replaceClassNames( | ||
classNames, | ||
styles, | ||
printedVal, | ||
keys, | ||
classNameReplacer | ||
); | ||
return replaceClassNames(classNames, styles, printedVal, keys, classNameReplacer); | ||
} | ||
}; | ||
} | ||
var _createSerializer = createSerializer(), | ||
print = _createSerializer.print, | ||
test = _createSerializer.test, | ||
index = { print: print, test: test }; | ||
(exports.createSerializer = createSerializer), | ||
(exports.print = print), | ||
(exports.test = test), | ||
(exports.default = index), | ||
(exports.matchers = matchers); | ||
var _createSerializer = createSerializer(), print = _createSerializer.print, test = _createSerializer.test, index = { | ||
print: print, | ||
test: test | ||
}; | ||
exports.createSerializer = createSerializer, exports.default = index, exports.matchers = matchers, | ||
exports.print = print, exports.test = test; |
{ | ||
"name": "jest-emotion", | ||
"version": "10.0.10", | ||
"version": "10.0.11", | ||
"description": "Jest utilities for emotion", | ||
@@ -17,6 +17,6 @@ "main": "dist/jest-emotion.cjs.js", | ||
"dependencies": { | ||
"@babel/runtime": "^7.4.3", | ||
"@types/jest": "^23.0.2", | ||
"chalk": "^2.4.1", | ||
"css": "^2.2.1", | ||
"object-assign": "^4.1.1" | ||
"css": "^2.2.1" | ||
}, | ||
@@ -53,2 +53,2 @@ "devDependencies": { | ||
} | ||
} | ||
} |
@@ -97,15 +97,102 @@ # jest-emotion | ||
test('renders with correct styles', () => { | ||
const H1 = styled.h1` | ||
const Svg = styled('svg')` | ||
width: 100%; | ||
` | ||
const Div = styled('div')` | ||
float: left; | ||
height: 80%; | ||
&:hover { | ||
width: 50px; | ||
} | ||
${Svg} { | ||
fill: green; | ||
} | ||
span { | ||
color: yellow; | ||
} | ||
@media screen and (max-width: 1200px) { | ||
font-size: 14px; | ||
} | ||
` | ||
const tree = renderer.create(<H1>hello world</H1>).toJSON() | ||
const tree = renderer | ||
.create( | ||
<Div> | ||
<Svg /> | ||
<span>Test</span> | ||
</Div> | ||
) | ||
.toJSON() | ||
expect(tree).toHaveStyleRule('float', 'left') | ||
expect(tree).not.toHaveStyleRule('color', 'hotpink') | ||
expect(tree).not.toHaveStyleRule('height', '100%') | ||
}) | ||
``` | ||
You can provide additional options for `toHaveStyleRule` matcher. | ||
`target` - helps to specify css selector or other component | ||
where style rule should be found. | ||
```js | ||
expect(tree).toHaveStyleRule('width', '50px', { target: ':hover' }) | ||
``` | ||
```js | ||
expect(tree).toHaveStyleRule('color', 'yellow', { target: 'span' }) | ||
``` | ||
```js | ||
expect(tree).toHaveStyleRule('fill', 'green', { target: `${Svg}` }) | ||
``` | ||
`media` - specifies the media rule where the matcher | ||
should look for the style property. | ||
```js | ||
expect(tree).toHaveStyleRule('font-size', '14px', { | ||
media: 'screen and (max-width: 1200px)' | ||
}) | ||
``` | ||
Use `media` and `target` options to assert on rules within media queries and to target nested components, pseudo-classes, and pseudo-elements. | ||
```jsx | ||
import React from 'react' | ||
import renderer from 'react-test-renderer' | ||
import { matchers } from 'jest-emotion' | ||
import styled from '@emotion/styled' | ||
// Add the custom matchers provided by 'jest-emotion' | ||
expect.extend(matchers) | ||
test('renders with correct link styles', () => { | ||
const Container = styled.div` | ||
font-size: 14px; | ||
a { | ||
color: yellow; | ||
} | ||
a:hover { | ||
color: black; | ||
} | ||
@media (min-width: 768px) { | ||
font-size: 16px; | ||
} | ||
` | ||
const tree = renderer.create(<Container>hello world</Container>).toJSON() | ||
expect(tree).toHaveStyleRule('color', 'yellow', { target: /a$/ }) | ||
expect(tree).toHaveStyleRule('color', 'black', { target: 'a:hover' }) | ||
expect(tree).toHaveStyleRule('font-size', '16px', { | ||
media: '(min-width: 768px)' | ||
}) | ||
}) | ||
``` | ||
## Thanks | ||
Thanks to [Kent C. Dodds](https://twitter.com/kentcdodds) who wrote [jest-glamor-react](https://github.com/kentcdodds/jest-glamor-react) which this library is largely based on. ❤️ |
@@ -180,3 +180,3 @@ // @flow | ||
selectors: Array<string>, | ||
target: ?string | ||
target?: string | RegExp | ||
): boolean { | ||
@@ -192,3 +192,5 @@ // selectors is the classNames of specific css rule | ||
// check if selector (className) of specific css rule match target | ||
return selector.includes(target) | ||
return target instanceof RegExp | ||
? target.test(selector) | ||
: selector.includes(target) | ||
}) | ||
@@ -195,0 +197,0 @@ } |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
198
55878
1402
+ Added@babel/runtime@^7.4.3
+ Added@babel/runtime@7.25.6(transitive)
+ Addedregenerator-runtime@0.14.1(transitive)
- Removedobject-assign@^4.1.1
- Removedobject-assign@4.1.1(transitive)