Launch Week Day 5: Introducing Reachability for PHP.Learn More
Socket
Book a DemoSign in
Socket

react-children-utilities

Package Overview
Dependencies
Maintainers
1
Versions
97
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

react-children-utilities - npm Package Compare versions

Comparing version
1.3.3
to
2.0.0-beta.0
+23
.gitignore
# 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">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">5x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { Children, cloneElement } from 'react';
import hasComplexChildren from './hasComplexChildren';
&nbsp;
const deepFilter = (children, deepFilterFn) =&gt; {
return Children.toArray(children)
.filter(deepFilterFn)
.map((child) =&gt; {
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;
});
};
&nbsp;
export default deepFilter;
&nbsp;</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">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">8x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">13x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">9x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { Children, cloneElement, ReactElement, ReactNode } from 'react';
import hasComplexChildren from './hasComplexChildren';
&nbsp;
export interface FilterFunction {
(child: ReactNode, index?: number, children?: ReactNode[]): boolean;
}
&nbsp;
const deepFilter = (children: ReactNode, deepFilterFn: FilterFunction): ReactNode[] =&gt; {
return Children.toArray(children)
.filter(deepFilterFn)
.map((child) =&gt; {
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;
});
};
&nbsp;
export default deepFilter;
&nbsp;</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">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</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">&nbsp;</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { Children } from 'react';
import hasComplexChildren from './hasComplexChildren';
&nbsp;
const deepFind = (children, deepFindFn) =&gt; {
let found;
Children.toArray(children).find((child) =&gt; {
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;
};
&nbsp;
export default deepFind;
&nbsp;</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">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-yes">7x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</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">&nbsp;</span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { Children, ReactNode, ReactElement } from 'react';
import hasComplexChildren from './hasComplexChildren';
&nbsp;
export interface FindFunction {
(child: ReactNode, index?: number, children?: ReactNode[]): ReactNode;
}
&nbsp;
const deepFind = (children: ReactNode, deepFindFn: FindFunction): ReactNode | undefined =&gt; {
let found;
Children.toArray(children).find((child) =&gt; {
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;
};
&nbsp;
export default deepFind;
&nbsp;</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">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</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">&nbsp;</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">10x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { Children } from 'react';
import hasComplexChildren from './hasComplexChildren';
&nbsp;
const deepForEach = (children, deepForEachFn) =&gt; {
Children.forEach(children, (child) =&gt; {
if (hasComplexChildren(child)) {
// Each inside the child that has children
deepForEach(child.props.children, deepForEachFn);
}
deepForEachFn(child);
});
};
&nbsp;
export default deepForEach;
&nbsp;</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">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</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">&nbsp;</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">11x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { Children, ReactElement, ReactNode } from 'react';
import hasComplexChildren from './hasComplexChildren';
&nbsp;
export interface ForEachFunction {
(child: ReactNode, index?: number, children?: ReactNode[]): void;
}
&nbsp;
const deepForEach = (children: ReactNode, deepForEachFn: ForEachFunction): void =&gt; {
Children.forEach(children, (child) =&gt; {
if (hasComplexChildren(child)) {
// Each inside the child that has children
deepForEach((child as ReactElement).props.children, deepForEachFn);
}
deepForEachFn(child);
});
};
&nbsp;
export default deepForEach;
&nbsp;</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">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</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">&nbsp;</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">7x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { Children, cloneElement } from 'react';
import hasComplexChildren from './hasComplexChildren';
&nbsp;
const deepMap = (children, deepMapFn) =&gt; {
return Children.map(children, (child) =&gt; {
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);
});
};
&nbsp;
export default deepMap;
&nbsp;</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">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</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">&nbsp;</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">7x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { Children, cloneElement, ReactElement, ReactNode } from 'react';
import hasComplexChildren from './hasComplexChildren';
&nbsp;
export interface MapFunction {
(child: ReactNode, index?: number, children?: ReactNode[]): ReactNode;
}
&nbsp;
const deepMap = (children: ReactNode, deepMapFn: MapFunction): ReactNode[] =&gt; {
return Children.map(children, (child) =&gt; {
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);
});
};
&nbsp;
export default deepMap;
&nbsp;</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">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { Children } from 'react';
&nbsp;
const filter = (children, filterFn) =&gt; {
return Children.toArray(children).filter(filterFn);
};
&nbsp;
export default filter;
&nbsp;</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">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { Children, ReactNode } from 'react';
&nbsp;
export interface FilterFunction {
(child: ReactNode, index?: number, children?: ReactNode[]): boolean;
}
&nbsp;
const filter = (children: ReactNode, filterFn: FilterFunction): ReactNode[] =&gt; {
return Children.toArray(children).filter(filterFn);
};
&nbsp;
export default filter;
&nbsp;</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">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</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">&nbsp;</span>
<span class="cline-any cline-yes">9x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { Children } from 'react';
&nbsp;
const groupByType = (children, types, rest) =&gt; {
return Children.toArray(children).reduce((group, child) =&gt; {
const isGrouped = types.includes(child.type);
const addChild = isGrouped ? child.props.children : child;
const key = isGrouped ? child.type : rest;
&nbsp;
return {
...group,
[key]: [...(group[key] || []), addChild],
};
}, {});
};
&nbsp;
export default groupByType;
&nbsp;</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">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</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">&nbsp;</span>
<span class="cline-any cline-yes">9x</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">9x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">9x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { Children, isValidElement, ReactNode, ReactElement } from 'react';
&nbsp;
export interface GroupedChildren {
[name: string]: ReactNode[];
}
&nbsp;
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 =&gt; {
return Children.toArray(children).reduce((groups: GroupedChildren, child: ReactNode) =&gt; {
const isGrouped = isValidElement(child) &amp;&amp; types.includes(child.type);
const addChild = isGrouped ? (child as ReactElement).props.children : child;
const key = isGrouped ? (child as ReactElement).type : rest;
&nbsp;
<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>
}
&nbsp;
const group = groups[key];
&nbsp;
return {
...groups,
[key]: [...(group || []), addChild],
};
}, {});
};
&nbsp;
export default groupByType;
&nbsp;</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">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">const hasChildren = (child) =&gt; Boolean(child &amp;&amp; child.props &amp;&amp; child.props.children);
&nbsp;
export default hasChildren;
&nbsp;</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">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">8x</span>
<span class="cline-any cline-yes">77x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">8x</span>
<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { ReactNode, ReactElement } from 'react';
&nbsp;
const hasChildren = (child: ReactNode): boolean =&gt;
Boolean(child &amp;&amp; (child as ReactElement).props &amp;&amp; (child as ReactElement).props.children);
&nbsp;
export default hasChildren;
&nbsp;</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">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">5x</span>
<span class="cline-any cline-yes">29x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import hasChildren from './hasChildren';
&nbsp;
const hasComplexChildren = (child) =&gt;
hasChildren(child) &amp;&amp; typeof child.props.children === 'object';
&nbsp;
export default hasComplexChildren;
&nbsp;</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">&nbsp;</span>
<span class="cline-any cline-yes">6x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">6x</span>
<span class="cline-any cline-yes">50x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">52x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">6x</span>
<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { Children, isValidElement, ReactNode, ReactElement } from 'react';
&nbsp;
import hasChildren from './hasChildren';
&nbsp;
const hasComplexChildren = (element: ReactNode): boolean =&gt;
hasChildren(element) &amp;&amp;
Children.toArray((element as ReactElement).props.children).reduce(
(response: boolean, child: ReactNode) =&gt; response || isValidElement(child),
false,
);
&nbsp;
export default hasComplexChildren;
&nbsp;</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">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { Children } from 'react';
&nbsp;
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';
&nbsp;
export {
deepFilter,
deepFind,
deepForEach,
deepMap,
filter,
groupByType,
hasChildren,
hasComplexChildren,
onlyText,
};
&nbsp;
export default {
...Children,
deepFilter,
deepFind,
deepForEach,
deepMap,
filter,
groupByType,
hasChildren,
hasComplexChildren,
onlyText,
};
&nbsp;</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">&nbsp;</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">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</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">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { Children } from 'react';
&nbsp;
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';
&nbsp;
export {
deepFilter,
deepFind,
deepForEach,
deepMap,
filter,
groupByType,
hasChildren,
hasComplexChildren,
onlyText,
};
&nbsp;
export default {
...Children,
deepFilter,
deepFind,
deepForEach,
deepMap,
filter,
groupByType,
hasChildren,
hasComplexChildren,
onlyText,
};
&nbsp;</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">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">6x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">9x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { Children } from 'react';
import hasChildren from './hasChildren';
&nbsp;
const onlyText = (children) =&gt; {
return Children.toArray(children)
.reduce(
(flattened, child) =&gt; [
...flattened,
hasChildren(child) ? onlyText(child.props.children) : child,
],
[],
)
.join('');
};
&nbsp;
export default onlyText;
&nbsp;</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">&nbsp;</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">16x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">18x</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">18x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { Children, ReactElement, ReactNode } from 'react';
import hasChildren from './hasChildren';
&nbsp;
const onlyText = (children: ReactNode): string =&gt; {
return Children.toArray(children)
.reduce((flattened: string[], child: ReactNode): string[] =&gt; {
<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>
}
&nbsp;
return [
...flattened,
hasChildren(child) ? onlyText((child as ReactElement).props.children) : child.toString(),
];
}, [])
.join('');
};
&nbsp;
export default onlyText;
&nbsp;</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">&nbsp;</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">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</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">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { Children } from 'react';
&nbsp;
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';
&nbsp;
export {
deepFilter,
deepFind,
deepForEach,
deepMap,
filter,
groupByType,
hasChildren,
hasComplexChildren,
onlyText,
};
&nbsp;
export default {
...Children,
deepFilter,
deepFind,
deepForEach,
deepMap,
filter,
groupByType,
hasChildren,
hasComplexChildren,
onlyText,
};
&nbsp;</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">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">8x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">13x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">9x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { Children, cloneElement, ReactElement, ReactNode } from 'react';
import hasComplexChildren from './hasComplexChildren';
&nbsp;
export interface FilterFunction {
(child: ReactNode, index?: number, children?: ReactNode[]): boolean;
}
&nbsp;
const deepFilter = (children: ReactNode, deepFilterFn: FilterFunction): ReactNode[] =&gt; {
return Children.toArray(children)
.filter(deepFilterFn)
.map((child) =&gt; {
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;
});
};
&nbsp;
export default deepFilter;
&nbsp;</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">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-yes">7x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</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">&nbsp;</span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { Children, ReactNode, ReactElement } from 'react';
import hasComplexChildren from './hasComplexChildren';
&nbsp;
export interface FindFunction {
(child: ReactNode, index?: number, children?: ReactNode[]): ReactNode;
}
&nbsp;
const deepFind = (children: ReactNode, deepFindFn: FindFunction): ReactNode | undefined =&gt; {
let found;
Children.toArray(children).find((child) =&gt; {
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;
};
&nbsp;
export default deepFind;
&nbsp;</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">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</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">&nbsp;</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">11x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { Children, ReactElement, ReactNode } from 'react';
import hasComplexChildren from './hasComplexChildren';
&nbsp;
export interface ForEachFunction {
(child: ReactNode, index?: number, children?: ReactNode[]): void;
}
&nbsp;
const deepForEach = (children: ReactNode, deepForEachFn: ForEachFunction): void =&gt; {
Children.forEach(children, (child) =&gt; {
if (hasComplexChildren(child)) {
// Each inside the child that has children
deepForEach((child as ReactElement).props.children, deepForEachFn);
}
deepForEachFn(child);
});
};
&nbsp;
export default deepForEach;
&nbsp;</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">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</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">&nbsp;</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">7x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { Children, cloneElement, ReactElement, ReactNode } from 'react';
import hasComplexChildren from './hasComplexChildren';
&nbsp;
export interface MapFunction {
(child: ReactNode, index?: number, children?: ReactNode[]): ReactNode;
}
&nbsp;
const deepMap = (children: ReactNode, deepMapFn: MapFunction): ReactNode[] =&gt; {
return Children.map(children, (child) =&gt; {
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);
});
};
&nbsp;
export default deepMap;
&nbsp;</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">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { Children, ReactNode } from 'react';
&nbsp;
export interface FilterFunction {
(child: ReactNode, index?: number, children?: ReactNode[]): boolean;
}
&nbsp;
const filter = (children: ReactNode, filterFn: FilterFunction): ReactNode[] =&gt; {
return Children.toArray(children).filter(filterFn);
};
&nbsp;
export default filter;
&nbsp;</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">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</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">&nbsp;</span>
<span class="cline-any cline-yes">9x</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">9x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">9x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { Children, isValidElement, ReactNode, ReactElement } from 'react';
&nbsp;
export interface GroupedChildren {
[name: string]: ReactNode[];
}
&nbsp;
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 =&gt; {
return Children.toArray(children).reduce((groups: GroupedChildren, child: ReactNode) =&gt; {
const isGrouped = isValidElement(child) &amp;&amp; types.includes(child.type);
const addChild = isGrouped ? (child as ReactElement).props.children : child;
const key = isGrouped ? (child as ReactElement).type : rest;
&nbsp;
<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>
}
&nbsp;
const group = groups[key];
&nbsp;
return {
...groups,
[key]: [...(group || []), addChild],
};
}, {});
};
&nbsp;
export default groupByType;
&nbsp;</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">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">8x</span>
<span class="cline-any cline-yes">77x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">8x</span>
<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { ReactNode, ReactElement } from 'react';
&nbsp;
const hasChildren = (child: ReactNode): boolean =&gt;
Boolean(child &amp;&amp; (child as ReactElement).props &amp;&amp; (child as ReactElement).props.children);
&nbsp;
export default hasChildren;
&nbsp;</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">&nbsp;</span>
<span class="cline-any cline-yes">6x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">6x</span>
<span class="cline-any cline-yes">50x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">52x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">6x</span>
<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { Children, isValidElement, ReactNode, ReactElement } from 'react';
&nbsp;
import hasChildren from './hasChildren';
&nbsp;
const hasComplexChildren = (element: ReactNode): boolean =&gt;
hasChildren(element) &amp;&amp;
Children.toArray((element as ReactElement).props.children).reduce(
(response: boolean, child: ReactNode) =&gt; response || isValidElement(child),
false,
);
&nbsp;
export default hasComplexChildren;
&nbsp;</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">&nbsp;</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">16x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">18x</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">18x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { Children, ReactElement, ReactNode } from 'react';
import hasChildren from './hasChildren';
&nbsp;
const onlyText = (children: ReactNode): string =&gt; {
return Children.toArray(children)
.reduce((flattened: string[], child: ReactNode): string[] =&gt; {
<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>
}
&nbsp;
return [
...flattened,
hasChildren(child) ? onlyText((child as ReactElement).props.children) : child.toString(),
];
}, [])
.join('');
};
&nbsp;
export default onlyText;
&nbsp;</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">&nbsp;</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">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</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">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { Children } from 'react';
&nbsp;
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';
&nbsp;
export {
deepFilter,
deepFind,
deepForEach,
deepMap,
filter,
groupByType,
hasChildren,
hasComplexChildren,
onlyText,
};
&nbsp;
export default {
...Children,
deepFilter,
deepFind,
deepForEach,
deepMap,
filter,
groupByType,
hasChildren,
hasComplexChildren,
onlyText,
};
&nbsp;</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"
}
}
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'],
};
{
"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"
}
]
}
{
"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;
}
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