From cba29e6aae637b04ff6eaf28f74bc15b6242b9ea Mon Sep 17 00:00:00 2001 From: Adam Mathes Date: Mon, 16 Feb 2026 19:37:50 -0800 Subject: Remove legacy V2 React frontend and update build/test scripts to focus on Vanilla JS (V3) --- frontend/coverage/base.css | 224 ------ frontend/coverage/block-navigation.js | 87 --- frontend/coverage/clover.xml | 385 ---------- frontend/coverage/coverage-final.json | 15 - frontend/coverage/favicon.png | Bin 445 -> 0 bytes frontend/coverage/index.html | 131 ---- frontend/coverage/prettify.css | 1 - frontend/coverage/prettify.js | 2 - frontend/coverage/sort-arrow-sprite.png | Bin 138 -> 0 bytes frontend/coverage/sorter.js | 210 ------ frontend/coverage/src/App.css.html | 478 ------------ frontend/coverage/src/App.tsx.html | 505 ------------- frontend/coverage/src/components/FeedItem.css.html | 526 ------------- frontend/coverage/src/components/FeedItem.tsx.html | 430 ----------- .../coverage/src/components/FeedItems.css.html | 151 ---- .../coverage/src/components/FeedItems.tsx.html | 838 --------------------- frontend/coverage/src/components/FeedList.css.html | 724 ------------------ frontend/coverage/src/components/FeedList.tsx.html | 721 ------------------ frontend/coverage/src/components/Login.css.html | 274 ------- frontend/coverage/src/components/Login.tsx.html | 286 ------- frontend/coverage/src/components/Settings.css.html | 802 -------------------- frontend/coverage/src/components/Settings.tsx.html | 793 ------------------- frontend/coverage/src/components/index.html | 266 ------- frontend/coverage/src/index.html | 146 ---- 24 files changed, 7995 deletions(-) delete mode 100644 frontend/coverage/base.css delete mode 100644 frontend/coverage/block-navigation.js delete mode 100644 frontend/coverage/clover.xml delete mode 100644 frontend/coverage/coverage-final.json delete mode 100644 frontend/coverage/favicon.png delete mode 100644 frontend/coverage/index.html delete mode 100644 frontend/coverage/prettify.css delete mode 100644 frontend/coverage/prettify.js delete mode 100644 frontend/coverage/sort-arrow-sprite.png delete mode 100644 frontend/coverage/sorter.js delete mode 100644 frontend/coverage/src/App.css.html delete mode 100644 frontend/coverage/src/App.tsx.html delete mode 100644 frontend/coverage/src/components/FeedItem.css.html delete mode 100644 frontend/coverage/src/components/FeedItem.tsx.html delete mode 100644 frontend/coverage/src/components/FeedItems.css.html delete mode 100644 frontend/coverage/src/components/FeedItems.tsx.html delete mode 100644 frontend/coverage/src/components/FeedList.css.html delete mode 100644 frontend/coverage/src/components/FeedList.tsx.html delete mode 100644 frontend/coverage/src/components/Login.css.html delete mode 100644 frontend/coverage/src/components/Login.tsx.html delete mode 100644 frontend/coverage/src/components/Settings.css.html delete mode 100644 frontend/coverage/src/components/Settings.tsx.html delete mode 100644 frontend/coverage/src/components/index.html delete mode 100644 frontend/coverage/src/index.html (limited to 'frontend/coverage') diff --git a/frontend/coverage/base.css b/frontend/coverage/base.css deleted file mode 100644 index f418035..0000000 --- a/frontend/coverage/base.css +++ /dev/null @@ -1,224 +0,0 @@ -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; -} diff --git a/frontend/coverage/block-navigation.js b/frontend/coverage/block-navigation.js deleted file mode 100644 index 530d1ed..0000000 --- a/frontend/coverage/block-navigation.js +++ /dev/null @@ -1,87 +0,0 @@ -/* 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) > ` - - // Selector 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) { - if ( - document.getElementById('fileSearch') === document.activeElement && - document.activeElement != null - ) { - // if we're currently focused on the search input, we don't want to navigate - return; - } - - 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); diff --git a/frontend/coverage/clover.xml b/frontend/coverage/clover.xml deleted file mode 100644 index 8eba461..0000000 --- a/frontend/coverage/clover.xml +++ /dev/null @@ -1,385 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/frontend/coverage/coverage-final.json b/frontend/coverage/coverage-final.json deleted file mode 100644 index b8f97aa..0000000 --- a/frontend/coverage/coverage-final.json +++ /dev/null @@ -1,15 +0,0 @@ -{"/Users/adam/workspace/vibecode/neko/frontend/src/App.css": {"path":"/Users/adam/workspace/vibecode/neko/frontend/src/App.css","statementMap":{},"fnMap":{},"branchMap":{},"s":{},"f":{},"b":{},"meta":{"lastBranch":0,"lastFunction":0,"lastStatement":0,"seen":{}}} -,"/Users/adam/workspace/vibecode/neko/frontend/src/App.tsx": {"path":"/Users/adam/workspace/vibecode/neko/frontend/src/App.tsx","statementMap":{"0":{"start":{"line":9,"column":22},"end":{"line":9,"column":null}},"1":{"start":{"line":10,"column":8},"end":{"line":10,"column":null}},"2":{"start":{"line":12,"column":2},"end":{"line":22,"column":null}},"3":{"start":{"line":13,"column":4},"end":{"line":21,"column":null}},"4":{"start":{"line":15,"column":8},"end":{"line":19,"column":null}},"5":{"start":{"line":16,"column":10},"end":{"line":16,"column":null}},"6":{"start":{"line":18,"column":10},"end":{"line":18,"column":null}},"7":{"start":{"line":21,"column":19},"end":{"line":21,"column":33}},"8":{"start":{"line":24,"column":2},"end":{"line":26,"column":null}},"9":{"start":{"line":25,"column":4},"end":{"line":25,"column":null}},"10":{"start":{"line":28,"column":2},"end":{"line":30,"column":null}},"11":{"start":{"line":29,"column":4},"end":{"line":29,"column":null}},"12":{"start":{"line":32,"column":2},"end":{"line":32,"column":null}},"13":{"start":{"line":47,"column":42},"end":{"line":47,"column":null}},"14":{"start":{"line":49,"column":2},"end":{"line":59,"column":null}},"15":{"start":{"line":50,"column":25},"end":{"line":56,"column":null}},"16":{"start":{"line":51,"column":6},"end":{"line":55,"column":null}},"17":{"start":{"line":52,"column":8},"end":{"line":52,"column":null}},"18":{"start":{"line":54,"column":8},"end":{"line":54,"column":null}},"19":{"start":{"line":57,"column":4},"end":{"line":57,"column":null}},"20":{"start":{"line":58,"column":4},"end":{"line":58,"column":null}},"21":{"start":{"line":58,"column":17},"end":{"line":58,"column":null}},"22":{"start":{"line":61,"column":2},"end":{"line":98,"column":null}},"23":{"start":{"line":69,"column":27},"end":{"line":69,"column":null}},"24":{"start":{"line":78,"column":27},"end":{"line":78,"column":null}},"25":{"start":{"line":103,"column":24},"end":{"line":103,"column":null}},"26":{"start":{"line":104,"column":32},"end":{"line":104,"column":null}},"27":{"start":{"line":106,"column":25},"end":{"line":109,"column":null}},"28":{"start":{"line":107,"column":4},"end":{"line":107,"column":null}},"29":{"start":{"line":108,"column":4},"end":{"line":108,"column":null}},"30":{"start":{"line":111,"column":29},"end":{"line":114,"column":null}},"31":{"start":{"line":112,"column":4},"end":{"line":112,"column":null}},"32":{"start":{"line":113,"column":4},"end":{"line":113,"column":null}},"33":{"start":{"line":116,"column":19},"end":{"line":116,"column":null}},"34":{"start":{"line":118,"column":2},"end":{"line":136,"column":null}}},"fnMap":{"0":{"name":"RequireAuth","decl":{"start":{"line":8,"column":9},"end":{"line":8,"column":21}},"loc":{"start":{"line":8,"column":69},"end":{"line":33,"column":null}},"line":8},"1":{"name":"(anonymous_1)","decl":{"start":{"line":12,"column":12},"end":{"line":12,"column":18}},"loc":{"start":{"line":12,"column":18},"end":{"line":22,"column":5}},"line":12},"2":{"name":"(anonymous_2)","decl":{"start":{"line":14,"column":12},"end":{"line":14,"column":13}},"loc":{"start":{"line":14,"column":21},"end":{"line":20,"column":7}},"line":14},"3":{"name":"(anonymous_3)","decl":{"start":{"line":21,"column":13},"end":{"line":21,"column":19}},"loc":{"start":{"line":21,"column":19},"end":{"line":21,"column":33}},"line":21},"4":{"name":"Dashboard","decl":{"start":{"line":46,"column":9},"end":{"line":46,"column":19}},"loc":{"start":{"line":46,"column":81},"end":{"line":100,"column":null}},"line":46},"5":{"name":"(anonymous_5)","decl":{"start":{"line":49,"column":12},"end":{"line":49,"column":18}},"loc":{"start":{"line":49,"column":18},"end":{"line":59,"column":5}},"line":49},"6":{"name":"(anonymous_6)","decl":{"start":{"line":50,"column":25},"end":{"line":50,"column":31}},"loc":{"start":{"line":50,"column":31},"end":{"line":56,"column":null}},"line":50},"7":{"name":"(anonymous_7)","decl":{"start":{"line":58,"column":11},"end":{"line":58,"column":17}},"loc":{"start":{"line":58,"column":17},"end":{"line":58,"column":null}},"line":58},"8":{"name":"(anonymous_8)","decl":{"start":{"line":69,"column":21},"end":{"line":69,"column":27}},"loc":{"start":{"line":69,"column":27},"end":{"line":69,"column":null}},"line":69},"9":{"name":"(anonymous_9)","decl":{"start":{"line":78,"column":21},"end":{"line":78,"column":27}},"loc":{"start":{"line":78,"column":27},"end":{"line":78,"column":null}},"line":78},"10":{"name":"App","decl":{"start":{"line":102,"column":9},"end":{"line":102,"column":15}},"loc":{"start":{"line":102,"column":15},"end":{"line":138,"column":null}},"line":102},"11":{"name":"(anonymous_11)","decl":{"start":{"line":106,"column":25},"end":{"line":106,"column":26}},"loc":{"start":{"line":106,"column":47},"end":{"line":109,"column":null}},"line":106},"12":{"name":"(anonymous_12)","decl":{"start":{"line":111,"column":29},"end":{"line":111,"column":30}},"loc":{"start":{"line":111,"column":55},"end":{"line":114,"column":null}},"line":111}},"branchMap":{"0":{"loc":{"start":{"line":15,"column":8},"end":{"line":19,"column":null}},"type":"if","locations":[{"start":{"line":15,"column":8},"end":{"line":19,"column":null}},{"start":{"line":17,"column":15},"end":{"line":19,"column":null}}],"line":15},"1":{"loc":{"start":{"line":24,"column":2},"end":{"line":26,"column":null}},"type":"if","locations":[{"start":{"line":24,"column":2},"end":{"line":26,"column":null}},{"start":{},"end":{}}],"line":24},"2":{"loc":{"start":{"line":28,"column":2},"end":{"line":30,"column":null}},"type":"if","locations":[{"start":{"line":28,"column":2},"end":{"line":30,"column":null}},{"start":{},"end":{}}],"line":28},"3":{"loc":{"start":{"line":51,"column":6},"end":{"line":55,"column":null}},"type":"if","locations":[{"start":{"line":51,"column":6},"end":{"line":55,"column":null}},{"start":{"line":53,"column":13},"end":{"line":55,"column":null}}],"line":51},"4":{"loc":{"start":{"line":63,"column":30},"end":{"line":63,"column":83}},"type":"cond-expr","locations":[{"start":{"line":63,"column":47},"end":{"line":63,"column":67}},{"start":{"line":63,"column":67},"end":{"line":63,"column":83}}],"line":63},"5":{"loc":{"start":{"line":66,"column":10},"end":{"line":73,"column":null}},"type":"binary-expr","locations":[{"start":{"line":66,"column":10},"end":{"line":66,"column":29}},{"start":{"line":66,"column":29},"end":{"line":66,"column":null}},{"start":{"line":67,"column":10},"end":{"line":73,"column":null}}],"line":66},"6":{"loc":{"start":{"line":70,"column":19},"end":{"line":70,"column":null}},"type":"cond-expr","locations":[{"start":{"line":70,"column":36},"end":{"line":70,"column":53}},{"start":{"line":70,"column":53},"end":{"line":70,"column":null}}],"line":70},"7":{"loc":{"start":{"line":75,"column":9},"end":{"line":79,"column":null}},"type":"binary-expr","locations":[{"start":{"line":75,"column":9},"end":{"line":75,"column":null}},{"start":{"line":76,"column":10},"end":{"line":79,"column":null}}],"line":75},"8":{"loc":{"start":{"line":81,"column":47},"end":{"line":81,"column":77}},"type":"cond-expr","locations":[{"start":{"line":81,"column":64},"end":{"line":81,"column":69}},{"start":{"line":81,"column":69},"end":{"line":81,"column":77}}],"line":81},"9":{"loc":{"start":{"line":103,"column":37},"end":{"line":103,"column":82}},"type":"binary-expr","locations":[{"start":{"line":103,"column":37},"end":{"line":103,"column":75}},{"start":{"line":103,"column":75},"end":{"line":103,"column":82}}],"line":103},"10":{"loc":{"start":{"line":104,"column":45},"end":{"line":104,"column":97}},"type":"binary-expr","locations":[{"start":{"line":104,"column":45},"end":{"line":104,"column":88}},{"start":{"line":104,"column":88},"end":{"line":104,"column":97}}],"line":104},"11":{"loc":{"start":{"line":116,"column":19},"end":{"line":116,"column":null}},"type":"cond-expr","locations":[{"start":{"line":116,"column":64},"end":{"line":116,"column":72}},{"start":{"line":116,"column":72},"end":{"line":116,"column":null}}],"line":116}},"s":{"0":2,"1":2,"2":2,"3":1,"4":1,"5":1,"6":0,"7":0,"8":2,"9":1,"10":1,"11":0,"12":1,"13":1,"14":1,"15":1,"16":0,"17":0,"18":0,"19":1,"20":1,"21":1,"22":1,"23":0,"24":0,"25":2,"26":2,"27":2,"28":0,"29":0,"30":2,"31":0,"32":0,"33":2,"34":2},"f":{"0":2,"1":1,"2":1,"3":0,"4":1,"5":1,"6":0,"7":1,"8":0,"9":0,"10":2,"11":0,"12":0},"b":{"0":[1,0],"1":[1,1],"2":[0,1],"3":[0,0],"4":[1,0],"5":[1,1,0],"6":[0,0],"7":[1,1],"8":[1,0],"9":[2,2],"10":[2,2],"11":[2,0]},"meta":{"lastBranch":12,"lastFunction":13,"lastStatement":35,"seen":{"f:8:9:8:21":0,"s:9:22:9:Infinity":0,"s:10:8:10:Infinity":1,"s:12:2:22:Infinity":2,"f:12:12:12:18":1,"s:13:4:21:Infinity":3,"f:14:12:14:13":2,"b:15:8:19:Infinity:17:15:19:Infinity":0,"s:15:8:19:Infinity":4,"s:16:10:16:Infinity":5,"s:18:10:18:Infinity":6,"f:21:13:21:19":3,"s:21:19:21:33":7,"b:24:2:26:Infinity:undefined:undefined:undefined:undefined":1,"s:24:2:26:Infinity":8,"s:25:4:25:Infinity":9,"b:28:2:30:Infinity:undefined:undefined:undefined:undefined":2,"s:28:2:30:Infinity":10,"s:29:4:29:Infinity":11,"s:32:2:32:Infinity":12,"f:46:9:46:19":4,"s:47:42:47:Infinity":13,"s:49:2:59:Infinity":14,"f:49:12:49:18":5,"s:50:25:56:Infinity":15,"f:50:25:50:31":6,"b:51:6:55:Infinity:53:13:55:Infinity":3,"s:51:6:55:Infinity":16,"s:52:8:52:Infinity":17,"s:54:8:54:Infinity":18,"s:57:4:57:Infinity":19,"s:58:4:58:Infinity":20,"f:58:11:58:17":7,"s:58:17:58:Infinity":21,"s:61:2:98:Infinity":22,"b:63:47:63:67:63:67:63:83":4,"b:66:10:66:29:66:29:66:Infinity:67:10:73:Infinity":5,"f:69:21:69:27":8,"s:69:27:69:Infinity":23,"b:70:36:70:53:70:53:70:Infinity":6,"b:75:9:75:Infinity:76:10:79:Infinity":7,"f:78:21:78:27":9,"s:78:27:78:Infinity":24,"b:81:64:81:69:81:69:81:77":8,"f:102:9:102:15":10,"s:103:24:103:Infinity":25,"b:103:37:103:75:103:75:103:82":9,"s:104:32:104:Infinity":26,"b:104:45:104:88:104:88:104:97":10,"s:106:25:109:Infinity":27,"f:106:25:106:26":11,"s:107:4:107:Infinity":28,"s:108:4:108:Infinity":29,"s:111:29:114:Infinity":30,"f:111:29:111:30":12,"s:112:4:112:Infinity":31,"s:113:4:113:Infinity":32,"s:116:19:116:Infinity":33,"b:116:64:116:72:116:72:116:Infinity":11,"s:118:2:136:Infinity":34}}} -,"/Users/adam/workspace/vibecode/neko/frontend/src/utils.ts": {"path":"/Users/adam/workspace/vibecode/neko/frontend/src/utils.ts","statementMap":{"0":{"start":{"line":2,"column":18},"end":{"line":2,"column":null}},"1":{"start":{"line":3,"column":18},"end":{"line":3,"column":null}},"2":{"start":{"line":4,"column":4},"end":{"line":4,"column":null}},"3":{"start":{"line":4,"column":28},"end":{"line":4,"column":null}},"4":{"start":{"line":12,"column":19},"end":{"line":12,"column":null}},"5":{"start":{"line":13,"column":28},"end":{"line":13,"column":null}},"6":{"start":{"line":15,"column":20},"end":{"line":15,"column":null}},"7":{"start":{"line":17,"column":4},"end":{"line":22,"column":null}},"8":{"start":{"line":18,"column":22},"end":{"line":18,"column":null}},"9":{"start":{"line":19,"column":8},"end":{"line":21,"column":null}},"10":{"start":{"line":20,"column":12},"end":{"line":20,"column":null}},"11":{"start":{"line":27,"column":4},"end":{"line":31,"column":null}}},"fnMap":{"0":{"name":"getCookie","decl":{"start":{"line":1,"column":16},"end":{"line":1,"column":26}},"loc":{"start":{"line":1,"column":60},"end":{"line":5,"column":null}},"line":1},"1":{"name":"apiFetch","decl":{"start":{"line":11,"column":22},"end":{"line":11,"column":31}},"loc":{"start":{"line":11,"column":96},"end":{"line":32,"column":null}},"line":11}},"branchMap":{"0":{"loc":{"start":{"line":4,"column":4},"end":{"line":4,"column":null}},"type":"if","locations":[{"start":{"line":4,"column":4},"end":{"line":4,"column":null}},{"start":{},"end":{}}],"line":4},"1":{"loc":{"start":{"line":12,"column":19},"end":{"line":12,"column":null}},"type":"binary-expr","locations":[{"start":{"line":12,"column":19},"end":{"line":12,"column":50}},{"start":{"line":12,"column":50},"end":{"line":12,"column":null}}],"line":12},"2":{"loc":{"start":{"line":15,"column":32},"end":{"line":15,"column":51}},"type":"binary-expr","locations":[{"start":{"line":15,"column":32},"end":{"line":15,"column":49}},{"start":{"line":15,"column":49},"end":{"line":15,"column":51}}],"line":15},"3":{"loc":{"start":{"line":17,"column":4},"end":{"line":22,"column":null}},"type":"if","locations":[{"start":{"line":17,"column":4},"end":{"line":22,"column":null}},{"start":{},"end":{}}],"line":17},"4":{"loc":{"start":{"line":19,"column":8},"end":{"line":21,"column":null}},"type":"if","locations":[{"start":{"line":19,"column":8},"end":{"line":21,"column":null}},{"start":{},"end":{}}],"line":19}},"s":{"0":14,"1":14,"2":14,"3":0,"4":54,"5":54,"6":54,"7":54,"8":14,"9":14,"10":0,"11":54},"f":{"0":14,"1":54},"b":{"0":[0,14],"1":[54,40],"2":[54,48],"3":[14,40],"4":[0,14]},"meta":{"lastBranch":5,"lastFunction":2,"lastStatement":12,"seen":{"f:1:16:1:26":0,"s:2:18:2:Infinity":0,"s:3:18:3:Infinity":1,"b:4:4:4:Infinity:undefined:undefined:undefined:undefined":0,"s:4:4:4:Infinity":2,"s:4:28:4:Infinity":3,"f:11:22:11:31":1,"s:12:19:12:Infinity":4,"b:12:19:12:50:12:50:12:Infinity":1,"s:13:28:13:Infinity":5,"s:15:20:15:Infinity":6,"b:15:32:15:49:15:49:15:51":2,"b:17:4:22:Infinity:undefined:undefined:undefined:undefined":3,"s:17:4:22:Infinity":7,"s:18:22:18:Infinity":8,"b:19:8:21:Infinity:undefined:undefined:undefined:undefined":4,"s:19:8:21:Infinity":9,"s:20:12:20:Infinity":10,"s:27:4:31:Infinity":11}}} -,"/Users/adam/workspace/vibecode/neko/frontend/src/components/FeedItem.css": {"path":"/Users/adam/workspace/vibecode/neko/frontend/src/components/FeedItem.css","statementMap":{},"fnMap":{},"branchMap":{},"s":{},"f":{},"b":{},"meta":{"lastBranch":0,"lastFunction":0,"lastStatement":0,"seen":{}}} -,"/Users/adam/workspace/vibecode/neko/frontend/src/components/FeedItem.tsx": {"path":"/Users/adam/workspace/vibecode/neko/frontend/src/components/FeedItem.tsx","statementMap":{"0":{"start":{"line":12,"column":22},"end":{"line":12,"column":null}},"1":{"start":{"line":13,"column":28},"end":{"line":13,"column":null}},"2":{"start":{"line":15,"column":2},"end":{"line":17,"column":null}},"3":{"start":{"line":16,"column":4},"end":{"line":16,"column":null}},"4":{"start":{"line":19,"column":21},"end":{"line":21,"column":null}},"5":{"start":{"line":20,"column":4},"end":{"line":20,"column":null}},"6":{"start":{"line":23,"column":21},"end":{"line":57,"column":null}},"7":{"start":{"line":24,"column":4},"end":{"line":24,"column":null}},"8":{"start":{"line":26,"column":25},"end":{"line":26,"column":null}},"9":{"start":{"line":27,"column":4},"end":{"line":27,"column":null}},"10":{"start":{"line":29,"column":4},"end":{"line":56,"column":null}},"11":{"start":{"line":41,"column":8},"end":{"line":43,"column":null}},"12":{"start":{"line":42,"column":10},"end":{"line":42,"column":null}},"13":{"start":{"line":44,"column":8},"end":{"line":44,"column":null}},"14":{"start":{"line":49,"column":8},"end":{"line":49,"column":null}},"15":{"start":{"line":52,"column":8},"end":{"line":52,"column":null}},"16":{"start":{"line":54,"column":8},"end":{"line":54,"column":null}},"17":{"start":{"line":55,"column":8},"end":{"line":55,"column":null}},"18":{"start":{"line":59,"column":26},"end":{"line":75,"column":null}},"19":{"start":{"line":60,"column":4},"end":{"line":60,"column":null}},"20":{"start":{"line":61,"column":4},"end":{"line":61,"column":null}},"21":{"start":{"line":62,"column":4},"end":{"line":74,"column":null}},"22":{"start":{"line":64,"column":8},"end":{"line":64,"column":null}},"23":{"start":{"line":64,"column":21},"end":{"line":64,"column":null}},"24":{"start":{"line":65,"column":8},"end":{"line":65,"column":null}},"25":{"start":{"line":68,"column":8},"end":{"line":68,"column":null}},"26":{"start":{"line":69,"column":8},"end":{"line":69,"column":null}},"27":{"start":{"line":72,"column":8},"end":{"line":72,"column":null}},"28":{"start":{"line":73,"column":8},"end":{"line":73,"column":null}},"29":{"start":{"line":77,"column":2},"end":{"line":113,"column":null}},"30":{"start":{"line":85,"column":12},"end":{"line":85,"column":null}},"31":{"start":{"line":86,"column":12},"end":{"line":86,"column":null}}},"fnMap":{"0":{"name":"FeedItem","decl":{"start":{"line":11,"column":24},"end":{"line":11,"column":33}},"loc":{"start":{"line":11,"column":71},"end":{"line":115,"column":null}},"line":11},"1":{"name":"(anonymous_1)","decl":{"start":{"line":15,"column":12},"end":{"line":15,"column":18}},"loc":{"start":{"line":15,"column":18},"end":{"line":17,"column":5}},"line":15},"2":{"name":"(anonymous_2)","decl":{"start":{"line":19,"column":21},"end":{"line":19,"column":27}},"loc":{"start":{"line":19,"column":27},"end":{"line":21,"column":null}},"line":19},"3":{"name":"(anonymous_3)","decl":{"start":{"line":23,"column":21},"end":{"line":23,"column":22}},"loc":{"start":{"line":23,"column":40},"end":{"line":57,"column":null}},"line":23},"4":{"name":"(anonymous_4)","decl":{"start":{"line":40,"column":12},"end":{"line":40,"column":13}},"loc":{"start":{"line":40,"column":21},"end":{"line":45,"column":7}},"line":40},"5":{"name":"(anonymous_5)","decl":{"start":{"line":46,"column":12},"end":{"line":46,"column":18}},"loc":{"start":{"line":46,"column":18},"end":{"line":50,"column":7}},"line":46},"6":{"name":"(anonymous_6)","decl":{"start":{"line":51,"column":13},"end":{"line":51,"column":14}},"loc":{"start":{"line":51,"column":22},"end":{"line":56,"column":7}},"line":51},"7":{"name":"(anonymous_7)","decl":{"start":{"line":59,"column":26},"end":{"line":59,"column":27}},"loc":{"start":{"line":59,"column":51},"end":{"line":75,"column":null}},"line":59},"8":{"name":"(anonymous_8)","decl":{"start":{"line":63,"column":12},"end":{"line":63,"column":13}},"loc":{"start":{"line":63,"column":21},"end":{"line":66,"column":7}},"line":63},"9":{"name":"(anonymous_9)","decl":{"start":{"line":67,"column":12},"end":{"line":67,"column":13}},"loc":{"start":{"line":67,"column":22},"end":{"line":70,"column":7}},"line":67},"10":{"name":"(anonymous_10)","decl":{"start":{"line":71,"column":13},"end":{"line":71,"column":14}},"loc":{"start":{"line":71,"column":22},"end":{"line":74,"column":7}},"line":71},"11":{"name":"(anonymous_11)","decl":{"start":{"line":84,"column":19},"end":{"line":84,"column":20}},"loc":{"start":{"line":84,"column":26},"end":{"line":87,"column":null}},"line":84}},"branchMap":{"0":{"loc":{"start":{"line":41,"column":8},"end":{"line":43,"column":null}},"type":"if","locations":[{"start":{"line":41,"column":8},"end":{"line":43,"column":null}},{"start":{},"end":{}}],"line":41},"1":{"loc":{"start":{"line":64,"column":8},"end":{"line":64,"column":null}},"type":"if","locations":[{"start":{"line":64,"column":8},"end":{"line":64,"column":null}},{"start":{},"end":{}}],"line":64},"2":{"loc":{"start":{"line":78,"column":32},"end":{"line":78,"column":61}},"type":"cond-expr","locations":[{"start":{"line":78,"column":44},"end":{"line":78,"column":53}},{"start":{"line":78,"column":53},"end":{"line":78,"column":61}}],"line":78},"3":{"loc":{"start":{"line":78,"column":65},"end":{"line":78,"column":89}},"type":"cond-expr","locations":[{"start":{"line":78,"column":75},"end":{"line":78,"column":87}},{"start":{"line":78,"column":87},"end":{"line":78,"column":89}}],"line":78},"4":{"loc":{"start":{"line":81,"column":11},"end":{"line":81,"column":null}},"type":"binary-expr","locations":[{"start":{"line":81,"column":11},"end":{"line":81,"column":25}},{"start":{"line":81,"column":25},"end":{"line":81,"column":null}}],"line":81},"5":{"loc":{"start":{"line":88,"column":33},"end":{"line":88,"column":77}},"type":"cond-expr","locations":[{"start":{"line":88,"column":48},"end":{"line":88,"column":63}},{"start":{"line":88,"column":63},"end":{"line":88,"column":77}}],"line":88},"6":{"loc":{"start":{"line":89,"column":17},"end":{"line":89,"column":null}},"type":"cond-expr","locations":[{"start":{"line":89,"column":32},"end":{"line":89,"column":43}},{"start":{"line":89,"column":43},"end":{"line":89,"column":null}}],"line":89},"7":{"loc":{"start":{"line":97,"column":11},"end":{"line":97,"column":null}},"type":"binary-expr","locations":[{"start":{"line":97,"column":11},"end":{"line":97,"column":30}},{"start":{"line":97,"column":30},"end":{"line":97,"column":null}}],"line":97},"8":{"loc":{"start":{"line":100,"column":11},"end":{"line":103,"column":null}},"type":"binary-expr","locations":[{"start":{"line":100,"column":11},"end":{"line":100,"column":null}},{"start":{"line":101,"column":12},"end":{"line":103,"column":null}}],"line":100},"9":{"loc":{"start":{"line":106,"column":6},"end":{"line":111,"column":null}},"type":"binary-expr","locations":[{"start":{"line":107,"column":8},"end":{"line":107,"column":29}},{"start":{"line":107,"column":29},"end":{"line":107,"column":null}},{"start":{"line":108,"column":8},"end":{"line":111,"column":null}}],"line":106},"10":{"loc":{"start":{"line":110,"column":45},"end":{"line":110,"column":83}},"type":"binary-expr","locations":[{"start":{"line":110,"column":45},"end":{"line":110,"column":66}},{"start":{"line":110,"column":66},"end":{"line":110,"column":83}}],"line":110}},"s":{"0":56,"1":56,"2":56,"3":22,"4":56,"5":1,"6":56,"7":1,"8":1,"9":1,"10":1,"11":1,"12":0,"13":1,"14":1,"15":0,"16":0,"17":0,"18":56,"19":1,"20":1,"21":1,"22":1,"23":0,"24":1,"25":1,"26":1,"27":0,"28":0,"29":56,"30":1,"31":1},"f":{"0":56,"1":22,"2":1,"3":1,"4":1,"5":1,"6":0,"7":1,"8":1,"9":1,"10":0,"11":1},"b":{"0":[0,1],"1":[0,1],"2":[38,18],"3":[4,52],"4":[56,0],"5":[5,51],"6":[5,51],"7":[56,13],"8":[56,55],"9":[56,55,12],"10":[12,11]},"meta":{"lastBranch":11,"lastFunction":12,"lastStatement":32,"seen":{"f:11:24:11:33":0,"s:12:22:12:Infinity":0,"s:13:28:13:Infinity":1,"s:15:2:17:Infinity":2,"f:15:12:15:18":1,"s:16:4:16:Infinity":3,"s:19:21:21:Infinity":4,"f:19:21:19:27":2,"s:20:4:20:Infinity":5,"s:23:21:57:Infinity":6,"f:23:21:23:22":3,"s:24:4:24:Infinity":7,"s:26:25:26:Infinity":8,"s:27:4:27:Infinity":9,"s:29:4:56:Infinity":10,"f:40:12:40:13":4,"b:41:8:43:Infinity:undefined:undefined:undefined:undefined":0,"s:41:8:43:Infinity":11,"s:42:10:42:Infinity":12,"s:44:8:44:Infinity":13,"f:46:12:46:18":5,"s:49:8:49:Infinity":14,"f:51:13:51:14":6,"s:52:8:52:Infinity":15,"s:54:8:54:Infinity":16,"s:55:8:55:Infinity":17,"s:59:26:75:Infinity":18,"f:59:26:59:27":7,"s:60:4:60:Infinity":19,"s:61:4:61:Infinity":20,"s:62:4:74:Infinity":21,"f:63:12:63:13":8,"b:64:8:64:Infinity:undefined:undefined:undefined:undefined":1,"s:64:8:64:Infinity":22,"s:64:21:64:Infinity":23,"s:65:8:65:Infinity":24,"f:67:12:67:13":9,"s:68:8:68:Infinity":25,"s:69:8:69:Infinity":26,"f:71:13:71:14":10,"s:72:8:72:Infinity":27,"s:73:8:73:Infinity":28,"s:77:2:113:Infinity":29,"b:78:44:78:53:78:53:78:61":2,"b:78:75:78:87:78:87:78:89":3,"b:81:11:81:25:81:25:81:Infinity":4,"f:84:19:84:20":11,"s:85:12:85:Infinity":30,"s:86:12:86:Infinity":31,"b:88:48:88:63:88:63:88:77":5,"b:89:32:89:43:89:43:89:Infinity":6,"b:97:11:97:30:97:30:97:Infinity":7,"b:100:11:100:Infinity:101:12:103:Infinity":8,"b:107:8:107:29:107:29:107:Infinity:108:8:111:Infinity":9,"b:110:45:110:66:110:66:110:83":10}}} -,"/Users/adam/workspace/vibecode/neko/frontend/src/components/FeedItems.css": {"path":"/Users/adam/workspace/vibecode/neko/frontend/src/components/FeedItems.css","statementMap":{},"fnMap":{},"branchMap":{},"s":{},"f":{},"b":{},"meta":{"lastBranch":0,"lastFunction":0,"lastStatement":0,"seen":{}}} -,"/Users/adam/workspace/vibecode/neko/frontend/src/components/FeedItems.tsx": {"path":"/Users/adam/workspace/vibecode/neko/frontend/src/components/FeedItems.tsx","statementMap":{"0":{"start":{"line":9,"column":26},"end":{"line":9,"column":null}},"1":{"start":{"line":10,"column":21},"end":{"line":10,"column":null}},"2":{"start":{"line":11,"column":19},"end":{"line":11,"column":null}},"3":{"start":{"line":13,"column":24},"end":{"line":13,"column":null}},"4":{"start":{"line":14,"column":28},"end":{"line":14,"column":null}},"5":{"start":{"line":15,"column":36},"end":{"line":15,"column":null}},"6":{"start":{"line":16,"column":28},"end":{"line":16,"column":null}},"7":{"start":{"line":17,"column":24},"end":{"line":17,"column":null}},"8":{"start":{"line":18,"column":40},"end":{"line":18,"column":null}},"9":{"start":{"line":20,"column":21},"end":{"line":87,"column":null}},"10":{"start":{"line":21,"column":4},"end":{"line":26,"column":null}},"11":{"start":{"line":22,"column":6},"end":{"line":22,"column":null}},"12":{"start":{"line":24,"column":6},"end":{"line":24,"column":null}},"13":{"start":{"line":25,"column":6},"end":{"line":25,"column":null}},"14":{"start":{"line":27,"column":4},"end":{"line":27,"column":null}},"15":{"start":{"line":29,"column":14},"end":{"line":29,"column":null}},"16":{"start":{"line":30,"column":19},"end":{"line":30,"column":null}},"17":{"start":{"line":32,"column":4},"end":{"line":36,"column":null}},"18":{"start":{"line":33,"column":6},"end":{"line":33,"column":null}},"19":{"start":{"line":34,"column":4},"end":{"line":36,"column":null}},"20":{"start":{"line":35,"column":6},"end":{"line":35,"column":null}},"21":{"start":{"line":38,"column":4},"end":{"line":40,"column":null}},"22":{"start":{"line":39,"column":6},"end":{"line":39,"column":null}},"23":{"start":{"line":43,"column":24},"end":{"line":43,"column":null}},"24":{"start":{"line":44,"column":4},"end":{"line":46,"column":null}},"25":{"start":{"line":45,"column":6},"end":{"line":45,"column":null}},"26":{"start":{"line":48,"column":4},"end":{"line":58,"column":null}},"27":{"start":{"line":49,"column":6},"end":{"line":49,"column":null}},"28":{"start":{"line":50,"column":4},"end":{"line":58,"column":null}},"29":{"start":{"line":51,"column":6},"end":{"line":51,"column":null}},"30":{"start":{"line":52,"column":6},"end":{"line":52,"column":null}},"31":{"start":{"line":55,"column":6},"end":{"line":57,"column":null}},"32":{"start":{"line":56,"column":8},"end":{"line":56,"column":null}},"33":{"start":{"line":60,"column":24},"end":{"line":60,"column":null}},"34":{"start":{"line":61,"column":4},"end":{"line":63,"column":null}},"35":{"start":{"line":62,"column":6},"end":{"line":62,"column":null}},"36":{"start":{"line":65,"column":4},"end":{"line":86,"column":null}},"37":{"start":{"line":67,"column":8},"end":{"line":69,"column":null}},"38":{"start":{"line":68,"column":10},"end":{"line":68,"column":null}},"39":{"start":{"line":70,"column":8},"end":{"line":70,"column":null}},"40":{"start":{"line":73,"column":8},"end":{"line":77,"column":null}},"41":{"start":{"line":74,"column":10},"end":{"line":74,"column":null}},"42":{"start":{"line":74,"column":29},"end":{"line":74,"column":47}},"43":{"start":{"line":76,"column":10},"end":{"line":76,"column":null}},"44":{"start":{"line":78,"column":8},"end":{"line":78,"column":null}},"45":{"start":{"line":79,"column":8},"end":{"line":79,"column":null}},"46":{"start":{"line":80,"column":8},"end":{"line":80,"column":null}},"47":{"start":{"line":83,"column":8},"end":{"line":83,"column":null}},"48":{"start":{"line":84,"column":8},"end":{"line":84,"column":null}},"49":{"start":{"line":85,"column":8},"end":{"line":85,"column":null}},"50":{"start":{"line":89,"column":2},"end":{"line":93,"column":null}},"51":{"start":{"line":90,"column":4},"end":{"line":90,"column":null}},"52":{"start":{"line":91,"column":4},"end":{"line":91,"column":null}},"53":{"start":{"line":96,"column":23},"end":{"line":101,"column":null}},"54":{"start":{"line":97,"column":20},"end":{"line":97,"column":null}},"55":{"start":{"line":98,"column":4},"end":{"line":100,"column":null}},"56":{"start":{"line":99,"column":6},"end":{"line":99,"column":null}},"57":{"start":{"line":103,"column":21},"end":{"line":113,"column":null}},"58":{"start":{"line":104,"column":24},"end":{"line":104,"column":null}},"59":{"start":{"line":106,"column":4},"end":{"line":106,"column":null}},"60":{"start":{"line":106,"column":28},"end":{"line":106,"column":88}},"61":{"start":{"line":106,"column":50},"end":{"line":106,"column":87}},"62":{"start":{"line":108,"column":4},"end":{"line":112,"column":null}},"63":{"start":{"line":112,"column":22},"end":{"line":112,"column":63}},"64":{"start":{"line":115,"column":21},"end":{"line":125,"column":null}},"65":{"start":{"line":116,"column":24},"end":{"line":116,"column":null}},"66":{"start":{"line":118,"column":4},"end":{"line":118,"column":null}},"67":{"start":{"line":118,"column":28},"end":{"line":118,"column":88}},"68":{"start":{"line":118,"column":50},"end":{"line":118,"column":87}},"69":{"start":{"line":120,"column":4},"end":{"line":124,"column":null}},"70":{"start":{"line":124,"column":22},"end":{"line":124,"column":65}},"71":{"start":{"line":127,"column":2},"end":{"line":171,"column":null}},"72":{"start":{"line":128,"column":26},"end":{"line":166,"column":null}},"73":{"start":{"line":129,"column":6},"end":{"line":129,"column":null}},"74":{"start":{"line":129,"column":30},"end":{"line":129,"column":null}},"75":{"start":{"line":131,"column":6},"end":{"line":165,"column":null}},"76":{"start":{"line":132,"column":8},"end":{"line":149,"column":null}},"77":{"start":{"line":133,"column":28},"end":{"line":133,"column":null}},"78":{"start":{"line":134,"column":10},"end":{"line":140,"column":null}},"79":{"start":{"line":135,"column":25},"end":{"line":135,"column":null}},"80":{"start":{"line":136,"column":12},"end":{"line":138,"column":null}},"81":{"start":{"line":137,"column":14},"end":{"line":137,"column":null}},"82":{"start":{"line":139,"column":12},"end":{"line":139,"column":null}},"83":{"start":{"line":144,"column":10},"end":{"line":146,"column":null}},"84":{"start":{"line":145,"column":12},"end":{"line":145,"column":null}},"85":{"start":{"line":148,"column":10},"end":{"line":148,"column":null}},"86":{"start":{"line":150,"column":6},"end":{"line":165,"column":null}},"87":{"start":{"line":151,"column":8},"end":{"line":157,"column":null}},"88":{"start":{"line":152,"column":28},"end":{"line":152,"column":null}},"89":{"start":{"line":153,"column":10},"end":{"line":155,"column":null}},"90":{"start":{"line":154,"column":12},"end":{"line":154,"column":null}},"91":{"start":{"line":156,"column":10},"end":{"line":156,"column":null}},"92":{"start":{"line":158,"column":6},"end":{"line":165,"column":null}},"93":{"start":{"line":159,"column":8},"end":{"line":164,"column":null}},"94":{"start":{"line":160,"column":10},"end":{"line":162,"column":null}},"95":{"start":{"line":161,"column":12},"end":{"line":161,"column":null}},"96":{"start":{"line":163,"column":10},"end":{"line":163,"column":null}},"97":{"start":{"line":168,"column":4},"end":{"line":168,"column":null}},"98":{"start":{"line":169,"column":4},"end":{"line":169,"column":null}},"99":{"start":{"line":169,"column":17},"end":{"line":169,"column":null}},"100":{"start":{"line":175,"column":2},"end":{"line":220,"column":null}},"101":{"start":{"line":177,"column":25},"end":{"line":193,"column":null}},"102":{"start":{"line":179,"column":8},"end":{"line":190,"column":null}},"103":{"start":{"line":181,"column":10},"end":{"line":189,"column":null}},"104":{"start":{"line":182,"column":26},"end":{"line":182,"column":null}},"105":{"start":{"line":183,"column":12},"end":{"line":188,"column":null}},"106":{"start":{"line":184,"column":27},"end":{"line":184,"column":null}},"107":{"start":{"line":185,"column":14},"end":{"line":187,"column":null}},"108":{"start":{"line":186,"column":16},"end":{"line":186,"column":null}},"109":{"start":{"line":196,"column":29},"end":{"line":205,"column":null}},"110":{"start":{"line":198,"column":8},"end":{"line":202,"column":null}},"111":{"start":{"line":199,"column":10},"end":{"line":201,"column":null}},"112":{"start":{"line":200,"column":12},"end":{"line":200,"column":null}},"113":{"start":{"line":207,"column":4},"end":{"line":210,"column":null}},"114":{"start":{"line":208,"column":17},"end":{"line":208,"column":null}},"115":{"start":{"line":209,"column":6},"end":{"line":209,"column":null}},"116":{"start":{"line":209,"column":14},"end":{"line":209,"column":null}},"117":{"start":{"line":212,"column":21},"end":{"line":212,"column":null}},"118":{"start":{"line":213,"column":4},"end":{"line":213,"column":null}},"119":{"start":{"line":213,"column":18},"end":{"line":213,"column":null}},"120":{"start":{"line":215,"column":4},"end":{"line":218,"column":null}},"121":{"start":{"line":216,"column":6},"end":{"line":216,"column":null}},"122":{"start":{"line":217,"column":6},"end":{"line":217,"column":null}},"123":{"start":{"line":222,"column":2},"end":{"line":222,"column":null}},"124":{"start":{"line":222,"column":15},"end":{"line":222,"column":null}},"125":{"start":{"line":223,"column":2},"end":{"line":223,"column":null}},"126":{"start":{"line":223,"column":13},"end":{"line":223,"column":null}},"127":{"start":{"line":225,"column":2},"end":{"line":249,"column":null}},"128":{"start":{"line":232,"column":12},"end":{"line":240,"column":null}},"129":{"start":{"line":237,"column":29},"end":{"line":237,"column":null}}},"fnMap":{"0":{"name":"FeedItems","decl":{"start":{"line":8,"column":24},"end":{"line":8,"column":36}},"loc":{"start":{"line":8,"column":36},"end":{"line":251,"column":null}},"line":8},"1":{"name":"(anonymous_1)","decl":{"start":{"line":20,"column":21},"end":{"line":20,"column":22}},"loc":{"start":{"line":20,"column":41},"end":{"line":87,"column":null}},"line":20},"2":{"name":"(anonymous_2)","decl":{"start":{"line":66,"column":12},"end":{"line":66,"column":13}},"loc":{"start":{"line":66,"column":21},"end":{"line":71,"column":7}},"line":66},"3":{"name":"(anonymous_3)","decl":{"start":{"line":72,"column":12},"end":{"line":72,"column":13}},"loc":{"start":{"line":72,"column":22},"end":{"line":81,"column":7}},"line":72},"4":{"name":"(anonymous_4)","decl":{"start":{"line":74,"column":19},"end":{"line":74,"column":20}},"loc":{"start":{"line":74,"column":29},"end":{"line":74,"column":47}},"line":74},"5":{"name":"(anonymous_5)","decl":{"start":{"line":82,"column":13},"end":{"line":82,"column":14}},"loc":{"start":{"line":82,"column":22},"end":{"line":86,"column":7}},"line":82},"6":{"name":"(anonymous_6)","decl":{"start":{"line":89,"column":12},"end":{"line":89,"column":18}},"loc":{"start":{"line":89,"column":18},"end":{"line":93,"column":5}},"line":89},"7":{"name":"(anonymous_7)","decl":{"start":{"line":96,"column":23},"end":{"line":96,"column":24}},"loc":{"start":{"line":96,"column":42},"end":{"line":101,"column":null}},"line":96},"8":{"name":"(anonymous_8)","decl":{"start":{"line":103,"column":21},"end":{"line":103,"column":22}},"loc":{"start":{"line":103,"column":37},"end":{"line":113,"column":null}},"line":103},"9":{"name":"(anonymous_9)","decl":{"start":{"line":106,"column":13},"end":{"line":106,"column":14}},"loc":{"start":{"line":106,"column":28},"end":{"line":106,"column":88}},"line":106},"10":{"name":"(anonymous_10)","decl":{"start":{"line":106,"column":42},"end":{"line":106,"column":43}},"loc":{"start":{"line":106,"column":50},"end":{"line":106,"column":87}},"line":106},"11":{"name":"(anonymous_11)","decl":{"start":{"line":112,"column":13},"end":{"line":112,"column":14}},"loc":{"start":{"line":112,"column":22},"end":{"line":112,"column":63}},"line":112},"12":{"name":"(anonymous_12)","decl":{"start":{"line":115,"column":21},"end":{"line":115,"column":22}},"loc":{"start":{"line":115,"column":37},"end":{"line":125,"column":null}},"line":115},"13":{"name":"(anonymous_13)","decl":{"start":{"line":118,"column":13},"end":{"line":118,"column":14}},"loc":{"start":{"line":118,"column":28},"end":{"line":118,"column":88}},"line":118},"14":{"name":"(anonymous_14)","decl":{"start":{"line":118,"column":42},"end":{"line":118,"column":43}},"loc":{"start":{"line":118,"column":50},"end":{"line":118,"column":87}},"line":118},"15":{"name":"(anonymous_15)","decl":{"start":{"line":124,"column":13},"end":{"line":124,"column":14}},"loc":{"start":{"line":124,"column":22},"end":{"line":124,"column":65}},"line":124},"16":{"name":"(anonymous_16)","decl":{"start":{"line":127,"column":12},"end":{"line":127,"column":18}},"loc":{"start":{"line":127,"column":18},"end":{"line":171,"column":5}},"line":127},"17":{"name":"(anonymous_17)","decl":{"start":{"line":128,"column":26},"end":{"line":128,"column":27}},"loc":{"start":{"line":128,"column":48},"end":{"line":166,"column":null}},"line":128},"18":{"name":"(anonymous_18)","decl":{"start":{"line":132,"column":25},"end":{"line":132,"column":26}},"loc":{"start":{"line":132,"column":35},"end":{"line":149,"column":9}},"line":132},"19":{"name":"(anonymous_19)","decl":{"start":{"line":151,"column":25},"end":{"line":151,"column":26}},"loc":{"start":{"line":151,"column":35},"end":{"line":157,"column":9}},"line":151},"20":{"name":"(anonymous_20)","decl":{"start":{"line":159,"column":25},"end":{"line":159,"column":26}},"loc":{"start":{"line":159,"column":43},"end":{"line":164,"column":9}},"line":159},"21":{"name":"(anonymous_21)","decl":{"start":{"line":169,"column":11},"end":{"line":169,"column":17}},"loc":{"start":{"line":169,"column":17},"end":{"line":169,"column":null}},"line":169},"22":{"name":"(anonymous_22)","decl":{"start":{"line":175,"column":12},"end":{"line":175,"column":18}},"loc":{"start":{"line":175,"column":18},"end":{"line":220,"column":5}},"line":175},"23":{"name":"(anonymous_23)","decl":{"start":{"line":178,"column":6},"end":{"line":178,"column":7}},"loc":{"start":{"line":178,"column":19},"end":{"line":191,"column":null}},"line":178},"24":{"name":"(anonymous_24)","decl":{"start":{"line":179,"column":24},"end":{"line":179,"column":25}},"loc":{"start":{"line":179,"column":35},"end":{"line":190,"column":9}},"line":179},"25":{"name":"(anonymous_25)","decl":{"start":{"line":197,"column":6},"end":{"line":197,"column":7}},"loc":{"start":{"line":197,"column":19},"end":{"line":203,"column":null}},"line":197},"26":{"name":"(anonymous_26)","decl":{"start":{"line":198,"column":24},"end":{"line":198,"column":25}},"loc":{"start":{"line":198,"column":35},"end":{"line":202,"column":9}},"line":198},"27":{"name":"(anonymous_27)","decl":{"start":{"line":207,"column":18},"end":{"line":207,"column":19}},"loc":{"start":{"line":207,"column":32},"end":{"line":210,"column":5}},"line":207},"28":{"name":"(anonymous_28)","decl":{"start":{"line":215,"column":11},"end":{"line":215,"column":17}},"loc":{"start":{"line":215,"column":17},"end":{"line":218,"column":null}},"line":215},"29":{"name":"(anonymous_29)","decl":{"start":{"line":231,"column":21},"end":{"line":231,"column":22}},"loc":{"start":{"line":232,"column":12},"end":{"line":240,"column":null}},"line":232},"30":{"name":"(anonymous_30)","decl":{"start":{"line":237,"column":23},"end":{"line":237,"column":29}},"loc":{"start":{"line":237,"column":29},"end":{"line":237,"column":null}},"line":237}},"branchMap":{"0":{"loc":{"start":{"line":11,"column":19},"end":{"line":11,"column":null}},"type":"binary-expr","locations":[{"start":{"line":11,"column":19},"end":{"line":11,"column":49}},{"start":{"line":11,"column":49},"end":{"line":11,"column":null}}],"line":11},"1":{"loc":{"start":{"line":21,"column":4},"end":{"line":26,"column":null}},"type":"if","locations":[{"start":{"line":21,"column":4},"end":{"line":26,"column":null}},{"start":{"line":23,"column":11},"end":{"line":26,"column":null}}],"line":21},"2":{"loc":{"start":{"line":32,"column":4},"end":{"line":36,"column":null}},"type":"if","locations":[{"start":{"line":32,"column":4},"end":{"line":36,"column":null}},{"start":{"line":34,"column":4},"end":{"line":36,"column":null}}],"line":32},"3":{"loc":{"start":{"line":34,"column":4},"end":{"line":36,"column":null}},"type":"if","locations":[{"start":{"line":34,"column":4},"end":{"line":36,"column":null}},{"start":{},"end":{}}],"line":34},"4":{"loc":{"start":{"line":38,"column":4},"end":{"line":40,"column":null}},"type":"if","locations":[{"start":{"line":38,"column":4},"end":{"line":40,"column":null}},{"start":{},"end":{}}],"line":38},"5":{"loc":{"start":{"line":44,"column":4},"end":{"line":46,"column":null}},"type":"if","locations":[{"start":{"line":44,"column":4},"end":{"line":46,"column":null}},{"start":{},"end":{}}],"line":44},"6":{"loc":{"start":{"line":48,"column":4},"end":{"line":58,"column":null}},"type":"if","locations":[{"start":{"line":48,"column":4},"end":{"line":58,"column":null}},{"start":{"line":50,"column":4},"end":{"line":58,"column":null}}],"line":48},"7":{"loc":{"start":{"line":50,"column":4},"end":{"line":58,"column":null}},"type":"if","locations":[{"start":{"line":50,"column":4},"end":{"line":58,"column":null}},{"start":{"line":53,"column":11},"end":{"line":58,"column":null}}],"line":50},"8":{"loc":{"start":{"line":55,"column":6},"end":{"line":57,"column":null}},"type":"if","locations":[{"start":{"line":55,"column":6},"end":{"line":57,"column":null}},{"start":{},"end":{}}],"line":55},"9":{"loc":{"start":{"line":61,"column":4},"end":{"line":63,"column":null}},"type":"if","locations":[{"start":{"line":61,"column":4},"end":{"line":63,"column":null}},{"start":{},"end":{}}],"line":61},"10":{"loc":{"start":{"line":67,"column":8},"end":{"line":69,"column":null}},"type":"if","locations":[{"start":{"line":67,"column":8},"end":{"line":69,"column":null}},{"start":{},"end":{}}],"line":67},"11":{"loc":{"start":{"line":73,"column":8},"end":{"line":77,"column":null}},"type":"if","locations":[{"start":{"line":73,"column":8},"end":{"line":77,"column":null}},{"start":{"line":75,"column":15},"end":{"line":77,"column":null}}],"line":73},"12":{"loc":{"start":{"line":98,"column":4},"end":{"line":100,"column":null}},"type":"if","locations":[{"start":{"line":98,"column":4},"end":{"line":100,"column":null}},{"start":{},"end":{}}],"line":98},"13":{"loc":{"start":{"line":106,"column":50},"end":{"line":106,"column":87}},"type":"cond-expr","locations":[{"start":{"line":106,"column":71},"end":{"line":106,"column":85}},{"start":{"line":106,"column":85},"end":{"line":106,"column":87}}],"line":106},"14":{"loc":{"start":{"line":118,"column":50},"end":{"line":118,"column":87}},"type":"cond-expr","locations":[{"start":{"line":118,"column":71},"end":{"line":118,"column":85}},{"start":{"line":118,"column":85},"end":{"line":118,"column":87}}],"line":118},"15":{"loc":{"start":{"line":129,"column":6},"end":{"line":129,"column":null}},"type":"if","locations":[{"start":{"line":129,"column":6},"end":{"line":129,"column":null}},{"start":{},"end":{}}],"line":129},"16":{"loc":{"start":{"line":131,"column":6},"end":{"line":165,"column":null}},"type":"if","locations":[{"start":{"line":131,"column":6},"end":{"line":165,"column":null}},{"start":{"line":150,"column":6},"end":{"line":165,"column":null}}],"line":131},"17":{"loc":{"start":{"line":134,"column":10},"end":{"line":140,"column":null}},"type":"if","locations":[{"start":{"line":134,"column":10},"end":{"line":140,"column":null}},{"start":{},"end":{}}],"line":134},"18":{"loc":{"start":{"line":136,"column":12},"end":{"line":138,"column":null}},"type":"if","locations":[{"start":{"line":136,"column":12},"end":{"line":138,"column":null}},{"start":{},"end":{}}],"line":136},"19":{"loc":{"start":{"line":144,"column":10},"end":{"line":146,"column":null}},"type":"if","locations":[{"start":{"line":144,"column":10},"end":{"line":146,"column":null}},{"start":{},"end":{}}],"line":144},"20":{"loc":{"start":{"line":144,"column":14},"end":{"line":144,"column":73}},"type":"binary-expr","locations":[{"start":{"line":144,"column":14},"end":{"line":144,"column":48}},{"start":{"line":144,"column":48},"end":{"line":144,"column":59}},{"start":{"line":144,"column":59},"end":{"line":144,"column":73}}],"line":144},"21":{"loc":{"start":{"line":150,"column":6},"end":{"line":165,"column":null}},"type":"if","locations":[{"start":{"line":150,"column":6},"end":{"line":165,"column":null}},{"start":{"line":158,"column":6},"end":{"line":165,"column":null}}],"line":150},"22":{"loc":{"start":{"line":153,"column":10},"end":{"line":155,"column":null}},"type":"if","locations":[{"start":{"line":153,"column":10},"end":{"line":155,"column":null}},{"start":{},"end":{}}],"line":153},"23":{"loc":{"start":{"line":158,"column":6},"end":{"line":165,"column":null}},"type":"if","locations":[{"start":{"line":158,"column":6},"end":{"line":165,"column":null}},{"start":{},"end":{}}],"line":158},"24":{"loc":{"start":{"line":160,"column":10},"end":{"line":162,"column":null}},"type":"if","locations":[{"start":{"line":160,"column":10},"end":{"line":162,"column":null}},{"start":{},"end":{}}],"line":160},"25":{"loc":{"start":{"line":160,"column":14},"end":{"line":160,"column":64}},"type":"binary-expr","locations":[{"start":{"line":160,"column":14},"end":{"line":160,"column":35}},{"start":{"line":160,"column":35},"end":{"line":160,"column":64}}],"line":160},"26":{"loc":{"start":{"line":181,"column":10},"end":{"line":189,"column":null}},"type":"if","locations":[{"start":{"line":181,"column":10},"end":{"line":189,"column":null}},{"start":{},"end":{}}],"line":181},"27":{"loc":{"start":{"line":181,"column":14},"end":{"line":181,"column":73}},"type":"binary-expr","locations":[{"start":{"line":181,"column":14},"end":{"line":181,"column":39}},{"start":{"line":181,"column":39},"end":{"line":181,"column":73}}],"line":181},"28":{"loc":{"start":{"line":183,"column":12},"end":{"line":188,"column":null}},"type":"if","locations":[{"start":{"line":183,"column":12},"end":{"line":188,"column":null}},{"start":{},"end":{}}],"line":183},"29":{"loc":{"start":{"line":183,"column":16},"end":{"line":183,"column":69}},"type":"binary-expr","locations":[{"start":{"line":183,"column":16},"end":{"line":183,"column":33}},{"start":{"line":183,"column":33},"end":{"line":183,"column":47}},{"start":{"line":183,"column":47},"end":{"line":183,"column":69}}],"line":183},"30":{"loc":{"start":{"line":185,"column":14},"end":{"line":187,"column":null}},"type":"if","locations":[{"start":{"line":185,"column":14},"end":{"line":187,"column":null}},{"start":{},"end":{}}],"line":185},"31":{"loc":{"start":{"line":199,"column":10},"end":{"line":201,"column":null}},"type":"if","locations":[{"start":{"line":199,"column":10},"end":{"line":201,"column":null}},{"start":{},"end":{}}],"line":199},"32":{"loc":{"start":{"line":199,"column":14},"end":{"line":199,"column":83}},"type":"binary-expr","locations":[{"start":{"line":199,"column":14},"end":{"line":199,"column":38}},{"start":{"line":199,"column":38},"end":{"line":199,"column":54}},{"start":{"line":199,"column":54},"end":{"line":199,"column":65}},{"start":{"line":199,"column":65},"end":{"line":199,"column":83}}],"line":199},"33":{"loc":{"start":{"line":209,"column":6},"end":{"line":209,"column":null}},"type":"if","locations":[{"start":{"line":209,"column":6},"end":{"line":209,"column":null}},{"start":{},"end":{}}],"line":209},"34":{"loc":{"start":{"line":213,"column":4},"end":{"line":213,"column":null}},"type":"if","locations":[{"start":{"line":213,"column":4},"end":{"line":213,"column":null}},{"start":{},"end":{}}],"line":213},"35":{"loc":{"start":{"line":222,"column":2},"end":{"line":222,"column":null}},"type":"if","locations":[{"start":{"line":222,"column":2},"end":{"line":222,"column":null}},{"start":{},"end":{}}],"line":222},"36":{"loc":{"start":{"line":223,"column":2},"end":{"line":223,"column":null}},"type":"if","locations":[{"start":{"line":223,"column":2},"end":{"line":223,"column":null}},{"start":{},"end":{}}],"line":223},"37":{"loc":{"start":{"line":227,"column":7},"end":{"line":247,"column":null}},"type":"cond-expr","locations":[{"start":{"line":228,"column":8},"end":{"line":228,"column":null}},{"start":{"line":230,"column":8},"end":{"line":247,"column":null}}],"line":227},"38":{"loc":{"start":{"line":242,"column":11},"end":{"line":245,"column":null}},"type":"binary-expr","locations":[{"start":{"line":242,"column":11},"end":{"line":242,"column":null}},{"start":{"line":243,"column":12},"end":{"line":245,"column":null}}],"line":242},"39":{"loc":{"start":{"line":244,"column":15},"end":{"line":244,"column":null}},"type":"cond-expr","locations":[{"start":{"line":244,"column":29},"end":{"line":244,"column":49}},{"start":{"line":244,"column":49},"end":{"line":244,"column":null}}],"line":244}},"s":{"0":36,"1":36,"2":36,"3":36,"4":36,"5":36,"6":36,"7":36,"8":36,"9":36,"10":11,"11":3,"12":8,"13":8,"14":11,"15":11,"16":11,"17":11,"18":2,"19":9,"20":1,"21":11,"22":3,"23":11,"24":11,"25":0,"26":11,"27":0,"28":11,"29":0,"30":0,"31":11,"32":11,"33":11,"34":11,"35":11,"36":11,"37":10,"38":0,"39":10,"40":9,"41":3,"42":3,"43":6,"44":9,"45":9,"46":9,"47":1,"48":1,"49":1,"50":36,"51":8,"52":8,"53":36,"54":5,"55":5,"56":5,"57":36,"58":2,"59":2,"60":2,"61":3,"62":2,"63":0,"64":36,"65":1,"66":1,"67":1,"68":2,"69":1,"70":0,"71":36,"72":31,"73":6,"74":0,"75":6,"76":5,"77":5,"78":5,"79":5,"80":5,"81":1,"82":5,"83":5,"84":2,"85":5,"86":1,"87":0,"88":0,"89":0,"90":0,"91":0,"92":1,"93":1,"94":1,"95":1,"96":1,"97":31,"98":31,"99":31,"100":36,"101":31,"102":1,"103":1,"104":1,"105":1,"106":1,"107":1,"108":1,"109":31,"110":1,"111":1,"112":1,"113":31,"114":31,"115":31,"116":31,"117":31,"118":31,"119":15,"120":31,"121":31,"122":31,"123":36,"124":15,"125":21,"126":21,"127":20,"128":44,"129":0},"f":{"0":36,"1":11,"2":10,"3":9,"4":3,"5":1,"6":8,"7":5,"8":2,"9":2,"10":3,"11":0,"12":1,"13":1,"14":2,"15":0,"16":31,"17":6,"18":5,"19":0,"20":1,"21":31,"22":31,"23":1,"24":1,"25":1,"26":1,"27":31,"28":31,"29":44,"30":0},"b":{"0":[36,36],"1":[3,8],"2":[2,9],"3":[1,8],"4":[3,8],"5":[0,11],"6":[0,11],"7":[0,11],"8":[11,0],"9":[11,0],"10":[0,10],"11":[3,6],"12":[5,0],"13":[2,1],"14":[1,1],"15":[0,6],"16":[5,1],"17":[5,0],"18":[1,4],"19":[2,3],"20":[5,2,2],"21":[0,1],"22":[0,0],"23":[1,0],"24":[1,0],"25":[1,1],"26":[1,0],"27":[1,1],"28":[1,0],"29":[1,1,1],"30":[1,0],"31":[1,0],"32":[1,1,1,1],"33":[31,0],"34":[15,16],"35":[15,21],"36":[1,20],"37":[0,20],"38":[20,20],"39":[5,15]},"meta":{"lastBranch":40,"lastFunction":31,"lastStatement":130,"seen":{"f:8:24:8:36":0,"s:9:26:9:Infinity":0,"s:10:21:10:Infinity":1,"s:11:19:11:Infinity":2,"b:11:19:11:49:11:49:11:Infinity":0,"s:13:24:13:Infinity":3,"s:14:28:14:Infinity":4,"s:15:36:15:Infinity":5,"s:16:28:16:Infinity":6,"s:17:24:17:Infinity":7,"s:18:40:18:Infinity":8,"s:20:21:87:Infinity":9,"f:20:21:20:22":1,"b:21:4:26:Infinity:23:11:26:Infinity":1,"s:21:4:26:Infinity":10,"s:22:6:22:Infinity":11,"s:24:6:24:Infinity":12,"s:25:6:25:Infinity":13,"s:27:4:27:Infinity":14,"s:29:14:29:Infinity":15,"s:30:19:30:Infinity":16,"b:32:4:36:Infinity:34:4:36:Infinity":2,"s:32:4:36:Infinity":17,"s:33:6:33:Infinity":18,"b:34:4:36:Infinity:undefined:undefined:undefined:undefined":3,"s:34:4:36:Infinity":19,"s:35:6:35:Infinity":20,"b:38:4:40:Infinity:undefined:undefined:undefined:undefined":4,"s:38:4:40:Infinity":21,"s:39:6:39:Infinity":22,"s:43:24:43:Infinity":23,"b:44:4:46:Infinity:undefined:undefined:undefined:undefined":5,"s:44:4:46:Infinity":24,"s:45:6:45:Infinity":25,"b:48:4:58:Infinity:50:4:58:Infinity":6,"s:48:4:58:Infinity":26,"s:49:6:49:Infinity":27,"b:50:4:58:Infinity:53:11:58:Infinity":7,"s:50:4:58:Infinity":28,"s:51:6:51:Infinity":29,"s:52:6:52:Infinity":30,"b:55:6:57:Infinity:undefined:undefined:undefined:undefined":8,"s:55:6:57:Infinity":31,"s:56:8:56:Infinity":32,"s:60:24:60:Infinity":33,"b:61:4:63:Infinity:undefined:undefined:undefined:undefined":9,"s:61:4:63:Infinity":34,"s:62:6:62:Infinity":35,"s:65:4:86:Infinity":36,"f:66:12:66:13":2,"b:67:8:69:Infinity:undefined:undefined:undefined:undefined":10,"s:67:8:69:Infinity":37,"s:68:10:68:Infinity":38,"s:70:8:70:Infinity":39,"f:72:12:72:13":3,"b:73:8:77:Infinity:75:15:77:Infinity":11,"s:73:8:77:Infinity":40,"s:74:10:74:Infinity":41,"f:74:19:74:20":4,"s:74:29:74:47":42,"s:76:10:76:Infinity":43,"s:78:8:78:Infinity":44,"s:79:8:79:Infinity":45,"s:80:8:80:Infinity":46,"f:82:13:82:14":5,"s:83:8:83:Infinity":47,"s:84:8:84:Infinity":48,"s:85:8:85:Infinity":49,"s:89:2:93:Infinity":50,"f:89:12:89:18":6,"s:90:4:90:Infinity":51,"s:91:4:91:Infinity":52,"s:96:23:101:Infinity":53,"f:96:23:96:24":7,"s:97:20:97:Infinity":54,"b:98:4:100:Infinity:undefined:undefined:undefined:undefined":12,"s:98:4:100:Infinity":55,"s:99:6:99:Infinity":56,"s:103:21:113:Infinity":57,"f:103:21:103:22":8,"s:104:24:104:Infinity":58,"s:106:4:106:Infinity":59,"f:106:13:106:14":9,"s:106:28:106:88":60,"f:106:42:106:43":10,"s:106:50:106:87":61,"b:106:71:106:85:106:85:106:87":13,"s:108:4:112:Infinity":62,"f:112:13:112:14":11,"s:112:22:112:63":63,"s:115:21:125:Infinity":64,"f:115:21:115:22":12,"s:116:24:116:Infinity":65,"s:118:4:118:Infinity":66,"f:118:13:118:14":13,"s:118:28:118:88":67,"f:118:42:118:43":14,"s:118:50:118:87":68,"b:118:71:118:85:118:85:118:87":14,"s:120:4:124:Infinity":69,"f:124:13:124:14":15,"s:124:22:124:65":70,"s:127:2:171:Infinity":71,"f:127:12:127:18":16,"s:128:26:166:Infinity":72,"f:128:26:128:27":17,"b:129:6:129:Infinity:undefined:undefined:undefined:undefined":15,"s:129:6:129:Infinity":73,"s:129:30:129:Infinity":74,"b:131:6:165:Infinity:150:6:165:Infinity":16,"s:131:6:165:Infinity":75,"s:132:8:149:Infinity":76,"f:132:25:132:26":18,"s:133:28:133:Infinity":77,"b:134:10:140:Infinity:undefined:undefined:undefined:undefined":17,"s:134:10:140:Infinity":78,"s:135:25:135:Infinity":79,"b:136:12:138:Infinity:undefined:undefined:undefined:undefined":18,"s:136:12:138:Infinity":80,"s:137:14:137:Infinity":81,"s:139:12:139:Infinity":82,"b:144:10:146:Infinity:undefined:undefined:undefined:undefined":19,"s:144:10:146:Infinity":83,"b:144:14:144:48:144:48:144:59:144:59:144:73":20,"s:145:12:145:Infinity":84,"s:148:10:148:Infinity":85,"b:150:6:165:Infinity:158:6:165:Infinity":21,"s:150:6:165:Infinity":86,"s:151:8:157:Infinity":87,"f:151:25:151:26":19,"s:152:28:152:Infinity":88,"b:153:10:155:Infinity:undefined:undefined:undefined:undefined":22,"s:153:10:155:Infinity":89,"s:154:12:154:Infinity":90,"s:156:10:156:Infinity":91,"b:158:6:165:Infinity:undefined:undefined:undefined:undefined":23,"s:158:6:165:Infinity":92,"s:159:8:164:Infinity":93,"f:159:25:159:26":20,"b:160:10:162:Infinity:undefined:undefined:undefined:undefined":24,"s:160:10:162:Infinity":94,"b:160:14:160:35:160:35:160:64":25,"s:161:12:161:Infinity":95,"s:163:10:163:Infinity":96,"s:168:4:168:Infinity":97,"s:169:4:169:Infinity":98,"f:169:11:169:17":21,"s:169:17:169:Infinity":99,"s:175:2:220:Infinity":100,"f:175:12:175:18":22,"s:177:25:193:Infinity":101,"f:178:6:178:7":23,"s:179:8:190:Infinity":102,"f:179:24:179:25":24,"b:181:10:189:Infinity:undefined:undefined:undefined:undefined":26,"s:181:10:189:Infinity":103,"b:181:14:181:39:181:39:181:73":27,"s:182:26:182:Infinity":104,"b:183:12:188:Infinity:undefined:undefined:undefined:undefined":28,"s:183:12:188:Infinity":105,"b:183:16:183:33:183:33:183:47:183:47:183:69":29,"s:184:27:184:Infinity":106,"b:185:14:187:Infinity:undefined:undefined:undefined:undefined":30,"s:185:14:187:Infinity":107,"s:186:16:186:Infinity":108,"s:196:29:205:Infinity":109,"f:197:6:197:7":25,"s:198:8:202:Infinity":110,"f:198:24:198:25":26,"b:199:10:201:Infinity:undefined:undefined:undefined:undefined":31,"s:199:10:201:Infinity":111,"b:199:14:199:38:199:38:199:54:199:54:199:65:199:65:199:83":32,"s:200:12:200:Infinity":112,"s:207:4:210:Infinity":113,"f:207:18:207:19":27,"s:208:17:208:Infinity":114,"b:209:6:209:Infinity:undefined:undefined:undefined:undefined":33,"s:209:6:209:Infinity":115,"s:209:14:209:Infinity":116,"s:212:21:212:Infinity":117,"b:213:4:213:Infinity:undefined:undefined:undefined:undefined":34,"s:213:4:213:Infinity":118,"s:213:18:213:Infinity":119,"s:215:4:218:Infinity":120,"f:215:11:215:17":28,"s:216:6:216:Infinity":121,"s:217:6:217:Infinity":122,"b:222:2:222:Infinity:undefined:undefined:undefined:undefined":35,"s:222:2:222:Infinity":123,"s:222:15:222:Infinity":124,"b:223:2:223:Infinity:undefined:undefined:undefined:undefined":36,"s:223:2:223:Infinity":125,"s:223:13:223:Infinity":126,"s:225:2:249:Infinity":127,"b:228:8:228:Infinity:230:8:247:Infinity":37,"f:231:21:231:22":29,"s:232:12:240:Infinity":128,"f:237:23:237:29":30,"s:237:29:237:Infinity":129,"b:242:11:242:Infinity:243:12:245:Infinity":38,"b:244:29:244:49:244:49:244:Infinity":39}}} -,"/Users/adam/workspace/vibecode/neko/frontend/src/components/FeedList.css": {"path":"/Users/adam/workspace/vibecode/neko/frontend/src/components/FeedList.css","statementMap":{},"fnMap":{},"branchMap":{},"s":{},"f":{},"b":{},"meta":{"lastBranch":0,"lastFunction":0,"lastStatement":0,"seen":{}}} -,"/Users/adam/workspace/vibecode/neko/frontend/src/components/FeedList.tsx": {"path":"/Users/adam/workspace/vibecode/neko/frontend/src/components/FeedList.tsx","statementMap":{"0":{"start":{"line":19,"column":24},"end":{"line":19,"column":null}},"1":{"start":{"line":20,"column":22},"end":{"line":20,"column":null}},"2":{"start":{"line":21,"column":28},"end":{"line":21,"column":null}},"3":{"start":{"line":22,"column":24},"end":{"line":22,"column":null}},"4":{"start":{"line":23,"column":40},"end":{"line":23,"column":null}},"5":{"start":{"line":24,"column":38},"end":{"line":24,"column":null}},"6":{"start":{"line":25,"column":36},"end":{"line":25,"column":null}},"7":{"start":{"line":26,"column":8},"end":{"line":26,"column":null}},"8":{"start":{"line":27,"column":21},"end":{"line":27,"column":null}},"9":{"start":{"line":28,"column":8},"end":{"line":28,"column":null}},"10":{"start":{"line":29,"column":26},"end":{"line":29,"column":null}},"11":{"start":{"line":31,"column":25},"end":{"line":31,"column":null}},"12":{"start":{"line":33,"column":2},"end":{"line":38,"column":null}},"13":{"start":{"line":34,"column":20},"end":{"line":34,"column":null}},"14":{"start":{"line":35,"column":4},"end":{"line":37,"column":null}},"15":{"start":{"line":36,"column":6},"end":{"line":36,"column":null}},"16":{"start":{"line":41,"column":4},"end":{"line":42,"column":null}},"17":{"start":{"line":44,"column":23},"end":{"line":49,"column":null}},"18":{"start":{"line":45,"column":4},"end":{"line":45,"column":null}},"19":{"start":{"line":46,"column":4},"end":{"line":48,"column":null}},"20":{"start":{"line":47,"column":6},"end":{"line":47,"column":null}},"21":{"start":{"line":51,"column":22},"end":{"line":53,"column":null}},"22":{"start":{"line":52,"column":4},"end":{"line":52,"column":null}},"23":{"start":{"line":55,"column":21},"end":{"line":57,"column":null}},"24":{"start":{"line":56,"column":4},"end":{"line":56,"column":null}},"25":{"start":{"line":59,"column":26},"end":{"line":63,"column":null}},"26":{"start":{"line":60,"column":4},"end":{"line":62,"column":null}},"27":{"start":{"line":61,"column":6},"end":{"line":61,"column":null}},"28":{"start":{"line":65,"column":2},"end":{"line":85,"column":null}},"29":{"start":{"line":66,"column":4},"end":{"line":84,"column":null}},"30":{"start":{"line":68,"column":8},"end":{"line":68,"column":null}},"31":{"start":{"line":68,"column":21},"end":{"line":68,"column":null}},"32":{"start":{"line":69,"column":8},"end":{"line":69,"column":null}},"33":{"start":{"line":72,"column":8},"end":{"line":72,"column":null}},"34":{"start":{"line":72,"column":21},"end":{"line":72,"column":null}},"35":{"start":{"line":73,"column":8},"end":{"line":73,"column":null}},"36":{"start":{"line":77,"column":8},"end":{"line":77,"column":null}},"37":{"start":{"line":78,"column":8},"end":{"line":78,"column":null}},"38":{"start":{"line":79,"column":8},"end":{"line":79,"column":null}},"39":{"start":{"line":82,"column":8},"end":{"line":82,"column":null}},"40":{"start":{"line":83,"column":8},"end":{"line":83,"column":null}},"41":{"start":{"line":87,"column":2},"end":{"line":87,"column":null}},"42":{"start":{"line":87,"column":15},"end":{"line":87,"column":null}},"43":{"start":{"line":88,"column":2},"end":{"line":88,"column":null}},"44":{"start":{"line":88,"column":13},"end":{"line":88,"column":null}},"45":{"start":{"line":90,"column":23},"end":{"line":92,"column":null}},"46":{"start":{"line":91,"column":4},"end":{"line":91,"column":null}},"47":{"start":{"line":91,"column":60},"end":{"line":91,"column":95}},"48":{"start":{"line":94,"column":2},"end":{"line":210,"column":null}},"49":{"start":{"line":96,"column":42},"end":{"line":96,"column":68}},"50":{"start":{"line":106,"column":29},"end":{"line":106,"column":null}},"51":{"start":{"line":139,"column":14},"end":{"line":147,"column":null}},"52":{"start":{"line":163,"column":16},"end":{"line":171,"column":null}},"53":{"start":{"line":195,"column":27},"end":{"line":195,"column":null}},"54":{"start":{"line":202,"column":27},"end":{"line":202,"column":null}}},"fnMap":{"0":{"name":"FeedList","decl":{"start":{"line":8,"column":24},"end":{"line":8,"column":33}},"loc":{"start":{"line":18,"column":3},"end":{"line":212,"column":null}},"line":18},"1":{"name":"(anonymous_1)","decl":{"start":{"line":33,"column":12},"end":{"line":33,"column":18}},"loc":{"start":{"line":33,"column":18},"end":{"line":38,"column":5}},"line":33},"2":{"name":"(anonymous_2)","decl":{"start":{"line":44,"column":23},"end":{"line":44,"column":24}},"loc":{"start":{"line":44,"column":47},"end":{"line":49,"column":null}},"line":44},"3":{"name":"(anonymous_3)","decl":{"start":{"line":51,"column":22},"end":{"line":51,"column":28}},"loc":{"start":{"line":51,"column":28},"end":{"line":53,"column":null}},"line":51},"4":{"name":"(anonymous_4)","decl":{"start":{"line":55,"column":21},"end":{"line":55,"column":27}},"loc":{"start":{"line":55,"column":27},"end":{"line":57,"column":null}},"line":55},"5":{"name":"(anonymous_5)","decl":{"start":{"line":59,"column":26},"end":{"line":59,"column":32}},"loc":{"start":{"line":59,"column":32},"end":{"line":63,"column":null}},"line":59},"6":{"name":"(anonymous_6)","decl":{"start":{"line":65,"column":12},"end":{"line":65,"column":18}},"loc":{"start":{"line":65,"column":18},"end":{"line":85,"column":5}},"line":65},"7":{"name":"(anonymous_7)","decl":{"start":{"line":67,"column":34},"end":{"line":67,"column":35}},"loc":{"start":{"line":67,"column":43},"end":{"line":70,"column":7}},"line":67},"8":{"name":"(anonymous_8)","decl":{"start":{"line":71,"column":32},"end":{"line":71,"column":33}},"loc":{"start":{"line":71,"column":41},"end":{"line":74,"column":7}},"line":71},"9":{"name":"(anonymous_9)","decl":{"start":{"line":76,"column":12},"end":{"line":76,"column":13}},"loc":{"start":{"line":76,"column":39},"end":{"line":80,"column":7}},"line":76},"10":{"name":"(anonymous_10)","decl":{"start":{"line":81,"column":13},"end":{"line":81,"column":14}},"loc":{"start":{"line":81,"column":22},"end":{"line":84,"column":7}},"line":81},"11":{"name":"(anonymous_11)","decl":{"start":{"line":90,"column":23},"end":{"line":90,"column":29}},"loc":{"start":{"line":90,"column":29},"end":{"line":92,"column":null}},"line":90},"12":{"name":"(anonymous_12)","decl":{"start":{"line":91,"column":53},"end":{"line":91,"column":60}},"loc":{"start":{"line":91,"column":60},"end":{"line":91,"column":95}},"line":91},"13":{"name":"(anonymous_13)","decl":{"start":{"line":96,"column":36},"end":{"line":96,"column":42}},"loc":{"start":{"line":96,"column":42},"end":{"line":96,"column":68}},"line":96},"14":{"name":"(anonymous_14)","decl":{"start":{"line":106,"column":22},"end":{"line":106,"column":23}},"loc":{"start":{"line":106,"column":29},"end":{"line":106,"column":null}},"line":106},"15":{"name":"(anonymous_15)","decl":{"start":{"line":138,"column":22},"end":{"line":138,"column":23}},"loc":{"start":{"line":139,"column":14},"end":{"line":147,"column":null}},"line":139},"16":{"name":"(anonymous_16)","decl":{"start":{"line":162,"column":25},"end":{"line":162,"column":26}},"loc":{"start":{"line":163,"column":16},"end":{"line":171,"column":null}},"line":163},"17":{"name":"(anonymous_17)","decl":{"start":{"line":195,"column":21},"end":{"line":195,"column":27}},"loc":{"start":{"line":195,"column":27},"end":{"line":195,"column":null}},"line":195},"18":{"name":"(anonymous_18)","decl":{"start":{"line":202,"column":21},"end":{"line":202,"column":27}},"loc":{"start":{"line":202,"column":27},"end":{"line":202,"column":null}},"line":202}},"branchMap":{"0":{"loc":{"start":{"line":31,"column":25},"end":{"line":31,"column":null}},"type":"binary-expr","locations":[{"start":{"line":31,"column":25},"end":{"line":31,"column":56}},{"start":{"line":31,"column":56},"end":{"line":31,"column":104}},{"start":{"line":31,"column":104},"end":{"line":31,"column":null}}],"line":31},"1":{"loc":{"start":{"line":35,"column":4},"end":{"line":37,"column":null}},"type":"if","locations":[{"start":{"line":35,"column":4},"end":{"line":37,"column":null}},{"start":{},"end":{}}],"line":35},"2":{"loc":{"start":{"line":41,"column":4},"end":{"line":42,"column":null}},"type":"binary-expr","locations":[{"start":{"line":41,"column":4},"end":{"line":41,"column":null}},{"start":{"line":42,"column":5},"end":{"line":42,"column":null}}],"line":41},"3":{"loc":{"start":{"line":42,"column":5},"end":{"line":42,"column":null}},"type":"cond-expr","locations":[{"start":{"line":42,"column":56},"end":{"line":42,"column":67}},{"start":{"line":42,"column":67},"end":{"line":42,"column":null}}],"line":42},"4":{"loc":{"start":{"line":42,"column":5},"end":{"line":42,"column":56}},"type":"binary-expr","locations":[{"start":{"line":42,"column":5},"end":{"line":42,"column":34}},{"start":{"line":42,"column":34},"end":{"line":42,"column":45}},{"start":{"line":42,"column":45},"end":{"line":42,"column":56}}],"line":42},"5":{"loc":{"start":{"line":46,"column":4},"end":{"line":48,"column":null}},"type":"if","locations":[{"start":{"line":46,"column":4},"end":{"line":48,"column":null}},{"start":{},"end":{}}],"line":46},"6":{"loc":{"start":{"line":60,"column":4},"end":{"line":62,"column":null}},"type":"if","locations":[{"start":{"line":60,"column":4},"end":{"line":62,"column":null}},{"start":{},"end":{}}],"line":60},"7":{"loc":{"start":{"line":68,"column":8},"end":{"line":68,"column":null}},"type":"if","locations":[{"start":{"line":68,"column":8},"end":{"line":68,"column":null}},{"start":{},"end":{}}],"line":68},"8":{"loc":{"start":{"line":72,"column":8},"end":{"line":72,"column":null}},"type":"if","locations":[{"start":{"line":72,"column":8},"end":{"line":72,"column":null}},{"start":{},"end":{}}],"line":72},"9":{"loc":{"start":{"line":87,"column":2},"end":{"line":87,"column":null}},"type":"if","locations":[{"start":{"line":87,"column":2},"end":{"line":87,"column":null}},{"start":{},"end":{}}],"line":87},"10":{"loc":{"start":{"line":88,"column":2},"end":{"line":88,"column":null}},"type":"if","locations":[{"start":{"line":88,"column":2},"end":{"line":88,"column":null}},{"start":{},"end":{}}],"line":88},"11":{"loc":{"start":{"line":115,"column":50},"end":{"line":115,"column":94}},"type":"cond-expr","locations":[{"start":{"line":115,"column":79},"end":{"line":115,"column":90}},{"start":{"line":115,"column":90},"end":{"line":115,"column":94}}],"line":115},"12":{"loc":{"start":{"line":120,"column":47},"end":{"line":120,"column":88}},"type":"cond-expr","locations":[{"start":{"line":120,"column":73},"end":{"line":120,"column":84}},{"start":{"line":120,"column":84},"end":{"line":120,"column":88}}],"line":120},"13":{"loc":{"start":{"line":125,"column":51},"end":{"line":125,"column":96}},"type":"cond-expr","locations":[{"start":{"line":125,"column":81},"end":{"line":125,"column":92}},{"start":{"line":125,"column":92},"end":{"line":125,"column":96}}],"line":125},"14":{"loc":{"start":{"line":134,"column":36},"end":{"line":134,"column":66}},"type":"cond-expr","locations":[{"start":{"line":134,"column":51},"end":{"line":134,"column":64}},{"start":{"line":134,"column":64},"end":{"line":134,"column":66}}],"line":134},"15":{"loc":{"start":{"line":136,"column":9},"end":{"line":149,"column":null}},"type":"binary-expr","locations":[{"start":{"line":136,"column":9},"end":{"line":136,"column":null}},{"start":{"line":137,"column":10},"end":{"line":149,"column":null}}],"line":136},"16":{"loc":{"start":{"line":142,"column":41},"end":{"line":142,"column":78}},"type":"cond-expr","locations":[{"start":{"line":142,"column":65},"end":{"line":142,"column":76}},{"start":{"line":142,"column":76},"end":{"line":142,"column":78}}],"line":142},"17":{"loc":{"start":{"line":155,"column":36},"end":{"line":155,"column":67}},"type":"cond-expr","locations":[{"start":{"line":155,"column":52},"end":{"line":155,"column":65}},{"start":{"line":155,"column":65},"end":{"line":155,"column":67}}],"line":155},"18":{"loc":{"start":{"line":157,"column":9},"end":{"line":173,"column":null}},"type":"binary-expr","locations":[{"start":{"line":157,"column":9},"end":{"line":157,"column":null}},{"start":{"line":158,"column":11},"end":{"line":173,"column":null}}],"line":157},"19":{"loc":{"start":{"line":158,"column":11},"end":{"line":173,"column":null}},"type":"cond-expr","locations":[{"start":{"line":159,"column":12},"end":{"line":159,"column":null}},{"start":{"line":161,"column":12},"end":{"line":173,"column":null}}],"line":158},"20":{"loc":{"start":{"line":166,"column":45},"end":{"line":166,"column":88}},"type":"cond-expr","locations":[{"start":{"line":166,"column":75},"end":{"line":166,"column":86}},{"start":{"line":166,"column":86},"end":{"line":166,"column":88}}],"line":166},"21":{"loc":{"start":{"line":169,"column":21},"end":{"line":169,"column":null}},"type":"binary-expr","locations":[{"start":{"line":169,"column":21},"end":{"line":169,"column":35}},{"start":{"line":169,"column":35},"end":{"line":169,"column":null}}],"line":169},"22":{"loc":{"start":{"line":196,"column":23},"end":{"line":196,"column":null}},"type":"cond-expr","locations":[{"start":{"line":196,"column":43},"end":{"line":196,"column":54}},{"start":{"line":196,"column":54},"end":{"line":196,"column":null}}],"line":196},"23":{"loc":{"start":{"line":203,"column":23},"end":{"line":203,"column":null}},"type":"cond-expr","locations":[{"start":{"line":203,"column":42},"end":{"line":203,"column":53}},{"start":{"line":203,"column":53},"end":{"line":203,"column":null}}],"line":203}},"s":{"0":22,"1":22,"2":22,"3":22,"4":22,"5":22,"6":22,"7":22,"8":22,"9":22,"10":22,"11":22,"12":22,"13":11,"14":11,"15":0,"16":22,"17":22,"18":1,"19":1,"20":1,"21":22,"22":2,"23":22,"24":0,"25":22,"26":1,"27":1,"28":22,"29":9,"30":7,"31":0,"32":7,"33":7,"34":0,"35":7,"36":7,"37":7,"38":7,"39":1,"40":1,"41":22,"42":9,"43":13,"44":13,"45":12,"46":2,"47":2,"48":12,"49":0,"50":1,"51":4,"52":2,"53":0,"54":0},"f":{"0":22,"1":11,"2":1,"3":2,"4":0,"5":1,"6":9,"7":7,"8":7,"9":7,"10":1,"11":2,"12":2,"13":0,"14":1,"15":4,"16":2,"17":0,"18":0},"b":{"0":[22,22,22],"1":[0,11],"2":[22,21],"3":[21,0],"4":[21,21,21],"5":[1,0],"6":[1,0],"7":[0,7],"8":[0,7],"9":[9,13],"10":[1,12],"11":[12,0],"12":[0,12],"13":[0,12],"14":[12,0],"15":[22,12],"16":[0,4],"17":[2,10],"18":[22,2],"19":[1,1],"20":[0,2],"21":[2,0],"22":[12,0],"23":[0,12]},"meta":{"lastBranch":24,"lastFunction":19,"lastStatement":55,"seen":{"f:8:24:8:33":0,"s:19:24:19:Infinity":0,"s:20:22:20:Infinity":1,"s:21:28:21:Infinity":2,"s:22:24:22:Infinity":3,"s:23:40:23:Infinity":4,"s:24:38:24:Infinity":5,"s:25:36:25:Infinity":6,"s:26:8:26:Infinity":7,"s:27:21:27:Infinity":8,"s:28:8:28:Infinity":9,"s:29:26:29:Infinity":10,"s:31:25:31:Infinity":11,"b:31:25:31:56:31:56:31:104:31:104:31:Infinity":0,"s:33:2:38:Infinity":12,"f:33:12:33:18":1,"s:34:20:34:Infinity":13,"b:35:4:37:Infinity:undefined:undefined:undefined:undefined":1,"s:35:4:37:Infinity":14,"s:36:6:36:Infinity":15,"s:41:4:42:Infinity":16,"b:41:4:41:Infinity:42:5:42:Infinity":2,"b:42:56:42:67:42:67:42:Infinity":3,"b:42:5:42:34:42:34:42:45:42:45:42:56":4,"s:44:23:49:Infinity":17,"f:44:23:44:24":2,"s:45:4:45:Infinity":18,"b:46:4:48:Infinity:undefined:undefined:undefined:undefined":5,"s:46:4:48:Infinity":19,"s:47:6:47:Infinity":20,"s:51:22:53:Infinity":21,"f:51:22:51:28":3,"s:52:4:52:Infinity":22,"s:55:21:57:Infinity":23,"f:55:21:55:27":4,"s:56:4:56:Infinity":24,"s:59:26:63:Infinity":25,"f:59:26:59:32":5,"b:60:4:62:Infinity:undefined:undefined:undefined:undefined":6,"s:60:4:62:Infinity":26,"s:61:6:61:Infinity":27,"s:65:2:85:Infinity":28,"f:65:12:65:18":6,"s:66:4:84:Infinity":29,"f:67:34:67:35":7,"b:68:8:68:Infinity:undefined:undefined:undefined:undefined":7,"s:68:8:68:Infinity":30,"s:68:21:68:Infinity":31,"s:69:8:69:Infinity":32,"f:71:32:71:33":8,"b:72:8:72:Infinity:undefined:undefined:undefined:undefined":8,"s:72:8:72:Infinity":33,"s:72:21:72:Infinity":34,"s:73:8:73:Infinity":35,"f:76:12:76:13":9,"s:77:8:77:Infinity":36,"s:78:8:78:Infinity":37,"s:79:8:79:Infinity":38,"f:81:13:81:14":10,"s:82:8:82:Infinity":39,"s:83:8:83:Infinity":40,"b:87:2:87:Infinity:undefined:undefined:undefined:undefined":9,"s:87:2:87:Infinity":41,"s:87:15:87:Infinity":42,"b:88:2:88:Infinity:undefined:undefined:undefined:undefined":10,"s:88:2:88:Infinity":43,"s:88:13:88:Infinity":44,"s:90:23:92:Infinity":45,"f:90:23:90:29":11,"s:91:4:91:Infinity":46,"f:91:53:91:60":12,"s:91:60:91:95":47,"s:94:2:210:Infinity":48,"f:96:36:96:42":13,"s:96:42:96:68":49,"f:106:22:106:23":14,"s:106:29:106:Infinity":50,"b:115:79:115:90:115:90:115:94":11,"b:120:73:120:84:120:84:120:88":12,"b:125:81:125:92:125:92:125:96":13,"b:134:51:134:64:134:64:134:66":14,"b:136:9:136:Infinity:137:10:149:Infinity":15,"f:138:22:138:23":15,"s:139:14:147:Infinity":51,"b:142:65:142:76:142:76:142:78":16,"b:155:52:155:65:155:65:155:67":17,"b:157:9:157:Infinity:158:11:173:Infinity":18,"b:159:12:159:Infinity:161:12:173:Infinity":19,"f:162:25:162:26":16,"s:163:16:171:Infinity":52,"b:166:75:166:86:166:86:166:88":20,"b:169:21:169:35:169:35:169:Infinity":21,"f:195:21:195:27":17,"s:195:27:195:Infinity":53,"b:196:43:196:54:196:54:196:Infinity":22,"f:202:21:202:27":18,"s:202:27:202:Infinity":54,"b:203:42:203:53:203:53:203:Infinity":23}}} -,"/Users/adam/workspace/vibecode/neko/frontend/src/components/FeedListVariants.css": {"path":"/Users/adam/workspace/vibecode/neko/frontend/src/components/FeedListVariants.css","statementMap":{},"fnMap":{},"branchMap":{},"s":{},"f":{},"b":{},"meta":{"lastBranch":0,"lastFunction":0,"lastStatement":0,"seen":{}}} -,"/Users/adam/workspace/vibecode/neko/frontend/src/components/Login.css": {"path":"/Users/adam/workspace/vibecode/neko/frontend/src/components/Login.css","statementMap":{},"fnMap":{},"branchMap":{},"s":{},"f":{},"b":{},"meta":{"lastBranch":0,"lastFunction":0,"lastStatement":0,"seen":{}}} -,"/Users/adam/workspace/vibecode/neko/frontend/src/components/Login.tsx": {"path":"/Users/adam/workspace/vibecode/neko/frontend/src/components/Login.tsx","statementMap":{"0":{"start":{"line":8,"column":30},"end":{"line":8,"column":null}},"1":{"start":{"line":9,"column":30},"end":{"line":9,"column":null}},"2":{"start":{"line":10,"column":24},"end":{"line":10,"column":null}},"3":{"start":{"line":11,"column":8},"end":{"line":11,"column":null}},"4":{"start":{"line":13,"column":23},"end":{"line":37,"column":null}},"5":{"start":{"line":14,"column":4},"end":{"line":14,"column":null}},"6":{"start":{"line":15,"column":4},"end":{"line":15,"column":null}},"7":{"start":{"line":17,"column":4},"end":{"line":36,"column":null}},"8":{"start":{"line":19,"column":21},"end":{"line":19,"column":null}},"9":{"start":{"line":20,"column":6},"end":{"line":20,"column":null}},"10":{"start":{"line":21,"column":6},"end":{"line":21,"column":null}},"11":{"start":{"line":23,"column":18},"end":{"line":26,"column":null}},"12":{"start":{"line":28,"column":6},"end":{"line":33,"column":null}},"13":{"start":{"line":29,"column":8},"end":{"line":29,"column":null}},"14":{"start":{"line":31,"column":21},"end":{"line":31,"column":null}},"15":{"start":{"line":32,"column":8},"end":{"line":32,"column":null}},"16":{"start":{"line":35,"column":6},"end":{"line":35,"column":null}},"17":{"start":{"line":39,"column":2},"end":{"line":65,"column":null}},"18":{"start":{"line":49,"column":29},"end":{"line":49,"column":null}},"19":{"start":{"line":58,"column":29},"end":{"line":58,"column":null}}},"fnMap":{"0":{"name":"Login","decl":{"start":{"line":7,"column":24},"end":{"line":7,"column":32}},"loc":{"start":{"line":7,"column":32},"end":{"line":67,"column":null}},"line":7},"1":{"name":"(anonymous_1)","decl":{"start":{"line":13,"column":23},"end":{"line":13,"column":30}},"loc":{"start":{"line":13,"column":47},"end":{"line":37,"column":null}},"line":13},"2":{"name":"(anonymous_2)","decl":{"start":{"line":49,"column":22},"end":{"line":49,"column":23}},"loc":{"start":{"line":49,"column":29},"end":{"line":49,"column":null}},"line":49},"3":{"name":"(anonymous_3)","decl":{"start":{"line":58,"column":22},"end":{"line":58,"column":23}},"loc":{"start":{"line":58,"column":29},"end":{"line":58,"column":null}},"line":58}},"branchMap":{"0":{"loc":{"start":{"line":28,"column":6},"end":{"line":33,"column":null}},"type":"if","locations":[{"start":{"line":28,"column":6},"end":{"line":33,"column":null}},{"start":{"line":30,"column":13},"end":{"line":33,"column":null}}],"line":28},"1":{"loc":{"start":{"line":32,"column":17},"end":{"line":32,"column":47}},"type":"binary-expr","locations":[{"start":{"line":32,"column":17},"end":{"line":32,"column":33}},{"start":{"line":32,"column":33},"end":{"line":32,"column":47}}],"line":32},"2":{"loc":{"start":{"line":62,"column":9},"end":{"line":62,"column":null}},"type":"binary-expr","locations":[{"start":{"line":62,"column":9},"end":{"line":62,"column":18}},{"start":{"line":62,"column":18},"end":{"line":62,"column":null}}],"line":62}},"s":{"0":17,"1":17,"2":17,"3":17,"4":17,"5":3,"6":3,"7":3,"8":3,"9":3,"10":3,"11":3,"12":2,"13":1,"14":1,"15":1,"16":1,"17":17,"18":3,"19":3},"f":{"0":17,"1":3,"2":3,"3":3},"b":{"0":[1,1],"1":[1,0],"2":[17,2]},"meta":{"lastBranch":3,"lastFunction":4,"lastStatement":20,"seen":{"f:7:24:7:32":0,"s:8:30:8:Infinity":0,"s:9:30:9:Infinity":1,"s:10:24:10:Infinity":2,"s:11:8:11:Infinity":3,"s:13:23:37:Infinity":4,"f:13:23:13:30":1,"s:14:4:14:Infinity":5,"s:15:4:15:Infinity":6,"s:17:4:36:Infinity":7,"s:19:21:19:Infinity":8,"s:20:6:20:Infinity":9,"s:21:6:21:Infinity":10,"s:23:18:26:Infinity":11,"b:28:6:33:Infinity:30:13:33:Infinity":0,"s:28:6:33:Infinity":12,"s:29:8:29:Infinity":13,"s:31:21:31:Infinity":14,"s:32:8:32:Infinity":15,"b:32:17:32:33:32:33:32:47":1,"s:35:6:35:Infinity":16,"s:39:2:65:Infinity":17,"f:49:22:49:23":2,"s:49:29:49:Infinity":18,"f:58:22:58:23":3,"s:58:29:58:Infinity":19,"b:62:9:62:18:62:18:62:Infinity":2}}} -,"/Users/adam/workspace/vibecode/neko/frontend/src/components/Settings.css": {"path":"/Users/adam/workspace/vibecode/neko/frontend/src/components/Settings.css","statementMap":{},"fnMap":{},"branchMap":{},"s":{},"f":{},"b":{},"meta":{"lastBranch":0,"lastFunction":0,"lastStatement":0,"seen":{}}} -,"/Users/adam/workspace/vibecode/neko/frontend/src/components/Settings.tsx": {"path":"/Users/adam/workspace/vibecode/neko/frontend/src/components/Settings.tsx","statementMap":{"0":{"start":{"line":12,"column":24},"end":{"line":12,"column":null}},"1":{"start":{"line":14,"column":34},"end":{"line":14,"column":null}},"2":{"start":{"line":15,"column":28},"end":{"line":15,"column":null}},"3":{"start":{"line":16,"column":24},"end":{"line":16,"column":null}},"4":{"start":{"line":18,"column":34},"end":{"line":18,"column":null}},"5":{"start":{"line":21,"column":21},"end":{"line":36,"column":null}},"6":{"start":{"line":22,"column":4},"end":{"line":22,"column":null}},"7":{"start":{"line":23,"column":4},"end":{"line":35,"column":null}},"8":{"start":{"line":25,"column":8},"end":{"line":25,"column":null}},"9":{"start":{"line":25,"column":21},"end":{"line":25,"column":null}},"10":{"start":{"line":26,"column":8},"end":{"line":26,"column":null}},"11":{"start":{"line":29,"column":8},"end":{"line":29,"column":null}},"12":{"start":{"line":30,"column":8},"end":{"line":30,"column":null}},"13":{"start":{"line":33,"column":8},"end":{"line":33,"column":null}},"14":{"start":{"line":34,"column":8},"end":{"line":34,"column":null}},"15":{"start":{"line":38,"column":2},"end":{"line":41,"column":null}},"16":{"start":{"line":40,"column":4},"end":{"line":40,"column":null}},"17":{"start":{"line":44,"column":24},"end":{"line":66,"column":null}},"18":{"start":{"line":45,"column":4},"end":{"line":45,"column":null}},"19":{"start":{"line":46,"column":4},"end":{"line":46,"column":null}},"20":{"start":{"line":46,"column":21},"end":{"line":46,"column":null}},"21":{"start":{"line":48,"column":4},"end":{"line":48,"column":null}},"22":{"start":{"line":49,"column":4},"end":{"line":65,"column":null}},"23":{"start":{"line":55,"column":8},"end":{"line":55,"column":null}},"24":{"start":{"line":55,"column":21},"end":{"line":55,"column":null}},"25":{"start":{"line":56,"column":8},"end":{"line":56,"column":null}},"26":{"start":{"line":59,"column":8},"end":{"line":59,"column":null}},"27":{"start":{"line":60,"column":8},"end":{"line":60,"column":null}},"28":{"start":{"line":63,"column":8},"end":{"line":63,"column":null}},"29":{"start":{"line":64,"column":8},"end":{"line":64,"column":null}},"30":{"start":{"line":68,"column":27},"end":{"line":84,"column":null}},"31":{"start":{"line":69,"column":4},"end":{"line":69,"column":null}},"32":{"start":{"line":69,"column":75},"end":{"line":69,"column":null}},"33":{"start":{"line":71,"column":4},"end":{"line":71,"column":null}},"34":{"start":{"line":72,"column":4},"end":{"line":83,"column":null}},"35":{"start":{"line":76,"column":8},"end":{"line":76,"column":null}},"36":{"start":{"line":76,"column":21},"end":{"line":76,"column":null}},"37":{"start":{"line":77,"column":8},"end":{"line":77,"column":null}},"38":{"start":{"line":77,"column":37},"end":{"line":77,"column":49}},"39":{"start":{"line":78,"column":8},"end":{"line":78,"column":null}},"40":{"start":{"line":81,"column":8},"end":{"line":81,"column":null}},"41":{"start":{"line":82,"column":8},"end":{"line":82,"column":null}},"42":{"start":{"line":86,"column":23},"end":{"line":112,"column":null}},"43":{"start":{"line":87,"column":4},"end":{"line":87,"column":null}},"44":{"start":{"line":88,"column":4},"end":{"line":88,"column":null}},"45":{"start":{"line":88,"column":21},"end":{"line":88,"column":null}},"46":{"start":{"line":90,"column":4},"end":{"line":90,"column":null}},"47":{"start":{"line":91,"column":21},"end":{"line":91,"column":null}},"48":{"start":{"line":92,"column":4},"end":{"line":92,"column":null}},"49":{"start":{"line":93,"column":4},"end":{"line":93,"column":null}},"50":{"start":{"line":95,"column":4},"end":{"line":111,"column":null}},"51":{"start":{"line":100,"column":8},"end":{"line":100,"column":null}},"52":{"start":{"line":100,"column":21},"end":{"line":100,"column":null}},"53":{"start":{"line":101,"column":8},"end":{"line":101,"column":null}},"54":{"start":{"line":104,"column":8},"end":{"line":104,"column":null}},"55":{"start":{"line":105,"column":8},"end":{"line":105,"column":null}},"56":{"start":{"line":106,"column":8},"end":{"line":106,"column":null}},"57":{"start":{"line":109,"column":8},"end":{"line":109,"column":null}},"58":{"start":{"line":110,"column":8},"end":{"line":110,"column":null}},"59":{"start":{"line":114,"column":22},"end":{"line":131,"column":null}},"60":{"start":{"line":115,"column":4},"end":{"line":115,"column":null}},"61":{"start":{"line":116,"column":4},"end":{"line":130,"column":null}},"62":{"start":{"line":120,"column":8},"end":{"line":120,"column":null}},"63":{"start":{"line":120,"column":21},"end":{"line":120,"column":null}},"64":{"start":{"line":121,"column":8},"end":{"line":121,"column":null}},"65":{"start":{"line":124,"column":8},"end":{"line":124,"column":null}},"66":{"start":{"line":125,"column":8},"end":{"line":125,"column":null}},"67":{"start":{"line":128,"column":8},"end":{"line":128,"column":null}},"68":{"start":{"line":129,"column":8},"end":{"line":129,"column":null}},"69":{"start":{"line":133,"column":2},"end":{"line":234,"column":null}},"70":{"start":{"line":145,"column":31},"end":{"line":145,"column":null}},"71":{"start":{"line":163,"column":29},"end":{"line":163,"column":null}},"72":{"start":{"line":183,"column":31},"end":{"line":183,"column":null}},"73":{"start":{"line":217,"column":12},"end":{"line":230,"column":null}},"74":{"start":{"line":223,"column":31},"end":{"line":223,"column":null}}},"fnMap":{"0":{"name":"Settings","decl":{"start":{"line":11,"column":24},"end":{"line":11,"column":33}},"loc":{"start":{"line":11,"column":77},"end":{"line":236,"column":null}},"line":11},"1":{"name":"(anonymous_1)","decl":{"start":{"line":21,"column":39},"end":{"line":21,"column":45}},"loc":{"start":{"line":21,"column":45},"end":{"line":36,"column":5}},"line":21},"2":{"name":"(anonymous_2)","decl":{"start":{"line":24,"column":12},"end":{"line":24,"column":13}},"loc":{"start":{"line":24,"column":21},"end":{"line":27,"column":7}},"line":24},"3":{"name":"(anonymous_3)","decl":{"start":{"line":28,"column":12},"end":{"line":28,"column":13}},"loc":{"start":{"line":28,"column":22},"end":{"line":31,"column":7}},"line":28},"4":{"name":"(anonymous_4)","decl":{"start":{"line":32,"column":13},"end":{"line":32,"column":14}},"loc":{"start":{"line":32,"column":22},"end":{"line":35,"column":7}},"line":32},"5":{"name":"(anonymous_5)","decl":{"start":{"line":38,"column":12},"end":{"line":38,"column":18}},"loc":{"start":{"line":38,"column":18},"end":{"line":41,"column":5}},"line":38},"6":{"name":"(anonymous_6)","decl":{"start":{"line":44,"column":24},"end":{"line":44,"column":25}},"loc":{"start":{"line":44,"column":48},"end":{"line":66,"column":null}},"line":44},"7":{"name":"(anonymous_7)","decl":{"start":{"line":54,"column":12},"end":{"line":54,"column":13}},"loc":{"start":{"line":54,"column":21},"end":{"line":57,"column":7}},"line":54},"8":{"name":"(anonymous_8)","decl":{"start":{"line":58,"column":12},"end":{"line":58,"column":18}},"loc":{"start":{"line":58,"column":18},"end":{"line":61,"column":7}},"line":58},"9":{"name":"(anonymous_9)","decl":{"start":{"line":62,"column":13},"end":{"line":62,"column":14}},"loc":{"start":{"line":62,"column":22},"end":{"line":65,"column":7}},"line":62},"10":{"name":"(anonymous_10)","decl":{"start":{"line":68,"column":27},"end":{"line":68,"column":28}},"loc":{"start":{"line":68,"column":43},"end":{"line":84,"column":null}},"line":68},"11":{"name":"(anonymous_11)","decl":{"start":{"line":75,"column":12},"end":{"line":75,"column":13}},"loc":{"start":{"line":75,"column":21},"end":{"line":79,"column":7}},"line":75},"12":{"name":"(anonymous_12)","decl":{"start":{"line":77,"column":30},"end":{"line":77,"column":31}},"loc":{"start":{"line":77,"column":37},"end":{"line":77,"column":49}},"line":77},"13":{"name":"(anonymous_13)","decl":{"start":{"line":80,"column":13},"end":{"line":80,"column":14}},"loc":{"start":{"line":80,"column":22},"end":{"line":83,"column":7}},"line":80},"14":{"name":"(anonymous_14)","decl":{"start":{"line":86,"column":23},"end":{"line":86,"column":24}},"loc":{"start":{"line":86,"column":47},"end":{"line":112,"column":null}},"line":86},"15":{"name":"(anonymous_15)","decl":{"start":{"line":99,"column":12},"end":{"line":99,"column":13}},"loc":{"start":{"line":99,"column":21},"end":{"line":102,"column":7}},"line":99},"16":{"name":"(anonymous_16)","decl":{"start":{"line":103,"column":12},"end":{"line":103,"column":18}},"loc":{"start":{"line":103,"column":18},"end":{"line":107,"column":7}},"line":103},"17":{"name":"(anonymous_17)","decl":{"start":{"line":108,"column":13},"end":{"line":108,"column":14}},"loc":{"start":{"line":108,"column":22},"end":{"line":111,"column":7}},"line":108},"18":{"name":"(anonymous_18)","decl":{"start":{"line":114,"column":22},"end":{"line":114,"column":28}},"loc":{"start":{"line":114,"column":28},"end":{"line":131,"column":null}},"line":114},"19":{"name":"(anonymous_19)","decl":{"start":{"line":119,"column":12},"end":{"line":119,"column":13}},"loc":{"start":{"line":119,"column":21},"end":{"line":122,"column":7}},"line":119},"20":{"name":"(anonymous_20)","decl":{"start":{"line":123,"column":12},"end":{"line":123,"column":18}},"loc":{"start":{"line":123,"column":18},"end":{"line":126,"column":7}},"line":123},"21":{"name":"(anonymous_21)","decl":{"start":{"line":127,"column":13},"end":{"line":127,"column":14}},"loc":{"start":{"line":127,"column":22},"end":{"line":130,"column":7}},"line":127},"22":{"name":"(anonymous_22)","decl":{"start":{"line":145,"column":24},"end":{"line":145,"column":25}},"loc":{"start":{"line":145,"column":31},"end":{"line":145,"column":null}},"line":145},"23":{"name":"(anonymous_23)","decl":{"start":{"line":163,"column":22},"end":{"line":163,"column":23}},"loc":{"start":{"line":163,"column":29},"end":{"line":163,"column":null}},"line":163},"24":{"name":"(anonymous_24)","decl":{"start":{"line":183,"column":24},"end":{"line":183,"column":25}},"loc":{"start":{"line":183,"column":31},"end":{"line":183,"column":null}},"line":183},"25":{"name":"(anonymous_25)","decl":{"start":{"line":216,"column":21},"end":{"line":216,"column":22}},"loc":{"start":{"line":217,"column":12},"end":{"line":230,"column":null}},"line":217},"26":{"name":"(anonymous_26)","decl":{"start":{"line":223,"column":25},"end":{"line":223,"column":31}},"loc":{"start":{"line":223,"column":31},"end":{"line":223,"column":null}},"line":223}},"branchMap":{"0":{"loc":{"start":{"line":25,"column":8},"end":{"line":25,"column":null}},"type":"if","locations":[{"start":{"line":25,"column":8},"end":{"line":25,"column":null}},{"start":{},"end":{}}],"line":25},"1":{"loc":{"start":{"line":46,"column":4},"end":{"line":46,"column":null}},"type":"if","locations":[{"start":{"line":46,"column":4},"end":{"line":46,"column":null}},{"start":{},"end":{}}],"line":46},"2":{"loc":{"start":{"line":55,"column":8},"end":{"line":55,"column":null}},"type":"if","locations":[{"start":{"line":55,"column":8},"end":{"line":55,"column":null}},{"start":{},"end":{}}],"line":55},"3":{"loc":{"start":{"line":69,"column":4},"end":{"line":69,"column":null}},"type":"if","locations":[{"start":{"line":69,"column":4},"end":{"line":69,"column":null}},{"start":{},"end":{}}],"line":69},"4":{"loc":{"start":{"line":76,"column":8},"end":{"line":76,"column":null}},"type":"if","locations":[{"start":{"line":76,"column":8},"end":{"line":76,"column":null}},{"start":{},"end":{}}],"line":76},"5":{"loc":{"start":{"line":88,"column":4},"end":{"line":88,"column":null}},"type":"if","locations":[{"start":{"line":88,"column":4},"end":{"line":88,"column":null}},{"start":{},"end":{}}],"line":88},"6":{"loc":{"start":{"line":100,"column":8},"end":{"line":100,"column":null}},"type":"if","locations":[{"start":{"line":100,"column":8},"end":{"line":100,"column":null}},{"start":{},"end":{}}],"line":100},"7":{"loc":{"start":{"line":120,"column":8},"end":{"line":120,"column":null}},"type":"if","locations":[{"start":{"line":120,"column":8},"end":{"line":120,"column":null}},{"start":{},"end":{}}],"line":120},"8":{"loc":{"start":{"line":137,"column":7},"end":{"line":154,"column":null}},"type":"binary-expr","locations":[{"start":{"line":137,"column":7},"end":{"line":137,"column":null}},{"start":{"line":138,"column":8},"end":{"line":154,"column":null}}],"line":137},"9":{"loc":{"start":{"line":144,"column":21},"end":{"line":144,"column":null}},"type":"binary-expr","locations":[{"start":{"line":144,"column":21},"end":{"line":144,"column":34}},{"start":{"line":144,"column":34},"end":{"line":144,"column":null}}],"line":144},"10":{"loc":{"start":{"line":183,"column":45},"end":{"line":183,"column":72}},"type":"binary-expr","locations":[{"start":{"line":183,"column":45},"end":{"line":183,"column":68}},{"start":{"line":183,"column":68},"end":{"line":183,"column":72}}],"line":183},"11":{"loc":{"start":{"line":187,"column":44},"end":{"line":187,"column":68}},"type":"binary-expr","locations":[{"start":{"line":187,"column":44},"end":{"line":187,"column":59}},{"start":{"line":187,"column":59},"end":{"line":187,"column":68}}],"line":187},"12":{"loc":{"start":{"line":210,"column":7},"end":{"line":210,"column":null}},"type":"binary-expr","locations":[{"start":{"line":210,"column":7},"end":{"line":210,"column":16}},{"start":{"line":210,"column":16},"end":{"line":210,"column":null}}],"line":210},"13":{"loc":{"start":{"line":214,"column":9},"end":{"line":214,"column":null}},"type":"binary-expr","locations":[{"start":{"line":214,"column":9},"end":{"line":214,"column":20}},{"start":{"line":214,"column":20},"end":{"line":214,"column":null}}],"line":214},"14":{"loc":{"start":{"line":219,"column":46},"end":{"line":219,"column":73}},"type":"binary-expr","locations":[{"start":{"line":219,"column":46},"end":{"line":219,"column":60}},{"start":{"line":219,"column":60},"end":{"line":219,"column":73}}],"line":219}},"s":{"0":34,"1":34,"2":34,"3":34,"4":34,"5":34,"6":9,"7":9,"8":9,"9":0,"10":9,"11":9,"12":9,"13":0,"14":0,"15":34,"16":7,"17":34,"18":2,"19":2,"20":0,"21":2,"22":2,"23":2,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":34,"31":1,"32":0,"33":1,"34":1,"35":1,"36":0,"37":1,"38":1,"39":1,"40":0,"41":0,"42":34,"43":1,"44":1,"45":0,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":0,"53":1,"54":1,"55":1,"56":1,"57":0,"58":0,"59":34,"60":1,"61":1,"62":1,"63":0,"64":1,"65":1,"66":1,"67":0,"68":0,"69":34,"70":1,"71":2,"72":1,"73":6,"74":1},"f":{"0":34,"1":9,"2":9,"3":9,"4":0,"5":7,"6":2,"7":2,"8":1,"9":1,"10":1,"11":1,"12":1,"13":0,"14":1,"15":1,"16":1,"17":0,"18":1,"19":1,"20":1,"21":0,"22":1,"23":2,"24":1,"25":6,"26":1},"b":{"0":[0,9],"1":[0,2],"2":[1,1],"3":[0,1],"4":[0,1],"5":[0,1],"6":[0,1],"7":[0,1],"8":[34,3],"9":[3,0],"10":[1,0],"11":[34,3],"12":[34,1],"13":[34,13],"14":[6,0]},"meta":{"lastBranch":15,"lastFunction":27,"lastStatement":75,"seen":{"f:11:24:11:33":0,"s:12:24:12:Infinity":0,"s:14:34:14:Infinity":1,"s:15:28:15:Infinity":2,"s:16:24:16:Infinity":3,"s:18:34:18:Infinity":4,"s:21:21:36:Infinity":5,"f:21:39:21:45":1,"s:22:4:22:Infinity":6,"s:23:4:35:Infinity":7,"f:24:12:24:13":2,"b:25:8:25:Infinity:undefined:undefined:undefined:undefined":0,"s:25:8:25:Infinity":8,"s:25:21:25:Infinity":9,"s:26:8:26:Infinity":10,"f:28:12:28:13":3,"s:29:8:29:Infinity":11,"s:30:8:30:Infinity":12,"f:32:13:32:14":4,"s:33:8:33:Infinity":13,"s:34:8:34:Infinity":14,"s:38:2:41:Infinity":15,"f:38:12:38:18":5,"s:40:4:40:Infinity":16,"s:44:24:66:Infinity":17,"f:44:24:44:25":6,"s:45:4:45:Infinity":18,"b:46:4:46:Infinity:undefined:undefined:undefined:undefined":1,"s:46:4:46:Infinity":19,"s:46:21:46:Infinity":20,"s:48:4:48:Infinity":21,"s:49:4:65:Infinity":22,"f:54:12:54:13":7,"b:55:8:55:Infinity:undefined:undefined:undefined:undefined":2,"s:55:8:55:Infinity":23,"s:55:21:55:Infinity":24,"s:56:8:56:Infinity":25,"f:58:12:58:18":8,"s:59:8:59:Infinity":26,"s:60:8:60:Infinity":27,"f:62:13:62:14":9,"s:63:8:63:Infinity":28,"s:64:8:64:Infinity":29,"s:68:27:84:Infinity":30,"f:68:27:68:28":10,"b:69:4:69:Infinity:undefined:undefined:undefined:undefined":3,"s:69:4:69:Infinity":31,"s:69:75:69:Infinity":32,"s:71:4:71:Infinity":33,"s:72:4:83:Infinity":34,"f:75:12:75:13":11,"b:76:8:76:Infinity:undefined:undefined:undefined:undefined":4,"s:76:8:76:Infinity":35,"s:76:21:76:Infinity":36,"s:77:8:77:Infinity":37,"f:77:30:77:31":12,"s:77:37:77:49":38,"s:78:8:78:Infinity":39,"f:80:13:80:14":13,"s:81:8:81:Infinity":40,"s:82:8:82:Infinity":41,"s:86:23:112:Infinity":42,"f:86:23:86:24":14,"s:87:4:87:Infinity":43,"b:88:4:88:Infinity:undefined:undefined:undefined:undefined":5,"s:88:4:88:Infinity":44,"s:88:21:88:Infinity":45,"s:90:4:90:Infinity":46,"s:91:21:91:Infinity":47,"s:92:4:92:Infinity":48,"s:93:4:93:Infinity":49,"s:95:4:111:Infinity":50,"f:99:12:99:13":15,"b:100:8:100:Infinity:undefined:undefined:undefined:undefined":6,"s:100:8:100:Infinity":51,"s:100:21:100:Infinity":52,"s:101:8:101:Infinity":53,"f:103:12:103:18":16,"s:104:8:104:Infinity":54,"s:105:8:105:Infinity":55,"s:106:8:106:Infinity":56,"f:108:13:108:14":17,"s:109:8:109:Infinity":57,"s:110:8:110:Infinity":58,"s:114:22:131:Infinity":59,"f:114:22:114:28":18,"s:115:4:115:Infinity":60,"s:116:4:130:Infinity":61,"f:119:12:119:13":19,"b:120:8:120:Infinity:undefined:undefined:undefined:undefined":7,"s:120:8:120:Infinity":62,"s:120:21:120:Infinity":63,"s:121:8:121:Infinity":64,"f:123:12:123:18":20,"s:124:8:124:Infinity":65,"s:125:8:125:Infinity":66,"f:127:13:127:14":21,"s:128:8:128:Infinity":67,"s:129:8:129:Infinity":68,"s:133:2:234:Infinity":69,"b:137:7:137:Infinity:138:8:154:Infinity":8,"b:144:21:144:34:144:34:144:Infinity":9,"f:145:24:145:25":22,"s:145:31:145:Infinity":70,"f:163:22:163:23":23,"s:163:29:163:Infinity":71,"f:183:24:183:25":24,"s:183:31:183:Infinity":72,"b:183:45:183:68:183:68:183:72":10,"b:187:44:187:59:187:59:187:68":11,"b:210:7:210:16:210:16:210:Infinity":12,"b:214:9:214:20:214:20:214:Infinity":13,"f:216:21:216:22":25,"s:217:12:230:Infinity":73,"b:219:46:219:60:219:60:219:73":14,"f:223:25:223:31":26,"s:223:31:223:Infinity":74}}} -} diff --git a/frontend/coverage/favicon.png b/frontend/coverage/favicon.png deleted file mode 100644 index c1525b8..0000000 Binary files a/frontend/coverage/favicon.png and /dev/null differ diff --git a/frontend/coverage/index.html b/frontend/coverage/index.html deleted file mode 100644 index 3c8ce1b..0000000 --- a/frontend/coverage/index.html +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - Code coverage report for All files - - - - - - - - - -
-
-

All files

-
- -
- 84.12% - Statements - 302/359 -
- - -
- 73.24% - Branches - 167/228 -
- - -
- 81.48% - Functions - 88/108 -
- - -
- 86.4% - Lines - 286/331 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
src -
-
70.21%33/4765.71%23/3560%9/1571.11%32/45
src/components -
-
86.21%269/31274.61%144/19384.94%79/9388.81%254/286
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/prettify.css b/frontend/coverage/prettify.css deleted file mode 100644 index b317a7c..0000000 --- a/frontend/coverage/prettify.css +++ /dev/null @@ -1 +0,0 @@ -.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} diff --git a/frontend/coverage/prettify.js b/frontend/coverage/prettify.js deleted file mode 100644 index b322523..0000000 --- a/frontend/coverage/prettify.js +++ /dev/null @@ -1,2 +0,0 @@ -/* 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;V122)){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;arat[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=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=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=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=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*]*(?:>|$)/],[j,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[L,/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\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=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]*(?:>|$)/],[PR.PR_COMMENT,/^<\!--[\s\S]*?(?:-\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-handlebars",/^]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\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"]); diff --git a/frontend/coverage/sort-arrow-sprite.png b/frontend/coverage/sort-arrow-sprite.png deleted file mode 100644 index 6ed6831..0000000 Binary files a/frontend/coverage/sort-arrow-sprite.png and /dev/null differ diff --git a/frontend/coverage/sorter.js b/frontend/coverage/sorter.js deleted file mode 100644 index 4ed70ae..0000000 --- a/frontend/coverage/sorter.js +++ /dev/null @@ -1,210 +0,0 @@ -/* 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]; - } - - function onFilterInput() { - const searchValue = document.getElementById('fileSearch').value; - const rows = document.getElementsByTagName('tbody')[0].children; - - // Try to create a RegExp from the searchValue. If it fails (invalid regex), - // it will be treated as a plain text search - let searchRegex; - try { - searchRegex = new RegExp(searchValue, 'i'); // 'i' for case-insensitive - } catch (error) { - searchRegex = null; - } - - for (let i = 0; i < rows.length; i++) { - const row = rows[i]; - let isMatch = false; - - if (searchRegex) { - // If a valid regex was created, use it for matching - isMatch = searchRegex.test(row.textContent); - } else { - // Otherwise, fall back to the original plain text search - isMatch = row.textContent - .toLowerCase() - .includes(searchValue.toLowerCase()); - } - - row.style.display = isMatch ? '' : 'none'; - } - } - - // loads the search box - function addSearchBox() { - var template = document.getElementById('filterTemplate'); - var templateClone = template.content.cloneNode(true); - templateClone.getElementById('fileSearch').oninput = onFilterInput; - template.parentElement.appendChild(templateClone); - } - - // 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 + ''; - } - } - 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(); - addSearchBox(); - addSortIndicators(); - enableUI(); - }; -})(); - -window.addEventListener('load', addSorting); diff --git a/frontend/coverage/src/App.css.html b/frontend/coverage/src/App.css.html deleted file mode 100644 index d23e87b..0000000 --- a/frontend/coverage/src/App.css.html +++ /dev/null @@ -1,478 +0,0 @@ - - - - - - Code coverage report for src/App.css - - - - - - - - - -
-
-

All files / src App.css

-
- -
- 0% - Statements - 0/0 -
- - -
- 0% - Branches - 0/0 -
- - -
- 0% - Functions - 0/0 -
- - -
- 0% - Lines - 0/0 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
/* Resets and Base Styles */
-* {
-  box-sizing: border-box;
-}
- 
-body {
-  margin: 0;
-}
- 
-/* Dashboard Layout */
-.dashboard {
-  display: flex;
-  flex-direction: column;
-  height: 100vh;
-  overflow: hidden;
-  /* Prevent body scroll */
-}
- 
-/* Header styles removed as we moved to sidebar navigation */
- 
-.dashboard-content {
-  display: flex;
-  flex: 1;
-  overflow: hidden;
-  position: relative;
-}
- 
-.dashboard-sidebar {
-  width: 11rem;
-  background: transparent;
-  border-right: 1px solid var(--border-color);
-  display: flex;
-  flex-direction: column;
-  overflow-y: auto;
-  transition: margin-left 0.4s ease;
-  /* No padding here, handled in FeedList */
-}
- 
-.dashboard-sidebar.hidden {
-  margin-left: -11rem;
-}
- 
-.dashboard-main {
-  flex: 1;
-  padding: 2rem;
-  overflow-y: auto;
-  background: var(--bg-color);
-  margin-left: 0;
-}
- 
-.dashboard-main>* {
-  max-width: 35em;
-  margin: 0 auto;
-}
- 
-.fixed-toggle {
-  position: absolute;
-  top: 1rem;
-  left: 1rem;
-  z-index: 1000;
-  background: var(--bg-color);
-  /* Added bg to be visible over content if needed */
-  border: none;
-  font-size: 2rem;
-  line-height: 1;
-  cursor: pointer;
-  padding: 0.2rem;
-  color: var(--text-color);
-  border-radius: 50%;
-  box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
-  display: flex;
-  align-items: center;
-  justify-content: center;
-}
- 
-.fixed-toggle:hover {
-  transform: scale(1.1);
-}
- 
-/* Mobile Responsiveness */
-@media (max-width: 768px) {
-  .dashboard-sidebar {
-    position: fixed;
-    top: 0;
-    left: 0;
-    bottom: 0;
-    z-index: 1100;
-    box-shadow: 2px 0 10px rgba(0, 0, 0, 0.2);
-    width: 14rem;
-    /* Slightly wider on mobile for better target area */
-  }
- 
-  .dashboard-sidebar.hidden {
-    margin-left: -14rem;
-  }
- 
-  .dashboard-main {
-    padding: 1rem;
-    padding-top: 4rem;
-    /* Space for the toggle button */
-  }
- 
-  .dashboard-main>* {
-    max-width: 100%;
-  }
- 
-  /* When sidebar is visible on mobile, we show a backdrop */
-  .sidebar-backdrop {
-    position: fixed;
-    top: 0;
-    left: 0;
-    right: 0;
-    bottom: 0;
-    background: rgba(0, 0, 0, 0.4);
-    z-index: 1050;
-    animation: fadeIn 0.3s ease;
-  }
- 
-  .dashboard.sidebar-visible::after {
-    display: none;
-  }
-}
- 
-@keyframes fadeIn {
-  from {
-    opacity: 0;
-  }
- 
-  to {
-    opacity: 1;
-  }
-}
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/src/App.tsx.html b/frontend/coverage/src/App.tsx.html deleted file mode 100644 index 6ec66af..0000000 --- a/frontend/coverage/src/App.tsx.html +++ /dev/null @@ -1,505 +0,0 @@ - - - - - - Code coverage report for src/App.tsx - - - - - - - - - -
-
-

