@atom-learning/jest-stitches
Version:
Jest utilities for @stitches/react
1 lines • 24.3 kB
Source Map (JSON)
{"version":3,"file":"index.dev.mjs","sources":["../../src/index.js"],"sourcesContent":["/**\n * A style serializer for Stiches. Hopefully we can replace this with\n * an official one in the future.\n */\nimport * as css from 'css'\nimport chalk from 'chalk'\n\n//\n// Utils\nconst flatMap = (arr, iteratee) => [].concat(...arr.map(iteratee))\n\nexport const RULE_TYPES = {\n media: 'media',\n rule: 'rule',\n}\n\nconst getClassNames = (selectors, classes) => {\n return classes ? selectors.concat(classes.split(' ')) : selectors\n}\n\nconst getClassNamesFromTestRenderer = (selectors, {props}) =>\n getClassNames(\n selectors,\n props ? (props.className || props.class || '').toString() : null\n )\n\nconst shouldDive = (node) =>\n typeof node.dive === 'function' && typeof node.type() !== 'string'\n\nconst isTagWithClassName = (node) =>\n node.prop('className') && typeof node.type() === 'string'\n\nconst getClassNamesFromEnzyme = (selectors, node) => {\n // We need to dive if we have selected a styled child from a shallow render\n const actualComponent = shouldDive(node) ? node.dive() : node\n // Find the first node with a className prop\n const components = actualComponent.findWhere(isTagWithClassName)\n const classes =\n components.length && components.first().prop('className')\n ? components.first().prop('className').toString()\n : components.first().prop('className')\n\n return getClassNames(selectors, classes)\n}\n\nconst getClassNamesFromCheerio = (selectors, node) => {\n const classes = node.attr('class')\n return getClassNames(selectors, classes)\n}\n\nconst getClassNamesFromDOMElement = (selectors, node) =>\n getClassNames(selectors, node.getAttribute('class'))\n\nexport const isReactElement = (val) => {\n if (val.$$typeof === Symbol.for('react.test.json')) {\n return true\n } else if (\n val.hasOwnProperty('props') &&\n val.hasOwnProperty('type') &&\n val.hasOwnProperty('ref') &&\n val.hasOwnProperty('key')\n ) {\n // Preact X\n try {\n val.$$typeof = Symbol.for('react.test.json')\n // eslint-disable-next-line no-empty\n } catch (err) {}\n return true\n }\n}\n\nconst domElementPattern = /^((HTML|SVG)\\w*)?Element$/\n\nexport const isDOMElement = (val) =>\n val.nodeType === 1 &&\n val.constructor &&\n val.constructor.name &&\n domElementPattern.test(val.constructor.name)\n\nconst isEnzymeElement = (val) => typeof val.findWhere === 'function'\nconst isCheerioElement = (val) => val.cheerio === '[cheerio object]'\n\nexport const getClassNamesFromNodes = (nodes) =>\n nodes.reduce((selectors, node) => {\n if (isReactElement(node)) {\n return getClassNamesFromTestRenderer(selectors, node)\n } else if (isEnzymeElement(node)) {\n return getClassNamesFromEnzyme(selectors, node)\n } else if (isCheerioElement(node)) {\n return getClassNamesFromCheerio(selectors, node)\n }\n\n return getClassNamesFromDOMElement(selectors, node)\n }, [])\n\nlet keyframesPattern = /^@keyframes\\s+(animation-[^{\\s]+)+/\n\nlet removeCommentPattern = /\\/\\*[\\s\\S]*?\\*\\//g\n\nconst getElementRules = (element) => {\n const nonSpeedyRule = element.textContent\n if (nonSpeedyRule) {\n return [nonSpeedyRule]\n }\n if (!element.sheet) {\n return []\n }\n // $FlowFixMe - flow doesn't know about `cssRules` property\n return [].slice.call(element.sheet.cssRules).map((cssRule) => cssRule.cssText)\n}\n\nexport const getStylesFromClassNames = (classNames, elements) => {\n if (!classNames.length) {\n return ''\n }\n\n let selectorPattern = new RegExp('\\\\.(' + classNames.join('|') + ')')\n let keyframes = {}\n let styles = ''\n\n flatMap(elements, getElementRules).forEach((rule) => {\n if (selectorPattern.test(rule)) {\n styles += rule\n }\n let match = rule.match(keyframesPattern)\n if (match !== null) {\n let name = match[1]\n if (keyframes[name] === undefined) {\n keyframes[name] = ''\n }\n keyframes[name] += rule\n }\n })\n let keyframeNameKeys = Object.keys(keyframes)\n let keyframesStyles = ''\n\n if (keyframeNameKeys.length) {\n let keyframesNamePattern = new RegExp(keyframeNameKeys.join('|'), 'g')\n let keyframesNameCache = {}\n let index = 0\n\n styles = styles.replace(keyframesNamePattern, (name) => {\n if (keyframesNameCache[name] === undefined) {\n keyframesNameCache[name] = `animation-${index++}`\n keyframesStyles += keyframes[name]\n }\n return keyframesNameCache[name]\n })\n\n keyframesStyles = keyframesStyles.replace(keyframesNamePattern, (value) => {\n return keyframesNameCache[value]\n })\n }\n\n return (keyframesStyles + styles).replace(removeCommentPattern, '')\n}\n\nexport const getStyleElements = () =>\n Array.from(document.querySelectorAll('style'))\n\nlet unique = (arr) => Array.from(new Set(arr))\n\nexport const getKeys = (elements) => unique(elements.filter(Boolean))\n\nexport const hasClassNames = (classNames, selectors, target) =>\n selectors.some((selector) => {\n // if no target, use className of the specific css rule and try to find it\n // in the list of received node classNames to make sure this css rule\n // applied for root element\n if (!target) {\n return classNames.includes(selector.slice(1))\n }\n\n // check if selector (className) of specific css rule match target\n return target instanceof RegExp\n ? target.test(selector)\n : minify(selector).includes(minify(target))\n })\n\nexport const getMediaRules = (rules, media) =>\n rules\n .filter((rule) => {\n const isMediaMatch = rule.media\n ? rule.media.replace(/\\s/g, '').includes(media.replace(/\\s/g, ''))\n : false\n return rule.type === RULE_TYPES.media && isMediaMatch\n })\n .reduce((mediaRules, mediaRule) => mediaRules.concat(mediaRule.rules), [])\n\n//\n// Matchers\n/*\n * Taken from\n * https://github.com/facebook/jest/blob/be4bec387d90ac8d6a7596be88bf8e4994bc3ed9/packages/expect/src/jasmine_utils.js#L234\n */\nconst isA = (typeName, value) =>\n Object.prototype.toString.apply(value) === `[object ${typeName}]`\n\n/*\n * Taken from\n * https://github.com/facebook/jest/blob/be4bec387d90ac8d6a7596be88bf8e4994bc3ed9/packages/expect/src/jasmine_utils.js#L36\n */\nconst isAsymmetric = (obj) => obj && isA('Function', obj.asymmetricMatch)\n\nconst valueMatches = (declaration, value) => {\n if (value instanceof RegExp) {\n return value.test(declaration.value)\n }\n\n if (isAsymmetric(value)) {\n return value.asymmetricMatch(declaration.value)\n }\n\n return minify(value) === minify(declaration.value)\n}\n\nconst minLeft = /([:;,([{}>~/\\s]|\\/\\*)\\s+/g\nconst minRight = /\\s+([:;,)\\]{}>~/!]|\\*\\/)/g\nconst minify = (s) => s.trim().replace(minLeft, '$1').replace(minRight, '$1')\n\nconst toHaveStyleRule = (received, property, value, options = {}) => {\n const {target, media} = options\n const classNames = getClassNamesFromNodes([received])\n const cssString = getStylesFromClassNames(classNames, getStyleElements())\n const styles = css.parse(cssString)\n let preparedRules = styles.stylesheet.rules\n if (media) {\n preparedRules = getMediaRules(preparedRules, media)\n }\n\n const declaration = preparedRules\n .filter(\n (rule) =>\n rule.type === RULE_TYPES.rule &&\n hasClassNames(classNames, rule.selectors, target)\n )\n .reduce((decs, rule) => decs.concat(rule.declarations), [])\n .filter(\n (dec) =>\n dec.type === 'declaration' && minify(dec.property) === minify(property)\n )\n .pop()\n\n if (!declaration) {\n return {\n pass: false,\n message: () => `Property not found: ${property}`,\n }\n }\n\n const pass = valueMatches(declaration, value)\n\n const message = () =>\n `Expected ${property}${pass ? ' not ' : ' '}to match:\\n` +\n ` ${chalk.green(value)}\\n` +\n 'Received:\\n' +\n ` ${chalk.red(declaration.value)}`\n\n return {\n pass,\n message,\n }\n}\n\nexport const matchers = {toHaveStyleRule}\n\n//\n// Pretty serialization\nconst componentSelectorClassNamePattern = /^e[a-zA-Z0-9]+[0-9]+$/\nexport const replaceClassNames = (classNames, styles, code) => {\n return classNames.reduce((acc, className) => {\n if (componentSelectorClassNamePattern.test(className)) {\n return acc\n }\n return acc\n }, `${styles}${styles ? '\\n\\n' : ''}${code}`)\n}\n\nconst getNodes = (node, nodes = []) => {\n if (Array.isArray(node)) {\n for (let child of node) {\n getNodes(child, nodes)\n }\n return nodes\n }\n\n let children = node.children || (node.props && node.props.children)\n\n if (children) {\n // fix for Preact X\n children = node.props\n ? Array.isArray(children)\n ? children\n : [children]\n : children\n\n for (let child of children) {\n getNodes(child, nodes)\n }\n }\n\n if (typeof node === 'object') {\n nodes.push(node)\n }\n\n return nodes\n}\n\nconst getPrettyStylesFromClassNames = (classNames, elements) => {\n let styles = getStylesFromClassNames(classNames, elements)\n\n let prettyStyles\n\n const parsedStyles = css.parse(styles)\n\n // ensure document level root custom properties are removed\n parsedStyles.stylesheet.rules = parsedStyles.stylesheet.rules\n .map((rule) => {\n if (rule.type === 'keyframes') {\n let tempRule = null\n parsedStyles.stylesheet.rules.some((otherRule) =>\n otherRule.declarations?.some((declaration) => {\n if (\n (declaration.property === 'animation-name' ||\n declaration.property === 'animation') &&\n declaration.value === rule.name\n ) {\n tempRule = rule\n }\n })\n )\n return tempRule\n }\n if (rule.selectors?.includes(':root')) {\n return null\n }\n return rule\n })\n .filter(Boolean)\n\n try {\n prettyStyles = css.stringify(parsedStyles)\n } catch (e) {\n console.error(e)\n throw new Error(`There was an error parsing the following css: \"${styles}\"`)\n }\n\n return prettyStyles\n}\n\nexport const createSerializer = (opt = {}) => {\n let {DOMElements = true} = opt\n let cache = new WeakSet()\n\n return {\n test(val) {\n return (\n val &&\n !cache.has(val) &&\n (isReactElement(val) || (DOMElements && isDOMElement(val)))\n )\n },\n\n print(val, printer) {\n const nodes = getNodes(val)\n const classNames = getClassNamesFromNodes(nodes)\n let elements = getStyleElements()\n const styles = getPrettyStylesFromClassNames(classNames, elements)\n nodes.forEach(cache.add, cache)\n const printedVal = printer(val)\n nodes.forEach(cache.delete, cache)\n let keys = getKeys(elements)\n return replaceClassNames(classNames, styles, printedVal, keys)\n },\n }\n}\n\nexport const {print, test} = createSerializer()\nexport default {print, test}\n"],"names":["flatMap","arr","iteratee","concat","map","RULE_TYPES","media","rule","getClassNames","selectors","classes","split","getClassNamesFromTestRenderer","props","className","class","toString","shouldDive","node","dive","type","isTagWithClassName","prop","getClassNamesFromEnzyme","actualComponent","components","findWhere","length","first","getClassNamesFromCheerio","attr","getClassNamesFromDOMElement","getAttribute","isReactElement","val","$$typeof","Symbol","for","hasOwnProperty","err","domElementPattern","isDOMElement","nodeType","constructor","name","test","isEnzymeElement","isCheerioElement","cheerio","getClassNamesFromNodes","nodes","reduce","keyframesPattern","removeCommentPattern","cssRule","cssText","getElementRules","element","nonSpeedyRule","textContent","sheet","slice","call","cssRules","getStylesFromClassNames","classNames","elements","selectorPattern","RegExp","join","keyframes","styles","forEach","match","undefined","keyframeNameKeys","Object","keys","keyframesStyles","keyframesNamePattern","keyframesNameCache","index","replace","value","getStyleElements","Array","from","document","querySelectorAll","unique","Set","getKeys","filter","Boolean","hasClassNames","target","some","selector","includes","minify","mediaRules","mediaRule","rules","getMediaRules","isMediaMatch","isA","typeName","prototype","apply","isAsymmetric","obj","asymmetricMatch","valueMatches","declaration","minLeft","minRight","s","trim","decs","declarations","toHaveStyleRule","received","property","options","cssString","css","preparedRules","stylesheet","dec","pop","pass","message","chalk","green","red","matchers","componentSelectorClassNamePattern","acc","replaceClassNames","code","getNodes","isArray","child","children","push","getPrettyStylesFromClassNames","prettyStyles","parsedStyles","tempRule","otherRule","e","console","error","Error","createSerializer","opt","DOMElements","cache","WeakSet","has","print","printer","add","printedVal","delete"],"mappings":"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"}