pure-fts
Version:
pure-js full text search
1,299 lines (1,190 loc) • 206 kB
HTML
<!doctype html>
<html>
<head>
<title>Tests & Coverage</title>
<script>
headings = [];
onload = function () {
headings = document.querySelectorAll('h2');
reset();
};
onscroll = function (e) {
var heading = find(window.scrollY);
if (!heading) return;
var links = document.querySelectorAll('#menu a')
, link;
for (var i = 0, len = links.length; i < len; ++i) {
link = links[i];
link.className = link.getAttribute('href') == '#' + heading.id ? 'active' : '';
}
};
function find (y) {
var i = headings.length
, heading;
while (i--) {
heading = headings[i];
if (y >= heading.offsetTop) {
return heading;
}
}
}
function toggle (className) {
var elements = document.getElementsByClassName(className);
for (var i = 0, il = elements.length; i < il; ++i) {
var element = elements[i];
if (element.classList.contains('hide')) {
element.classList.remove('hide');
element.classList.add('show');
}
else {
element.classList.remove('show');
element.classList.add('hide');
}
};
}
function reset () {
var shownElements = document.getElementsByClassName('show');
var filterElements = document.querySelectorAll('input[type=checkbox]');
for (var i = 0, il = filterElements.length; i < il; ++i) {
filterElements[i].checked = false;
}
// Check any filters with visible elements
for (i = 0, il = shownElements.length; i < il; ++i) {
var shownElement = shownElements[i];
var classNames = shownElement.className.split(' ');
for (var ci = 0, cl = classNames.length; ci < cl; ++ci){
var element = document.getElementById('show-' + classNames[ci]);
if (element) {
element.checked = true;
}
}
}
};
function filter (element) {
toggle(element.value);
reset();
}
</script>
<style>
body {
font: 14px/1.6 Helvetica, Arial, sans-serif;
margin: 0;
color: #2c2c2c;
}
#coverage {
padding: 60px;
}
h1 a:hover {
text-decoration: none;
}
h2 {
width: 80%;
margin-top: 80px;
margin-bottom: 0;
font-weight: 100;
letter-spacing: 1px;
}
ul {
margin-top: 20px;
padding: 0 15px;
width: 100%;
}
ul li {
float: left;
width: 40%;
margin-top: 5px;
margin-right: 60px;
list-style: none;
padding: 5px 0;
font-size: 12px;
}
#menu {
position: fixed;
font-size: 12px;
overflow-y: auto;
top: 0;
right: 0;
margin: 0;
height: 100%;
padding: 15px 15px;
border-left: 1px solid #eee;
background-color: #666;
}
#menu::after {
display: block;
content: '';
padding-top: 80px;
}
#menu li a {
display: block;
color: white;
padding: 0 5px 0 35px;
transition: background 300ms;
text-decoration: none;
}
#menu li {
position: relative;
list-style: none;
}
#menu a:hover,
#menu a.active {
text-decoration: none;
background: rgba(255,255,255,.4);
}
#menu li:hover .cov {
opacity: 1;
}
#menu li .dirname {
opacity: .60;
padding-right: 2px;
}
#menu li .basename {
opacity: 1;
}
#menu .cov {
background: rgba(0,0,0,.3);
position: absolute;
top: 0;
font-size: 9px;
text-align: center;
opacity: .8;
width: 22px;
border-radius: 10px;
padding: 2px 3px;
}
#files .stats:nth-child(2n) {
display: inline-block;
margin-top: 15px;
border: 1px solid #eee;
padding: 10px;
border-radius: 5px;
}
.stats div {
float: left;
padding: 0 5px;
}
.stats::after {
display: block;
content: '';
clear: both;
}
.stats .sloc::after {
content: ' SLOC';
color: #b6b6b6;
}
.stats .percentage::after {
content: ' coverage';
color: #b6b6b6;
}
.stats .hits::before {
content: '(';
color: #b6b6b6;
}
.stats .hits::after {
content: ' Covered';
color: #b6b6b6;
}
.stats .misses::after {
content: ' Not Covered)';
color: #b6b6b6;
}
.stats .failures::after {
content: ' Failures';
color: #b6b6b6;
}
.stats .skipped::after {
content: ' Skipped';
color: #b6b6b6;
}
.stats .test-count::after {
content: ' Tests';
color: #b6b6b6;
}
.stats .duration::before {
content: '(';
color: #b6b6b6;
}
.stats .duration::after {
content: ' ms)';
color: #b6b6b6;
}
.high {
color: #00d4b4;
}
.medium {
color: #e87d0d;
}
.low {
color: #d4081a;
}
.terrible {
color: #d4081a;
font-weight: bold;
}
#files table {
width: 80%;
margin-top: 10px;
border-collapse: collapse;
border: 1px solid #cbcbcb;
color: #363636;
border-radius: 3px;
}
#files thead {
display: none;
}
table td.line,
table td.hits {
width: 20px;
background: #eaeaea;
text-align: center;
font-size: 11px;
padding: 0 10px;
color: #949494;
}
table td.hits {
width: 10px;
padding: 2px 5px;
color: rgba(0,0,0,.2);
background: #f0f0f0;
}
table td.sourcemaps {
width: 1%;
border-left: 1px solid #cbcbcb;
padding: 0 10px;
}
td.sourcemaps.file {
background: #f0f0f0;
}
tr.miss td.line,
tr.miss td.hits {
background: #e6c3c7;
}
tr.miss td {
background: #f8d5d8;
}
td.source {
padding-left: 15px;
line-height: 15px;
white-space: pre;
font: 12px monaco, monospace;
}
td.source div {
display: inline-block;
}
td.source div.true {
background: #bae8bf;
}
td.source div.false {
background: #e8e5ba;
}
td.source div.never {
background: #f8d5d8;
}
#tests {
padding: 60px;
}
#tests table {
width: 80%;
margin-top: 10px;
border-collapse: collapse;
border: 1px solid #cbcbcb;
color: #363636;
border-radius: 3px;
}
#tests thead {
background: #F5F5F5;
}
#tests tr {
border: 1px solid #ccc;
}
#tests td {
padding-left: 8px;
}
#tests .success:nth-child(2n) {
background: #F5F5F5;
}
#tests .failure {
background: #FF9E9E;
}
#tests table .skipped {
background: #AA82FF;
}
#tests .success {
color: #949494;
}
#tests .failure .test-title {
font-weight: bold;
margin-top: 5px;
}
#tests .stack {
margin-top: 4px;
padding-left: 15px;
margin-bottom: 12px;
font: 12px monaco, monospace;
white-space: pre;
line-height: 15px;
}
.hide {
position: absolute;
left: -9999em;
}
.show {
position: relative;
}
#filters {
width: 75%;
margin-top: 25px;
}
#filters label {
margin-right: 10px;
}
</style>
</head>
<body>
<div id="tests">
<h1>Test Report</h1>
<div class="stats high">
<div class="failures">0</div>
<div class="skipped">0</div>
<div class="test-count">36</div>
<div class="duration">680</div>
</div>
<div id="filters">
<input type="checkbox" checked="" onchange="filter(this)" value="success" id="show-success"><label for="show-success">Show Success</label></input>
<input type="checkbox" checked="" onchange="filter(this)" value="failure" id="show-failure"><label for="show-failure">Show Failure</label></input>
<input type="checkbox" checked="" onchange="filter(this)" value="matching_objects" id="show-matching_objects"><label for="show-matching_objects">matching objects</label></input>
<input type="checkbox" checked="" onchange="filter(this)" value="callback-friendly_JSON.parse" id="show-callback-friendly_JSON.parse"><label for="show-callback-friendly_JSON.parse">callback-friendly JSON.parse</label></input>
<input type="checkbox" checked="" onchange="filter(this)" value="can_freeze" id="show-can_freeze"><label for="show-can_freeze">can freeze</label></input>
<input type="checkbox" checked="" onchange="filter(this)" value="a_large_test,_>1024_objects" id="show-a_large_test,_>1024_objects"><label for="show-a_large_test,_>1024_objects">a large test, >1024 objects</label></input>
<input type="checkbox" checked="" onchange="filter(this)" value="an_exact_multiple_test,_1024_objects" id="show-an_exact_multiple_test,_1024_objects"><label for="show-an_exact_multiple_test,_1024_objects">an exact multiple test, 1024 objects</label></input>
<input type="checkbox" checked="" onchange="filter(this)" value="zipped_pft_file" id="show-zipped_pft_file"><label for="show-zipped_pft_file">zipped pft file</label></input>
<input type="checkbox" checked="" onchange="filter(this)" value="create_objects" id="show-create_objects"><label for="show-create_objects">create objects</label></input>
<input type="checkbox" checked="" onchange="filter(this)" value="can_add_and_find_objects" id="show-can_add_and_find_objects"><label for="show-can_add_and_find_objects">can add and find objects</label></input>
<input type="checkbox" checked="" onchange="filter(this)" value="invalid_file" id="show-invalid_file"><label for="show-invalid_file">invalid file</label></input>
<input type="checkbox" checked="" onchange="filter(this)" value="thaw_errors" id="show-thaw_errors"><label for="show-thaw_errors">thaw errors</label></input>
</div>
<table>
<thead>
<tr>
<th>ID</th>
<th>Title</th>
<th>Duration (ms)</th>
</tr>
</thead>
<tbody>
<tr class="show matching_objects success">
<td class="test-id">1</td>
<td class="test-title">matching objects makes a matcher
</td>
<td class="test-duration">10</td>
</tr>
<tr class="show callback-friendly_JSON.parse success">
<td class="test-id">2</td>
<td class="test-title">callback-friendly JSON.parse doesn't throw an exception
</td>
<td class="test-duration">1</td>
</tr>
<tr class="show can_freeze success">
<td class="test-id">3</td>
<td class="test-title">can freeze can freeze an object to a file
</td>
<td class="test-duration">56</td>
</tr>
<tr class="show can_freeze success">
<td class="test-id">4</td>
<td class="test-title">can freeze can freeze an object to a file
</td>
<td class="test-duration">7</td>
</tr>
<tr class="show a_large_test,_>1024_objects success">
<td class="test-id">5</td>
<td class="test-title">a large test, >1024 objects can find first object in first bag
</td>
<td class="test-duration">3</td>
</tr>
<tr class="show a_large_test,_>1024_objects success">
<td class="test-id">6</td>
<td class="test-title">a large test, >1024 objects can find an object twice
</td>
<td class="test-duration">4</td>
</tr>
<tr class="show a_large_test,_>1024_objects success">
<td class="test-id">7</td>
<td class="test-title">a large test, >1024 objects errors on missing object
</td>
<td class="test-duration">3</td>
</tr>
<tr class="show a_large_test,_>1024_objects success">
<td class="test-id">8</td>
<td class="test-title">a large test, >1024 objects can find last object in first bag
</td>
<td class="test-duration">3</td>
</tr>
<tr class="show a_large_test,_>1024_objects success">
<td class="test-id">9</td>
<td class="test-title">a large test, >1024 objects can find first object in second bag
</td>
<td class="test-duration">3</td>
</tr>
<tr class="show a_large_test,_>1024_objects success">
<td class="test-id">10</td>
<td class="test-title">a large test, >1024 objects can find first object in second bag
</td>
<td class="test-duration">4</td>
</tr>
<tr class="show a_large_test,_>1024_objects success">
<td class="test-id">11</td>
<td class="test-title">a large test, >1024 objects can find first object in last bag
</td>
<td class="test-duration">3</td>
</tr>
<tr class="show a_large_test,_>1024_objects success">
<td class="test-id">12</td>
<td class="test-title">a large test, >1024 objects can search for indexed term
</td>
<td class="test-duration">6</td>
</tr>
<tr class="show a_large_test,_>1024_objects success">
<td class="test-id">13</td>
<td class="test-title">a large test, >1024 objects can search for missing term
</td>
<td class="test-duration">37</td>
</tr>
<tr class="show a_large_test,_>1024_objects success">
<td class="test-id">14</td>
<td class="test-title">a large test, >1024 objects can find last object in last bag
</td>
<td class="test-duration">2</td>
</tr>
<tr class="show a_large_test,_>1024_objects success">
<td class="test-id">15</td>
<td class="test-title">a large test, >1024 objects can find range across bags
</td>
<td class="test-duration">6</td>
</tr>
<tr class="show a_large_test,_>1024_objects success">
<td class="test-id">16</td>
<td class="test-title">a large test, >1024 objects can find range with invalid endpoints (across bags)
</td>
<td class="test-duration">4</td>
</tr>
<tr class="show a_large_test,_>1024_objects success">
<td class="test-id">17</td>
<td class="test-title">a large test, >1024 objects can find range with invalid endpoints (outside total range)
</td>
<td class="test-duration">311</td>
</tr>
<tr class="show an_exact_multiple_test,_1024_objects success">
<td class="test-id">18</td>
<td class="test-title">an exact multiple test, 1024 objects can find first object in only bag
</td>
<td class="test-duration">2</td>
</tr>
<tr class="show an_exact_multiple_test,_1024_objects success">
<td class="test-id">19</td>
<td class="test-title">an exact multiple test, 1024 objects can find last object in only bag
</td>
<td class="test-duration">3</td>
</tr>
<tr class="show an_exact_multiple_test,_1024_objects success">
<td class="test-id">20</td>
<td class="test-title">an exact multiple test, 1024 objects can search bag
</td>
<td class="test-duration">2</td>
</tr>
<tr class="show an_exact_multiple_test,_1024_objects success">
<td class="test-id">21</td>
<td class="test-title">an exact multiple test, 1024 objects can search for bad term
</td>
<td class="test-duration">1</td>
</tr>
<tr class="show an_exact_multiple_test,_1024_objects success">
<td class="test-id">22</td>
<td class="test-title">an exact multiple test, 1024 objects can find mid range
</td>
<td class="test-duration">17</td>
</tr>
<tr class="show zipped_pft_file success">
<td class="test-id">23</td>
<td class="test-title">zipped pft file can find small range
</td>
<td class="test-duration">5</td>
</tr>
<tr class="show create_objects success">
<td class="test-id">24</td>
<td class="test-title">create objects creates an object with new
</td>
<td class="test-duration">1</td>
</tr>
<tr class="show create_objects success">
<td class="test-id">25</td>
<td class="test-title">create objects creates an object without new
</td>
<td class="test-duration">0</td>
</tr>
<tr class="show can_add_and_find_objects success">
<td class="test-id">26</td>
<td class="test-title">can add and find objects stores an object once added
</td>
<td class="test-duration">1</td>
</tr>
<tr class="show can_add_and_find_objects success">
<td class="test-id">27</td>
<td class="test-title">can add and find objects handles missing fts
</td>
<td class="test-duration">0</td>
</tr>
<tr class="show can_add_and_find_objects success">
<td class="test-id">28</td>
<td class="test-title">can add and find objects handles present fts
</td>
<td class="test-duration">0</td>
</tr>
<tr class="show can_add_and_find_objects success">
<td class="test-id">29</td>
<td class="test-title">can add and find objects handles missing fts & desc
</td>
<td class="test-duration">1</td>
</tr>
<tr class="show can_add_and_find_objects success">
<td class="test-id">30</td>
<td class="test-title">can add and find objects throws when adding a bad object
</td>
<td class="test-duration">1</td>
</tr>
<tr class="show can_add_and_find_objects success">
<td class="test-id">31</td>
<td class="test-title">can add and find objects errors when obj not found
</td>
<td class="test-duration">0</td>
</tr>
<tr class="show zipped_pft_file success">
<td class="test-id">32</td>
<td class="test-title">zipped pft file can be thawed
</td>
<td class="test-duration">7</td>
</tr>
<tr class="show invalid_file success">
<td class="test-id">33</td>
<td class="test-title">invalid file reports error on thaw
</td>
<td class="test-duration">1</td>
</tr>
<tr class="show thaw_errors success">
<td class="test-id">34</td>
<td class="test-title">thaw errors errors on invalid version
</td>
<td class="test-duration">0</td>
</tr>
<tr class="show thaw_errors success">
<td class="test-id">35</td>
<td class="test-title">thaw errors errors on nonexistent file
</td>
<td class="test-duration">1</td>
</tr>
<tr class="show thaw_errors success">
<td class="test-id">36</td>
<td class="test-title">thaw errors errors on invalid format
</td>
<td class="test-duration">0</td>
</tr>
</tbody>
</table>
</div>
<div id="coverage">
<h1>Code Coverage Report</h1>
<div id="menu">
<li><a href="#tests">Test Report</a></li>
<li><a href="#coverage">Coverage Report</a></li>
<li>
<span class="cov high">100</span>
<a href="#index.js"><span class="basename">index.js</span></a>
</li>
<li>
<span class="cov high">100</span>
<a href="#lib/add.js"><span class="dirname">lib/</span><span class="basename">add.js</span></a>
</li>
<li>
<span class="cov high">100</span>
<a href="#lib/clean.js"><span class="dirname">lib/</span><span class="basename">clean.js</span></a>
</li>
<li>
<span class="cov high">92.31</span>
<a href="#lib/findIndex.js"><span class="dirname">lib/</span><span class="basename">findIndex.js</span></a>
</li>
<li>
<span class="cov high">95.56</span>
<a href="#lib/findRange.js"><span class="dirname">lib/</span><span class="basename">findRange.js</span></a>
</li>
<li>
<span class="cov high">100</span>
<a href="#lib/freeze.js"><span class="dirname">lib/</span><span class="basename">freeze.js</span></a>
</li>
<li>
<span class="cov high">100</span>
<a href="#lib/fts.js"><span class="dirname">lib/</span><span class="basename">fts.js</span></a>
</li>
<li>
<span class="cov high">100</span>
<a href="#lib/get.js"><span class="dirname">lib/</span><span class="basename">get.js</span></a>
</li>
<li>
<span class="cov high">100</span>
<a href="#lib/indexConfig.js"><span class="dirname">lib/</span><span class="basename">indexConfig.js</span></a>
</li>
<li>
<span class="cov high">100</span>
<a href="#lib/loadIndexes.js"><span class="dirname">lib/</span><span class="basename">loadIndexes.js</span></a>
</li>
<li>
<span class="cov high">98.46</span>
<a href="#lib/makeIndex.js"><span class="dirname">lib/</span><span class="basename">makeIndex.js</span></a>
</li>
<li>
<span class="cov high">100</span>
<a href="#lib/pure-fts.js"><span class="dirname">lib/</span><span class="basename">pure-fts.js</span></a>
</li>
<li>
<span class="cov high">100</span>
<a href="#lib/search.js"><span class="dirname">lib/</span><span class="basename">search.js</span></a>
</li>
<li>
<span class="cov high">98.23</span>
<a href="#lib/thaw.js"><span class="dirname">lib/</span><span class="basename">thaw.js</span></a>
</li>
</div>
<div class="stats high">
<div class="percentage">98.63%</div>
<div class="sloc">512</div>
<div class="hits">505</div>
<div class="misses">7</div>
</div>
<div id="files">
<div class="file">
<h2 id="index.js">index.js</h2>
<div class="stats high">
<div class="percentage">100%</div>
<div class="sloc">2</div>
<div class="hits">2</div>
<div class="misses">0</div>
</div>
<table>
<thead>
<tr>
<th>Line</th>
<th>Hits</th>
<th>Source</th>
</tr>
</thead>
<tbody>
<tr class="hit">
<td class="line">1</td>
<td class="hits">1</td>
<td class="source">'use strict';</td>
</tr>
<tr class="hit">
<td class="line">2</td>
<td class="hits"></td>
<td class="source"></td>
</tr>
<tr class="hit">
<td class="line">3</td>
<td class="hits">1</td>
<td class="source">module.exports = require('./lib/pure-fts.js');</td>
</tr>
<tr class="hit">
<td class="line">4</td>
<td class="hits"></td>
<td class="source"></td>
</tr>
</tbody>
</table>
</div>
<div class="file">
<h2 id="lib/add.js">lib/add.js</h2>
<div class="stats high">
<div class="percentage">100%</div>
<div class="sloc">46</div>
<div class="hits">46</div>
<div class="misses">0</div>
</div>
<table>
<thead>
<tr>
<th>Line</th>
<th>Hits</th>
<th>Source</th>
</tr>
</thead>
<tbody>
<tr class="hit">
<td class="line">1</td>
<td class="hits">1</td>
<td class="source">'use strict';</td>
</tr>
<tr class="hit">
<td class="line">2</td>
<td class="hits"></td>
<td class="source"></td>
</tr>
<tr class="hit">
<td class="line">3</td>
<td class="hits">1</td>
<td class="source">var stopWords = {</td>
</tr>
<tr class="hit">
<td class="line">4</td>
<td class="hits"></td>
<td class="source"> 'constructor': true,</td>
</tr>
<tr class="hit">
<td class="line">5</td>
<td class="hits"></td>
<td class="source"> 'toString': true,</td>
</tr>
<tr class="hit">
<td class="line">6</td>
<td class="hits"></td>
<td class="source"> 'hasOwnProperty': true,</td>
</tr>
<tr class="hit">
<td class="line">7</td>
<td class="hits"></td>
<td class="source"> '__proto__': true,</td>
</tr>
<tr class="hit">
<td class="line">8</td>
<td class="hits"></td>
<td class="source"> 'valueOf': true,</td>
</tr>
<tr class="hit">
<td class="line">9</td>
<td class="hits"></td>
<td class="source"> 'npm': true</td>
</tr>
<tr class="hit">
<td class="line">10</td>
<td class="hits"></td>
<td class="source">};</td>
</tr>
<tr class="hit">
<td class="line">11</td>
<td class="hits"></td>
<td class="source"></td>
</tr>
<tr class="hit">
<td class="line">12</td>
<td class="hits">1</td>
<td class="source">function is_stopword(word) {</td>
</tr>
<tr class="hit">
<td class="line">13</td>
<td class="hits">30147</td>
<td class="source"> if (word.length <= 3) {</td>
</tr>
<tr class="hit">
<td class="line">14</td>
<td class="hits">12061</td>
<td class="source"> return true;</td>
</tr>
<tr class="hit">
<td class="line">15</td>
<td class="hits"></td>
<td class="source"> }</td>
</tr>
<tr class="hit">
<td class="line">16</td>
<td class="hits"></td>
<td class="source"></td>
</tr>
<tr class="hit">
<td class="line">17</td>
<td class="hits">18086</td>
<td class="source"> return stopWords[word];</td>
</tr>
<tr class="hit">
<td class="line">18</td>
<td class="hits"></td>
<td class="source">}</td>
</tr>
<tr class="hit">
<td class="line">19</td>
<td class="hits"></td>
<td class="source"></td>
</tr>
<tr class="hit">
<td class="line">20</td>
<td class="hits">1</td>
<td class="source">function is_not_stopword(word) {</td>
</tr>
<tr class="hit">
<td class="line">21</td>
<td class="hits">18086</td>
<td class="source"> return !is_stopword(word);</td>
</tr>
<tr class="hit">
<td class="line">22</td>
<td class="hits"></td>
<td class="source">}</td>
</tr>
<tr class="hit">
<td class="line">23</td>
<td class="hits"></td>
<td class="source"></td>
</tr>
<tr class="hit">
<td class="line">24</td>
<td class="hits">1</td>
<td class="source">function addfts(purefts, term, name) {</td>
</tr>
<tr class="hit">
<td class="line">25</td>
<td class="hits">12061</td>
<td class="source"> if (is_stopword(term)) {</td>
</tr>
<tr class="hit">
<td class="line">26</td>
<td class="hits">6</td>
<td class="source"> return;</td>
</tr>
<tr class="hit">
<td class="line">27</td>
<td class="hits"></td>
<td class="source"> }</td>
</tr>
<tr class="hit">
<td class="line">28</td>
<td class="hits"></td>
<td class="source"></td>
</tr>
<tr class="hit">
<td class="line">29</td>
<td class="hits">12055</td>
<td class="source"> purefts.fts[term] = purefts.fts[term] || {</td>
</tr>
<tr class="hit">
<td class="line">30</td>
<td class="hits"></td>
<td class="source"> name: term,</td>
</tr>
<tr class="hit">
<td class="line">31</td>
<td class="hits"></td>
<td class="source"> hits: []</td>
</tr>
<tr class="hit">
<td class="line">32</td>
<td class="hits"></td>
<td class="source"> };</td>
</tr>
<tr class="hit">
<td class="line">33</td>
<td class="hits"></td>
<td class="source"></td>
</tr>
<tr class="hit">
<td class="line">34</td>
<td class="hits">12055</td>
<td class="source"> purefts.fts[term].hits.push(name);</td>
</tr>
<tr class="hit">
<td class="line">35</td>
<td class="hits"></td>
<td class="source">}</td>
</tr>
<tr class="hit">
<td class="line">36</td>
<td class="hits"></td>
<td class="source"></td>
</tr>
<tr class="hit">
<td class="line">37</td>
<td class="hits">1</td>
<td class="source">function add(obj) {</td>
</tr>
<tr class="hit">
<td class="line">38</td>
<td class="hits">6032</td>
<td class="source"> if (!obj || !obj.name) {</td>
</tr>
<tr class="hit">
<td class="line">39</td>
<td class="hits">2</td>
<td class="source"> throw new Error("Cannot add object %j: no `name` member", obj);</td>
</tr>
<tr class="hit">
<td class="line">40</td>
<td class="hits"></td>
<td class="source"> }</td>
</tr>
<tr class="hit">
<td class="line">41</td>
<td class="hits"></td>
<td class="source"></td>
</tr>
<tr class="hit">
<td class="line">42</td>
<td class="hits">6030</td>
<td class="source"> var purefts = this;</td>
</tr>
<tr class="hit">
<td class="line">43</td>
<td class="hits"></td>
<td class="source"></td>
</tr>
<tr class="hit">
<td class="line">44</td>
<td class="hits">6030</td>
<td class="source"> purefts.keys.push(obj.name);</td>
</tr>
<tr class="hit">
<td class="line">45</td>
<td class="hits"></td>
<td class="source"></td>
</tr>
<tr class="hit">
<td class="line">46</td>
<td class="hits"></td>
<td class="source"> // add fts entries</td>
</tr>
<tr class="hit">
<td class="line">47</td>
<td class="hits">6030</td>
<td class="source"> if (!obj.fts) {</td>
</tr>
<tr class="hit">
<td class="line">48</td>
<td class="hits">3</td>
<td class="source"> obj.fts = obj.description || "";</td>
</tr>
<tr class="hit">
<td class="line">49</td>
<td class="hits"></td>
<td class="source"> }</td>
</tr>
<tr class="hit">
<td class="line">50</td>
<td class="hits"></td>
<td class="source"></td>
</tr>
<tr class="hit">
<td class="line">51</td>
<td class="hits">6030</td>
<td class="source"> obj.fts.split(' ').filter(is_not_stopword)</td>
</tr>
<tr class="hit">
<td class="line">52</td>
<td class="hits"></td>
<td class="source"> .forEach(function (term) {</td>
</tr>
<tr class="hit">
<td class="line">53</td>
<td class="hits">6031</td>
<td class="source"> addfts(purefts, term, obj.name);</td>
</tr>
<tr class="hit">
<td class="line">54</td>
<td class="hits"></td>
<td class="source"> });</td>
</tr>
<tr class="hit">
<td class="line">55</td>
<td class="hits">6030</td>
<td class="source"> addfts(purefts, obj.name, obj.name);</td>
</tr>
<tr class="hit">
<td class="line">56</td>
<td class="hits"></td>
<td class="source"></td>
</tr>
<tr class="hit">
<td class="line">57</td>
<td class="hits">6030</td>
<td class="source"> purefts.values[obj.name] = obj;</td>
</tr>
<tr class="hit">
<td class="line">58</td>
<td class="hits"></td>
<td class="source">}</td>
</tr>
<tr class="hit">
<td class="line">59</td>
<td class="hits"></td>
<td class="source"></td>
</tr>
<tr class="hit">
<td class="line">60</td>
<td class="hits">1</td>
<td class="source">module.exports = add;</td>
</tr>
<tr class="hit">
<td class="line">61</td>
<td class="hits"></td>
<td class="source"></td>
</tr>
</tbody>
</table>
</div>
<div class="file">
<h2 id="lib/clean.js">lib/clean.js</h2>
<div class="stats high">
<div class="percentage">100%</div>
<div class="sloc">7</div>
<div class="hits">7</div>
<div class="misses">0</div>
</div>
<table>
<thead>
<tr>
<th>Line</th>
<th>Hits</th>
<th>Source</th>
</tr>
</thead>
<tbody>
<tr class="hit">
<td class="line">1</td>
<td class="hits">1</td>
<td class="source">'use strict';</td>
</tr>
<tr class="hit">
<td class="line">2</td>
<td class="hits"></td>
<td class="source"></td>
</tr>
<tr class="hit">
<td class="line">3</td>
<td class="hits">1</td>
<td class="source">function clean() {</td>
</tr>
<tr class="hit">
<td class="line">4</td>
<td class="hits">4</td>
<td class="source"> var purefts = this;</td>
</tr>
<tr class="hit">
<td class="line">5</td>
<td class="hits"></td>
<td class="source"></td>
</tr>
<tr class="hit">
<td class="line">6</td>
<td class="hits">4</td>
<td class="source"> purefts.keys = purefts.keys.sort();</td>
</tr>
<tr class="hit">
<td class="line">7</td>
<td class="hits"></td>
<td class="source"></td>
</tr>
<tr class="hit">
<td class="line">8</td>
<td class="hits">4</td>
<td class="source"> return;</td>
</tr>
<tr class="hit">
<td class="line">9</td>
<td class="hits"></td>
<td class="source">}</td>
</tr>
<tr class="hit">
<td class="line">10</td>
<td class="hits"></td>
<td class="source"></td>
</tr>
<tr class="hit">
<td class="line">11</td>
<td class="hits">1</td>
<td class="source">module.exports = clean;</td>
</tr>
<tr class="hit">
<td class="line">12</td>
<td class="hits"></td>
<td class="source"></td>
</tr>
</tbody>
</table>
</div>
<div class="file">
<h2 id="lib/findIndex.js">lib/findIndex.js</h2>
<div class="stats high">
<div class="percentage">92.31%</div>
<div class="sloc">26</div>
<div class="hits">24</div>
<div class="misses">2</div>
</div>
<table>
<thead>
<tr>
<th>Line</th>
<th>Hits</th>
<th>Source</th>
</tr>
</thead>
<tbody>
<tr class="hit">
<td class="line">1</td>
<td class="hits">1</td>
<td class="source">'use strict';</td>
</tr>
<tr class="hit">
<td class="line">2</td>
<td class="hits"></td>
<td class="source"></td>
</tr>
<tr class="hit">
<td class="line">3</td>
<td class="hits">1</td>
<td class="source">var bsearch = require('binary-search');</td>
</tr>
<tr class="hit">
<td class="line">4</td>
<td class="hits"></td>
<td class="source"></td>
</tr>
<tr class="hit">
<td class="line">5</td>
<td class="hits">1</td>
<td class="source">function findIndex(config, name, cb) {</td>
</tr>
<tr class="hit">
<td class="line">6</td>
<td class="hits">98</td>
<td class="source"> var bag_idx,</td>
</tr>
<tr class="hit">
<td class="line">7</td>
<td class="hits"></td>
<td class="source"> bag,</td>
</tr>
<tr class="hit">
<td class="line">8</td>
<td class="hits"></td>
<td class="source"> idx;</td>
</tr>
<tr class="hit">
<td class="line">9</td>
<td class="hits"></td>
<td class="source"></td>
</tr>
<tr class="hit">
<td class="line">10</td>
<td class="hits">98</td>
<td class="source"> bag_idx = bsearch(config.index, name, function (a, b) {</td>
</tr>
<tr class="hit">
<td class="line">11</td>
<td class="hits">513</td>
<td class="source"> return a.last < b ? -1 : (a.first > b ? 1 : 0);</td>
</tr>
<tr class="hit">
<td class="line">12</td>
<td class="hits"></td>
<td class="source"> });</td>
</tr>
<tr class="hit">
<td class="line">13</td>
<td class="hits"></td>
<td class="source"></td>
</tr>
<tr class="hit">