All files / src App.tsx

-
- -
- 65.71% - Statements - 23/35 -
- - -
- 60% - Branches - 15/25 -
- - -
- 53.84% - Functions - 7/13 -
- - -
- 64.7% - Lines - 22/34 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141  -  -  -  -  -  -  -  -2x -2x -  -2x -1x -  -1x -1x -  -  -  -  -  -  -  -2x -1x -  -  -1x -  -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x -  -1x -1x -  -  -  -  -  -  -1x -1x -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -2x -2x -  -2x -  -  -  -  -2x -  -  -  -  -2x -  -2x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import React, { useEffect, useState } from 'react';
-import { BrowserRouter, Routes, Route, Navigate, useLocation } from 'react-router-dom';
-import Login from './components/Login';
-import './App.css';
-import { apiFetch } from './utils';
- 
-// Protected Route wrapper
-function RequireAuth({ children }: { children: React.ReactElement }) {
-  const [auth, setAuth] = useState<boolean | null>(null);
-  const location = useLocation();
- 
-  useEffect(() => {
-    apiFetch('/api/auth')
-      .then((res) => {
-        if (res.ok) {
-          setAuth(true);
-        } else E{
-          setAuth(false);
-        }
-      })
-      .catch(() => setAuth(false));
-  }, []);
- 
-  if (auth === null) {
-    return <div>Loading...</div>;
-  }
- 
-  Iif (!auth) {
-    return <Navigate to="/login" state={{ from: location }} replace />;
-  }
- 
-  return children;
-}
- 
-import FeedList from './components/FeedList';
-import FeedItems from './components/FeedItems';
-import Settings from './components/Settings';
- 
-interface DashboardProps {
-  theme: string;
-  setTheme: (t: string) => void;
-  fontTheme: string;
-  setFontTheme: (t: string) => void;
-}
- 
-function Dashboard({ theme, setTheme, fontTheme, setFontTheme }: DashboardProps) {
-  const [sidebarVisible, setSidebarVisible] = useState(window.innerWidth > 768);
- 
-  useEffect(() => {
-    const handleResize = () => {
-      if (window.innerWidth > 768) {
-        setSidebarVisible(true);
-      } else {
-        setSidebarVisible(false);
-      }
-    };
-    window.addEventListener('resize', handleResize);
-    return () => window.removeEventListener('resize', handleResize);
-  }, []);
- 
-  return (
-    <div
-      className={`dashboard ${sidebarVisible ? 'sidebar-visible' : 'sidebar-hidden'} theme-${theme} font-${fontTheme}`}
-    >
-      <div className="dashboard-content">
-        {(!sidebarVisible || window.innerWidth <= 768) && (
-          <button
-            className="sidebar-toggle fixed-toggle"
-            onClick={() => setSidebarVisible(!sidebarVisible)}
-            title={sidebarVisible ? "Hide Sidebar" : "Show Sidebar"}
-          >
-            🐱
-          </button>
-        )}
-        {sidebarVisible && (
-          <div
-            className="sidebar-backdrop"
-            onClick={() => setSidebarVisible(false)}
-          />
-        )}
-        <aside className={`dashboard-sidebar ${sidebarVisible ? '' : 'hidden'}`}>
-          <FeedList
-            theme={theme}
-            setTheme={setTheme}
-            setSidebarVisible={setSidebarVisible}
-            isMobile={window.innerWidth <= 768}
-          />
-        </aside>
-        <main className="dashboard-main">
-          <Routes>
-            <Route path="/feed/:feedId" element={<FeedItems />} />
-            <Route path="/tag/:tagName" element={<FeedItems />} />
-            <Route path="/settings" element={<Settings fontTheme={fontTheme} setFontTheme={setFontTheme} />} />
-            <Route path="/" element={<FeedItems />} />
-          </Routes>
-        </main>
-      </div>
-    </div>
-  );
-}
- 
-function App() {
-  const [theme, setTheme] = useState(localStorage.getItem('neko-theme') || 'light');
-  const [fontTheme, setFontTheme] = useState(localStorage.getItem('neko-font-theme') || 'default');
- 
-  const handleSetTheme = (newTheme: string) => {
-    setTheme(newTheme);
-    localStorage.setItem('neko-theme', newTheme);
-  };
- 
-  const handleSetFontTheme = (newFontTheme: string) => {
-    setFontTheme(newFontTheme);
-    localStorage.setItem('neko-font-theme', newFontTheme);
-  };
- 
-  const basename = window.location.pathname.startsWith('/v2') ? '/v2' : '/';
- 
-  return (
-    <BrowserRouter basename={basename}>
-      <Routes>
-        <Route path="/login" element={<Login />} />
-        <Route
-          path="/*"
-          element={
-            <RequireAuth>
-              <Dashboard
-                theme={theme}
-                setTheme={handleSetTheme}
-                fontTheme={fontTheme}
-                setFontTheme={handleSetFontTheme}
-              />
-            </RequireAuth>
-          }
-        />
-      </Routes>
-    </BrowserRouter>
-  );
-}
- 
-export default App;
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/src/components/FeedItem.css.html b/frontend/coverage/src/components/FeedItem.css.html deleted file mode 100644 index 192959f..0000000 --- a/frontend/coverage/src/components/FeedItem.css.html +++ /dev/null @@ -1,526 +0,0 @@ - - - - - - Code coverage report for src/components/FeedItem.css - - - - - - - - - -
-
-

