diff --git a/.github/workflows/docker-build.yml b/.github/workflows/docker-build.yml index e31baa5e..3e17987a 100644 --- a/.github/workflows/docker-build.yml +++ b/.github/workflows/docker-build.yml @@ -220,6 +220,14 @@ jobs: echo "tag=sha-$(echo ${{ github.sha }} | cut -c1-7)" >> $GITHUB_OUTPUT fi + # Step 1.5: Log in to GitHub Container Registry (Required for private/internal images) + - name: 🔐 Log in to GitHub Container Registry + uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.PROJECT_TOKEN }} + # Step 2: Pull the image we just built - name: 📥 Pull Docker image run: docker pull ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.tag.outputs.tag }} diff --git a/backend/cmd/api/main.go b/backend/cmd/api/main.go index 9417d9a2..a74381c6 100644 --- a/backend/cmd/api/main.go +++ b/backend/cmd/api/main.go @@ -3,16 +3,57 @@ package main import ( "fmt" "log" + "os" "github.com/Wikid82/CaddyProxyManagerPlus/backend/internal/api/handlers" "github.com/Wikid82/CaddyProxyManagerPlus/backend/internal/api/routes" "github.com/Wikid82/CaddyProxyManagerPlus/backend/internal/config" "github.com/Wikid82/CaddyProxyManagerPlus/backend/internal/database" + "github.com/Wikid82/CaddyProxyManagerPlus/backend/internal/models" "github.com/Wikid82/CaddyProxyManagerPlus/backend/internal/server" "github.com/Wikid82/CaddyProxyManagerPlus/backend/internal/version" ) func main() { + // Handle CLI commands + if len(os.Args) > 1 && os.Args[1] == "reset-password" { + if len(os.Args) != 4 { + log.Fatalf("Usage: %s reset-password ", os.Args[0]) + } + email := os.Args[2] + newPassword := os.Args[3] + + cfg, err := config.Load() + if err != nil { + log.Fatalf("load config: %v", err) + } + + db, err := database.Connect(cfg.DatabasePath) + if err != nil { + log.Fatalf("connect database: %v", err) + } + + var user models.User + if err := db.Where("email = ?", email).First(&user).Error; err != nil { + log.Fatalf("user not found: %v", err) + } + + if err := user.SetPassword(newPassword); err != nil { + log.Fatalf("failed to hash password: %v", err) + } + + // Unlock account if locked + user.LockedUntil = nil + user.FailedLoginAttempts = 0 + + if err := db.Save(&user).Error; err != nil { + log.Fatalf("failed to save user: %v", err) + } + + log.Printf("Password updated successfully for user %s", email) + return + } + log.Printf("starting %s backend on version %s", version.Name, version.Full()) cfg, err := config.Load() diff --git a/cpmp.code-workspace b/cpmp.code-workspace deleted file mode 100644 index 57097327..00000000 --- a/cpmp.code-workspace +++ /dev/null @@ -1,8 +0,0 @@ -{ - "folders": [ - { - "path": "." - } - ], - "settings": {} -} diff --git a/frontend/.vite/deps_temp_c8b409d7/package.json b/frontend/.vite/deps_temp_c8b409d7/package.json deleted file mode 100644 index 3dbc1ca5..00000000 --- a/frontend/.vite/deps_temp_c8b409d7/package.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "type": "module" -} diff --git a/frontend/coverage/base.css b/frontend/coverage/base.css deleted file mode 100644 index f418035b..00000000 --- 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 530d1ed2..00000000 --- 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/coverage-final.json b/frontend/coverage/coverage-final.json deleted file mode 100644 index 3869103c..00000000 --- a/frontend/coverage/coverage-final.json +++ /dev/null @@ -1,12 +0,0 @@ -{"/home/jeremy/Server/Projects/cpmp/frontend/src/components/ImportReviewTable.tsx": {"path":"/home/jeremy/Server/Projects/cpmp/frontend/src/components/ImportReviewTable.tsx","statementMap":{"0":{"start":{"line":17,"column":36},"end":{"line":21,"column":null}},"1":{"start":{"line":18,"column":41},"end":{"line":18,"column":null}},"2":{"start":{"line":19,"column":4},"end":{"line":19,"column":null}},"3":{"start":{"line":19,"column":39},"end":{"line":19,"column":56}},"4":{"start":{"line":20,"column":4},"end":{"line":20,"column":null}},"5":{"start":{"line":22,"column":34},"end":{"line":22,"column":null}},"6":{"start":{"line":23,"column":24},"end":{"line":23,"column":null}},"7":{"start":{"line":25,"column":23},"end":{"line":35,"column":null}},"8":{"start":{"line":26,"column":4},"end":{"line":26,"column":null}},"9":{"start":{"line":27,"column":4},"end":{"line":27,"column":null}},"10":{"start":{"line":28,"column":4},"end":{"line":34,"column":null}},"11":{"start":{"line":29,"column":6},"end":{"line":29,"column":null}},"12":{"start":{"line":31,"column":6},"end":{"line":31,"column":null}},"13":{"start":{"line":33,"column":6},"end":{"line":33,"column":null}},"14":{"start":{"line":37,"column":2},"end":{"line":119,"column":null}},"15":{"start":{"line":69,"column":14},"end":{"line":69,"column":null}},"16":{"start":{"line":89,"column":29},"end":{"line":89,"column":null}},"17":{"start":{"line":90,"column":34},"end":{"line":90,"column":null}},"18":{"start":{"line":91,"column":14},"end":{"line":113,"column":null}},"19":{"start":{"line":100,"column":39},"end":{"line":100,"column":null}}},"fnMap":{"0":{"name":"ImportReviewTable","decl":{"start":{"line":16,"column":24},"end":{"line":16,"column":42}},"loc":{"start":{"line":16,"column":99},"end":{"line":121,"column":null}},"line":16},"1":{"name":"(anonymous_1)","decl":{"start":{"line":17,"column":73},"end":{"line":17,"column":79}},"loc":{"start":{"line":17,"column":79},"end":{"line":21,"column":3}},"line":17},"2":{"name":"(anonymous_2)","decl":{"start":{"line":19,"column":22},"end":{"line":19,"column":23}},"loc":{"start":{"line":19,"column":37},"end":{"line":19,"column":57}},"line":19},"3":{"name":"(anonymous_3)","decl":{"start":{"line":25,"column":23},"end":{"line":25,"column":35}},"loc":{"start":{"line":25,"column":35},"end":{"line":35,"column":null}},"line":25},"4":{"name":"(anonymous_4)","decl":{"start":{"line":68,"column":24},"end":{"line":68,"column":25}},"loc":{"start":{"line":69,"column":14},"end":{"line":69,"column":null}},"line":69},"5":{"name":"(anonymous_5)","decl":{"start":{"line":88,"column":23},"end":{"line":88,"column":24}},"loc":{"start":{"line":88,"column":35},"end":{"line":115,"column":13}},"line":88},"6":{"name":"(anonymous_6)","decl":{"start":{"line":100,"column":34},"end":{"line":100,"column":39}},"loc":{"start":{"line":100,"column":39},"end":{"line":100,"column":null}},"line":100}},"branchMap":{"0":{"loc":{"start":{"line":31,"column":15},"end":{"line":31,"column":77}},"type":"cond-expr","locations":[{"start":{"line":31,"column":38},"end":{"line":31,"column":52}},{"start":{"line":31,"column":52},"end":{"line":31,"column":77}}],"line":31},"1":{"loc":{"start":{"line":53,"column":13},"end":{"line":53,"column":null}},"type":"cond-expr","locations":[{"start":{"line":53,"column":26},"end":{"line":53,"column":44}},{"start":{"line":53,"column":44},"end":{"line":53,"column":null}}],"line":53},"2":{"loc":{"start":{"line":58,"column":7},"end":{"line":61,"column":null}},"type":"binary-expr","locations":[{"start":{"line":58,"column":7},"end":{"line":58,"column":null}},{"start":{"line":59,"column":8},"end":{"line":61,"column":null}}],"line":58},"3":{"loc":{"start":{"line":64,"column":7},"end":{"line":72,"column":null}},"type":"binary-expr","locations":[{"start":{"line":64,"column":7},"end":{"line":64,"column":null}},{"start":{"line":65,"column":8},"end":{"line":72,"column":null}}],"line":64},"4":{"loc":{"start":{"line":97,"column":21},"end":{"line":110,"column":null}},"type":"cond-expr","locations":[{"start":{"line":98,"column":22},"end":{"line":106,"column":null}},{"start":{"line":108,"column":22},"end":{"line":110,"column":null}}],"line":97}},"s":{"0":9,"1":6,"2":6,"3":3,"4":6,"5":9,"6":9,"7":9,"8":1,"9":1,"10":1,"11":1,"12":0,"13":1,"14":9,"15":2,"16":9,"17":9,"18":9,"19":1},"f":{"0":9,"1":6,"2":3,"3":1,"4":2,"5":9,"6":1},"b":{"0":[0,0],"1":[1,8],"2":[9,0],"3":[9,1],"4":[6,3]},"meta":{"lastBranch":5,"lastFunction":7,"lastStatement":20,"seen":{"f:16:24:16:42":0,"s:17:36:21:Infinity":0,"f:17:73:17:79":1,"s:18:41:18:Infinity":1,"s:19:4:19:Infinity":2,"f:19:22:19:23":2,"s:19:39:19:56":3,"s:20:4:20:Infinity":4,"s:22:34:22:Infinity":5,"s:23:24:23:Infinity":6,"s:25:23:35:Infinity":7,"f:25:23:25:35":3,"s:26:4:26:Infinity":8,"s:27:4:27:Infinity":9,"s:28:4:34:Infinity":10,"s:29:6:29:Infinity":11,"s:31:6:31:Infinity":12,"b:31:38:31:52:31:52:31:77":0,"s:33:6:33:Infinity":13,"s:37:2:119:Infinity":14,"b:53:26:53:44:53:44:53:Infinity":1,"b:58:7:58:Infinity:59:8:61:Infinity":2,"b:64:7:64:Infinity:65:8:72:Infinity":3,"f:68:24:68:25":4,"s:69:14:69:Infinity":15,"f:88:23:88:24":5,"s:89:29:89:Infinity":16,"s:90:34:90:Infinity":17,"s:91:14:113:Infinity":18,"b:98:22:106:Infinity:108:22:110:Infinity":4,"f:100:34:100:39":6,"s:100:39:100:Infinity":19}}} -,"/home/jeremy/Server/Projects/cpmp/frontend/src/components/Layout.tsx": {"path":"/home/jeremy/Server/Projects/cpmp/frontend/src/components/Layout.tsx","statementMap":{"0":{"start":{"line":11,"column":8},"end":{"line":11,"column":null}},"1":{"start":{"line":12,"column":36},"end":{"line":12,"column":null}},"2":{"start":{"line":14,"column":21},"end":{"line":21,"column":null}},"3":{"start":{"line":23,"column":2},"end":{"line":86,"column":null}},"4":{"start":{"line":30,"column":59},"end":{"line":30,"column":null}},"5":{"start":{"line":49,"column":29},"end":{"line":49,"column":null}},"6":{"start":{"line":50,"column":12},"end":{"line":63,"column":null}},"7":{"start":{"line":54,"column":31},"end":{"line":54,"column":null}},"8":{"start":{"line":78,"column":25},"end":{"line":78,"column":null}}},"fnMap":{"0":{"name":"Layout","decl":{"start":{"line":10,"column":24},"end":{"line":10,"column":31}},"loc":{"start":{"line":10,"column":58},"end":{"line":88,"column":null}},"line":10},"1":{"name":"(anonymous_1)","decl":{"start":{"line":30,"column":53},"end":{"line":30,"column":59}},"loc":{"start":{"line":30,"column":59},"end":{"line":30,"column":null}},"line":30},"2":{"name":"(anonymous_2)","decl":{"start":{"line":48,"column":26},"end":{"line":48,"column":27}},"loc":{"start":{"line":48,"column":36},"end":{"line":65,"column":11}},"line":48},"3":{"name":"(anonymous_3)","decl":{"start":{"line":54,"column":25},"end":{"line":54,"column":31}},"loc":{"start":{"line":54,"column":31},"end":{"line":54,"column":null}},"line":54},"4":{"name":"(anonymous_4)","decl":{"start":{"line":78,"column":19},"end":{"line":78,"column":25}},"loc":{"start":{"line":78,"column":25},"end":{"line":78,"column":null}},"line":78}},"branchMap":{"0":{"loc":{"start":{"line":31,"column":13},"end":{"line":31,"column":null}},"type":"cond-expr","locations":[{"start":{"line":31,"column":27},"end":{"line":31,"column":33}},{"start":{"line":31,"column":33},"end":{"line":31,"column":null}}],"line":31},"1":{"loc":{"start":{"line":40,"column":10},"end":{"line":40,"column":78}},"type":"cond-expr","locations":[{"start":{"line":40,"column":24},"end":{"line":40,"column":42}},{"start":{"line":40,"column":42},"end":{"line":40,"column":78}}],"line":40},"2":{"loc":{"start":{"line":56,"column":18},"end":{"line":58,"column":null}},"type":"cond-expr","locations":[{"start":{"line":57,"column":22},"end":{"line":57,"column":null}},{"start":{"line":58,"column":22},"end":{"line":58,"column":null}}],"line":56},"3":{"loc":{"start":{"line":75,"column":7},"end":{"line":79,"column":null}},"type":"binary-expr","locations":[{"start":{"line":75,"column":7},"end":{"line":75,"column":null}},{"start":{"line":76,"column":8},"end":{"line":79,"column":null}}],"line":75}},"s":{"0":4,"1":4,"2":4,"3":4,"4":0,"5":24,"6":24,"7":0,"8":0},"f":{"0":4,"1":0,"2":24,"3":0,"4":0},"b":{"0":[0,4],"1":[0,4],"2":[4,20],"3":[4,0]},"meta":{"lastBranch":4,"lastFunction":5,"lastStatement":9,"seen":{"f:10:24:10:31":0,"s:11:8:11:Infinity":0,"s:12:36:12:Infinity":1,"s:14:21:21:Infinity":2,"s:23:2:86:Infinity":3,"f:30:53:30:59":1,"s:30:59:30:Infinity":4,"b:31:27:31:33:31:33:31:Infinity":0,"b:40:24:40:42:40:42:40:78":1,"f:48:26:48:27":2,"s:49:29:49:Infinity":5,"s:50:12:63:Infinity":6,"f:54:25:54:31":3,"s:54:31:54:Infinity":7,"b:57:22:57:Infinity:58:22:58:Infinity":2,"b:75:7:75:Infinity:76:8:79:Infinity":3,"f:78:19:78:25":4,"s:78:25:78:Infinity":8}}} -,"/home/jeremy/Server/Projects/cpmp/frontend/src/components/ProxyHostForm.tsx": {"path":"/home/jeremy/Server/Projects/cpmp/frontend/src/components/ProxyHostForm.tsx","statementMap":{"0":{"start":{"line":12,"column":30},"end":{"line":25,"column":null}},"1":{"start":{"line":27,"column":33},"end":{"line":27,"column":null}},"2":{"start":{"line":28,"column":28},"end":{"line":28,"column":null}},"3":{"start":{"line":29,"column":24},"end":{"line":29,"column":null}},"4":{"start":{"line":31,"column":23},"end":{"line":43,"column":null}},"5":{"start":{"line":32,"column":4},"end":{"line":32,"column":null}},"6":{"start":{"line":33,"column":4},"end":{"line":33,"column":null}},"7":{"start":{"line":34,"column":4},"end":{"line":34,"column":null}},"8":{"start":{"line":36,"column":4},"end":{"line":42,"column":null}},"9":{"start":{"line":37,"column":6},"end":{"line":37,"column":null}},"10":{"start":{"line":39,"column":6},"end":{"line":39,"column":null}},"11":{"start":{"line":41,"column":6},"end":{"line":41,"column":null}},"12":{"start":{"line":45,"column":29},"end":{"line":55,"column":null}},"13":{"start":{"line":46,"column":19},"end":{"line":46,"column":null}},"14":{"start":{"line":46,"column":43},"end":{"line":46,"column":64}},"15":{"start":{"line":47,"column":4},"end":{"line":54,"column":null}},"16":{"start":{"line":48,"column":6},"end":{"line":53,"column":null}},"17":{"start":{"line":57,"column":2},"end":{"line":247,"column":null}},"18":{"start":{"line":82,"column":29},"end":{"line":82,"column":null}},"19":{"start":{"line":95,"column":31},"end":{"line":95,"column":null}},"20":{"start":{"line":100,"column":18},"end":{"line":102,"column":null}},"21":{"start":{"line":114,"column":31},"end":{"line":114,"column":null}},"22":{"start":{"line":127,"column":31},"end":{"line":127,"column":null}},"23":{"start":{"line":140,"column":31},"end":{"line":140,"column":null}},"24":{"start":{"line":152,"column":31},"end":{"line":152,"column":null}},"25":{"start":{"line":161,"column":31},"end":{"line":161,"column":null}},"26":{"start":{"line":170,"column":31},"end":{"line":170,"column":null}},"27":{"start":{"line":179,"column":31},"end":{"line":179,"column":null}},"28":{"start":{"line":188,"column":31},"end":{"line":188,"column":null}},"29":{"start":{"line":197,"column":31},"end":{"line":197,"column":null}},"30":{"start":{"line":206,"column":31},"end":{"line":206,"column":null}},"31":{"start":{"line":220,"column":29},"end":{"line":220,"column":null}}},"fnMap":{"0":{"name":"ProxyHostForm","decl":{"start":{"line":11,"column":24},"end":{"line":11,"column":38}},"loc":{"start":{"line":11,"column":88},"end":{"line":249,"column":null}},"line":11},"1":{"name":"(anonymous_1)","decl":{"start":{"line":31,"column":23},"end":{"line":31,"column":30}},"loc":{"start":{"line":31,"column":53},"end":{"line":43,"column":null}},"line":31},"2":{"name":"(anonymous_2)","decl":{"start":{"line":45,"column":29},"end":{"line":45,"column":30}},"loc":{"start":{"line":45,"column":53},"end":{"line":55,"column":null}},"line":45},"3":{"name":"(anonymous_3)","decl":{"start":{"line":46,"column":38},"end":{"line":46,"column":43}},"loc":{"start":{"line":46,"column":43},"end":{"line":46,"column":64}},"line":46},"4":{"name":"(anonymous_4)","decl":{"start":{"line":82,"column":24},"end":{"line":82,"column":29}},"loc":{"start":{"line":82,"column":29},"end":{"line":82,"column":null}},"line":82},"5":{"name":"(anonymous_5)","decl":{"start":{"line":95,"column":26},"end":{"line":95,"column":31}},"loc":{"start":{"line":95,"column":31},"end":{"line":95,"column":null}},"line":95},"6":{"name":"(anonymous_6)","decl":{"start":{"line":99,"column":35},"end":{"line":99,"column":null}},"loc":{"start":{"line":100,"column":18},"end":{"line":102,"column":null}},"line":100},"7":{"name":"(anonymous_7)","decl":{"start":{"line":114,"column":26},"end":{"line":114,"column":31}},"loc":{"start":{"line":114,"column":31},"end":{"line":114,"column":null}},"line":114},"8":{"name":"(anonymous_8)","decl":{"start":{"line":127,"column":26},"end":{"line":127,"column":31}},"loc":{"start":{"line":127,"column":31},"end":{"line":127,"column":null}},"line":127},"9":{"name":"(anonymous_9)","decl":{"start":{"line":140,"column":26},"end":{"line":140,"column":31}},"loc":{"start":{"line":140,"column":31},"end":{"line":140,"column":null}},"line":140},"10":{"name":"(anonymous_10)","decl":{"start":{"line":152,"column":26},"end":{"line":152,"column":31}},"loc":{"start":{"line":152,"column":31},"end":{"line":152,"column":null}},"line":152},"11":{"name":"(anonymous_11)","decl":{"start":{"line":161,"column":26},"end":{"line":161,"column":31}},"loc":{"start":{"line":161,"column":31},"end":{"line":161,"column":null}},"line":161},"12":{"name":"(anonymous_12)","decl":{"start":{"line":170,"column":26},"end":{"line":170,"column":31}},"loc":{"start":{"line":170,"column":31},"end":{"line":170,"column":null}},"line":170},"13":{"name":"(anonymous_13)","decl":{"start":{"line":179,"column":26},"end":{"line":179,"column":31}},"loc":{"start":{"line":179,"column":31},"end":{"line":179,"column":null}},"line":179},"14":{"name":"(anonymous_14)","decl":{"start":{"line":188,"column":26},"end":{"line":188,"column":31}},"loc":{"start":{"line":188,"column":31},"end":{"line":188,"column":null}},"line":188},"15":{"name":"(anonymous_15)","decl":{"start":{"line":197,"column":26},"end":{"line":197,"column":31}},"loc":{"start":{"line":197,"column":31},"end":{"line":197,"column":null}},"line":197},"16":{"name":"(anonymous_16)","decl":{"start":{"line":206,"column":26},"end":{"line":206,"column":31}},"loc":{"start":{"line":206,"column":31},"end":{"line":206,"column":null}},"line":206},"17":{"name":"(anonymous_17)","decl":{"start":{"line":220,"column":24},"end":{"line":220,"column":29}},"loc":{"start":{"line":220,"column":29},"end":{"line":220,"column":null}},"line":220}},"branchMap":{"0":{"loc":{"start":{"line":13,"column":18},"end":{"line":13,"column":null}},"type":"binary-expr","locations":[{"start":{"line":13,"column":18},"end":{"line":13,"column":40}},{"start":{"line":13,"column":40},"end":{"line":13,"column":null}}],"line":13},"1":{"loc":{"start":{"line":14,"column":20},"end":{"line":14,"column":null}},"type":"binary-expr","locations":[{"start":{"line":14,"column":20},"end":{"line":14,"column":44}},{"start":{"line":14,"column":44},"end":{"line":14,"column":null}}],"line":14},"2":{"loc":{"start":{"line":15,"column":18},"end":{"line":15,"column":null}},"type":"binary-expr","locations":[{"start":{"line":15,"column":18},"end":{"line":15,"column":40}},{"start":{"line":15,"column":40},"end":{"line":15,"column":null}}],"line":15},"3":{"loc":{"start":{"line":16,"column":18},"end":{"line":16,"column":null}},"type":"binary-expr","locations":[{"start":{"line":16,"column":18},"end":{"line":16,"column":40}},{"start":{"line":16,"column":40},"end":{"line":16,"column":null}}],"line":16},"4":{"loc":{"start":{"line":17,"column":16},"end":{"line":17,"column":null}},"type":"binary-expr","locations":[{"start":{"line":17,"column":16},"end":{"line":17,"column":36}},{"start":{"line":17,"column":36},"end":{"line":17,"column":null}}],"line":17},"5":{"loc":{"start":{"line":18,"column":19},"end":{"line":18,"column":null}},"type":"binary-expr","locations":[{"start":{"line":18,"column":19},"end":{"line":18,"column":42}},{"start":{"line":18,"column":42},"end":{"line":18,"column":null}}],"line":18},"6":{"loc":{"start":{"line":19,"column":18},"end":{"line":19,"column":null}},"type":"binary-expr","locations":[{"start":{"line":19,"column":18},"end":{"line":19,"column":40}},{"start":{"line":19,"column":40},"end":{"line":19,"column":null}}],"line":19},"7":{"loc":{"start":{"line":20,"column":21},"end":{"line":20,"column":null}},"type":"binary-expr","locations":[{"start":{"line":20,"column":21},"end":{"line":20,"column":46}},{"start":{"line":20,"column":46},"end":{"line":20,"column":null}}],"line":20},"8":{"loc":{"start":{"line":21,"column":20},"end":{"line":21,"column":null}},"type":"binary-expr","locations":[{"start":{"line":21,"column":20},"end":{"line":21,"column":44}},{"start":{"line":21,"column":44},"end":{"line":21,"column":null}}],"line":21},"9":{"loc":{"start":{"line":22,"column":23},"end":{"line":22,"column":null}},"type":"binary-expr","locations":[{"start":{"line":22,"column":23},"end":{"line":22,"column":50}},{"start":{"line":22,"column":50},"end":{"line":22,"column":null}}],"line":22},"10":{"loc":{"start":{"line":23,"column":21},"end":{"line":23,"column":null}},"type":"binary-expr","locations":[{"start":{"line":23,"column":21},"end":{"line":23,"column":46}},{"start":{"line":23,"column":46},"end":{"line":23,"column":null}}],"line":23},"11":{"loc":{"start":{"line":24,"column":13},"end":{"line":24,"column":null}},"type":"binary-expr","locations":[{"start":{"line":24,"column":13},"end":{"line":24,"column":30}},{"start":{"line":24,"column":30},"end":{"line":24,"column":null}}],"line":24},"12":{"loc":{"start":{"line":39,"column":15},"end":{"line":39,"column":79}},"type":"cond-expr","locations":[{"start":{"line":39,"column":38},"end":{"line":39,"column":52}},{"start":{"line":39,"column":52},"end":{"line":39,"column":79}}],"line":39},"13":{"loc":{"start":{"line":47,"column":4},"end":{"line":54,"column":null}},"type":"if","locations":[{"start":{"line":47,"column":4},"end":{"line":54,"column":null}},{"start":{},"end":{}}],"line":47},"14":{"loc":{"start":{"line":62,"column":13},"end":{"line":62,"column":null}},"type":"cond-expr","locations":[{"start":{"line":62,"column":20},"end":{"line":62,"column":40}},{"start":{"line":62,"column":40},"end":{"line":62,"column":null}}],"line":62},"15":{"loc":{"start":{"line":67,"column":11},"end":{"line":70,"column":null}},"type":"binary-expr","locations":[{"start":{"line":67,"column":11},"end":{"line":67,"column":null}},{"start":{"line":68,"column":12},"end":{"line":70,"column":null}}],"line":67},"16":{"loc":{"start":{"line":89,"column":11},"end":{"line":105,"column":null}},"type":"binary-expr","locations":[{"start":{"line":89,"column":11},"end":{"line":89,"column":null}},{"start":{"line":90,"column":12},"end":{"line":105,"column":null}}],"line":89},"17":{"loc":{"start":{"line":242,"column":15},"end":{"line":242,"column":null}},"type":"cond-expr","locations":[{"start":{"line":242,"column":25},"end":{"line":242,"column":40}},{"start":{"line":242,"column":40},"end":{"line":242,"column":null}}],"line":242},"18":{"loc":{"start":{"line":242,"column":40},"end":{"line":242,"column":null}},"type":"cond-expr","locations":[{"start":{"line":242,"column":47},"end":{"line":242,"column":58}},{"start":{"line":242,"column":58},"end":{"line":242,"column":null}}],"line":242}},"s":{"0":13,"1":13,"2":13,"3":13,"4":13,"5":1,"6":1,"7":1,"8":1,"9":1,"10":0,"11":1,"12":13,"13":0,"14":0,"15":0,"16":0,"17":13,"18":1,"19":0,"20":26,"21":0,"22":1,"23":1,"24":1,"25":0,"26":0,"27":0,"28":0,"29":1,"30":0,"31":0},"f":{"0":13,"1":1,"2":0,"3":0,"4":1,"5":0,"6":26,"7":0,"8":1,"9":1,"10":1,"11":0,"12":0,"13":0,"14":0,"15":1,"16":0,"17":0},"b":{"0":[13,12],"1":[13,12],"2":[13,12],"3":[13,12],"4":[13,12],"5":[13,12],"6":[13,12],"7":[13,12],"8":[13,12],"9":[13,12],"10":[13,13],"11":[13,12],"12":[0,0],"13":[0,0],"14":[1,12],"15":[13,0],"16":[13,13],"17":[1,12],"18":[1,11]},"meta":{"lastBranch":19,"lastFunction":18,"lastStatement":32,"seen":{"f:11:24:11:38":0,"s:12:30:25:Infinity":0,"b:13:18:13:40:13:40:13:Infinity":0,"b:14:20:14:44:14:44:14:Infinity":1,"b:15:18:15:40:15:40:15:Infinity":2,"b:16:18:16:40:16:40:16:Infinity":3,"b:17:16:17:36:17:36:17:Infinity":4,"b:18:19:18:42:18:42:18:Infinity":5,"b:19:18:19:40:19:40:19:Infinity":6,"b:20:21:20:46:20:46:20:Infinity":7,"b:21:20:21:44:21:44:21:Infinity":8,"b:22:23:22:50:22:50:22:Infinity":9,"b:23:21:23:46:23:46:23:Infinity":10,"b:24:13:24:30:24:30:24:Infinity":11,"s:27:33:27:Infinity":1,"s:28:28:28:Infinity":2,"s:29:24:29:Infinity":3,"s:31:23:43:Infinity":4,"f:31:23:31:30":1,"s:32:4:32:Infinity":5,"s:33:4:33:Infinity":6,"s:34:4:34:Infinity":7,"s:36:4:42:Infinity":8,"s:37:6:37:Infinity":9,"s:39:6:39:Infinity":10,"b:39:38:39:52:39:52:39:79":12,"s:41:6:41:Infinity":11,"s:45:29:55:Infinity":12,"f:45:29:45:30":2,"s:46:19:46:Infinity":13,"f:46:38:46:43":3,"s:46:43:46:64":14,"b:47:4:54:Infinity:undefined:undefined:undefined:undefined":13,"s:47:4:54:Infinity":15,"s:48:6:53:Infinity":16,"s:57:2:247:Infinity":17,"b:62:20:62:40:62:40:62:Infinity":14,"b:67:11:67:Infinity:68:12:70:Infinity":15,"f:82:24:82:29":4,"s:82:29:82:Infinity":18,"b:89:11:89:Infinity:90:12:105:Infinity":16,"f:95:26:95:31":5,"s:95:31:95:Infinity":19,"f:99:35:99:Infinity":6,"s:100:18:102:Infinity":20,"f:114:26:114:31":7,"s:114:31:114:Infinity":21,"f:127:26:127:31":8,"s:127:31:127:Infinity":22,"f:140:26:140:31":9,"s:140:31:140:Infinity":23,"f:152:26:152:31":10,"s:152:31:152:Infinity":24,"f:161:26:161:31":11,"s:161:31:161:Infinity":25,"f:170:26:170:31":12,"s:170:31:170:Infinity":26,"f:179:26:179:31":13,"s:179:31:179:Infinity":27,"f:188:26:188:31":14,"s:188:31:188:Infinity":28,"f:197:26:197:31":15,"s:197:31:197:Infinity":29,"f:206:26:206:31":16,"s:206:31:206:Infinity":30,"f:220:24:220:29":17,"s:220:29:220:Infinity":31,"b:242:25:242:40:242:40:242:Infinity":17,"b:242:47:242:58:242:58:242:Infinity":18}}} -,"/home/jeremy/Server/Projects/cpmp/frontend/src/components/RemoteServerForm.tsx": {"path":"/home/jeremy/Server/Projects/cpmp/frontend/src/components/RemoteServerForm.tsx","statementMap":{"0":{"start":{"line":12,"column":30},"end":{"line":19,"column":null}},"1":{"start":{"line":21,"column":28},"end":{"line":21,"column":null}},"2":{"start":{"line":22,"column":24},"end":{"line":22,"column":null}},"3":{"start":{"line":24,"column":2},"end":{"line":33,"column":null}},"4":{"start":{"line":25,"column":4},"end":{"line":32,"column":null}},"5":{"start":{"line":35,"column":23},"end":{"line":46,"column":null}},"6":{"start":{"line":36,"column":4},"end":{"line":36,"column":null}},"7":{"start":{"line":37,"column":4},"end":{"line":37,"column":null}},"8":{"start":{"line":38,"column":4},"end":{"line":38,"column":null}},"9":{"start":{"line":39,"column":4},"end":{"line":45,"column":null}},"10":{"start":{"line":40,"column":6},"end":{"line":40,"column":null}},"11":{"start":{"line":42,"column":6},"end":{"line":42,"column":null}},"12":{"start":{"line":44,"column":6},"end":{"line":44,"column":null}},"13":{"start":{"line":48,"column":31},"end":{"line":60,"column":null}},"14":{"start":{"line":49,"column":4},"end":{"line":49,"column":null}},"15":{"start":{"line":49,"column":23},"end":{"line":49,"column":null}},"16":{"start":{"line":50,"column":4},"end":{"line":50,"column":null}},"17":{"start":{"line":51,"column":4},"end":{"line":51,"column":null}},"18":{"start":{"line":52,"column":4},"end":{"line":59,"column":null}},"19":{"start":{"line":53,"column":21},"end":{"line":53,"column":null}},"20":{"start":{"line":54,"column":6},"end":{"line":54,"column":null}},"21":{"start":{"line":56,"column":6},"end":{"line":56,"column":null}},"22":{"start":{"line":58,"column":6},"end":{"line":58,"column":null}},"23":{"start":{"line":62,"column":2},"end":{"line":178,"column":null}},"24":{"start":{"line":84,"column":29},"end":{"line":84,"column":null}},"25":{"start":{"line":95,"column":31},"end":{"line":95,"column":null}},"26":{"start":{"line":109,"column":31},"end":{"line":109,"column":null}},"27":{"start":{"line":124,"column":31},"end":{"line":124,"column":null}},"28":{"start":{"line":133,"column":31},"end":{"line":133,"column":null}},"29":{"start":{"line":143,"column":29},"end":{"line":143,"column":null}}},"fnMap":{"0":{"name":"RemoteServerForm","decl":{"start":{"line":11,"column":24},"end":{"line":11,"column":41}},"loc":{"start":{"line":11,"column":80},"end":{"line":180,"column":null}},"line":11},"1":{"name":"(anonymous_1)","decl":{"start":{"line":24,"column":12},"end":{"line":24,"column":18}},"loc":{"start":{"line":24,"column":18},"end":{"line":33,"column":5}},"line":24},"2":{"name":"(anonymous_2)","decl":{"start":{"line":35,"column":23},"end":{"line":35,"column":30}},"loc":{"start":{"line":35,"column":53},"end":{"line":46,"column":null}},"line":35},"3":{"name":"(anonymous_3)","decl":{"start":{"line":48,"column":31},"end":{"line":48,"column":43}},"loc":{"start":{"line":48,"column":43},"end":{"line":60,"column":null}},"line":48},"4":{"name":"(anonymous_4)","decl":{"start":{"line":84,"column":24},"end":{"line":84,"column":29}},"loc":{"start":{"line":84,"column":29},"end":{"line":84,"column":null}},"line":84},"5":{"name":"(anonymous_5)","decl":{"start":{"line":95,"column":26},"end":{"line":95,"column":31}},"loc":{"start":{"line":95,"column":31},"end":{"line":95,"column":null}},"line":95},"6":{"name":"(anonymous_6)","decl":{"start":{"line":109,"column":26},"end":{"line":109,"column":31}},"loc":{"start":{"line":109,"column":31},"end":{"line":109,"column":null}},"line":109},"7":{"name":"(anonymous_7)","decl":{"start":{"line":124,"column":26},"end":{"line":124,"column":31}},"loc":{"start":{"line":124,"column":31},"end":{"line":124,"column":null}},"line":124},"8":{"name":"(anonymous_8)","decl":{"start":{"line":133,"column":26},"end":{"line":133,"column":31}},"loc":{"start":{"line":133,"column":31},"end":{"line":133,"column":null}},"line":133},"9":{"name":"(anonymous_9)","decl":{"start":{"line":143,"column":24},"end":{"line":143,"column":29}},"loc":{"start":{"line":143,"column":29},"end":{"line":143,"column":null}},"line":143}},"branchMap":{"0":{"loc":{"start":{"line":13,"column":10},"end":{"line":13,"column":null}},"type":"binary-expr","locations":[{"start":{"line":13,"column":10},"end":{"line":13,"column":26}},{"start":{"line":13,"column":26},"end":{"line":13,"column":null}}],"line":13},"1":{"loc":{"start":{"line":14,"column":14},"end":{"line":14,"column":null}},"type":"binary-expr","locations":[{"start":{"line":14,"column":14},"end":{"line":14,"column":34}},{"start":{"line":14,"column":34},"end":{"line":14,"column":null}}],"line":14},"2":{"loc":{"start":{"line":15,"column":10},"end":{"line":15,"column":null}},"type":"binary-expr","locations":[{"start":{"line":15,"column":10},"end":{"line":15,"column":26}},{"start":{"line":15,"column":26},"end":{"line":15,"column":null}}],"line":15},"3":{"loc":{"start":{"line":16,"column":10},"end":{"line":16,"column":null}},"type":"binary-expr","locations":[{"start":{"line":16,"column":10},"end":{"line":16,"column":26}},{"start":{"line":16,"column":26},"end":{"line":16,"column":null}}],"line":16},"4":{"loc":{"start":{"line":17,"column":14},"end":{"line":17,"column":null}},"type":"binary-expr","locations":[{"start":{"line":17,"column":14},"end":{"line":17,"column":34}},{"start":{"line":17,"column":34},"end":{"line":17,"column":null}}],"line":17},"5":{"loc":{"start":{"line":18,"column":13},"end":{"line":18,"column":null}},"type":"binary-expr","locations":[{"start":{"line":18,"column":13},"end":{"line":18,"column":32}},{"start":{"line":18,"column":32},"end":{"line":18,"column":null}}],"line":18},"6":{"loc":{"start":{"line":26,"column":12},"end":{"line":26,"column":null}},"type":"binary-expr","locations":[{"start":{"line":26,"column":12},"end":{"line":26,"column":28}},{"start":{"line":26,"column":28},"end":{"line":26,"column":null}}],"line":26},"7":{"loc":{"start":{"line":27,"column":16},"end":{"line":27,"column":null}},"type":"binary-expr","locations":[{"start":{"line":27,"column":16},"end":{"line":27,"column":36}},{"start":{"line":27,"column":36},"end":{"line":27,"column":null}}],"line":27},"8":{"loc":{"start":{"line":28,"column":12},"end":{"line":28,"column":null}},"type":"binary-expr","locations":[{"start":{"line":28,"column":12},"end":{"line":28,"column":28}},{"start":{"line":28,"column":28},"end":{"line":28,"column":null}}],"line":28},"9":{"loc":{"start":{"line":29,"column":12},"end":{"line":29,"column":null}},"type":"binary-expr","locations":[{"start":{"line":29,"column":12},"end":{"line":29,"column":28}},{"start":{"line":29,"column":28},"end":{"line":29,"column":null}}],"line":29},"10":{"loc":{"start":{"line":30,"column":16},"end":{"line":30,"column":null}},"type":"binary-expr","locations":[{"start":{"line":30,"column":16},"end":{"line":30,"column":36}},{"start":{"line":30,"column":36},"end":{"line":30,"column":null}}],"line":30},"11":{"loc":{"start":{"line":31,"column":15},"end":{"line":31,"column":null}},"type":"binary-expr","locations":[{"start":{"line":31,"column":15},"end":{"line":31,"column":34}},{"start":{"line":31,"column":34},"end":{"line":31,"column":null}}],"line":31},"12":{"loc":{"start":{"line":42,"column":15},"end":{"line":42,"column":75}},"type":"cond-expr","locations":[{"start":{"line":42,"column":38},"end":{"line":42,"column":52}},{"start":{"line":42,"column":52},"end":{"line":42,"column":75}}],"line":42},"13":{"loc":{"start":{"line":49,"column":4},"end":{"line":49,"column":null}},"type":"if","locations":[{"start":{"line":49,"column":4},"end":{"line":49,"column":null}},{"start":{},"end":{}}],"line":49},"14":{"loc":{"start":{"line":67,"column":13},"end":{"line":67,"column":null}},"type":"cond-expr","locations":[{"start":{"line":67,"column":22},"end":{"line":67,"column":45}},{"start":{"line":67,"column":45},"end":{"line":67,"column":null}}],"line":67},"15":{"loc":{"start":{"line":72,"column":11},"end":{"line":75,"column":null}},"type":"binary-expr","locations":[{"start":{"line":72,"column":11},"end":{"line":72,"column":null}},{"start":{"line":73,"column":12},"end":{"line":75,"column":null}}],"line":72},"16":{"loc":{"start":{"line":150,"column":13},"end":{"line":158,"column":null}},"type":"binary-expr","locations":[{"start":{"line":150,"column":13},"end":{"line":150,"column":null}},{"start":{"line":151,"column":14},"end":{"line":158,"column":null}}],"line":150},"17":{"loc":{"start":{"line":173,"column":15},"end":{"line":173,"column":null}},"type":"cond-expr","locations":[{"start":{"line":173,"column":25},"end":{"line":173,"column":40}},{"start":{"line":173,"column":40},"end":{"line":173,"column":null}}],"line":173},"18":{"loc":{"start":{"line":173,"column":40},"end":{"line":173,"column":null}},"type":"cond-expr","locations":[{"start":{"line":173,"column":49},"end":{"line":173,"column":60}},{"start":{"line":173,"column":60},"end":{"line":173,"column":null}}],"line":173}},"s":{"0":20,"1":20,"2":20,"3":20,"4":7,"5":20,"6":1,"7":1,"8":1,"9":1,"10":1,"11":0,"12":1,"13":20,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":20,"24":1,"25":1,"26":1,"27":1,"28":0,"29":0},"f":{"0":20,"1":7,"2":1,"3":0,"4":1,"5":1,"6":1,"7":1,"8":0,"9":0},"b":{"0":[20,16],"1":[20,16],"2":[20,16],"3":[20,16],"4":[20,18],"5":[20,16],"6":[7,5],"7":[7,5],"8":[7,5],"9":[7,5],"10":[7,6],"11":[7,5],"12":[0,0],"13":[0,0],"14":[4,16],"15":[20,0],"16":[20,4],"17":[1,19],"18":[4,15]},"meta":{"lastBranch":19,"lastFunction":10,"lastStatement":30,"seen":{"f:11:24:11:41":0,"s:12:30:19:Infinity":0,"b:13:10:13:26:13:26:13:Infinity":0,"b:14:14:14:34:14:34:14:Infinity":1,"b:15:10:15:26:15:26:15:Infinity":2,"b:16:10:16:26:16:26:16:Infinity":3,"b:17:14:17:34:17:34:17:Infinity":4,"b:18:13:18:32:18:32:18:Infinity":5,"s:21:28:21:Infinity":1,"s:22:24:22:Infinity":2,"s:24:2:33:Infinity":3,"f:24:12:24:18":1,"s:25:4:32:Infinity":4,"b:26:12:26:28:26:28:26:Infinity":6,"b:27:16:27:36:27:36:27:Infinity":7,"b:28:12:28:28:28:28:28:Infinity":8,"b:29:12:29:28:29:28:29:Infinity":9,"b:30:16:30:36:30:36:30:Infinity":10,"b:31:15:31:34:31:34:31:Infinity":11,"s:35:23:46:Infinity":5,"f:35:23:35:30":2,"s:36:4:36:Infinity":6,"s:37:4:37:Infinity":7,"s:38:4:38:Infinity":8,"s:39:4:45:Infinity":9,"s:40:6:40:Infinity":10,"s:42:6:42:Infinity":11,"b:42:38:42:52:42:52:42:75":12,"s:44:6:44:Infinity":12,"s:48:31:60:Infinity":13,"f:48:31:48:43":3,"b:49:4:49:Infinity:undefined:undefined:undefined:undefined":13,"s:49:4:49:Infinity":14,"s:49:23:49:Infinity":15,"s:50:4:50:Infinity":16,"s:51:4:51:Infinity":17,"s:52:4:59:Infinity":18,"s:53:21:53:Infinity":19,"s:54:6:54:Infinity":20,"s:56:6:56:Infinity":21,"s:58:6:58:Infinity":22,"s:62:2:178:Infinity":23,"b:67:22:67:45:67:45:67:Infinity":14,"b:72:11:72:Infinity:73:12:75:Infinity":15,"f:84:24:84:29":4,"s:84:29:84:Infinity":24,"f:95:26:95:31":5,"s:95:31:95:Infinity":25,"f:109:26:109:31":6,"s:109:31:109:Infinity":26,"f:124:26:124:31":7,"s:124:31:124:Infinity":27,"f:133:26:133:31":8,"s:133:31:133:Infinity":28,"f:143:24:143:29":9,"s:143:29:143:Infinity":29,"b:150:13:150:Infinity:151:14:158:Infinity":16,"b:173:25:173:40:173:40:173:Infinity":17,"b:173:49:173:60:173:60:173:Infinity":18}}} -,"/home/jeremy/Server/Projects/cpmp/frontend/src/components/ThemeToggle.tsx": {"path":"/home/jeremy/Server/Projects/cpmp/frontend/src/components/ThemeToggle.tsx","statementMap":{"0":{"start":{"line":5,"column":29},"end":{"line":5,"column":null}},"1":{"start":{"line":7,"column":2},"end":{"line":10,"column":null}}},"fnMap":{"0":{"name":"ThemeToggle","decl":{"start":{"line":4,"column":16},"end":{"line":4,"column":30}},"loc":{"start":{"line":4,"column":30},"end":{"line":12,"column":null}},"line":4}},"branchMap":{"0":{"loc":{"start":{"line":8,"column":80},"end":{"line":8,"column":115}},"type":"cond-expr","locations":[{"start":{"line":8,"column":99},"end":{"line":8,"column":109}},{"start":{"line":8,"column":109},"end":{"line":8,"column":115}}],"line":8},"1":{"loc":{"start":{"line":9,"column":7},"end":{"line":9,"column":null}},"type":"cond-expr","locations":[{"start":{"line":9,"column":26},"end":{"line":9,"column":33}},{"start":{"line":9,"column":33},"end":{"line":9,"column":null}}],"line":9}},"s":{"0":8,"1":8},"f":{"0":8},"b":{"0":[8,0],"1":[8,0]},"meta":{"lastBranch":2,"lastFunction":1,"lastStatement":2,"seen":{"f:4:16:4:30":0,"s:5:29:5:Infinity":0,"s:7:2:10:Infinity":1,"b:8:99:8:109:8:109:8:115":0,"b:9:26:9:33:9:33:9:Infinity":1}}} -,"/home/jeremy/Server/Projects/cpmp/frontend/src/components/ui/Button.tsx": {"path":"/home/jeremy/Server/Projects/cpmp/frontend/src/components/ui/Button.tsx","statementMap":{"0":{"start":{"line":20,"column":21},"end":{"line":20,"column":null}},"1":{"start":{"line":22,"column":19},"end":{"line":27,"column":null}},"2":{"start":{"line":29,"column":16},"end":{"line":33,"column":null}},"3":{"start":{"line":35,"column":2},"end":{"line":53,"column":null}}},"fnMap":{"0":{"name":"Button","decl":{"start":{"line":11,"column":16},"end":{"line":11,"column":23}},"loc":{"start":{"line":19,"column":16},"end":{"line":55,"column":null}},"line":19}},"branchMap":{"0":{"loc":{"start":{"line":12,"column":2},"end":{"line":12,"column":null}},"type":"default-arg","locations":[{"start":{"line":12,"column":12},"end":{"line":12,"column":null}}],"line":12},"1":{"loc":{"start":{"line":13,"column":2},"end":{"line":13,"column":null}},"type":"default-arg","locations":[{"start":{"line":13,"column":9},"end":{"line":13,"column":null}}],"line":13},"2":{"loc":{"start":{"line":14,"column":2},"end":{"line":14,"column":null}},"type":"default-arg","locations":[{"start":{"line":14,"column":14},"end":{"line":14,"column":null}}],"line":14},"3":{"loc":{"start":{"line":43,"column":16},"end":{"line":43,"column":null}},"type":"binary-expr","locations":[{"start":{"line":43,"column":16},"end":{"line":43,"column":28}},{"start":{"line":43,"column":28},"end":{"line":43,"column":null}}],"line":43},"4":{"loc":{"start":{"line":46,"column":7},"end":{"line":50,"column":null}},"type":"binary-expr","locations":[{"start":{"line":46,"column":7},"end":{"line":46,"column":null}},{"start":{"line":47,"column":8},"end":{"line":50,"column":null}}],"line":46}},"s":{"0":12,"1":12,"2":12,"3":12},"f":{"0":12},"b":{"0":[12],"1":[12],"2":[12],"3":[12,12],"4":[12,0]},"meta":{"lastBranch":5,"lastFunction":1,"lastStatement":4,"seen":{"f:11:16:11:23":0,"b:12:12:12:Infinity":0,"b:13:9:13:Infinity":1,"b:14:14:14:Infinity":2,"s:20:21:20:Infinity":0,"s:22:19:27:Infinity":1,"s:29:16:33:Infinity":2,"s:35:2:53:Infinity":3,"b:43:16:43:28:43:28:43:Infinity":3,"b:46:7:46:Infinity:47:8:50:Infinity":4}}} -,"/home/jeremy/Server/Projects/cpmp/frontend/src/context/ThemeContext.tsx": {"path":"/home/jeremy/Server/Projects/cpmp/frontend/src/context/ThemeContext.tsx","statementMap":{"0":{"start":{"line":10,"column":6},"end":{"line":10,"column":null}},"1":{"start":{"line":13,"column":24},"end":{"line":16,"column":null}},"2":{"start":{"line":14,"column":18},"end":{"line":14,"column":null}},"3":{"start":{"line":15,"column":4},"end":{"line":15,"column":null}},"4":{"start":{"line":18,"column":2},"end":{"line":23,"column":null}},"5":{"start":{"line":19,"column":17},"end":{"line":19,"column":null}},"6":{"start":{"line":20,"column":4},"end":{"line":20,"column":null}},"7":{"start":{"line":21,"column":4},"end":{"line":21,"column":null}},"8":{"start":{"line":22,"column":4},"end":{"line":22,"column":null}},"9":{"start":{"line":25,"column":22},"end":{"line":27,"column":null}},"10":{"start":{"line":26,"column":4},"end":{"line":26,"column":null}},"11":{"start":{"line":26,"column":21},"end":{"line":26,"column":55}},"12":{"start":{"line":29,"column":2},"end":{"line":32,"column":null}},"13":{"start":{"line":37,"column":8},"end":{"line":37,"column":null}},"14":{"start":{"line":38,"column":2},"end":{"line":40,"column":null}},"15":{"start":{"line":39,"column":4},"end":{"line":39,"column":null}},"16":{"start":{"line":41,"column":2},"end":{"line":41,"column":null}}},"fnMap":{"0":{"name":"ThemeProvider","decl":{"start":{"line":12,"column":16},"end":{"line":12,"column":30}},"loc":{"start":{"line":12,"column":69},"end":{"line":34,"column":null}},"line":12},"1":{"name":"(anonymous_1)","decl":{"start":{"line":13,"column":44},"end":{"line":13,"column":50}},"loc":{"start":{"line":13,"column":50},"end":{"line":16,"column":3}},"line":13},"2":{"name":"(anonymous_2)","decl":{"start":{"line":18,"column":12},"end":{"line":18,"column":18}},"loc":{"start":{"line":18,"column":18},"end":{"line":23,"column":5}},"line":18},"3":{"name":"(anonymous_3)","decl":{"start":{"line":25,"column":22},"end":{"line":25,"column":28}},"loc":{"start":{"line":25,"column":28},"end":{"line":27,"column":null}},"line":25},"4":{"name":"(anonymous_4)","decl":{"start":{"line":26,"column":13},"end":{"line":26,"column":21}},"loc":{"start":{"line":26,"column":21},"end":{"line":26,"column":55}},"line":26},"5":{"name":"useTheme","decl":{"start":{"line":36,"column":16},"end":{"line":36,"column":27}},"loc":{"start":{"line":36,"column":27},"end":{"line":42,"column":null}},"line":36}},"branchMap":{"0":{"loc":{"start":{"line":15,"column":12},"end":{"line":15,"column":null}},"type":"binary-expr","locations":[{"start":{"line":15,"column":12},"end":{"line":15,"column":31}},{"start":{"line":15,"column":31},"end":{"line":15,"column":null}}],"line":15},"1":{"loc":{"start":{"line":26,"column":21},"end":{"line":26,"column":55}},"type":"cond-expr","locations":[{"start":{"line":26,"column":39},"end":{"line":26,"column":49}},{"start":{"line":26,"column":49},"end":{"line":26,"column":55}}],"line":26},"2":{"loc":{"start":{"line":38,"column":2},"end":{"line":40,"column":null}},"type":"if","locations":[{"start":{"line":38,"column":2},"end":{"line":40,"column":null}},{"start":{},"end":{}}],"line":38}},"s":{"0":1,"1":4,"2":4,"3":4,"4":4,"5":4,"6":4,"7":4,"8":4,"9":4,"10":0,"11":0,"12":4,"13":8,"14":8,"15":0,"16":8},"f":{"0":4,"1":4,"2":4,"3":0,"4":0,"5":8},"b":{"0":[4,1],"1":[0,0],"2":[0,8]},"meta":{"lastBranch":3,"lastFunction":6,"lastStatement":17,"seen":{"s:10:6:10:Infinity":0,"f:12:16:12:30":0,"s:13:24:16:Infinity":1,"f:13:44:13:50":1,"s:14:18:14:Infinity":2,"s:15:4:15:Infinity":3,"b:15:12:15:31:15:31:15:Infinity":0,"s:18:2:23:Infinity":4,"f:18:12:18:18":2,"s:19:17:19:Infinity":5,"s:20:4:20:Infinity":6,"s:21:4:21:Infinity":7,"s:22:4:22:Infinity":8,"s:25:22:27:Infinity":9,"f:25:22:25:28":3,"s:26:4:26:Infinity":10,"f:26:13:26:21":4,"s:26:21:26:55":11,"b:26:39:26:49:26:49:26:55":1,"s:29:2:32:Infinity":12,"f:36:16:36:27":5,"s:37:8:37:Infinity":13,"b:38:2:40:Infinity:undefined:undefined:undefined:undefined":2,"s:38:2:40:Infinity":14,"s:39:4:39:Infinity":15,"s:41:2:41:Infinity":16}}} -,"/home/jeremy/Server/Projects/cpmp/frontend/src/hooks/useImport.ts": {"path":"/home/jeremy/Server/Projects/cpmp/frontend/src/hooks/useImport.ts","statementMap":{"0":{"start":{"line":12,"column":25},"end":{"line":12,"column":null}},"1":{"start":{"line":15,"column":8},"end":{"line":15,"column":null}},"2":{"start":{"line":18,"column":8},"end":{"line":29,"column":null}},"3":{"start":{"line":22,"column":19},"end":{"line":22,"column":null}},"4":{"start":{"line":24,"column":6},"end":{"line":26,"column":null}},"5":{"start":{"line":25,"column":8},"end":{"line":25,"column":null}},"6":{"start":{"line":27,"column":6},"end":{"line":27,"column":null}},"7":{"start":{"line":31,"column":8},"end":{"line":35,"column":null}},"8":{"start":{"line":37,"column":8},"end":{"line":43,"column":null}},"9":{"start":{"line":38,"column":17},"end":{"line":38,"column":null}},"10":{"start":{"line":40,"column":6},"end":{"line":40,"column":null}},"11":{"start":{"line":41,"column":6},"end":{"line":41,"column":null}},"12":{"start":{"line":45,"column":8},"end":{"line":53,"column":null}},"13":{"start":{"line":46,"column":17},"end":{"line":46,"column":null}},"14":{"start":{"line":48,"column":6},"end":{"line":48,"column":null}},"15":{"start":{"line":49,"column":6},"end":{"line":49,"column":null}},"16":{"start":{"line":51,"column":6},"end":{"line":51,"column":null}},"17":{"start":{"line":55,"column":8},"end":{"line":61,"column":null}},"18":{"start":{"line":56,"column":16},"end":{"line":56,"column":null}},"19":{"start":{"line":58,"column":6},"end":{"line":58,"column":null}},"20":{"start":{"line":59,"column":6},"end":{"line":59,"column":null}},"21":{"start":{"line":63,"column":2},"end":{"line":73,"column":null}}},"fnMap":{"0":{"name":"useImport","decl":{"start":{"line":14,"column":16},"end":{"line":14,"column":28}},"loc":{"start":{"line":14,"column":28},"end":{"line":74,"column":null}},"line":14},"1":{"name":"(anonymous_1)","decl":{"start":{"line":21,"column":21},"end":{"line":21,"column":22}},"loc":{"start":{"line":21,"column":32},"end":{"line":28,"column":null}},"line":21},"2":{"name":"(anonymous_2)","decl":{"start":{"line":38,"column":16},"end":{"line":38,"column":17}},"loc":{"start":{"line":38,"column":17},"end":{"line":38,"column":null}},"line":38},"3":{"name":"(anonymous_3)","decl":{"start":{"line":39,"column":15},"end":{"line":39,"column":21}},"loc":{"start":{"line":39,"column":21},"end":{"line":42,"column":null}},"line":39},"4":{"name":"(anonymous_4)","decl":{"start":{"line":46,"column":16},"end":{"line":46,"column":17}},"loc":{"start":{"line":46,"column":17},"end":{"line":46,"column":null}},"line":46},"5":{"name":"(anonymous_5)","decl":{"start":{"line":47,"column":15},"end":{"line":47,"column":21}},"loc":{"start":{"line":47,"column":21},"end":{"line":52,"column":null}},"line":47},"6":{"name":"(anonymous_6)","decl":{"start":{"line":56,"column":16},"end":{"line":56,"column":22}},"loc":{"start":{"line":56,"column":16},"end":{"line":56,"column":null}},"line":56},"7":{"name":"(anonymous_7)","decl":{"start":{"line":57,"column":15},"end":{"line":57,"column":21}},"loc":{"start":{"line":57,"column":21},"end":{"line":60,"column":null}},"line":57}},"branchMap":{"0":{"loc":{"start":{"line":24,"column":6},"end":{"line":26,"column":null}},"type":"if","locations":[{"start":{"line":24,"column":6},"end":{"line":26,"column":null}},{"start":{},"end":{}}],"line":24},"1":{"loc":{"start":{"line":24,"column":10},"end":{"line":24,"column":69}},"type":"binary-expr","locations":[{"start":{"line":24,"column":10},"end":{"line":24,"column":31}},{"start":{"line":24,"column":31},"end":{"line":24,"column":69}}],"line":24},"2":{"loc":{"start":{"line":34,"column":13},"end":{"line":34,"column":null}},"type":"binary-expr","locations":[{"start":{"line":34,"column":13},"end":{"line":34,"column":48}},{"start":{"line":34,"column":48},"end":{"line":34,"column":null}}],"line":34},"3":{"loc":{"start":{"line":64,"column":13},"end":{"line":64,"column":null}},"type":"binary-expr","locations":[{"start":{"line":64,"column":13},"end":{"line":64,"column":42}},{"start":{"line":64,"column":42},"end":{"line":64,"column":null}}],"line":64},"4":{"loc":{"start":{"line":65,"column":13},"end":{"line":65,"column":null}},"type":"binary-expr","locations":[{"start":{"line":65,"column":13},"end":{"line":65,"column":34}},{"start":{"line":65,"column":34},"end":{"line":65,"column":null}}],"line":65},"5":{"loc":{"start":{"line":66,"column":13},"end":{"line":66,"column":null}},"type":"binary-expr","locations":[{"start":{"line":66,"column":13},"end":{"line":66,"column":38}},{"start":{"line":66,"column":38},"end":{"line":66,"column":66}},{"start":{"line":66,"column":66},"end":{"line":66,"column":94}},{"start":{"line":66,"column":94},"end":{"line":66,"column":null}}],"line":66},"6":{"loc":{"start":{"line":67,"column":12},"end":{"line":69,"column":null}},"type":"cond-expr","locations":[{"start":{"line":67,"column":118},"end":{"line":68,"column":null}},{"start":{"line":69,"column":8},"end":{"line":69,"column":null}}],"line":67},"7":{"loc":{"start":{"line":67,"column":12},"end":{"line":67,"column":null}},"type":"binary-expr","locations":[{"start":{"line":67,"column":12},"end":{"line":67,"column":33}},{"start":{"line":67,"column":33},"end":{"line":67,"column":55}},{"start":{"line":67,"column":55},"end":{"line":67,"column":79}},{"start":{"line":67,"column":79},"end":{"line":67,"column":103}},{"start":{"line":67,"column":103},"end":{"line":67,"column":null}}],"line":67},"8":{"loc":{"start":{"line":68,"column":10},"end":{"line":68,"column":133}},"type":"binary-expr","locations":[{"start":{"line":68,"column":10},"end":{"line":68,"column":31}},{"start":{"line":68,"column":31},"end":{"line":68,"column":53}},{"start":{"line":68,"column":53},"end":{"line":68,"column":77}},{"start":{"line":68,"column":77},"end":{"line":68,"column":101}},{"start":{"line":68,"column":101},"end":{"line":68,"column":133}}],"line":68}},"s":{"0":1,"1":19,"2":19,"3":61,"4":61,"5":29,"6":32,"7":19,"8":19,"9":5,"10":4,"11":4,"12":19,"13":2,"14":1,"15":1,"16":1,"17":19,"18":1,"19":1,"20":1,"21":19},"f":{"0":19,"1":61,"2":5,"3":4,"4":2,"5":1,"6":1,"7":1},"b":{"0":[29,32],"1":[61,29],"2":[19,9],"3":[19,10],"4":[19,12],"5":[19,13,13,13],"6":[2,17],"7":[19,19,19,18,17],"8":[2,2,2,1,0]},"meta":{"lastBranch":9,"lastFunction":8,"lastStatement":22,"seen":{"s:12:25:12:Infinity":0,"f:14:16:14:28":0,"s:15:8:15:Infinity":1,"s:18:8:29:Infinity":2,"f:21:21:21:22":1,"s:22:19:22:Infinity":3,"b:24:6:26:Infinity:undefined:undefined:undefined:undefined":0,"s:24:6:26:Infinity":4,"b:24:10:24:31:24:31:24:69":1,"s:25:8:25:Infinity":5,"s:27:6:27:Infinity":6,"s:31:8:35:Infinity":7,"b:34:13:34:48:34:48:34:Infinity":2,"s:37:8:43:Infinity":8,"f:38:16:38:17":2,"s:38:17:38:Infinity":9,"f:39:15:39:21":3,"s:40:6:40:Infinity":10,"s:41:6:41:Infinity":11,"s:45:8:53:Infinity":12,"f:46:16:46:17":4,"s:46:17:46:Infinity":13,"f:47:15:47:21":5,"s:48:6:48:Infinity":14,"s:49:6:49:Infinity":15,"s:51:6:51:Infinity":16,"s:55:8:61:Infinity":17,"f:56:16:56:22":6,"s:56:16:56:Infinity":18,"f:57:15:57:21":7,"s:58:6:58:Infinity":19,"s:59:6:59:Infinity":20,"s:63:2:73:Infinity":21,"b:64:13:64:42:64:42:64:Infinity":3,"b:65:13:65:34:65:34:65:Infinity":4,"b:66:13:66:38:66:38:66:66:66:66:66:94:66:94:66:Infinity":5,"b:67:118:68:Infinity:69:8:69:Infinity":6,"b:67:12:67:33:67:33:67:55:67:55:67:79:67:79:67:103:67:103:67:Infinity":7,"b:68:10:68:31:68:31:68:53:68:53:68:77:68:77:68:101:68:101:68:133":8}}} -,"/home/jeremy/Server/Projects/cpmp/frontend/src/hooks/useProxyHosts.ts": {"path":"/home/jeremy/Server/Projects/cpmp/frontend/src/hooks/useProxyHosts.ts","statementMap":{"0":{"start":{"line":10,"column":25},"end":{"line":10,"column":null}},"1":{"start":{"line":13,"column":8},"end":{"line":13,"column":null}},"2":{"start":{"line":15,"column":8},"end":{"line":18,"column":null}},"3":{"start":{"line":20,"column":8},"end":{"line":25,"column":null}},"4":{"start":{"line":21,"column":17},"end":{"line":21,"column":null}},"5":{"start":{"line":23,"column":6},"end":{"line":23,"column":null}},"6":{"start":{"line":27,"column":8},"end":{"line":33,"column":null}},"7":{"start":{"line":28,"column":30},"end":{"line":29,"column":null}},"8":{"start":{"line":31,"column":6},"end":{"line":31,"column":null}},"9":{"start":{"line":35,"column":8},"end":{"line":40,"column":null}},"10":{"start":{"line":36,"column":17},"end":{"line":36,"column":null}},"11":{"start":{"line":38,"column":6},"end":{"line":38,"column":null}},"12":{"start":{"line":42,"column":2},"end":{"line":52,"column":null}},"13":{"start":{"line":47,"column":60},"end":{"line":47,"column":null}}},"fnMap":{"0":{"name":"useProxyHosts","decl":{"start":{"line":12,"column":16},"end":{"line":12,"column":32}},"loc":{"start":{"line":12,"column":32},"end":{"line":53,"column":null}},"line":12},"1":{"name":"(anonymous_1)","decl":{"start":{"line":21,"column":16},"end":{"line":21,"column":17}},"loc":{"start":{"line":21,"column":17},"end":{"line":21,"column":null}},"line":21},"2":{"name":"(anonymous_2)","decl":{"start":{"line":22,"column":15},"end":{"line":22,"column":21}},"loc":{"start":{"line":22,"column":21},"end":{"line":24,"column":null}},"line":22},"3":{"name":"(anonymous_3)","decl":{"start":{"line":28,"column":16},"end":{"line":28,"column":17}},"loc":{"start":{"line":28,"column":30},"end":{"line":29,"column":null}},"line":28},"4":{"name":"(anonymous_4)","decl":{"start":{"line":30,"column":15},"end":{"line":30,"column":21}},"loc":{"start":{"line":30,"column":21},"end":{"line":32,"column":null}},"line":30},"5":{"name":"(anonymous_5)","decl":{"start":{"line":36,"column":16},"end":{"line":36,"column":17}},"loc":{"start":{"line":36,"column":17},"end":{"line":36,"column":null}},"line":36},"6":{"name":"(anonymous_6)","decl":{"start":{"line":37,"column":15},"end":{"line":37,"column":21}},"loc":{"start":{"line":37,"column":21},"end":{"line":39,"column":null}},"line":37},"7":{"name":"(anonymous_7)","decl":{"start":{"line":47,"column":16},"end":{"line":47,"column":17}},"loc":{"start":{"line":47,"column":60},"end":{"line":47,"column":null}},"line":47}},"branchMap":{"0":{"loc":{"start":{"line":43,"column":11},"end":{"line":43,"column":null}},"type":"binary-expr","locations":[{"start":{"line":43,"column":11},"end":{"line":43,"column":25}},{"start":{"line":43,"column":25},"end":{"line":43,"column":null}}],"line":43},"1":{"loc":{"start":{"line":45,"column":11},"end":{"line":45,"column":null}},"type":"cond-expr","locations":[{"start":{"line":45,"column":26},"end":{"line":45,"column":58}},{"start":{"line":45,"column":58},"end":{"line":45,"column":null}}],"line":45}},"s":{"0":1,"1":19,"2":19,"3":19,"4":2,"5":1,"6":19,"7":2,"8":1,"9":19,"10":2,"11":1,"12":19,"13":2},"f":{"0":19,"1":2,"2":1,"3":2,"4":1,"5":2,"6":1,"7":2},"b":{"0":[19,9],"1":[1,18]},"meta":{"lastBranch":2,"lastFunction":8,"lastStatement":14,"seen":{"s:10:25:10:Infinity":0,"f:12:16:12:32":0,"s:13:8:13:Infinity":1,"s:15:8:18:Infinity":2,"s:20:8:25:Infinity":3,"f:21:16:21:17":1,"s:21:17:21:Infinity":4,"f:22:15:22:21":2,"s:23:6:23:Infinity":5,"s:27:8:33:Infinity":6,"f:28:16:28:17":3,"s:28:30:29:Infinity":7,"f:30:15:30:21":4,"s:31:6:31:Infinity":8,"s:35:8:40:Infinity":9,"f:36:16:36:17":5,"s:36:17:36:Infinity":10,"f:37:15:37:21":6,"s:38:6:38:Infinity":11,"s:42:2:52:Infinity":12,"b:43:11:43:25:43:25:43:Infinity":0,"b:45:26:45:58:45:58:45:Infinity":1,"f:47:16:47:17":7,"s:47:60:47:Infinity":13}}} -,"/home/jeremy/Server/Projects/cpmp/frontend/src/hooks/useRemoteServers.ts": {"path":"/home/jeremy/Server/Projects/cpmp/frontend/src/hooks/useRemoteServers.ts","statementMap":{"0":{"start":{"line":11,"column":25},"end":{"line":11,"column":null}},"1":{"start":{"line":14,"column":8},"end":{"line":14,"column":null}},"2":{"start":{"line":16,"column":8},"end":{"line":19,"column":null}},"3":{"start":{"line":18,"column":13},"end":{"line":18,"column":null}},"4":{"start":{"line":21,"column":8},"end":{"line":26,"column":null}},"5":{"start":{"line":22,"column":17},"end":{"line":22,"column":null}},"6":{"start":{"line":24,"column":6},"end":{"line":24,"column":null}},"7":{"start":{"line":28,"column":8},"end":{"line":34,"column":null}},"8":{"start":{"line":29,"column":30},"end":{"line":30,"column":null}},"9":{"start":{"line":32,"column":6},"end":{"line":32,"column":null}},"10":{"start":{"line":36,"column":8},"end":{"line":41,"column":null}},"11":{"start":{"line":37,"column":17},"end":{"line":37,"column":null}},"12":{"start":{"line":39,"column":6},"end":{"line":39,"column":null}},"13":{"start":{"line":43,"column":8},"end":{"line":45,"column":null}},"14":{"start":{"line":44,"column":17},"end":{"line":44,"column":null}},"15":{"start":{"line":47,"column":2},"end":{"line":59,"column":null}},"16":{"start":{"line":52,"column":65},"end":{"line":52,"column":null}}},"fnMap":{"0":{"name":"useRemoteServers","decl":{"start":{"line":13,"column":16},"end":{"line":13,"column":33}},"loc":{"start":{"line":13,"column":54},"end":{"line":60,"column":null}},"line":13},"1":{"name":"(anonymous_1)","decl":{"start":{"line":18,"column":13},"end":{"line":18,"column":19}},"loc":{"start":{"line":18,"column":13},"end":{"line":18,"column":null}},"line":18},"2":{"name":"(anonymous_2)","decl":{"start":{"line":22,"column":16},"end":{"line":22,"column":17}},"loc":{"start":{"line":22,"column":17},"end":{"line":22,"column":null}},"line":22},"3":{"name":"(anonymous_3)","decl":{"start":{"line":23,"column":15},"end":{"line":23,"column":21}},"loc":{"start":{"line":23,"column":21},"end":{"line":25,"column":null}},"line":23},"4":{"name":"(anonymous_4)","decl":{"start":{"line":29,"column":16},"end":{"line":29,"column":17}},"loc":{"start":{"line":29,"column":30},"end":{"line":30,"column":null}},"line":29},"5":{"name":"(anonymous_5)","decl":{"start":{"line":31,"column":15},"end":{"line":31,"column":21}},"loc":{"start":{"line":31,"column":21},"end":{"line":33,"column":null}},"line":31},"6":{"name":"(anonymous_6)","decl":{"start":{"line":37,"column":16},"end":{"line":37,"column":17}},"loc":{"start":{"line":37,"column":17},"end":{"line":37,"column":null}},"line":37},"7":{"name":"(anonymous_7)","decl":{"start":{"line":38,"column":15},"end":{"line":38,"column":21}},"loc":{"start":{"line":38,"column":21},"end":{"line":40,"column":null}},"line":38},"8":{"name":"(anonymous_8)","decl":{"start":{"line":44,"column":16},"end":{"line":44,"column":17}},"loc":{"start":{"line":44,"column":17},"end":{"line":44,"column":null}},"line":44},"9":{"name":"(anonymous_9)","decl":{"start":{"line":52,"column":18},"end":{"line":52,"column":19}},"loc":{"start":{"line":52,"column":65},"end":{"line":52,"column":null}},"line":52}},"branchMap":{"0":{"loc":{"start":{"line":13,"column":33},"end":{"line":13,"column":54}},"type":"default-arg","locations":[{"start":{"line":13,"column":47},"end":{"line":13,"column":54}}],"line":13},"1":{"loc":{"start":{"line":48,"column":13},"end":{"line":48,"column":null}},"type":"binary-expr","locations":[{"start":{"line":48,"column":13},"end":{"line":48,"column":27}},{"start":{"line":48,"column":27},"end":{"line":48,"column":null}}],"line":48},"2":{"loc":{"start":{"line":50,"column":11},"end":{"line":50,"column":null}},"type":"cond-expr","locations":[{"start":{"line":50,"column":26},"end":{"line":50,"column":58}},{"start":{"line":50,"column":58},"end":{"line":50,"column":null}}],"line":50}},"s":{"0":1,"1":23,"2":23,"3":13,"4":23,"5":2,"6":1,"7":23,"8":2,"9":1,"10":23,"11":2,"12":1,"13":23,"14":2,"15":23,"16":2},"f":{"0":23,"1":13,"2":2,"3":1,"4":2,"5":1,"6":2,"7":1,"8":2,"9":2},"b":{"0":[23],"1":[23,11],"2":[1,22]},"meta":{"lastBranch":3,"lastFunction":10,"lastStatement":17,"seen":{"s:11:25:11:Infinity":0,"f:13:16:13:33":0,"b:13:47:13:54":0,"s:14:8:14:Infinity":1,"s:16:8:19:Infinity":2,"f:18:13:18:19":1,"s:18:13:18:Infinity":3,"s:21:8:26:Infinity":4,"f:22:16:22:17":2,"s:22:17:22:Infinity":5,"f:23:15:23:21":3,"s:24:6:24:Infinity":6,"s:28:8:34:Infinity":7,"f:29:16:29:17":4,"s:29:30:30:Infinity":8,"f:31:15:31:21":5,"s:32:6:32:Infinity":9,"s:36:8:41:Infinity":10,"f:37:16:37:17":6,"s:37:17:37:Infinity":11,"f:38:15:38:21":7,"s:39:6:39:Infinity":12,"s:43:8:45:Infinity":13,"f:44:16:44:17":8,"s:44:17:44:Infinity":14,"s:47:2:59:Infinity":15,"b:48:13:48:27:48:27:48:Infinity":1,"b:50:26:50:58:50:58:50:Infinity":2,"f:52:18:52:19":9,"s:52:65:52:Infinity":16}}} -,"/home/jeremy/Server/Projects/cpmp/frontend/src/pages/Setup.tsx": {"path":"/home/jeremy/Server/Projects/cpmp/frontend/src/pages/Setup.tsx","statementMap":{"0":{"start":{"line":6,"column":24},"end":{"line":142,"column":null}},"1":{"start":{"line":7,"column":8},"end":{"line":7,"column":null}},"2":{"start":{"line":8,"column":30},"end":{"line":12,"column":null}},"3":{"start":{"line":13,"column":24},"end":{"line":13,"column":null}},"4":{"start":{"line":15,"column":49},"end":{"line":19,"column":null}},"5":{"start":{"line":21,"column":2},"end":{"line":25,"column":null}},"6":{"start":{"line":22,"column":4},"end":{"line":24,"column":null}},"7":{"start":{"line":23,"column":6},"end":{"line":23,"column":null}},"8":{"start":{"line":27,"column":8},"end":{"line":35,"column":null}},"9":{"start":{"line":30,"column":6},"end":{"line":30,"column":null}},"10":{"start":{"line":33,"column":6},"end":{"line":33,"column":null}},"11":{"start":{"line":37,"column":23},"end":{"line":41,"column":null}},"12":{"start":{"line":38,"column":4},"end":{"line":38,"column":null}},"13":{"start":{"line":39,"column":4},"end":{"line":39,"column":null}},"14":{"start":{"line":40,"column":4},"end":{"line":40,"column":null}},"15":{"start":{"line":43,"column":2},"end":{"line":49,"column":null}},"16":{"start":{"line":44,"column":4},"end":{"line":47,"column":null}},"17":{"start":{"line":51,"column":2},"end":{"line":53,"column":null}},"18":{"start":{"line":52,"column":4},"end":{"line":52,"column":null}},"19":{"start":{"line":55,"column":2},"end":{"line":140,"column":null}},"20":{"start":{"line":80,"column":33},"end":{"line":80,"column":null}},"21":{"start":{"line":95,"column":33},"end":{"line":95,"column":null}},"22":{"start":{"line":114,"column":33},"end":{"line":114,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":6,"column":24},"end":{"line":6,"column":30}},"loc":{"start":{"line":6,"column":30},"end":{"line":142,"column":null}},"line":6},"1":{"name":"(anonymous_1)","decl":{"start":{"line":21,"column":12},"end":{"line":21,"column":18}},"loc":{"start":{"line":21,"column":18},"end":{"line":25,"column":5}},"line":21},"2":{"name":"(anonymous_2)","decl":{"start":{"line":29,"column":15},"end":{"line":29,"column":21}},"loc":{"start":{"line":29,"column":21},"end":{"line":31,"column":null}},"line":29},"3":{"name":"(anonymous_3)","decl":{"start":{"line":32,"column":13},"end":{"line":32,"column":14}},"loc":{"start":{"line":32,"column":27},"end":{"line":34,"column":null}},"line":32},"4":{"name":"(anonymous_4)","decl":{"start":{"line":37,"column":23},"end":{"line":37,"column":24}},"loc":{"start":{"line":37,"column":47},"end":{"line":41,"column":null}},"line":37},"5":{"name":"(anonymous_5)","decl":{"start":{"line":80,"column":26},"end":{"line":80,"column":27}},"loc":{"start":{"line":80,"column":33},"end":{"line":80,"column":null}},"line":80},"6":{"name":"(anonymous_6)","decl":{"start":{"line":95,"column":26},"end":{"line":95,"column":27}},"loc":{"start":{"line":95,"column":33},"end":{"line":95,"column":null}},"line":95},"7":{"name":"(anonymous_7)","decl":{"start":{"line":114,"column":26},"end":{"line":114,"column":27}},"loc":{"start":{"line":114,"column":33},"end":{"line":114,"column":null}},"line":114}},"branchMap":{"0":{"loc":{"start":{"line":22,"column":4},"end":{"line":24,"column":null}},"type":"if","locations":[{"start":{"line":22,"column":4},"end":{"line":24,"column":null}},{"start":{},"end":{}}],"line":22},"1":{"loc":{"start":{"line":22,"column":8},"end":{"line":22,"column":41}},"type":"binary-expr","locations":[{"start":{"line":22,"column":8},"end":{"line":22,"column":18}},{"start":{"line":22,"column":18},"end":{"line":22,"column":41}}],"line":22},"2":{"loc":{"start":{"line":33,"column":15},"end":{"line":33,"column":58}},"type":"binary-expr","locations":[{"start":{"line":33,"column":15},"end":{"line":33,"column":44}},{"start":{"line":33,"column":44},"end":{"line":33,"column":58}}],"line":33},"3":{"loc":{"start":{"line":43,"column":2},"end":{"line":49,"column":null}},"type":"if","locations":[{"start":{"line":43,"column":2},"end":{"line":49,"column":null}},{"start":{},"end":{}}],"line":43},"4":{"loc":{"start":{"line":51,"column":2},"end":{"line":53,"column":null}},"type":"if","locations":[{"start":{"line":51,"column":2},"end":{"line":53,"column":null}},{"start":{},"end":{}}],"line":51},"5":{"loc":{"start":{"line":51,"column":6},"end":{"line":51,"column":39}},"type":"binary-expr","locations":[{"start":{"line":51,"column":6},"end":{"line":51,"column":16}},{"start":{"line":51,"column":16},"end":{"line":51,"column":39}}],"line":51},"6":{"loc":{"start":{"line":119,"column":11},"end":{"line":122,"column":null}},"type":"binary-expr","locations":[{"start":{"line":119,"column":11},"end":{"line":119,"column":null}},{"start":{"line":120,"column":12},"end":{"line":122,"column":null}}],"line":119},"7":{"loc":{"start":{"line":131,"column":15},"end":{"line":134,"column":null}},"type":"cond-expr","locations":[{"start":{"line":132,"column":16},"end":{"line":132,"column":null}},{"start":{"line":134,"column":16},"end":{"line":134,"column":null}}],"line":131}},"s":{"0":1,"1":3,"2":3,"3":3,"4":3,"5":3,"6":3,"7":0,"8":3,"9":0,"10":0,"11":3,"12":0,"13":0,"14":0,"15":3,"16":2,"17":1,"18":0,"19":1,"20":0,"21":0,"22":0},"f":{"0":3,"1":3,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0},"b":{"0":[0,3],"1":[3,1],"2":[0,0],"3":[2,1],"4":[0,1],"5":[1,1],"6":[1,0],"7":[0,1]},"meta":{"lastBranch":8,"lastFunction":8,"lastStatement":23,"seen":{"s:6:24:142:Infinity":0,"f:6:24:6:30":0,"s:7:8:7:Infinity":1,"s:8:30:12:Infinity":2,"s:13:24:13:Infinity":3,"s:15:49:19:Infinity":4,"s:21:2:25:Infinity":5,"f:21:12:21:18":1,"b:22:4:24:Infinity:undefined:undefined:undefined:undefined":0,"s:22:4:24:Infinity":6,"b:22:8:22:18:22:18:22:41":1,"s:23:6:23:Infinity":7,"s:27:8:35:Infinity":8,"f:29:15:29:21":2,"s:30:6:30:Infinity":9,"f:32:13:32:14":3,"s:33:6:33:Infinity":10,"b:33:15:33:44:33:44:33:58":2,"s:37:23:41:Infinity":11,"f:37:23:37:24":4,"s:38:4:38:Infinity":12,"s:39:4:39:Infinity":13,"s:40:4:40:Infinity":14,"b:43:2:49:Infinity:undefined:undefined:undefined:undefined":3,"s:43:2:49:Infinity":15,"s:44:4:47:Infinity":16,"b:51:2:53:Infinity:undefined:undefined:undefined:undefined":4,"s:51:2:53:Infinity":17,"b:51:6:51:16:51:16:51:39":5,"s:52:4:52:Infinity":18,"s:55:2:140:Infinity":19,"f:80:26:80:27":5,"s:80:33:80:Infinity":20,"f:95:26:95:27":6,"s:95:33:95:Infinity":21,"f:114:26:114:27":7,"s:114:33:114:Infinity":22,"b:119:11:119:Infinity:120:12:122:Infinity":6,"b:132:16:132:Infinity:134:16:134:Infinity":7}}} -} diff --git a/frontend/coverage/favicon.png b/frontend/coverage/favicon.png deleted file mode 100644 index c1525b81..00000000 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 4c2a2566..00000000 --- a/frontend/coverage/index.html +++ /dev/null @@ -1,176 +0,0 @@ - - - - - - Code coverage report for All files - - - - - - - - - -
-
-

