@dash-ui/jest
Version:
Jest utilities for dash-ui
1 lines • 18.7 kB
Source Map (JSON)
{"version":3,"file":"index.mjs","sources":["../../src/index.js"],"sourcesContent":["import * 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 supports: 'supports',\n rule: 'rule',\n}\n\nconst getClassNames = (selectors, classes) =>\n classes ? selectors.concat(classes.split(' ')) : selectors\n\nconst getClassNamesFromTestRenderer = (selectors, {props}) =>\n getClassNames(selectors, props ? props.className || props.class : null)\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 = components.length && 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 val.$$typeof = Symbol.for('react.test.json')\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 keys = getKeys(elements)\n if (!keys.length) {\n return ''\n }\n\n let keyPatten = new RegExp(`^(${keys.join('|')})-`)\n let filteredClassNames = classNames.filter((className) =>\n keyPatten.test(className)\n )\n if (!filteredClassNames.length) {\n return ''\n }\n let selectorPattern = new RegExp('\\\\.(' + filteredClassNames.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[data-dash]'))\n\nlet unique = (arr) => Array.from(new Set(arr))\n\nexport const getKeys = (elements) =>\n unique(elements.map((element) => element.getAttribute('data-dash'))).filter(\n Boolean\n )\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 // 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\nexport const getSupportsRules = (rules, supports) =>\n rules\n .filter((rule) => {\n const isSupportsMatch = rule.supports\n ? rule.supports\n .replace(/\\s/g, '')\n .trim()\n .endsWith(supports.replace(/\\s/g, '').trim())\n : false\n\n return rule.type === RULE_TYPES.supports && isSupportsMatch\n })\n .reduce(\n (supportsRules, supportsRule) => supportsRules.concat(supportsRule.rules),\n []\n )\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, supports} = 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 if (supports) {\n preparedRules = getSupportsRules(preparedRules, supports)\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 defaultClassNameReplacer = (className, index) => `dash-ui-${index}`\nconst componentSelectorClassNamePattern = /^e[a-zA-Z0-9]+[0-9]+$/\nexport const replaceClassNames = (\n classNames,\n styles,\n code,\n keys,\n classNameReplacer = defaultClassNameReplacer\n) => {\n let index = 0\n let keyPattern = new RegExp(`^(${keys.join('|')})-`)\n\n return classNames.reduce((acc, className) => {\n if (\n keyPattern.test(className) ||\n componentSelectorClassNamePattern.test(className)\n ) {\n const escapedRegex = new RegExp(\n className.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&'),\n 'g'\n )\n return acc.replace(escapedRegex, classNameReplacer(className, index++))\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 try {\n prettyStyles = css.stringify(css.parse(styles))\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 {classNameReplacer, 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(\n classNames,\n styles,\n printedVal,\n keys,\n classNameReplacer\n )\n },\n }\n}\n\nexport const {print, test} = createSerializer()\nexport default {print, test}\n"],"names":["selectors","node","isReactElement","props","getClassNames","className","class","getClassNamesFromTestRenderer","findWhere","components","dive","type","shouldDive","isTagWithClassName","classes","length","first","prop","getClassNamesFromEnzyme","val","cheerio","isCheerioElement","attr","getClassNamesFromCheerio","getAttribute","getClassNamesFromDOMElement","cssRule","cssText","element","mediaRules","mediaRule","concat","rules","supportsRules","supportsRule","decs","rule","declarations","RULE_TYPES","media","supports","split","$$typeof","Symbol","for","hasOwnProperty","domElementPattern","isDOMElement","nodeType","constructor","name","test","getClassNamesFromNodes","nodes","reduce","keyframesPattern","removeCommentPattern","getElementRules","nonSpeedyRule","textContent","sheet","slice","call","cssRules","map","getStylesFromClassNames","classNames","elements","keys","getKeys","keyPatten","RegExp","join","filteredClassNames","filter","arr","iteratee","selectorPattern","keyframes","styles","forEach","match","undefined","keyframeNameKeys","Object","keyframesStyles","keyframesNamePattern","keyframesNameCache","index","replace","value","getStyleElements","Array","from","document","querySelectorAll","unique","Set","Boolean","hasClassNames","target","some","selector","minify","includes","getMediaRules","isMediaMatch","getSupportsRules","isSupportsMatch","trim","endsWith","minLeft","minRight","s","matchers","toHaveStyleRule","received","property","options","cssString","preparedRules","css","stylesheet","declaration","dec","pop","pass","message","obj","asymmetricMatch","prototype","toString","apply","isAsymmetric","valueMatches","chalk","green","red","defaultClassNameReplacer","componentSelectorClassNamePattern","replaceClassNames","code","classNameReplacer","keyPattern","acc","escapedRegex","createSerializer","opt","DOMElements","cache","WeakSet","has","print","printer","getNodes","isArray","child","children","push","prettyStyles","e","console","error","Error","getPrettyStylesFromClassNames","add","printedVal","delete"],"mappings":"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"}