All files / src/components FeedItem.css

-
- -
- 0% - Statements - 0/0 -
- - -
- 0% - Branches - 0/0 -
- - -
- 0% - Functions - 0/0 -
- - -
- 0% - Lines - 0/0 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
.feed-item {
-  padding: 1rem;
-  margin-top: 5rem;
-  list-style: none;
-  border-bottom: none;
-}
- 
-/* removed read/unread specific font-weight to keep it always bold as requested */
- 
-.item-header {
-  display: flex;
-  justify-content: space-between;
-  align-items: flex-start;
-  margin-bottom: 0.5rem;
-}
- 
-.item-title {
-  font-family: var(--font-heading);
-  font-size: 1.8rem;
-  font-weight: bold;
-  text-decoration: none;
-  color: var(--link-color);
-  display: block;
-  flex: 1;
-}
- 
-.item-title:hover {
-  text-decoration: none;
-  color: var(--link-color);
-}
- 
-.item-actions {
-  display: flex;
-  gap: 0.5rem;
-  margin-left: 1rem;
-}
- 
-/* Legacy controls were simple text/links, but buttons are fine if minimal */
-.star-btn {
-  background: none;
-  border: none;
-  cursor: pointer;
-  font-size: 1.25rem;
-  padding: 0 0 0 0.5rem;
-  vertical-align: middle;
-  transition: color 0.2s;
-  line-height: 1;
-}
- 
-.star-btn.is-starred {
-  color: blue;
-}
- 
-.star-btn.is-unstarred {
-  color: var(--text-color);
-  opacity: 0.3;
-}
- 
-.star-btn:hover {
-  color: blue;
-}
- 
-.action-btn {
-  background: var(--sidebar-bg);
-  border: 1px solid var(--border-color, #ccc);
-  cursor: pointer;
-  padding: 2px 6px;
-  font-size: 1rem;
-  color: blue;
-  font-weight: bold;
-}
- 
-.action-btn:hover {
-  background-color: #eee;
-}
- 
-.dateline {
-  margin-top: 0;
-  font-weight: normal;
-  font-size: 0.75em;
-  color: #ccc;
-  margin-bottom: 1rem;
-}
- 
-.dateline a {
-  color: #ccc;
-  text-decoration: none;
-}
- 
-.item-description {
-  color: var(--text-color);
-  line-height: 1.5;
-  font-size: 1rem;
-  margin-top: 1rem;
-}
- 
-.item-description img {
-  max-width: 100%;
-  height: auto;
-  display: block;
-  margin: 1rem 0;
-}
- 
-.item-description blockquote {
-  padding: 1rem 1rem 0 1rem;
-  border-left: 4px solid var(--sidebar-bg);
-  color: var(--text-color);
-  opacity: 0.8;
-  margin-left: 0;
-}
- 
-.scrape-btn {
-  background: var(--bg-color);
-  border: 1px solid var(--border-color, #ccc);
-  color: blue;
-  cursor: pointer;
-  font-family: var(--font-heading);
-  font-weight: bold;
-  font-size: 0.8rem;
-  padding: 2px 6px;
-  margin-left: 0.5rem;
-}
- 
-.scrape-btn:hover {
-  background: var(--sidebar-bg);
-}
- 
-@media (max-width: 768px) {
-  .feed-item {
-    margin-top: 2rem;
-    padding: 0.5rem;
-  }
- 
-  .item-title {
-    font-size: 1.4rem;
-    word-break: break-word;
-  }
- 
-  .item-header {
-    flex-direction: column;
-    gap: 0.5rem;
-  }
- 
-  .item-actions {
-    margin-left: 0;
-    margin-bottom: 0.5rem;
-  }
-}
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/src/components/FeedItem.tsx.html b/frontend/coverage/src/components/FeedItem.tsx.html deleted file mode 100644 index 6df1fec..0000000 --- a/frontend/coverage/src/components/FeedItem.tsx.html +++ /dev/null @@ -1,430 +0,0 @@ - - - - - - Code coverage report for src/components/FeedItem.tsx - - - - - - - - - -
-
-

All files / src/components FeedItem.tsx

-
- -
- 78.12% - Statements - 25/32 -
- - -
- 86.95% - Branches - 20/23 -
- - -
- 83.33% - Functions - 10/12 -
- - -
- 80.64% - Lines - 25/31 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116  -  -  -  -  -  -  -  -  -  -  -56x -56x -  -56x -22x -  -  -56x -1x -  -  -56x -1x -  -1x -1x -  -1x -  -  -  -  -  -  -  -  -  -  -  -1x -  -  -1x -  -  -  -  -1x -  -  -  -  -  -  -  -  -  -56x -1x -1x -1x -  -1x -1x -  -  -1x -1x -  -  -  -  -  -  -  -56x -  -  -  -  -  -  -  -1x -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { useState, useEffect } from 'react';
-import type { Item } from '../types';
-import './FeedItem.css';
- 
-import { apiFetch } from '../utils';
- 
-interface FeedItemProps {
-  item: Item;
-}
- 
-export default function FeedItem({ item: initialItem }: FeedItemProps) {
-  const [item, setItem] = useState(initialItem);
-  const [loading, setLoading] = useState(false);
- 
-  useEffect(() => {
-    setItem(initialItem);
-  }, [initialItem]);
- 
-  const toggleStar = () => {
-    updateItem({ ...item, starred: !item.starred });
-  };
- 
-  const updateItem = (newItem: Item) => {
-    setLoading(true);
-    // Optimistic update
-    const previousItem = item;
-    setItem(newItem);
- 
-    apiFetch(`/api/item/${newItem._id}`, {
-      method: 'PUT',
-      headers: {
-        'Content-Type': 'application/json',
-      },
-      body: JSON.stringify({
-        _id: newItem._id,
-        read: newItem.read,
-        starred: newItem.starred,
-      }),
-    })
-      .then((res) => {
-        Iif (!res.ok) {
-          throw new Error('Failed to update item');
-        }
-        return res.json();
-      })
-      .then(() => {
-        // Confirm with server response if needed, but for now we trust the optimistic update
-        // or we could setItem(updated) if the server returns the full object
-        setLoading(false);
-      })
-      .catch((err) => {
-        console.error('Error updating item:', err);
-        // Revert on error
-        setItem(previousItem);
-        setLoading(false);
-      });
-  };
- 
-  const loadFullContent = (e: React.MouseEvent) => {
-    e.stopPropagation();
-    setLoading(true);
-    apiFetch(`/api/item/${item._id}`)
-      .then((res) => {
-        Iif (!res.ok) throw new Error('Failed to fetch full content');
-        return res.json();
-      })
-      .then((data) => {
-        setItem({ ...item, ...data });
-        setLoading(false);
-      })
-      .catch((err) => {
-        console.error('Error fetching full content:', err);
-        setLoading(false);
-      });
-  };
- 
-  return (
-    <li className={`feed-item ${item.read ? 'read' : 'unread'} ${loading ? 'loading' : ''}`}>
-      <div className="item-header">
-        <a href={item.url} target="_blank" rel="noopener noreferrer" className="item-title">
-          {item.title || '(No Title)'}
-        </a>
-        <button
-          onClick={(e) => {
-            e.stopPropagation();
-            toggleStar();
-          }}
-          className={`star-btn ${item.starred ? 'is-starred' : 'is-unstarred'}`}
-          title={item.starred ? 'Unstar' : 'Star'}
-        >
-          ★
-        </button>
-      </div>
-      <div className="dateline">
-        <a href={item.url} target="_blank" rel="noopener noreferrer">
-          {new Date(item.publish_date).toLocaleDateString()}
-          {item.feed_title && ` - ${item.feed_title}`}
-        </a>
-        <div className="item-actions" style={{ display: 'inline-block', float: 'right' }}>
-          {!item.full_content && (
-            <button onClick={loadFullContent} className="scrape-btn" title="Load Full Content">
-              text
-            </button>
-          )}
-        </div>
-      </div>
-      {(item.full_content || item.description) && (
-        <div
-          className="item-description"
-          dangerouslySetInnerHTML={{ __html: item.full_content || item.description }}
-        />
-      )}
-    </li>
-  );
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/src/components/FeedItems.css.html b/frontend/coverage/src/components/FeedItems.css.html deleted file mode 100644 index 66a3307..0000000 --- a/frontend/coverage/src/components/FeedItems.css.html +++ /dev/null @@ -1,151 +0,0 @@ - - - - - - Code coverage report for src/components/FeedItems.css - - - - - - - - - -
-
-

All files / src/components FeedItems.css

-
- -
- 0% - Statements - 0/0 -
- - -
- 0% - Branches - 0/0 -
- - -
- 0% - Functions - 0/0 -
- - -
- 0% - Lines - 0/0 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
.feed-items {
-  padding: 1rem 0;
-  /* Removing horizontal padding to avoid double-padding with FeedItem */
-}
- 
-.feed-items h2 {
-  margin-top: 0;
-  border-bottom: 2px solid var(--border-color);
-  padding-bottom: 0.5rem;
-}
- 
-.item-list {
-  list-style: none;
-  padding: 0;
-}
- 
-.loading-more {
-  padding: 2rem;
-  text-align: center;
-  color: #888;
-  font-size: 0.9rem;
-  min-height: 50px;
-}
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/src/components/FeedItems.tsx.html b/frontend/coverage/src/components/FeedItems.tsx.html deleted file mode 100644 index 9811743..0000000 --- a/frontend/coverage/src/components/FeedItems.tsx.html +++ /dev/null @@ -1,838 +0,0 @@ - - - - - - Code coverage report for src/components/FeedItems.tsx - - - - - - - - - -
-
-

All files / src/components FeedItems.tsx

-
- -
- 89.23% - Statements - 116/130 -
- - -
- 76.19% - Branches - 64/84 -
- - -
- 87.09% - Functions - 27/31 -
- - -
- 89.07% - Lines - 106/119 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191 -192 -193 -194 -195 -196 -197 -198 -199 -200 -201 -202 -203 -204 -205 -206 -207 -208 -209 -210 -211 -212 -213 -214 -215 -216 -217 -218 -219 -220 -221 -222 -223 -224 -225 -226 -227 -228 -229 -230 -231 -232 -233 -234 -235 -236 -237 -238 -239 -240 -241 -242 -243 -244 -245 -246 -247 -248 -249 -250 -251 -252  -  -  -  -  -  -  -  -36x -36x -36x -  -36x -36x -36x -36x -36x -36x -  -36x -11x -3x -  -8x -8x -  -11x -  -11x -11x -  -11x -2x -9x -1x -  -  -11x -3x -  -  -  -11x -11x -  -  -  -11x -  -11x -  -  -  -  -11x -11x -  -  -  -11x -11x -11x -  -  -11x -  -10x -  -  -10x -  -  -9x -3x -  -6x -  -9x -9x -9x -  -  -1x -1x -1x -  -  -  -36x -8x -8x -  -  -  -  -36x -5x -5x -5x -  -  -  -36x -2x -  -3x -  -2x -  -  -  -  -  -  -36x -1x -  -2x -  -1x -  -  -  -  -  -  -36x -31x -6x -  -6x -5x -5x -5x -5x -5x -1x -  -5x -  -  -  -  -5x -2x -  -  -5x -  -1x -  -  -  -  -  -  -  -1x -1x -1x -1x -  -1x -  -  -  -  -31x -31x -  -  -  -  -  -36x -  -31x -  -1x -  -1x -1x -1x -1x -1x -1x -  -  -  -  -  -  -  -  -  -31x -  -1x -1x -1x -  -  -  -  -  -  -31x -31x -31x -  -  -31x -31x -  -31x -31x -31x -  -  -  -  -36x -21x -  -20x -  -  -  -  -  -  -44x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { useEffect, useState } from 'react';
-import { useParams, useSearchParams } from 'react-router-dom';
-import type { Item } from '../types';
-import FeedItem from './FeedItem';
-import './FeedItems.css';
-import { apiFetch } from '../utils';
- 
-export default function FeedItems() {
-  const { feedId, tagName } = useParams<{ feedId: string; tagName: string }>();
-  const [searchParams] = useSearchParams();
-  const filterFn = searchParams.get('filter') || 'unread';
- 
-  const [items, setItems] = useState<Item[]>([]);
-  const [loading, setLoading] = useState(true);
-  const [loadingMore, setLoadingMore] = useState(false);
-  const [hasMore, setHasMore] = useState(true);
-  const [error, setError] = useState('');
-  const [selectedIndex, setSelectedIndex] = useState(-1);
- 
-  const fetchItems = (maxId?: string) => {
-    if (maxId) {
-      setLoadingMore(true);
-    } else {
-      setLoading(true);
-      setItems([]);
-    }
-    setError('');
- 
-    let url = '/api/stream';
-    const params = new URLSearchParams();
- 
-    if (feedId) {
-      params.append('feed_id', feedId);
-    } else if (tagName) {
-      params.append('tag', tagName);
-    }
- 
-    if (maxId) {
-      params.append('max_id', maxId);
-    }
- 
-    // Apply filters
-    const searchQuery = searchParams.get('q');
-    Iif (searchQuery) {
-      params.append('q', searchQuery);
-    }
- 
-    Iif (filterFn === 'all') {
-      params.append('read_filter', 'all');
-    I} else if (filterFn === 'starred') {
-      params.append('starred', 'true');
-      params.append('read_filter', 'all');
-    } else {
-      // default to unread
-      Eif (!searchQuery) {
-        params.append('read_filter', 'unread');
-      }
-    }
- 
-    const queryString = params.toString();
-    Eif (queryString) {
-      url += `?${queryString}`;
-    }
- 
-    apiFetch(url)
-      .then((res) => {
-        Iif (!res.ok) {
-          throw new Error('Failed to fetch items');
-        }
-        return res.json();
-      })
-      .then((data) => {
-        if (maxId) {
-          setItems((prev) => [...prev, ...data]);
-        } else {
-          setItems(data);
-        }
-        setHasMore(data.length > 0);
-        setLoading(false);
-        setLoadingMore(false);
-      })
-      .catch((err) => {
-        setError(err.message);
-        setLoading(false);
-        setLoadingMore(false);
-      });
-  };
- 
-  useEffect(() => {
-    fetchItems();
-    setSelectedIndex(-1);
-    // eslint-disable-next-line react-hooks/exhaustive-deps
-  }, [feedId, tagName, filterFn, searchParams]);
- 
- 
-  const scrollToItem = (index: number) => {
-    const element = document.getElementById(`item-${index}`);
-    Eif (element) {
-      element.scrollIntoView({ behavior: 'auto', block: 'start' });
-    }
-  };
- 
-  const markAsRead = (item: Item) => {
-    const updatedItem = { ...item, read: true };
-    // Optimistic update
-    setItems((prevItems) => prevItems.map((i) => (i._id === item._id ? updatedItem : i)));
- 
-    apiFetch(`/api/item/${item._id}`, {
-      method: 'PUT',
-      headers: { 'Content-Type': 'application/json' },
-      body: JSON.stringify({ read: true, starred: item.starred }),
-    }).catch((err) => console.error('Failed to mark read', err));
-  };
- 
-  const toggleStar = (item: Item) => {
-    const updatedItem = { ...item, starred: !item.starred };
-    // Optimistic update
-    setItems((prevItems) => prevItems.map((i) => (i._id === item._id ? updatedItem : i)));
- 
-    apiFetch(`/api/item/${item._id}`, {
-      method: 'PUT',
-      headers: { 'Content-Type': 'application/json' },
-      body: JSON.stringify({ read: item.read, starred: !item.starred }),
-    }).catch((err) => console.error('Failed to toggle star', err));
-  };
- 
-  useEffect(() => {
-    const handleKeyDown = (e: KeyboardEvent) => {
-      Iif (items.length === 0) return;
- 
-      if (e.key === 'j') {
-        setSelectedIndex((prev) => {
-          const nextIndex = Math.min(prev + 1, items.length - 1);
-          Eif (nextIndex !== prev) {
-            const item = items[nextIndex];
-            if (!item.read) {
-              markAsRead(item);
-            }
-            scrollToItem(nextIndex);
-          }
- 
-          // If we're now on the last item and there are more items to load,
-          // trigger loading them so the next 'j' press will work
-          if (nextIndex === items.length - 1 && hasMore && !loadingMore) {
-            fetchItems(String(items[items.length - 1]._id));
-          }
- 
-          return nextIndex;
-        });
-      I} else if (e.key === 'k') {
-        setSelectedIndex((prev) => {
-          const nextIndex = Math.max(prev - 1, 0);
-          if (nextIndex !== prev) {
-            scrollToItem(nextIndex);
-          }
-          return nextIndex;
-        });
-      E} else if (e.key === 's') {
-        setSelectedIndex((currentIndex) => {
-          Eif (currentIndex >= 0 && currentIndex < items.length) {
-            toggleStar(items[currentIndex]);
-          }
-          return currentIndex;
-        });
-      }
-    };
- 
-    window.addEventListener('keydown', handleKeyDown);
-    return () => window.removeEventListener('keydown', handleKeyDown);
-    // eslint-disable-next-line react-hooks/exhaustive-deps
-  }, [items, hasMore, loadingMore]);
- 
- 
- 
-  useEffect(() => {
-    // Observer for marking items as read
-    const itemObserver = new IntersectionObserver(
-      (entries) => {
-        entries.forEach((entry) => {
-          // If item is not intersecting and is above the viewport, it's been scrolled past
-          Eif (!entry.isIntersecting && entry.boundingClientRect.top < 0) {
-            const index = Number(entry.target.getAttribute('data-index'));
-            Eif (!isNaN(index) && index >= 0 && index < items.length) {
-              const item = items[index];
-              Eif (!item.read) {
-                markAsRead(item);
-              }
-            }
-          }
-        });
-      },
-      { root: null, threshold: 0 }
-    );
- 
-    // Observer for infinite scroll (less aggressive, must be fully visible)
-    const sentinelObserver = new IntersectionObserver(
-      (entries) => {
-        entries.forEach((entry) => {
-          Eif (entry.isIntersecting && !loadingMore && hasMore && items.length > 0) {
-            fetchItems(String(items[items.length - 1]._id));
-          }
-        });
-      },
-      { root: null, threshold: 1.0 }
-    );
- 
-    items.forEach((_, index) => {
-      const el = document.getElementById(`item-${index}`);
-      Eif (el) itemObserver.observe(el);
-    });
- 
-    const sentinel = document.getElementById('load-more-sentinel');
-    if (sentinel) sentinelObserver.observe(sentinel);
- 
-    return () => {
-      itemObserver.disconnect();
-      sentinelObserver.disconnect();
-    };
-    // eslint-disable-next-line react-hooks/exhaustive-deps
-  }, [items, loadingMore, hasMore]);
- 
-  if (loading) return <div className="feed-items-loading">Loading items...</div>;
-  if (error) return <div className="feed-items-error">Error: {error}</div>;
- 
-  return (
-    <div className="feed-items">
-      {items.length === 0 ? (
-        <p>No items found.</p>
-      ) : (
-        <ul className="item-list">
-          {items.map((item, index) => (
-            <div
-              id={`item-${index}`}
-              key={item._id}
-              data-index={index}
-              data-selected={index === selectedIndex}
-              onClick={() => setSelectedIndex(index)}
-            >
-              <FeedItem item={item} />
-            </div>
-          ))}
-          {hasMore && (
-            <div id="load-more-sentinel" className="loading-more">
-              {loadingMore ? 'Loading more...' : ''}
-            </div>
-          )}
-        </ul>
-      )}
-    </div>
-  );
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/src/components/FeedList.css.html b/frontend/coverage/src/components/FeedList.css.html deleted file mode 100644 index d892e77..0000000 --- a/frontend/coverage/src/components/FeedList.css.html +++ /dev/null @@ -1,724 +0,0 @@ - - - - - - Code coverage report for src/components/FeedList.css - - - - - - - - - -
-
-

All files / src/components FeedList.css

-
- -
- 0% - Statements - 0/0 -
- - -
- 0% - Branches - 0/0 -
- - -
- 0% - Functions - 0/0 -
- - -
- 0% - Lines - 0/0 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191 -192 -193 -194 -195 -196 -197 -198 -199 -200 -201 -202 -203 -204 -205 -206 -207 -208 -209 -210 -211 -212 -213 -214  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
.feed-list {
-  padding: 1rem;
-  font-family: var(--font-heading);
-  color: #777;
-  /* specific v1 color */
-  font-size: 0.8rem;
-  background: var(--sidebar-bg);
-  min-height: 100%;
-  flex: 1;
-}
- 
-.feed-list h1.logo {
-  font-size: 2rem;
-  /* match v1 */
-  margin: 0 0 1rem 0;
-  line-height: 1;
-  cursor: pointer;
-  position: sticky;
-  top: 0;
-  background: var(--sidebar-bg);
-  z-index: 10;
-  padding-bottom: 0.5rem;
-  color: var(--text-color);
-}
- 
-/* Override logo color if necessary for themes */
-.theme-light .feed-list h1.logo {
-  color: #333;
-}
- 
-.theme-dark .feed-list h1.logo {
-  color: #eee;
-}
- 
-.search-section {
-  margin-bottom: 1rem;
-}
- 
-.search-input {
-  width: 100%;
-  padding: 0.25rem;
-  border: 1px solid var(--border-color, #999);
-  background: var(--bg-color);
-  color: var(--text-color);
-  font-size: 0.8rem;
-  font-family: inherit;
-  border-radius: 0;
-  /* v1 didn't have rounded inputs usually */
-}
- 
-.section-header {
-  font-size: 1rem;
-  /* v1 h4 size? */
-  font-weight: bold;
-  margin: 1rem 0 0.25rem 0;
-  cursor: pointer;
-  user-select: none;
-  font-family: var(--font-heading);
-  color: #333;
-  /* Darker than list items */
-  text-transform: lowercase;
-  font-variant: small-caps;
-  display: flex;
-  align-items: center;
-  gap: 0.5rem;
-}
- 
-.caret {
-  display: inline-block;
-  font-size: 0.6rem;
-  transition: transform 0.2s ease;
-  color: #777;
-}
- 
-.caret.expanded {
-  transform: rotate(90deg);
-}
- 
-.filter-list,
-.tag-list-items,
-.feed-list-items,
-.nav-list {
-  list-style: none;
-  padding: 0;
-  margin: 0;
-}
- 
-.filter-list li,
-.nav-list li {
-  margin-bottom: 0.1rem;
-}
- 
-.filter-list a,
-.nav-list a,
-.tag-link,
-.feed-title,
-.logout-link {
-  text-decoration: none;
-  color: var(--link-color, blue);
-  font-size: 0.8rem;
-  /* Matches v1 .75em approx */
-  display: block;
-  cursor: pointer;
-  background: none;
-  border: none;
-  padding: 0;
-  font-family: inherit;
-  font-variant: small-caps;
-  text-transform: lowercase;
-  white-space: nowrap;
-  overflow: hidden;
-  text-overflow: ellipsis;
-}
- 
-.filter-list a:hover,
-.nav-list a:hover,
-.tag-link:hover,
-.feed-title:hover,
-.logout-link:hover {
-  text-decoration: underline;
-  color: var(--link-color, blue);
-}
- 
-.filter-list a.active,
-.tag-link.active,
-.feed-title.active {
-  font-weight: bold;
-  color: #000;
-  /* Active state black */
-}
- 
-.tag-item,
-.sidebar-feed-item {
-  margin-bottom: 0;
-}
- 
-.feed-category {
-  display: none;
-}
- 
-.nav-section {
-  margin-top: 2rem;
-  border-top: 1px solid var(--border-color, #eee);
-  padding-top: 1rem;
-}
- 
-.logout-link {
-  text-align: left;
-  width: 100%;
-  color: #777;
-  display: block;
-}
- 
-.nav-link,
-.logout-link {
-  padding: 0.25rem 0;
-}
- 
-.logout-link:hover {
-  color: var(--link-color, blue);
-  text-decoration: underline;
-}
- 
-.theme-section {
-  margin-top: 1rem;
-}
- 
-.theme-selector {
-  display: flex;
-  gap: 0.5rem;
-  margin-top: 0.5rem;
-}
- 
-.theme-selector button {
-  background: rgba(0, 0, 0, 0.05);
-  border: none;
-  cursor: pointer;
-  padding: 0.4rem;
-  font-size: 1rem;
-  border-radius: 8px;
-  line-height: 1;
-  transition: all 0.2s ease;
-  display: flex;
-  align-items: center;
-  justify-content: center;
-}
- 
-.theme-selector button:hover {
-  background: rgba(0, 0, 0, 0.1);
-  transform: translateY(-2px);
-}
- 
-.theme-selector button.active {
-  background: var(--border-color, #999);
-  color: white;
-  box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
-}
- 
-.theme-dark .theme-selector button {
-  background: rgba(255, 255, 255, 0.1);
-}
- 
-.theme-dark .theme-selector button:hover {
-  background: rgba(255, 255, 255, 0.2);
-}
- 
-/* Scrollbar styling for webkit */
-.dashboard-sidebar::-webkit-scrollbar {
-  width: 4px;
-}
- 
-.dashboard-sidebar::-webkit-scrollbar-thumb {
-  background-color: var(--border-color, #999);
-}
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/src/components/FeedList.tsx.html b/frontend/coverage/src/components/FeedList.tsx.html deleted file mode 100644 index 4061422..0000000 --- a/frontend/coverage/src/components/FeedList.tsx.html +++ /dev/null @@ -1,721 +0,0 @@ - - - - - - Code coverage report for src/components/FeedList.tsx - - - - - - - - - -
-
-

All files / src/components FeedList.tsx

-
- -
- 87.27% - Statements - 48/55 -
- - -
- 70% - Branches - 35/50 -
- - -
- 78.94% - Functions - 15/19 -
- - -
- 90% - Lines - 45/50 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191 -192 -193 -194 -195 -196 -197 -198 -199 -200 -201 -202 -203 -204 -205 -206 -207 -208 -209 -210 -211 -212 -213  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -22x -22x -22x -22x -22x -22x -22x -22x -22x -22x -22x -  -22x -  -22x -11x -11x -  -  -  -  -  -22x -  -  -22x -1x -1x -1x -  -  -  -22x -2x -  -  -22x -  -  -  -22x -1x -1x -  -  -  -22x -9x -  -7x -7x -  -  -7x -7x -  -  -  -7x -7x -7x -  -  -1x -1x -  -  -  -22x -13x -  -12x -2x -  -  -12x -  -  -  -  -  -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -4x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -2x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { useEffect, useState } from 'react';
-import { Link, useNavigate, useSearchParams, useLocation, useParams } from 'react-router-dom';
-import type { Feed, Category } from '../types';
-import './FeedList.css';
-import './FeedListVariants.css';
-import { apiFetch } from '../utils';
- 
-export default function FeedList({
-  theme,
-  setTheme,
-  setSidebarVisible,
-  isMobile,
-}: {
-  theme: string;
-  setTheme: (t: string) => void;
-  setSidebarVisible: (visible: boolean) => void;
-  isMobile: boolean;
-}) {
-  const [feeds, setFeeds] = useState<Feed[]>([]);
-  const [tags, setTags] = useState<Category[]>([]);
-  const [loading, setLoading] = useState(true);
-  const [error, setError] = useState('');
-  const [feedsExpanded, setFeedsExpanded] = useState(false);
-  const [tagsExpanded, setTagsExpanded] = useState(true);
-  const [searchQuery, setSearchQuery] = useState('');
-  const navigate = useNavigate();
-  const [searchParams] = useSearchParams();
-  const location = useLocation();
-  const { feedId, tagName } = useParams();
- 
-  const sidebarVariant = searchParams.get('sidebar') || localStorage.getItem('neko-sidebar-variant') || 'glass';
- 
-  useEffect(() => {
-    const variant = searchParams.get('sidebar');
-    Iif (variant) {
-      localStorage.setItem('neko-sidebar-variant', variant);
-    }
-  }, [searchParams]);
- 
-  const currentFilter =
-    searchParams.get('filter') ||
-    (location.pathname === '/' && !feedId && !tagName ? 'unread' : '');
- 
-  const handleSearch = (e: React.FormEvent) => {
-    e.preventDefault();
-    Eif (searchQuery.trim()) {
-      navigate(`/?q=${encodeURIComponent(searchQuery.trim())}`);
-    }
-  };
- 
-  const toggleFeeds = () => {
-    setFeedsExpanded(!feedsExpanded);
-  };
- 
-  const toggleTags = () => {
-    setTagsExpanded(!tagsExpanded);
-  };
- 
-  const handleLinkClick = () => {
-    Eif (isMobile) {
-      setSidebarVisible(false);
-    }
-  };
- 
-  useEffect(() => {
-    Promise.all([
-      apiFetch('/api/feed/').then((res) => {
-        Iif (!res.ok) throw new Error('Failed to fetch feeds');
-        return res.json() as Promise<Feed[]>;
-      }),
-      apiFetch('/api/tag').then((res) => {
-        Iif (!res.ok) throw new Error('Failed to fetch tags');
-        return res.json() as Promise<Category[]>;
-      }),
-    ])
-      .then(([feedsData, tagsData]) => {
-        setFeeds(feedsData);
-        setTags(tagsData);
-        setLoading(false);
-      })
-      .catch((err) => {
-        setError(err.message);
-        setLoading(false);
-      });
-  }, []);
- 
-  if (loading) return <div className="feed-list-loading">Loading feeds...</div>;
-  if (error) return <div className="feed-list-error">Error: {error}</div>;
- 
-  const handleLogout = () => {
-    apiFetch('/api/logout', { method: 'POST' }).then(() => (window.location.href = '/v2/login'));
-  };
- 
-  return (
-    <div className={`feed-list variant-${sidebarVariant}`}>
-      <h1 className="logo" onClick={() => setSidebarVisible(false)}>
-        🐱
-      </h1>
- 
-      <div className="search-section">
-        <form onSubmit={handleSearch} className="search-form">
-          <input
-            type="search"
-            placeholder="search..."
-            value={searchQuery}
-            onChange={(e) => setSearchQuery(e.target.value)}
-            className="search-input"
-          />
-        </form>
-      </div>
- 
-      <div className="filter-section">
-        <ul className="filter-list">
-          <li className="unread_filter">
-            <Link to="/?filter=unread" className={currentFilter === 'unread' ? 'active' : ''} onClick={handleLinkClick}>
-              unread
-            </Link>
-          </li>
-          <li className="all_filter">
-            <Link to="/?filter=all" className={currentFilter === 'all' ? 'active' : ''} onClick={handleLinkClick}>
-              all
-            </Link>
-          </li>
-          <li className="starred_filter">
-            <Link to="/?filter=starred" className={currentFilter === 'starred' ? 'active' : ''} onClick={handleLinkClick}>
-              starred
-            </Link>
-          </li>
-        </ul>
-      </div>
- 
-      <div className="tag-section">
-        <h4 onClick={toggleTags} className="section-header">
-          <span className={`caret ${tagsExpanded ? 'expanded' : ''}`}>▶</span> Tags
-        </h4>
-        {tagsExpanded && (
-          <ul className="tag-list-items">
-            {tags.map((tag) => (
-              <li key={tag.title} className="tag-item">
-                <Link
-                  to={`/tag/${encodeURIComponent(tag.title)}`}
-                  className={`tag-link ${tagName === tag.title ? 'active' : ''}`}
-                  onClick={handleLinkClick}
-                >
-                  {tag.title}
-                </Link>
-              </li>
-            ))}
-          </ul>
-        )}
-      </div>
- 
-      <div className="feed-section">
-        <h4 onClick={toggleFeeds} className="section-header">
-          <span className={`caret ${feedsExpanded ? 'expanded' : ''}`}>▶</span> Feeds
-        </h4>
-        {feedsExpanded &&
-          (feeds.length === 0 ? (
-            <p>No feeds found.</p>
-          ) : (
-            <ul className="feed-list-items">
-              {feeds.map((feed) => (
-                <li key={feed._id} className="sidebar-feed-item">
-                  <Link
-                    to={`/feed/${feed._id}`}
-                    className={`feed-title ${feedId === String(feed._id) ? 'active' : ''}`}
-                    onClick={handleLinkClick}
-                  >
-                    {feed.title || feed.url}
-                  </Link>
-                </li>
-              ))}
-            </ul>
-          ))}
-      </div>
- 
-      <div className="nav-section">
-        <ul className="nav-list">
-          <li>
-            <Link to="/settings" className="nav-link" onClick={handleLinkClick}>
-              settings
-            </Link>
-          </li>
-          <li>
-            <button onClick={handleLogout} className="logout-link">
-              logout
-            </button>
-          </li>
-        </ul>
-      </div>
- 
-      <div className="theme-section">
-        <div className="theme-selector">
-          <button
-            onClick={() => setTheme('light')}
-            className={theme === 'light' ? 'active' : ''}
-            title="Light Theme"
-          >
-            ☀️
-          </button>
-          <button
-            onClick={() => setTheme('dark')}
-            className={theme === 'dark' ? 'active' : ''}
-            title="Dark Theme"
-          >
-            🌙
-          </button>
-        </div>
-      </div>
-    </div>
-  );
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/src/components/Login.css.html b/frontend/coverage/src/components/Login.css.html deleted file mode 100644 index 140a86b..0000000 --- a/frontend/coverage/src/components/Login.css.html +++ /dev/null @@ -1,274 +0,0 @@ - - - - - - Code coverage report for src/components/Login.css - - - - - - - - - -
-
-

All files / src/components Login.css

-
- -
- 0% - Statements - 0/0 -
- - -
- 0% - Branches - 0/0 -
- - -
- 0% - Functions - 0/0 -
- - -
- 0% - Lines - 0/0 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
.login-container {
-  display: flex;
-  justify-content: center;
-  align-items: center;
-  height: 100vh;
-  background-color: #f5f5f5;
-}
- 
-.login-form {
-  background: white;
-  padding: 2rem;
-  border-radius: 8px;
-  box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
-  width: 100%;
-  max-width: 400px;
-}
- 
-.login-form h1 {
-  margin-bottom: 2rem;
-  text-align: center;
-  color: #333;
-}
- 
-.form-group {
-  margin-bottom: 1.5rem;
-}
- 
-.form-group label {
-  display: block;
-  margin-bottom: 0.5rem;
-  font-weight: bold;
-  color: #555;
-}
- 
-.form-group input {
-  width: 100%;
-  padding: 0.75rem;
-  border: 1px solid #ddd;
-  border-radius: 4px;
-  font-size: 1rem;
-}
- 
-.error-message {
-  color: #dc3545;
-  margin-bottom: 1rem;
-  text-align: center;
-}
- 
-button[type='submit'] {
-  width: 100%;
-  padding: 0.75rem;
-  background-color: #007bff;
-  color: white;
-  border: none;
-  border-radius: 4px;
-  font-size: 1rem;
-  cursor: pointer;
-  transition: background-color 0.2s;
-}
- 
-button[type='submit']:hover {
-  background-color: #0056b3;
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/src/components/Login.tsx.html b/frontend/coverage/src/components/Login.tsx.html deleted file mode 100644 index 111dcba..0000000 --- a/frontend/coverage/src/components/Login.tsx.html +++ /dev/null @@ -1,286 +0,0 @@ - - - - - - Code coverage report for src/components/Login.tsx - - - - - - - - - -
-
-

All files / src/components Login.tsx

-
- -
- 100% - Statements - 20/20 -
- - -
- 83.33% - Branches - 5/6 -
- - -
- 100% - Functions - 4/4 -
- - -
- 100% - Lines - 20/20 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68  -  -  -  -  -  -  -17x -17x -17x -17x -  -17x -3x -3x -  -3x -  -3x -3x -3x -  -3x -  -  -  -  -2x -1x -  -1x -1x -  -  -1x -  -  -  -17x -  -  -  -  -  -  -  -  -  -3x -  -  -  -  -  -  -  -  -3x -  -  -  -  -  -  -  -  -  - 
import { useState, type FormEvent } from 'react';
-import { useNavigate } from 'react-router-dom';
-import './Login.css';
- 
-import { apiFetch } from '../utils';
- 
-export default function Login() {
-  const [username, setUsername] = useState('neko');
-  const [password, setPassword] = useState('');
-  const [error, setError] = useState('');
-  const navigate = useNavigate();
- 
-  const handleSubmit = async (e: FormEvent) => {
-    e.preventDefault();
-    setError('');
- 
-    try {
-      // Use URLSearchParams to send as form-urlencoded, matching backend expectation
-      const params = new URLSearchParams();
-      params.append('username', username);
-      params.append('password', password);
- 
-      const res = await apiFetch('/api/login', {
-        method: 'POST',
-        body: params,
-      });
- 
-      if (res.ok) {
-        navigate('/');
-      } else {
-        const data = await res.json();
-        setError(data.message || 'Login failed');
-      }
-    } catch (_err) {
-      setError('Network error');
-    }
-  };
- 
-  return (
-    <div className="login-container">
-      <form onSubmit={handleSubmit} className="login-form">
-        <h1>neko rss mode</h1>
-        <div className="form-group">
-          <label htmlFor="username">username</label>
-          <input
-            id="username"
-            type="text"
-            value={username}
-            onChange={(e) => setUsername(e.target.value)}
-          />
-        </div>
-        <div className="form-group">
-          <label htmlFor="password">password</label>
-          <input
-            id="password"
-            type="password"
-            value={password}
-            onChange={(e) => setPassword(e.target.value)}
-            autoFocus
-          />
-        </div>
-        {error && <div className="error-message">{error}</div>}
-        <button type="submit">login</button>
-      </form>
-    </div>
-  );
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/src/components/Settings.css.html b/frontend/coverage/src/components/Settings.css.html deleted file mode 100644 index 4109bba..0000000 --- a/frontend/coverage/src/components/Settings.css.html +++ /dev/null @@ -1,802 +0,0 @@ - - - - - - Code coverage report for src/components/Settings.css - - - - - - - - - -
-
-

All files / src/components Settings.css

-
- -
- 0% - Statements - 0/0 -
- - -
- 0% - Branches - 0/0 -
- - -
- 0% - Functions - 0/0 -
- - -
- 0% - Lines - 0/0 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191 -192 -193 -194 -195 -196 -197 -198 -199 -200 -201 -202 -203 -204 -205 -206 -207 -208 -209 -210 -211 -212 -213 -214 -215 -216 -217 -218 -219 -220 -221 -222 -223 -224 -225 -226 -227 -228 -229 -230 -231 -232 -233 -234 -235 -236 -237 -238 -239 -240  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
.settings-page.variant-glass {
-  padding: 2.5rem;
-  max-width: 800px;
-  margin: 0 auto;
-  background: rgba(255, 255, 255, 0.05);
-  backdrop-filter: blur(12px);
-  -webkit-backdrop-filter: blur(12px);
-  border-radius: 24px;
-  border: 1px solid rgba(255, 255, 255, 0.1);
-  font-family: system-ui, -apple-system, sans-serif;
-  color: var(--text-color);
-  margin-top: 2rem;
-  margin-bottom: 2rem;
-}
- 
-.settings-page.variant-glass h2,
-.settings-page.variant-glass h3 {
-  font-weight: 700;
-  letter-spacing: -0.02em;
-  color: var(--text-color);
-  opacity: 0.9;
-}
- 
-.add-feed-section,
-.appearance-section,
-.import-section,
-.export-section,
-.feed-list-section {
-  background: rgba(255, 255, 255, 0.03);
-  padding: 1.5rem;
-  border-radius: 16px;
-  margin-bottom: 2rem;
-  border: 1px solid rgba(255, 255, 255, 0.05);
-  transition: all 0.3s ease;
-}
- 
-.add-feed-section:hover,
-.appearance-section:hover,
-.import-section:hover,
-.export-section:hover,
-.feed-list-section:hover {
-  background: rgba(255, 255, 255, 0.06);
-  border-color: rgba(255, 255, 255, 0.1);
-}
- 
-.font-selector {
-  display: flex;
-  align-items: center;
-  gap: 1rem;
-}
- 
-.font-select {
-  padding: 0.6rem 1rem;
-  border: 1px solid rgba(255, 255, 255, 0.1);
-  background: rgba(0, 0, 0, 0.1);
-  color: var(--text-color);
-  border-radius: 20px;
-  font-size: 1rem;
-  min-width: 200px;
-  cursor: pointer;
-  outline: none;
-  transition: border-color 0.2s;
-}
- 
-.font-select:focus {
-  border-color: rgba(255, 255, 255, 0.3);
-}
- 
-.add-feed-form {
-  display: flex;
-  gap: 1rem;
-}
- 
-.feed-input {
-  flex: 1;
-  padding: 0.6rem 1.2rem;
-  border: 1px solid rgba(255, 255, 255, 0.1);
-  background: rgba(0, 0, 0, 0.1);
-  color: var(--text-color);
-  border-radius: 20px;
-  font-size: 1rem;
-  outline: none;
-  transition: border-color 0.2s;
-}
- 
-.feed-input:focus {
-  border-color: rgba(255, 255, 255, 0.3);
-}
- 
-.error-message {
-  color: #ff5252;
-  margin-top: 1rem;
-  font-weight: 600;
-}
- 
-.settings-feed-list {
-  list-style: none;
-  padding: 0;
-  border: 1px solid rgba(255, 255, 255, 0.05);
-  border-radius: 12px;
-  overflow: hidden;
-}
- 
-.settings-feed-item {
-  display: flex;
-  justify-content: space-between;
-  align-items: center;
-  padding: 1.2rem;
-  border-bottom: 1px solid rgba(255, 255, 255, 0.05);
-  transition: background 0.2s;
-}
- 
-.settings-feed-item:hover {
-  background: rgba(255, 255, 255, 0.02);
-}
- 
-.settings-feed-item:last-child {
-  border-bottom: none;
-}
- 
-.feed-info {
-  display: flex;
-  flex-direction: column;
-  gap: 0.2rem;
-}
- 
-.feed-title {
-  font-weight: 600;
-  font-size: 1.05rem;
-  opacity: 0.9;
-}
- 
-.feed-url {
-  color: var(--text-color);
-  opacity: 0.5;
-  font-size: 0.85rem;
-}
- 
-.delete-btn {
-  background: rgba(255, 82, 82, 0.15);
-  color: #ff8a80;
-  border: 1px solid rgba(255, 82, 82, 0.2);
-  padding: 0.5rem 1rem;
-  border-radius: 12px;
-  cursor: pointer;
-  font-weight: 600;
-  transition: all 0.2s;
-}
- 
-.delete-btn:hover:not(:disabled) {
-  background: rgba(255, 82, 82, 0.3);
-  color: #fff;
-  border-color: rgba(255, 82, 82, 0.4);
-  transform: scale(1.05);
-}
- 
-.import-export-section {
-  display: flex;
-  gap: 2rem;
-}
- 
-@media (max-width: 600px) {
-  .settings-page.variant-glass {
-    padding: 1.5rem;
-    margin-top: 1rem;
-  }
- 
-  .add-feed-form {
-    flex-direction: column;
-  }
- 
-  .import-export-section {
-    flex-direction: column;
-    gap: 1rem;
-  }
- 
-  .settings-feed-item {
-    flex-direction: column;
-    align-items: flex-start;
-    gap: 1rem;
-  }
-}
- 
-.import-form {
-  display: flex;
-  flex-direction: column;
-  gap: 1.2rem;
-}
- 
-.file-input {
-  font-size: 0.9rem;
-  max-width: 100%;
-  color: var(--text-color);
-  opacity: 0.8;
-}
- 
-.export-buttons {
-  display: flex;
-  gap: 0.8rem;
-  flex-wrap: wrap;
-}
- 
-.export-btn {
-  display: inline-block;
-  padding: 0.6rem 1.2rem;
-  background: rgba(255, 255, 255, 0.05);
-  color: var(--text-color);
-  text-decoration: none;
-  border: 1px solid rgba(255, 255, 255, 0.1);
-  border-radius: 12px;
-  font-weight: 600;
-  transition: all 0.2s;
-}
- 
-.export-btn:hover {
-  background: rgba(255, 255, 255, 0.1);
-  transform: translateY(-2px);
-  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
-}
- 
-button:not(.delete-btn) {
-  cursor: pointer;
-  padding: 0.6rem 1.2rem;
-  border-radius: 12px;
-  border: 1px solid rgba(255, 255, 255, 0.1);
-  background: rgba(255, 255, 255, 0.1);
-  color: var(--text-color);
-  font-weight: 600;
-  transition: all 0.2s;
-}
- 
-button:not(.delete-btn):hover:not(:disabled) {
-  background: rgba(255, 255, 255, 0.2);
-  transform: scale(1.02);
-}
- 
-button:disabled {
-  opacity: 0.4;
-  cursor: not-allowed;
-}
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/src/components/Settings.tsx.html b/frontend/coverage/src/components/Settings.tsx.html deleted file mode 100644 index 892218e..0000000 --- a/frontend/coverage/src/components/Settings.tsx.html +++ /dev/null @@ -1,793 +0,0 @@ - - - - - - Code coverage report for src/components/Settings.tsx - - - - - - - - - -
-
-

All files / src/components Settings.tsx

-
- -
- 80% - Statements - 60/75 -
- - -
- 66.66% - Branches - 20/30 -
- - -
- 85.18% - Functions - 23/27 -
- - -
- 87.87% - Lines - 58/66 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191 -192 -193 -194 -195 -196 -197 -198 -199 -200 -201 -202 -203 -204 -205 -206 -207 -208 -209 -210 -211 -212 -213 -214 -215 -216 -217 -218 -219 -220 -221 -222 -223 -224 -225 -226 -227 -228 -229 -230 -231 -232 -233 -234 -235 -236 -237  -  -  -  -  -  -  -  -  -  -  -34x -  -34x -34x -34x -  -34x -  -  -34x -9x -9x -  -9x -9x -  -  -9x -9x -  -  -  -  -  -  -  -34x -  -7x -  -  -  -34x -2x -2x -  -2x -2x -  -  -  -  -  -2x -1x -  -  -1x -1x -  -  -1x -1x -  -  -  -34x -1x -  -1x -1x -  -  -  -1x -1x -1x -  -  -  -  -  -  -  -34x -1x -1x -  -1x -1x -1x -1x -  -1x -  -  -  -  -1x -1x -  -  -1x -1x -1x -  -  -  -  -  -  -  -34x -1x -1x -  -  -  -1x -1x -  -  -1x -1x -  -  -  -  -  -  -  -34x -  -  -  -  -  -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -2x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -6x -  -  -  -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import React, { useEffect, useState } from 'react';
-import type { Feed } from '../types';
-import './Settings.css';
-import { apiFetch } from '../utils';
- 
-interface SettingsProps {
-  fontTheme?: string;
-  setFontTheme?: (t: string) => void;
-}
- 
-export default function Settings({ fontTheme, setFontTheme }: SettingsProps) {
-  const [feeds, setFeeds] = useState<Feed[]>([]);
-  /* ... existing state ... */
-  const [newFeedUrl, setNewFeedUrl] = useState('');
-  const [loading, setLoading] = useState(false);
-  const [error, setError] = useState<string | null>(null);
- 
-  const [importFile, setImportFile] = useState<File | null>(null);
- 
-  /* ... existing fetchFeeds ... */
-  const fetchFeeds = React.useCallback(() => {
-    setLoading(true);
-    apiFetch('/api/feed/')
-      .then((res) => {
-        Iif (!res.ok) throw new Error('Failed to fetch feeds');
-        return res.json();
-      })
-      .then((data) => {
-        setFeeds(data);
-        setLoading(false);
-      })
-      .catch((err) => {
-        setError(err.message);
-        setLoading(false);
-      });
-  }, []);
- 
-  useEffect(() => {
-    // eslint-disable-next-line
-    fetchFeeds();
-  }, [fetchFeeds]);
- 
-  /* ... existing handlers ... */
-  const handleAddFeed = (e: React.FormEvent) => {
-    e.preventDefault();
-    Iif (!newFeedUrl) return;
- 
-    setLoading(true);
-    apiFetch('/api/feed/', {
-      method: 'POST',
-      headers: { 'Content-Type': 'application/json' },
-      body: JSON.stringify({ url: newFeedUrl }),
-    })
-      .then((res) => {
-        if (!res.ok) throw new Error('Failed to add feed');
-        return res.json();
-      })
-      .then(() => {
-        setNewFeedUrl('');
-        fetchFeeds();
-      })
-      .catch((err) => {
-        setError(err.message);
-        setLoading(false);
-      });
-  };
- 
-  const handleDeleteFeed = (id: number) => {
-    Iif (!globalThis.confirm('Are you sure you want to delete this feed?')) return;
- 
-    setLoading(true);
-    apiFetch(`/api/feed/${id}`, {
-      method: 'DELETE',
-    })
-      .then((res) => {
-        Iif (!res.ok) throw new Error('Failed to delete feed');
-        setFeeds(feeds.filter((f) => f._id !== id));
-        setLoading(false);
-      })
-      .catch((err) => {
-        setError(err.message);
-        setLoading(false);
-      });
-  };
- 
-  const handleImport = (e: React.FormEvent) => {
-    e.preventDefault();
-    Iif (!importFile) return;
- 
-    setLoading(true);
-    const formData = new FormData();
-    formData.append('file', importFile);
-    formData.append('format', 'opml');
- 
-    apiFetch('/api/import', {
-      method: 'POST',
-      body: formData,
-    })
-      .then((res) => {
-        Iif (!res.ok) throw new Error('Failed to import feeds');
-        return res.json();
-      })
-      .then(() => {
-        setImportFile(null);
-        fetchFeeds();
-        alert('Import successful!');
-      })
-      .catch((err) => {
-        setError(err.message);
-        setLoading(false);
-      });
-  };
- 
-  const handleCrawl = () => {
-    setLoading(true);
-    apiFetch('/api/crawl', {
-      method: 'POST',
-    })
-      .then((res) => {
-        Iif (!res.ok) throw new Error('Failed to start crawl');
-        return res.json();
-      })
-      .then(() => {
-        setLoading(false);
-        alert('Crawl started!');
-      })
-      .catch((err) => {
-        setError(err.message);
-        setLoading(false);
-      });
-  };
- 
-  return (
-    <div className="settings-page variant-glass">
-      <h2>Settings</h2>
- 
-      {setFontTheme && (
-        <div className="appearance-section">
-          <h3>Appearance</h3>
-          <div className="font-selector">
-            <label htmlFor="font-theme-select">Font Theme:</label>
-            <select
-              id="font-theme-select"
-              value={fontTheme || 'default'}
-              onChange={(e) => setFontTheme(e.target.value)}
-              className="font-select"
-            >
-              <option value="default">Default</option>
-              <option value="serif">Serif</option>
-              <option value="sans">Sans-Serif</option>
-              <option value="mono">Monospace</option>
-            </select>
-          </div>
-        </div>
-      )}
- 
-      <div className="add-feed-section">
-        <h3>Add New Feed</h3>
-        <form onSubmit={handleAddFeed} className="add-feed-form">
-          <input
-            type="url"
-            value={newFeedUrl}
-            onChange={(e) => setNewFeedUrl(e.target.value)}
-            placeholder="https://example.com/feed.xml"
-            required
-            className="feed-input"
-            disabled={loading}
-          />
-          <button type="submit" disabled={loading}>
-            Add Feed
-          </button>
-        </form>
-      </div>
- 
-      <div className="import-export-section">
-        <div className="import-section">
-          <h3>Import Feeds (OPML)</h3>
-          <form onSubmit={handleImport} className="import-form">
-            <input
-              type="file"
-              accept=".opml,.xml,.txt"
-              aria-label="Import Feeds"
-              onChange={(e) => setImportFile(e.target.files?.[0] || null)}
-              className="file-input"
-              disabled={loading}
-            />
-            <button type="submit" disabled={!importFile || loading}>
-              Import
-            </button>
-          </form>
-        </div>
- 
-        <div className="export-section">
-          <h3>Export Feeds</h3>
-          <div className="export-buttons">
-            <a href="/api/export/opml" className="export-btn">OPML</a>
-            <a href="/api/export/text" className="export-btn">Text</a>
-            <a href="/api/export/json" className="export-btn">JSON</a>
-          </div>
-        </div>
- 
-        <div className="crawl-section">
-          <h3>Actions</h3>
-          <button onClick={handleCrawl} disabled={loading} className="crawl-btn">
-            Crawl All Feeds Now
-          </button>
-        </div>
-      </div>
- 
-      {error && <p className="error-message">{error}</p>}
- 
-      <div className="feed-list-section">
-        <h3>Manage Feeds</h3>
-        {loading && <p>Loading...</p>}
-        <ul className="settings-feed-list">
-          {feeds.map((feed) => (
-            <li key={feed._id} className="settings-feed-item">
-              <div className="feed-info">
-                <span className="feed-title">{feed.title || '(No Title)'}</span>
-                <span className="feed-url">{feed.url}</span>
-              </div>
-              <button
-                onClick={() => handleDeleteFeed(feed._id)}
-                className="delete-btn"
-                disabled={loading}
-                title="Delete Feed"
-              >
-                Delete
-              </button>
-            </li>
-          ))}
-        </ul>
-      </div>
-    </div>
-  );
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/src/components/index.html b/frontend/coverage/src/components/index.html deleted file mode 100644 index fc333bb..0000000 --- a/frontend/coverage/src/components/index.html +++ /dev/null @@ -1,266 +0,0 @@ - - - - - - Code coverage report for src/components - - - - - - - - - -
-
-

All files src/components

-
- -
- 86.21% - Statements - 269/312 -
- - -
- 74.61% - Branches - 144/193 -
- - -
- 84.94% - Functions - 79/93 -
- - -
- 88.81% - Lines - 254/286 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
FeedItem.css -
-
0%0/00%0/00%0/00%0/0
FeedItem.tsx -
-
78.12%25/3286.95%20/2383.33%10/1280.64%25/31
FeedItems.css -
-
0%0/00%0/00%0/00%0/0
FeedItems.tsx -
-
89.23%116/13076.19%64/8487.09%27/3189.07%106/119
FeedList.css -
-
0%0/00%0/00%0/00%0/0
FeedList.tsx -
-
87.27%48/5570%35/5078.94%15/1990%45/50
FeedListVariants.css -
-
0%0/00%0/00%0/00%0/0
Login.css -
-
0%0/00%0/00%0/00%0/0
Login.tsx -
-
100%20/2083.33%5/6100%4/4100%20/20
Settings.css -
-
0%0/00%0/00%0/00%0/0
Settings.tsx -
-
80%60/7566.66%20/3085.18%23/2787.87%58/66
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/src/index.html b/frontend/coverage/src/index.html deleted file mode 100644 index 091ffa0..0000000 --- a/frontend/coverage/src/index.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - Code coverage report for src - - - - - - - - - -
-
-

All files src

-
- -
- 70.21% - Statements - 33/47 -
- - -
- 65.71% - Branches - 23/35 -
- - -
- 60% - Functions - 9/15 -
- - -
- 71.11% - Lines - 32/45 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
App.css -
-
0%0/00%0/00%0/00%0/0
App.tsx -
-
65.71%23/3560%15/2553.84%7/1364.7%22/34
utils.ts -
-
83.33%10/1280%8/10100%2/290.9%10/11
-
-
-
- - - - - - - - \ No newline at end of file -- cgit v1.2.3