All files

-
- -
- 77.89% - Statements - 148/190 -
- - -
- 82.09% - Branches - 133/162 -
- - -
- 70.73% - Functions - 58/82 -
- - -
- 79.03% - Lines - 147/186 -
- - -
-

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

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
components -
-
68.81%64/9381.63%80/9860.97%25/4170%63/90
components/ui -
-
100%4/485.71%6/7100%1/1100%4/4
context -
-
82.35%14/1750%3/666.66%4/687.5%14/16
hooks -
-
100%53/5397.14%34/35100%26/26100%53/53
pages -
-
56.52%13/2362.5%10/1625%2/856.52%13/23
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/frontend/coverage/prettify.css b/frontend/coverage/prettify.css deleted file mode 100644 index b317a7cd..00000000 --- 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 b3225238..00000000 --- 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 6ed68316..00000000 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 4ed70ae5..00000000 --- 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/dist/index.html b/frontend/dist/index.html deleted file mode 100644 index a5507bec..00000000 --- a/frontend/dist/index.html +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - Caddy Proxy Manager+ - - - - -
- - diff --git a/frontend/src/components/ImportReviewTable.tsx b/frontend/src/components/ImportReviewTable.tsx index 1fd6e404..605a7f94 100644 --- a/frontend/src/components/ImportReviewTable.tsx +++ b/frontend/src/components/ImportReviewTable.tsx @@ -1,4 +1,4 @@ -import { useMemo, useState } from 'react' +import { useState } from 'react' interface HostPreview { domain_names: string diff --git a/frontend/src/components/Layout.tsx b/frontend/src/components/Layout.tsx index fc9e880d..30b1b291 100644 --- a/frontend/src/components/Layout.tsx +++ b/frontend/src/components/Layout.tsx @@ -2,6 +2,7 @@ import { ReactNode, useState } from 'react' import { Link, useLocation } from 'react-router-dom' import { ThemeToggle } from './ThemeToggle' import { Button } from './ui/Button' +import { useAuth } from '../context/AuthContext' interface LayoutProps { children: ReactNode @@ -10,6 +11,7 @@ interface LayoutProps { export default function Layout({ children }: LayoutProps) { const location = useLocation() const [sidebarOpen, setSidebarOpen] = useState(false) + const { logout } = useAuth() const navigation = [ { name: 'Dashboard', path: '/', icon: '📊' }, @@ -63,6 +65,17 @@ export default function Layout({ children }: LayoutProps) { ) })} + +
diff --git a/frontend/src/components/__tests__/Layout.test.tsx b/frontend/src/components/__tests__/Layout.test.tsx index 88020954..4cc2c388 100644 --- a/frontend/src/components/__tests__/Layout.test.tsx +++ b/frontend/src/components/__tests__/Layout.test.tsx @@ -1,10 +1,17 @@ import { ReactNode } from 'react' -import { describe, it, expect } from 'vitest' +import { describe, it, expect, vi } from 'vitest' import { render, screen } from '@testing-library/react' import { BrowserRouter } from 'react-router-dom' import Layout from '../Layout' import { ThemeProvider } from '../../context/ThemeContext' +// Mock AuthContext +vi.mock('../../context/AuthContext', () => ({ + useAuth: () => ({ + logout: vi.fn(), + }), +})) + const renderWithProviders = (children: ReactNode) => { return render( diff --git a/frontend/src/components/ui/Input.tsx b/frontend/src/components/ui/Input.tsx index 3d7d0861..fca418ec 100644 --- a/frontend/src/components/ui/Input.tsx +++ b/frontend/src/components/ui/Input.tsx @@ -1,5 +1,6 @@ -import { InputHTMLAttributes, forwardRef } from 'react' +import { InputHTMLAttributes, forwardRef, useState } from 'react' import { clsx } from 'clsx' +import { Eye, EyeOff } from 'lucide-react' interface InputProps extends InputHTMLAttributes { label?: string @@ -8,25 +9,49 @@ interface InputProps extends InputHTMLAttributes { } export const Input = forwardRef( - ({ label, error, helperText, className, ...props }, ref) => { + ({ label, error, helperText, className, type, ...props }, ref) => { + const [showPassword, setShowPassword] = useState(false) + const isPassword = type === 'password' + return (
{label && ( -
{error && (

{error}

)} diff --git a/frontend/src/context/AuthContext.tsx b/frontend/src/context/AuthContext.tsx index 0f30588a..e30ad4e4 100644 --- a/frontend/src/context/AuthContext.tsx +++ b/frontend/src/context/AuthContext.tsx @@ -1,6 +1,5 @@ import React, { createContext, useContext, useState, useEffect } from 'react'; import client from '../api/client'; -import { AxiosResponse } from 'axios'; interface User { user_id: number; @@ -9,7 +8,7 @@ interface User { interface AuthContextType { user: User | null; - login: () => void; + login: () => Promise; logout: () => void; isAuthenticated: boolean; isLoading: boolean; @@ -36,14 +35,16 @@ export const AuthProvider: React.FC<{ children: React.ReactNode }> = ({ children checkAuth(); }, []); - const login = () => { + const login = async () => { // Token is stored in cookie by backend, but we might want to store it in memory or trigger a re-fetch // Actually, if backend sets cookie, we just need to fetch /auth/me - client.get('/auth/me').then((response: AxiosResponse) => { - setUser(response.data); - }).catch(() => { - setUser(null); - }); + try { + const response = await client.get('/auth/me'); + setUser(response.data); + } catch (error) { + setUser(null); + throw error; + } }; const logout = async () => { @@ -55,6 +56,40 @@ export const AuthProvider: React.FC<{ children: React.ReactNode }> = ({ children setUser(null); }; + // Auto-logout logic + useEffect(() => { + if (!user) return; + + const TIMEOUT_MS = 15 * 60 * 1000; // 15 minutes + let timeoutId: ReturnType; + + const resetTimer = () => { + if (timeoutId) clearTimeout(timeoutId); + timeoutId = setTimeout(() => { + console.log('Auto-logging out due to inactivity'); + logout(); + }, TIMEOUT_MS); + }; + + // Initial timer start + resetTimer(); + + // Event listeners for activity + const events = ['mousedown', 'keydown', 'scroll', 'touchstart']; + const handleActivity = () => resetTimer(); + + events.forEach(event => { + window.addEventListener(event, handleActivity); + }); + + return () => { + if (timeoutId) clearTimeout(timeoutId); + events.forEach(event => { + window.removeEventListener(event, handleActivity); + }); + }; + }, [user]); + return ( {children} diff --git a/frontend/src/pages/ImportCaddy.tsx b/frontend/src/pages/ImportCaddy.tsx index b29a4d4d..29ac144b 100644 --- a/frontend/src/pages/ImportCaddy.tsx +++ b/frontend/src/pages/ImportCaddy.tsx @@ -134,7 +134,7 @@ api.example.com { {showReview && preview && preview.preview && ( setShowReview(false)} diff --git a/frontend/src/pages/Login.tsx b/frontend/src/pages/Login.tsx index 976eac2a..4bb99c2b 100644 --- a/frontend/src/pages/Login.tsx +++ b/frontend/src/pages/Login.tsx @@ -12,6 +12,7 @@ export default function Login() { const [email, setEmail] = useState('') const [password, setPassword] = useState('') const [loading, setLoading] = useState(false) + const [showResetInfo, setShowResetInfo] = useState(false) const { login } = useAuth() const handleSubmit = async (e: React.FormEvent) => { @@ -20,7 +21,7 @@ export default function Login() { try { await client.post('/auth/login', { email, password }) - login() + await login() toast.success('Logged in successfully') navigate('/') } catch (err: any) { @@ -42,14 +43,36 @@ export default function Login() { required placeholder="admin@example.com" /> - setPassword(e.target.value)} - required - placeholder="••••••••" - /> +
+ setPassword(e.target.value)} + required + placeholder="••••••••" + /> +
+ +
+
+ + {showResetInfo && ( +
+

To reset your password:

+

Run this command on your server:

+ + docker exec -it caddy-proxy-manager /app/backend reset-password <email> <new-password> + +
+ )} + diff --git a/frontend/src/pages/Setup.tsx b/frontend/src/pages/Setup.tsx index e47a57d3..f16bde8c 100644 --- a/frontend/src/pages/Setup.tsx +++ b/frontend/src/pages/Setup.tsx @@ -2,6 +2,8 @@ import React, { useState, useEffect } from 'react'; import { useNavigate } from 'react-router-dom'; import { useMutation, useQuery } from '@tanstack/react-query'; import { getSetupStatus, performSetup, SetupRequest } from '../api/setup'; +import { Input } from '../components/ui/Input'; +import { Button } from '../components/ui/Button'; const Setup: React.FC = () => { const navigate = useNavigate(); @@ -64,56 +66,39 @@ const Setup: React.FC = () => {

-
-
- - setFormData({ ...formData, name: e.target.value })} - /> -
-
- - setFormData({ ...formData, email: e.target.value })} - /> -

- This email will be used for Let's Encrypt certificate notifications and recovery. -

-
-
- - setFormData({ ...formData, password: e.target.value })} - /> -
+
+ setFormData({ ...formData, name: e.target.value })} + /> + setFormData({ ...formData, email: e.target.value })} + helperText="This email will be used for Let's Encrypt certificate notifications and recovery." + /> + setFormData({ ...formData, password: e.target.value })} + />
{error && ( @@ -123,17 +108,13 @@ const Setup: React.FC = () => { )}
- + Create Admin Account +
diff --git a/frontend/tsconfig.tsbuildinfo b/frontend/tsconfig.tsbuildinfo deleted file mode 100644 index db28803a..00000000 --- a/frontend/tsconfig.tsbuildinfo +++ /dev/null @@ -1 +0,0 @@ -{"root":["./src/App.tsx","./src/main.tsx","./src/vite-env.d.ts","./src/api/client.ts","./src/components/Layout.tsx","./src/hooks/useProxyHosts.ts","./src/pages/Dashboard.tsx","./src/pages/HealthStatus.tsx","./src/pages/ProxyHosts.tsx"],"version":"5.9.3"} \ No newline at end of file