react-children-utilities
Advanced tools
+23
| # Folder view configuration files | ||
| .DS_Store | ||
| Desktop.ini | ||
| # Thumbnail cache files | ||
| ._* | ||
| Thumbs.db | ||
| # Files that might appear on external disks | ||
| .Spotlight-V100 | ||
| .Trashes | ||
| # npm | ||
| node_modules | ||
| npm-debug.log | ||
| yarn-error.log | ||
| # test files | ||
| coverage | ||
| # build and temp folders | ||
| /lib | ||
| /react-children-utilities.* |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
| <?xml version="1.0" encoding="UTF-8"?> | ||
| <coverage generated="1571033402391" clover="3.2.0"> | ||
| <project timestamp="1571033402391" name="All files"> | ||
| <metrics statements="89" coveredstatements="87" conditionals="33" coveredconditionals="29" methods="16" coveredmethods="16" elements="138" coveredelements="132" complexity="0" loc="89" ncloc="89" packages="2" files="10" classes="10"/> | ||
| <package name="src"> | ||
| <metrics statements="20" coveredstatements="20" conditionals="0" coveredconditionals="0" methods="0" coveredmethods="0"/> | ||
| <file name="react-children-utilities.ts" path="/Users/fernandopasik/Sites/react-children-utilities/src/react-children-utilities.ts"> | ||
| <metrics statements="20" coveredstatements="20" conditionals="0" coveredconditionals="0" methods="0" coveredmethods="0"/> | ||
| <line num="1" count="1" type="stmt"/> | ||
| <line num="3" count="1" type="stmt"/> | ||
| <line num="4" count="1" type="stmt"/> | ||
| <line num="5" count="1" type="stmt"/> | ||
| <line num="6" count="1" type="stmt"/> | ||
| <line num="7" count="1" type="stmt"/> | ||
| <line num="8" count="1" type="stmt"/> | ||
| <line num="9" count="1" type="stmt"/> | ||
| <line num="10" count="1" type="stmt"/> | ||
| <line num="11" count="1" type="stmt"/> | ||
| <line num="14" count="1" type="stmt"/> | ||
| <line num="15" count="1" type="stmt"/> | ||
| <line num="16" count="1" type="stmt"/> | ||
| <line num="17" count="1" type="stmt"/> | ||
| <line num="18" count="1" type="stmt"/> | ||
| <line num="19" count="1" type="stmt"/> | ||
| <line num="20" count="1" type="stmt"/> | ||
| <line num="21" count="1" type="stmt"/> | ||
| <line num="22" count="1" type="stmt"/> | ||
| <line num="25" count="1" type="stmt"/> | ||
| </file> | ||
| </package> | ||
| <package name="src.lib"> | ||
| <metrics statements="69" coveredstatements="67" conditionals="33" coveredconditionals="29" methods="16" coveredmethods="16"/> | ||
| <file name="deepFilter.ts" path="/Users/fernandopasik/Sites/react-children-utilities/src/lib/deepFilter.ts"> | ||
| <metrics statements="8" coveredstatements="8" conditionals="2" coveredconditionals="2" methods="2" coveredmethods="2"/> | ||
| <line num="1" count="2" type="stmt"/> | ||
| <line num="2" count="2" type="stmt"/> | ||
| <line num="8" count="2" type="stmt"/> | ||
| <line num="9" count="8" type="stmt"/> | ||
| <line num="12" count="13" type="cond" truecount="2" falsecount="0"/> | ||
| <line num="14" count="4" type="stmt"/> | ||
| <line num="19" count="9" type="stmt"/> | ||
| <line num="23" count="2" type="stmt"/> | ||
| </file> | ||
| <file name="deepFind.ts" path="/Users/fernandopasik/Sites/react-children-utilities/src/lib/deepFind.ts"> | ||
| <metrics statements="13" coveredstatements="13" conditionals="4" coveredconditionals="4" methods="2" coveredmethods="2"/> | ||
| <line num="1" count="2" type="stmt"/> | ||
| <line num="2" count="2" type="stmt"/> | ||
| <line num="8" count="2" type="stmt"/> | ||
| <line num="10" count="4" type="stmt"/> | ||
| <line num="11" count="7" type="cond" truecount="2" falsecount="0"/> | ||
| <line num="13" count="1" type="stmt"/> | ||
| <line num="14" count="1" type="stmt"/> | ||
| <line num="16" count="6" type="cond" truecount="2" falsecount="0"/> | ||
| <line num="17" count="2" type="stmt"/> | ||
| <line num="18" count="2" type="stmt"/> | ||
| <line num="20" count="4" type="stmt"/> | ||
| <line num="22" count="4" type="stmt"/> | ||
| <line num="25" count="2" type="stmt"/> | ||
| </file> | ||
| <file name="deepForEach.ts" path="/Users/fernandopasik/Sites/react-children-utilities/src/lib/deepForEach.ts"> | ||
| <metrics statements="8" coveredstatements="8" conditionals="2" coveredconditionals="2" methods="2" coveredmethods="2"/> | ||
| <line num="1" count="2" type="stmt"/> | ||
| <line num="2" count="2" type="stmt"/> | ||
| <line num="8" count="2" type="stmt"/> | ||
| <line num="9" count="6" type="stmt"/> | ||
| <line num="10" count="11" type="cond" truecount="2" falsecount="0"/> | ||
| <line num="12" count="3" type="stmt"/> | ||
| <line num="14" count="11" type="stmt"/> | ||
| <line num="18" count="2" type="stmt"/> | ||
| </file> | ||
| <file name="deepMap.ts" path="/Users/fernandopasik/Sites/react-children-utilities/src/lib/deepMap.ts"> | ||
| <metrics statements="8" coveredstatements="8" conditionals="2" coveredconditionals="2" methods="2" coveredmethods="2"/> | ||
| <line num="1" count="2" type="stmt"/> | ||
| <line num="2" count="2" type="stmt"/> | ||
| <line num="8" count="2" type="stmt"/> | ||
| <line num="9" count="6" type="stmt"/> | ||
| <line num="10" count="10" type="cond" truecount="2" falsecount="0"/> | ||
| <line num="12" count="3" type="stmt"/> | ||
| <line num="19" count="7" type="stmt"/> | ||
| <line num="23" count="2" type="stmt"/> | ||
| </file> | ||
| <file name="filter.ts" path="/Users/fernandopasik/Sites/react-children-utilities/src/lib/filter.ts"> | ||
| <metrics statements="4" coveredstatements="4" conditionals="0" coveredconditionals="0" methods="1" coveredmethods="1"/> | ||
| <line num="1" count="2" type="stmt"/> | ||
| <line num="7" count="2" type="stmt"/> | ||
| <line num="8" count="4" type="stmt"/> | ||
| <line num="11" count="2" type="stmt"/> | ||
| </file> | ||
| <file name="groupByType.ts" path="/Users/fernandopasik/Sites/react-children-utilities/src/lib/groupByType.ts"> | ||
| <metrics statements="11" coveredstatements="10" conditionals="12" coveredconditionals="9" methods="2" coveredmethods="2"/> | ||
| <line num="1" count="2" type="stmt"/> | ||
| <line num="7" count="2" type="stmt"/> | ||
| <line num="12" count="3" type="stmt"/> | ||
| <line num="13" count="9" type="cond" truecount="2" falsecount="0"/> | ||
| <line num="14" count="9" type="cond" truecount="2" falsecount="0"/> | ||
| <line num="15" count="9" type="cond" truecount="2" falsecount="0"/> | ||
| <line num="17" count="9" type="cond" truecount="1" falsecount="1"/> | ||
| <line num="18" count="0" type="stmt"/> | ||
| <line num="21" count="9" type="stmt"/> | ||
| <line num="23" count="9" type="stmt"/> | ||
| <line num="30" count="2" type="stmt"/> | ||
| </file> | ||
| <file name="hasChildren.ts" path="/Users/fernandopasik/Sites/react-children-utilities/src/lib/hasChildren.ts"> | ||
| <metrics statements="3" coveredstatements="3" conditionals="3" coveredconditionals="3" methods="1" coveredmethods="1"/> | ||
| <line num="3" count="8" type="stmt"/> | ||
| <line num="4" count="77" type="cond" truecount="3" falsecount="0"/> | ||
| <line num="6" count="8" type="stmt"/> | ||
| </file> | ||
| <file name="hasComplexChildren.ts" path="/Users/fernandopasik/Sites/react-children-utilities/src/lib/hasComplexChildren.ts"> | ||
| <metrics statements="6" coveredstatements="6" conditionals="4" coveredconditionals="4" methods="2" coveredmethods="2"/> | ||
| <line num="1" count="6" type="stmt"/> | ||
| <line num="3" count="6" type="stmt"/> | ||
| <line num="5" count="6" type="stmt"/> | ||
| <line num="6" count="50" type="cond" truecount="2" falsecount="0"/> | ||
| <line num="8" count="52" type="cond" truecount="2" falsecount="0"/> | ||
| <line num="12" count="6" type="stmt"/> | ||
| </file> | ||
| <file name="onlyText.ts" path="/Users/fernandopasik/Sites/react-children-utilities/src/lib/onlyText.ts"> | ||
| <metrics statements="8" coveredstatements="7" conditionals="4" coveredconditionals="3" methods="2" coveredmethods="2"/> | ||
| <line num="1" count="2" type="stmt"/> | ||
| <line num="2" count="2" type="stmt"/> | ||
| <line num="4" count="2" type="stmt"/> | ||
| <line num="5" count="16" type="stmt"/> | ||
| <line num="7" count="18" type="cond" truecount="1" falsecount="1"/> | ||
| <line num="8" count="0" type="stmt"/> | ||
| <line num="11" count="18" type="stmt"/> | ||
| <line num="19" count="2" type="stmt"/> | ||
| </file> | ||
| </package> | ||
| </project> | ||
| </coverage> |
| {"/Users/fernandopasik/Sites/react-children-utilities/src/react-children-utilities.ts": {"path":"/Users/fernandopasik/Sites/react-children-utilities/src/react-children-utilities.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":33}},"1":{"start":{"line":3,"column":0},"end":{"line":3,"column":7}},"2":{"start":{"line":14,"column":2},"end":{"line":3,"column":42}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":7}},"4":{"start":{"line":15,"column":2},"end":{"line":4,"column":38}},"5":{"start":{"line":5,"column":0},"end":{"line":5,"column":7}},"6":{"start":{"line":16,"column":2},"end":{"line":5,"column":44}},"7":{"start":{"line":6,"column":0},"end":{"line":6,"column":7}},"8":{"start":{"line":17,"column":2},"end":{"line":6,"column":36}},"9":{"start":{"line":7,"column":0},"end":{"line":7,"column":7}},"10":{"start":{"line":18,"column":2},"end":{"line":7,"column":34}},"11":{"start":{"line":8,"column":0},"end":{"line":8,"column":7}},"12":{"start":{"line":19,"column":2},"end":{"line":8,"column":44}},"13":{"start":{"line":9,"column":0},"end":{"line":9,"column":7}},"14":{"start":{"line":20,"column":2},"end":{"line":9,"column":44}},"15":{"start":{"line":10,"column":0},"end":{"line":10,"column":7}},"16":{"start":{"line":21,"column":2},"end":{"line":10,"column":58}},"17":{"start":{"line":11,"column":0},"end":{"line":11,"column":7}},"18":{"start":{"line":22,"column":2},"end":{"line":11,"column":38}},"19":{"start":{"line":25,"column":0},"end":{"line":35,"column":null}}},"fnMap":{},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1},"f":{},"b":{}} | ||
| ,"/Users/fernandopasik/Sites/react-children-utilities/src/lib/deepFilter.ts": {"path":"/Users/fernandopasik/Sites/react-children-utilities/src/lib/deepFilter.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":72}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":54}},"2":{"start":{"line":8,"column":19},"end":{"line":21,"column":1}},"3":{"start":{"line":9,"column":2},"end":{"line":20,"column":7}},"4":{"start":{"line":12,"column":6},"end":{"line":18,"column":null}},"5":{"start":{"line":14,"column":8},"end":{"line":17,"column":11}},"6":{"start":{"line":19,"column":6},"end":{"line":19,"column":19}},"7":{"start":{"line":23,"column":0},"end":{"line":23,"column":26}}},"fnMap":{"0":{"name":"(anonymous_1)","decl":{"start":{"line":8,"column":19},"end":{"line":8,"column":20}},"loc":{"start":{"line":8,"column":86},"end":{"line":21,"column":1}}},"1":{"name":"(anonymous_2)","decl":{"start":{"line":11,"column":9},"end":{"line":11,"column":10}},"loc":{"start":{"line":11,"column":19},"end":{"line":20,"column":5}}}},"branchMap":{"0":{"loc":{"start":{"line":12,"column":6},"end":{"line":18,"column":null}},"type":"if","locations":[{"start":{"line":12,"column":6},"end":{"line":18,"column":null}},{"start":{"line":12,"column":6},"end":{"line":18,"column":null}}]}},"s":{"0":2,"1":2,"2":2,"3":8,"4":13,"5":4,"6":9,"7":2},"f":{"0":8,"1":13},"b":{"0":[4,9]}} | ||
| ,"/Users/fernandopasik/Sites/react-children-utilities/src/lib/deepFind.ts": {"path":"/Users/fernandopasik/Sites/react-children-utilities/src/lib/deepFind.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":58}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":54}},"2":{"start":{"line":8,"column":17},"end":{"line":23,"column":1}},"3":{"start":{"line":10,"column":2},"end":{"line":21,"column":5}},"4":{"start":{"line":11,"column":4},"end":{"line":15,"column":null}},"5":{"start":{"line":13,"column":6},"end":{"line":13,"column":75}},"6":{"start":{"line":14,"column":6},"end":{"line":14,"column":42}},"7":{"start":{"line":16,"column":4},"end":{"line":19,"column":null}},"8":{"start":{"line":17,"column":6},"end":{"line":17,"column":20}},"9":{"start":{"line":18,"column":6},"end":{"line":18,"column":18}},"10":{"start":{"line":20,"column":4},"end":{"line":20,"column":17}},"11":{"start":{"line":22,"column":2},"end":{"line":22,"column":15}},"12":{"start":{"line":25,"column":0},"end":{"line":25,"column":24}}},"fnMap":{"0":{"name":"(anonymous_1)","decl":{"start":{"line":8,"column":17},"end":{"line":8,"column":18}},"loc":{"start":{"line":8,"column":90},"end":{"line":23,"column":1}}},"1":{"name":"(anonymous_2)","decl":{"start":{"line":10,"column":34},"end":{"line":10,"column":35}},"loc":{"start":{"line":10,"column":44},"end":{"line":21,"column":3}}}},"branchMap":{"0":{"loc":{"start":{"line":11,"column":4},"end":{"line":15,"column":null}},"type":"if","locations":[{"start":{"line":11,"column":4},"end":{"line":15,"column":null}},{"start":{"line":11,"column":4},"end":{"line":15,"column":null}}]},"1":{"loc":{"start":{"line":16,"column":4},"end":{"line":19,"column":null}},"type":"if","locations":[{"start":{"line":16,"column":4},"end":{"line":19,"column":null}},{"start":{"line":16,"column":4},"end":{"line":19,"column":null}}]}},"s":{"0":2,"1":2,"2":2,"3":4,"4":7,"5":1,"6":1,"7":6,"8":2,"9":2,"10":4,"11":4,"12":2},"f":{"0":4,"1":7},"b":{"0":[1,6],"1":[2,4]}} | ||
| ,"/Users/fernandopasik/Sites/react-children-utilities/src/lib/deepForEach.ts": {"path":"/Users/fernandopasik/Sites/react-children-utilities/src/lib/deepForEach.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":58}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":54}},"2":{"start":{"line":8,"column":20},"end":{"line":16,"column":1}},"3":{"start":{"line":9,"column":2},"end":{"line":15,"column":5}},"4":{"start":{"line":10,"column":4},"end":{"line":13,"column":null}},"5":{"start":{"line":12,"column":6},"end":{"line":12,"column":73}},"6":{"start":{"line":14,"column":4},"end":{"line":14,"column":25}},"7":{"start":{"line":18,"column":0},"end":{"line":18,"column":27}}},"fnMap":{"0":{"name":"(anonymous_1)","decl":{"start":{"line":8,"column":20},"end":{"line":8,"column":21}},"loc":{"start":{"line":8,"column":82},"end":{"line":16,"column":1}}},"1":{"name":"(anonymous_2)","decl":{"start":{"line":9,"column":29},"end":{"line":9,"column":30}},"loc":{"start":{"line":9,"column":39},"end":{"line":15,"column":3}}}},"branchMap":{"0":{"loc":{"start":{"line":10,"column":4},"end":{"line":13,"column":null}},"type":"if","locations":[{"start":{"line":10,"column":4},"end":{"line":13,"column":null}},{"start":{"line":10,"column":4},"end":{"line":13,"column":null}}]}},"s":{"0":2,"1":2,"2":2,"3":6,"4":11,"5":3,"6":11,"7":2},"f":{"0":6,"1":11},"b":{"0":[3,8]}} | ||
| ,"/Users/fernandopasik/Sites/react-children-utilities/src/lib/deepMap.ts": {"path":"/Users/fernandopasik/Sites/react-children-utilities/src/lib/deepMap.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":72}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":54}},"2":{"start":{"line":8,"column":16},"end":{"line":21,"column":1}},"3":{"start":{"line":9,"column":2},"end":{"line":20,"column":5}},"4":{"start":{"line":10,"column":4},"end":{"line":18,"column":null}},"5":{"start":{"line":12,"column":6},"end":{"line":17,"column":8}},"6":{"start":{"line":19,"column":4},"end":{"line":19,"column":28}},"7":{"start":{"line":23,"column":0},"end":{"line":23,"column":23}}},"fnMap":{"0":{"name":"(anonymous_1)","decl":{"start":{"line":8,"column":16},"end":{"line":8,"column":17}},"loc":{"start":{"line":8,"column":77},"end":{"line":21,"column":1}}},"1":{"name":"(anonymous_2)","decl":{"start":{"line":9,"column":32},"end":{"line":9,"column":33}},"loc":{"start":{"line":9,"column":42},"end":{"line":20,"column":3}}}},"branchMap":{"0":{"loc":{"start":{"line":10,"column":4},"end":{"line":18,"column":null}},"type":"if","locations":[{"start":{"line":10,"column":4},"end":{"line":18,"column":null}},{"start":{"line":10,"column":4},"end":{"line":18,"column":null}}]}},"s":{"0":2,"1":2,"2":2,"3":6,"4":10,"5":3,"6":7,"7":2},"f":{"0":6,"1":10},"b":{"0":[3,7]}} | ||
| ,"/Users/fernandopasik/Sites/react-children-utilities/src/lib/filter.ts": {"path":"/Users/fernandopasik/Sites/react-children-utilities/src/lib/filter.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":44}},"1":{"start":{"line":7,"column":15},"end":{"line":9,"column":1}},"2":{"start":{"line":8,"column":2},"end":{"line":8,"column":53}},"3":{"start":{"line":11,"column":0},"end":{"line":11,"column":22}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":7,"column":15},"end":{"line":7,"column":16}},"loc":{"start":{"line":7,"column":78},"end":{"line":9,"column":1}}}},"branchMap":{},"s":{"0":2,"1":2,"2":4,"3":2},"f":{"0":4},"b":{}} | ||
| ,"/Users/fernandopasik/Sites/react-children-utilities/src/lib/groupByType.ts": {"path":"/Users/fernandopasik/Sites/react-children-utilities/src/lib/groupByType.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":74}},"1":{"start":{"line":7,"column":20},"end":{"line":28,"column":1}},"2":{"start":{"line":12,"column":2},"end":{"line":27,"column":9}},"3":{"start":{"line":13,"column":22},"end":{"line":13,"column":73}},"4":{"start":{"line":14,"column":21},"end":{"line":14,"column":79}},"5":{"start":{"line":15,"column":16},"end":{"line":15,"column":63}},"6":{"start":{"line":17,"column":4},"end":{"line":19,"column":null}},"7":{"start":{"line":18,"column":6},"end":{"line":18,"column":20}},"8":{"start":{"line":21,"column":18},"end":{"line":21,"column":29}},"9":{"start":{"line":23,"column":4},"end":{"line":25,"column":null}},"10":{"start":{"line":30,"column":0},"end":{"line":30,"column":27}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":7,"column":20},"end":{"line":7,"column":null}},"loc":{"start":{"line":11,"column":21},"end":{"line":28,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":12,"column":43},"end":{"line":12,"column":44}},"loc":{"start":{"line":12,"column":89},"end":{"line":27,"column":3}}}},"branchMap":{"0":{"loc":{"start":{"line":9,"column":23},"end":{"line":9,"column":25}},"type":"default-arg","locations":[{"start":{"line":9,"column":23},"end":{"line":9,"column":25}}]},"1":{"loc":{"start":{"line":10,"column":9},"end":{"line":10,"column":15}},"type":"default-arg","locations":[{"start":{"line":10,"column":9},"end":{"line":10,"column":15}}]},"2":{"loc":{"start":{"line":13,"column":22},"end":{"line":13,"column":43}},"type":"binary-expr","locations":[{"start":{"line":13,"column":22},"end":{"line":13,"column":43}},{"start":{"line":13,"column":47},"end":{"line":13,"column":73}}]},"3":{"loc":{"start":{"line":14,"column":34},"end":{"line":14,"column":71}},"type":"cond-expr","locations":[{"start":{"line":14,"column":34},"end":{"line":14,"column":71}},{"start":{"line":14,"column":74},"end":{"line":14,"column":79}}]},"4":{"loc":{"start":{"line":15,"column":29},"end":{"line":15,"column":56}},"type":"cond-expr","locations":[{"start":{"line":15,"column":29},"end":{"line":15,"column":56}},{"start":{"line":15,"column":59},"end":{"line":15,"column":63}}]},"5":{"loc":{"start":{"line":17,"column":4},"end":{"line":19,"column":null}},"type":"if","locations":[{"start":{"line":17,"column":4},"end":{"line":19,"column":null}},{"start":{"line":17,"column":4},"end":{"line":19,"column":null}}]},"6":{"loc":{"start":{"line":25,"column":18},"end":{"line":25,"column":23}},"type":"binary-expr","locations":[{"start":{"line":25,"column":18},"end":{"line":25,"column":23}},{"start":{"line":25,"column":27},"end":{"line":25,"column":29}}]}},"s":{"0":2,"1":2,"2":3,"3":9,"4":9,"5":9,"6":9,"7":0,"8":9,"9":9,"10":2},"f":{"0":3,"1":9},"b":{"0":[0],"1":[0],"2":[9,9],"3":[6,3],"4":[6,3],"5":[0,9],"6":[9,6]}} | ||
| ,"/Users/fernandopasik/Sites/react-children-utilities/src/lib/hasChildren.ts": {"path":"/Users/fernandopasik/Sites/react-children-utilities/src/lib/hasChildren.ts","statementMap":{"0":{"start":{"line":3,"column":20},"end":{"line":4,"column":91}},"1":{"start":{"line":4,"column":2},"end":{"line":4,"column":91}},"2":{"start":{"line":6,"column":0},"end":{"line":6,"column":27}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":3,"column":20},"end":{"line":3,"column":21}},"loc":{"start":{"line":4,"column":2},"end":{"line":4,"column":91}}}},"branchMap":{"0":{"loc":{"start":{"line":4,"column":10},"end":{"line":4,"column":15}},"type":"binary-expr","locations":[{"start":{"line":4,"column":10},"end":{"line":4,"column":15}},{"start":{"line":4,"column":20},"end":{"line":4,"column":48}},{"start":{"line":4,"column":53},"end":{"line":4,"column":90}}]}},"s":{"0":8,"1":77,"2":8},"f":{"0":77},"b":{"0":[77,77,64]}} | ||
| ,"/Users/fernandopasik/Sites/react-children-utilities/src/lib/hasComplexChildren.ts": {"path":"/Users/fernandopasik/Sites/react-children-utilities/src/lib/hasComplexChildren.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":74}},"1":{"start":{"line":3,"column":0},"end":{"line":3,"column":40}},"2":{"start":{"line":5,"column":27},"end":{"line":9,"column":null}},"3":{"start":{"line":6,"column":2},"end":{"line":9,"column":null}},"4":{"start":{"line":8,"column":45},"end":{"line":8,"column":78}},"5":{"start":{"line":12,"column":0},"end":{"line":12,"column":34}}},"fnMap":{"0":{"name":"(anonymous_1)","decl":{"start":{"line":5,"column":27},"end":{"line":5,"column":28}},"loc":{"start":{"line":6,"column":2},"end":{"line":9,"column":null}}},"1":{"name":"(anonymous_2)","decl":{"start":{"line":8,"column":4},"end":{"line":8,"column":5}},"loc":{"start":{"line":8,"column":45},"end":{"line":8,"column":78}}}},"branchMap":{"0":{"loc":{"start":{"line":6,"column":2},"end":{"line":6,"column":22}},"type":"binary-expr","locations":[{"start":{"line":6,"column":2},"end":{"line":6,"column":22}},{"start":{"line":7,"column":2},"end":{"line":9,"column":null}}]},"1":{"loc":{"start":{"line":8,"column":45},"end":{"line":8,"column":53}},"type":"binary-expr","locations":[{"start":{"line":8,"column":45},"end":{"line":8,"column":53}},{"start":{"line":8,"column":57},"end":{"line":8,"column":78}}]}},"s":{"0":6,"1":6,"2":6,"3":50,"4":52,"5":6},"f":{"0":50,"1":52},"b":{"0":[50,45],"1":[52,46]}} | ||
| ,"/Users/fernandopasik/Sites/react-children-utilities/src/lib/onlyText.ts": {"path":"/Users/fernandopasik/Sites/react-children-utilities/src/lib/onlyText.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":58}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":40}},"2":{"start":{"line":4,"column":17},"end":{"line":17,"column":1}},"3":{"start":{"line":5,"column":2},"end":{"line":16,"column":14}},"4":{"start":{"line":7,"column":6},"end":{"line":9,"column":null}},"5":{"start":{"line":8,"column":8},"end":{"line":8,"column":25}},"6":{"start":{"line":11,"column":6},"end":{"line":14,"column":8}},"7":{"start":{"line":19,"column":0},"end":{"line":19,"column":24}}},"fnMap":{"0":{"name":"(anonymous_1)","decl":{"start":{"line":4,"column":17},"end":{"line":4,"column":18}},"loc":{"start":{"line":4,"column":49},"end":{"line":17,"column":1}}},"1":{"name":"(anonymous_2)","decl":{"start":{"line":6,"column":12},"end":{"line":6,"column":13}},"loc":{"start":{"line":6,"column":64},"end":{"line":15,"column":5}}}},"branchMap":{"0":{"loc":{"start":{"line":7,"column":6},"end":{"line":9,"column":null}},"type":"if","locations":[{"start":{"line":7,"column":6},"end":{"line":9,"column":null}},{"start":{"line":7,"column":6},"end":{"line":9,"column":null}}]},"1":{"loc":{"start":{"line":13,"column":29},"end":{"line":13,"column":77}},"type":"cond-expr","locations":[{"start":{"line":13,"column":29},"end":{"line":13,"column":77}},{"start":{"line":13,"column":80},"end":{"line":13,"column":96}}]}},"s":{"0":2,"1":2,"2":2,"3":16,"4":18,"5":0,"6":18,"7":2},"f":{"0":16,"1":18},"b":{"0":[0,18],"1":[7,11]}} | ||
| } |
Sorry, the diff of this file is not supported yet
| body, html { | ||
| margin:0; padding: 0; | ||
| height: 100%; | ||
| } | ||
| body { | ||
| font-family: Helvetica Neue, Helvetica, Arial; | ||
| font-size: 14px; | ||
| color:#333; | ||
| } | ||
| .small { font-size: 12px; } | ||
| *, *:after, *:before { | ||
| -webkit-box-sizing:border-box; | ||
| -moz-box-sizing:border-box; | ||
| box-sizing:border-box; | ||
| } | ||
| h1 { font-size: 20px; margin: 0;} | ||
| h2 { font-size: 14px; } | ||
| pre { | ||
| font: 12px/1.4 Consolas, "Liberation Mono", Menlo, Courier, monospace; | ||
| margin: 0; | ||
| padding: 0; | ||
| -moz-tab-size: 2; | ||
| -o-tab-size: 2; | ||
| tab-size: 2; | ||
| } | ||
| a { color:#0074D9; text-decoration:none; } | ||
| a:hover { text-decoration:underline; } | ||
| .strong { font-weight: bold; } | ||
| .space-top1 { padding: 10px 0 0 0; } | ||
| .pad2y { padding: 20px 0; } | ||
| .pad1y { padding: 10px 0; } | ||
| .pad2x { padding: 0 20px; } | ||
| .pad2 { padding: 20px; } | ||
| .pad1 { padding: 10px; } | ||
| .space-left2 { padding-left:55px; } | ||
| .space-right2 { padding-right:20px; } | ||
| .center { text-align:center; } | ||
| .clearfix { display:block; } | ||
| .clearfix:after { | ||
| content:''; | ||
| display:block; | ||
| height:0; | ||
| clear:both; | ||
| visibility:hidden; | ||
| } | ||
| .fl { float: left; } | ||
| @media only screen and (max-width:640px) { | ||
| .col3 { width:100%; max-width:100%; } | ||
| .hide-mobile { display:none!important; } | ||
| } | ||
| .quiet { | ||
| color: #7f7f7f; | ||
| color: rgba(0,0,0,0.5); | ||
| } | ||
| .quiet a { opacity: 0.7; } | ||
| .fraction { | ||
| font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; | ||
| font-size: 10px; | ||
| color: #555; | ||
| background: #E8E8E8; | ||
| padding: 4px 5px; | ||
| border-radius: 3px; | ||
| vertical-align: middle; | ||
| } | ||
| div.path a:link, div.path a:visited { color: #333; } | ||
| table.coverage { | ||
| border-collapse: collapse; | ||
| margin: 10px 0 0 0; | ||
| padding: 0; | ||
| } | ||
| table.coverage td { | ||
| margin: 0; | ||
| padding: 0; | ||
| vertical-align: top; | ||
| } | ||
| table.coverage td.line-count { | ||
| text-align: right; | ||
| padding: 0 5px 0 20px; | ||
| } | ||
| table.coverage td.line-coverage { | ||
| text-align: right; | ||
| padding-right: 10px; | ||
| min-width:20px; | ||
| } | ||
| table.coverage td span.cline-any { | ||
| display: inline-block; | ||
| padding: 0 5px; | ||
| width: 100%; | ||
| } | ||
| .missing-if-branch { | ||
| display: inline-block; | ||
| margin-right: 5px; | ||
| border-radius: 3px; | ||
| position: relative; | ||
| padding: 0 4px; | ||
| background: #333; | ||
| color: yellow; | ||
| } | ||
| .skip-if-branch { | ||
| display: none; | ||
| margin-right: 10px; | ||
| position: relative; | ||
| padding: 0 4px; | ||
| background: #ccc; | ||
| color: white; | ||
| } | ||
| .missing-if-branch .typ, .skip-if-branch .typ { | ||
| color: inherit !important; | ||
| } | ||
| .coverage-summary { | ||
| border-collapse: collapse; | ||
| width: 100%; | ||
| } | ||
| .coverage-summary tr { border-bottom: 1px solid #bbb; } | ||
| .keyline-all { border: 1px solid #ddd; } | ||
| .coverage-summary td, .coverage-summary th { padding: 10px; } | ||
| .coverage-summary tbody { border: 1px solid #bbb; } | ||
| .coverage-summary td { border-right: 1px solid #bbb; } | ||
| .coverage-summary td:last-child { border-right: none; } | ||
| .coverage-summary th { | ||
| text-align: left; | ||
| font-weight: normal; | ||
| white-space: nowrap; | ||
| } | ||
| .coverage-summary th.file { border-right: none !important; } | ||
| .coverage-summary th.pct { } | ||
| .coverage-summary th.pic, | ||
| .coverage-summary th.abs, | ||
| .coverage-summary td.pct, | ||
| .coverage-summary td.abs { text-align: right; } | ||
| .coverage-summary td.file { white-space: nowrap; } | ||
| .coverage-summary td.pic { min-width: 120px !important; } | ||
| .coverage-summary tfoot td { } | ||
| .coverage-summary .sorter { | ||
| height: 10px; | ||
| width: 7px; | ||
| display: inline-block; | ||
| margin-left: 0.5em; | ||
| background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent; | ||
| } | ||
| .coverage-summary .sorted .sorter { | ||
| background-position: 0 -20px; | ||
| } | ||
| .coverage-summary .sorted-desc .sorter { | ||
| background-position: 0 -10px; | ||
| } | ||
| .status-line { height: 10px; } | ||
| /* yellow */ | ||
| .cbranch-no { background: yellow !important; color: #111; } | ||
| /* dark red */ | ||
| .red.solid, .status-line.low, .low .cover-fill { background:#C21F39 } | ||
| .low .chart { border:1px solid #C21F39 } | ||
| .highlighted, | ||
| .highlighted .cstat-no, .highlighted .fstat-no, .highlighted .cbranch-no{ | ||
| background: #C21F39 !important; | ||
| } | ||
| /* medium red */ | ||
| .cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE } | ||
| /* light red */ | ||
| .low, .cline-no { background:#FCE1E5 } | ||
| /* light green */ | ||
| .high, .cline-yes { background:rgb(230,245,208) } | ||
| /* medium green */ | ||
| .cstat-yes { background:rgb(161,215,106) } | ||
| /* dark green */ | ||
| .status-line.high, .high .cover-fill { background:rgb(77,146,33) } | ||
| .high .chart { border:1px solid rgb(77,146,33) } | ||
| /* dark yellow (gold) */ | ||
| .status-line.medium, .medium .cover-fill { background: #f9cd0b; } | ||
| .medium .chart { border:1px solid #f9cd0b; } | ||
| /* light yellow */ | ||
| .medium { background: #fff4c2; } | ||
| .cstat-skip { background: #ddd; color: #111; } | ||
| .fstat-skip { background: #ddd; color: #111 !important; } | ||
| .cbranch-skip { background: #ddd !important; color: #111; } | ||
| span.cline-neutral { background: #eaeaea; } | ||
| .coverage-summary td.empty { | ||
| opacity: .5; | ||
| padding-top: 4px; | ||
| padding-bottom: 4px; | ||
| line-height: 1; | ||
| color: #888; | ||
| } | ||
| .cover-fill, .cover-empty { | ||
| display:inline-block; | ||
| height: 12px; | ||
| } | ||
| .chart { | ||
| line-height: 0; | ||
| } | ||
| .cover-empty { | ||
| background: white; | ||
| } | ||
| .cover-full { | ||
| border-right: none !important; | ||
| } | ||
| pre.prettyprint { | ||
| border: none !important; | ||
| padding: 0 !important; | ||
| margin: 0 !important; | ||
| } | ||
| .com { color: #999 !important; } | ||
| .ignore-none { color: #999; font-weight: normal; } | ||
| .wrapper { | ||
| min-height: 100%; | ||
| height: auto !important; | ||
| height: 100%; | ||
| margin: 0 auto -48px; | ||
| } | ||
| .footer, .push { | ||
| height: 48px; | ||
| } |
| /* eslint-disable */ | ||
| var jumpToCode = (function init() { | ||
| // Classes of code we would like to highlight in the file view | ||
| var missingCoverageClasses = ['.cbranch-no', '.cstat-no', '.fstat-no']; | ||
| // Elements to highlight in the file listing view | ||
| var fileListingElements = ['td.pct.low']; | ||
| // We don't want to select elements that are direct descendants of another match | ||
| var notSelector = ':not(' + missingCoverageClasses.join('):not(') + ') > '; // becomes `:not(a):not(b) > ` | ||
| // Selecter that finds elements on the page to which we can jump | ||
| var selector = | ||
| fileListingElements.join(', ') + | ||
| ', ' + | ||
| notSelector + | ||
| missingCoverageClasses.join(', ' + notSelector); // becomes `:not(a):not(b) > a, :not(a):not(b) > b` | ||
| // The NodeList of matching elements | ||
| var missingCoverageElements = document.querySelectorAll(selector); | ||
| var currentIndex; | ||
| function toggleClass(index) { | ||
| missingCoverageElements | ||
| .item(currentIndex) | ||
| .classList.remove('highlighted'); | ||
| missingCoverageElements.item(index).classList.add('highlighted'); | ||
| } | ||
| function makeCurrent(index) { | ||
| toggleClass(index); | ||
| currentIndex = index; | ||
| missingCoverageElements.item(index).scrollIntoView({ | ||
| behavior: 'smooth', | ||
| block: 'center', | ||
| inline: 'center' | ||
| }); | ||
| } | ||
| function goToPrevious() { | ||
| var nextIndex = 0; | ||
| if (typeof currentIndex !== 'number' || currentIndex === 0) { | ||
| nextIndex = missingCoverageElements.length - 1; | ||
| } else if (missingCoverageElements.length > 1) { | ||
| nextIndex = currentIndex - 1; | ||
| } | ||
| makeCurrent(nextIndex); | ||
| } | ||
| function goToNext() { | ||
| var nextIndex = 0; | ||
| if ( | ||
| typeof currentIndex === 'number' && | ||
| currentIndex < missingCoverageElements.length - 1 | ||
| ) { | ||
| nextIndex = currentIndex + 1; | ||
| } | ||
| makeCurrent(nextIndex); | ||
| } | ||
| return function jump(event) { | ||
| switch (event.which) { | ||
| case 78: // n | ||
| case 74: // j | ||
| goToNext(); | ||
| break; | ||
| case 66: // b | ||
| case 75: // k | ||
| case 80: // p | ||
| goToPrevious(); | ||
| break; | ||
| } | ||
| }; | ||
| })(); | ||
| window.addEventListener('keydown', jumpToCode); |
| <!doctype html> | ||
| <html lang="en"> | ||
| <head> | ||
| <title>Code coverage report for deepFilter.js</title> | ||
| <meta charset="utf-8" /> | ||
| <link rel="stylesheet" href="prettify.css" /> | ||
| <link rel="stylesheet" href="base.css" /> | ||
| <meta name="viewport" content="width=device-width, initial-scale=1"> | ||
| <style type='text/css'> | ||
| .coverage-summary .sorter { | ||
| background-image: url(sort-arrow-sprite.png); | ||
| } | ||
| </style> | ||
| </head> | ||
| <body> | ||
| <div class='wrapper'> | ||
| <div class='pad1'> | ||
| <h1> | ||
| <a href="index.html">All files</a> deepFilter.js | ||
| </h1> | ||
| <div class='clearfix'> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Statements</span> | ||
| <span class='fraction'>5/5</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Branches</span> | ||
| <span class='fraction'>2/2</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Functions</span> | ||
| <span class='fraction'>2/2</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Lines</span> | ||
| <span class='fraction'>5/5</span> | ||
| </div> | ||
| </div> | ||
| <p class="quiet"> | ||
| Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block. | ||
| </p> | ||
| </div> | ||
| <div class='status-line high'></div> | ||
| <pre><table class="coverage"> | ||
| <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a> | ||
| <a name='L2'></a><a href='#L2'>2</a> | ||
| <a name='L3'></a><a href='#L3'>3</a> | ||
| <a name='L4'></a><a href='#L4'>4</a> | ||
| <a name='L5'></a><a href='#L5'>5</a> | ||
| <a name='L6'></a><a href='#L6'>6</a> | ||
| <a name='L7'></a><a href='#L7'>7</a> | ||
| <a name='L8'></a><a href='#L8'>8</a> | ||
| <a name='L9'></a><a href='#L9'>9</a> | ||
| <a name='L10'></a><a href='#L10'>10</a> | ||
| <a name='L11'></a><a href='#L11'>11</a> | ||
| <a name='L12'></a><a href='#L12'>12</a> | ||
| <a name='L13'></a><a href='#L13'>13</a> | ||
| <a name='L14'></a><a href='#L14'>14</a> | ||
| <a name='L15'></a><a href='#L15'>15</a> | ||
| <a name='L16'></a><a href='#L16'>16</a> | ||
| <a name='L17'></a><a href='#L17'>17</a> | ||
| <a name='L18'></a><a href='#L18'>18</a> | ||
| <a name='L19'></a><a href='#L19'>19</a> | ||
| <a name='L20'></a><a href='#L20'>20</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-yes">3x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">5x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">3x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import { Children, cloneElement } from 'react'; | ||
| import hasComplexChildren from './hasComplexChildren'; | ||
| | ||
| const deepFilter = (children, deepFilterFn) => { | ||
| return Children.toArray(children) | ||
| .filter(deepFilterFn) | ||
| .map((child) => { | ||
| if (hasComplexChildren(child)) { | ||
| // Clone the child that has children and filter them too | ||
| return cloneElement(child, { | ||
| ...child.props, | ||
| children: deepFilter(child.props.children, deepFilterFn), | ||
| }); | ||
| } | ||
| return child; | ||
| }); | ||
| }; | ||
| | ||
| export default deepFilter; | ||
| </pre></td></tr> | ||
| </table></pre> | ||
| <div class='push'></div><!-- for sticky footer --> | ||
| </div><!-- /wrapper --> | ||
| <div class='footer quiet pad2 space-top1 center small'> | ||
| Code coverage | ||
| generated by <a href="https://istanbul.js.org/" target="_blank">istanbul</a> at Sat Oct 05 2019 18:32:48 GMT+0100 (British Summer Time) | ||
| </div> | ||
| </div> | ||
| <script src="prettify.js"></script> | ||
| <script> | ||
| window.onload = function () { | ||
| if (typeof prettyPrint === 'function') { | ||
| prettyPrint(); | ||
| } | ||
| }; | ||
| </script> | ||
| <script src="sorter.js"></script> | ||
| <script src="block-navigation.js"></script> | ||
| </body> | ||
| </html> |
| <!doctype html> | ||
| <html lang="en"> | ||
| <head> | ||
| <title>Code coverage report for deepFilter.ts</title> | ||
| <meta charset="utf-8" /> | ||
| <link rel="stylesheet" href="prettify.css" /> | ||
| <link rel="stylesheet" href="base.css" /> | ||
| <meta name="viewport" content="width=device-width, initial-scale=1"> | ||
| <style type='text/css'> | ||
| .coverage-summary .sorter { | ||
| background-image: url(sort-arrow-sprite.png); | ||
| } | ||
| </style> | ||
| </head> | ||
| <body> | ||
| <div class='wrapper'> | ||
| <div class='pad1'> | ||
| <h1> | ||
| <a href="index.html">All files</a> deepFilter.ts | ||
| </h1> | ||
| <div class='clearfix'> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Statements</span> | ||
| <span class='fraction'>8/8</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Branches</span> | ||
| <span class='fraction'>2/2</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Functions</span> | ||
| <span class='fraction'>2/2</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Lines</span> | ||
| <span class='fraction'>8/8</span> | ||
| </div> | ||
| </div> | ||
| <p class="quiet"> | ||
| Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block. | ||
| </p> | ||
| </div> | ||
| <div class='status-line high'></div> | ||
| <pre><table class="coverage"> | ||
| <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a> | ||
| <a name='L2'></a><a href='#L2'>2</a> | ||
| <a name='L3'></a><a href='#L3'>3</a> | ||
| <a name='L4'></a><a href='#L4'>4</a> | ||
| <a name='L5'></a><a href='#L5'>5</a> | ||
| <a name='L6'></a><a href='#L6'>6</a> | ||
| <a name='L7'></a><a href='#L7'>7</a> | ||
| <a name='L8'></a><a href='#L8'>8</a> | ||
| <a name='L9'></a><a href='#L9'>9</a> | ||
| <a name='L10'></a><a href='#L10'>10</a> | ||
| <a name='L11'></a><a href='#L11'>11</a> | ||
| <a name='L12'></a><a href='#L12'>12</a> | ||
| <a name='L13'></a><a href='#L13'>13</a> | ||
| <a name='L14'></a><a href='#L14'>14</a> | ||
| <a name='L15'></a><a href='#L15'>15</a> | ||
| <a name='L16'></a><a href='#L16'>16</a> | ||
| <a name='L17'></a><a href='#L17'>17</a> | ||
| <a name='L18'></a><a href='#L18'>18</a> | ||
| <a name='L19'></a><a href='#L19'>19</a> | ||
| <a name='L20'></a><a href='#L20'>20</a> | ||
| <a name='L21'></a><a href='#L21'>21</a> | ||
| <a name='L22'></a><a href='#L22'>22</a> | ||
| <a name='L23'></a><a href='#L23'>23</a> | ||
| <a name='L24'></a><a href='#L24'>24</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-yes">8x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">13x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">4x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">9x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import { Children, cloneElement, ReactElement, ReactNode } from 'react'; | ||
| import hasComplexChildren from './hasComplexChildren'; | ||
| | ||
| export interface FilterFunction { | ||
| (child: ReactNode, index?: number, children?: ReactNode[]): boolean; | ||
| } | ||
| | ||
| const deepFilter = (children: ReactNode, deepFilterFn: FilterFunction): ReactNode[] => { | ||
| return Children.toArray(children) | ||
| .filter(deepFilterFn) | ||
| .map((child) => { | ||
| if (hasComplexChildren(child)) { | ||
| // Clone the child that has children and filter them too | ||
| return cloneElement(child as ReactElement, { | ||
| ...(child as ReactElement).props, | ||
| children: deepFilter((child as ReactElement).props.children, deepFilterFn), | ||
| }); | ||
| } | ||
| return child; | ||
| }); | ||
| }; | ||
| | ||
| export default deepFilter; | ||
| </pre></td></tr> | ||
| </table></pre> | ||
| <div class='push'></div><!-- for sticky footer --> | ||
| </div><!-- /wrapper --> | ||
| <div class='footer quiet pad2 space-top1 center small'> | ||
| Code coverage | ||
| generated by <a href="https://istanbul.js.org/" target="_blank">istanbul</a> at Thu Oct 10 2019 01:10:43 GMT+0100 (British Summer Time) | ||
| </div> | ||
| </div> | ||
| <script src="prettify.js"></script> | ||
| <script> | ||
| window.onload = function () { | ||
| if (typeof prettyPrint === 'function') { | ||
| prettyPrint(); | ||
| } | ||
| }; | ||
| </script> | ||
| <script src="sorter.js"></script> | ||
| <script src="block-navigation.js"></script> | ||
| </body> | ||
| </html> |
| <!doctype html> | ||
| <html lang="en"> | ||
| <head> | ||
| <title>Code coverage report for deepFind.js</title> | ||
| <meta charset="utf-8" /> | ||
| <link rel="stylesheet" href="prettify.css" /> | ||
| <link rel="stylesheet" href="base.css" /> | ||
| <meta name="viewport" content="width=device-width, initial-scale=1"> | ||
| <style type='text/css'> | ||
| .coverage-summary .sorter { | ||
| background-image: url(sort-arrow-sprite.png); | ||
| } | ||
| </style> | ||
| </head> | ||
| <body> | ||
| <div class='wrapper'> | ||
| <div class='pad1'> | ||
| <h1> | ||
| <a href="index.html">All files</a> deepFind.js | ||
| </h1> | ||
| <div class='clearfix'> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Statements</span> | ||
| <span class='fraction'>10/10</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Branches</span> | ||
| <span class='fraction'>4/4</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Functions</span> | ||
| <span class='fraction'>2/2</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Lines</span> | ||
| <span class='fraction'>10/10</span> | ||
| </div> | ||
| </div> | ||
| <p class="quiet"> | ||
| Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block. | ||
| </p> | ||
| </div> | ||
| <div class='status-line high'></div> | ||
| <pre><table class="coverage"> | ||
| <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a> | ||
| <a name='L2'></a><a href='#L2'>2</a> | ||
| <a name='L3'></a><a href='#L3'>3</a> | ||
| <a name='L4'></a><a href='#L4'>4</a> | ||
| <a name='L5'></a><a href='#L5'>5</a> | ||
| <a name='L6'></a><a href='#L6'>6</a> | ||
| <a name='L7'></a><a href='#L7'>7</a> | ||
| <a name='L8'></a><a href='#L8'>8</a> | ||
| <a name='L9'></a><a href='#L9'>9</a> | ||
| <a name='L10'></a><a href='#L10'>10</a> | ||
| <a name='L11'></a><a href='#L11'>11</a> | ||
| <a name='L12'></a><a href='#L12'>12</a> | ||
| <a name='L13'></a><a href='#L13'>13</a> | ||
| <a name='L14'></a><a href='#L14'>14</a> | ||
| <a name='L15'></a><a href='#L15'>15</a> | ||
| <a name='L16'></a><a href='#L16'>16</a> | ||
| <a name='L17'></a><a href='#L17'>17</a> | ||
| <a name='L18'></a><a href='#L18'>18</a> | ||
| <a name='L19'></a><a href='#L19'>19</a> | ||
| <a name='L20'></a><a href='#L20'>20</a> | ||
| <a name='L21'></a><a href='#L21'>21</a> | ||
| <a name='L22'></a><a href='#L22'>22</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-yes">4x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">3x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import { Children } from 'react'; | ||
| import hasComplexChildren from './hasComplexChildren'; | ||
| | ||
| const deepFind = (children, deepFindFn) => { | ||
| let found; | ||
| Children.toArray(children).find((child) => { | ||
| if (hasComplexChildren(child)) { | ||
| // Find inside the child that has children | ||
| found = deepFind(child.props.children, deepFindFn); | ||
| return typeof found !== 'undefined'; | ||
| } | ||
| if (deepFindFn(child)) { | ||
| found = child; | ||
| return true; | ||
| } | ||
| return false; | ||
| }); | ||
| return found; | ||
| }; | ||
| | ||
| export default deepFind; | ||
| </pre></td></tr> | ||
| </table></pre> | ||
| <div class='push'></div><!-- for sticky footer --> | ||
| </div><!-- /wrapper --> | ||
| <div class='footer quiet pad2 space-top1 center small'> | ||
| Code coverage | ||
| generated by <a href="https://istanbul.js.org/" target="_blank">istanbul</a> at Sat Oct 05 2019 15:26:38 GMT+0100 (British Summer Time) | ||
| </div> | ||
| </div> | ||
| <script src="prettify.js"></script> | ||
| <script> | ||
| window.onload = function () { | ||
| if (typeof prettyPrint === 'function') { | ||
| prettyPrint(); | ||
| } | ||
| }; | ||
| </script> | ||
| <script src="sorter.js"></script> | ||
| <script src="block-navigation.js"></script> | ||
| </body> | ||
| </html> |
| <!doctype html> | ||
| <html lang="en"> | ||
| <head> | ||
| <title>Code coverage report for deepFind.ts</title> | ||
| <meta charset="utf-8" /> | ||
| <link rel="stylesheet" href="prettify.css" /> | ||
| <link rel="stylesheet" href="base.css" /> | ||
| <meta name="viewport" content="width=device-width, initial-scale=1"> | ||
| <style type='text/css'> | ||
| .coverage-summary .sorter { | ||
| background-image: url(sort-arrow-sprite.png); | ||
| } | ||
| </style> | ||
| </head> | ||
| <body> | ||
| <div class='wrapper'> | ||
| <div class='pad1'> | ||
| <h1> | ||
| <a href="index.html">All files</a> deepFind.ts | ||
| </h1> | ||
| <div class='clearfix'> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Statements</span> | ||
| <span class='fraction'>13/13</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Branches</span> | ||
| <span class='fraction'>4/4</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Functions</span> | ||
| <span class='fraction'>2/2</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Lines</span> | ||
| <span class='fraction'>13/13</span> | ||
| </div> | ||
| </div> | ||
| <p class="quiet"> | ||
| Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block. | ||
| </p> | ||
| </div> | ||
| <div class='status-line high'></div> | ||
| <pre><table class="coverage"> | ||
| <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a> | ||
| <a name='L2'></a><a href='#L2'>2</a> | ||
| <a name='L3'></a><a href='#L3'>3</a> | ||
| <a name='L4'></a><a href='#L4'>4</a> | ||
| <a name='L5'></a><a href='#L5'>5</a> | ||
| <a name='L6'></a><a href='#L6'>6</a> | ||
| <a name='L7'></a><a href='#L7'>7</a> | ||
| <a name='L8'></a><a href='#L8'>8</a> | ||
| <a name='L9'></a><a href='#L9'>9</a> | ||
| <a name='L10'></a><a href='#L10'>10</a> | ||
| <a name='L11'></a><a href='#L11'>11</a> | ||
| <a name='L12'></a><a href='#L12'>12</a> | ||
| <a name='L13'></a><a href='#L13'>13</a> | ||
| <a name='L14'></a><a href='#L14'>14</a> | ||
| <a name='L15'></a><a href='#L15'>15</a> | ||
| <a name='L16'></a><a href='#L16'>16</a> | ||
| <a name='L17'></a><a href='#L17'>17</a> | ||
| <a name='L18'></a><a href='#L18'>18</a> | ||
| <a name='L19'></a><a href='#L19'>19</a> | ||
| <a name='L20'></a><a href='#L20'>20</a> | ||
| <a name='L21'></a><a href='#L21'>21</a> | ||
| <a name='L22'></a><a href='#L22'>22</a> | ||
| <a name='L23'></a><a href='#L23'>23</a> | ||
| <a name='L24'></a><a href='#L24'>24</a> | ||
| <a name='L25'></a><a href='#L25'>25</a> | ||
| <a name='L26'></a><a href='#L26'>26</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">4x</span> | ||
| <span class="cline-any cline-yes">7x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">6x</span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">4x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">4x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import { Children, ReactNode, ReactElement } from 'react'; | ||
| import hasComplexChildren from './hasComplexChildren'; | ||
| | ||
| export interface FindFunction { | ||
| (child: ReactNode, index?: number, children?: ReactNode[]): ReactNode; | ||
| } | ||
| | ||
| const deepFind = (children: ReactNode, deepFindFn: FindFunction): ReactNode | undefined => { | ||
| let found; | ||
| Children.toArray(children).find((child) => { | ||
| if (hasComplexChildren(child)) { | ||
| // Find inside the child that has children | ||
| found = deepFind((child as ReactElement).props.children, deepFindFn); | ||
| return typeof found !== 'undefined'; | ||
| } | ||
| if (deepFindFn(child)) { | ||
| found = child; | ||
| return true; | ||
| } | ||
| return false; | ||
| }); | ||
| return found; | ||
| }; | ||
| | ||
| export default deepFind; | ||
| </pre></td></tr> | ||
| </table></pre> | ||
| <div class='push'></div><!-- for sticky footer --> | ||
| </div><!-- /wrapper --> | ||
| <div class='footer quiet pad2 space-top1 center small'> | ||
| Code coverage | ||
| generated by <a href="https://istanbul.js.org/" target="_blank">istanbul</a> at Thu Oct 10 2019 01:10:43 GMT+0100 (British Summer Time) | ||
| </div> | ||
| </div> | ||
| <script src="prettify.js"></script> | ||
| <script> | ||
| window.onload = function () { | ||
| if (typeof prettyPrint === 'function') { | ||
| prettyPrint(); | ||
| } | ||
| }; | ||
| </script> | ||
| <script src="sorter.js"></script> | ||
| <script src="block-navigation.js"></script> | ||
| </body> | ||
| </html> |
| <!doctype html> | ||
| <html lang="en"> | ||
| <head> | ||
| <title>Code coverage report for deepForEach.js</title> | ||
| <meta charset="utf-8" /> | ||
| <link rel="stylesheet" href="prettify.css" /> | ||
| <link rel="stylesheet" href="base.css" /> | ||
| <meta name="viewport" content="width=device-width, initial-scale=1"> | ||
| <style type='text/css'> | ||
| .coverage-summary .sorter { | ||
| background-image: url(sort-arrow-sprite.png); | ||
| } | ||
| </style> | ||
| </head> | ||
| <body> | ||
| <div class='wrapper'> | ||
| <div class='pad1'> | ||
| <h1> | ||
| <a href="index.html">All files</a> deepForEach.js | ||
| </h1> | ||
| <div class='clearfix'> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Statements</span> | ||
| <span class='fraction'>5/5</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Branches</span> | ||
| <span class='fraction'>2/2</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Functions</span> | ||
| <span class='fraction'>2/2</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Lines</span> | ||
| <span class='fraction'>5/5</span> | ||
| </div> | ||
| </div> | ||
| <p class="quiet"> | ||
| Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block. | ||
| </p> | ||
| </div> | ||
| <div class='status-line high'></div> | ||
| <pre><table class="coverage"> | ||
| <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a> | ||
| <a name='L2'></a><a href='#L2'>2</a> | ||
| <a name='L3'></a><a href='#L3'>3</a> | ||
| <a name='L4'></a><a href='#L4'>4</a> | ||
| <a name='L5'></a><a href='#L5'>5</a> | ||
| <a name='L6'></a><a href='#L6'>6</a> | ||
| <a name='L7'></a><a href='#L7'>7</a> | ||
| <a name='L8'></a><a href='#L8'>8</a> | ||
| <a name='L9'></a><a href='#L9'>9</a> | ||
| <a name='L10'></a><a href='#L10'>10</a> | ||
| <a name='L11'></a><a href='#L11'>11</a> | ||
| <a name='L12'></a><a href='#L12'>12</a> | ||
| <a name='L13'></a><a href='#L13'>13</a> | ||
| <a name='L14'></a><a href='#L14'>14</a> | ||
| <a name='L15'></a><a href='#L15'>15</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-yes">4x</span> | ||
| <span class="cline-any cline-yes">10x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">3x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">10x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import { Children } from 'react'; | ||
| import hasComplexChildren from './hasComplexChildren'; | ||
| | ||
| const deepForEach = (children, deepForEachFn) => { | ||
| Children.forEach(children, (child) => { | ||
| if (hasComplexChildren(child)) { | ||
| // Each inside the child that has children | ||
| deepForEach(child.props.children, deepForEachFn); | ||
| } | ||
| deepForEachFn(child); | ||
| }); | ||
| }; | ||
| | ||
| export default deepForEach; | ||
| </pre></td></tr> | ||
| </table></pre> | ||
| <div class='push'></div><!-- for sticky footer --> | ||
| </div><!-- /wrapper --> | ||
| <div class='footer quiet pad2 space-top1 center small'> | ||
| Code coverage | ||
| generated by <a href="https://istanbul.js.org/" target="_blank">istanbul</a> at Sat Oct 05 2019 20:03:25 GMT+0100 (British Summer Time) | ||
| </div> | ||
| </div> | ||
| <script src="prettify.js"></script> | ||
| <script> | ||
| window.onload = function () { | ||
| if (typeof prettyPrint === 'function') { | ||
| prettyPrint(); | ||
| } | ||
| }; | ||
| </script> | ||
| <script src="sorter.js"></script> | ||
| <script src="block-navigation.js"></script> | ||
| </body> | ||
| </html> |
| <!doctype html> | ||
| <html lang="en"> | ||
| <head> | ||
| <title>Code coverage report for deepForEach.ts</title> | ||
| <meta charset="utf-8" /> | ||
| <link rel="stylesheet" href="prettify.css" /> | ||
| <link rel="stylesheet" href="base.css" /> | ||
| <meta name="viewport" content="width=device-width, initial-scale=1"> | ||
| <style type='text/css'> | ||
| .coverage-summary .sorter { | ||
| background-image: url(sort-arrow-sprite.png); | ||
| } | ||
| </style> | ||
| </head> | ||
| <body> | ||
| <div class='wrapper'> | ||
| <div class='pad1'> | ||
| <h1> | ||
| <a href="index.html">All files</a> deepForEach.ts | ||
| </h1> | ||
| <div class='clearfix'> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Statements</span> | ||
| <span class='fraction'>8/8</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Branches</span> | ||
| <span class='fraction'>2/2</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Functions</span> | ||
| <span class='fraction'>2/2</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Lines</span> | ||
| <span class='fraction'>8/8</span> | ||
| </div> | ||
| </div> | ||
| <p class="quiet"> | ||
| Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block. | ||
| </p> | ||
| </div> | ||
| <div class='status-line high'></div> | ||
| <pre><table class="coverage"> | ||
| <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a> | ||
| <a name='L2'></a><a href='#L2'>2</a> | ||
| <a name='L3'></a><a href='#L3'>3</a> | ||
| <a name='L4'></a><a href='#L4'>4</a> | ||
| <a name='L5'></a><a href='#L5'>5</a> | ||
| <a name='L6'></a><a href='#L6'>6</a> | ||
| <a name='L7'></a><a href='#L7'>7</a> | ||
| <a name='L8'></a><a href='#L8'>8</a> | ||
| <a name='L9'></a><a href='#L9'>9</a> | ||
| <a name='L10'></a><a href='#L10'>10</a> | ||
| <a name='L11'></a><a href='#L11'>11</a> | ||
| <a name='L12'></a><a href='#L12'>12</a> | ||
| <a name='L13'></a><a href='#L13'>13</a> | ||
| <a name='L14'></a><a href='#L14'>14</a> | ||
| <a name='L15'></a><a href='#L15'>15</a> | ||
| <a name='L16'></a><a href='#L16'>16</a> | ||
| <a name='L17'></a><a href='#L17'>17</a> | ||
| <a name='L18'></a><a href='#L18'>18</a> | ||
| <a name='L19'></a><a href='#L19'>19</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-yes">6x</span> | ||
| <span class="cline-any cline-yes">11x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">3x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">11x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import { Children, ReactElement, ReactNode } from 'react'; | ||
| import hasComplexChildren from './hasComplexChildren'; | ||
| | ||
| export interface ForEachFunction { | ||
| (child: ReactNode, index?: number, children?: ReactNode[]): void; | ||
| } | ||
| | ||
| const deepForEach = (children: ReactNode, deepForEachFn: ForEachFunction): void => { | ||
| Children.forEach(children, (child) => { | ||
| if (hasComplexChildren(child)) { | ||
| // Each inside the child that has children | ||
| deepForEach((child as ReactElement).props.children, deepForEachFn); | ||
| } | ||
| deepForEachFn(child); | ||
| }); | ||
| }; | ||
| | ||
| export default deepForEach; | ||
| </pre></td></tr> | ||
| </table></pre> | ||
| <div class='push'></div><!-- for sticky footer --> | ||
| </div><!-- /wrapper --> | ||
| <div class='footer quiet pad2 space-top1 center small'> | ||
| Code coverage | ||
| generated by <a href="https://istanbul.js.org/" target="_blank">istanbul</a> at Thu Oct 10 2019 01:10:43 GMT+0100 (British Summer Time) | ||
| </div> | ||
| </div> | ||
| <script src="prettify.js"></script> | ||
| <script> | ||
| window.onload = function () { | ||
| if (typeof prettyPrint === 'function') { | ||
| prettyPrint(); | ||
| } | ||
| }; | ||
| </script> | ||
| <script src="sorter.js"></script> | ||
| <script src="block-navigation.js"></script> | ||
| </body> | ||
| </html> |
| <!doctype html> | ||
| <html lang="en"> | ||
| <head> | ||
| <title>Code coverage report for deepMap.js</title> | ||
| <meta charset="utf-8" /> | ||
| <link rel="stylesheet" href="prettify.css" /> | ||
| <link rel="stylesheet" href="base.css" /> | ||
| <meta name="viewport" content="width=device-width, initial-scale=1"> | ||
| <style type='text/css'> | ||
| .coverage-summary .sorter { | ||
| background-image: url(sort-arrow-sprite.png); | ||
| } | ||
| </style> | ||
| </head> | ||
| <body> | ||
| <div class='wrapper'> | ||
| <div class='pad1'> | ||
| <h1> | ||
| <a href="index.html">All files</a> deepMap.js | ||
| </h1> | ||
| <div class='clearfix'> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Statements</span> | ||
| <span class='fraction'>5/5</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Branches</span> | ||
| <span class='fraction'>2/2</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Functions</span> | ||
| <span class='fraction'>2/2</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Lines</span> | ||
| <span class='fraction'>5/5</span> | ||
| </div> | ||
| </div> | ||
| <p class="quiet"> | ||
| Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block. | ||
| </p> | ||
| </div> | ||
| <div class='status-line high'></div> | ||
| <pre><table class="coverage"> | ||
| <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a> | ||
| <a name='L2'></a><a href='#L2'>2</a> | ||
| <a name='L3'></a><a href='#L3'>3</a> | ||
| <a name='L4'></a><a href='#L4'>4</a> | ||
| <a name='L5'></a><a href='#L5'>5</a> | ||
| <a name='L6'></a><a href='#L6'>6</a> | ||
| <a name='L7'></a><a href='#L7'>7</a> | ||
| <a name='L8'></a><a href='#L8'>8</a> | ||
| <a name='L9'></a><a href='#L9'>9</a> | ||
| <a name='L10'></a><a href='#L10'>10</a> | ||
| <a name='L11'></a><a href='#L11'>11</a> | ||
| <a name='L12'></a><a href='#L12'>12</a> | ||
| <a name='L13'></a><a href='#L13'>13</a> | ||
| <a name='L14'></a><a href='#L14'>14</a> | ||
| <a name='L15'></a><a href='#L15'>15</a> | ||
| <a name='L16'></a><a href='#L16'>16</a> | ||
| <a name='L17'></a><a href='#L17'>17</a> | ||
| <a name='L18'></a><a href='#L18'>18</a> | ||
| <a name='L19'></a><a href='#L19'>19</a> | ||
| <a name='L20'></a><a href='#L20'>20</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-yes">4x</span> | ||
| <span class="cline-any cline-yes">10x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">3x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">7x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import { Children, cloneElement } from 'react'; | ||
| import hasComplexChildren from './hasComplexChildren'; | ||
| | ||
| const deepMap = (children, deepMapFn) => { | ||
| return Children.map(children, (child) => { | ||
| if (hasComplexChildren(child)) { | ||
| // Clone the child that has children and map them too | ||
| return deepMapFn( | ||
| cloneElement(child, { | ||
| ...child.props, | ||
| children: deepMap(child.props.children, deepMapFn), | ||
| }), | ||
| ); | ||
| } | ||
| return deepMapFn(child); | ||
| }); | ||
| }; | ||
| | ||
| export default deepMap; | ||
| </pre></td></tr> | ||
| </table></pre> | ||
| <div class='push'></div><!-- for sticky footer --> | ||
| </div><!-- /wrapper --> | ||
| <div class='footer quiet pad2 space-top1 center small'> | ||
| Code coverage | ||
| generated by <a href="https://istanbul.js.org/" target="_blank">istanbul</a> at Sat Oct 05 2019 20:17:43 GMT+0100 (British Summer Time) | ||
| </div> | ||
| </div> | ||
| <script src="prettify.js"></script> | ||
| <script> | ||
| window.onload = function () { | ||
| if (typeof prettyPrint === 'function') { | ||
| prettyPrint(); | ||
| } | ||
| }; | ||
| </script> | ||
| <script src="sorter.js"></script> | ||
| <script src="block-navigation.js"></script> | ||
| </body> | ||
| </html> |
| <!doctype html> | ||
| <html lang="en"> | ||
| <head> | ||
| <title>Code coverage report for deepMap.ts</title> | ||
| <meta charset="utf-8" /> | ||
| <link rel="stylesheet" href="prettify.css" /> | ||
| <link rel="stylesheet" href="base.css" /> | ||
| <meta name="viewport" content="width=device-width, initial-scale=1"> | ||
| <style type='text/css'> | ||
| .coverage-summary .sorter { | ||
| background-image: url(sort-arrow-sprite.png); | ||
| } | ||
| </style> | ||
| </head> | ||
| <body> | ||
| <div class='wrapper'> | ||
| <div class='pad1'> | ||
| <h1> | ||
| <a href="index.html">All files</a> deepMap.ts | ||
| </h1> | ||
| <div class='clearfix'> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Statements</span> | ||
| <span class='fraction'>8/8</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Branches</span> | ||
| <span class='fraction'>2/2</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Functions</span> | ||
| <span class='fraction'>2/2</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Lines</span> | ||
| <span class='fraction'>8/8</span> | ||
| </div> | ||
| </div> | ||
| <p class="quiet"> | ||
| Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block. | ||
| </p> | ||
| </div> | ||
| <div class='status-line high'></div> | ||
| <pre><table class="coverage"> | ||
| <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a> | ||
| <a name='L2'></a><a href='#L2'>2</a> | ||
| <a name='L3'></a><a href='#L3'>3</a> | ||
| <a name='L4'></a><a href='#L4'>4</a> | ||
| <a name='L5'></a><a href='#L5'>5</a> | ||
| <a name='L6'></a><a href='#L6'>6</a> | ||
| <a name='L7'></a><a href='#L7'>7</a> | ||
| <a name='L8'></a><a href='#L8'>8</a> | ||
| <a name='L9'></a><a href='#L9'>9</a> | ||
| <a name='L10'></a><a href='#L10'>10</a> | ||
| <a name='L11'></a><a href='#L11'>11</a> | ||
| <a name='L12'></a><a href='#L12'>12</a> | ||
| <a name='L13'></a><a href='#L13'>13</a> | ||
| <a name='L14'></a><a href='#L14'>14</a> | ||
| <a name='L15'></a><a href='#L15'>15</a> | ||
| <a name='L16'></a><a href='#L16'>16</a> | ||
| <a name='L17'></a><a href='#L17'>17</a> | ||
| <a name='L18'></a><a href='#L18'>18</a> | ||
| <a name='L19'></a><a href='#L19'>19</a> | ||
| <a name='L20'></a><a href='#L20'>20</a> | ||
| <a name='L21'></a><a href='#L21'>21</a> | ||
| <a name='L22'></a><a href='#L22'>22</a> | ||
| <a name='L23'></a><a href='#L23'>23</a> | ||
| <a name='L24'></a><a href='#L24'>24</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-yes">6x</span> | ||
| <span class="cline-any cline-yes">10x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">3x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">7x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import { Children, cloneElement, ReactElement, ReactNode } from 'react'; | ||
| import hasComplexChildren from './hasComplexChildren'; | ||
| | ||
| export interface MapFunction { | ||
| (child: ReactNode, index?: number, children?: ReactNode[]): ReactNode; | ||
| } | ||
| | ||
| const deepMap = (children: ReactNode, deepMapFn: MapFunction): ReactNode[] => { | ||
| return Children.map(children, (child) => { | ||
| if (hasComplexChildren(child)) { | ||
| // Clone the child that has children and map them too | ||
| return deepMapFn( | ||
| cloneElement(child as ReactElement, { | ||
| ...(child as ReactElement).props, | ||
| children: deepMap((child as ReactElement).props.children, deepMapFn), | ||
| }), | ||
| ); | ||
| } | ||
| return deepMapFn(child); | ||
| }); | ||
| }; | ||
| | ||
| export default deepMap; | ||
| </pre></td></tr> | ||
| </table></pre> | ||
| <div class='push'></div><!-- for sticky footer --> | ||
| </div><!-- /wrapper --> | ||
| <div class='footer quiet pad2 space-top1 center small'> | ||
| Code coverage | ||
| generated by <a href="https://istanbul.js.org/" target="_blank">istanbul</a> at Thu Oct 10 2019 01:10:43 GMT+0100 (British Summer Time) | ||
| </div> | ||
| </div> | ||
| <script src="prettify.js"></script> | ||
| <script> | ||
| window.onload = function () { | ||
| if (typeof prettyPrint === 'function') { | ||
| prettyPrint(); | ||
| } | ||
| }; | ||
| </script> | ||
| <script src="sorter.js"></script> | ||
| <script src="block-navigation.js"></script> | ||
| </body> | ||
| </html> |
| <!doctype html> | ||
| <html lang="en"> | ||
| <head> | ||
| <title>Code coverage report for filter.js</title> | ||
| <meta charset="utf-8" /> | ||
| <link rel="stylesheet" href="prettify.css" /> | ||
| <link rel="stylesheet" href="base.css" /> | ||
| <meta name="viewport" content="width=device-width, initial-scale=1"> | ||
| <style type='text/css'> | ||
| .coverage-summary .sorter { | ||
| background-image: url(sort-arrow-sprite.png); | ||
| } | ||
| </style> | ||
| </head> | ||
| <body> | ||
| <div class='wrapper'> | ||
| <div class='pad1'> | ||
| <h1> | ||
| <a href="index.html">All files</a> filter.js | ||
| </h1> | ||
| <div class='clearfix'> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Statements</span> | ||
| <span class='fraction'>2/2</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Branches</span> | ||
| <span class='fraction'>0/0</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Functions</span> | ||
| <span class='fraction'>1/1</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Lines</span> | ||
| <span class='fraction'>2/2</span> | ||
| </div> | ||
| </div> | ||
| <p class="quiet"> | ||
| Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block. | ||
| </p> | ||
| </div> | ||
| <div class='status-line high'></div> | ||
| <pre><table class="coverage"> | ||
| <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a> | ||
| <a name='L2'></a><a href='#L2'>2</a> | ||
| <a name='L3'></a><a href='#L3'>3</a> | ||
| <a name='L4'></a><a href='#L4'>4</a> | ||
| <a name='L5'></a><a href='#L5'>5</a> | ||
| <a name='L6'></a><a href='#L6'>6</a> | ||
| <a name='L7'></a><a href='#L7'>7</a> | ||
| <a name='L8'></a><a href='#L8'>8</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-yes">4x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import { Children } from 'react'; | ||
| | ||
| const filter = (children, filterFn) => { | ||
| return Children.toArray(children).filter(filterFn); | ||
| }; | ||
| | ||
| export default filter; | ||
| </pre></td></tr> | ||
| </table></pre> | ||
| <div class='push'></div><!-- for sticky footer --> | ||
| </div><!-- /wrapper --> | ||
| <div class='footer quiet pad2 space-top1 center small'> | ||
| Code coverage | ||
| generated by <a href="https://istanbul.js.org/" target="_blank">istanbul</a> at Wed Oct 02 2019 21:13:24 GMT+0100 (British Summer Time) | ||
| </div> | ||
| </div> | ||
| <script src="prettify.js"></script> | ||
| <script> | ||
| window.onload = function () { | ||
| if (typeof prettyPrint === 'function') { | ||
| prettyPrint(); | ||
| } | ||
| }; | ||
| </script> | ||
| <script src="sorter.js"></script> | ||
| <script src="block-navigation.js"></script> | ||
| </body> | ||
| </html> |
| <!doctype html> | ||
| <html lang="en"> | ||
| <head> | ||
| <title>Code coverage report for filter.ts</title> | ||
| <meta charset="utf-8" /> | ||
| <link rel="stylesheet" href="prettify.css" /> | ||
| <link rel="stylesheet" href="base.css" /> | ||
| <meta name="viewport" content="width=device-width, initial-scale=1"> | ||
| <style type='text/css'> | ||
| .coverage-summary .sorter { | ||
| background-image: url(sort-arrow-sprite.png); | ||
| } | ||
| </style> | ||
| </head> | ||
| <body> | ||
| <div class='wrapper'> | ||
| <div class='pad1'> | ||
| <h1> | ||
| <a href="index.html">All files</a> filter.ts | ||
| </h1> | ||
| <div class='clearfix'> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Statements</span> | ||
| <span class='fraction'>4/4</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Branches</span> | ||
| <span class='fraction'>0/0</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Functions</span> | ||
| <span class='fraction'>1/1</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Lines</span> | ||
| <span class='fraction'>4/4</span> | ||
| </div> | ||
| </div> | ||
| <p class="quiet"> | ||
| Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block. | ||
| </p> | ||
| </div> | ||
| <div class='status-line high'></div> | ||
| <pre><table class="coverage"> | ||
| <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a> | ||
| <a name='L2'></a><a href='#L2'>2</a> | ||
| <a name='L3'></a><a href='#L3'>3</a> | ||
| <a name='L4'></a><a href='#L4'>4</a> | ||
| <a name='L5'></a><a href='#L5'>5</a> | ||
| <a name='L6'></a><a href='#L6'>6</a> | ||
| <a name='L7'></a><a href='#L7'>7</a> | ||
| <a name='L8'></a><a href='#L8'>8</a> | ||
| <a name='L9'></a><a href='#L9'>9</a> | ||
| <a name='L10'></a><a href='#L10'>10</a> | ||
| <a name='L11'></a><a href='#L11'>11</a> | ||
| <a name='L12'></a><a href='#L12'>12</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-yes">4x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import { Children, ReactNode } from 'react'; | ||
| | ||
| export interface FilterFunction { | ||
| (child: ReactNode, index?: number, children?: ReactNode[]): boolean; | ||
| } | ||
| | ||
| const filter = (children: ReactNode, filterFn: FilterFunction): ReactNode[] => { | ||
| return Children.toArray(children).filter(filterFn); | ||
| }; | ||
| | ||
| export default filter; | ||
| </pre></td></tr> | ||
| </table></pre> | ||
| <div class='push'></div><!-- for sticky footer --> | ||
| </div><!-- /wrapper --> | ||
| <div class='footer quiet pad2 space-top1 center small'> | ||
| Code coverage | ||
| generated by <a href="https://istanbul.js.org/" target="_blank">istanbul</a> at Thu Oct 10 2019 01:10:43 GMT+0100 (British Summer Time) | ||
| </div> | ||
| </div> | ||
| <script src="prettify.js"></script> | ||
| <script> | ||
| window.onload = function () { | ||
| if (typeof prettyPrint === 'function') { | ||
| prettyPrint(); | ||
| } | ||
| }; | ||
| </script> | ||
| <script src="sorter.js"></script> | ||
| <script src="block-navigation.js"></script> | ||
| </body> | ||
| </html> |
| <!doctype html> | ||
| <html lang="en"> | ||
| <head> | ||
| <title>Code coverage report for groupByType.js</title> | ||
| <meta charset="utf-8" /> | ||
| <link rel="stylesheet" href="prettify.css" /> | ||
| <link rel="stylesheet" href="base.css" /> | ||
| <meta name="viewport" content="width=device-width, initial-scale=1"> | ||
| <style type='text/css'> | ||
| .coverage-summary .sorter { | ||
| background-image: url(sort-arrow-sprite.png); | ||
| } | ||
| </style> | ||
| </head> | ||
| <body> | ||
| <div class='wrapper'> | ||
| <div class='pad1'> | ||
| <h1> | ||
| <a href="index.html">All files</a> groupByType.js | ||
| </h1> | ||
| <div class='clearfix'> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Statements</span> | ||
| <span class='fraction'>6/6</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Branches</span> | ||
| <span class='fraction'>6/6</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Functions</span> | ||
| <span class='fraction'>2/2</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Lines</span> | ||
| <span class='fraction'>6/6</span> | ||
| </div> | ||
| </div> | ||
| <p class="quiet"> | ||
| Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block. | ||
| </p> | ||
| </div> | ||
| <div class='status-line high'></div> | ||
| <pre><table class="coverage"> | ||
| <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a> | ||
| <a name='L2'></a><a href='#L2'>2</a> | ||
| <a name='L3'></a><a href='#L3'>3</a> | ||
| <a name='L4'></a><a href='#L4'>4</a> | ||
| <a name='L5'></a><a href='#L5'>5</a> | ||
| <a name='L6'></a><a href='#L6'>6</a> | ||
| <a name='L7'></a><a href='#L7'>7</a> | ||
| <a name='L8'></a><a href='#L8'>8</a> | ||
| <a name='L9'></a><a href='#L9'>9</a> | ||
| <a name='L10'></a><a href='#L10'>10</a> | ||
| <a name='L11'></a><a href='#L11'>11</a> | ||
| <a name='L12'></a><a href='#L12'>12</a> | ||
| <a name='L13'></a><a href='#L13'>13</a> | ||
| <a name='L14'></a><a href='#L14'>14</a> | ||
| <a name='L15'></a><a href='#L15'>15</a> | ||
| <a name='L16'></a><a href='#L16'>16</a> | ||
| <a name='L17'></a><a href='#L17'>17</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-yes">3x</span> | ||
| <span class="cline-any cline-yes">9x</span> | ||
| <span class="cline-any cline-yes">9x</span> | ||
| <span class="cline-any cline-yes">9x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">9x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import { Children } from 'react'; | ||
| | ||
| const groupByType = (children, types, rest) => { | ||
| return Children.toArray(children).reduce((group, child) => { | ||
| const isGrouped = types.includes(child.type); | ||
| const addChild = isGrouped ? child.props.children : child; | ||
| const key = isGrouped ? child.type : rest; | ||
| | ||
| return { | ||
| ...group, | ||
| [key]: [...(group[key] || []), addChild], | ||
| }; | ||
| }, {}); | ||
| }; | ||
| | ||
| export default groupByType; | ||
| </pre></td></tr> | ||
| </table></pre> | ||
| <div class='push'></div><!-- for sticky footer --> | ||
| </div><!-- /wrapper --> | ||
| <div class='footer quiet pad2 space-top1 center small'> | ||
| Code coverage | ||
| generated by <a href="https://istanbul.js.org/" target="_blank">istanbul</a> at Sun Oct 06 2019 01:25:51 GMT+0100 (British Summer Time) | ||
| </div> | ||
| </div> | ||
| <script src="prettify.js"></script> | ||
| <script> | ||
| window.onload = function () { | ||
| if (typeof prettyPrint === 'function') { | ||
| prettyPrint(); | ||
| } | ||
| }; | ||
| </script> | ||
| <script src="sorter.js"></script> | ||
| <script src="block-navigation.js"></script> | ||
| </body> | ||
| </html> |
| <!doctype html> | ||
| <html lang="en"> | ||
| <head> | ||
| <title>Code coverage report for groupByType.ts</title> | ||
| <meta charset="utf-8" /> | ||
| <link rel="stylesheet" href="prettify.css" /> | ||
| <link rel="stylesheet" href="base.css" /> | ||
| <meta name="viewport" content="width=device-width, initial-scale=1"> | ||
| <style type='text/css'> | ||
| .coverage-summary .sorter { | ||
| background-image: url(sort-arrow-sprite.png); | ||
| } | ||
| </style> | ||
| </head> | ||
| <body> | ||
| <div class='wrapper'> | ||
| <div class='pad1'> | ||
| <h1> | ||
| <a href="index.html">All files</a> groupByType.ts | ||
| </h1> | ||
| <div class='clearfix'> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">90.91% </span> | ||
| <span class="quiet">Statements</span> | ||
| <span class='fraction'>10/11</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">75% </span> | ||
| <span class="quiet">Branches</span> | ||
| <span class='fraction'>9/12</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Functions</span> | ||
| <span class='fraction'>2/2</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">90.91% </span> | ||
| <span class="quiet">Lines</span> | ||
| <span class='fraction'>10/11</span> | ||
| </div> | ||
| </div> | ||
| <p class="quiet"> | ||
| Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block. | ||
| </p> | ||
| </div> | ||
| <div class='status-line high'></div> | ||
| <pre><table class="coverage"> | ||
| <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a> | ||
| <a name='L2'></a><a href='#L2'>2</a> | ||
| <a name='L3'></a><a href='#L3'>3</a> | ||
| <a name='L4'></a><a href='#L4'>4</a> | ||
| <a name='L5'></a><a href='#L5'>5</a> | ||
| <a name='L6'></a><a href='#L6'>6</a> | ||
| <a name='L7'></a><a href='#L7'>7</a> | ||
| <a name='L8'></a><a href='#L8'>8</a> | ||
| <a name='L9'></a><a href='#L9'>9</a> | ||
| <a name='L10'></a><a href='#L10'>10</a> | ||
| <a name='L11'></a><a href='#L11'>11</a> | ||
| <a name='L12'></a><a href='#L12'>12</a> | ||
| <a name='L13'></a><a href='#L13'>13</a> | ||
| <a name='L14'></a><a href='#L14'>14</a> | ||
| <a name='L15'></a><a href='#L15'>15</a> | ||
| <a name='L16'></a><a href='#L16'>16</a> | ||
| <a name='L17'></a><a href='#L17'>17</a> | ||
| <a name='L18'></a><a href='#L18'>18</a> | ||
| <a name='L19'></a><a href='#L19'>19</a> | ||
| <a name='L20'></a><a href='#L20'>20</a> | ||
| <a name='L21'></a><a href='#L21'>21</a> | ||
| <a name='L22'></a><a href='#L22'>22</a> | ||
| <a name='L23'></a><a href='#L23'>23</a> | ||
| <a name='L24'></a><a href='#L24'>24</a> | ||
| <a name='L25'></a><a href='#L25'>25</a> | ||
| <a name='L26'></a><a href='#L26'>26</a> | ||
| <a name='L27'></a><a href='#L27'>27</a> | ||
| <a name='L28'></a><a href='#L28'>28</a> | ||
| <a name='L29'></a><a href='#L29'>29</a> | ||
| <a name='L30'></a><a href='#L30'>30</a> | ||
| <a name='L31'></a><a href='#L31'>31</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">3x</span> | ||
| <span class="cline-any cline-yes">9x</span> | ||
| <span class="cline-any cline-yes">9x</span> | ||
| <span class="cline-any cline-yes">9x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">9x</span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">9x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">9x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import { Children, isValidElement, ReactNode, ReactElement } from 'react'; | ||
| | ||
| export interface GroupedChildren { | ||
| [name: string]: ReactNode[]; | ||
| } | ||
| | ||
| const groupByType = ( | ||
| children: ReactNode, | ||
| types: ReactNode[] = <span class="branch-0 cbranch-no" title="branch not covered" >[],</span> | ||
| rest = <span class="branch-0 cbranch-no" title="branch not covered" >'rest',</span> | ||
| ): GroupedChildren => { | ||
| return Children.toArray(children).reduce((groups: GroupedChildren, child: ReactNode) => { | ||
| const isGrouped = isValidElement(child) && types.includes(child.type); | ||
| const addChild = isGrouped ? (child as ReactElement).props.children : child; | ||
| const key = isGrouped ? (child as ReactElement).type : rest; | ||
| | ||
| <span class="missing-if-branch" title="if path not taken" >I</span>if (typeof key !== 'string') { | ||
| <span class="cstat-no" title="statement not covered" > return groups;</span> | ||
| } | ||
| | ||
| const group = groups[key]; | ||
| | ||
| return { | ||
| ...groups, | ||
| [key]: [...(group || []), addChild], | ||
| }; | ||
| }, {}); | ||
| }; | ||
| | ||
| export default groupByType; | ||
| </pre></td></tr> | ||
| </table></pre> | ||
| <div class='push'></div><!-- for sticky footer --> | ||
| </div><!-- /wrapper --> | ||
| <div class='footer quiet pad2 space-top1 center small'> | ||
| Code coverage | ||
| generated by <a href="https://istanbul.js.org/" target="_blank">istanbul</a> at Thu Oct 10 2019 01:10:43 GMT+0100 (British Summer Time) | ||
| </div> | ||
| </div> | ||
| <script src="prettify.js"></script> | ||
| <script> | ||
| window.onload = function () { | ||
| if (typeof prettyPrint === 'function') { | ||
| prettyPrint(); | ||
| } | ||
| }; | ||
| </script> | ||
| <script src="sorter.js"></script> | ||
| <script src="block-navigation.js"></script> | ||
| </body> | ||
| </html> |
| <!doctype html> | ||
| <html lang="en"> | ||
| <head> | ||
| <title>Code coverage report for hasChildren.js</title> | ||
| <meta charset="utf-8" /> | ||
| <link rel="stylesheet" href="prettify.css" /> | ||
| <link rel="stylesheet" href="base.css" /> | ||
| <meta name="viewport" content="width=device-width, initial-scale=1"> | ||
| <style type='text/css'> | ||
| .coverage-summary .sorter { | ||
| background-image: url(sort-arrow-sprite.png); | ||
| } | ||
| </style> | ||
| </head> | ||
| <body> | ||
| <div class='wrapper'> | ||
| <div class='pad1'> | ||
| <h1> | ||
| <a href="index.html">All files</a> hasChildren.js | ||
| </h1> | ||
| <div class='clearfix'> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Statements</span> | ||
| <span class='fraction'>2/2</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Branches</span> | ||
| <span class='fraction'>3/3</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Functions</span> | ||
| <span class='fraction'>1/1</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Lines</span> | ||
| <span class='fraction'>1/1</span> | ||
| </div> | ||
| </div> | ||
| <p class="quiet"> | ||
| Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block. | ||
| </p> | ||
| </div> | ||
| <div class='status-line high'></div> | ||
| <pre><table class="coverage"> | ||
| <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a> | ||
| <a name='L2'></a><a href='#L2'>2</a> | ||
| <a name='L3'></a><a href='#L3'>3</a> | ||
| <a name='L4'></a><a href='#L4'>4</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">38x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">const hasChildren = (child) => Boolean(child && child.props && child.props.children); | ||
| | ||
| export default hasChildren; | ||
| </pre></td></tr> | ||
| </table></pre> | ||
| <div class='push'></div><!-- for sticky footer --> | ||
| </div><!-- /wrapper --> | ||
| <div class='footer quiet pad2 space-top1 center small'> | ||
| Code coverage | ||
| generated by <a href="https://istanbul.js.org/" target="_blank">istanbul</a> at Wed Oct 02 2019 23:20:20 GMT+0100 (British Summer Time) | ||
| </div> | ||
| </div> | ||
| <script src="prettify.js"></script> | ||
| <script> | ||
| window.onload = function () { | ||
| if (typeof prettyPrint === 'function') { | ||
| prettyPrint(); | ||
| } | ||
| }; | ||
| </script> | ||
| <script src="sorter.js"></script> | ||
| <script src="block-navigation.js"></script> | ||
| </body> | ||
| </html> |
| <!doctype html> | ||
| <html lang="en"> | ||
| <head> | ||
| <title>Code coverage report for hasChildren.ts</title> | ||
| <meta charset="utf-8" /> | ||
| <link rel="stylesheet" href="prettify.css" /> | ||
| <link rel="stylesheet" href="base.css" /> | ||
| <meta name="viewport" content="width=device-width, initial-scale=1"> | ||
| <style type='text/css'> | ||
| .coverage-summary .sorter { | ||
| background-image: url(sort-arrow-sprite.png); | ||
| } | ||
| </style> | ||
| </head> | ||
| <body> | ||
| <div class='wrapper'> | ||
| <div class='pad1'> | ||
| <h1> | ||
| <a href="index.html">All files</a> hasChildren.ts | ||
| </h1> | ||
| <div class='clearfix'> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Statements</span> | ||
| <span class='fraction'>3/3</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Branches</span> | ||
| <span class='fraction'>3/3</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Functions</span> | ||
| <span class='fraction'>1/1</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Lines</span> | ||
| <span class='fraction'>3/3</span> | ||
| </div> | ||
| </div> | ||
| <p class="quiet"> | ||
| Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block. | ||
| </p> | ||
| </div> | ||
| <div class='status-line high'></div> | ||
| <pre><table class="coverage"> | ||
| <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a> | ||
| <a name='L2'></a><a href='#L2'>2</a> | ||
| <a name='L3'></a><a href='#L3'>3</a> | ||
| <a name='L4'></a><a href='#L4'>4</a> | ||
| <a name='L5'></a><a href='#L5'>5</a> | ||
| <a name='L6'></a><a href='#L6'>6</a> | ||
| <a name='L7'></a><a href='#L7'>7</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">8x</span> | ||
| <span class="cline-any cline-yes">77x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">8x</span> | ||
| <span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import { ReactNode, ReactElement } from 'react'; | ||
| | ||
| const hasChildren = (child: ReactNode): boolean => | ||
| Boolean(child && (child as ReactElement).props && (child as ReactElement).props.children); | ||
| | ||
| export default hasChildren; | ||
| </pre></td></tr> | ||
| </table></pre> | ||
| <div class='push'></div><!-- for sticky footer --> | ||
| </div><!-- /wrapper --> | ||
| <div class='footer quiet pad2 space-top1 center small'> | ||
| Code coverage | ||
| generated by <a href="https://istanbul.js.org/" target="_blank">istanbul</a> at Thu Oct 10 2019 01:10:43 GMT+0100 (British Summer Time) | ||
| </div> | ||
| </div> | ||
| <script src="prettify.js"></script> | ||
| <script> | ||
| window.onload = function () { | ||
| if (typeof prettyPrint === 'function') { | ||
| prettyPrint(); | ||
| } | ||
| }; | ||
| </script> | ||
| <script src="sorter.js"></script> | ||
| <script src="block-navigation.js"></script> | ||
| </body> | ||
| </html> |
| <!doctype html> | ||
| <html lang="en"> | ||
| <head> | ||
| <title>Code coverage report for hasComplexChildren.js</title> | ||
| <meta charset="utf-8" /> | ||
| <link rel="stylesheet" href="prettify.css" /> | ||
| <link rel="stylesheet" href="base.css" /> | ||
| <meta name="viewport" content="width=device-width, initial-scale=1"> | ||
| <style type='text/css'> | ||
| .coverage-summary .sorter { | ||
| background-image: url(sort-arrow-sprite.png); | ||
| } | ||
| </style> | ||
| </head> | ||
| <body> | ||
| <div class='wrapper'> | ||
| <div class='pad1'> | ||
| <h1> | ||
| <a href="index.html">All files</a> hasComplexChildren.js | ||
| </h1> | ||
| <div class='clearfix'> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Statements</span> | ||
| <span class='fraction'>2/2</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Branches</span> | ||
| <span class='fraction'>2/2</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Functions</span> | ||
| <span class='fraction'>1/1</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Lines</span> | ||
| <span class='fraction'>2/2</span> | ||
| </div> | ||
| </div> | ||
| <p class="quiet"> | ||
| Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block. | ||
| </p> | ||
| </div> | ||
| <div class='status-line high'></div> | ||
| <pre><table class="coverage"> | ||
| <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a> | ||
| <a name='L2'></a><a href='#L2'>2</a> | ||
| <a name='L3'></a><a href='#L3'>3</a> | ||
| <a name='L4'></a><a href='#L4'>4</a> | ||
| <a name='L5'></a><a href='#L5'>5</a> | ||
| <a name='L6'></a><a href='#L6'>6</a> | ||
| <a name='L7'></a><a href='#L7'>7</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">5x</span> | ||
| <span class="cline-any cline-yes">29x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import hasChildren from './hasChildren'; | ||
| | ||
| const hasComplexChildren = (child) => | ||
| hasChildren(child) && typeof child.props.children === 'object'; | ||
| | ||
| export default hasComplexChildren; | ||
| </pre></td></tr> | ||
| </table></pre> | ||
| <div class='push'></div><!-- for sticky footer --> | ||
| </div><!-- /wrapper --> | ||
| <div class='footer quiet pad2 space-top1 center small'> | ||
| Code coverage | ||
| generated by <a href="https://istanbul.js.org/" target="_blank">istanbul</a> at Sat Oct 05 2019 15:18:21 GMT+0100 (British Summer Time) | ||
| </div> | ||
| </div> | ||
| <script src="prettify.js"></script> | ||
| <script> | ||
| window.onload = function () { | ||
| if (typeof prettyPrint === 'function') { | ||
| prettyPrint(); | ||
| } | ||
| }; | ||
| </script> | ||
| <script src="sorter.js"></script> | ||
| <script src="block-navigation.js"></script> | ||
| </body> | ||
| </html> |
| <!doctype html> | ||
| <html lang="en"> | ||
| <head> | ||
| <title>Code coverage report for hasComplexChildren.ts</title> | ||
| <meta charset="utf-8" /> | ||
| <link rel="stylesheet" href="prettify.css" /> | ||
| <link rel="stylesheet" href="base.css" /> | ||
| <meta name="viewport" content="width=device-width, initial-scale=1"> | ||
| <style type='text/css'> | ||
| .coverage-summary .sorter { | ||
| background-image: url(sort-arrow-sprite.png); | ||
| } | ||
| </style> | ||
| </head> | ||
| <body> | ||
| <div class='wrapper'> | ||
| <div class='pad1'> | ||
| <h1> | ||
| <a href="index.html">All files</a> hasComplexChildren.ts | ||
| </h1> | ||
| <div class='clearfix'> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Statements</span> | ||
| <span class='fraction'>6/6</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Branches</span> | ||
| <span class='fraction'>4/4</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Functions</span> | ||
| <span class='fraction'>2/2</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Lines</span> | ||
| <span class='fraction'>6/6</span> | ||
| </div> | ||
| </div> | ||
| <p class="quiet"> | ||
| Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block. | ||
| </p> | ||
| </div> | ||
| <div class='status-line high'></div> | ||
| <pre><table class="coverage"> | ||
| <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a> | ||
| <a name='L2'></a><a href='#L2'>2</a> | ||
| <a name='L3'></a><a href='#L3'>3</a> | ||
| <a name='L4'></a><a href='#L4'>4</a> | ||
| <a name='L5'></a><a href='#L5'>5</a> | ||
| <a name='L6'></a><a href='#L6'>6</a> | ||
| <a name='L7'></a><a href='#L7'>7</a> | ||
| <a name='L8'></a><a href='#L8'>8</a> | ||
| <a name='L9'></a><a href='#L9'>9</a> | ||
| <a name='L10'></a><a href='#L10'>10</a> | ||
| <a name='L11'></a><a href='#L11'>11</a> | ||
| <a name='L12'></a><a href='#L12'>12</a> | ||
| <a name='L13'></a><a href='#L13'>13</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">6x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">6x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">6x</span> | ||
| <span class="cline-any cline-yes">50x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">52x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">6x</span> | ||
| <span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import { Children, isValidElement, ReactNode, ReactElement } from 'react'; | ||
| | ||
| import hasChildren from './hasChildren'; | ||
| | ||
| const hasComplexChildren = (element: ReactNode): boolean => | ||
| hasChildren(element) && | ||
| Children.toArray((element as ReactElement).props.children).reduce( | ||
| (response: boolean, child: ReactNode) => response || isValidElement(child), | ||
| false, | ||
| ); | ||
| | ||
| export default hasComplexChildren; | ||
| </pre></td></tr> | ||
| </table></pre> | ||
| <div class='push'></div><!-- for sticky footer --> | ||
| </div><!-- /wrapper --> | ||
| <div class='footer quiet pad2 space-top1 center small'> | ||
| Code coverage | ||
| generated by <a href="https://istanbul.js.org/" target="_blank">istanbul</a> at Thu Oct 10 2019 01:10:43 GMT+0100 (British Summer Time) | ||
| </div> | ||
| </div> | ||
| <script src="prettify.js"></script> | ||
| <script> | ||
| window.onload = function () { | ||
| if (typeof prettyPrint === 'function') { | ||
| prettyPrint(); | ||
| } | ||
| }; | ||
| </script> | ||
| <script src="sorter.js"></script> | ||
| <script src="block-navigation.js"></script> | ||
| </body> | ||
| </html> |
| <!doctype html> | ||
| <html lang="en"> | ||
| <head> | ||
| <title>Code coverage report for All files</title> | ||
| <meta charset="utf-8" /> | ||
| <link rel="stylesheet" href="prettify.css" /> | ||
| <link rel="stylesheet" href="base.css" /> | ||
| <meta name="viewport" content="width=device-width, initial-scale=1"> | ||
| <style type='text/css'> | ||
| .coverage-summary .sorter { | ||
| background-image: url(sort-arrow-sprite.png); | ||
| } | ||
| </style> | ||
| </head> | ||
| <body> | ||
| <div class='wrapper'> | ||
| <div class='pad1'> | ||
| <h1> | ||
| All files | ||
| </h1> | ||
| <div class='clearfix'> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">97.75% </span> | ||
| <span class="quiet">Statements</span> | ||
| <span class='fraction'>87/89</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">87.88% </span> | ||
| <span class="quiet">Branches</span> | ||
| <span class='fraction'>29/33</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Functions</span> | ||
| <span class='fraction'>16/16</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">97.75% </span> | ||
| <span class="quiet">Lines</span> | ||
| <span class='fraction'>87/89</span> | ||
| </div> | ||
| </div> | ||
| <p class="quiet"> | ||
| Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block. | ||
| </p> | ||
| </div> | ||
| <div class='status-line high'></div> | ||
| <div class="pad1"> | ||
| <table class="coverage-summary"> | ||
| <thead> | ||
| <tr> | ||
| <th data-col="file" data-fmt="html" data-html="true" class="file">File</th> | ||
| <th data-col="pic" data-type="number" data-fmt="html" data-html="true" class="pic"></th> | ||
| <th data-col="statements" data-type="number" data-fmt="pct" class="pct">Statements</th> | ||
| <th data-col="statements_raw" data-type="number" data-fmt="html" class="abs"></th> | ||
| <th data-col="branches" data-type="number" data-fmt="pct" class="pct">Branches</th> | ||
| <th data-col="branches_raw" data-type="number" data-fmt="html" class="abs"></th> | ||
| <th data-col="functions" data-type="number" data-fmt="pct" class="pct">Functions</th> | ||
| <th data-col="functions_raw" data-type="number" data-fmt="html" class="abs"></th> | ||
| <th data-col="lines" data-type="number" data-fmt="pct" class="pct">Lines</th> | ||
| <th data-col="lines_raw" data-type="number" data-fmt="html" class="abs"></th> | ||
| </tr> | ||
| </thead> | ||
| <tbody><tr> | ||
| <td class="file high" data-value="src"><a href="src/index.html">src</a></td> | ||
| <td data-value="100" class="pic high"><div class="chart"><div class="cover-fill cover-full" style="width: 100%;"></div><div class="cover-empty" style="width:0%;"></div></div></td> | ||
| <td data-value="100" class="pct high">100%</td> | ||
| <td data-value="20" class="abs high">20/20</td> | ||
| <td data-value="100" class="pct high">100%</td> | ||
| <td data-value="0" class="abs high">0/0</td> | ||
| <td data-value="100" class="pct high">100%</td> | ||
| <td data-value="0" class="abs high">0/0</td> | ||
| <td data-value="100" class="pct high">100%</td> | ||
| <td data-value="20" class="abs high">20/20</td> | ||
| </tr> | ||
| <tr> | ||
| <td class="file high" data-value="src/lib"><a href="src/lib/index.html">src/lib</a></td> | ||
| <td data-value="97.1" class="pic high"><div class="chart"><div class="cover-fill" style="width: 97%;"></div><div class="cover-empty" style="width:3%;"></div></div></td> | ||
| <td data-value="97.1" class="pct high">97.1%</td> | ||
| <td data-value="69" class="abs high">67/69</td> | ||
| <td data-value="87.88" class="pct high">87.88%</td> | ||
| <td data-value="33" class="abs high">29/33</td> | ||
| <td data-value="100" class="pct high">100%</td> | ||
| <td data-value="16" class="abs high">16/16</td> | ||
| <td data-value="97.1" class="pct high">97.1%</td> | ||
| <td data-value="69" class="abs high">67/69</td> | ||
| </tr> | ||
| </tbody> | ||
| </table> | ||
| </div><div class='push'></div><!-- for sticky footer --> | ||
| </div><!-- /wrapper --> | ||
| <div class='footer quiet pad2 space-top1 center small'> | ||
| Code coverage | ||
| generated by <a href="https://istanbul.js.org/" target="_blank">istanbul</a> at Mon Oct 14 2019 07:10:02 GMT+0100 (British Summer Time) | ||
| </div> | ||
| </div> | ||
| <script src="prettify.js"></script> | ||
| <script> | ||
| window.onload = function () { | ||
| if (typeof prettyPrint === 'function') { | ||
| prettyPrint(); | ||
| } | ||
| }; | ||
| </script> | ||
| <script src="sorter.js"></script> | ||
| <script src="block-navigation.js"></script> | ||
| </body> | ||
| </html> |
| <!doctype html> | ||
| <html lang="en"> | ||
| <head> | ||
| <title>Code coverage report for index.js</title> | ||
| <meta charset="utf-8" /> | ||
| <link rel="stylesheet" href="prettify.css" /> | ||
| <link rel="stylesheet" href="base.css" /> | ||
| <meta name="viewport" content="width=device-width, initial-scale=1"> | ||
| <style type='text/css'> | ||
| .coverage-summary .sorter { | ||
| background-image: url(sort-arrow-sprite.png); | ||
| } | ||
| </style> | ||
| </head> | ||
| <body> | ||
| <div class='wrapper'> | ||
| <div class='pad1'> | ||
| <h1> | ||
| <a href="index.html">All files</a> index.js | ||
| </h1> | ||
| <div class='clearfix'> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">0% </span> | ||
| <span class="quiet">Statements</span> | ||
| <span class='fraction'>0/0</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">0% </span> | ||
| <span class="quiet">Branches</span> | ||
| <span class='fraction'>0/0</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">0% </span> | ||
| <span class="quiet">Functions</span> | ||
| <span class='fraction'>0/0</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">0% </span> | ||
| <span class="quiet">Lines</span> | ||
| <span class='fraction'>0/0</span> | ||
| </div> | ||
| </div> | ||
| <p class="quiet"> | ||
| Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block. | ||
| </p> | ||
| </div> | ||
| <div class='status-line low'></div> | ||
| <pre><table class="coverage"> | ||
| <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a> | ||
| <a name='L2'></a><a href='#L2'>2</a> | ||
| <a name='L3'></a><a href='#L3'>3</a> | ||
| <a name='L4'></a><a href='#L4'>4</a> | ||
| <a name='L5'></a><a href='#L5'>5</a> | ||
| <a name='L6'></a><a href='#L6'>6</a> | ||
| <a name='L7'></a><a href='#L7'>7</a> | ||
| <a name='L8'></a><a href='#L8'>8</a> | ||
| <a name='L9'></a><a href='#L9'>9</a> | ||
| <a name='L10'></a><a href='#L10'>10</a> | ||
| <a name='L11'></a><a href='#L11'>11</a> | ||
| <a name='L12'></a><a href='#L12'>12</a> | ||
| <a name='L13'></a><a href='#L13'>13</a> | ||
| <a name='L14'></a><a href='#L14'>14</a> | ||
| <a name='L15'></a><a href='#L15'>15</a> | ||
| <a name='L16'></a><a href='#L16'>16</a> | ||
| <a name='L17'></a><a href='#L17'>17</a> | ||
| <a name='L18'></a><a href='#L18'>18</a> | ||
| <a name='L19'></a><a href='#L19'>19</a> | ||
| <a name='L20'></a><a href='#L20'>20</a> | ||
| <a name='L21'></a><a href='#L21'>21</a> | ||
| <a name='L22'></a><a href='#L22'>22</a> | ||
| <a name='L23'></a><a href='#L23'>23</a> | ||
| <a name='L24'></a><a href='#L24'>24</a> | ||
| <a name='L25'></a><a href='#L25'>25</a> | ||
| <a name='L26'></a><a href='#L26'>26</a> | ||
| <a name='L27'></a><a href='#L27'>27</a> | ||
| <a name='L28'></a><a href='#L28'>28</a> | ||
| <a name='L29'></a><a href='#L29'>29</a> | ||
| <a name='L30'></a><a href='#L30'>30</a> | ||
| <a name='L31'></a><a href='#L31'>31</a> | ||
| <a name='L32'></a><a href='#L32'>32</a> | ||
| <a name='L33'></a><a href='#L33'>33</a> | ||
| <a name='L34'></a><a href='#L34'>34</a> | ||
| <a name='L35'></a><a href='#L35'>35</a> | ||
| <a name='L36'></a><a href='#L36'>36</a> | ||
| <a name='L37'></a><a href='#L37'>37</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import { Children } from 'react'; | ||
| | ||
| import deepFilter from './deepFilter'; | ||
| import deepFind from './deepFind'; | ||
| import deepForEach from './deepForEach'; | ||
| import deepMap from './deepMap'; | ||
| import filter from './filter'; | ||
| import groupByType from './groupByType'; | ||
| import hasChildren from './hasChildren'; | ||
| import hasComplexChildren from './hasComplexChildren'; | ||
| import onlyText from './onlyText'; | ||
| | ||
| export { | ||
| deepFilter, | ||
| deepFind, | ||
| deepForEach, | ||
| deepMap, | ||
| filter, | ||
| groupByType, | ||
| hasChildren, | ||
| hasComplexChildren, | ||
| onlyText, | ||
| }; | ||
| | ||
| export default { | ||
| ...Children, | ||
| deepFilter, | ||
| deepFind, | ||
| deepForEach, | ||
| deepMap, | ||
| filter, | ||
| groupByType, | ||
| hasChildren, | ||
| hasComplexChildren, | ||
| onlyText, | ||
| }; | ||
| </pre></td></tr> | ||
| </table></pre> | ||
| <div class='push'></div><!-- for sticky footer --> | ||
| </div><!-- /wrapper --> | ||
| <div class='footer quiet pad2 space-top1 center small'> | ||
| Code coverage | ||
| generated by <a href="https://istanbul.js.org/" target="_blank">istanbul</a> at Sun Oct 06 2019 01:25:51 GMT+0100 (British Summer Time) | ||
| </div> | ||
| </div> | ||
| <script src="prettify.js"></script> | ||
| <script> | ||
| window.onload = function () { | ||
| if (typeof prettyPrint === 'function') { | ||
| prettyPrint(); | ||
| } | ||
| }; | ||
| </script> | ||
| <script src="sorter.js"></script> | ||
| <script src="block-navigation.js"></script> | ||
| </body> | ||
| </html> |
| <!doctype html> | ||
| <html lang="en"> | ||
| <head> | ||
| <title>Code coverage report for index.ts</title> | ||
| <meta charset="utf-8" /> | ||
| <link rel="stylesheet" href="prettify.css" /> | ||
| <link rel="stylesheet" href="base.css" /> | ||
| <meta name="viewport" content="width=device-width, initial-scale=1"> | ||
| <style type='text/css'> | ||
| .coverage-summary .sorter { | ||
| background-image: url(sort-arrow-sprite.png); | ||
| } | ||
| </style> | ||
| </head> | ||
| <body> | ||
| <div class='wrapper'> | ||
| <div class='pad1'> | ||
| <h1> | ||
| <a href="index.html">All files</a> index.ts | ||
| </h1> | ||
| <div class='clearfix'> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Statements</span> | ||
| <span class='fraction'>20/20</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Branches</span> | ||
| <span class='fraction'>0/0</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Functions</span> | ||
| <span class='fraction'>0/0</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Lines</span> | ||
| <span class='fraction'>20/20</span> | ||
| </div> | ||
| </div> | ||
| <p class="quiet"> | ||
| Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block. | ||
| </p> | ||
| </div> | ||
| <div class='status-line high'></div> | ||
| <pre><table class="coverage"> | ||
| <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a> | ||
| <a name='L2'></a><a href='#L2'>2</a> | ||
| <a name='L3'></a><a href='#L3'>3</a> | ||
| <a name='L4'></a><a href='#L4'>4</a> | ||
| <a name='L5'></a><a href='#L5'>5</a> | ||
| <a name='L6'></a><a href='#L6'>6</a> | ||
| <a name='L7'></a><a href='#L7'>7</a> | ||
| <a name='L8'></a><a href='#L8'>8</a> | ||
| <a name='L9'></a><a href='#L9'>9</a> | ||
| <a name='L10'></a><a href='#L10'>10</a> | ||
| <a name='L11'></a><a href='#L11'>11</a> | ||
| <a name='L12'></a><a href='#L12'>12</a> | ||
| <a name='L13'></a><a href='#L13'>13</a> | ||
| <a name='L14'></a><a href='#L14'>14</a> | ||
| <a name='L15'></a><a href='#L15'>15</a> | ||
| <a name='L16'></a><a href='#L16'>16</a> | ||
| <a name='L17'></a><a href='#L17'>17</a> | ||
| <a name='L18'></a><a href='#L18'>18</a> | ||
| <a name='L19'></a><a href='#L19'>19</a> | ||
| <a name='L20'></a><a href='#L20'>20</a> | ||
| <a name='L21'></a><a href='#L21'>21</a> | ||
| <a name='L22'></a><a href='#L22'>22</a> | ||
| <a name='L23'></a><a href='#L23'>23</a> | ||
| <a name='L24'></a><a href='#L24'>24</a> | ||
| <a name='L25'></a><a href='#L25'>25</a> | ||
| <a name='L26'></a><a href='#L26'>26</a> | ||
| <a name='L27'></a><a href='#L27'>27</a> | ||
| <a name='L28'></a><a href='#L28'>28</a> | ||
| <a name='L29'></a><a href='#L29'>29</a> | ||
| <a name='L30'></a><a href='#L30'>30</a> | ||
| <a name='L31'></a><a href='#L31'>31</a> | ||
| <a name='L32'></a><a href='#L32'>32</a> | ||
| <a name='L33'></a><a href='#L33'>33</a> | ||
| <a name='L34'></a><a href='#L34'>34</a> | ||
| <a name='L35'></a><a href='#L35'>35</a> | ||
| <a name='L36'></a><a href='#L36'>36</a> | ||
| <a name='L37'></a><a href='#L37'>37</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import { Children } from 'react'; | ||
| | ||
| import deepFilter from './lib/deepFilter'; | ||
| import deepFind from './lib/deepFind'; | ||
| import deepForEach from './lib/deepForEach'; | ||
| import deepMap from './lib/deepMap'; | ||
| import filter from './lib/filter'; | ||
| import groupByType from './lib/groupByType'; | ||
| import hasChildren from './lib/hasChildren'; | ||
| import hasComplexChildren from './lib/hasComplexChildren'; | ||
| import onlyText from './lib/onlyText'; | ||
| | ||
| export { | ||
| deepFilter, | ||
| deepFind, | ||
| deepForEach, | ||
| deepMap, | ||
| filter, | ||
| groupByType, | ||
| hasChildren, | ||
| hasComplexChildren, | ||
| onlyText, | ||
| }; | ||
| | ||
| export default { | ||
| ...Children, | ||
| deepFilter, | ||
| deepFind, | ||
| deepForEach, | ||
| deepMap, | ||
| filter, | ||
| groupByType, | ||
| hasChildren, | ||
| hasComplexChildren, | ||
| onlyText, | ||
| }; | ||
| </pre></td></tr> | ||
| </table></pre> | ||
| <div class='push'></div><!-- for sticky footer --> | ||
| </div><!-- /wrapper --> | ||
| <div class='footer quiet pad2 space-top1 center small'> | ||
| Code coverage | ||
| generated by <a href="https://istanbul.js.org/" target="_blank">istanbul</a> at Thu Oct 10 2019 01:10:43 GMT+0100 (British Summer Time) | ||
| </div> | ||
| </div> | ||
| <script src="prettify.js"></script> | ||
| <script> | ||
| window.onload = function () { | ||
| if (typeof prettyPrint === 'function') { | ||
| prettyPrint(); | ||
| } | ||
| }; | ||
| </script> | ||
| <script src="sorter.js"></script> | ||
| <script src="block-navigation.js"></script> | ||
| </body> | ||
| </html> |
| <!doctype html> | ||
| <html lang="en"> | ||
| <head> | ||
| <title>Code coverage report for onlyText.js</title> | ||
| <meta charset="utf-8" /> | ||
| <link rel="stylesheet" href="prettify.css" /> | ||
| <link rel="stylesheet" href="base.css" /> | ||
| <meta name="viewport" content="width=device-width, initial-scale=1"> | ||
| <style type='text/css'> | ||
| .coverage-summary .sorter { | ||
| background-image: url(sort-arrow-sprite.png); | ||
| } | ||
| </style> | ||
| </head> | ||
| <body> | ||
| <div class='wrapper'> | ||
| <div class='pad1'> | ||
| <h1> | ||
| <a href="index.html">All files</a> onlyText.js | ||
| </h1> | ||
| <div class='clearfix'> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Statements</span> | ||
| <span class='fraction'>3/3</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Branches</span> | ||
| <span class='fraction'>2/2</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Functions</span> | ||
| <span class='fraction'>2/2</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Lines</span> | ||
| <span class='fraction'>3/3</span> | ||
| </div> | ||
| </div> | ||
| <p class="quiet"> | ||
| Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block. | ||
| </p> | ||
| </div> | ||
| <div class='status-line high'></div> | ||
| <pre><table class="coverage"> | ||
| <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a> | ||
| <a name='L2'></a><a href='#L2'>2</a> | ||
| <a name='L3'></a><a href='#L3'>3</a> | ||
| <a name='L4'></a><a href='#L4'>4</a> | ||
| <a name='L5'></a><a href='#L5'>5</a> | ||
| <a name='L6'></a><a href='#L6'>6</a> | ||
| <a name='L7'></a><a href='#L7'>7</a> | ||
| <a name='L8'></a><a href='#L8'>8</a> | ||
| <a name='L9'></a><a href='#L9'>9</a> | ||
| <a name='L10'></a><a href='#L10'>10</a> | ||
| <a name='L11'></a><a href='#L11'>11</a> | ||
| <a name='L12'></a><a href='#L12'>12</a> | ||
| <a name='L13'></a><a href='#L13'>13</a> | ||
| <a name='L14'></a><a href='#L14'>14</a> | ||
| <a name='L15'></a><a href='#L15'>15</a> | ||
| <a name='L16'></a><a href='#L16'>16</a> | ||
| <a name='L17'></a><a href='#L17'>17</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-yes">6x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">9x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import { Children } from 'react'; | ||
| import hasChildren from './hasChildren'; | ||
| | ||
| const onlyText = (children) => { | ||
| return Children.toArray(children) | ||
| .reduce( | ||
| (flattened, child) => [ | ||
| ...flattened, | ||
| hasChildren(child) ? onlyText(child.props.children) : child, | ||
| ], | ||
| [], | ||
| ) | ||
| .join(''); | ||
| }; | ||
| | ||
| export default onlyText; | ||
| </pre></td></tr> | ||
| </table></pre> | ||
| <div class='push'></div><!-- for sticky footer --> | ||
| </div><!-- /wrapper --> | ||
| <div class='footer quiet pad2 space-top1 center small'> | ||
| Code coverage | ||
| generated by <a href="https://istanbul.js.org/" target="_blank">istanbul</a> at Sat Oct 05 2019 22:56:01 GMT+0100 (British Summer Time) | ||
| </div> | ||
| </div> | ||
| <script src="prettify.js"></script> | ||
| <script> | ||
| window.onload = function () { | ||
| if (typeof prettyPrint === 'function') { | ||
| prettyPrint(); | ||
| } | ||
| }; | ||
| </script> | ||
| <script src="sorter.js"></script> | ||
| <script src="block-navigation.js"></script> | ||
| </body> | ||
| </html> |
| <!doctype html> | ||
| <html lang="en"> | ||
| <head> | ||
| <title>Code coverage report for onlyText.ts</title> | ||
| <meta charset="utf-8" /> | ||
| <link rel="stylesheet" href="prettify.css" /> | ||
| <link rel="stylesheet" href="base.css" /> | ||
| <meta name="viewport" content="width=device-width, initial-scale=1"> | ||
| <style type='text/css'> | ||
| .coverage-summary .sorter { | ||
| background-image: url(sort-arrow-sprite.png); | ||
| } | ||
| </style> | ||
| </head> | ||
| <body> | ||
| <div class='wrapper'> | ||
| <div class='pad1'> | ||
| <h1> | ||
| <a href="index.html">All files</a> onlyText.ts | ||
| </h1> | ||
| <div class='clearfix'> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">87.5% </span> | ||
| <span class="quiet">Statements</span> | ||
| <span class='fraction'>7/8</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">75% </span> | ||
| <span class="quiet">Branches</span> | ||
| <span class='fraction'>3/4</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Functions</span> | ||
| <span class='fraction'>2/2</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">87.5% </span> | ||
| <span class="quiet">Lines</span> | ||
| <span class='fraction'>7/8</span> | ||
| </div> | ||
| </div> | ||
| <p class="quiet"> | ||
| Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block. | ||
| </p> | ||
| </div> | ||
| <div class='status-line high'></div> | ||
| <pre><table class="coverage"> | ||
| <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a> | ||
| <a name='L2'></a><a href='#L2'>2</a> | ||
| <a name='L3'></a><a href='#L3'>3</a> | ||
| <a name='L4'></a><a href='#L4'>4</a> | ||
| <a name='L5'></a><a href='#L5'>5</a> | ||
| <a name='L6'></a><a href='#L6'>6</a> | ||
| <a name='L7'></a><a href='#L7'>7</a> | ||
| <a name='L8'></a><a href='#L8'>8</a> | ||
| <a name='L9'></a><a href='#L9'>9</a> | ||
| <a name='L10'></a><a href='#L10'>10</a> | ||
| <a name='L11'></a><a href='#L11'>11</a> | ||
| <a name='L12'></a><a href='#L12'>12</a> | ||
| <a name='L13'></a><a href='#L13'>13</a> | ||
| <a name='L14'></a><a href='#L14'>14</a> | ||
| <a name='L15'></a><a href='#L15'>15</a> | ||
| <a name='L16'></a><a href='#L16'>16</a> | ||
| <a name='L17'></a><a href='#L17'>17</a> | ||
| <a name='L18'></a><a href='#L18'>18</a> | ||
| <a name='L19'></a><a href='#L19'>19</a> | ||
| <a name='L20'></a><a href='#L20'>20</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-yes">16x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">18x</span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">18x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import { Children, ReactElement, ReactNode } from 'react'; | ||
| import hasChildren from './hasChildren'; | ||
| | ||
| const onlyText = (children: ReactNode): string => { | ||
| return Children.toArray(children) | ||
| .reduce((flattened: string[], child: ReactNode): string[] => { | ||
| <span class="missing-if-branch" title="if path not taken" >I</span>if (!child) { | ||
| <span class="cstat-no" title="statement not covered" > return flattened;</span> | ||
| } | ||
| | ||
| return [ | ||
| ...flattened, | ||
| hasChildren(child) ? onlyText((child as ReactElement).props.children) : child.toString(), | ||
| ]; | ||
| }, []) | ||
| .join(''); | ||
| }; | ||
| | ||
| export default onlyText; | ||
| </pre></td></tr> | ||
| </table></pre> | ||
| <div class='push'></div><!-- for sticky footer --> | ||
| </div><!-- /wrapper --> | ||
| <div class='footer quiet pad2 space-top1 center small'> | ||
| Code coverage | ||
| generated by <a href="https://istanbul.js.org/" target="_blank">istanbul</a> at Thu Oct 10 2019 01:10:43 GMT+0100 (British Summer Time) | ||
| </div> | ||
| </div> | ||
| <script src="prettify.js"></script> | ||
| <script> | ||
| window.onload = function () { | ||
| if (typeof prettyPrint === 'function') { | ||
| prettyPrint(); | ||
| } | ||
| }; | ||
| </script> | ||
| <script src="sorter.js"></script> | ||
| <script src="block-navigation.js"></script> | ||
| </body> | ||
| </html> |
| .pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} |
| /* eslint-disable */ | ||
| window.PR_SHOULD_USE_CONTINUATION=true;(function(){var h=["break,continue,do,else,for,if,return,while"];var u=[h,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];var p=[u,"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"];var l=[p,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"];var x=[p,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"];var R=[x,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"];var r="all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes";var w=[p,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"];var s="caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END";var I=[h,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"];var f=[h,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"];var H=[h,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"];var A=[l,R,w,s+I,f,H];var e=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/;var C="str";var z="kwd";var j="com";var O="typ";var G="lit";var L="pun";var F="pln";var m="tag";var E="dec";var J="src";var P="atn";var n="atv";var N="nocode";var M="(?:^^\\.?|[+-]|\\!|\\!=|\\!==|\\#|\\%|\\%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|\\,|\\-=|\\->|\\/|\\/=|:|::|\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\@|\\[|\\^|\\^=|\\^\\^|\\^\\^=|\\{|\\||\\|=|\\|\\||\\|\\|=|\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*";function k(Z){var ad=0;var S=false;var ac=false;for(var V=0,U=Z.length;V<U;++V){var ae=Z[V];if(ae.ignoreCase){ac=true}else{if(/[a-z]/i.test(ae.source.replace(/\\u[0-9a-f]{4}|\\x[0-9a-f]{2}|\\[^ux]/gi,""))){S=true;ac=false;break}}}var Y={b:8,t:9,n:10,v:11,f:12,r:13};function ab(ah){var ag=ah.charCodeAt(0);if(ag!==92){return ag}var af=ah.charAt(1);ag=Y[af];if(ag){return ag}else{if("0"<=af&&af<="7"){return parseInt(ah.substring(1),8)}else{if(af==="u"||af==="x"){return parseInt(ah.substring(2),16)}else{return ah.charCodeAt(1)}}}}function T(af){if(af<32){return(af<16?"\\x0":"\\x")+af.toString(16)}var ag=String.fromCharCode(af);if(ag==="\\"||ag==="-"||ag==="["||ag==="]"){ag="\\"+ag}return ag}function X(am){var aq=am.substring(1,am.length-1).match(new RegExp("\\\\u[0-9A-Fa-f]{4}|\\\\x[0-9A-Fa-f]{2}|\\\\[0-3][0-7]{0,2}|\\\\[0-7]{1,2}|\\\\[\\s\\S]|-|[^-\\\\]","g"));var ak=[];var af=[];var ao=aq[0]==="^";for(var ar=ao?1:0,aj=aq.length;ar<aj;++ar){var ah=aq[ar];if(/\\[bdsw]/i.test(ah)){ak.push(ah)}else{var ag=ab(ah);var al;if(ar+2<aj&&"-"===aq[ar+1]){al=ab(aq[ar+2]);ar+=2}else{al=ag}af.push([ag,al]);if(!(al<65||ag>122)){if(!(al<65||ag>90)){af.push([Math.max(65,ag)|32,Math.min(al,90)|32])}if(!(al<97||ag>122)){af.push([Math.max(97,ag)&~32,Math.min(al,122)&~32])}}}}af.sort(function(av,au){return(av[0]-au[0])||(au[1]-av[1])});var ai=[];var ap=[NaN,NaN];for(var ar=0;ar<af.length;++ar){var at=af[ar];if(at[0]<=ap[1]+1){ap[1]=Math.max(ap[1],at[1])}else{ai.push(ap=at)}}var an=["["];if(ao){an.push("^")}an.push.apply(an,ak);for(var ar=0;ar<ai.length;++ar){var at=ai[ar];an.push(T(at[0]));if(at[1]>at[0]){if(at[1]+1>at[0]){an.push("-")}an.push(T(at[1]))}}an.push("]");return an.join("")}function W(al){var aj=al.source.match(new RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g"));var ah=aj.length;var an=[];for(var ak=0,am=0;ak<ah;++ak){var ag=aj[ak];if(ag==="("){++am}else{if("\\"===ag.charAt(0)){var af=+ag.substring(1);if(af&&af<=am){an[af]=-1}}}}for(var ak=1;ak<an.length;++ak){if(-1===an[ak]){an[ak]=++ad}}for(var ak=0,am=0;ak<ah;++ak){var ag=aj[ak];if(ag==="("){++am;if(an[am]===undefined){aj[ak]="(?:"}}else{if("\\"===ag.charAt(0)){var af=+ag.substring(1);if(af&&af<=am){aj[ak]="\\"+an[am]}}}}for(var ak=0,am=0;ak<ah;++ak){if("^"===aj[ak]&&"^"!==aj[ak+1]){aj[ak]=""}}if(al.ignoreCase&&S){for(var ak=0;ak<ah;++ak){var ag=aj[ak];var ai=ag.charAt(0);if(ag.length>=2&&ai==="["){aj[ak]=X(ag)}else{if(ai!=="\\"){aj[ak]=ag.replace(/[a-zA-Z]/g,function(ao){var ap=ao.charCodeAt(0);return"["+String.fromCharCode(ap&~32,ap|32)+"]"})}}}}return aj.join("")}var aa=[];for(var V=0,U=Z.length;V<U;++V){var ae=Z[V];if(ae.global||ae.multiline){throw new Error(""+ae)}aa.push("(?:"+W(ae)+")")}return new RegExp(aa.join("|"),ac?"gi":"g")}function a(V){var U=/(?:^|\s)nocode(?:\s|$)/;var X=[];var T=0;var Z=[];var W=0;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=document.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Y=S&&"pre"===S.substring(0,3);function aa(ab){switch(ab.nodeType){case 1:if(U.test(ab.className)){return}for(var ae=ab.firstChild;ae;ae=ae.nextSibling){aa(ae)}var ad=ab.nodeName;if("BR"===ad||"LI"===ad){X[W]="\n";Z[W<<1]=T++;Z[(W++<<1)|1]=ab}break;case 3:case 4:var ac=ab.nodeValue;if(ac.length){if(!Y){ac=ac.replace(/[ \t\r\n]+/g," ")}else{ac=ac.replace(/\r\n?/g,"\n")}X[W]=ac;Z[W<<1]=T;T+=ac.length;Z[(W++<<1)|1]=ab}break}}aa(V);return{sourceCode:X.join("").replace(/\n$/,""),spans:Z}}function B(S,U,W,T){if(!U){return}var V={sourceCode:U,basePos:S};W(V);T.push.apply(T,V.decorations)}var v=/\S/;function o(S){var V=undefined;for(var U=S.firstChild;U;U=U.nextSibling){var T=U.nodeType;V=(T===1)?(V?S:U):(T===3)?(v.test(U.nodeValue)?S:V):V}return V===S?undefined:V}function g(U,T){var S={};var V;(function(){var ad=U.concat(T);var ah=[];var ag={};for(var ab=0,Z=ad.length;ab<Z;++ab){var Y=ad[ab];var ac=Y[3];if(ac){for(var ae=ac.length;--ae>=0;){S[ac.charAt(ae)]=Y}}var af=Y[1];var aa=""+af;if(!ag.hasOwnProperty(aa)){ah.push(af);ag[aa]=null}}ah.push(/[\0-\uffff]/);V=k(ah)})();var X=T.length;var W=function(ah){var Z=ah.sourceCode,Y=ah.basePos;var ad=[Y,F];var af=0;var an=Z.match(V)||[];var aj={};for(var ae=0,aq=an.length;ae<aq;++ae){var ag=an[ae];var ap=aj[ag];var ai=void 0;var am;if(typeof ap==="string"){am=false}else{var aa=S[ag.charAt(0)];if(aa){ai=ag.match(aa[1]);ap=aa[0]}else{for(var ao=0;ao<X;++ao){aa=T[ao];ai=ag.match(aa[1]);if(ai){ap=aa[0];break}}if(!ai){ap=F}}am=ap.length>=5&&"lang-"===ap.substring(0,5);if(am&&!(ai&&typeof ai[1]==="string")){am=false;ap=J}if(!am){aj[ag]=ap}}var ab=af;af+=ag.length;if(!am){ad.push(Y+ab,ap)}else{var al=ai[1];var ak=ag.indexOf(al);var ac=ak+al.length;if(ai[2]){ac=ag.length-ai[2].length;ak=ac-al.length}var ar=ap.substring(5);B(Y+ab,ag.substring(0,ak),W,ad);B(Y+ab+ak,al,q(ar,al),ad);B(Y+ab+ac,ag.substring(ac),W,ad)}}ah.decorations=ad};return W}function i(T){var W=[],S=[];if(T.tripleQuotedStrings){W.push([C,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""])}else{if(T.multiLineStrings){W.push([C,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"])}else{W.push([C,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"])}}if(T.verbatimStrings){S.push([C,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null])}var Y=T.hashComments;if(Y){if(T.cStyleComments){if(Y>1){W.push([j,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"])}else{W.push([j,/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"])}S.push([C,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,null])}else{W.push([j,/^#[^\r\n]*/,null,"#"])}}if(T.cStyleComments){S.push([j,/^\/\/[^\r\n]*/,null]);S.push([j,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}if(T.regexLiterals){var X=("/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/");S.push(["lang-regex",new RegExp("^"+M+"("+X+")")])}var V=T.types;if(V){S.push([O,V])}var U=(""+T.keywords).replace(/^ | $/g,"");if(U.length){S.push([z,new RegExp("^(?:"+U.replace(/[\s,]+/g,"|")+")\\b"),null])}W.push([F,/^\s+/,null," \r\n\t\xA0"]);S.push([G,/^@[a-z_$][a-z_$@0-9]*/i,null],[O,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],[F,/^[a-z_$][a-z_$@0-9]*/i,null],[G,new RegExp("^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*","i"),null,"0123456789"],[F,/^\\[\s\S]?/,null],[L,/^.[^\s\w\.$@\'\"\`\/\#\\]*/,null]);return g(W,S)}var K=i({keywords:A,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function Q(V,ag){var U=/(?:^|\s)nocode(?:\s|$)/;var ab=/\r\n?|\n/;var ac=V.ownerDocument;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=ac.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Z=S&&"pre"===S.substring(0,3);var af=ac.createElement("LI");while(V.firstChild){af.appendChild(V.firstChild)}var W=[af];function ae(al){switch(al.nodeType){case 1:if(U.test(al.className)){break}if("BR"===al.nodeName){ad(al);if(al.parentNode){al.parentNode.removeChild(al)}}else{for(var an=al.firstChild;an;an=an.nextSibling){ae(an)}}break;case 3:case 4:if(Z){var am=al.nodeValue;var aj=am.match(ab);if(aj){var ai=am.substring(0,aj.index);al.nodeValue=ai;var ah=am.substring(aj.index+aj[0].length);if(ah){var ak=al.parentNode;ak.insertBefore(ac.createTextNode(ah),al.nextSibling)}ad(al);if(!ai){al.parentNode.removeChild(al)}}}break}}function ad(ak){while(!ak.nextSibling){ak=ak.parentNode;if(!ak){return}}function ai(al,ar){var aq=ar?al.cloneNode(false):al;var ao=al.parentNode;if(ao){var ap=ai(ao,1);var an=al.nextSibling;ap.appendChild(aq);for(var am=an;am;am=an){an=am.nextSibling;ap.appendChild(am)}}return aq}var ah=ai(ak.nextSibling,0);for(var aj;(aj=ah.parentNode)&&aj.nodeType===1;){ah=aj}W.push(ah)}for(var Y=0;Y<W.length;++Y){ae(W[Y])}if(ag===(ag|0)){W[0].setAttribute("value",ag)}var aa=ac.createElement("OL");aa.className="linenums";var X=Math.max(0,((ag-1))|0)||0;for(var Y=0,T=W.length;Y<T;++Y){af=W[Y];af.className="L"+((Y+X)%10);if(!af.firstChild){af.appendChild(ac.createTextNode("\xA0"))}aa.appendChild(af)}V.appendChild(aa)}function D(ac){var aj=/\bMSIE\b/.test(navigator.userAgent);var am=/\n/g;var al=ac.sourceCode;var an=al.length;var V=0;var aa=ac.spans;var T=aa.length;var ah=0;var X=ac.decorations;var Y=X.length;var Z=0;X[Y]=an;var ar,aq;for(aq=ar=0;aq<Y;){if(X[aq]!==X[aq+2]){X[ar++]=X[aq++];X[ar++]=X[aq++]}else{aq+=2}}Y=ar;for(aq=ar=0;aq<Y;){var at=X[aq];var ab=X[aq+1];var W=aq+2;while(W+2<=Y&&X[W+1]===ab){W+=2}X[ar++]=at;X[ar++]=ab;aq=W}Y=X.length=ar;var ae=null;while(ah<T){var af=aa[ah];var S=aa[ah+2]||an;var ag=X[Z];var ap=X[Z+2]||an;var W=Math.min(S,ap);var ak=aa[ah+1];var U;if(ak.nodeType!==1&&(U=al.substring(V,W))){if(aj){U=U.replace(am,"\r")}ak.nodeValue=U;var ai=ak.ownerDocument;var ao=ai.createElement("SPAN");ao.className=X[Z+1];var ad=ak.parentNode;ad.replaceChild(ao,ak);ao.appendChild(ak);if(V<S){aa[ah+1]=ak=ai.createTextNode(al.substring(W,S));ad.insertBefore(ak,ao.nextSibling)}}V=W;if(V>=S){ah+=2}if(V>=ap){Z+=2}}}var t={};function c(U,V){for(var S=V.length;--S>=0;){var T=V[S];if(!t.hasOwnProperty(T)){t[T]=U}else{if(window.console){console.warn("cannot override language handler %s",T)}}}}function q(T,S){if(!(T&&t.hasOwnProperty(T))){T=/^\s*</.test(S)?"default-markup":"default-code"}return t[T]}c(K,["default-code"]);c(g([],[[F,/^[^<?]+/],[E,/^<!\w[^>]*(?:>|$)/],[j,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[L,/^(?:<[%?]|[%?]>)/],["lang-",/^<xmp\b[^>]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^<script\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);c(g([[F,/^[\s]+/,null," \t\r\n"],[n,/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[[m,/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],[P,/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[L,/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);c(g([],[[n,/^[\s\S]+/]]),["uq.val"]);c(i({keywords:l,hashComments:true,cStyleComments:true,types:e}),["c","cc","cpp","cxx","cyc","m"]);c(i({keywords:"null,true,false"}),["json"]);c(i({keywords:R,hashComments:true,cStyleComments:true,verbatimStrings:true,types:e}),["cs"]);c(i({keywords:x,cStyleComments:true}),["java"]);c(i({keywords:H,hashComments:true,multiLineStrings:true}),["bsh","csh","sh"]);c(i({keywords:I,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),["cv","py"]);c(i({keywords:s,hashComments:true,multiLineStrings:true,regexLiterals:true}),["perl","pl","pm"]);c(i({keywords:f,hashComments:true,multiLineStrings:true,regexLiterals:true}),["rb"]);c(i({keywords:w,cStyleComments:true,regexLiterals:true}),["js"]);c(i({keywords:r,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),["coffee"]);c(g([],[[C,/^[\s\S]+/]]),["regex"]);function d(V){var U=V.langExtension;try{var S=a(V.sourceNode);var T=S.sourceCode;V.sourceCode=T;V.spans=S.spans;V.basePos=0;q(U,T)(V);D(V)}catch(W){if("console" in window){console.log(W&&W.stack?W.stack:W)}}}function y(W,V,U){var S=document.createElement("PRE");S.innerHTML=W;if(U){Q(S,U)}var T={langExtension:V,numberLines:U,sourceNode:S};d(T);return S.innerHTML}function b(ad){function Y(af){return document.getElementsByTagName(af)}var ac=[Y("pre"),Y("code"),Y("xmp")];var T=[];for(var aa=0;aa<ac.length;++aa){for(var Z=0,V=ac[aa].length;Z<V;++Z){T.push(ac[aa][Z])}}ac=null;var W=Date;if(!W.now){W={now:function(){return +(new Date)}}}var X=0;var S;var ab=/\blang(?:uage)?-([\w.]+)(?!\S)/;var ae=/\bprettyprint\b/;function U(){var ag=(window.PR_SHOULD_USE_CONTINUATION?W.now()+250:Infinity);for(;X<T.length&&W.now()<ag;X++){var aj=T[X];var ai=aj.className;if(ai.indexOf("prettyprint")>=0){var ah=ai.match(ab);var am;if(!ah&&(am=o(aj))&&"CODE"===am.tagName){ah=am.className.match(ab)}if(ah){ah=ah[1]}var al=false;for(var ak=aj.parentNode;ak;ak=ak.parentNode){if((ak.tagName==="pre"||ak.tagName==="code"||ak.tagName==="xmp")&&ak.className&&ak.className.indexOf("prettyprint")>=0){al=true;break}}if(!al){var af=aj.className.match(/\blinenums\b(?::(\d+))?/);af=af?af[1]&&af[1].length?+af[1]:true:false;if(af){Q(aj,af)}S={langExtension:ah,sourceNode:aj,numberLines:af};d(S)}}}if(X<T.length){setTimeout(U,250)}else{if(ad){ad()}}}U()}window.prettyPrintOne=y;window.prettyPrint=b;window.PR={createSimpleLexer:g,registerLangHandler:c,sourceDecorator:i,PR_ATTRIB_NAME:P,PR_ATTRIB_VALUE:n,PR_COMMENT:j,PR_DECLARATION:E,PR_KEYWORD:z,PR_LITERAL:G,PR_NOCODE:N,PR_PLAIN:F,PR_PUNCTUATION:L,PR_SOURCE:J,PR_STRING:C,PR_TAG:m,PR_TYPE:O}})();PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_DECLARATION,/^<!\w[^>]*(?:>|$)/],[PR.PR_COMMENT,/^<\!--[\s\S]*?(?:-\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["lang-",/^<xmp\b[^>]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-handlebars",/^<script\b[^>]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-js",/^<script\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i],[PR.PR_DECLARATION,/^{{[#^>/]?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{&?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{{>?\s*[\w.][^}]*}}}/],[PR.PR_COMMENT,/^{{![^}]*}}/]]),["handlebars","hbs"]);PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \t\r\n\f]+/,null," \t\r\n\f"]],[[PR.PR_STRING,/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],[PR.PR_STRING,/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']*)\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],[PR.PR_COMMENT,/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],[PR.PR_COMMENT,/^(?:<!--|-->)/],[PR.PR_LITERAL,/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\)\"\']+/]]),["css-str"]); |
Sorry, the diff of this file is not supported yet
| /* eslint-disable */ | ||
| var addSorting = (function() { | ||
| 'use strict'; | ||
| var cols, | ||
| currentSort = { | ||
| index: 0, | ||
| desc: false | ||
| }; | ||
| // returns the summary table element | ||
| function getTable() { | ||
| return document.querySelector('.coverage-summary'); | ||
| } | ||
| // returns the thead element of the summary table | ||
| function getTableHeader() { | ||
| return getTable().querySelector('thead tr'); | ||
| } | ||
| // returns the tbody element of the summary table | ||
| function getTableBody() { | ||
| return getTable().querySelector('tbody'); | ||
| } | ||
| // returns the th element for nth column | ||
| function getNthColumn(n) { | ||
| return getTableHeader().querySelectorAll('th')[n]; | ||
| } | ||
| // loads all columns | ||
| function loadColumns() { | ||
| var colNodes = getTableHeader().querySelectorAll('th'), | ||
| colNode, | ||
| cols = [], | ||
| col, | ||
| i; | ||
| for (i = 0; i < colNodes.length; i += 1) { | ||
| colNode = colNodes[i]; | ||
| col = { | ||
| key: colNode.getAttribute('data-col'), | ||
| sortable: !colNode.getAttribute('data-nosort'), | ||
| type: colNode.getAttribute('data-type') || 'string' | ||
| }; | ||
| cols.push(col); | ||
| if (col.sortable) { | ||
| col.defaultDescSort = col.type === 'number'; | ||
| colNode.innerHTML = | ||
| colNode.innerHTML + '<span class="sorter"></span>'; | ||
| } | ||
| } | ||
| return cols; | ||
| } | ||
| // attaches a data attribute to every tr element with an object | ||
| // of data values keyed by column name | ||
| function loadRowData(tableRow) { | ||
| var tableCols = tableRow.querySelectorAll('td'), | ||
| colNode, | ||
| col, | ||
| data = {}, | ||
| i, | ||
| val; | ||
| for (i = 0; i < tableCols.length; i += 1) { | ||
| colNode = tableCols[i]; | ||
| col = cols[i]; | ||
| val = colNode.getAttribute('data-value'); | ||
| if (col.type === 'number') { | ||
| val = Number(val); | ||
| } | ||
| data[col.key] = val; | ||
| } | ||
| return data; | ||
| } | ||
| // loads all row data | ||
| function loadData() { | ||
| var rows = getTableBody().querySelectorAll('tr'), | ||
| i; | ||
| for (i = 0; i < rows.length; i += 1) { | ||
| rows[i].data = loadRowData(rows[i]); | ||
| } | ||
| } | ||
| // sorts the table using the data for the ith column | ||
| function sortByIndex(index, desc) { | ||
| var key = cols[index].key, | ||
| sorter = function(a, b) { | ||
| a = a.data[key]; | ||
| b = b.data[key]; | ||
| return a < b ? -1 : a > b ? 1 : 0; | ||
| }, | ||
| finalSorter = sorter, | ||
| tableBody = document.querySelector('.coverage-summary tbody'), | ||
| rowNodes = tableBody.querySelectorAll('tr'), | ||
| rows = [], | ||
| i; | ||
| if (desc) { | ||
| finalSorter = function(a, b) { | ||
| return -1 * sorter(a, b); | ||
| }; | ||
| } | ||
| for (i = 0; i < rowNodes.length; i += 1) { | ||
| rows.push(rowNodes[i]); | ||
| tableBody.removeChild(rowNodes[i]); | ||
| } | ||
| rows.sort(finalSorter); | ||
| for (i = 0; i < rows.length; i += 1) { | ||
| tableBody.appendChild(rows[i]); | ||
| } | ||
| } | ||
| // removes sort indicators for current column being sorted | ||
| function removeSortIndicators() { | ||
| var col = getNthColumn(currentSort.index), | ||
| cls = col.className; | ||
| cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, ''); | ||
| col.className = cls; | ||
| } | ||
| // adds sort indicators for current column being sorted | ||
| function addSortIndicators() { | ||
| getNthColumn(currentSort.index).className += currentSort.desc | ||
| ? ' sorted-desc' | ||
| : ' sorted'; | ||
| } | ||
| // adds event listeners for all sorter widgets | ||
| function enableUI() { | ||
| var i, | ||
| el, | ||
| ithSorter = function ithSorter(i) { | ||
| var col = cols[i]; | ||
| return function() { | ||
| var desc = col.defaultDescSort; | ||
| if (currentSort.index === i) { | ||
| desc = !currentSort.desc; | ||
| } | ||
| sortByIndex(i, desc); | ||
| removeSortIndicators(); | ||
| currentSort.index = i; | ||
| currentSort.desc = desc; | ||
| addSortIndicators(); | ||
| }; | ||
| }; | ||
| for (i = 0; i < cols.length; i += 1) { | ||
| if (cols[i].sortable) { | ||
| // add the click event handler on the th so users | ||
| // dont have to click on those tiny arrows | ||
| el = getNthColumn(i).querySelector('.sorter').parentElement; | ||
| if (el.addEventListener) { | ||
| el.addEventListener('click', ithSorter(i)); | ||
| } else { | ||
| el.attachEvent('onclick', ithSorter(i)); | ||
| } | ||
| } | ||
| } | ||
| } | ||
| // adds sorting functionality to the UI | ||
| return function() { | ||
| if (!getTable()) { | ||
| return; | ||
| } | ||
| cols = loadColumns(); | ||
| loadData(); | ||
| addSortIndicators(); | ||
| enableUI(); | ||
| }; | ||
| })(); | ||
| window.addEventListener('load', addSorting); |
| <!doctype html> | ||
| <html lang="en"> | ||
| <head> | ||
| <title>Code coverage report for src</title> | ||
| <meta charset="utf-8" /> | ||
| <link rel="stylesheet" href="../prettify.css" /> | ||
| <link rel="stylesheet" href="../base.css" /> | ||
| <meta name="viewport" content="width=device-width, initial-scale=1"> | ||
| <style type='text/css'> | ||
| .coverage-summary .sorter { | ||
| background-image: url(../sort-arrow-sprite.png); | ||
| } | ||
| </style> | ||
| </head> | ||
| <body> | ||
| <div class='wrapper'> | ||
| <div class='pad1'> | ||
| <h1> | ||
| <a href="../index.html">All files</a> src | ||
| </h1> | ||
| <div class='clearfix'> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Statements</span> | ||
| <span class='fraction'>20/20</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Branches</span> | ||
| <span class='fraction'>0/0</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Functions</span> | ||
| <span class='fraction'>0/0</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Lines</span> | ||
| <span class='fraction'>20/20</span> | ||
| </div> | ||
| </div> | ||
| <p class="quiet"> | ||
| Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block. | ||
| </p> | ||
| </div> | ||
| <div class='status-line high'></div> | ||
| <div class="pad1"> | ||
| <table class="coverage-summary"> | ||
| <thead> | ||
| <tr> | ||
| <th data-col="file" data-fmt="html" data-html="true" class="file">File</th> | ||
| <th data-col="pic" data-type="number" data-fmt="html" data-html="true" class="pic"></th> | ||
| <th data-col="statements" data-type="number" data-fmt="pct" class="pct">Statements</th> | ||
| <th data-col="statements_raw" data-type="number" data-fmt="html" class="abs"></th> | ||
| <th data-col="branches" data-type="number" data-fmt="pct" class="pct">Branches</th> | ||
| <th data-col="branches_raw" data-type="number" data-fmt="html" class="abs"></th> | ||
| <th data-col="functions" data-type="number" data-fmt="pct" class="pct">Functions</th> | ||
| <th data-col="functions_raw" data-type="number" data-fmt="html" class="abs"></th> | ||
| <th data-col="lines" data-type="number" data-fmt="pct" class="pct">Lines</th> | ||
| <th data-col="lines_raw" data-type="number" data-fmt="html" class="abs"></th> | ||
| </tr> | ||
| </thead> | ||
| <tbody><tr> | ||
| <td class="file high" data-value="react-children-utilities.ts"><a href="react-children-utilities.ts.html">react-children-utilities.ts</a></td> | ||
| <td data-value="100" class="pic high"><div class="chart"><div class="cover-fill cover-full" style="width: 100%;"></div><div class="cover-empty" style="width:0%;"></div></div></td> | ||
| <td data-value="100" class="pct high">100%</td> | ||
| <td data-value="20" class="abs high">20/20</td> | ||
| <td data-value="100" class="pct high">100%</td> | ||
| <td data-value="0" class="abs high">0/0</td> | ||
| <td data-value="100" class="pct high">100%</td> | ||
| <td data-value="0" class="abs high">0/0</td> | ||
| <td data-value="100" class="pct high">100%</td> | ||
| <td data-value="20" class="abs high">20/20</td> | ||
| </tr> | ||
| </tbody> | ||
| </table> | ||
| </div><div class='push'></div><!-- for sticky footer --> | ||
| </div><!-- /wrapper --> | ||
| <div class='footer quiet pad2 space-top1 center small'> | ||
| Code coverage | ||
| generated by <a href="https://istanbul.js.org/" target="_blank">istanbul</a> at Mon Oct 14 2019 07:10:02 GMT+0100 (British Summer Time) | ||
| </div> | ||
| </div> | ||
| <script src="../prettify.js"></script> | ||
| <script> | ||
| window.onload = function () { | ||
| if (typeof prettyPrint === 'function') { | ||
| prettyPrint(); | ||
| } | ||
| }; | ||
| </script> | ||
| <script src="../sorter.js"></script> | ||
| <script src="../block-navigation.js"></script> | ||
| </body> | ||
| </html> |
| <!doctype html> | ||
| <html lang="en"> | ||
| <head> | ||
| <title>Code coverage report for src/index.ts</title> | ||
| <meta charset="utf-8" /> | ||
| <link rel="stylesheet" href="../prettify.css" /> | ||
| <link rel="stylesheet" href="../base.css" /> | ||
| <meta name="viewport" content="width=device-width, initial-scale=1"> | ||
| <style type='text/css'> | ||
| .coverage-summary .sorter { | ||
| background-image: url(../sort-arrow-sprite.png); | ||
| } | ||
| </style> | ||
| </head> | ||
| <body> | ||
| <div class='wrapper'> | ||
| <div class='pad1'> | ||
| <h1> | ||
| <a href="../index.html">All files</a> / <a href="index.html">src</a> index.ts | ||
| </h1> | ||
| <div class='clearfix'> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Statements</span> | ||
| <span class='fraction'>20/20</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Branches</span> | ||
| <span class='fraction'>0/0</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Functions</span> | ||
| <span class='fraction'>0/0</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Lines</span> | ||
| <span class='fraction'>20/20</span> | ||
| </div> | ||
| </div> | ||
| <p class="quiet"> | ||
| Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block. | ||
| </p> | ||
| </div> | ||
| <div class='status-line high'></div> | ||
| <pre><table class="coverage"> | ||
| <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a> | ||
| <a name='L2'></a><a href='#L2'>2</a> | ||
| <a name='L3'></a><a href='#L3'>3</a> | ||
| <a name='L4'></a><a href='#L4'>4</a> | ||
| <a name='L5'></a><a href='#L5'>5</a> | ||
| <a name='L6'></a><a href='#L6'>6</a> | ||
| <a name='L7'></a><a href='#L7'>7</a> | ||
| <a name='L8'></a><a href='#L8'>8</a> | ||
| <a name='L9'></a><a href='#L9'>9</a> | ||
| <a name='L10'></a><a href='#L10'>10</a> | ||
| <a name='L11'></a><a href='#L11'>11</a> | ||
| <a name='L12'></a><a href='#L12'>12</a> | ||
| <a name='L13'></a><a href='#L13'>13</a> | ||
| <a name='L14'></a><a href='#L14'>14</a> | ||
| <a name='L15'></a><a href='#L15'>15</a> | ||
| <a name='L16'></a><a href='#L16'>16</a> | ||
| <a name='L17'></a><a href='#L17'>17</a> | ||
| <a name='L18'></a><a href='#L18'>18</a> | ||
| <a name='L19'></a><a href='#L19'>19</a> | ||
| <a name='L20'></a><a href='#L20'>20</a> | ||
| <a name='L21'></a><a href='#L21'>21</a> | ||
| <a name='L22'></a><a href='#L22'>22</a> | ||
| <a name='L23'></a><a href='#L23'>23</a> | ||
| <a name='L24'></a><a href='#L24'>24</a> | ||
| <a name='L25'></a><a href='#L25'>25</a> | ||
| <a name='L26'></a><a href='#L26'>26</a> | ||
| <a name='L27'></a><a href='#L27'>27</a> | ||
| <a name='L28'></a><a href='#L28'>28</a> | ||
| <a name='L29'></a><a href='#L29'>29</a> | ||
| <a name='L30'></a><a href='#L30'>30</a> | ||
| <a name='L31'></a><a href='#L31'>31</a> | ||
| <a name='L32'></a><a href='#L32'>32</a> | ||
| <a name='L33'></a><a href='#L33'>33</a> | ||
| <a name='L34'></a><a href='#L34'>34</a> | ||
| <a name='L35'></a><a href='#L35'>35</a> | ||
| <a name='L36'></a><a href='#L36'>36</a> | ||
| <a name='L37'></a><a href='#L37'>37</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import { Children } from 'react'; | ||
| | ||
| import deepFilter from './lib/deepFilter'; | ||
| import deepFind from './lib/deepFind'; | ||
| import deepForEach from './lib/deepForEach'; | ||
| import deepMap from './lib/deepMap'; | ||
| import filter from './lib/filter'; | ||
| import groupByType from './lib/groupByType'; | ||
| import hasChildren from './lib/hasChildren'; | ||
| import hasComplexChildren from './lib/hasComplexChildren'; | ||
| import onlyText from './lib/onlyText'; | ||
| | ||
| export { | ||
| deepFilter, | ||
| deepFind, | ||
| deepForEach, | ||
| deepMap, | ||
| filter, | ||
| groupByType, | ||
| hasChildren, | ||
| hasComplexChildren, | ||
| onlyText, | ||
| }; | ||
| | ||
| export default { | ||
| ...Children, | ||
| deepFilter, | ||
| deepFind, | ||
| deepForEach, | ||
| deepMap, | ||
| filter, | ||
| groupByType, | ||
| hasChildren, | ||
| hasComplexChildren, | ||
| onlyText, | ||
| }; | ||
| </pre></td></tr> | ||
| </table></pre> | ||
| <div class='push'></div><!-- for sticky footer --> | ||
| </div><!-- /wrapper --> | ||
| <div class='footer quiet pad2 space-top1 center small'> | ||
| Code coverage | ||
| generated by <a href="https://istanbul.js.org/" target="_blank">istanbul</a> at Thu Oct 10 2019 20:25:57 GMT+0100 (British Summer Time) | ||
| </div> | ||
| </div> | ||
| <script src="../prettify.js"></script> | ||
| <script> | ||
| window.onload = function () { | ||
| if (typeof prettyPrint === 'function') { | ||
| prettyPrint(); | ||
| } | ||
| }; | ||
| </script> | ||
| <script src="../sorter.js"></script> | ||
| <script src="../block-navigation.js"></script> | ||
| </body> | ||
| </html> |
| <!doctype html> | ||
| <html lang="en"> | ||
| <head> | ||
| <title>Code coverage report for src/lib/deepFilter.ts</title> | ||
| <meta charset="utf-8" /> | ||
| <link rel="stylesheet" href="../../prettify.css" /> | ||
| <link rel="stylesheet" href="../../base.css" /> | ||
| <meta name="viewport" content="width=device-width, initial-scale=1"> | ||
| <style type='text/css'> | ||
| .coverage-summary .sorter { | ||
| background-image: url(../../sort-arrow-sprite.png); | ||
| } | ||
| </style> | ||
| </head> | ||
| <body> | ||
| <div class='wrapper'> | ||
| <div class='pad1'> | ||
| <h1> | ||
| <a href="../../index.html">All files</a> / <a href="index.html">src/lib</a> deepFilter.ts | ||
| </h1> | ||
| <div class='clearfix'> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Statements</span> | ||
| <span class='fraction'>8/8</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Branches</span> | ||
| <span class='fraction'>2/2</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Functions</span> | ||
| <span class='fraction'>2/2</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Lines</span> | ||
| <span class='fraction'>8/8</span> | ||
| </div> | ||
| </div> | ||
| <p class="quiet"> | ||
| Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block. | ||
| </p> | ||
| </div> | ||
| <div class='status-line high'></div> | ||
| <pre><table class="coverage"> | ||
| <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a> | ||
| <a name='L2'></a><a href='#L2'>2</a> | ||
| <a name='L3'></a><a href='#L3'>3</a> | ||
| <a name='L4'></a><a href='#L4'>4</a> | ||
| <a name='L5'></a><a href='#L5'>5</a> | ||
| <a name='L6'></a><a href='#L6'>6</a> | ||
| <a name='L7'></a><a href='#L7'>7</a> | ||
| <a name='L8'></a><a href='#L8'>8</a> | ||
| <a name='L9'></a><a href='#L9'>9</a> | ||
| <a name='L10'></a><a href='#L10'>10</a> | ||
| <a name='L11'></a><a href='#L11'>11</a> | ||
| <a name='L12'></a><a href='#L12'>12</a> | ||
| <a name='L13'></a><a href='#L13'>13</a> | ||
| <a name='L14'></a><a href='#L14'>14</a> | ||
| <a name='L15'></a><a href='#L15'>15</a> | ||
| <a name='L16'></a><a href='#L16'>16</a> | ||
| <a name='L17'></a><a href='#L17'>17</a> | ||
| <a name='L18'></a><a href='#L18'>18</a> | ||
| <a name='L19'></a><a href='#L19'>19</a> | ||
| <a name='L20'></a><a href='#L20'>20</a> | ||
| <a name='L21'></a><a href='#L21'>21</a> | ||
| <a name='L22'></a><a href='#L22'>22</a> | ||
| <a name='L23'></a><a href='#L23'>23</a> | ||
| <a name='L24'></a><a href='#L24'>24</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-yes">8x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">13x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">4x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">9x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import { Children, cloneElement, ReactElement, ReactNode } from 'react'; | ||
| import hasComplexChildren from './hasComplexChildren'; | ||
| | ||
| export interface FilterFunction { | ||
| (child: ReactNode, index?: number, children?: ReactNode[]): boolean; | ||
| } | ||
| | ||
| const deepFilter = (children: ReactNode, deepFilterFn: FilterFunction): ReactNode[] => { | ||
| return Children.toArray(children) | ||
| .filter(deepFilterFn) | ||
| .map((child) => { | ||
| if (hasComplexChildren(child)) { | ||
| // Clone the child that has children and filter them too | ||
| return cloneElement(child as ReactElement, { | ||
| ...(child as ReactElement).props, | ||
| children: deepFilter((child as ReactElement).props.children, deepFilterFn), | ||
| }); | ||
| } | ||
| return child; | ||
| }); | ||
| }; | ||
| | ||
| export default deepFilter; | ||
| </pre></td></tr> | ||
| </table></pre> | ||
| <div class='push'></div><!-- for sticky footer --> | ||
| </div><!-- /wrapper --> | ||
| <div class='footer quiet pad2 space-top1 center small'> | ||
| Code coverage | ||
| generated by <a href="https://istanbul.js.org/" target="_blank">istanbul</a> at Mon Oct 14 2019 07:10:02 GMT+0100 (British Summer Time) | ||
| </div> | ||
| </div> | ||
| <script src="../../prettify.js"></script> | ||
| <script> | ||
| window.onload = function () { | ||
| if (typeof prettyPrint === 'function') { | ||
| prettyPrint(); | ||
| } | ||
| }; | ||
| </script> | ||
| <script src="../../sorter.js"></script> | ||
| <script src="../../block-navigation.js"></script> | ||
| </body> | ||
| </html> |
| <!doctype html> | ||
| <html lang="en"> | ||
| <head> | ||
| <title>Code coverage report for src/lib/deepFind.ts</title> | ||
| <meta charset="utf-8" /> | ||
| <link rel="stylesheet" href="../../prettify.css" /> | ||
| <link rel="stylesheet" href="../../base.css" /> | ||
| <meta name="viewport" content="width=device-width, initial-scale=1"> | ||
| <style type='text/css'> | ||
| .coverage-summary .sorter { | ||
| background-image: url(../../sort-arrow-sprite.png); | ||
| } | ||
| </style> | ||
| </head> | ||
| <body> | ||
| <div class='wrapper'> | ||
| <div class='pad1'> | ||
| <h1> | ||
| <a href="../../index.html">All files</a> / <a href="index.html">src/lib</a> deepFind.ts | ||
| </h1> | ||
| <div class='clearfix'> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Statements</span> | ||
| <span class='fraction'>13/13</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Branches</span> | ||
| <span class='fraction'>4/4</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Functions</span> | ||
| <span class='fraction'>2/2</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Lines</span> | ||
| <span class='fraction'>13/13</span> | ||
| </div> | ||
| </div> | ||
| <p class="quiet"> | ||
| Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block. | ||
| </p> | ||
| </div> | ||
| <div class='status-line high'></div> | ||
| <pre><table class="coverage"> | ||
| <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a> | ||
| <a name='L2'></a><a href='#L2'>2</a> | ||
| <a name='L3'></a><a href='#L3'>3</a> | ||
| <a name='L4'></a><a href='#L4'>4</a> | ||
| <a name='L5'></a><a href='#L5'>5</a> | ||
| <a name='L6'></a><a href='#L6'>6</a> | ||
| <a name='L7'></a><a href='#L7'>7</a> | ||
| <a name='L8'></a><a href='#L8'>8</a> | ||
| <a name='L9'></a><a href='#L9'>9</a> | ||
| <a name='L10'></a><a href='#L10'>10</a> | ||
| <a name='L11'></a><a href='#L11'>11</a> | ||
| <a name='L12'></a><a href='#L12'>12</a> | ||
| <a name='L13'></a><a href='#L13'>13</a> | ||
| <a name='L14'></a><a href='#L14'>14</a> | ||
| <a name='L15'></a><a href='#L15'>15</a> | ||
| <a name='L16'></a><a href='#L16'>16</a> | ||
| <a name='L17'></a><a href='#L17'>17</a> | ||
| <a name='L18'></a><a href='#L18'>18</a> | ||
| <a name='L19'></a><a href='#L19'>19</a> | ||
| <a name='L20'></a><a href='#L20'>20</a> | ||
| <a name='L21'></a><a href='#L21'>21</a> | ||
| <a name='L22'></a><a href='#L22'>22</a> | ||
| <a name='L23'></a><a href='#L23'>23</a> | ||
| <a name='L24'></a><a href='#L24'>24</a> | ||
| <a name='L25'></a><a href='#L25'>25</a> | ||
| <a name='L26'></a><a href='#L26'>26</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">4x</span> | ||
| <span class="cline-any cline-yes">7x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">6x</span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">4x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">4x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import { Children, ReactNode, ReactElement } from 'react'; | ||
| import hasComplexChildren from './hasComplexChildren'; | ||
| | ||
| export interface FindFunction { | ||
| (child: ReactNode, index?: number, children?: ReactNode[]): ReactNode; | ||
| } | ||
| | ||
| const deepFind = (children: ReactNode, deepFindFn: FindFunction): ReactNode | undefined => { | ||
| let found; | ||
| Children.toArray(children).find((child) => { | ||
| if (hasComplexChildren(child)) { | ||
| // Find inside the child that has children | ||
| found = deepFind((child as ReactElement).props.children, deepFindFn); | ||
| return typeof found !== 'undefined'; | ||
| } | ||
| if (deepFindFn(child)) { | ||
| found = child; | ||
| return true; | ||
| } | ||
| return false; | ||
| }); | ||
| return found; | ||
| }; | ||
| | ||
| export default deepFind; | ||
| </pre></td></tr> | ||
| </table></pre> | ||
| <div class='push'></div><!-- for sticky footer --> | ||
| </div><!-- /wrapper --> | ||
| <div class='footer quiet pad2 space-top1 center small'> | ||
| Code coverage | ||
| generated by <a href="https://istanbul.js.org/" target="_blank">istanbul</a> at Mon Oct 14 2019 07:10:02 GMT+0100 (British Summer Time) | ||
| </div> | ||
| </div> | ||
| <script src="../../prettify.js"></script> | ||
| <script> | ||
| window.onload = function () { | ||
| if (typeof prettyPrint === 'function') { | ||
| prettyPrint(); | ||
| } | ||
| }; | ||
| </script> | ||
| <script src="../../sorter.js"></script> | ||
| <script src="../../block-navigation.js"></script> | ||
| </body> | ||
| </html> |
| <!doctype html> | ||
| <html lang="en"> | ||
| <head> | ||
| <title>Code coverage report for src/lib/deepForEach.ts</title> | ||
| <meta charset="utf-8" /> | ||
| <link rel="stylesheet" href="../../prettify.css" /> | ||
| <link rel="stylesheet" href="../../base.css" /> | ||
| <meta name="viewport" content="width=device-width, initial-scale=1"> | ||
| <style type='text/css'> | ||
| .coverage-summary .sorter { | ||
| background-image: url(../../sort-arrow-sprite.png); | ||
| } | ||
| </style> | ||
| </head> | ||
| <body> | ||
| <div class='wrapper'> | ||
| <div class='pad1'> | ||
| <h1> | ||
| <a href="../../index.html">All files</a> / <a href="index.html">src/lib</a> deepForEach.ts | ||
| </h1> | ||
| <div class='clearfix'> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Statements</span> | ||
| <span class='fraction'>8/8</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Branches</span> | ||
| <span class='fraction'>2/2</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Functions</span> | ||
| <span class='fraction'>2/2</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Lines</span> | ||
| <span class='fraction'>8/8</span> | ||
| </div> | ||
| </div> | ||
| <p class="quiet"> | ||
| Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block. | ||
| </p> | ||
| </div> | ||
| <div class='status-line high'></div> | ||
| <pre><table class="coverage"> | ||
| <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a> | ||
| <a name='L2'></a><a href='#L2'>2</a> | ||
| <a name='L3'></a><a href='#L3'>3</a> | ||
| <a name='L4'></a><a href='#L4'>4</a> | ||
| <a name='L5'></a><a href='#L5'>5</a> | ||
| <a name='L6'></a><a href='#L6'>6</a> | ||
| <a name='L7'></a><a href='#L7'>7</a> | ||
| <a name='L8'></a><a href='#L8'>8</a> | ||
| <a name='L9'></a><a href='#L9'>9</a> | ||
| <a name='L10'></a><a href='#L10'>10</a> | ||
| <a name='L11'></a><a href='#L11'>11</a> | ||
| <a name='L12'></a><a href='#L12'>12</a> | ||
| <a name='L13'></a><a href='#L13'>13</a> | ||
| <a name='L14'></a><a href='#L14'>14</a> | ||
| <a name='L15'></a><a href='#L15'>15</a> | ||
| <a name='L16'></a><a href='#L16'>16</a> | ||
| <a name='L17'></a><a href='#L17'>17</a> | ||
| <a name='L18'></a><a href='#L18'>18</a> | ||
| <a name='L19'></a><a href='#L19'>19</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-yes">6x</span> | ||
| <span class="cline-any cline-yes">11x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">3x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">11x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import { Children, ReactElement, ReactNode } from 'react'; | ||
| import hasComplexChildren from './hasComplexChildren'; | ||
| | ||
| export interface ForEachFunction { | ||
| (child: ReactNode, index?: number, children?: ReactNode[]): void; | ||
| } | ||
| | ||
| const deepForEach = (children: ReactNode, deepForEachFn: ForEachFunction): void => { | ||
| Children.forEach(children, (child) => { | ||
| if (hasComplexChildren(child)) { | ||
| // Each inside the child that has children | ||
| deepForEach((child as ReactElement).props.children, deepForEachFn); | ||
| } | ||
| deepForEachFn(child); | ||
| }); | ||
| }; | ||
| | ||
| export default deepForEach; | ||
| </pre></td></tr> | ||
| </table></pre> | ||
| <div class='push'></div><!-- for sticky footer --> | ||
| </div><!-- /wrapper --> | ||
| <div class='footer quiet pad2 space-top1 center small'> | ||
| Code coverage | ||
| generated by <a href="https://istanbul.js.org/" target="_blank">istanbul</a> at Mon Oct 14 2019 07:10:02 GMT+0100 (British Summer Time) | ||
| </div> | ||
| </div> | ||
| <script src="../../prettify.js"></script> | ||
| <script> | ||
| window.onload = function () { | ||
| if (typeof prettyPrint === 'function') { | ||
| prettyPrint(); | ||
| } | ||
| }; | ||
| </script> | ||
| <script src="../../sorter.js"></script> | ||
| <script src="../../block-navigation.js"></script> | ||
| </body> | ||
| </html> |
| <!doctype html> | ||
| <html lang="en"> | ||
| <head> | ||
| <title>Code coverage report for src/lib/deepMap.ts</title> | ||
| <meta charset="utf-8" /> | ||
| <link rel="stylesheet" href="../../prettify.css" /> | ||
| <link rel="stylesheet" href="../../base.css" /> | ||
| <meta name="viewport" content="width=device-width, initial-scale=1"> | ||
| <style type='text/css'> | ||
| .coverage-summary .sorter { | ||
| background-image: url(../../sort-arrow-sprite.png); | ||
| } | ||
| </style> | ||
| </head> | ||
| <body> | ||
| <div class='wrapper'> | ||
| <div class='pad1'> | ||
| <h1> | ||
| <a href="../../index.html">All files</a> / <a href="index.html">src/lib</a> deepMap.ts | ||
| </h1> | ||
| <div class='clearfix'> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Statements</span> | ||
| <span class='fraction'>8/8</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Branches</span> | ||
| <span class='fraction'>2/2</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Functions</span> | ||
| <span class='fraction'>2/2</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Lines</span> | ||
| <span class='fraction'>8/8</span> | ||
| </div> | ||
| </div> | ||
| <p class="quiet"> | ||
| Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block. | ||
| </p> | ||
| </div> | ||
| <div class='status-line high'></div> | ||
| <pre><table class="coverage"> | ||
| <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a> | ||
| <a name='L2'></a><a href='#L2'>2</a> | ||
| <a name='L3'></a><a href='#L3'>3</a> | ||
| <a name='L4'></a><a href='#L4'>4</a> | ||
| <a name='L5'></a><a href='#L5'>5</a> | ||
| <a name='L6'></a><a href='#L6'>6</a> | ||
| <a name='L7'></a><a href='#L7'>7</a> | ||
| <a name='L8'></a><a href='#L8'>8</a> | ||
| <a name='L9'></a><a href='#L9'>9</a> | ||
| <a name='L10'></a><a href='#L10'>10</a> | ||
| <a name='L11'></a><a href='#L11'>11</a> | ||
| <a name='L12'></a><a href='#L12'>12</a> | ||
| <a name='L13'></a><a href='#L13'>13</a> | ||
| <a name='L14'></a><a href='#L14'>14</a> | ||
| <a name='L15'></a><a href='#L15'>15</a> | ||
| <a name='L16'></a><a href='#L16'>16</a> | ||
| <a name='L17'></a><a href='#L17'>17</a> | ||
| <a name='L18'></a><a href='#L18'>18</a> | ||
| <a name='L19'></a><a href='#L19'>19</a> | ||
| <a name='L20'></a><a href='#L20'>20</a> | ||
| <a name='L21'></a><a href='#L21'>21</a> | ||
| <a name='L22'></a><a href='#L22'>22</a> | ||
| <a name='L23'></a><a href='#L23'>23</a> | ||
| <a name='L24'></a><a href='#L24'>24</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-yes">6x</span> | ||
| <span class="cline-any cline-yes">10x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">3x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">7x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import { Children, cloneElement, ReactElement, ReactNode } from 'react'; | ||
| import hasComplexChildren from './hasComplexChildren'; | ||
| | ||
| export interface MapFunction { | ||
| (child: ReactNode, index?: number, children?: ReactNode[]): ReactNode; | ||
| } | ||
| | ||
| const deepMap = (children: ReactNode, deepMapFn: MapFunction): ReactNode[] => { | ||
| return Children.map(children, (child) => { | ||
| if (hasComplexChildren(child)) { | ||
| // Clone the child that has children and map them too | ||
| return deepMapFn( | ||
| cloneElement(child as ReactElement, { | ||
| ...(child as ReactElement).props, | ||
| children: deepMap((child as ReactElement).props.children, deepMapFn), | ||
| }), | ||
| ); | ||
| } | ||
| return deepMapFn(child); | ||
| }); | ||
| }; | ||
| | ||
| export default deepMap; | ||
| </pre></td></tr> | ||
| </table></pre> | ||
| <div class='push'></div><!-- for sticky footer --> | ||
| </div><!-- /wrapper --> | ||
| <div class='footer quiet pad2 space-top1 center small'> | ||
| Code coverage | ||
| generated by <a href="https://istanbul.js.org/" target="_blank">istanbul</a> at Mon Oct 14 2019 07:10:02 GMT+0100 (British Summer Time) | ||
| </div> | ||
| </div> | ||
| <script src="../../prettify.js"></script> | ||
| <script> | ||
| window.onload = function () { | ||
| if (typeof prettyPrint === 'function') { | ||
| prettyPrint(); | ||
| } | ||
| }; | ||
| </script> | ||
| <script src="../../sorter.js"></script> | ||
| <script src="../../block-navigation.js"></script> | ||
| </body> | ||
| </html> |
| <!doctype html> | ||
| <html lang="en"> | ||
| <head> | ||
| <title>Code coverage report for src/lib/filter.ts</title> | ||
| <meta charset="utf-8" /> | ||
| <link rel="stylesheet" href="../../prettify.css" /> | ||
| <link rel="stylesheet" href="../../base.css" /> | ||
| <meta name="viewport" content="width=device-width, initial-scale=1"> | ||
| <style type='text/css'> | ||
| .coverage-summary .sorter { | ||
| background-image: url(../../sort-arrow-sprite.png); | ||
| } | ||
| </style> | ||
| </head> | ||
| <body> | ||
| <div class='wrapper'> | ||
| <div class='pad1'> | ||
| <h1> | ||
| <a href="../../index.html">All files</a> / <a href="index.html">src/lib</a> filter.ts | ||
| </h1> | ||
| <div class='clearfix'> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Statements</span> | ||
| <span class='fraction'>4/4</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Branches</span> | ||
| <span class='fraction'>0/0</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Functions</span> | ||
| <span class='fraction'>1/1</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Lines</span> | ||
| <span class='fraction'>4/4</span> | ||
| </div> | ||
| </div> | ||
| <p class="quiet"> | ||
| Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block. | ||
| </p> | ||
| </div> | ||
| <div class='status-line high'></div> | ||
| <pre><table class="coverage"> | ||
| <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a> | ||
| <a name='L2'></a><a href='#L2'>2</a> | ||
| <a name='L3'></a><a href='#L3'>3</a> | ||
| <a name='L4'></a><a href='#L4'>4</a> | ||
| <a name='L5'></a><a href='#L5'>5</a> | ||
| <a name='L6'></a><a href='#L6'>6</a> | ||
| <a name='L7'></a><a href='#L7'>7</a> | ||
| <a name='L8'></a><a href='#L8'>8</a> | ||
| <a name='L9'></a><a href='#L9'>9</a> | ||
| <a name='L10'></a><a href='#L10'>10</a> | ||
| <a name='L11'></a><a href='#L11'>11</a> | ||
| <a name='L12'></a><a href='#L12'>12</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-yes">4x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import { Children, ReactNode } from 'react'; | ||
| | ||
| export interface FilterFunction { | ||
| (child: ReactNode, index?: number, children?: ReactNode[]): boolean; | ||
| } | ||
| | ||
| const filter = (children: ReactNode, filterFn: FilterFunction): ReactNode[] => { | ||
| return Children.toArray(children).filter(filterFn); | ||
| }; | ||
| | ||
| export default filter; | ||
| </pre></td></tr> | ||
| </table></pre> | ||
| <div class='push'></div><!-- for sticky footer --> | ||
| </div><!-- /wrapper --> | ||
| <div class='footer quiet pad2 space-top1 center small'> | ||
| Code coverage | ||
| generated by <a href="https://istanbul.js.org/" target="_blank">istanbul</a> at Mon Oct 14 2019 07:10:02 GMT+0100 (British Summer Time) | ||
| </div> | ||
| </div> | ||
| <script src="../../prettify.js"></script> | ||
| <script> | ||
| window.onload = function () { | ||
| if (typeof prettyPrint === 'function') { | ||
| prettyPrint(); | ||
| } | ||
| }; | ||
| </script> | ||
| <script src="../../sorter.js"></script> | ||
| <script src="../../block-navigation.js"></script> | ||
| </body> | ||
| </html> |
| <!doctype html> | ||
| <html lang="en"> | ||
| <head> | ||
| <title>Code coverage report for src/lib/groupByType.ts</title> | ||
| <meta charset="utf-8" /> | ||
| <link rel="stylesheet" href="../../prettify.css" /> | ||
| <link rel="stylesheet" href="../../base.css" /> | ||
| <meta name="viewport" content="width=device-width, initial-scale=1"> | ||
| <style type='text/css'> | ||
| .coverage-summary .sorter { | ||
| background-image: url(../../sort-arrow-sprite.png); | ||
| } | ||
| </style> | ||
| </head> | ||
| <body> | ||
| <div class='wrapper'> | ||
| <div class='pad1'> | ||
| <h1> | ||
| <a href="../../index.html">All files</a> / <a href="index.html">src/lib</a> groupByType.ts | ||
| </h1> | ||
| <div class='clearfix'> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">90.91% </span> | ||
| <span class="quiet">Statements</span> | ||
| <span class='fraction'>10/11</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">75% </span> | ||
| <span class="quiet">Branches</span> | ||
| <span class='fraction'>9/12</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Functions</span> | ||
| <span class='fraction'>2/2</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">90.91% </span> | ||
| <span class="quiet">Lines</span> | ||
| <span class='fraction'>10/11</span> | ||
| </div> | ||
| </div> | ||
| <p class="quiet"> | ||
| Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block. | ||
| </p> | ||
| </div> | ||
| <div class='status-line high'></div> | ||
| <pre><table class="coverage"> | ||
| <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a> | ||
| <a name='L2'></a><a href='#L2'>2</a> | ||
| <a name='L3'></a><a href='#L3'>3</a> | ||
| <a name='L4'></a><a href='#L4'>4</a> | ||
| <a name='L5'></a><a href='#L5'>5</a> | ||
| <a name='L6'></a><a href='#L6'>6</a> | ||
| <a name='L7'></a><a href='#L7'>7</a> | ||
| <a name='L8'></a><a href='#L8'>8</a> | ||
| <a name='L9'></a><a href='#L9'>9</a> | ||
| <a name='L10'></a><a href='#L10'>10</a> | ||
| <a name='L11'></a><a href='#L11'>11</a> | ||
| <a name='L12'></a><a href='#L12'>12</a> | ||
| <a name='L13'></a><a href='#L13'>13</a> | ||
| <a name='L14'></a><a href='#L14'>14</a> | ||
| <a name='L15'></a><a href='#L15'>15</a> | ||
| <a name='L16'></a><a href='#L16'>16</a> | ||
| <a name='L17'></a><a href='#L17'>17</a> | ||
| <a name='L18'></a><a href='#L18'>18</a> | ||
| <a name='L19'></a><a href='#L19'>19</a> | ||
| <a name='L20'></a><a href='#L20'>20</a> | ||
| <a name='L21'></a><a href='#L21'>21</a> | ||
| <a name='L22'></a><a href='#L22'>22</a> | ||
| <a name='L23'></a><a href='#L23'>23</a> | ||
| <a name='L24'></a><a href='#L24'>24</a> | ||
| <a name='L25'></a><a href='#L25'>25</a> | ||
| <a name='L26'></a><a href='#L26'>26</a> | ||
| <a name='L27'></a><a href='#L27'>27</a> | ||
| <a name='L28'></a><a href='#L28'>28</a> | ||
| <a name='L29'></a><a href='#L29'>29</a> | ||
| <a name='L30'></a><a href='#L30'>30</a> | ||
| <a name='L31'></a><a href='#L31'>31</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">3x</span> | ||
| <span class="cline-any cline-yes">9x</span> | ||
| <span class="cline-any cline-yes">9x</span> | ||
| <span class="cline-any cline-yes">9x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">9x</span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">9x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">9x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import { Children, isValidElement, ReactNode, ReactElement } from 'react'; | ||
| | ||
| export interface GroupedChildren { | ||
| [name: string]: ReactNode[]; | ||
| } | ||
| | ||
| const groupByType = ( | ||
| children: ReactNode, | ||
| types: ReactNode[] = <span class="branch-0 cbranch-no" title="branch not covered" >[],</span> | ||
| rest = <span class="branch-0 cbranch-no" title="branch not covered" >'rest',</span> | ||
| ): GroupedChildren => { | ||
| return Children.toArray(children).reduce((groups: GroupedChildren, child: ReactNode) => { | ||
| const isGrouped = isValidElement(child) && types.includes(child.type); | ||
| const addChild = isGrouped ? (child as ReactElement).props.children : child; | ||
| const key = isGrouped ? (child as ReactElement).type : rest; | ||
| | ||
| <span class="missing-if-branch" title="if path not taken" >I</span>if (typeof key !== 'string') { | ||
| <span class="cstat-no" title="statement not covered" > return groups;</span> | ||
| } | ||
| | ||
| const group = groups[key]; | ||
| | ||
| return { | ||
| ...groups, | ||
| [key]: [...(group || []), addChild], | ||
| }; | ||
| }, {}); | ||
| }; | ||
| | ||
| export default groupByType; | ||
| </pre></td></tr> | ||
| </table></pre> | ||
| <div class='push'></div><!-- for sticky footer --> | ||
| </div><!-- /wrapper --> | ||
| <div class='footer quiet pad2 space-top1 center small'> | ||
| Code coverage | ||
| generated by <a href="https://istanbul.js.org/" target="_blank">istanbul</a> at Mon Oct 14 2019 07:10:02 GMT+0100 (British Summer Time) | ||
| </div> | ||
| </div> | ||
| <script src="../../prettify.js"></script> | ||
| <script> | ||
| window.onload = function () { | ||
| if (typeof prettyPrint === 'function') { | ||
| prettyPrint(); | ||
| } | ||
| }; | ||
| </script> | ||
| <script src="../../sorter.js"></script> | ||
| <script src="../../block-navigation.js"></script> | ||
| </body> | ||
| </html> |
| <!doctype html> | ||
| <html lang="en"> | ||
| <head> | ||
| <title>Code coverage report for src/lib/hasChildren.ts</title> | ||
| <meta charset="utf-8" /> | ||
| <link rel="stylesheet" href="../../prettify.css" /> | ||
| <link rel="stylesheet" href="../../base.css" /> | ||
| <meta name="viewport" content="width=device-width, initial-scale=1"> | ||
| <style type='text/css'> | ||
| .coverage-summary .sorter { | ||
| background-image: url(../../sort-arrow-sprite.png); | ||
| } | ||
| </style> | ||
| </head> | ||
| <body> | ||
| <div class='wrapper'> | ||
| <div class='pad1'> | ||
| <h1> | ||
| <a href="../../index.html">All files</a> / <a href="index.html">src/lib</a> hasChildren.ts | ||
| </h1> | ||
| <div class='clearfix'> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Statements</span> | ||
| <span class='fraction'>3/3</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Branches</span> | ||
| <span class='fraction'>3/3</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Functions</span> | ||
| <span class='fraction'>1/1</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Lines</span> | ||
| <span class='fraction'>3/3</span> | ||
| </div> | ||
| </div> | ||
| <p class="quiet"> | ||
| Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block. | ||
| </p> | ||
| </div> | ||
| <div class='status-line high'></div> | ||
| <pre><table class="coverage"> | ||
| <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a> | ||
| <a name='L2'></a><a href='#L2'>2</a> | ||
| <a name='L3'></a><a href='#L3'>3</a> | ||
| <a name='L4'></a><a href='#L4'>4</a> | ||
| <a name='L5'></a><a href='#L5'>5</a> | ||
| <a name='L6'></a><a href='#L6'>6</a> | ||
| <a name='L7'></a><a href='#L7'>7</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">8x</span> | ||
| <span class="cline-any cline-yes">77x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">8x</span> | ||
| <span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import { ReactNode, ReactElement } from 'react'; | ||
| | ||
| const hasChildren = (child: ReactNode): boolean => | ||
| Boolean(child && (child as ReactElement).props && (child as ReactElement).props.children); | ||
| | ||
| export default hasChildren; | ||
| </pre></td></tr> | ||
| </table></pre> | ||
| <div class='push'></div><!-- for sticky footer --> | ||
| </div><!-- /wrapper --> | ||
| <div class='footer quiet pad2 space-top1 center small'> | ||
| Code coverage | ||
| generated by <a href="https://istanbul.js.org/" target="_blank">istanbul</a> at Mon Oct 14 2019 07:10:02 GMT+0100 (British Summer Time) | ||
| </div> | ||
| </div> | ||
| <script src="../../prettify.js"></script> | ||
| <script> | ||
| window.onload = function () { | ||
| if (typeof prettyPrint === 'function') { | ||
| prettyPrint(); | ||
| } | ||
| }; | ||
| </script> | ||
| <script src="../../sorter.js"></script> | ||
| <script src="../../block-navigation.js"></script> | ||
| </body> | ||
| </html> |
| <!doctype html> | ||
| <html lang="en"> | ||
| <head> | ||
| <title>Code coverage report for src/lib/hasComplexChildren.ts</title> | ||
| <meta charset="utf-8" /> | ||
| <link rel="stylesheet" href="../../prettify.css" /> | ||
| <link rel="stylesheet" href="../../base.css" /> | ||
| <meta name="viewport" content="width=device-width, initial-scale=1"> | ||
| <style type='text/css'> | ||
| .coverage-summary .sorter { | ||
| background-image: url(../../sort-arrow-sprite.png); | ||
| } | ||
| </style> | ||
| </head> | ||
| <body> | ||
| <div class='wrapper'> | ||
| <div class='pad1'> | ||
| <h1> | ||
| <a href="../../index.html">All files</a> / <a href="index.html">src/lib</a> hasComplexChildren.ts | ||
| </h1> | ||
| <div class='clearfix'> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Statements</span> | ||
| <span class='fraction'>6/6</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Branches</span> | ||
| <span class='fraction'>4/4</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Functions</span> | ||
| <span class='fraction'>2/2</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Lines</span> | ||
| <span class='fraction'>6/6</span> | ||
| </div> | ||
| </div> | ||
| <p class="quiet"> | ||
| Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block. | ||
| </p> | ||
| </div> | ||
| <div class='status-line high'></div> | ||
| <pre><table class="coverage"> | ||
| <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a> | ||
| <a name='L2'></a><a href='#L2'>2</a> | ||
| <a name='L3'></a><a href='#L3'>3</a> | ||
| <a name='L4'></a><a href='#L4'>4</a> | ||
| <a name='L5'></a><a href='#L5'>5</a> | ||
| <a name='L6'></a><a href='#L6'>6</a> | ||
| <a name='L7'></a><a href='#L7'>7</a> | ||
| <a name='L8'></a><a href='#L8'>8</a> | ||
| <a name='L9'></a><a href='#L9'>9</a> | ||
| <a name='L10'></a><a href='#L10'>10</a> | ||
| <a name='L11'></a><a href='#L11'>11</a> | ||
| <a name='L12'></a><a href='#L12'>12</a> | ||
| <a name='L13'></a><a href='#L13'>13</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">6x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">6x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">6x</span> | ||
| <span class="cline-any cline-yes">50x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">52x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">6x</span> | ||
| <span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import { Children, isValidElement, ReactNode, ReactElement } from 'react'; | ||
| | ||
| import hasChildren from './hasChildren'; | ||
| | ||
| const hasComplexChildren = (element: ReactNode): boolean => | ||
| hasChildren(element) && | ||
| Children.toArray((element as ReactElement).props.children).reduce( | ||
| (response: boolean, child: ReactNode) => response || isValidElement(child), | ||
| false, | ||
| ); | ||
| | ||
| export default hasComplexChildren; | ||
| </pre></td></tr> | ||
| </table></pre> | ||
| <div class='push'></div><!-- for sticky footer --> | ||
| </div><!-- /wrapper --> | ||
| <div class='footer quiet pad2 space-top1 center small'> | ||
| Code coverage | ||
| generated by <a href="https://istanbul.js.org/" target="_blank">istanbul</a> at Mon Oct 14 2019 07:10:02 GMT+0100 (British Summer Time) | ||
| </div> | ||
| </div> | ||
| <script src="../../prettify.js"></script> | ||
| <script> | ||
| window.onload = function () { | ||
| if (typeof prettyPrint === 'function') { | ||
| prettyPrint(); | ||
| } | ||
| }; | ||
| </script> | ||
| <script src="../../sorter.js"></script> | ||
| <script src="../../block-navigation.js"></script> | ||
| </body> | ||
| </html> |
| <!doctype html> | ||
| <html lang="en"> | ||
| <head> | ||
| <title>Code coverage report for src/lib</title> | ||
| <meta charset="utf-8" /> | ||
| <link rel="stylesheet" href="../../prettify.css" /> | ||
| <link rel="stylesheet" href="../../base.css" /> | ||
| <meta name="viewport" content="width=device-width, initial-scale=1"> | ||
| <style type='text/css'> | ||
| .coverage-summary .sorter { | ||
| background-image: url(../../sort-arrow-sprite.png); | ||
| } | ||
| </style> | ||
| </head> | ||
| <body> | ||
| <div class='wrapper'> | ||
| <div class='pad1'> | ||
| <h1> | ||
| <a href="../../index.html">All files</a> src/lib | ||
| </h1> | ||
| <div class='clearfix'> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">97.1% </span> | ||
| <span class="quiet">Statements</span> | ||
| <span class='fraction'>67/69</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">87.88% </span> | ||
| <span class="quiet">Branches</span> | ||
| <span class='fraction'>29/33</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Functions</span> | ||
| <span class='fraction'>16/16</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">97.1% </span> | ||
| <span class="quiet">Lines</span> | ||
| <span class='fraction'>67/69</span> | ||
| </div> | ||
| </div> | ||
| <p class="quiet"> | ||
| Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block. | ||
| </p> | ||
| </div> | ||
| <div class='status-line high'></div> | ||
| <div class="pad1"> | ||
| <table class="coverage-summary"> | ||
| <thead> | ||
| <tr> | ||
| <th data-col="file" data-fmt="html" data-html="true" class="file">File</th> | ||
| <th data-col="pic" data-type="number" data-fmt="html" data-html="true" class="pic"></th> | ||
| <th data-col="statements" data-type="number" data-fmt="pct" class="pct">Statements</th> | ||
| <th data-col="statements_raw" data-type="number" data-fmt="html" class="abs"></th> | ||
| <th data-col="branches" data-type="number" data-fmt="pct" class="pct">Branches</th> | ||
| <th data-col="branches_raw" data-type="number" data-fmt="html" class="abs"></th> | ||
| <th data-col="functions" data-type="number" data-fmt="pct" class="pct">Functions</th> | ||
| <th data-col="functions_raw" data-type="number" data-fmt="html" class="abs"></th> | ||
| <th data-col="lines" data-type="number" data-fmt="pct" class="pct">Lines</th> | ||
| <th data-col="lines_raw" data-type="number" data-fmt="html" class="abs"></th> | ||
| </tr> | ||
| </thead> | ||
| <tbody><tr> | ||
| <td class="file high" data-value="deepFilter.ts"><a href="deepFilter.ts.html">deepFilter.ts</a></td> | ||
| <td data-value="100" class="pic high"><div class="chart"><div class="cover-fill cover-full" style="width: 100%;"></div><div class="cover-empty" style="width:0%;"></div></div></td> | ||
| <td data-value="100" class="pct high">100%</td> | ||
| <td data-value="8" class="abs high">8/8</td> | ||
| <td data-value="100" class="pct high">100%</td> | ||
| <td data-value="2" class="abs high">2/2</td> | ||
| <td data-value="100" class="pct high">100%</td> | ||
| <td data-value="2" class="abs high">2/2</td> | ||
| <td data-value="100" class="pct high">100%</td> | ||
| <td data-value="8" class="abs high">8/8</td> | ||
| </tr> | ||
| <tr> | ||
| <td class="file high" data-value="deepFind.ts"><a href="deepFind.ts.html">deepFind.ts</a></td> | ||
| <td data-value="100" class="pic high"><div class="chart"><div class="cover-fill cover-full" style="width: 100%;"></div><div class="cover-empty" style="width:0%;"></div></div></td> | ||
| <td data-value="100" class="pct high">100%</td> | ||
| <td data-value="13" class="abs high">13/13</td> | ||
| <td data-value="100" class="pct high">100%</td> | ||
| <td data-value="4" class="abs high">4/4</td> | ||
| <td data-value="100" class="pct high">100%</td> | ||
| <td data-value="2" class="abs high">2/2</td> | ||
| <td data-value="100" class="pct high">100%</td> | ||
| <td data-value="13" class="abs high">13/13</td> | ||
| </tr> | ||
| <tr> | ||
| <td class="file high" data-value="deepForEach.ts"><a href="deepForEach.ts.html">deepForEach.ts</a></td> | ||
| <td data-value="100" class="pic high"><div class="chart"><div class="cover-fill cover-full" style="width: 100%;"></div><div class="cover-empty" style="width:0%;"></div></div></td> | ||
| <td data-value="100" class="pct high">100%</td> | ||
| <td data-value="8" class="abs high">8/8</td> | ||
| <td data-value="100" class="pct high">100%</td> | ||
| <td data-value="2" class="abs high">2/2</td> | ||
| <td data-value="100" class="pct high">100%</td> | ||
| <td data-value="2" class="abs high">2/2</td> | ||
| <td data-value="100" class="pct high">100%</td> | ||
| <td data-value="8" class="abs high">8/8</td> | ||
| </tr> | ||
| <tr> | ||
| <td class="file high" data-value="deepMap.ts"><a href="deepMap.ts.html">deepMap.ts</a></td> | ||
| <td data-value="100" class="pic high"><div class="chart"><div class="cover-fill cover-full" style="width: 100%;"></div><div class="cover-empty" style="width:0%;"></div></div></td> | ||
| <td data-value="100" class="pct high">100%</td> | ||
| <td data-value="8" class="abs high">8/8</td> | ||
| <td data-value="100" class="pct high">100%</td> | ||
| <td data-value="2" class="abs high">2/2</td> | ||
| <td data-value="100" class="pct high">100%</td> | ||
| <td data-value="2" class="abs high">2/2</td> | ||
| <td data-value="100" class="pct high">100%</td> | ||
| <td data-value="8" class="abs high">8/8</td> | ||
| </tr> | ||
| <tr> | ||
| <td class="file high" data-value="filter.ts"><a href="filter.ts.html">filter.ts</a></td> | ||
| <td data-value="100" class="pic high"><div class="chart"><div class="cover-fill cover-full" style="width: 100%;"></div><div class="cover-empty" style="width:0%;"></div></div></td> | ||
| <td data-value="100" class="pct high">100%</td> | ||
| <td data-value="4" class="abs high">4/4</td> | ||
| <td data-value="100" class="pct high">100%</td> | ||
| <td data-value="0" class="abs high">0/0</td> | ||
| <td data-value="100" class="pct high">100%</td> | ||
| <td data-value="1" class="abs high">1/1</td> | ||
| <td data-value="100" class="pct high">100%</td> | ||
| <td data-value="4" class="abs high">4/4</td> | ||
| </tr> | ||
| <tr> | ||
| <td class="file high" data-value="groupByType.ts"><a href="groupByType.ts.html">groupByType.ts</a></td> | ||
| <td data-value="90.91" class="pic high"><div class="chart"><div class="cover-fill" style="width: 90%;"></div><div class="cover-empty" style="width:10%;"></div></div></td> | ||
| <td data-value="90.91" class="pct high">90.91%</td> | ||
| <td data-value="11" class="abs high">10/11</td> | ||
| <td data-value="75" class="pct medium">75%</td> | ||
| <td data-value="12" class="abs medium">9/12</td> | ||
| <td data-value="100" class="pct high">100%</td> | ||
| <td data-value="2" class="abs high">2/2</td> | ||
| <td data-value="90.91" class="pct high">90.91%</td> | ||
| <td data-value="11" class="abs high">10/11</td> | ||
| </tr> | ||
| <tr> | ||
| <td class="file high" data-value="hasChildren.ts"><a href="hasChildren.ts.html">hasChildren.ts</a></td> | ||
| <td data-value="100" class="pic high"><div class="chart"><div class="cover-fill cover-full" style="width: 100%;"></div><div class="cover-empty" style="width:0%;"></div></div></td> | ||
| <td data-value="100" class="pct high">100%</td> | ||
| <td data-value="3" class="abs high">3/3</td> | ||
| <td data-value="100" class="pct high">100%</td> | ||
| <td data-value="3" class="abs high">3/3</td> | ||
| <td data-value="100" class="pct high">100%</td> | ||
| <td data-value="1" class="abs high">1/1</td> | ||
| <td data-value="100" class="pct high">100%</td> | ||
| <td data-value="3" class="abs high">3/3</td> | ||
| </tr> | ||
| <tr> | ||
| <td class="file high" data-value="hasComplexChildren.ts"><a href="hasComplexChildren.ts.html">hasComplexChildren.ts</a></td> | ||
| <td data-value="100" class="pic high"><div class="chart"><div class="cover-fill cover-full" style="width: 100%;"></div><div class="cover-empty" style="width:0%;"></div></div></td> | ||
| <td data-value="100" class="pct high">100%</td> | ||
| <td data-value="6" class="abs high">6/6</td> | ||
| <td data-value="100" class="pct high">100%</td> | ||
| <td data-value="4" class="abs high">4/4</td> | ||
| <td data-value="100" class="pct high">100%</td> | ||
| <td data-value="2" class="abs high">2/2</td> | ||
| <td data-value="100" class="pct high">100%</td> | ||
| <td data-value="6" class="abs high">6/6</td> | ||
| </tr> | ||
| <tr> | ||
| <td class="file high" data-value="onlyText.ts"><a href="onlyText.ts.html">onlyText.ts</a></td> | ||
| <td data-value="87.5" class="pic high"><div class="chart"><div class="cover-fill" style="width: 87%;"></div><div class="cover-empty" style="width:13%;"></div></div></td> | ||
| <td data-value="87.5" class="pct high">87.5%</td> | ||
| <td data-value="8" class="abs high">7/8</td> | ||
| <td data-value="75" class="pct medium">75%</td> | ||
| <td data-value="4" class="abs medium">3/4</td> | ||
| <td data-value="100" class="pct high">100%</td> | ||
| <td data-value="2" class="abs high">2/2</td> | ||
| <td data-value="87.5" class="pct high">87.5%</td> | ||
| <td data-value="8" class="abs high">7/8</td> | ||
| </tr> | ||
| </tbody> | ||
| </table> | ||
| </div><div class='push'></div><!-- for sticky footer --> | ||
| </div><!-- /wrapper --> | ||
| <div class='footer quiet pad2 space-top1 center small'> | ||
| Code coverage | ||
| generated by <a href="https://istanbul.js.org/" target="_blank">istanbul</a> at Mon Oct 14 2019 07:10:02 GMT+0100 (British Summer Time) | ||
| </div> | ||
| </div> | ||
| <script src="../../prettify.js"></script> | ||
| <script> | ||
| window.onload = function () { | ||
| if (typeof prettyPrint === 'function') { | ||
| prettyPrint(); | ||
| } | ||
| }; | ||
| </script> | ||
| <script src="../../sorter.js"></script> | ||
| <script src="../../block-navigation.js"></script> | ||
| </body> | ||
| </html> |
| <!doctype html> | ||
| <html lang="en"> | ||
| <head> | ||
| <title>Code coverage report for src/lib/onlyText.ts</title> | ||
| <meta charset="utf-8" /> | ||
| <link rel="stylesheet" href="../../prettify.css" /> | ||
| <link rel="stylesheet" href="../../base.css" /> | ||
| <meta name="viewport" content="width=device-width, initial-scale=1"> | ||
| <style type='text/css'> | ||
| .coverage-summary .sorter { | ||
| background-image: url(../../sort-arrow-sprite.png); | ||
| } | ||
| </style> | ||
| </head> | ||
| <body> | ||
| <div class='wrapper'> | ||
| <div class='pad1'> | ||
| <h1> | ||
| <a href="../../index.html">All files</a> / <a href="index.html">src/lib</a> onlyText.ts | ||
| </h1> | ||
| <div class='clearfix'> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">87.5% </span> | ||
| <span class="quiet">Statements</span> | ||
| <span class='fraction'>7/8</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">75% </span> | ||
| <span class="quiet">Branches</span> | ||
| <span class='fraction'>3/4</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Functions</span> | ||
| <span class='fraction'>2/2</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">87.5% </span> | ||
| <span class="quiet">Lines</span> | ||
| <span class='fraction'>7/8</span> | ||
| </div> | ||
| </div> | ||
| <p class="quiet"> | ||
| Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block. | ||
| </p> | ||
| </div> | ||
| <div class='status-line high'></div> | ||
| <pre><table class="coverage"> | ||
| <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a> | ||
| <a name='L2'></a><a href='#L2'>2</a> | ||
| <a name='L3'></a><a href='#L3'>3</a> | ||
| <a name='L4'></a><a href='#L4'>4</a> | ||
| <a name='L5'></a><a href='#L5'>5</a> | ||
| <a name='L6'></a><a href='#L6'>6</a> | ||
| <a name='L7'></a><a href='#L7'>7</a> | ||
| <a name='L8'></a><a href='#L8'>8</a> | ||
| <a name='L9'></a><a href='#L9'>9</a> | ||
| <a name='L10'></a><a href='#L10'>10</a> | ||
| <a name='L11'></a><a href='#L11'>11</a> | ||
| <a name='L12'></a><a href='#L12'>12</a> | ||
| <a name='L13'></a><a href='#L13'>13</a> | ||
| <a name='L14'></a><a href='#L14'>14</a> | ||
| <a name='L15'></a><a href='#L15'>15</a> | ||
| <a name='L16'></a><a href='#L16'>16</a> | ||
| <a name='L17'></a><a href='#L17'>17</a> | ||
| <a name='L18'></a><a href='#L18'>18</a> | ||
| <a name='L19'></a><a href='#L19'>19</a> | ||
| <a name='L20'></a><a href='#L20'>20</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-yes">16x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">18x</span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">18x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import { Children, ReactElement, ReactNode } from 'react'; | ||
| import hasChildren from './hasChildren'; | ||
| | ||
| const onlyText = (children: ReactNode): string => { | ||
| return Children.toArray(children) | ||
| .reduce((flattened: string[], child: ReactNode): string[] => { | ||
| <span class="missing-if-branch" title="if path not taken" >I</span>if (!child) { | ||
| <span class="cstat-no" title="statement not covered" > return flattened;</span> | ||
| } | ||
| | ||
| return [ | ||
| ...flattened, | ||
| hasChildren(child) ? onlyText((child as ReactElement).props.children) : child.toString(), | ||
| ]; | ||
| }, []) | ||
| .join(''); | ||
| }; | ||
| | ||
| export default onlyText; | ||
| </pre></td></tr> | ||
| </table></pre> | ||
| <div class='push'></div><!-- for sticky footer --> | ||
| </div><!-- /wrapper --> | ||
| <div class='footer quiet pad2 space-top1 center small'> | ||
| Code coverage | ||
| generated by <a href="https://istanbul.js.org/" target="_blank">istanbul</a> at Mon Oct 14 2019 07:10:02 GMT+0100 (British Summer Time) | ||
| </div> | ||
| </div> | ||
| <script src="../../prettify.js"></script> | ||
| <script> | ||
| window.onload = function () { | ||
| if (typeof prettyPrint === 'function') { | ||
| prettyPrint(); | ||
| } | ||
| }; | ||
| </script> | ||
| <script src="../../sorter.js"></script> | ||
| <script src="../../block-navigation.js"></script> | ||
| </body> | ||
| </html> |
| <!doctype html> | ||
| <html lang="en"> | ||
| <head> | ||
| <title>Code coverage report for src/react-children-utilities.ts</title> | ||
| <meta charset="utf-8" /> | ||
| <link rel="stylesheet" href="../prettify.css" /> | ||
| <link rel="stylesheet" href="../base.css" /> | ||
| <meta name="viewport" content="width=device-width, initial-scale=1"> | ||
| <style type='text/css'> | ||
| .coverage-summary .sorter { | ||
| background-image: url(../sort-arrow-sprite.png); | ||
| } | ||
| </style> | ||
| </head> | ||
| <body> | ||
| <div class='wrapper'> | ||
| <div class='pad1'> | ||
| <h1> | ||
| <a href="../index.html">All files</a> / <a href="index.html">src</a> react-children-utilities.ts | ||
| </h1> | ||
| <div class='clearfix'> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Statements</span> | ||
| <span class='fraction'>20/20</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Branches</span> | ||
| <span class='fraction'>0/0</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Functions</span> | ||
| <span class='fraction'>0/0</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Lines</span> | ||
| <span class='fraction'>20/20</span> | ||
| </div> | ||
| </div> | ||
| <p class="quiet"> | ||
| Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block. | ||
| </p> | ||
| </div> | ||
| <div class='status-line high'></div> | ||
| <pre><table class="coverage"> | ||
| <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a> | ||
| <a name='L2'></a><a href='#L2'>2</a> | ||
| <a name='L3'></a><a href='#L3'>3</a> | ||
| <a name='L4'></a><a href='#L4'>4</a> | ||
| <a name='L5'></a><a href='#L5'>5</a> | ||
| <a name='L6'></a><a href='#L6'>6</a> | ||
| <a name='L7'></a><a href='#L7'>7</a> | ||
| <a name='L8'></a><a href='#L8'>8</a> | ||
| <a name='L9'></a><a href='#L9'>9</a> | ||
| <a name='L10'></a><a href='#L10'>10</a> | ||
| <a name='L11'></a><a href='#L11'>11</a> | ||
| <a name='L12'></a><a href='#L12'>12</a> | ||
| <a name='L13'></a><a href='#L13'>13</a> | ||
| <a name='L14'></a><a href='#L14'>14</a> | ||
| <a name='L15'></a><a href='#L15'>15</a> | ||
| <a name='L16'></a><a href='#L16'>16</a> | ||
| <a name='L17'></a><a href='#L17'>17</a> | ||
| <a name='L18'></a><a href='#L18'>18</a> | ||
| <a name='L19'></a><a href='#L19'>19</a> | ||
| <a name='L20'></a><a href='#L20'>20</a> | ||
| <a name='L21'></a><a href='#L21'>21</a> | ||
| <a name='L22'></a><a href='#L22'>22</a> | ||
| <a name='L23'></a><a href='#L23'>23</a> | ||
| <a name='L24'></a><a href='#L24'>24</a> | ||
| <a name='L25'></a><a href='#L25'>25</a> | ||
| <a name='L26'></a><a href='#L26'>26</a> | ||
| <a name='L27'></a><a href='#L27'>27</a> | ||
| <a name='L28'></a><a href='#L28'>28</a> | ||
| <a name='L29'></a><a href='#L29'>29</a> | ||
| <a name='L30'></a><a href='#L30'>30</a> | ||
| <a name='L31'></a><a href='#L31'>31</a> | ||
| <a name='L32'></a><a href='#L32'>32</a> | ||
| <a name='L33'></a><a href='#L33'>33</a> | ||
| <a name='L34'></a><a href='#L34'>34</a> | ||
| <a name='L35'></a><a href='#L35'>35</a> | ||
| <a name='L36'></a><a href='#L36'>36</a> | ||
| <a name='L37'></a><a href='#L37'>37</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import { Children } from 'react'; | ||
| | ||
| import deepFilter from './lib/deepFilter'; | ||
| import deepFind from './lib/deepFind'; | ||
| import deepForEach from './lib/deepForEach'; | ||
| import deepMap from './lib/deepMap'; | ||
| import filter from './lib/filter'; | ||
| import groupByType from './lib/groupByType'; | ||
| import hasChildren from './lib/hasChildren'; | ||
| import hasComplexChildren from './lib/hasComplexChildren'; | ||
| import onlyText from './lib/onlyText'; | ||
| | ||
| export { | ||
| deepFilter, | ||
| deepFind, | ||
| deepForEach, | ||
| deepMap, | ||
| filter, | ||
| groupByType, | ||
| hasChildren, | ||
| hasComplexChildren, | ||
| onlyText, | ||
| }; | ||
| | ||
| export default { | ||
| ...Children, | ||
| deepFilter, | ||
| deepFind, | ||
| deepForEach, | ||
| deepMap, | ||
| filter, | ||
| groupByType, | ||
| hasChildren, | ||
| hasComplexChildren, | ||
| onlyText, | ||
| }; | ||
| </pre></td></tr> | ||
| </table></pre> | ||
| <div class='push'></div><!-- for sticky footer --> | ||
| </div><!-- /wrapper --> | ||
| <div class='footer quiet pad2 space-top1 center small'> | ||
| Code coverage | ||
| generated by <a href="https://istanbul.js.org/" target="_blank">istanbul</a> at Mon Oct 14 2019 07:10:02 GMT+0100 (British Summer Time) | ||
| </div> | ||
| </div> | ||
| <script src="../prettify.js"></script> | ||
| <script> | ||
| window.onload = function () { | ||
| if (typeof prettyPrint === 'function') { | ||
| prettyPrint(); | ||
| } | ||
| }; | ||
| </script> | ||
| <script src="../sorter.js"></script> | ||
| <script src="../block-navigation.js"></script> | ||
| </body> | ||
| </html> |
Sorry, the diff of this file is not supported yet
| import { ReactNode } from 'react'; | ||
| export interface FilterFunction { | ||
| (child: ReactNode, index?: number, children?: ReactNode[]): boolean; | ||
| } | ||
| declare const deepFilter: (children: ReactNode, deepFilterFn: FilterFunction) => ReactNode[]; | ||
| export default deepFilter; | ||
| //# sourceMappingURL=deepFilter.d.ts.map |
| {"version":3,"file":"deepFilter.d.ts","sourceRoot":"","sources":["../src/lib/deepFilter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwC,SAAS,EAAE,MAAM,OAAO,CAAC;AAGxE,MAAM,WAAW,cAAc;IAC7B,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;CACrE;AAED,QAAA,MAAM,UAAU,oEAaf,CAAC;AAEF,eAAe,UAAU,CAAC"} |
| import { Children, cloneElement } from 'react'; | ||
| import hasComplexChildren from './hasComplexChildren'; | ||
| const deepFilter = (children, deepFilterFn) => { | ||
| return Children.toArray(children) | ||
| .filter(deepFilterFn) | ||
| .map((child) => { | ||
| if (hasComplexChildren(child)) { | ||
| // Clone the child that has children and filter them too | ||
| return cloneElement(child, Object.assign(Object.assign({}, child.props), { children: deepFilter(child.props.children, deepFilterFn) })); | ||
| } | ||
| return child; | ||
| }); | ||
| }; | ||
| export default deepFilter; | ||
| //# sourceMappingURL=deepFilter.js.map |
| {"version":3,"file":"deepFilter.js","sourceRoot":"","sources":["../src/lib/deepFilter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,YAAY,EAA2B,MAAM,OAAO,CAAC;AACxE,OAAO,kBAAkB,MAAM,sBAAsB,CAAC;AAMtD,MAAM,UAAU,GAAG,CAAC,QAAmB,EAAE,YAA4B,EAAe,EAAE;IACpF,OAAO,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC;SAC9B,MAAM,CAAC,YAAY,CAAC;SACpB,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACb,IAAI,kBAAkB,CAAC,KAAK,CAAC,EAAE;YAC7B,wDAAwD;YACxD,OAAO,YAAY,CAAC,KAAqB,kCACnC,KAAsB,CAAC,KAAK,KAChC,QAAQ,EAAE,UAAU,CAAE,KAAsB,CAAC,KAAK,CAAC,QAAQ,EAAE,YAAY,CAAC,IAC1E,CAAC;SACJ;QACD,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,CAAC;AACP,CAAC,CAAC;AAEF,eAAe,UAAU,CAAC","sourcesContent":["import { Children, cloneElement, ReactElement, ReactNode } from 'react';\nimport hasComplexChildren from './hasComplexChildren';\n\nexport interface FilterFunction {\n (child: ReactNode, index?: number, children?: ReactNode[]): boolean;\n}\n\nconst deepFilter = (children: ReactNode, deepFilterFn: FilterFunction): ReactNode[] => {\n return Children.toArray(children)\n .filter(deepFilterFn)\n .map((child) => {\n if (hasComplexChildren(child)) {\n // Clone the child that has children and filter them too\n return cloneElement(child as ReactElement, {\n ...(child as ReactElement).props,\n children: deepFilter((child as ReactElement).props.children, deepFilterFn),\n });\n }\n return child;\n });\n};\n\nexport default deepFilter;\n"]} |
| import { ReactNode } from 'react'; | ||
| export interface FindFunction { | ||
| (child: ReactNode, index?: number, children?: ReactNode[]): ReactNode; | ||
| } | ||
| declare const deepFind: (children: ReactNode, deepFindFn: FindFunction) => ReactNode; | ||
| export default deepFind; | ||
| //# sourceMappingURL=deepFind.d.ts.map |
| {"version":3,"file":"deepFind.d.ts","sourceRoot":"","sources":["../src/lib/deepFind.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,SAAS,EAAgB,MAAM,OAAO,CAAC;AAG1D,MAAM,WAAW,YAAY;IAC3B,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,SAAS,EAAE,GAAG,SAAS,CAAC;CACvE;AAED,QAAA,MAAM,QAAQ,8DAeb,CAAC;AAEF,eAAe,QAAQ,CAAC"} |
| import { Children } from 'react'; | ||
| import hasComplexChildren from './hasComplexChildren'; | ||
| const deepFind = (children, deepFindFn) => { | ||
| let found; | ||
| Children.toArray(children).find((child) => { | ||
| if (hasComplexChildren(child)) { | ||
| // Find inside the child that has children | ||
| found = deepFind(child.props.children, deepFindFn); | ||
| return typeof found !== 'undefined'; | ||
| } | ||
| if (deepFindFn(child)) { | ||
| found = child; | ||
| return true; | ||
| } | ||
| return false; | ||
| }); | ||
| return found; | ||
| }; | ||
| export default deepFind; | ||
| //# sourceMappingURL=deepFind.js.map |
| {"version":3,"file":"deepFind.js","sourceRoot":"","sources":["../src/lib/deepFind.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAA2B,MAAM,OAAO,CAAC;AAC1D,OAAO,kBAAkB,MAAM,sBAAsB,CAAC;AAMtD,MAAM,QAAQ,GAAG,CAAC,QAAmB,EAAE,UAAwB,EAAyB,EAAE;IACxF,IAAI,KAAK,CAAC;IACV,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;QACxC,IAAI,kBAAkB,CAAC,KAAK,CAAC,EAAE;YAC7B,0CAA0C;YAC1C,KAAK,GAAG,QAAQ,CAAE,KAAsB,CAAC,KAAK,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;YACrE,OAAO,OAAO,KAAK,KAAK,WAAW,CAAC;SACrC;QACD,IAAI,UAAU,CAAC,KAAK,CAAC,EAAE;YACrB,KAAK,GAAG,KAAK,CAAC;YACd,OAAO,IAAI,CAAC;SACb;QACD,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,CAAC;IACH,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAEF,eAAe,QAAQ,CAAC","sourcesContent":["import { Children, ReactNode, ReactElement } from 'react';\nimport hasComplexChildren from './hasComplexChildren';\n\nexport interface FindFunction {\n (child: ReactNode, index?: number, children?: ReactNode[]): ReactNode;\n}\n\nconst deepFind = (children: ReactNode, deepFindFn: FindFunction): ReactNode | undefined => {\n let found;\n Children.toArray(children).find((child) => {\n if (hasComplexChildren(child)) {\n // Find inside the child that has children\n found = deepFind((child as ReactElement).props.children, deepFindFn);\n return typeof found !== 'undefined';\n }\n if (deepFindFn(child)) {\n found = child;\n return true;\n }\n return false;\n });\n return found;\n};\n\nexport default deepFind;\n"]} |
| import { ReactNode } from 'react'; | ||
| export interface ForEachFunction { | ||
| (child: ReactNode, index?: number, children?: ReactNode[]): void; | ||
| } | ||
| declare const deepForEach: (children: ReactNode, deepForEachFn: ForEachFunction) => void; | ||
| export default deepForEach; | ||
| //# sourceMappingURL=deepForEach.d.ts.map |
| {"version":3,"file":"deepForEach.d.ts","sourceRoot":"","sources":["../src/lib/deepForEach.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0B,SAAS,EAAE,MAAM,OAAO,CAAC;AAG1D,MAAM,WAAW,eAAe;IAC9B,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC;CAClE;AAED,QAAA,MAAM,WAAW,+DAQhB,CAAC;AAEF,eAAe,WAAW,CAAC"} |
| import { Children } from 'react'; | ||
| import hasComplexChildren from './hasComplexChildren'; | ||
| const deepForEach = (children, deepForEachFn) => { | ||
| Children.forEach(children, (child) => { | ||
| if (hasComplexChildren(child)) { | ||
| // Each inside the child that has children | ||
| deepForEach(child.props.children, deepForEachFn); | ||
| } | ||
| deepForEachFn(child); | ||
| }); | ||
| }; | ||
| export default deepForEach; | ||
| //# sourceMappingURL=deepForEach.js.map |
| {"version":3,"file":"deepForEach.js","sourceRoot":"","sources":["../src/lib/deepForEach.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAA2B,MAAM,OAAO,CAAC;AAC1D,OAAO,kBAAkB,MAAM,sBAAsB,CAAC;AAMtD,MAAM,WAAW,GAAG,CAAC,QAAmB,EAAE,aAA8B,EAAQ,EAAE;IAChF,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;QACnC,IAAI,kBAAkB,CAAC,KAAK,CAAC,EAAE;YAC7B,0CAA0C;YAC1C,WAAW,CAAE,KAAsB,CAAC,KAAK,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;SACpE;QACD,aAAa,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,eAAe,WAAW,CAAC","sourcesContent":["import { Children, ReactElement, ReactNode } from 'react';\nimport hasComplexChildren from './hasComplexChildren';\n\nexport interface ForEachFunction {\n (child: ReactNode, index?: number, children?: ReactNode[]): void;\n}\n\nconst deepForEach = (children: ReactNode, deepForEachFn: ForEachFunction): void => {\n Children.forEach(children, (child) => {\n if (hasComplexChildren(child)) {\n // Each inside the child that has children\n deepForEach((child as ReactElement).props.children, deepForEachFn);\n }\n deepForEachFn(child);\n });\n};\n\nexport default deepForEach;\n"]} |
| import { ReactNode } from 'react'; | ||
| export interface MapFunction { | ||
| (child: ReactNode, index?: number, children?: ReactNode[]): ReactNode; | ||
| } | ||
| declare const deepMap: (children: ReactNode, deepMapFn: MapFunction) => ReactNode[]; | ||
| export default deepMap; | ||
| //# sourceMappingURL=deepMap.d.ts.map |
| {"version":3,"file":"deepMap.d.ts","sourceRoot":"","sources":["../src/lib/deepMap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwC,SAAS,EAAE,MAAM,OAAO,CAAC;AAGxE,MAAM,WAAW,WAAW;IAC1B,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,SAAS,EAAE,GAAG,SAAS,CAAC;CACvE;AAED,QAAA,MAAM,OAAO,8DAaZ,CAAC;AAEF,eAAe,OAAO,CAAC"} |
| import { Children, cloneElement } from 'react'; | ||
| import hasComplexChildren from './hasComplexChildren'; | ||
| const deepMap = (children, deepMapFn) => { | ||
| return Children.map(children, (child) => { | ||
| if (hasComplexChildren(child)) { | ||
| // Clone the child that has children and map them too | ||
| return deepMapFn(cloneElement(child, Object.assign(Object.assign({}, child.props), { children: deepMap(child.props.children, deepMapFn) }))); | ||
| } | ||
| return deepMapFn(child); | ||
| }); | ||
| }; | ||
| export default deepMap; | ||
| //# sourceMappingURL=deepMap.js.map |
| {"version":3,"file":"deepMap.js","sourceRoot":"","sources":["../src/lib/deepMap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,YAAY,EAA2B,MAAM,OAAO,CAAC;AACxE,OAAO,kBAAkB,MAAM,sBAAsB,CAAC;AAMtD,MAAM,OAAO,GAAG,CAAC,QAAmB,EAAE,SAAsB,EAAe,EAAE;IAC3E,OAAO,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;QACtC,IAAI,kBAAkB,CAAC,KAAK,CAAC,EAAE;YAC7B,qDAAqD;YACrD,OAAO,SAAS,CACd,YAAY,CAAC,KAAqB,kCAC5B,KAAsB,CAAC,KAAK,KAChC,QAAQ,EAAE,OAAO,CAAE,KAAsB,CAAC,KAAK,CAAC,QAAQ,EAAE,SAAS,CAAC,IACpE,CACH,CAAC;SACH;QACD,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,eAAe,OAAO,CAAC","sourcesContent":["import { Children, cloneElement, ReactElement, ReactNode } from 'react';\nimport hasComplexChildren from './hasComplexChildren';\n\nexport interface MapFunction {\n (child: ReactNode, index?: number, children?: ReactNode[]): ReactNode;\n}\n\nconst deepMap = (children: ReactNode, deepMapFn: MapFunction): ReactNode[] => {\n return Children.map(children, (child) => {\n if (hasComplexChildren(child)) {\n // Clone the child that has children and map them too\n return deepMapFn(\n cloneElement(child as ReactElement, {\n ...(child as ReactElement).props,\n children: deepMap((child as ReactElement).props.children, deepMapFn),\n }),\n );\n }\n return deepMapFn(child);\n });\n};\n\nexport default deepMap;\n"]} |
| import { ReactNode } from 'react'; | ||
| export interface FilterFunction { | ||
| (child: ReactNode, index?: number, children?: ReactNode[]): boolean; | ||
| } | ||
| declare const filter: (children: ReactNode, filterFn: FilterFunction) => ReactNode[]; | ||
| export default filter; | ||
| //# sourceMappingURL=filter.d.ts.map |
| {"version":3,"file":"filter.d.ts","sourceRoot":"","sources":["../src/lib/filter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,SAAS,EAAE,MAAM,OAAO,CAAC;AAE5C,MAAM,WAAW,cAAc;IAC7B,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;CACrE;AAED,QAAA,MAAM,MAAM,gEAEX,CAAC;AAEF,eAAe,MAAM,CAAC"} |
| import { Children } from 'react'; | ||
| const filter = (children, filterFn) => { | ||
| return Children.toArray(children).filter(filterFn); | ||
| }; | ||
| export default filter; | ||
| //# sourceMappingURL=filter.js.map |
| {"version":3,"file":"filter.js","sourceRoot":"","sources":["../src/lib/filter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAa,MAAM,OAAO,CAAC;AAM5C,MAAM,MAAM,GAAG,CAAC,QAAmB,EAAE,QAAwB,EAAe,EAAE;IAC5E,OAAO,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AACrD,CAAC,CAAC;AAEF,eAAe,MAAM,CAAC","sourcesContent":["import { Children, ReactNode } from 'react';\n\nexport interface FilterFunction {\n (child: ReactNode, index?: number, children?: ReactNode[]): boolean;\n}\n\nconst filter = (children: ReactNode, filterFn: FilterFunction): ReactNode[] => {\n return Children.toArray(children).filter(filterFn);\n};\n\nexport default filter;\n"]} |
| import { ReactNode } from 'react'; | ||
| export interface GroupedChildren { | ||
| [name: string]: ReactNode[]; | ||
| } | ||
| declare const groupByType: (children: ReactNode, types?: ReactNode[], rest?: string) => GroupedChildren; | ||
| export default groupByType; | ||
| //# sourceMappingURL=groupByType.d.ts.map |
| {"version":3,"file":"groupByType.d.ts","sourceRoot":"","sources":["../src/lib/groupByType.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,SAAS,EAAgB,MAAM,OAAO,CAAC;AAE1E,MAAM,WAAW,eAAe;IAC9B,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,CAAC;CAC7B;AAED,QAAA,MAAM,WAAW,8EAqBhB,CAAC;AAEF,eAAe,WAAW,CAAC"} |
| import { Children, isValidElement } from 'react'; | ||
| const groupByType = (children, types = [], rest = 'rest') => { | ||
| return Children.toArray(children).reduce((groups, child) => { | ||
| const isGrouped = isValidElement(child) && types.includes(child.type); | ||
| const addChild = isGrouped ? child.props.children : child; | ||
| const key = isGrouped ? child.type : rest; | ||
| if (typeof key !== 'string') { | ||
| return groups; | ||
| } | ||
| const group = groups[key]; | ||
| return Object.assign(Object.assign({}, groups), { [key]: [...(group || []), addChild] }); | ||
| }, {}); | ||
| }; | ||
| export default groupByType; | ||
| //# sourceMappingURL=groupByType.js.map |
| {"version":3,"file":"groupByType.js","sourceRoot":"","sources":["../src/lib/groupByType.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,cAAc,EAA2B,MAAM,OAAO,CAAC;AAM1E,MAAM,WAAW,GAAG,CAClB,QAAmB,EACnB,QAAqB,EAAE,EACvB,IAAI,GAAG,MAAM,EACI,EAAE;IACnB,OAAO,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,MAAuB,EAAE,KAAgB,EAAE,EAAE;QACrF,MAAM,SAAS,GAAG,cAAc,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACtE,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAE,KAAsB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC;QAC5E,MAAM,GAAG,GAAG,SAAS,CAAC,CAAC,CAAE,KAAsB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;QAE5D,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE;YAC3B,OAAO,MAAM,CAAC;SACf;QAED,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAE1B,uCACK,MAAM,KACT,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,QAAQ,CAAC,IACnC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;AACT,CAAC,CAAC;AAEF,eAAe,WAAW,CAAC","sourcesContent":["import { Children, isValidElement, ReactNode, ReactElement } from 'react';\n\nexport interface GroupedChildren {\n [name: string]: ReactNode[];\n}\n\nconst groupByType = (\n children: ReactNode,\n types: ReactNode[] = [],\n rest = 'rest',\n): GroupedChildren => {\n return Children.toArray(children).reduce((groups: GroupedChildren, child: ReactNode) => {\n const isGrouped = isValidElement(child) && types.includes(child.type);\n const addChild = isGrouped ? (child as ReactElement).props.children : child;\n const key = isGrouped ? (child as ReactElement).type : rest;\n\n if (typeof key !== 'string') {\n return groups;\n }\n\n const group = groups[key];\n\n return {\n ...groups,\n [key]: [...(group || []), addChild],\n };\n }, {});\n};\n\nexport default groupByType;\n"]} |
| import { ReactNode } from 'react'; | ||
| declare const hasChildren: (child: ReactNode) => boolean; | ||
| export default hasChildren; | ||
| //# sourceMappingURL=hasChildren.d.ts.map |
| {"version":3,"file":"hasChildren.d.ts","sourceRoot":"","sources":["../src/lib/hasChildren.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAgB,MAAM,OAAO,CAAC;AAEhD,QAAA,MAAM,WAAW,+BAC0E,CAAC;AAE5F,eAAe,WAAW,CAAC"} |
| const hasChildren = (child) => Boolean(child && child.props && child.props.children); | ||
| export default hasChildren; | ||
| //# sourceMappingURL=hasChildren.js.map |
| {"version":3,"file":"hasChildren.js","sourceRoot":"","sources":["../src/lib/hasChildren.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,GAAG,CAAC,KAAgB,EAAW,EAAE,CAChD,OAAO,CAAC,KAAK,IAAK,KAAsB,CAAC,KAAK,IAAK,KAAsB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;AAE5F,eAAe,WAAW,CAAC","sourcesContent":["import { ReactNode, ReactElement } from 'react';\n\nconst hasChildren = (child: ReactNode): boolean =>\n Boolean(child && (child as ReactElement).props && (child as ReactElement).props.children);\n\nexport default hasChildren;\n"]} |
| import { ReactNode } from 'react'; | ||
| declare const hasComplexChildren: (element: ReactNode) => boolean; | ||
| export default hasComplexChildren; | ||
| //# sourceMappingURL=hasComplexChildren.d.ts.map |
| {"version":3,"file":"hasComplexChildren.d.ts","sourceRoot":"","sources":["../src/lib/hasComplexChildren.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,SAAS,EAAgB,MAAM,OAAO,CAAC;AAI1E,QAAA,MAAM,kBAAkB,iCAKrB,CAAC;AAEJ,eAAe,kBAAkB,CAAC"} |
| import { Children, isValidElement } from 'react'; | ||
| import hasChildren from './hasChildren'; | ||
| const hasComplexChildren = (element) => hasChildren(element) && | ||
| Children.toArray(element.props.children).reduce((response, child) => response || isValidElement(child), false); | ||
| export default hasComplexChildren; | ||
| //# sourceMappingURL=hasComplexChildren.js.map |
| {"version":3,"file":"hasComplexChildren.js","sourceRoot":"","sources":["../src/lib/hasComplexChildren.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,cAAc,EAA2B,MAAM,OAAO,CAAC;AAE1E,OAAO,WAAW,MAAM,eAAe,CAAC;AAExC,MAAM,kBAAkB,GAAG,CAAC,OAAkB,EAAW,EAAE,CACzD,WAAW,CAAC,OAAO,CAAC;IACpB,QAAQ,CAAC,OAAO,CAAE,OAAwB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,MAAM,CAC/D,CAAC,QAAiB,EAAE,KAAgB,EAAE,EAAE,CAAC,QAAQ,IAAI,cAAc,CAAC,KAAK,CAAC,EAC1E,KAAK,CACN,CAAC;AAEJ,eAAe,kBAAkB,CAAC","sourcesContent":["import { Children, isValidElement, ReactNode, ReactElement } from 'react';\n\nimport hasChildren from './hasChildren';\n\nconst hasComplexChildren = (element: ReactNode): boolean =>\n hasChildren(element) &&\n Children.toArray((element as ReactElement).props.children).reduce(\n (response: boolean, child: ReactNode) => response || isValidElement(child),\n false,\n );\n\nexport default hasComplexChildren;\n"]} |
| import { ReactNode } from 'react'; | ||
| declare const onlyText: (children: ReactNode) => string; | ||
| export default onlyText; | ||
| //# sourceMappingURL=onlyText.d.ts.map |
| {"version":3,"file":"onlyText.d.ts","sourceRoot":"","sources":["../src/lib/onlyText.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0B,SAAS,EAAE,MAAM,OAAO,CAAC;AAG1D,QAAA,MAAM,QAAQ,iCAab,CAAC;AAEF,eAAe,QAAQ,CAAC"} |
| import { Children } from 'react'; | ||
| import hasChildren from './hasChildren'; | ||
| const onlyText = (children) => { | ||
| return Children.toArray(children) | ||
| .reduce((flattened, child) => { | ||
| if (!child) { | ||
| return flattened; | ||
| } | ||
| return [ | ||
| ...flattened, | ||
| hasChildren(child) ? onlyText(child.props.children) : child.toString(), | ||
| ]; | ||
| }, []) | ||
| .join(''); | ||
| }; | ||
| export default onlyText; | ||
| //# sourceMappingURL=onlyText.js.map |
| {"version":3,"file":"onlyText.js","sourceRoot":"","sources":["../src/lib/onlyText.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAA2B,MAAM,OAAO,CAAC;AAC1D,OAAO,WAAW,MAAM,eAAe,CAAC;AAExC,MAAM,QAAQ,GAAG,CAAC,QAAmB,EAAU,EAAE;IAC/C,OAAO,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC;SAC9B,MAAM,CAAC,CAAC,SAAmB,EAAE,KAAgB,EAAY,EAAE;QAC1D,IAAI,CAAC,KAAK,EAAE;YACV,OAAO,SAAS,CAAC;SAClB;QAED,OAAO;YACL,GAAG,SAAS;YACZ,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAE,KAAsB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE;SACzF,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC;SACL,IAAI,CAAC,EAAE,CAAC,CAAC;AACd,CAAC,CAAC;AAEF,eAAe,QAAQ,CAAC","sourcesContent":["import { Children, ReactElement, ReactNode } from 'react';\nimport hasChildren from './hasChildren';\n\nconst onlyText = (children: ReactNode): string => {\n return Children.toArray(children)\n .reduce((flattened: string[], child: ReactNode): string[] => {\n if (!child) {\n return flattened;\n }\n\n return [\n ...flattened,\n hasChildren(child) ? onlyText((child as ReactElement).props.children) : child.toString(),\n ];\n }, [])\n .join('');\n};\n\nexport default onlyText;\n"]} |
| /// <reference types="react" /> | ||
| import deepFilter from './lib/deepFilter'; | ||
| import deepFind from './lib/deepFind'; | ||
| import deepForEach from './lib/deepForEach'; | ||
| import deepMap from './lib/deepMap'; | ||
| import filter from './lib/filter'; | ||
| import groupByType from './lib/groupByType'; | ||
| import hasChildren from './lib/hasChildren'; | ||
| import hasComplexChildren from './lib/hasComplexChildren'; | ||
| import onlyText from './lib/onlyText'; | ||
| export { deepFilter, deepFind, deepForEach, deepMap, filter, groupByType, hasChildren, hasComplexChildren, onlyText, }; | ||
| declare const _default: { | ||
| deepFilter: (children: import("react").ReactNode, deepFilterFn: import("./lib/deepFilter").FilterFunction) => import("react").ReactNode[]; | ||
| deepFind: (children: import("react").ReactNode, deepFindFn: import("./lib/deepFind").FindFunction) => import("react").ReactNode; | ||
| deepForEach: (children: import("react").ReactNode, deepForEachFn: import("./lib/deepForEach").ForEachFunction) => void; | ||
| deepMap: (children: import("react").ReactNode, deepMapFn: import("./lib/deepMap").MapFunction) => import("react").ReactNode[]; | ||
| filter: (children: import("react").ReactNode, filterFn: import("./lib/filter").FilterFunction) => import("react").ReactNode[]; | ||
| groupByType: (children: import("react").ReactNode, types?: import("react").ReactNode[], rest?: string) => import("./lib/groupByType").GroupedChildren; | ||
| hasChildren: (child: import("react").ReactNode) => boolean; | ||
| hasComplexChildren: (element: import("react").ReactNode) => boolean; | ||
| onlyText: (children: import("react").ReactNode) => string; | ||
| map<T, C>(children: C | C[], fn: (child: C, index: number) => T): T[]; | ||
| forEach<C_1>(children: C_1 | C_1[], fn: (child: C_1, index: number) => void): void; | ||
| count(children: any): number; | ||
| only<C_2>(children: C_2): C_2 extends any[] ? never : C_2; | ||
| toArray<C_3>(children: C_3 | C_3[]): C_3[]; | ||
| }; | ||
| export default _default; | ||
| //# sourceMappingURL=react-children-utilities.d.ts.map |
| {"version":3,"file":"react-children-utilities.d.ts","sourceRoot":"","sources":["src/react-children-utilities.ts"],"names":[],"mappings":";AAEA,OAAO,UAAU,MAAM,kBAAkB,CAAC;AAC1C,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,WAAW,MAAM,mBAAmB,CAAC;AAC5C,OAAO,OAAO,MAAM,eAAe,CAAC;AACpC,OAAO,MAAM,MAAM,cAAc,CAAC;AAClC,OAAO,WAAW,MAAM,mBAAmB,CAAC;AAC5C,OAAO,WAAW,MAAM,mBAAmB,CAAC;AAC5C,OAAO,kBAAkB,MAAM,0BAA0B,CAAC;AAC1D,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAEtC,OAAO,EACL,UAAU,EACV,QAAQ,EACR,WAAW,EACX,OAAO,EACP,MAAM,EACN,WAAW,EACX,WAAW,EACX,kBAAkB,EAClB,QAAQ,GACT,CAAC;;;;;;;;;;;;;;;;;AAEF,wBAWE"} |
| import { Children } from 'react'; | ||
| import deepFilter from './lib/deepFilter'; | ||
| import deepFind from './lib/deepFind'; | ||
| import deepForEach from './lib/deepForEach'; | ||
| import deepMap from './lib/deepMap'; | ||
| import filter from './lib/filter'; | ||
| import groupByType from './lib/groupByType'; | ||
| import hasChildren from './lib/hasChildren'; | ||
| import hasComplexChildren from './lib/hasComplexChildren'; | ||
| import onlyText from './lib/onlyText'; | ||
| export { deepFilter, deepFind, deepForEach, deepMap, filter, groupByType, hasChildren, hasComplexChildren, onlyText, }; | ||
| export default Object.assign(Object.assign({}, Children), { deepFilter, | ||
| deepFind, | ||
| deepForEach, | ||
| deepMap, | ||
| filter, | ||
| groupByType, | ||
| hasChildren, | ||
| hasComplexChildren, | ||
| onlyText }); | ||
| //# sourceMappingURL=react-children-utilities.js.map |
Sorry, the diff of this file is not supported yet
| {"version":3,"file":"react-children-utilities.js","sourceRoot":"","sources":["src/react-children-utilities.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEjC,OAAO,UAAU,MAAM,kBAAkB,CAAC;AAC1C,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,WAAW,MAAM,mBAAmB,CAAC;AAC5C,OAAO,OAAO,MAAM,eAAe,CAAC;AACpC,OAAO,MAAM,MAAM,cAAc,CAAC;AAClC,OAAO,WAAW,MAAM,mBAAmB,CAAC;AAC5C,OAAO,WAAW,MAAM,mBAAmB,CAAC;AAC5C,OAAO,kBAAkB,MAAM,0BAA0B,CAAC;AAC1D,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAEtC,OAAO,EACL,UAAU,EACV,QAAQ,EACR,WAAW,EACX,OAAO,EACP,MAAM,EACN,WAAW,EACX,WAAW,EACX,kBAAkB,EAClB,QAAQ,GACT,CAAC;AAEF,+CACK,QAAQ,KACX,UAAU;IACV,QAAQ;IACR,WAAW;IACX,OAAO;IACP,MAAM;IACN,WAAW;IACX,WAAW;IACX,kBAAkB;IAClB,QAAQ,IACR","sourcesContent":["import { Children } from 'react';\n\nimport deepFilter from './lib/deepFilter';\nimport deepFind from './lib/deepFind';\nimport deepForEach from './lib/deepForEach';\nimport deepMap from './lib/deepMap';\nimport filter from './lib/filter';\nimport groupByType from './lib/groupByType';\nimport hasChildren from './lib/hasChildren';\nimport hasComplexChildren from './lib/hasComplexChildren';\nimport onlyText from './lib/onlyText';\n\nexport {\n deepFilter,\n deepFind,\n deepForEach,\n deepMap,\n filter,\n groupByType,\n hasChildren,\n hasComplexChildren,\n onlyText,\n};\n\nexport default {\n ...Children,\n deepFilter,\n deepFind,\n deepForEach,\n deepMap,\n filter,\n groupByType,\n hasChildren,\n hasComplexChildren,\n onlyText,\n};\n"]} |
| import{Children as e,isValidElement as t,cloneElement as r}from"react";const c=e=>Boolean(e&&e.t&&e.t.children),o=r=>c(r)&&e.toArray(r.t.children).reduce((e,r)=>e||t(r),!1),n=(t,c)=>e.toArray(t).filter(c).map(e=>o(e)?r(e,Object.assign(Object.assign({},e.t),{children:n(e.t.children,c)})):e),p=(t,r)=>{let c;return e.toArray(t).find(e=>o(e)?void 0!==(c=p(e.t.children,r)):!!r(e)&&(c=e,!0)),c},d=(t,r)=>{e.forEach(t,e=>{o(e)&&d(e.t.children,r),r(e)})},i=(t,c)=>e.map(t,e=>o(e)?c(r(e,Object.assign(Object.assign({},e.t),{children:i(e.t.children,c)}))):c(e)),l=(t,r)=>e.toArray(t).filter(r),a=(r,c=[],o="rest")=>e.toArray(r).reduce((e,r)=>{const n=t(r)&&c.includes(r.type),p=n?r.t.children:r,d=n?r.type:o;if("string"!=typeof d)return e;const i=e[d];return Object.assign(Object.assign({},e),{[d]:[...i||[],p]})},{}),b=t=>e.toArray(t).reduce((e,t)=>t?[...e,c(t)?b(t.t.children):t.toString()]:e,[]).join("");var j=Object.assign(Object.assign({},e),{o:n,p:p,i:d,l:i,filter:l,j:a,O:c,h:o,s:b});export default j;export{n as deepFilter,p as deepFind,d as deepForEach,i as deepMap,l as filter,a as groupByType,c as hasChildren,o as hasComplexChildren,b as onlyText}; | ||
| //# sourceMappingURL=react-children-utilities.min.js.map |
| {"version":3,"file":"react-children-utilities.min.js","sources":["lib/hasChildren.js","lib/hasComplexChildren.js","lib/deepFilter.js","lib/deepFind.js","lib/deepForEach.js","lib/deepMap.js","lib/filter.js","lib/groupByType.js","lib/onlyText.js","react-children-utilities.js"],"sourcesContent":["const hasChildren = (child) => Boolean(child && child.props && child.props.children);\nexport default hasChildren;\n//# sourceMappingURL=hasChildren.js.map","import { Children, isValidElement } from 'react';\nimport hasChildren from './hasChildren';\nconst hasComplexChildren = (element) => hasChildren(element) &&\n Children.toArray(element.props.children).reduce((response, child) => response || isValidElement(child), false);\nexport default hasComplexChildren;\n//# sourceMappingURL=hasComplexChildren.js.map","import { Children, cloneElement } from 'react';\nimport hasComplexChildren from './hasComplexChildren';\nconst deepFilter = (children, deepFilterFn) => {\n return Children.toArray(children)\n .filter(deepFilterFn)\n .map((child) => {\n if (hasComplexChildren(child)) {\n // Clone the child that has children and filter them too\n return cloneElement(child, Object.assign(Object.assign({}, child.props), { children: deepFilter(child.props.children, deepFilterFn) }));\n }\n return child;\n });\n};\nexport default deepFilter;\n//# sourceMappingURL=deepFilter.js.map","import { Children } from 'react';\nimport hasComplexChildren from './hasComplexChildren';\nconst deepFind = (children, deepFindFn) => {\n let found;\n Children.toArray(children).find((child) => {\n if (hasComplexChildren(child)) {\n // Find inside the child that has children\n found = deepFind(child.props.children, deepFindFn);\n return typeof found !== 'undefined';\n }\n if (deepFindFn(child)) {\n found = child;\n return true;\n }\n return false;\n });\n return found;\n};\nexport default deepFind;\n//# sourceMappingURL=deepFind.js.map","import { Children } from 'react';\nimport hasComplexChildren from './hasComplexChildren';\nconst deepForEach = (children, deepForEachFn) => {\n Children.forEach(children, (child) => {\n if (hasComplexChildren(child)) {\n // Each inside the child that has children\n deepForEach(child.props.children, deepForEachFn);\n }\n deepForEachFn(child);\n });\n};\nexport default deepForEach;\n//# sourceMappingURL=deepForEach.js.map","import { Children, cloneElement } from 'react';\nimport hasComplexChildren from './hasComplexChildren';\nconst deepMap = (children, deepMapFn) => {\n return Children.map(children, (child) => {\n if (hasComplexChildren(child)) {\n // Clone the child that has children and map them too\n return deepMapFn(cloneElement(child, Object.assign(Object.assign({}, child.props), { children: deepMap(child.props.children, deepMapFn) })));\n }\n return deepMapFn(child);\n });\n};\nexport default deepMap;\n//# sourceMappingURL=deepMap.js.map","import { Children } from 'react';\nconst filter = (children, filterFn) => {\n return Children.toArray(children).filter(filterFn);\n};\nexport default filter;\n//# sourceMappingURL=filter.js.map","import { Children, isValidElement } from 'react';\nconst groupByType = (children, types = [], rest = 'rest') => {\n return Children.toArray(children).reduce((groups, child) => {\n const isGrouped = isValidElement(child) && types.includes(child.type);\n const addChild = isGrouped ? child.props.children : child;\n const key = isGrouped ? child.type : rest;\n if (typeof key !== 'string') {\n return groups;\n }\n const group = groups[key];\n return Object.assign(Object.assign({}, groups), { [key]: [...(group || []), addChild] });\n }, {});\n};\nexport default groupByType;\n//# sourceMappingURL=groupByType.js.map","import { Children } from 'react';\nimport hasChildren from './hasChildren';\nconst onlyText = (children) => {\n return Children.toArray(children)\n .reduce((flattened, child) => {\n if (!child) {\n return flattened;\n }\n return [\n ...flattened,\n hasChildren(child) ? onlyText(child.props.children) : child.toString(),\n ];\n }, [])\n .join('');\n};\nexport default onlyText;\n//# sourceMappingURL=onlyText.js.map","import { Children } from 'react';\nimport deepFilter from './lib/deepFilter';\nimport deepFind from './lib/deepFind';\nimport deepForEach from './lib/deepForEach';\nimport deepMap from './lib/deepMap';\nimport filter from './lib/filter';\nimport groupByType from './lib/groupByType';\nimport hasChildren from './lib/hasChildren';\nimport hasComplexChildren from './lib/hasComplexChildren';\nimport onlyText from './lib/onlyText';\nexport { deepFilter, deepFind, deepForEach, deepMap, filter, groupByType, hasChildren, hasComplexChildren, onlyText, };\nexport default Object.assign(Object.assign({}, Children), { deepFilter,\n deepFind,\n deepForEach,\n deepMap,\n filter,\n groupByType,\n hasChildren,\n hasComplexChildren,\n onlyText });\n//# sourceMappingURL=react-children-utilities.js.map"],"names":["hasChildren","child","Boolean","props","children","hasComplexChildren","element","Children","toArray","reduce","response","isValidElement","deepFilter","deepFilterFn","filter","map","cloneElement","Object","assign","deepFind","deepFindFn","found","find","deepForEach","deepForEachFn","forEach","deepMap","deepMapFn","filterFn","groupByType","types","rest","groups","isGrouped","includes","type","addChild","key","group","[object Object]","onlyText","flattened","toString","join","o","p","i","l","j","O","h","s"],"mappings":"uEAAA,MAAMA,EAAeC,GAAUC,QAAQD,GAASA,EAAME,GAASF,EAAME,EAAMC,UCErEC,EAAsBC,GAAYN,EAAYM,IAChDC,EAASC,QAAQF,EAAQH,EAAMC,UAAUK,OAAO,CAACC,EAAUT,IAAUS,GAAYC,EAAeV,IAAQ,GCDtGW,EAAa,CAACR,EAAUS,IACnBN,EAASC,QAAQJ,GACnBU,OAAOD,GACPE,IAAKd,GACFI,EAAmBJ,GAEZe,EAAaf,EAAOgB,OAAOC,OAAOD,OAAOC,OAAO,GAAIjB,EAAME,GAAQ,CAAEC,SAAUQ,EAAWX,EAAME,EAAMC,SAAUS,MAEnHZ,GCRTkB,EAAW,CAACf,EAAUgB,KACxB,IAAIC,EAaJ,OAZAd,EAASC,QAAQJ,GAAUkB,KAAMrB,GACzBI,EAAmBJ,QAGK,KADxBoB,EAAQF,EAASlB,EAAME,EAAMC,SAAUgB,MAGvCA,EAAWnB,KACXoB,EAAQpB,GACD,IAIRoB,GCdLE,EAAc,CAACnB,EAAUoB,KAC3BjB,EAASkB,QAAQrB,EAAWH,IACpBI,EAAmBJ,IAEnBsB,EAAYtB,EAAME,EAAMC,SAAUoB,GAEtCA,EAAcvB,MCNhByB,EAAU,CAACtB,EAAUuB,IAChBpB,EAASQ,IAAIX,EAAWH,GACvBI,EAAmBJ,GAEZ0B,EAAUX,EAAaf,EAAOgB,OAAOC,OAAOD,OAAOC,OAAO,GAAIjB,EAAME,GAAQ,CAAEC,SAAUsB,EAAQzB,EAAME,EAAMC,SAAUuB,OAE1HA,EAAU1B,ICPnBa,EAAS,CAACV,EAAUwB,IACfrB,EAASC,QAAQJ,GAAUU,OAAOc,GCDvCC,EAAc,CAACzB,EAAU0B,EAAQ,GAAIC,EAAO,SACvCxB,EAASC,QAAQJ,GAAUK,OAAO,CAACuB,EAAQ/B,KAC9C,MAAMgC,EAAYtB,EAAeV,IAAU6B,EAAMI,SAASjC,EAAMkC,MAC1DC,EAAWH,EAAYhC,EAAME,EAAMC,SAAWH,EAC9CoC,EAAMJ,EAAYhC,EAAMkC,KAAOJ,EACrC,GAAmB,iBAARM,EACP,OAAOL,EAEX,MAAMM,EAAQN,EAAOK,GACrB,OAAOpB,OAAOC,OAAOD,OAAOC,OAAO,GAAIc,GAAS,CAAEO,CAACF,GAAM,IAAKC,GAAS,GAAKF,MAC7E,ICTDI,EAAYpC,GACPG,EAASC,QAAQJ,GACnBK,OAAO,CAACgC,EAAWxC,IACfA,EAGE,IACAwC,EACHzC,EAAYC,GAASuC,EAASvC,EAAME,EAAMC,UAAYH,EAAMyC,YAJrDD,EAMZ,IACEE,KAAK,ICFd,MAAe1B,OAAOC,OAAOD,OAAOC,OAAO,GAAIX,GAAW,CAAEqC,EAAAhC,EACxDiC,EAAA1B,EACA2B,EAAAvB,EACAwB,EAAArB,EACAZ,OAAAA,EACAkC,EAAAnB,EACAoB,EAAAjD,EACAkD,EAAA7C,EACA8C,EAAAX"} |
| import { terser } from 'rollup-plugin-terser'; | ||
| export default [ | ||
| { | ||
| input: 'react-children-utilities.js', | ||
| output: { | ||
| file: 'react-children-utilities.min.js', | ||
| format: 'esm', | ||
| sourcemap: true, | ||
| }, | ||
| plugins: [ | ||
| terser({ | ||
| warnings: true, | ||
| mangle: { | ||
| module: true, | ||
| properties: true, | ||
| }, | ||
| }), | ||
| ], | ||
| }, | ||
| ]; |
| // eslint-disable-next-line import/no-extraneous-dependencies | ||
| import 'jest-enzyme'; |
| /* eslint-disable import/no-named-as-default-member, import/named */ | ||
| import Children, { | ||
| deepFilter, | ||
| deepFind, | ||
| deepForEach, | ||
| deepMap, | ||
| filter, | ||
| groupByType, | ||
| onlyText, | ||
| } from '../react-children-utilities'; | ||
| describe('children', () => { | ||
| it('has the right exports', () => { | ||
| expect(filter).toBeInstanceOf(Function); | ||
| expect(Children.filter).toStrictEqual(filter); | ||
| expect(deepFilter).toBeInstanceOf(Function); | ||
| expect(Children.deepFilter).toStrictEqual(deepFilter); | ||
| expect(deepFind).toBeInstanceOf(Function); | ||
| expect(Children.deepFind).toStrictEqual(deepFind); | ||
| expect(deepForEach).toBeInstanceOf(Function); | ||
| expect(Children.deepForEach).toStrictEqual(deepForEach); | ||
| expect(deepMap).toBeInstanceOf(Function); | ||
| expect(Children.deepMap).toStrictEqual(deepMap); | ||
| expect(groupByType).toBeInstanceOf(Function); | ||
| expect(Children.groupByType).toStrictEqual(groupByType); | ||
| expect(onlyText).toBeInstanceOf(Function); | ||
| expect(Children.onlyText).toStrictEqual(onlyText); | ||
| }); | ||
| }); |
| import React, { ReactElement, ReactNode } from 'react'; | ||
| import { shallow } from 'enzyme'; | ||
| import deepFilter from '../deepFilter'; | ||
| interface Props { | ||
| children?: ReactNode; | ||
| } | ||
| describe('deepFilter', () => { | ||
| it('nested elements', () => { | ||
| const DeepFiltered = ({ children }: Props): ReactElement => ( | ||
| <div>{deepFilter(children, (item) => (item as ReactElement).type === 'span')}</div> | ||
| ); | ||
| const wrapper = shallow( | ||
| <DeepFiltered> | ||
| <span>1</span> | ||
| <span>2</span> | ||
| <span> | ||
| <strong>3</strong> | ||
| <span> | ||
| <strong>4</strong> | ||
| <span>5</span> | ||
| </span> | ||
| </span> | ||
| </DeepFiltered>, | ||
| ); | ||
| expect(wrapper).toContainReact( | ||
| <div> | ||
| <span>1</span> | ||
| <span>2</span> | ||
| <span> | ||
| <span> | ||
| <span>5</span> | ||
| </span> | ||
| </span> | ||
| </div>, | ||
| ); | ||
| }); | ||
| it('non nested elements', () => { | ||
| const DeepFiltered = ({ children }: Props): ReactElement => ( | ||
| <div>{deepFilter(children, (item) => (item as ReactElement).type === 'span')}</div> | ||
| ); | ||
| const wrapper = shallow( | ||
| <DeepFiltered> | ||
| <strong>1</strong> | ||
| <span>2</span> | ||
| </DeepFiltered>, | ||
| ); | ||
| expect(wrapper).toContainReact( | ||
| <div> | ||
| <span>2</span> | ||
| </div>, | ||
| ); | ||
| }); | ||
| it('remove elements event if they have matching nested children', () => { | ||
| const DeepFiltered = ({ children }: Props): ReactElement => ( | ||
| <div>{deepFilter(children, (item) => (item as ReactElement).type === 'span')}</div> | ||
| ); | ||
| const wrapper = shallow( | ||
| <DeepFiltered> | ||
| <span>1</span> | ||
| <span>2</span> | ||
| <span> | ||
| <span>3</span> | ||
| <strong> | ||
| <strong>4</strong> | ||
| <span>5</span> | ||
| </strong> | ||
| </span> | ||
| </DeepFiltered>, | ||
| ); | ||
| expect(wrapper).toContainReact( | ||
| <div> | ||
| <span>1</span> | ||
| <span>2</span> | ||
| <span> | ||
| <span>3</span> | ||
| </span> | ||
| </div>, | ||
| ); | ||
| }); | ||
| it('keeps empty matching elements if children do not match', () => { | ||
| const DeepFiltered = ({ children }: Props): ReactElement => ( | ||
| <div>{deepFilter(children, (item) => (item as ReactElement).type === 'span')}</div> | ||
| ); | ||
| const wrapper = shallow( | ||
| <DeepFiltered> | ||
| <span>1</span> | ||
| <span>2</span> | ||
| <span> | ||
| <strong>3</strong> | ||
| <strong> | ||
| <strong>4</strong> | ||
| <span>5</span> | ||
| </strong> | ||
| </span> | ||
| </DeepFiltered>, | ||
| ); | ||
| expect(wrapper).toContainReact( | ||
| <div> | ||
| <span>1</span> | ||
| <span>2</span> | ||
| <span /> | ||
| </div>, | ||
| ); | ||
| }); | ||
| }); |
| import React, { ReactNode, ReactElement } from 'react'; | ||
| import { shallow } from 'enzyme'; | ||
| import deepFind from '../deepFind'; | ||
| interface Props { | ||
| children?: ReactNode; | ||
| } | ||
| describe('deepFind', () => { | ||
| it('a nested element', () => { | ||
| const DeepFound = ({ children }: Props): ReactElement => ( | ||
| <div>{deepFind(children, (child) => (child as ReactElement).type === 'i')}</div> | ||
| ); | ||
| const wrapper = shallow( | ||
| <DeepFound> | ||
| <b>1</b> | ||
| <span> | ||
| <i>2</i> | ||
| </span> | ||
| <i>3</i> | ||
| </DeepFound>, | ||
| ); | ||
| expect(wrapper.children()).toHaveLength(1); | ||
| expect(wrapper.children().at(0)).toMatchElement(<i>2</i>); | ||
| }); | ||
| it('a non nested element', () => { | ||
| const DeepFound = ({ children }: Props): ReactElement => ( | ||
| <div>{deepFind(children, (child) => (child as ReactElement).type === 'i')}</div> | ||
| ); | ||
| const wrapper = shallow( | ||
| <DeepFound> | ||
| <b>1</b> | ||
| <i>3</i> | ||
| </DeepFound>, | ||
| ); | ||
| expect(wrapper.children()).toHaveLength(1); | ||
| expect(wrapper.children().at(0)).toMatchElement(<i>3</i>); | ||
| }); | ||
| it('can not find anything', () => { | ||
| const DeepFound = ({ children }: Props): ReactElement => ( | ||
| <div>{deepFind(children, (child) => (child as ReactElement).type === 'i')}</div> | ||
| ); | ||
| const wrapper = shallow( | ||
| <DeepFound> | ||
| <b>1</b> | ||
| <b>2</b> | ||
| </DeepFound>, | ||
| ); | ||
| expect(wrapper.children()).toHaveLength(0); | ||
| expect(wrapper).toMatchElement(<div />); | ||
| }); | ||
| }); |
| import React, { ReactElement, ReactNode } from 'react'; | ||
| import { shallow } from 'enzyme'; | ||
| import deepForEach from '../deepForEach'; | ||
| interface Props { | ||
| children?: ReactNode; | ||
| } | ||
| describe('deepForEach', () => { | ||
| it('on nested elements', () => { | ||
| const DeepForEached = ({ children }: Props): ReactElement => { | ||
| const items: ReactNode[] = []; | ||
| deepForEach(children, (child: ReactNode) => { | ||
| if (child && (child as ReactElement).type === 'b') { | ||
| items.push((child as ReactElement).props.children); | ||
| } | ||
| }); | ||
| return <div>{items}</div>; | ||
| }; | ||
| const wrapper = shallow( | ||
| <DeepForEached> | ||
| <b>1</b> | ||
| <b>2</b> | ||
| <span> | ||
| <b>3</b> | ||
| </span> | ||
| <i>non matching</i> | ||
| <div> | ||
| <div> | ||
| <b>4</b> | ||
| </div> | ||
| </div> | ||
| example | ||
| </DeepForEached>, | ||
| ); | ||
| expect(wrapper).toHaveText('1234'); | ||
| }); | ||
| it('on non nested elements', () => { | ||
| const DeepForEached = ({ children }: Props): ReactElement => { | ||
| const items: ReactNode[] = []; | ||
| deepForEach(children, (child: ReactNode) => { | ||
| if (child && (child as ReactElement).type === 'b') { | ||
| items.push((child as ReactElement).props.children); | ||
| } | ||
| }); | ||
| return <div>{items}</div>; | ||
| }; | ||
| const wrapper = shallow( | ||
| <DeepForEached> | ||
| <b>1</b> | ||
| <b>2</b> | ||
| </DeepForEached>, | ||
| ); | ||
| expect(wrapper).toHaveText('12'); | ||
| }); | ||
| it('on empty', () => { | ||
| const DeepForEached = ({ children }: Props): ReactElement => { | ||
| const items: ReactNode[] = []; | ||
| deepForEach(children, (child: ReactNode) => { | ||
| if (child && (child as ReactElement).type === 'b') { | ||
| items.push((child as ReactElement).props.children); | ||
| } | ||
| }); | ||
| return <div>{items}</div>; | ||
| }; | ||
| const wrapper = shallow(<DeepForEached />); | ||
| expect(wrapper).toHaveText(''); | ||
| }); | ||
| }); |
| import React, { cloneElement, ReactElement, ReactNode } from 'react'; | ||
| import { shallow } from 'enzyme'; | ||
| import deepMap from '../deepMap'; | ||
| interface Props { | ||
| children?: ReactNode; | ||
| } | ||
| const DeepMapped = ({ children }: Props): ReactElement => ( | ||
| <div> | ||
| {deepMap(children, (child: ReactNode) => { | ||
| if (child && (child as ReactElement).type === 'b') { | ||
| return cloneElement(child as ReactElement, { | ||
| ...(child as ReactElement).props, | ||
| className: 'mapped', | ||
| }); | ||
| } | ||
| return child; | ||
| })} | ||
| </div> | ||
| ); | ||
| describe('deepMap', () => { | ||
| it('nested elements', () => { | ||
| const wrapper = shallow( | ||
| <DeepMapped> | ||
| <b>1</b> | ||
| <b>2</b> | ||
| test text | ||
| <span> | ||
| <b>3</b> | ||
| </span> | ||
| <div> | ||
| <div> | ||
| <b>4</b> | ||
| </div> | ||
| </div> | ||
| </DeepMapped>, | ||
| ); | ||
| expect(wrapper.find('b.mapped')).toHaveLength(4); | ||
| expect(wrapper.find('b:not(.mapped)')).toHaveLength(0); | ||
| }); | ||
| it('non nested elements', () => { | ||
| const wrapper = shallow( | ||
| <DeepMapped> | ||
| <b>1</b> | ||
| <b>2</b> | ||
| </DeepMapped>, | ||
| ); | ||
| expect(wrapper.find('b.mapped')).toHaveLength(2); | ||
| expect(wrapper.find('b:not(.mapped)')).toHaveLength(0); | ||
| }); | ||
| it('empty children', () => { | ||
| const wrapper = shallow(<DeepMapped />); | ||
| expect(wrapper.children()).toHaveLength(0); | ||
| }); | ||
| }); |
| import React, { ReactElement, ReactNode } from 'react'; | ||
| import { shallow } from 'enzyme'; | ||
| import filter from '../filter'; | ||
| interface Props { | ||
| children?: ReactNode; | ||
| } | ||
| describe('filter', () => { | ||
| it('returns same children', () => { | ||
| const Filtered = ({ children }: Props): ReactElement => ( | ||
| <div> | ||
| {filter(children, (item: ReactNode) => | ||
| Boolean(item && (item as ReactElement).type && (item as ReactElement).type === 'div'), | ||
| )} | ||
| </div> | ||
| ); | ||
| const wrapper = shallow( | ||
| <Filtered> | ||
| <div>1</div> | ||
| <div>2</div> | ||
| <div>3</div> | ||
| </Filtered>, | ||
| ); | ||
| expect(wrapper.children()).toHaveLength(3); | ||
| }); | ||
| it('returns only matching children', () => { | ||
| const Filtered = ({ children }: Props): ReactElement => ( | ||
| <div> | ||
| {filter(children, (item: ReactNode) => | ||
| Boolean(item && (item as ReactElement).type && (item as ReactElement).type === 'span'), | ||
| )} | ||
| </div> | ||
| ); | ||
| const wrapper = shallow( | ||
| <Filtered> | ||
| <span>1</span> | ||
| <strong>2</strong> | ||
| <span>3</span> | ||
| </Filtered>, | ||
| ); | ||
| expect(wrapper.children()).toHaveLength(2); | ||
| expect(wrapper.find('strong')).not.toExist(); | ||
| expect(wrapper.find('span')).toHaveLength(2); | ||
| }); | ||
| it('does not filter nested elements', () => { | ||
| const Filtered = ({ children }: Props): ReactElement => ( | ||
| <div> | ||
| {filter(children, (item: ReactNode) => | ||
| Boolean(item && (item as ReactElement).type && (item as ReactElement).type === 'span'), | ||
| )} | ||
| </div> | ||
| ); | ||
| const wrapper = shallow( | ||
| <Filtered> | ||
| <span>1</span> | ||
| <span> | ||
| <strong>2</strong> | ||
| </span> | ||
| <span>3</span> | ||
| </Filtered>, | ||
| ); | ||
| expect(wrapper.children()).toHaveLength(3); | ||
| expect(wrapper.find('strong')).toExist(); | ||
| }); | ||
| it('can handle empty children', () => { | ||
| const Filtered = ({ children }: Props): ReactElement => ( | ||
| <div> | ||
| {filter(children, (item: ReactNode) => | ||
| Boolean(item && (item as ReactElement).type && (item as ReactElement).type === 'div'), | ||
| )} | ||
| </div> | ||
| ); | ||
| const wrapper = shallow(<Filtered />); | ||
| expect(wrapper.children()).toHaveLength(0); | ||
| }); | ||
| }); |
| import React, { ReactElement, ReactNode } from 'react'; | ||
| import { shallow } from 'enzyme'; | ||
| import groupByType from '../groupByType'; | ||
| interface Props { | ||
| children?: ReactNode; | ||
| } | ||
| describe('groupByType', () => { | ||
| it('groups', () => { | ||
| const Grouped = ({ children }: Props): ReactElement => ( | ||
| <div> | ||
| <div className="spans">{groupByType(children, ['span', 'i'], 'rest').span}</div> | ||
| <div className="rest">{groupByType(children, ['span', 'i'], 'rest').rest}</div> | ||
| <div className="empty">{groupByType(children, ['span', 'i'], 'rest').i}</div> | ||
| </div> | ||
| ); | ||
| const wrapper = shallow( | ||
| <Grouped> | ||
| <span> | ||
| <b>1</b> | ||
| </span> | ||
| <span> | ||
| <b>2</b> | ||
| </span> | ||
| <strong>3</strong> | ||
| </Grouped>, | ||
| ); | ||
| expect(wrapper.find('.spans b')).toExist(); | ||
| expect(wrapper.find('.spans b')).toHaveLength(2); | ||
| expect(wrapper.find('.spans strong')).not.toExist(); | ||
| expect(wrapper.find('.rest span')).not.toExist(); | ||
| expect(wrapper.find('.rest strong')).toExist(); | ||
| expect(wrapper.find('.rest strong')).toHaveLength(1); | ||
| expect(wrapper.find('.empty').children()).not.toExist(); | ||
| }); | ||
| }); |
| import React, { ReactElement, ReactNode } from 'react'; | ||
| import { shallow } from 'enzyme'; | ||
| import hasChildren from '../hasChildren'; | ||
| interface Props { | ||
| children?: ReactNode; | ||
| } | ||
| describe('hasChildren', () => { | ||
| describe('returns true', () => { | ||
| it('with elements', () => { | ||
| const Test = ({ children }: Props): ReactElement => <div>{children}</div>; | ||
| const wrapper = shallow( | ||
| <Test> | ||
| <span /> | ||
| <span /> | ||
| </Test>, | ||
| ); | ||
| expect(hasChildren(wrapper.getElement())).toBe(true); | ||
| }); | ||
| it('with text', () => { | ||
| const Test = ({ children }: Props): ReactElement => <div>{children}</div>; | ||
| const wrapper = shallow(<Test>My test</Test>); | ||
| expect(hasChildren(wrapper.getElement())).toBe(true); | ||
| }); | ||
| it('with numbers', () => { | ||
| const Test = ({ children }: Props): ReactElement => <div>{children}</div>; | ||
| const wrapper = shallow(<Test>{1}</Test>); | ||
| expect(hasChildren(wrapper.getElement())).toBe(true); | ||
| }); | ||
| it('with true', () => { | ||
| const Test = ({ children }: Props): ReactElement => <div>{children}</div>; | ||
| const wrapper = shallow(<Test>{true}</Test>); | ||
| expect(hasChildren(wrapper.getElement())).toBe(true); | ||
| }); | ||
| it('with combined types', () => { | ||
| const Test = ({ children }: Props): ReactElement => <div>{children}</div>; | ||
| const wrapper = shallow( | ||
| <Test> | ||
| <span /> | ||
| My test | ||
| {1} | ||
| </Test>, | ||
| ); | ||
| expect(hasChildren(wrapper.getElement())).toBe(true); | ||
| }); | ||
| it('with valid and non valid types', () => { | ||
| const Test = ({ children }: Props): ReactElement => <div>{children}</div>; | ||
| const wrapper = shallow( | ||
| <Test> | ||
| <span /> | ||
| My test | ||
| {null} | ||
| {false} | ||
| </Test>, | ||
| ); | ||
| expect(hasChildren(wrapper.getElement())).toBe(true); | ||
| }); | ||
| }); | ||
| describe('returns false', () => { | ||
| it('when empty', () => { | ||
| const Test = ({ children }: Props): ReactElement => <div>{children}</div>; | ||
| const wrapper = shallow(<Test />); | ||
| expect(hasChildren(wrapper.getElement())).toBe(false); | ||
| }); | ||
| it('with null', () => { | ||
| const Test = ({ children }: Props): ReactElement => <div>{children}</div>; | ||
| const wrapper = shallow(<Test>{null}</Test>); | ||
| expect(hasChildren(wrapper.getElement())).toBe(false); | ||
| }); | ||
| it('with false', () => { | ||
| const Test = ({ children }: Props): ReactElement => <div>{children}</div>; | ||
| const wrapper = shallow(<Test>{null}</Test>); | ||
| expect(hasChildren(wrapper.getElement())).toBe(false); | ||
| }); | ||
| }); | ||
| }); |
| import React, { ReactElement, ReactNode } from 'react'; | ||
| import { shallow } from 'enzyme'; | ||
| import hasComplexChildren from '../hasComplexChildren'; | ||
| interface Props { | ||
| children?: ReactNode; | ||
| } | ||
| describe('hasComplexChildren', () => { | ||
| describe('returns true', () => { | ||
| it('with elements', () => { | ||
| const Test = ({ children }: Props): ReactElement => <div>{children}</div>; | ||
| const wrapper = shallow( | ||
| <Test> | ||
| <span /> | ||
| <span /> | ||
| </Test>, | ||
| ); | ||
| expect(hasComplexChildren(wrapper.getElement())).toBe(true); | ||
| }); | ||
| it('with combined types', () => { | ||
| const Test = ({ children }: Props): ReactElement => <div>{children}</div>; | ||
| const wrapper = shallow( | ||
| <Test> | ||
| My test | ||
| <span /> | ||
| {1} | ||
| </Test>, | ||
| ); | ||
| expect(hasComplexChildren(wrapper.getElement())).toBe(true); | ||
| }); | ||
| it('with valid and non valid types', () => { | ||
| const Test = ({ children }: Props): ReactElement => <div>{children}</div>; | ||
| const wrapper = shallow( | ||
| <Test> | ||
| {null} | ||
| My test | ||
| <span /> | ||
| {false} | ||
| </Test>, | ||
| ); | ||
| expect(hasComplexChildren(wrapper.getElement())).toBe(true); | ||
| }); | ||
| }); | ||
| describe('returns false', () => { | ||
| it('when empty', () => { | ||
| const Test = ({ children }: Props): ReactElement => <div>{children}</div>; | ||
| const wrapper = shallow(<Test />); | ||
| expect(hasComplexChildren(wrapper.getElement())).toBe(false); | ||
| }); | ||
| it('with null', () => { | ||
| const Test = ({ children }: Props): ReactElement => <div>{children}</div>; | ||
| const wrapper = shallow(<Test>{null}</Test>); | ||
| expect(hasComplexChildren(wrapper.getElement())).toBe(false); | ||
| }); | ||
| it('with false', () => { | ||
| const Test = ({ children }: Props): ReactElement => <div>{children}</div>; | ||
| const wrapper = shallow(<Test>{null}</Test>); | ||
| expect(hasComplexChildren(wrapper.getElement())).toBe(false); | ||
| }); | ||
| it('with text', () => { | ||
| const Test = ({ children }: Props): ReactElement => <div>{children}</div>; | ||
| const wrapper = shallow(<Test>My test</Test>); | ||
| expect(hasComplexChildren(wrapper.getElement())).toBe(false); | ||
| }); | ||
| it('with numbers', () => { | ||
| const Test = ({ children }: Props): ReactElement => <div>{children}</div>; | ||
| const wrapper = shallow(<Test>{1}</Test>); | ||
| expect(hasComplexChildren(wrapper.getElement())).toBe(false); | ||
| }); | ||
| it('with true', () => { | ||
| const Test = ({ children }: Props): ReactElement => <div>{children}</div>; | ||
| const wrapper = shallow(<Test>{true}</Test>); | ||
| expect(hasComplexChildren(wrapper.getElement())).toBe(false); | ||
| }); | ||
| }); | ||
| }); |
| import React, { ReactElement, ReactNode } from 'react'; | ||
| import { shallow } from 'enzyme'; | ||
| import onlyText from '../onlyText'; | ||
| interface Props { | ||
| children?: ReactNode; | ||
| } | ||
| const OnlyText = ({ children }: Props): ReactElement => <div>{onlyText(children)}</div>; | ||
| describe('onlyText', () => { | ||
| it('on nested elements', () => { | ||
| const wrapper = shallow( | ||
| <OnlyText> | ||
| <span>0</span> | ||
| <b>1</b> | ||
| <span> | ||
| <i>2</i> | ||
| </span> | ||
| <i>3</i> | ||
| </OnlyText>, | ||
| ); | ||
| expect(wrapper).toHaveText('0123'); | ||
| }); | ||
| it('on non nested elements', () => { | ||
| const wrapper = shallow( | ||
| <OnlyText> | ||
| <span>0</span> | ||
| <b>1</b> | ||
| </OnlyText>, | ||
| ); | ||
| expect(wrapper).toHaveText('01'); | ||
| }); | ||
| it('on empty', () => { | ||
| const wrapper = shallow(<OnlyText />); | ||
| expect(wrapper).toHaveText(''); | ||
| }); | ||
| it('on text', () => { | ||
| const wrapper = shallow(<OnlyText>test 1 test 2</OnlyText>); | ||
| expect(wrapper).toHaveText('test 1 test 2'); | ||
| }); | ||
| it('on number', () => { | ||
| const wrapper = shallow( | ||
| <OnlyText> | ||
| {1} | ||
| {2} | ||
| </OnlyText>, | ||
| ); | ||
| expect(wrapper).toHaveText('12'); | ||
| }); | ||
| it('on true', () => { | ||
| const wrapper = shallow(<OnlyText>{true}</OnlyText>); | ||
| expect(wrapper).toHaveText(''); | ||
| }); | ||
| it('on false', () => { | ||
| const wrapper = shallow(<OnlyText>{false}</OnlyText>); | ||
| expect(wrapper).toHaveText(''); | ||
| }); | ||
| it('on null', () => { | ||
| const wrapper = shallow(<OnlyText>{null}</OnlyText>); | ||
| expect(wrapper).toHaveText(''); | ||
| }); | ||
| it('on combined types', () => { | ||
| const wrapper = shallow( | ||
| <OnlyText> | ||
| example | ||
| {null} | ||
| {3} | ||
| {true} | ||
| </OnlyText>, | ||
| ); | ||
| expect(wrapper).toHaveText('example3'); | ||
| }); | ||
| }); |
| import { Children, cloneElement, ReactElement, ReactNode } from 'react'; | ||
| import hasComplexChildren from './hasComplexChildren'; | ||
| export interface FilterFunction { | ||
| (child: ReactNode, index?: number, children?: ReactNode[]): boolean; | ||
| } | ||
| const deepFilter = (children: ReactNode, deepFilterFn: FilterFunction): ReactNode[] => { | ||
| return Children.toArray(children) | ||
| .filter(deepFilterFn) | ||
| .map((child) => { | ||
| if (hasComplexChildren(child)) { | ||
| // Clone the child that has children and filter them too | ||
| return cloneElement(child as ReactElement, { | ||
| ...(child as ReactElement).props, | ||
| children: deepFilter((child as ReactElement).props.children, deepFilterFn), | ||
| }); | ||
| } | ||
| return child; | ||
| }); | ||
| }; | ||
| export default deepFilter; |
| import { Children, ReactNode, ReactElement } from 'react'; | ||
| import hasComplexChildren from './hasComplexChildren'; | ||
| export interface FindFunction { | ||
| (child: ReactNode, index?: number, children?: ReactNode[]): ReactNode; | ||
| } | ||
| const deepFind = (children: ReactNode, deepFindFn: FindFunction): ReactNode | undefined => { | ||
| let found; | ||
| Children.toArray(children).find((child) => { | ||
| if (hasComplexChildren(child)) { | ||
| // Find inside the child that has children | ||
| found = deepFind((child as ReactElement).props.children, deepFindFn); | ||
| return typeof found !== 'undefined'; | ||
| } | ||
| if (deepFindFn(child)) { | ||
| found = child; | ||
| return true; | ||
| } | ||
| return false; | ||
| }); | ||
| return found; | ||
| }; | ||
| export default deepFind; |
| import { Children, ReactElement, ReactNode } from 'react'; | ||
| import hasComplexChildren from './hasComplexChildren'; | ||
| export interface ForEachFunction { | ||
| (child: ReactNode, index?: number, children?: ReactNode[]): void; | ||
| } | ||
| const deepForEach = (children: ReactNode, deepForEachFn: ForEachFunction): void => { | ||
| Children.forEach(children, (child) => { | ||
| if (hasComplexChildren(child)) { | ||
| // Each inside the child that has children | ||
| deepForEach((child as ReactElement).props.children, deepForEachFn); | ||
| } | ||
| deepForEachFn(child); | ||
| }); | ||
| }; | ||
| export default deepForEach; |
| import { Children, cloneElement, ReactElement, ReactNode } from 'react'; | ||
| import hasComplexChildren from './hasComplexChildren'; | ||
| export interface MapFunction { | ||
| (child: ReactNode, index?: number, children?: ReactNode[]): ReactNode; | ||
| } | ||
| const deepMap = (children: ReactNode, deepMapFn: MapFunction): ReactNode[] => { | ||
| return Children.map(children, (child) => { | ||
| if (hasComplexChildren(child)) { | ||
| // Clone the child that has children and map them too | ||
| return deepMapFn( | ||
| cloneElement(child as ReactElement, { | ||
| ...(child as ReactElement).props, | ||
| children: deepMap((child as ReactElement).props.children, deepMapFn), | ||
| }), | ||
| ); | ||
| } | ||
| return deepMapFn(child); | ||
| }); | ||
| }; | ||
| export default deepMap; |
| import { Children, ReactNode } from 'react'; | ||
| export interface FilterFunction { | ||
| (child: ReactNode, index?: number, children?: ReactNode[]): boolean; | ||
| } | ||
| const filter = (children: ReactNode, filterFn: FilterFunction): ReactNode[] => { | ||
| return Children.toArray(children).filter(filterFn); | ||
| }; | ||
| export default filter; |
| import { Children, isValidElement, ReactNode, ReactElement } from 'react'; | ||
| export interface GroupedChildren { | ||
| [name: string]: ReactNode[]; | ||
| } | ||
| const groupByType = ( | ||
| children: ReactNode, | ||
| types: ReactNode[] = [], | ||
| rest = 'rest', | ||
| ): GroupedChildren => { | ||
| return Children.toArray(children).reduce((groups: GroupedChildren, child: ReactNode) => { | ||
| const isGrouped = isValidElement(child) && types.includes(child.type); | ||
| const addChild = isGrouped ? (child as ReactElement).props.children : child; | ||
| const key = isGrouped ? (child as ReactElement).type : rest; | ||
| if (typeof key !== 'string') { | ||
| return groups; | ||
| } | ||
| const group = groups[key]; | ||
| return { | ||
| ...groups, | ||
| [key]: [...(group || []), addChild], | ||
| }; | ||
| }, {}); | ||
| }; | ||
| export default groupByType; |
| import { ReactNode, ReactElement } from 'react'; | ||
| const hasChildren = (child: ReactNode): boolean => | ||
| Boolean(child && (child as ReactElement).props && (child as ReactElement).props.children); | ||
| export default hasChildren; |
| import { Children, isValidElement, ReactNode, ReactElement } from 'react'; | ||
| import hasChildren from './hasChildren'; | ||
| const hasComplexChildren = (element: ReactNode): boolean => | ||
| hasChildren(element) && | ||
| Children.toArray((element as ReactElement).props.children).reduce( | ||
| (response: boolean, child: ReactNode) => response || isValidElement(child), | ||
| false, | ||
| ); | ||
| export default hasComplexChildren; |
| import { Children, ReactElement, ReactNode } from 'react'; | ||
| import hasChildren from './hasChildren'; | ||
| const onlyText = (children: ReactNode): string => { | ||
| return Children.toArray(children) | ||
| .reduce((flattened: string[], child: ReactNode): string[] => { | ||
| if (!child) { | ||
| return flattened; | ||
| } | ||
| return [ | ||
| ...flattened, | ||
| hasChildren(child) ? onlyText((child as ReactElement).props.children) : child.toString(), | ||
| ]; | ||
| }, []) | ||
| .join(''); | ||
| }; | ||
| export default onlyText; |
| import { Children } from 'react'; | ||
| import deepFilter from './lib/deepFilter'; | ||
| import deepFind from './lib/deepFind'; | ||
| import deepForEach from './lib/deepForEach'; | ||
| import deepMap from './lib/deepMap'; | ||
| import filter from './lib/filter'; | ||
| import groupByType from './lib/groupByType'; | ||
| import hasChildren from './lib/hasChildren'; | ||
| import hasComplexChildren from './lib/hasComplexChildren'; | ||
| import onlyText from './lib/onlyText'; | ||
| export { | ||
| deepFilter, | ||
| deepFind, | ||
| deepForEach, | ||
| deepMap, | ||
| filter, | ||
| groupByType, | ||
| hasChildren, | ||
| hasComplexChildren, | ||
| onlyText, | ||
| }; | ||
| export default { | ||
| ...Children, | ||
| deepFilter, | ||
| deepFind, | ||
| deepForEach, | ||
| deepMap, | ||
| filter, | ||
| groupByType, | ||
| hasChildren, | ||
| hasComplexChildren, | ||
| onlyText, | ||
| }; |
| { | ||
| "extends": "./tsconfig.json", | ||
| "compilerOptions": { | ||
| "allowJs": true, | ||
| "noEmit": true, | ||
| "jsx": "react" | ||
| }, | ||
| "include": ["src/**/*", "*.js", "*.ts"], | ||
| "exclude": ["src/**/*.flow", "node_modules"] | ||
| } |
Sorry, the diff of this file is too big to display
+13
-3
| { | ||
| "extends": ["airbnb", "plugin:jest/all", "prettier"], | ||
| "parser": "babel-eslint", | ||
| "extends": [ | ||
| "airbnb", | ||
| "plugin:import/typescript", | ||
| "plugin:@typescript-eslint/recommended", | ||
| "plugin:jest/all", | ||
| "prettier", | ||
| "prettier/@typescript-eslint" | ||
| ], | ||
| "parserOptions": { | ||
| "project": "./tsconfig.all.json" | ||
| }, | ||
| "env": { | ||
@@ -9,4 +18,5 @@ "browser": true | ||
| "jest/no-hooks": "off", | ||
| "jest/prefer-expect-assertions": "off" | ||
| "jest/prefer-expect-assertions": "off", | ||
| "react/jsx-filename-extension": ["error", { "extensions": [".tsx"] }] | ||
| } | ||
| } |
+1
-1
@@ -5,4 +5,4 @@ { | ||
| "pre-commit": "lint-staged", | ||
| "pre-push": "yarn lint && yarn test && yarn flow && yarn build && yarn size" | ||
| "pre-push": "yarn verify" | ||
| } | ||
| } |
+8
-3
| module.exports = { | ||
| collectCoverageFrom: ['src/**/*.js', 'src/**/*.jsx'], | ||
| collectCoverageFrom: ['src/**/*.ts', 'src/**/*.tsx'], | ||
| testEnvironment: 'enzyme', | ||
| transform: { | ||
| '^.+\\.jsx?$': 'babel-jest', | ||
| '^.+\\.tsx?$': 'ts-jest', | ||
| }, | ||
| setupFilesAfterEnv: ['jest-enzyme'], | ||
| globals: { | ||
| 'ts-jest': { | ||
| tsConfig: 'tsconfig.all.json', | ||
| }, | ||
| }, | ||
| setupFilesAfterEnv: ['./setupTests.ts'], | ||
| }; |
+58
-47
| { | ||
| "name": "react-children-utilities", | ||
| "version": "1.3.3", | ||
| "version": "2.0.0-beta.0", | ||
| "description": "Extended utils for React.Children opaque data structure", | ||
| "keywords": [ | ||
| "children", | ||
| "react", | ||
| "reactjs", | ||
| "children", | ||
| "utils", | ||
| "utilities" | ||
| "utilities", | ||
| "utils" | ||
| ], | ||
| "homepage": "https://github.com/fernandopasik/react-children-utilities", | ||
| "bugs": "https://github.com/fernandopasik/react-children-utilities/issues", | ||
| "repository": { | ||
| "type": "git", | ||
| "url": "https://github.com/fernandopasik/react-children-utilities.git" | ||
| }, | ||
| "license": "MIT", | ||
@@ -20,38 +24,33 @@ "author": "Fernando Pasik <fernando@pasik.com.ar> (https://fernandopasik.com)", | ||
| ], | ||
| "typings": "./src/index.d.ts", | ||
| "repository": { | ||
| "type": "git", | ||
| "url": "https://github.com/fernandopasik/react-children-utilities.git" | ||
| }, | ||
| "main": "dist/index.js", | ||
| "files": [ | ||
| "/react-children-utilities.*", | ||
| "/lib", | ||
| "/src", | ||
| "!*.spec.*" | ||
| ], | ||
| "main": "react-children-utilities.js", | ||
| "module": "react-children-utilities.js", | ||
| "typings": "react-children-utilities.d.ts", | ||
| "scripts": { | ||
| "prebuild": "del lib react-children-utilities.*", | ||
| "build": "tsc && rollup -c && yarn flowgen", | ||
| "check-types": "tsc --noEmit -p tsconfig.all.json && flow", | ||
| "flowgen": "flowgen react-children-utilities.d.ts --quiet -o react-children-utilities.js.flow", | ||
| "lint": "eslint . --ext js,jsx,ts,tsx", | ||
| "size": "bundlesize", | ||
| "test": "jest --coverage", | ||
| "lint": "eslint .", | ||
| "build": "babel src/index.js --minified --source-maps --no-comments --out-file dist/index.js", | ||
| "prebuild": "del dist && make-dir dist", | ||
| "size": "bundlesize", | ||
| "preversion": "yarn lint && yarn test && yarn flow && yarn build && yarn size" | ||
| "verify": "yarn lint && yarn check-types && yarn test && yarn build && yarn size", | ||
| "preversion": "yarn verify" | ||
| }, | ||
| "bundlesize": [ | ||
| { | ||
| "path": "dist/index.js", | ||
| "maxSize": "1.5 kB" | ||
| } | ||
| ], | ||
| "resolutions": { | ||
| "axios": "^0.19.0" | ||
| }, | ||
| "peerDependencies": { | ||
| "react": "15.x.x && 16.x.x" | ||
| }, | ||
| "dependencies": {}, | ||
| "devDependencies": { | ||
| "@babel/cli": "^7.6.2", | ||
| "@babel/core": "^7.6.2", | ||
| "@babel/preset-env": "^7.6.2", | ||
| "@babel/preset-react": "^7.0.0", | ||
| "@commitlint/cli": "^8.2.0", | ||
| "@commitlint/config-conventional": "^8.2.0", | ||
| "babel-eslint": "^10.0.3", | ||
| "babel-jest": "^24.9.0", | ||
| "@types/enzyme": "^3.10.3", | ||
| "@types/enzyme-adapter-react-16": "^1.0.5", | ||
| "@types/jest": "^24.0.18", | ||
| "@types/react": "^16.9.5", | ||
| "@types/react-dom": "^16.9.1", | ||
| "@typescript-eslint/eslint-plugin": "^2.3.3", | ||
| "@typescript-eslint/parser": "^2.3.3", | ||
| "bundlesize": "^0.18.0", | ||
@@ -61,13 +60,14 @@ "codecov": "^3.6.1", | ||
| "enzyme": "^3.10.0", | ||
| "enzyme-adapter-react-16": "^1.14.0", | ||
| "enzyme-adapter-react-16": "^1.15.1", | ||
| "eslint": "^6.5.1", | ||
| "eslint-config-airbnb": "^18.0.1", | ||
| "eslint-config-prettier": "^6.3.0", | ||
| "eslint-config-prettier": "^6.4.0", | ||
| "eslint-plugin-import": "^2.18.2", | ||
| "eslint-plugin-jest": "^22.17.0", | ||
| "eslint-plugin-jest": "^22.19.0", | ||
| "eslint-plugin-jsx-a11y": "^6.2.3", | ||
| "eslint-plugin-react": "^7.15.0", | ||
| "eslint-plugin-react-hooks": "^2.1.1", | ||
| "flow-bin": "^0.108.0", | ||
| "husky": "^3.0.7", | ||
| "eslint-plugin-react": "^7.16.0", | ||
| "eslint-plugin-react-hooks": "^2.1.2", | ||
| "flow-bin": "^0.109.0", | ||
| "flowgen": "^1.10.0", | ||
| "husky": "^3.0.9", | ||
| "jest": "^24.9.0", | ||
@@ -77,11 +77,22 @@ "jest-environment-enzyme": "^7.1.1", | ||
| "jest-junit": "^8.0.0", | ||
| "lint-staged": "^9.4.1", | ||
| "lint-staged": "^9.4.2", | ||
| "make-dir-cli": "^2.0.0", | ||
| "prop-types": "^15.7.2", | ||
| "raf": "^3.4.1", | ||
| "react": "^16.8.4", | ||
| "react-dom": "^16.10.1", | ||
| "react-test-renderer": "^16.10.1", | ||
| "typescript": "^3.6.3" | ||
| } | ||
| "react": "^16.10.2", | ||
| "react-dom": "^16.10.2", | ||
| "react-test-renderer": "^16.10.2", | ||
| "rollup": "^1.23.1", | ||
| "rollup-plugin-terser": "^5.1.2", | ||
| "ts-jest": "^24.1.0", | ||
| "typescript": "^3.6.4" | ||
| }, | ||
| "peerDependencies": { | ||
| "react": "15.x.x || 16.x.x" | ||
| }, | ||
| "bundlesize": [ | ||
| { | ||
| "path": "react-children-utilities.min.js", | ||
| "maxSize": "1 kB" | ||
| } | ||
| ] | ||
| } |
+9
-9
| { | ||
| "compilerOptions": { | ||
| "allowJs": true, | ||
| "declaration": true, | ||
| "declarationMap": true, | ||
| "esModuleInterop": true, | ||
| "experimentalDecorators": true, | ||
| "inlineSources": true, | ||
| "lib": ["es2017", "dom", "dom.iterable"], | ||
| "lib": ["es2019", "dom", "dom.iterable"], | ||
| "module": "ESNext", | ||
| "moduleResolution": "node", | ||
| "noEmit": true, | ||
| "noFallthroughCasesInSwitch": true, | ||
@@ -16,4 +16,4 @@ "noImplicitAny": false, | ||
| "noUnusedParameters": true, | ||
| "outDir": "dist", | ||
| "rootDir": "src", | ||
| "outDir": ".", | ||
| "rootDirs": ["src"], | ||
| "skipLibCheck": true, | ||
@@ -26,9 +26,9 @@ "sourceMap": true, | ||
| }, | ||
| "include": [ | ||
| "src/**/*" | ||
| ], | ||
| "include": ["src/**/*"], | ||
| "exclude": [ | ||
| "src/**/*.flow", | ||
| "node_modules" | ||
| "node_modules", | ||
| "**/__tests__/**/*", | ||
| "**/?(*.)+(spec|test).(js|ts)?(x)" | ||
| ] | ||
| } |
| "use strict";Object.defineProperty(exports,"__esModule",{value:true});exports["default"]=exports.onlyText=exports.deepFind=exports.deepForEach=exports.deepMap=exports.groupByType=exports.deepFilter=exports.filter=exports.hasComplexChildren=exports.hasChildren=void 0;var _react=require("react");function _toConsumableArray(arr){return _arrayWithoutHoles(arr)||_iterableToArray(arr)||_nonIterableSpread()}function _nonIterableSpread(){throw new TypeError("Invalid attempt to spread non-iterable instance")}function _iterableToArray(iter){if(Symbol.iterator in Object(iter)||Object.prototype.toString.call(iter)==="[object Arguments]")return Array.from(iter)}function _arrayWithoutHoles(arr){if(Array.isArray(arr)){for(var i=0,arr2=new Array(arr.length);i<arr.length;i++){arr2[i]=arr[i]}return arr2}}function ownKeys(object,enumerableOnly){var keys=Object.keys(object);if(Object.getOwnPropertySymbols){var symbols=Object.getOwnPropertySymbols(object);if(enumerableOnly)symbols=symbols.filter(function(sym){return Object.getOwnPropertyDescriptor(object,sym).enumerable});keys.push.apply(keys,symbols)}return keys}function _objectSpread(target){for(var i=1;i<arguments.length;i++){var source=arguments[i]!=null?arguments[i]:{};if(i%2){ownKeys(source,true).forEach(function(key){_defineProperty(target,key,source[key])})}else if(Object.getOwnPropertyDescriptors){Object.defineProperties(target,Object.getOwnPropertyDescriptors(source))}else{ownKeys(source).forEach(function(key){Object.defineProperty(target,key,Object.getOwnPropertyDescriptor(source,key))})}}return target}function _defineProperty(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}function _typeof(obj){if(typeof Symbol==="function"&&typeof Symbol.iterator==="symbol"){_typeof=function _typeof(obj){return typeof obj}}else{_typeof=function _typeof(obj){return obj&&typeof Symbol==="function"&&obj.constructor===Symbol&&obj!==Symbol.prototype?"symbol":typeof obj}}return _typeof(obj)}var hasChildren=function hasChildren(child){return Boolean(child&&child.props&&child.props.children)};exports.hasChildren=hasChildren;var hasComplexChildren=function hasComplexChildren(child){return hasChildren(child)&&_typeof(child.props.children)==="object"};exports.hasComplexChildren=hasComplexChildren;var filter=function filter(children,filterFn){return _react.Children.toArray(children).filter(filterFn)};exports.filter=filter;var deepFilter=function deepFilter(children,deepFilterFn){return _react.Children.toArray(children).filter(deepFilterFn).map(function(child){if(hasComplexChildren(child)){return(0,_react.cloneElement)(child,_objectSpread({},child.props,{children:deepFilter(child.props.children,deepFilterFn)}))}return child})};exports.deepFilter=deepFilter;var groupByType=function groupByType(children,types,rest){return _react.Children.toArray(children).reduce(function(group,child){var isGrouped=types.includes(child.type);var addChild=isGrouped?child.props.children:child;var key=isGrouped?child.type:rest;return _objectSpread({},group,_defineProperty({},key,[].concat(_toConsumableArray(group[key]||[]),[addChild])))},{})};exports.groupByType=groupByType;var deepMap=function deepMap(children,deepMapFn){return _react.Children.map(children,function(child){if(hasComplexChildren(child)){return deepMapFn((0,_react.cloneElement)(child,_objectSpread({},child.props,{children:deepMap(child.props.children,deepMapFn)})))}return deepMapFn(child)})};exports.deepMap=deepMap;var deepForEach=function deepForEach(children,deepForEachFn){_react.Children.forEach(children,function(child){if(hasComplexChildren(child)){deepForEach(child.props.children,deepForEachFn)}deepForEachFn(child)})};exports.deepForEach=deepForEach;var deepFind=function deepFind(children,deepFindFn){var found;_react.Children.toArray(children).find(function(child){if(hasComplexChildren(child)){found=deepFind(child.props.children,deepFindFn);return typeof found!=="undefined"}if(deepFindFn(child)){found=child;return true}return false});return found};exports.deepFind=deepFind;var onlyText=function onlyText(children){return _react.Children.toArray(children).reduce(function(flattened,child){return[].concat(_toConsumableArray(flattened),[hasChildren(child)?onlyText(child.props.children):child])},[]).join("")};exports.onlyText=onlyText;var _default=_objectSpread({},_react.Children,{filter:filter,deepFilter:deepFilter,groupByType:groupByType,deepMap:deepMap,deepForEach:deepForEach,deepFind:deepFind,onlyText:onlyText,hasChildren:hasChildren,hasComplexChildren:hasComplexChildren});exports["default"]=_default; | ||
| //# sourceMappingURL=index.js.map |
| {"version":3,"sources":["../src/index.js"],"names":[],"mappings":"2QAAA,4B,2tDAEO,GAAM,CAAA,WAAW,CAAG,QAAd,CAAA,WAAc,CAAC,KAAD,QAAW,CAAA,OAAO,CAAC,KAAK,EAAI,KAAK,CAAC,KAAf,EAAwB,KAAK,CAAC,KAAN,CAAY,QAArC,CAAlB,CAApB,C,gCAEA,GAAM,CAAA,kBAAkB,CAAG,QAArB,CAAA,kBAAqB,CAAC,KAAD,QAChC,CAAA,WAAW,CAAC,KAAD,CAAX,EAAsB,QAAO,KAAK,CAAC,KAAN,CAAY,QAAnB,IAAgC,QADtB,CAA3B,C,8CAGA,GAAM,CAAA,MAAM,CAAG,QAAT,CAAA,MAAS,CAAC,QAAD,CAAW,QAAX,CAAwB,CAC5C,MAAO,iBAAS,OAAT,CAAiB,QAAjB,EAA2B,MAA3B,CAAkC,QAAlC,CACR,CAFM,C,sBAIA,GAAM,CAAA,UAAU,CAAG,QAAb,CAAA,UAAa,CAAC,QAAD,CAAW,YAAX,CAA4B,CACpD,MAAO,iBAAS,OAAT,CAAiB,QAAjB,EACJ,MADI,CACG,YADH,EAEJ,GAFI,CAEA,SAAC,KAAD,CAAW,CACd,GAAI,kBAAkB,CAAC,KAAD,CAAtB,CAA+B,CAE7B,MAAO,wBAAa,KAAb,kBACF,KAAK,CAAC,KADJ,EAEL,QAAQ,CAAE,UAAU,CAAC,KAAK,CAAC,KAAN,CAAY,QAAb,CAAuB,YAAvB,CAFf,GAIR,CACD,MAAO,CAAA,KACR,CAXI,CAYR,CAbM,C,8BAeA,GAAM,CAAA,WAAW,CAAG,QAAd,CAAA,WAAc,CAAC,QAAD,CAAW,KAAX,CAAkB,IAAlB,CAA2B,CACpD,MAAO,iBAAS,OAAT,CAAiB,QAAjB,EAA2B,MAA3B,CAAkC,SAAC,KAAD,CAAQ,KAAR,CAAkB,CACzD,GAAM,CAAA,SAAS,CAAG,KAAK,CAAC,QAAN,CAAe,KAAK,CAAC,IAArB,CAAlB,CACA,GAAM,CAAA,QAAQ,CAAG,SAAS,CAAG,KAAK,CAAC,KAAN,CAAY,QAAf,CAA0B,KAApD,CACA,GAAM,CAAA,GAAG,CAAG,SAAS,CAAG,KAAK,CAAC,IAAT,CAAgB,IAArC,CAEA,wBACK,KADL,oBAEG,GAFH,8BAEc,KAAK,CAAC,GAAD,CAAL,EAAc,EAF5B,GAEiC,QAFjC,IAID,CATM,CASJ,EATI,CAUR,CAXM,C,gCAaA,GAAM,CAAA,OAAO,CAAG,QAAV,CAAA,OAAU,CAAC,QAAD,CAAW,SAAX,CAAyB,CAC9C,MAAO,iBAAS,GAAT,CAAa,QAAb,CAAuB,SAAC,KAAD,CAAW,CACvC,GAAI,kBAAkB,CAAC,KAAD,CAAtB,CAA+B,CAE7B,MAAO,CAAA,SAAS,CACd,wBAAa,KAAb,kBACK,KAAK,CAAC,KADX,EAEE,QAAQ,CAAE,OAAO,CAAC,KAAK,CAAC,KAAN,CAAY,QAAb,CAAuB,SAAvB,CAFnB,GADc,CAMjB,CACD,MAAO,CAAA,SAAS,CAAC,KAAD,CACjB,CAXM,CAYR,CAbM,C,wBAeA,GAAM,CAAA,WAAW,CAAG,QAAd,CAAA,WAAc,CAAC,QAAD,CAAW,aAAX,CAA6B,CACtD,gBAAS,OAAT,CAAiB,QAAjB,CAA2B,SAAC,KAAD,CAAW,CACpC,GAAI,kBAAkB,CAAC,KAAD,CAAtB,CAA+B,CAE7B,WAAW,CAAC,KAAK,CAAC,KAAN,CAAY,QAAb,CAAuB,aAAvB,CACZ,CACD,aAAa,CAAC,KAAD,CACd,CAND,CAOD,CARM,C,gCAUA,GAAM,CAAA,QAAQ,CAAG,QAAX,CAAA,QAAW,CAAC,QAAD,CAAW,UAAX,CAA0B,CAChD,GAAI,CAAA,KAAJ,CACA,gBAAS,OAAT,CAAiB,QAAjB,EAA2B,IAA3B,CAAgC,SAAC,KAAD,CAAW,CACzC,GAAI,kBAAkB,CAAC,KAAD,CAAtB,CAA+B,CAE7B,KAAK,CAAG,QAAQ,CAAC,KAAK,CAAC,KAAN,CAAY,QAAb,CAAuB,UAAvB,CAAhB,CACA,MAAO,OAAQ,CAAA,KAAR,GAAmB,WAC3B,CACD,GAAI,UAAU,CAAC,KAAD,CAAd,CAAuB,CACrB,KAAK,CAAG,KAAR,CACA,MAAO,KACR,CACD,MAAO,MACR,CAXD,EAYA,MAAO,CAAA,KACR,CAfM,C,0BAiBA,GAAM,CAAA,QAAQ,CAAG,QAAX,CAAA,QAAW,CAAC,QAAD,CAAc,CACpC,MAAO,iBAAS,OAAT,CAAiB,QAAjB,EACJ,MADI,CAEH,SAAC,SAAD,CAAY,KAAZ,qCACK,SADL,GAEE,WAAW,CAAC,KAAD,CAAX,CAAqB,QAAQ,CAAC,KAAK,CAAC,KAAN,CAAY,QAAb,CAA7B,CAAsD,KAFxD,GAFG,CAMH,EANG,EAQJ,IARI,CAQC,EARD,CASR,CAVM,C,wDAaF,e,EACH,MAAM,CAAN,M,CACA,UAAU,CAAV,U,CACA,WAAW,CAAX,W,CACA,OAAO,CAAP,O,CACA,WAAW,CAAX,W,CACA,QAAQ,CAAR,Q,CACA,QAAQ,CAAR,Q,CACA,WAAW,CAAX,W,CACA,kBAAkB,CAAlB,kB","file":"index.js","sourcesContent":["import { Children, cloneElement } from 'react';\n\nexport const hasChildren = (child) => Boolean(child && child.props && child.props.children);\n\nexport const hasComplexChildren = (child) =>\n hasChildren(child) && typeof child.props.children === 'object';\n\nexport const filter = (children, filterFn) => {\n return Children.toArray(children).filter(filterFn);\n};\n\nexport const deepFilter = (children, deepFilterFn) => {\n return Children.toArray(children)\n .filter(deepFilterFn)\n .map((child) => {\n if (hasComplexChildren(child)) {\n // Clone the child that has children and filter them too\n return cloneElement(child, {\n ...child.props,\n children: deepFilter(child.props.children, deepFilterFn),\n });\n }\n return child;\n });\n};\n\nexport const groupByType = (children, types, rest) => {\n return Children.toArray(children).reduce((group, child) => {\n const isGrouped = types.includes(child.type);\n const addChild = isGrouped ? child.props.children : child;\n const key = isGrouped ? child.type : rest;\n\n return {\n ...group,\n [key]: [...(group[key] || []), addChild],\n };\n }, {});\n};\n\nexport const deepMap = (children, deepMapFn) => {\n return Children.map(children, (child) => {\n if (hasComplexChildren(child)) {\n // Clone the child that has children and map them too\n return deepMapFn(\n cloneElement(child, {\n ...child.props,\n children: deepMap(child.props.children, deepMapFn),\n }),\n );\n }\n return deepMapFn(child);\n });\n};\n\nexport const deepForEach = (children, deepForEachFn) => {\n Children.forEach(children, (child) => {\n if (hasComplexChildren(child)) {\n // Each inside the child that has children\n deepForEach(child.props.children, deepForEachFn);\n }\n deepForEachFn(child);\n });\n};\n\nexport const deepFind = (children, deepFindFn) => {\n let found;\n Children.toArray(children).find((child) => {\n if (hasComplexChildren(child)) {\n // Find inside the child that has children\n found = deepFind(child.props.children, deepFindFn);\n return typeof (found) !== 'undefined';\n }\n if (deepFindFn(child)) {\n found = child;\n return true;\n }\n return false;\n });\n return found;\n};\n\nexport const onlyText = (children) => {\n return Children.toArray(children)\n .reduce(\n (flattened, child) => [\n ...flattened,\n hasChildren(child) ? onlyText(child.props.children) : child,\n ],\n [],\n )\n .join('');\n};\n\nexport default {\n ...Children,\n filter,\n deepFilter,\n groupByType,\n deepMap,\n deepForEach,\n deepFind,\n onlyText,\n hasChildren,\n hasComplexChildren,\n};\n"]} |
| // flow-typed signature: f5997c5ee181aaeba6fc2d2a2158feb3 | ||
| // flow-typed version: cefb07e7f4/jest_v24.x.x/flow_>=v0.39.x | ||
| type JestMockFn<TArguments: $ReadOnlyArray<*>, TReturn> = { | ||
| (...args: TArguments): TReturn, | ||
| /** | ||
| * An object for introspecting mock calls | ||
| */ | ||
| mock: { | ||
| /** | ||
| * An array that represents all calls that have been made into this mock | ||
| * function. Each call is represented by an array of arguments that were | ||
| * passed during the call. | ||
| */ | ||
| calls: Array<TArguments>, | ||
| /** | ||
| * An array that contains all the object instances that have been | ||
| * instantiated from this mock function. | ||
| */ | ||
| instances: Array<TReturn>, | ||
| /** | ||
| * An array that contains all the object results that have been | ||
| * returned by this mock function call | ||
| */ | ||
| results: Array<{ isThrow: boolean, value: TReturn }>, | ||
| }, | ||
| /** | ||
| * Resets all information stored in the mockFn.mock.calls and | ||
| * mockFn.mock.instances arrays. Often this is useful when you want to clean | ||
| * up a mock's usage data between two assertions. | ||
| */ | ||
| mockClear(): void, | ||
| /** | ||
| * Resets all information stored in the mock. This is useful when you want to | ||
| * completely restore a mock back to its initial state. | ||
| */ | ||
| mockReset(): void, | ||
| /** | ||
| * Removes the mock and restores the initial implementation. This is useful | ||
| * when you want to mock functions in certain test cases and restore the | ||
| * original implementation in others. Beware that mockFn.mockRestore only | ||
| * works when mock was created with jest.spyOn. Thus you have to take care of | ||
| * restoration yourself when manually assigning jest.fn(). | ||
| */ | ||
| mockRestore(): void, | ||
| /** | ||
| * Accepts a function that should be used as the implementation of the mock. | ||
| * The mock itself will still record all calls that go into and instances | ||
| * that come from itself -- the only difference is that the implementation | ||
| * will also be executed when the mock is called. | ||
| */ | ||
| mockImplementation( | ||
| fn: (...args: TArguments) => TReturn | ||
| ): JestMockFn<TArguments, TReturn>, | ||
| /** | ||
| * Accepts a function that will be used as an implementation of the mock for | ||
| * one call to the mocked function. Can be chained so that multiple function | ||
| * calls produce different results. | ||
| */ | ||
| mockImplementationOnce( | ||
| fn: (...args: TArguments) => TReturn | ||
| ): JestMockFn<TArguments, TReturn>, | ||
| /** | ||
| * Accepts a string to use in test result output in place of "jest.fn()" to | ||
| * indicate which mock function is being referenced. | ||
| */ | ||
| mockName(name: string): JestMockFn<TArguments, TReturn>, | ||
| /** | ||
| * Just a simple sugar function for returning `this` | ||
| */ | ||
| mockReturnThis(): void, | ||
| /** | ||
| * Accepts a value that will be returned whenever the mock function is called. | ||
| */ | ||
| mockReturnValue(value: TReturn): JestMockFn<TArguments, TReturn>, | ||
| /** | ||
| * Sugar for only returning a value once inside your mock | ||
| */ | ||
| mockReturnValueOnce(value: TReturn): JestMockFn<TArguments, TReturn>, | ||
| /** | ||
| * Sugar for jest.fn().mockImplementation(() => Promise.resolve(value)) | ||
| */ | ||
| mockResolvedValue(value: TReturn): JestMockFn<TArguments, Promise<TReturn>>, | ||
| /** | ||
| * Sugar for jest.fn().mockImplementationOnce(() => Promise.resolve(value)) | ||
| */ | ||
| mockResolvedValueOnce( | ||
| value: TReturn | ||
| ): JestMockFn<TArguments, Promise<TReturn>>, | ||
| /** | ||
| * Sugar for jest.fn().mockImplementation(() => Promise.reject(value)) | ||
| */ | ||
| mockRejectedValue(value: TReturn): JestMockFn<TArguments, Promise<any>>, | ||
| /** | ||
| * Sugar for jest.fn().mockImplementationOnce(() => Promise.reject(value)) | ||
| */ | ||
| mockRejectedValueOnce(value: TReturn): JestMockFn<TArguments, Promise<any>>, | ||
| }; | ||
| type JestAsymmetricEqualityType = { | ||
| /** | ||
| * A custom Jasmine equality tester | ||
| */ | ||
| asymmetricMatch(value: mixed): boolean, | ||
| }; | ||
| type JestCallsType = { | ||
| allArgs(): mixed, | ||
| all(): mixed, | ||
| any(): boolean, | ||
| count(): number, | ||
| first(): mixed, | ||
| mostRecent(): mixed, | ||
| reset(): void, | ||
| }; | ||
| type JestClockType = { | ||
| install(): void, | ||
| mockDate(date: Date): void, | ||
| tick(milliseconds?: number): void, | ||
| uninstall(): void, | ||
| }; | ||
| type JestMatcherResult = { | ||
| message?: string | (() => string), | ||
| pass: boolean, | ||
| }; | ||
| type JestMatcher = ( | ||
| received: any, | ||
| ...actual: Array<any> | ||
| ) => JestMatcherResult | Promise<JestMatcherResult>; | ||
| type JestPromiseType = { | ||
| /** | ||
| * Use rejects to unwrap the reason of a rejected promise so any other | ||
| * matcher can be chained. If the promise is fulfilled the assertion fails. | ||
| */ | ||
| rejects: JestExpectType, | ||
| /** | ||
| * Use resolves to unwrap the value of a fulfilled promise so any other | ||
| * matcher can be chained. If the promise is rejected the assertion fails. | ||
| */ | ||
| resolves: JestExpectType, | ||
| }; | ||
| /** | ||
| * Jest allows functions and classes to be used as test names in test() and | ||
| * describe() | ||
| */ | ||
| type JestTestName = string | Function; | ||
| /** | ||
| * Plugin: jest-styled-components | ||
| */ | ||
| type JestStyledComponentsMatcherValue = | ||
| | string | ||
| | JestAsymmetricEqualityType | ||
| | RegExp | ||
| | typeof undefined; | ||
| type JestStyledComponentsMatcherOptions = { | ||
| media?: string, | ||
| modifier?: string, | ||
| supports?: string, | ||
| }; | ||
| type JestStyledComponentsMatchersType = { | ||
| toHaveStyleRule( | ||
| property: string, | ||
| value: JestStyledComponentsMatcherValue, | ||
| options?: JestStyledComponentsMatcherOptions | ||
| ): void, | ||
| }; | ||
| /** | ||
| * Plugin: jest-enzyme | ||
| */ | ||
| type EnzymeMatchersType = { | ||
| // 5.x | ||
| toBeEmpty(): void, | ||
| toBePresent(): void, | ||
| // 6.x | ||
| toBeChecked(): void, | ||
| toBeDisabled(): void, | ||
| toBeEmptyRender(): void, | ||
| toContainMatchingElement(selector: string): void, | ||
| toContainMatchingElements(n: number, selector: string): void, | ||
| toContainExactlyOneMatchingElement(selector: string): void, | ||
| toContainReact(element: React$Element<any>): void, | ||
| toExist(): void, | ||
| toHaveClassName(className: string): void, | ||
| toHaveHTML(html: string): void, | ||
| toHaveProp: ((propKey: string, propValue?: any) => void) & | ||
| ((props: {}) => void), | ||
| toHaveRef(refName: string): void, | ||
| toHaveState: ((stateKey: string, stateValue?: any) => void) & | ||
| ((state: {}) => void), | ||
| toHaveStyle: ((styleKey: string, styleValue?: any) => void) & | ||
| ((style: {}) => void), | ||
| toHaveTagName(tagName: string): void, | ||
| toHaveText(text: string): void, | ||
| toHaveValue(value: any): void, | ||
| toIncludeText(text: string): void, | ||
| toMatchElement( | ||
| element: React$Element<any>, | ||
| options?: {| ignoreProps?: boolean, verbose?: boolean |} | ||
| ): void, | ||
| toMatchSelector(selector: string): void, | ||
| // 7.x | ||
| toHaveDisplayName(name: string): void, | ||
| }; | ||
| // DOM testing library extensions https://github.com/kentcdodds/dom-testing-library#custom-jest-matchers | ||
| type DomTestingLibraryType = { | ||
| toBeDisabled(): void, | ||
| toBeEnabled(): void, | ||
| toBeEmpty(): void, | ||
| toBeInTheDocument(): void, | ||
| toBeVisible(): void, | ||
| toContainElement(element: HTMLElement | null): void, | ||
| toContainHTML(htmlText: string): void, | ||
| toHaveAttribute(name: string, expectedValue?: string): void, | ||
| toHaveClass(...classNames: string[]): void, | ||
| toHaveFocus(): void, | ||
| toHaveFormValues(expectedValues: { [name: string]: any }): void, | ||
| toHaveStyle(css: string): void, | ||
| toHaveTextContent( | ||
| content: string | RegExp, | ||
| options?: { normalizeWhitespace: boolean } | ||
| ): void, | ||
| toBeInTheDOM(): void, | ||
| }; | ||
| // Jest JQuery Matchers: https://github.com/unindented/custom-jquery-matchers | ||
| type JestJQueryMatchersType = { | ||
| toExist(): void, | ||
| toHaveLength(len: number): void, | ||
| toHaveId(id: string): void, | ||
| toHaveClass(className: string): void, | ||
| toHaveTag(tag: string): void, | ||
| toHaveAttr(key: string, val?: any): void, | ||
| toHaveProp(key: string, val?: any): void, | ||
| toHaveText(text: string | RegExp): void, | ||
| toHaveData(key: string, val?: any): void, | ||
| toHaveValue(val: any): void, | ||
| toHaveCss(css: { [key: string]: any }): void, | ||
| toBeChecked(): void, | ||
| toBeDisabled(): void, | ||
| toBeEmpty(): void, | ||
| toBeHidden(): void, | ||
| toBeSelected(): void, | ||
| toBeVisible(): void, | ||
| toBeFocused(): void, | ||
| toBeInDom(): void, | ||
| toBeMatchedBy(sel: string): void, | ||
| toHaveDescendant(sel: string): void, | ||
| toHaveDescendantWithText(sel: string, text: string | RegExp): void, | ||
| }; | ||
| // Jest Extended Matchers: https://github.com/jest-community/jest-extended | ||
| type JestExtendedMatchersType = { | ||
| /** | ||
| * Note: Currently unimplemented | ||
| * Passing assertion | ||
| * | ||
| * @param {String} message | ||
| */ | ||
| // pass(message: string): void; | ||
| /** | ||
| * Note: Currently unimplemented | ||
| * Failing assertion | ||
| * | ||
| * @param {String} message | ||
| */ | ||
| // fail(message: string): void; | ||
| /** | ||
| * Use .toBeEmpty when checking if a String '', Array [] or Object {} is empty. | ||
| */ | ||
| toBeEmpty(): void, | ||
| /** | ||
| * Use .toBeOneOf when checking if a value is a member of a given Array. | ||
| * @param {Array.<*>} members | ||
| */ | ||
| toBeOneOf(members: any[]): void, | ||
| /** | ||
| * Use `.toBeNil` when checking a value is `null` or `undefined`. | ||
| */ | ||
| toBeNil(): void, | ||
| /** | ||
| * Use `.toSatisfy` when you want to use a custom matcher by supplying a predicate function that returns a `Boolean`. | ||
| * @param {Function} predicate | ||
| */ | ||
| toSatisfy(predicate: (n: any) => boolean): void, | ||
| /** | ||
| * Use `.toBeArray` when checking if a value is an `Array`. | ||
| */ | ||
| toBeArray(): void, | ||
| /** | ||
| * Use `.toBeArrayOfSize` when checking if a value is an `Array` of size x. | ||
| * @param {Number} x | ||
| */ | ||
| toBeArrayOfSize(x: number): void, | ||
| /** | ||
| * Use `.toIncludeAllMembers` when checking if an `Array` contains all of the same members of a given set. | ||
| * @param {Array.<*>} members | ||
| */ | ||
| toIncludeAllMembers(members: any[]): void, | ||
| /** | ||
| * Use `.toIncludeAnyMembers` when checking if an `Array` contains any of the members of a given set. | ||
| * @param {Array.<*>} members | ||
| */ | ||
| toIncludeAnyMembers(members: any[]): void, | ||
| /** | ||
| * Use `.toSatisfyAll` when you want to use a custom matcher by supplying a predicate function that returns a `Boolean` for all values in an array. | ||
| * @param {Function} predicate | ||
| */ | ||
| toSatisfyAll(predicate: (n: any) => boolean): void, | ||
| /** | ||
| * Use `.toBeBoolean` when checking if a value is a `Boolean`. | ||
| */ | ||
| toBeBoolean(): void, | ||
| /** | ||
| * Use `.toBeTrue` when checking a value is equal (===) to `true`. | ||
| */ | ||
| toBeTrue(): void, | ||
| /** | ||
| * Use `.toBeFalse` when checking a value is equal (===) to `false`. | ||
| */ | ||
| toBeFalse(): void, | ||
| /** | ||
| * Use .toBeDate when checking if a value is a Date. | ||
| */ | ||
| toBeDate(): void, | ||
| /** | ||
| * Use `.toBeFunction` when checking if a value is a `Function`. | ||
| */ | ||
| toBeFunction(): void, | ||
| /** | ||
| * Use `.toHaveBeenCalledBefore` when checking if a `Mock` was called before another `Mock`. | ||
| * | ||
| * Note: Required Jest version >22 | ||
| * Note: Your mock functions will have to be asynchronous to cause the timestamps inside of Jest to occur in a differentJS event loop, otherwise the mock timestamps will all be the same | ||
| * | ||
| * @param {Mock} mock | ||
| */ | ||
| toHaveBeenCalledBefore(mock: JestMockFn<any, any>): void, | ||
| /** | ||
| * Use `.toBeNumber` when checking if a value is a `Number`. | ||
| */ | ||
| toBeNumber(): void, | ||
| /** | ||
| * Use `.toBeNaN` when checking a value is `NaN`. | ||
| */ | ||
| toBeNaN(): void, | ||
| /** | ||
| * Use `.toBeFinite` when checking if a value is a `Number`, not `NaN` or `Infinity`. | ||
| */ | ||
| toBeFinite(): void, | ||
| /** | ||
| * Use `.toBePositive` when checking if a value is a positive `Number`. | ||
| */ | ||
| toBePositive(): void, | ||
| /** | ||
| * Use `.toBeNegative` when checking if a value is a negative `Number`. | ||
| */ | ||
| toBeNegative(): void, | ||
| /** | ||
| * Use `.toBeEven` when checking if a value is an even `Number`. | ||
| */ | ||
| toBeEven(): void, | ||
| /** | ||
| * Use `.toBeOdd` when checking if a value is an odd `Number`. | ||
| */ | ||
| toBeOdd(): void, | ||
| /** | ||
| * Use `.toBeWithin` when checking if a number is in between the given bounds of: start (inclusive) and end (exclusive). | ||
| * | ||
| * @param {Number} start | ||
| * @param {Number} end | ||
| */ | ||
| toBeWithin(start: number, end: number): void, | ||
| /** | ||
| * Use `.toBeObject` when checking if a value is an `Object`. | ||
| */ | ||
| toBeObject(): void, | ||
| /** | ||
| * Use `.toContainKey` when checking if an object contains the provided key. | ||
| * | ||
| * @param {String} key | ||
| */ | ||
| toContainKey(key: string): void, | ||
| /** | ||
| * Use `.toContainKeys` when checking if an object has all of the provided keys. | ||
| * | ||
| * @param {Array.<String>} keys | ||
| */ | ||
| toContainKeys(keys: string[]): void, | ||
| /** | ||
| * Use `.toContainAllKeys` when checking if an object only contains all of the provided keys. | ||
| * | ||
| * @param {Array.<String>} keys | ||
| */ | ||
| toContainAllKeys(keys: string[]): void, | ||
| /** | ||
| * Use `.toContainAnyKeys` when checking if an object contains at least one of the provided keys. | ||
| * | ||
| * @param {Array.<String>} keys | ||
| */ | ||
| toContainAnyKeys(keys: string[]): void, | ||
| /** | ||
| * Use `.toContainValue` when checking if an object contains the provided value. | ||
| * | ||
| * @param {*} value | ||
| */ | ||
| toContainValue(value: any): void, | ||
| /** | ||
| * Use `.toContainValues` when checking if an object contains all of the provided values. | ||
| * | ||
| * @param {Array.<*>} values | ||
| */ | ||
| toContainValues(values: any[]): void, | ||
| /** | ||
| * Use `.toContainAllValues` when checking if an object only contains all of the provided values. | ||
| * | ||
| * @param {Array.<*>} values | ||
| */ | ||
| toContainAllValues(values: any[]): void, | ||
| /** | ||
| * Use `.toContainAnyValues` when checking if an object contains at least one of the provided values. | ||
| * | ||
| * @param {Array.<*>} values | ||
| */ | ||
| toContainAnyValues(values: any[]): void, | ||
| /** | ||
| * Use `.toContainEntry` when checking if an object contains the provided entry. | ||
| * | ||
| * @param {Array.<String, String>} entry | ||
| */ | ||
| toContainEntry(entry: [string, string]): void, | ||
| /** | ||
| * Use `.toContainEntries` when checking if an object contains all of the provided entries. | ||
| * | ||
| * @param {Array.<Array.<String, String>>} entries | ||
| */ | ||
| toContainEntries(entries: [string, string][]): void, | ||
| /** | ||
| * Use `.toContainAllEntries` when checking if an object only contains all of the provided entries. | ||
| * | ||
| * @param {Array.<Array.<String, String>>} entries | ||
| */ | ||
| toContainAllEntries(entries: [string, string][]): void, | ||
| /** | ||
| * Use `.toContainAnyEntries` when checking if an object contains at least one of the provided entries. | ||
| * | ||
| * @param {Array.<Array.<String, String>>} entries | ||
| */ | ||
| toContainAnyEntries(entries: [string, string][]): void, | ||
| /** | ||
| * Use `.toBeExtensible` when checking if an object is extensible. | ||
| */ | ||
| toBeExtensible(): void, | ||
| /** | ||
| * Use `.toBeFrozen` when checking if an object is frozen. | ||
| */ | ||
| toBeFrozen(): void, | ||
| /** | ||
| * Use `.toBeSealed` when checking if an object is sealed. | ||
| */ | ||
| toBeSealed(): void, | ||
| /** | ||
| * Use `.toBeString` when checking if a value is a `String`. | ||
| */ | ||
| toBeString(): void, | ||
| /** | ||
| * Use `.toEqualCaseInsensitive` when checking if a string is equal (===) to another ignoring the casing of both strings. | ||
| * | ||
| * @param {String} string | ||
| */ | ||
| toEqualCaseInsensitive(string: string): void, | ||
| /** | ||
| * Use `.toStartWith` when checking if a `String` starts with a given `String` prefix. | ||
| * | ||
| * @param {String} prefix | ||
| */ | ||
| toStartWith(prefix: string): void, | ||
| /** | ||
| * Use `.toEndWith` when checking if a `String` ends with a given `String` suffix. | ||
| * | ||
| * @param {String} suffix | ||
| */ | ||
| toEndWith(suffix: string): void, | ||
| /** | ||
| * Use `.toInclude` when checking if a `String` includes the given `String` substring. | ||
| * | ||
| * @param {String} substring | ||
| */ | ||
| toInclude(substring: string): void, | ||
| /** | ||
| * Use `.toIncludeRepeated` when checking if a `String` includes the given `String` substring the correct number of times. | ||
| * | ||
| * @param {String} substring | ||
| * @param {Number} times | ||
| */ | ||
| toIncludeRepeated(substring: string, times: number): void, | ||
| /** | ||
| * Use `.toIncludeMultiple` when checking if a `String` includes all of the given substrings. | ||
| * | ||
| * @param {Array.<String>} substring | ||
| */ | ||
| toIncludeMultiple(substring: string[]): void, | ||
| }; | ||
| interface JestExpectType { | ||
| not: JestExpectType & | ||
| EnzymeMatchersType & | ||
| DomTestingLibraryType & | ||
| JestJQueryMatchersType & | ||
| JestStyledComponentsMatchersType & | ||
| JestExtendedMatchersType; | ||
| /** | ||
| * If you have a mock function, you can use .lastCalledWith to test what | ||
| * arguments it was last called with. | ||
| */ | ||
| lastCalledWith(...args: Array<any>): void; | ||
| /** | ||
| * toBe just checks that a value is what you expect. It uses === to check | ||
| * strict equality. | ||
| */ | ||
| toBe(value: any): void; | ||
| /** | ||
| * Use .toBeCalledWith to ensure that a mock function was called with | ||
| * specific arguments. | ||
| */ | ||
| toBeCalledWith(...args: Array<any>): void; | ||
| /** | ||
| * Using exact equality with floating point numbers is a bad idea. Rounding | ||
| * means that intuitive things fail. | ||
| */ | ||
| toBeCloseTo(num: number, delta: any): void; | ||
| /** | ||
| * Use .toBeDefined to check that a variable is not undefined. | ||
| */ | ||
| toBeDefined(): void; | ||
| /** | ||
| * Use .toBeFalsy when you don't care what a value is, you just want to | ||
| * ensure a value is false in a boolean context. | ||
| */ | ||
| toBeFalsy(): void; | ||
| /** | ||
| * To compare floating point numbers, you can use toBeGreaterThan. | ||
| */ | ||
| toBeGreaterThan(number: number): void; | ||
| /** | ||
| * To compare floating point numbers, you can use toBeGreaterThanOrEqual. | ||
| */ | ||
| toBeGreaterThanOrEqual(number: number): void; | ||
| /** | ||
| * To compare floating point numbers, you can use toBeLessThan. | ||
| */ | ||
| toBeLessThan(number: number): void; | ||
| /** | ||
| * To compare floating point numbers, you can use toBeLessThanOrEqual. | ||
| */ | ||
| toBeLessThanOrEqual(number: number): void; | ||
| /** | ||
| * Use .toBeInstanceOf(Class) to check that an object is an instance of a | ||
| * class. | ||
| */ | ||
| toBeInstanceOf(cls: Class<*>): void; | ||
| /** | ||
| * .toBeNull() is the same as .toBe(null) but the error messages are a bit | ||
| * nicer. | ||
| */ | ||
| toBeNull(): void; | ||
| /** | ||
| * Use .toBeTruthy when you don't care what a value is, you just want to | ||
| * ensure a value is true in a boolean context. | ||
| */ | ||
| toBeTruthy(): void; | ||
| /** | ||
| * Use .toBeUndefined to check that a variable is undefined. | ||
| */ | ||
| toBeUndefined(): void; | ||
| /** | ||
| * Use .toContain when you want to check that an item is in a list. For | ||
| * testing the items in the list, this uses ===, a strict equality check. | ||
| */ | ||
| toContain(item: any): void; | ||
| /** | ||
| * Use .toContainEqual when you want to check that an item is in a list. For | ||
| * testing the items in the list, this matcher recursively checks the | ||
| * equality of all fields, rather than checking for object identity. | ||
| */ | ||
| toContainEqual(item: any): void; | ||
| /** | ||
| * Use .toEqual when you want to check that two objects have the same value. | ||
| * This matcher recursively checks the equality of all fields, rather than | ||
| * checking for object identity. | ||
| */ | ||
| toEqual(value: any): void; | ||
| /** | ||
| * Use .toHaveBeenCalled to ensure that a mock function got called. | ||
| */ | ||
| toHaveBeenCalled(): void; | ||
| toBeCalled(): void; | ||
| /** | ||
| * Use .toHaveBeenCalledTimes to ensure that a mock function got called exact | ||
| * number of times. | ||
| */ | ||
| toHaveBeenCalledTimes(number: number): void; | ||
| toBeCalledTimes(number: number): void; | ||
| /** | ||
| * | ||
| */ | ||
| toHaveBeenNthCalledWith(nthCall: number, ...args: Array<any>): void; | ||
| nthCalledWith(nthCall: number, ...args: Array<any>): void; | ||
| /** | ||
| * | ||
| */ | ||
| toHaveReturned(): void; | ||
| toReturn(): void; | ||
| /** | ||
| * | ||
| */ | ||
| toHaveReturnedTimes(number: number): void; | ||
| toReturnTimes(number: number): void; | ||
| /** | ||
| * | ||
| */ | ||
| toHaveReturnedWith(value: any): void; | ||
| toReturnWith(value: any): void; | ||
| /** | ||
| * | ||
| */ | ||
| toHaveLastReturnedWith(value: any): void; | ||
| lastReturnedWith(value: any): void; | ||
| /** | ||
| * | ||
| */ | ||
| toHaveNthReturnedWith(nthCall: number, value: any): void; | ||
| nthReturnedWith(nthCall: number, value: any): void; | ||
| /** | ||
| * Use .toHaveBeenCalledWith to ensure that a mock function was called with | ||
| * specific arguments. | ||
| */ | ||
| toHaveBeenCalledWith(...args: Array<any>): void; | ||
| toBeCalledWith(...args: Array<any>): void; | ||
| /** | ||
| * Use .toHaveBeenLastCalledWith to ensure that a mock function was last called | ||
| * with specific arguments. | ||
| */ | ||
| toHaveBeenLastCalledWith(...args: Array<any>): void; | ||
| lastCalledWith(...args: Array<any>): void; | ||
| /** | ||
| * Check that an object has a .length property and it is set to a certain | ||
| * numeric value. | ||
| */ | ||
| toHaveLength(number: number): void; | ||
| /** | ||
| * | ||
| */ | ||
| toHaveProperty(propPath: string, value?: any): void; | ||
| /** | ||
| * Use .toMatch to check that a string matches a regular expression or string. | ||
| */ | ||
| toMatch(regexpOrString: RegExp | string): void; | ||
| /** | ||
| * Use .toMatchObject to check that a javascript object matches a subset of the properties of an object. | ||
| */ | ||
| toMatchObject(object: Object | Array<Object>): void; | ||
| /** | ||
| * Use .toStrictEqual to check that a javascript object matches a subset of the properties of an object. | ||
| */ | ||
| toStrictEqual(value: any): void; | ||
| /** | ||
| * This ensures that an Object matches the most recent snapshot. | ||
| */ | ||
| toMatchSnapshot(propertyMatchers?: any, name?: string): void; | ||
| /** | ||
| * This ensures that an Object matches the most recent snapshot. | ||
| */ | ||
| toMatchSnapshot(name: string): void; | ||
| toMatchInlineSnapshot(snapshot?: string): void; | ||
| toMatchInlineSnapshot(propertyMatchers?: any, snapshot?: string): void; | ||
| /** | ||
| * Use .toThrow to test that a function throws when it is called. | ||
| * If you want to test that a specific error gets thrown, you can provide an | ||
| * argument to toThrow. The argument can be a string for the error message, | ||
| * a class for the error, or a regex that should match the error. | ||
| * | ||
| * Alias: .toThrowError | ||
| */ | ||
| toThrow(message?: string | Error | Class<Error> | RegExp): void; | ||
| toThrowError(message?: string | Error | Class<Error> | RegExp): void; | ||
| /** | ||
| * Use .toThrowErrorMatchingSnapshot to test that a function throws a error | ||
| * matching the most recent snapshot when it is called. | ||
| */ | ||
| toThrowErrorMatchingSnapshot(): void; | ||
| toThrowErrorMatchingInlineSnapshot(snapshot?: string): void; | ||
| } | ||
| type JestObjectType = { | ||
| /** | ||
| * Disables automatic mocking in the module loader. | ||
| * | ||
| * After this method is called, all `require()`s will return the real | ||
| * versions of each module (rather than a mocked version). | ||
| */ | ||
| disableAutomock(): JestObjectType, | ||
| /** | ||
| * An un-hoisted version of disableAutomock | ||
| */ | ||
| autoMockOff(): JestObjectType, | ||
| /** | ||
| * Enables automatic mocking in the module loader. | ||
| */ | ||
| enableAutomock(): JestObjectType, | ||
| /** | ||
| * An un-hoisted version of enableAutomock | ||
| */ | ||
| autoMockOn(): JestObjectType, | ||
| /** | ||
| * Clears the mock.calls and mock.instances properties of all mocks. | ||
| * Equivalent to calling .mockClear() on every mocked function. | ||
| */ | ||
| clearAllMocks(): JestObjectType, | ||
| /** | ||
| * Resets the state of all mocks. Equivalent to calling .mockReset() on every | ||
| * mocked function. | ||
| */ | ||
| resetAllMocks(): JestObjectType, | ||
| /** | ||
| * Restores all mocks back to their original value. | ||
| */ | ||
| restoreAllMocks(): JestObjectType, | ||
| /** | ||
| * Removes any pending timers from the timer system. | ||
| */ | ||
| clearAllTimers(): void, | ||
| /** | ||
| * Returns the number of fake timers still left to run. | ||
| */ | ||
| getTimerCount(): number, | ||
| /** | ||
| * The same as `mock` but not moved to the top of the expectation by | ||
| * babel-jest. | ||
| */ | ||
| doMock(moduleName: string, moduleFactory?: any): JestObjectType, | ||
| /** | ||
| * The same as `unmock` but not moved to the top of the expectation by | ||
| * babel-jest. | ||
| */ | ||
| dontMock(moduleName: string): JestObjectType, | ||
| /** | ||
| * Returns a new, unused mock function. Optionally takes a mock | ||
| * implementation. | ||
| */ | ||
| fn<TArguments: $ReadOnlyArray<*>, TReturn>( | ||
| implementation?: (...args: TArguments) => TReturn | ||
| ): JestMockFn<TArguments, TReturn>, | ||
| /** | ||
| * Determines if the given function is a mocked function. | ||
| */ | ||
| isMockFunction(fn: Function): boolean, | ||
| /** | ||
| * Given the name of a module, use the automatic mocking system to generate a | ||
| * mocked version of the module for you. | ||
| */ | ||
| genMockFromModule(moduleName: string): any, | ||
| /** | ||
| * Mocks a module with an auto-mocked version when it is being required. | ||
| * | ||
| * The second argument can be used to specify an explicit module factory that | ||
| * is being run instead of using Jest's automocking feature. | ||
| * | ||
| * The third argument can be used to create virtual mocks -- mocks of modules | ||
| * that don't exist anywhere in the system. | ||
| */ | ||
| mock( | ||
| moduleName: string, | ||
| moduleFactory?: any, | ||
| options?: Object | ||
| ): JestObjectType, | ||
| /** | ||
| * Returns the actual module instead of a mock, bypassing all checks on | ||
| * whether the module should receive a mock implementation or not. | ||
| */ | ||
| requireActual(moduleName: string): any, | ||
| /** | ||
| * Returns a mock module instead of the actual module, bypassing all checks | ||
| * on whether the module should be required normally or not. | ||
| */ | ||
| requireMock(moduleName: string): any, | ||
| /** | ||
| * Resets the module registry - the cache of all required modules. This is | ||
| * useful to isolate modules where local state might conflict between tests. | ||
| */ | ||
| resetModules(): JestObjectType, | ||
| /** | ||
| * Creates a sandbox registry for the modules that are loaded inside the | ||
| * callback function. This is useful to isolate specific modules for every | ||
| * test so that local module state doesn't conflict between tests. | ||
| */ | ||
| isolateModules(fn: () => void): JestObjectType, | ||
| /** | ||
| * Exhausts the micro-task queue (usually interfaced in node via | ||
| * process.nextTick). | ||
| */ | ||
| runAllTicks(): void, | ||
| /** | ||
| * Exhausts the macro-task queue (i.e., all tasks queued by setTimeout(), | ||
| * setInterval(), and setImmediate()). | ||
| */ | ||
| runAllTimers(): void, | ||
| /** | ||
| * Exhausts all tasks queued by setImmediate(). | ||
| */ | ||
| runAllImmediates(): void, | ||
| /** | ||
| * Executes only the macro task queue (i.e. all tasks queued by setTimeout() | ||
| * or setInterval() and setImmediate()). | ||
| */ | ||
| advanceTimersByTime(msToRun: number): void, | ||
| /** | ||
| * Executes only the macro task queue (i.e. all tasks queued by setTimeout() | ||
| * or setInterval() and setImmediate()). | ||
| * | ||
| * Renamed to `advanceTimersByTime`. | ||
| */ | ||
| runTimersToTime(msToRun: number): void, | ||
| /** | ||
| * Executes only the macro-tasks that are currently pending (i.e., only the | ||
| * tasks that have been queued by setTimeout() or setInterval() up to this | ||
| * point) | ||
| */ | ||
| runOnlyPendingTimers(): void, | ||
| /** | ||
| * Explicitly supplies the mock object that the module system should return | ||
| * for the specified module. Note: It is recommended to use jest.mock() | ||
| * instead. | ||
| */ | ||
| setMock(moduleName: string, moduleExports: any): JestObjectType, | ||
| /** | ||
| * Indicates that the module system should never return a mocked version of | ||
| * the specified module from require() (e.g. that it should always return the | ||
| * real module). | ||
| */ | ||
| unmock(moduleName: string): JestObjectType, | ||
| /** | ||
| * Instructs Jest to use fake versions of the standard timer functions | ||
| * (setTimeout, setInterval, clearTimeout, clearInterval, nextTick, | ||
| * setImmediate and clearImmediate). | ||
| */ | ||
| useFakeTimers(): JestObjectType, | ||
| /** | ||
| * Instructs Jest to use the real versions of the standard timer functions. | ||
| */ | ||
| useRealTimers(): JestObjectType, | ||
| /** | ||
| * Creates a mock function similar to jest.fn but also tracks calls to | ||
| * object[methodName]. | ||
| */ | ||
| spyOn( | ||
| object: Object, | ||
| methodName: string, | ||
| accessType?: 'get' | 'set' | ||
| ): JestMockFn<any, any>, | ||
| /** | ||
| * Set the default timeout interval for tests and before/after hooks in milliseconds. | ||
| * Note: The default timeout interval is 5 seconds if this method is not called. | ||
| */ | ||
| setTimeout(timeout: number): JestObjectType, | ||
| }; | ||
| type JestSpyType = { | ||
| calls: JestCallsType, | ||
| }; | ||
| /** Runs this function after every test inside this context */ | ||
| declare function afterEach( | ||
| fn: (done: () => void) => ?Promise<mixed>, | ||
| timeout?: number | ||
| ): void; | ||
| /** Runs this function before every test inside this context */ | ||
| declare function beforeEach( | ||
| fn: (done: () => void) => ?Promise<mixed>, | ||
| timeout?: number | ||
| ): void; | ||
| /** Runs this function after all tests have finished inside this context */ | ||
| declare function afterAll( | ||
| fn: (done: () => void) => ?Promise<mixed>, | ||
| timeout?: number | ||
| ): void; | ||
| /** Runs this function before any tests have started inside this context */ | ||
| declare function beforeAll( | ||
| fn: (done: () => void) => ?Promise<mixed>, | ||
| timeout?: number | ||
| ): void; | ||
| /** A context for grouping tests together */ | ||
| declare var describe: { | ||
| /** | ||
| * Creates a block that groups together several related tests in one "test suite" | ||
| */ | ||
| (name: JestTestName, fn: () => void): void, | ||
| /** | ||
| * Only run this describe block | ||
| */ | ||
| only(name: JestTestName, fn: () => void): void, | ||
| /** | ||
| * Skip running this describe block | ||
| */ | ||
| skip(name: JestTestName, fn: () => void): void, | ||
| /** | ||
| * each runs this test against array of argument arrays per each run | ||
| * | ||
| * @param {table} table of Test | ||
| */ | ||
| each( | ||
| ...table: Array<Array<mixed> | mixed> | [Array<string>, string] | ||
| ): ( | ||
| name: JestTestName, | ||
| fn?: (...args: Array<any>) => ?Promise<mixed>, | ||
| timeout?: number | ||
| ) => void, | ||
| }; | ||
| /** An individual test unit */ | ||
| declare var it: { | ||
| /** | ||
| * An individual test unit | ||
| * | ||
| * @param {JestTestName} Name of Test | ||
| * @param {Function} Test | ||
| * @param {number} Timeout for the test, in milliseconds. | ||
| */ | ||
| ( | ||
| name: JestTestName, | ||
| fn?: (done: () => void) => ?Promise<mixed>, | ||
| timeout?: number | ||
| ): void, | ||
| /** | ||
| * Only run this test | ||
| * | ||
| * @param {JestTestName} Name of Test | ||
| * @param {Function} Test | ||
| * @param {number} Timeout for the test, in milliseconds. | ||
| */ | ||
| only( | ||
| name: JestTestName, | ||
| fn?: (done: () => void) => ?Promise<mixed>, | ||
| timeout?: number | ||
| ): { | ||
| each( | ||
| ...table: Array<Array<mixed> | mixed> | [Array<string>, string] | ||
| ): ( | ||
| name: JestTestName, | ||
| fn?: (...args: Array<any>) => ?Promise<mixed>, | ||
| timeout?: number | ||
| ) => void, | ||
| }, | ||
| /** | ||
| * Skip running this test | ||
| * | ||
| * @param {JestTestName} Name of Test | ||
| * @param {Function} Test | ||
| * @param {number} Timeout for the test, in milliseconds. | ||
| */ | ||
| skip( | ||
| name: JestTestName, | ||
| fn?: (done: () => void) => ?Promise<mixed>, | ||
| timeout?: number | ||
| ): void, | ||
| /** | ||
| * Highlight planned tests in the summary output | ||
| * | ||
| * @param {String} Name of Test to do | ||
| */ | ||
| todo(name: string): void, | ||
| /** | ||
| * Run the test concurrently | ||
| * | ||
| * @param {JestTestName} Name of Test | ||
| * @param {Function} Test | ||
| * @param {number} Timeout for the test, in milliseconds. | ||
| */ | ||
| concurrent( | ||
| name: JestTestName, | ||
| fn?: (done: () => void) => ?Promise<mixed>, | ||
| timeout?: number | ||
| ): void, | ||
| /** | ||
| * each runs this test against array of argument arrays per each run | ||
| * | ||
| * @param {table} table of Test | ||
| */ | ||
| each( | ||
| ...table: Array<Array<mixed> | mixed> | [Array<string>, string] | ||
| ): ( | ||
| name: JestTestName, | ||
| fn?: (...args: Array<any>) => ?Promise<mixed>, | ||
| timeout?: number | ||
| ) => void, | ||
| }; | ||
| declare function fit( | ||
| name: JestTestName, | ||
| fn: (done: () => void) => ?Promise<mixed>, | ||
| timeout?: number | ||
| ): void; | ||
| /** An individual test unit */ | ||
| declare var test: typeof it; | ||
| /** A disabled group of tests */ | ||
| declare var xdescribe: typeof describe; | ||
| /** A focused group of tests */ | ||
| declare var fdescribe: typeof describe; | ||
| /** A disabled individual test */ | ||
| declare var xit: typeof it; | ||
| /** A disabled individual test */ | ||
| declare var xtest: typeof it; | ||
| type JestPrettyFormatColors = { | ||
| comment: { close: string, open: string }, | ||
| content: { close: string, open: string }, | ||
| prop: { close: string, open: string }, | ||
| tag: { close: string, open: string }, | ||
| value: { close: string, open: string }, | ||
| }; | ||
| type JestPrettyFormatIndent = string => string; | ||
| type JestPrettyFormatRefs = Array<any>; | ||
| type JestPrettyFormatPrint = any => string; | ||
| type JestPrettyFormatStringOrNull = string | null; | ||
| type JestPrettyFormatOptions = {| | ||
| callToJSON: boolean, | ||
| edgeSpacing: string, | ||
| escapeRegex: boolean, | ||
| highlight: boolean, | ||
| indent: number, | ||
| maxDepth: number, | ||
| min: boolean, | ||
| plugins: JestPrettyFormatPlugins, | ||
| printFunctionName: boolean, | ||
| spacing: string, | ||
| theme: {| | ||
| comment: string, | ||
| content: string, | ||
| prop: string, | ||
| tag: string, | ||
| value: string, | ||
| |}, | ||
| |}; | ||
| type JestPrettyFormatPlugin = { | ||
| print: ( | ||
| val: any, | ||
| serialize: JestPrettyFormatPrint, | ||
| indent: JestPrettyFormatIndent, | ||
| opts: JestPrettyFormatOptions, | ||
| colors: JestPrettyFormatColors | ||
| ) => string, | ||
| test: any => boolean, | ||
| }; | ||
| type JestPrettyFormatPlugins = Array<JestPrettyFormatPlugin>; | ||
| /** The expect function is used every time you want to test a value */ | ||
| declare var expect: { | ||
| /** The object that you want to make assertions against */ | ||
| ( | ||
| value: any | ||
| ): JestExpectType & | ||
| JestPromiseType & | ||
| EnzymeMatchersType & | ||
| DomTestingLibraryType & | ||
| JestJQueryMatchersType & | ||
| JestStyledComponentsMatchersType & | ||
| JestExtendedMatchersType, | ||
| /** Add additional Jasmine matchers to Jest's roster */ | ||
| extend(matchers: { [name: string]: JestMatcher }): void, | ||
| /** Add a module that formats application-specific data structures. */ | ||
| addSnapshotSerializer(pluginModule: JestPrettyFormatPlugin): void, | ||
| assertions(expectedAssertions: number): void, | ||
| hasAssertions(): void, | ||
| any(value: mixed): JestAsymmetricEqualityType, | ||
| anything(): any, | ||
| arrayContaining(value: Array<mixed>): Array<mixed>, | ||
| objectContaining(value: Object): Object, | ||
| /** Matches any received string that contains the exact expected string. */ | ||
| stringContaining(value: string): string, | ||
| stringMatching(value: string | RegExp): string, | ||
| not: { | ||
| arrayContaining: (value: $ReadOnlyArray<mixed>) => Array<mixed>, | ||
| objectContaining: (value: {}) => Object, | ||
| stringContaining: (value: string) => string, | ||
| stringMatching: (value: string | RegExp) => string, | ||
| }, | ||
| }; | ||
| // TODO handle return type | ||
| // http://jasmine.github.io/2.4/introduction.html#section-Spies | ||
| declare function spyOn(value: mixed, method: string): Object; | ||
| /** Holds all functions related to manipulating test runner */ | ||
| declare var jest: JestObjectType; | ||
| /** | ||
| * The global Jasmine object, this is generally not exposed as the public API, | ||
| * using features inside here could break in later versions of Jest. | ||
| */ | ||
| declare var jasmine: { | ||
| DEFAULT_TIMEOUT_INTERVAL: number, | ||
| any(value: mixed): JestAsymmetricEqualityType, | ||
| anything(): any, | ||
| arrayContaining(value: Array<mixed>): Array<mixed>, | ||
| clock(): JestClockType, | ||
| createSpy(name: string): JestSpyType, | ||
| createSpyObj( | ||
| baseName: string, | ||
| methodNames: Array<string> | ||
| ): { [methodName: string]: JestSpyType }, | ||
| objectContaining(value: Object): Object, | ||
| stringMatching(value: string): string, | ||
| }; |
| // @flow | ||
| /* eslint-disable react/jsx-filename-extension */ | ||
| import React, { cloneElement } from 'react'; | ||
| import PropTypes from 'prop-types'; | ||
| import { shallow } from 'enzyme'; | ||
| import { deepFilter, deepFind, deepForEach, deepMap, filter, groupByType, onlyText } from '..'; | ||
| describe('children', () => { | ||
| it('filter', () => { | ||
| const Filtered = ({ children }) => ( | ||
| <div>{filter(children, (item) => item.type === 'span')}</div> | ||
| ); | ||
| Filtered.propTypes = { children: PropTypes.node.isRequired }; | ||
| const wrapper = shallow( | ||
| <Filtered> | ||
| <span>1</span> | ||
| <span>2</span> | ||
| <strong>3</strong> | ||
| </Filtered>, | ||
| ); | ||
| expect(wrapper.find('span')).toExist(); | ||
| expect(wrapper.find('span')).toHaveLength(2); | ||
| expect(wrapper.find('strong')).not.toExist(); | ||
| }); | ||
| it('deep filter', () => { | ||
| const DeepFiltered = ({ children }) => ( | ||
| <div>{deepFilter(children, (item) => item.type === 'span')}</div> | ||
| ); | ||
| DeepFiltered.propTypes = { children: PropTypes.node.isRequired }; | ||
| const wrapper = shallow( | ||
| <DeepFiltered> | ||
| <span>1</span> | ||
| <span>2</span> | ||
| <span> | ||
| <strong>3</strong> | ||
| <span> | ||
| <strong>4</strong> | ||
| <span>5</span> | ||
| </span> | ||
| </span> | ||
| </DeepFiltered>, | ||
| ); | ||
| expect(wrapper.find('span')).toExist(); | ||
| expect(wrapper.find('span')).toHaveLength(5); | ||
| expect(wrapper.find('strong')).not.toExist(); | ||
| }); | ||
| it('group by type', () => { | ||
| const Grouped = ({ children }) => ( | ||
| <div> | ||
| <div className="spans">{groupByType(children, ['span', 'i'], 'rest').span}</div> | ||
| <div className="rest">{groupByType(children, ['span', 'i'], 'rest').rest}</div> | ||
| <div className="empty">{groupByType(children, ['span', 'i'], 'rest').i}</div> | ||
| </div> | ||
| ); | ||
| Grouped.propTypes = { children: PropTypes.node.isRequired }; | ||
| const wrapper = shallow( | ||
| <Grouped> | ||
| <span> | ||
| <b>1</b> | ||
| </span> | ||
| <span> | ||
| <b>2</b> | ||
| </span> | ||
| <strong>3</strong> | ||
| </Grouped>, | ||
| ); | ||
| expect(wrapper.find('.spans b')).toExist(); | ||
| expect(wrapper.find('.spans b')).toHaveLength(2); | ||
| expect(wrapper.find('.spans strong')).not.toExist(); | ||
| expect(wrapper.find('.rest span')).not.toExist(); | ||
| expect(wrapper.find('.rest strong')).toExist(); | ||
| expect(wrapper.find('.rest strong')).toHaveLength(1); | ||
| expect(wrapper.find('.empty').children()).not.toExist(); | ||
| }); | ||
| it('deep map', () => { | ||
| const DeepMapped = ({ children }) => ( | ||
| <div> | ||
| {deepMap(children, (child) => { | ||
| if (child && child.type === 'b') { | ||
| return cloneElement(child, { ...child.props, className: 'mapped' }); | ||
| } | ||
| return child; | ||
| })} | ||
| </div> | ||
| ); | ||
| DeepMapped.propTypes = { children: PropTypes.node.isRequired }; | ||
| const wrapper = shallow( | ||
| <DeepMapped> | ||
| <b>1</b> | ||
| <b>2</b> | ||
| <span> | ||
| <b>3</b> | ||
| </span> | ||
| <div> | ||
| <div> | ||
| <b>4</b> | ||
| </div> | ||
| </div> | ||
| {null && <div>will not show up</div>} | ||
| {false && <div>will not show up</div>} | ||
| {undefined && <div>will not show up</div>} | ||
| </DeepMapped>, | ||
| ); | ||
| expect(wrapper.find('.mapped')).toExist(); | ||
| expect(wrapper.find('.mapped')).toHaveLength(4); | ||
| }); | ||
| it('deep each', () => { | ||
| const texts = []; | ||
| const DeepForEached = ({ children }) => ( | ||
| <div> | ||
| {deepForEach(children, (child) => { | ||
| if (child && child.type === 'b') { | ||
| texts.push(child.props.children); | ||
| } | ||
| })} | ||
| </div> | ||
| ); | ||
| DeepForEached.propTypes = { children: PropTypes.node.isRequired }; | ||
| shallow( | ||
| <DeepForEached> | ||
| <b>1</b> | ||
| <b>2</b> | ||
| <span> | ||
| <b>3</b> | ||
| </span> | ||
| <div> | ||
| <div> | ||
| <b>4</b> | ||
| </div> | ||
| </div> | ||
| {null && <div>will not show up</div>} | ||
| {false && <div>will not show up</div>} | ||
| {undefined && <div>will not show up</div>} | ||
| </DeepForEached>, | ||
| ); | ||
| expect(texts).toStrictEqual(['1', '2', '3', '4']); | ||
| }); | ||
| it('deep find', () => { | ||
| const DeepFound = ({ children }) => ( | ||
| <div>{deepFind(children, (child) => child.type === 'i')}</div> | ||
| ); | ||
| DeepFound.propTypes = { children: PropTypes.node.isRequired }; | ||
| const wrapper = shallow( | ||
| <DeepFound> | ||
| <b>1</b> | ||
| <b>2</b> | ||
| <span> | ||
| <i>3</i> | ||
| </span> | ||
| <i>4</i> | ||
| {null && <div>will not show up</div>} | ||
| {false && <div>will not show up</div>} | ||
| {undefined && <div>will not show up</div>} | ||
| </DeepFound>, | ||
| ); | ||
| expect(wrapper.find('i')).toExist(); | ||
| expect(wrapper.find('i')).toHaveLength(1); | ||
| expect(wrapper.find('span')).not.toExist(); | ||
| expect(wrapper).toHaveText('3'); | ||
| }); | ||
| it('only text', () => { | ||
| const OnlyText = ({ children }) => <div>{onlyText(children)}</div>; | ||
| OnlyText.propTypes = { children: PropTypes.node.isRequired }; | ||
| const wrapper = shallow( | ||
| <OnlyText> | ||
| <span>0</span> | ||
| <b>1</b> | ||
| <span> | ||
| <i>2</i> | ||
| </span> | ||
| <i>3</i> | ||
| </OnlyText>, | ||
| ); | ||
| expect(wrapper.find('i')).not.toExist(); | ||
| expect(wrapper.find('b')).not.toExist(); | ||
| expect(wrapper.find('span')).not.toExist(); | ||
| expect(wrapper).toHaveText('0123'); | ||
| }); | ||
| }); |
| import { ReactChild, ReactElement, ReactNode } from 'react'; | ||
| declare module 'react-children-utilities' { | ||
| export interface GroupedChildren { | ||
| [name: string]: ReactNode; | ||
| } | ||
| export interface ForEachFn { | ||
| (child: ReactChild, index?: number, children?: ReactNode): void; | ||
| } | ||
| export interface FilterFn { | ||
| (child: ReactChild, index?: number, children?: ReactNode): boolean; | ||
| } | ||
| export interface FindFn { | ||
| (child: ReactChild, index?: number, children?: ReactNode): boolean; | ||
| } | ||
| export interface MapFn { | ||
| (child: ReactChild, index?: number, children?: ReactNode): ReactChild; | ||
| } | ||
| export function filter(children: ReactNode, filterFn: FilterFn): ReactNode; | ||
| export function deepFilter(children: ReactNode, deepFilterFn: FilterFn): ReactNode; | ||
| export function groupByType(children: ReactNode, types: string[], rest?: string): GroupedChildren; | ||
| export function deepMap(children: ReactNode, deepMapFn: MapFn): ReactNode; | ||
| export function deepForEach(children: ReactNode, deepForEachFn: ForEachFn): void; | ||
| export function deepFind(children: ReactNode, deepFindFn: FindFn): ReactElement<any>; | ||
| export function onlyText(children: ReactNode): string; | ||
| export function hasChildren(child: ReactElement<any>): boolean; | ||
| export function hasComplexChildren(child: ReactElement<any>): boolean; | ||
| } |
-105
| import { Children, cloneElement } from 'react'; | ||
| export const hasChildren = (child) => Boolean(child && child.props && child.props.children); | ||
| export const hasComplexChildren = (child) => | ||
| hasChildren(child) && typeof child.props.children === 'object'; | ||
| export const filter = (children, filterFn) => { | ||
| return Children.toArray(children).filter(filterFn); | ||
| }; | ||
| export const deepFilter = (children, deepFilterFn) => { | ||
| return Children.toArray(children) | ||
| .filter(deepFilterFn) | ||
| .map((child) => { | ||
| if (hasComplexChildren(child)) { | ||
| // Clone the child that has children and filter them too | ||
| return cloneElement(child, { | ||
| ...child.props, | ||
| children: deepFilter(child.props.children, deepFilterFn), | ||
| }); | ||
| } | ||
| return child; | ||
| }); | ||
| }; | ||
| export const groupByType = (children, types, rest) => { | ||
| return Children.toArray(children).reduce((group, child) => { | ||
| const isGrouped = types.includes(child.type); | ||
| const addChild = isGrouped ? child.props.children : child; | ||
| const key = isGrouped ? child.type : rest; | ||
| return { | ||
| ...group, | ||
| [key]: [...(group[key] || []), addChild], | ||
| }; | ||
| }, {}); | ||
| }; | ||
| export const deepMap = (children, deepMapFn) => { | ||
| return Children.map(children, (child) => { | ||
| if (hasComplexChildren(child)) { | ||
| // Clone the child that has children and map them too | ||
| return deepMapFn( | ||
| cloneElement(child, { | ||
| ...child.props, | ||
| children: deepMap(child.props.children, deepMapFn), | ||
| }), | ||
| ); | ||
| } | ||
| return deepMapFn(child); | ||
| }); | ||
| }; | ||
| export const deepForEach = (children, deepForEachFn) => { | ||
| Children.forEach(children, (child) => { | ||
| if (hasComplexChildren(child)) { | ||
| // Each inside the child that has children | ||
| deepForEach(child.props.children, deepForEachFn); | ||
| } | ||
| deepForEachFn(child); | ||
| }); | ||
| }; | ||
| export const deepFind = (children, deepFindFn) => { | ||
| let found; | ||
| Children.toArray(children).find((child) => { | ||
| if (hasComplexChildren(child)) { | ||
| // Find inside the child that has children | ||
| found = deepFind(child.props.children, deepFindFn); | ||
| return typeof (found) !== 'undefined'; | ||
| } | ||
| if (deepFindFn(child)) { | ||
| found = child; | ||
| return true; | ||
| } | ||
| return false; | ||
| }); | ||
| return found; | ||
| }; | ||
| export const onlyText = (children) => { | ||
| return Children.toArray(children) | ||
| .reduce( | ||
| (flattened, child) => [ | ||
| ...flattened, | ||
| hasChildren(child) ? onlyText(child.props.children) : child, | ||
| ], | ||
| [], | ||
| ) | ||
| .join(''); | ||
| }; | ||
| export default { | ||
| ...Children, | ||
| filter, | ||
| deepFilter, | ||
| groupByType, | ||
| deepMap, | ||
| deepForEach, | ||
| deepFind, | ||
| onlyText, | ||
| hasChildren, | ||
| hasComplexChildren, | ||
| }; |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
Found 1 instance in 1 package
Minified code
QualityThis package contains minified code. This may be harmless in some cases where minified code is included in packaged libraries, however packages on npm should not minify code.
Found 1 instance in 1 package
No v1
QualityPackage is not semver >=1. This means it is not stable and does not support ^ ranges.
Found 1 instance in 1 package
Dynamic require
Supply chain riskDynamic require can indicate the package is performing dangerous or unsafe dynamic code execution.
Found 1 instance in 1 package
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
Found 1 instance in 1 package
Minified code
QualityThis package contains minified code. This may be harmless in some cases where minified code is included in packaged libraries, however packages on npm should not minify code.
Found 1 instance in 1 package
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Found 1 instance in 1 package
597740
616.07%135
382.14%1692
14.32%2
-66.67%39
11.43%3
200%1
Infinity%