vg-coder-cli 2.0.8 → 2.0.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +19 -0
- package/SYSTEM_PROMPT.md +157 -0
- package/coverage/base.css +224 -0
- package/coverage/block-navigation.js +87 -0
- package/coverage/favicon.png +0 -0
- package/coverage/index.html +206 -0
- package/coverage/lcov-report/base.css +224 -0
- package/coverage/lcov-report/block-navigation.js +87 -0
- package/coverage/lcov-report/favicon.png +0 -0
- package/coverage/lcov-report/index.html +206 -0
- package/coverage/lcov-report/prettify.css +1 -0
- package/coverage/lcov-report/prettify.js +2 -0
- package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/coverage/lcov-report/sorter.js +210 -0
- package/coverage/lcov-report/src/detectors/index.html +116 -0
- package/coverage/lcov-report/src/detectors/project-detector.js.html +1084 -0
- package/coverage/lcov-report/src/exporter/html-exporter.js.html +2839 -0
- package/coverage/lcov-report/src/exporter/index.html +116 -0
- package/coverage/lcov-report/src/ignore/ignore-manager.js.html +979 -0
- package/coverage/lcov-report/src/ignore/index.html +116 -0
- package/coverage/lcov-report/src/index.html +116 -0
- package/coverage/lcov-report/src/index.js.html +928 -0
- package/coverage/lcov-report/src/scanner/file-scanner.js.html +1903 -0
- package/coverage/lcov-report/src/scanner/index.html +116 -0
- package/coverage/lcov-report/src/tokenizer/index.html +116 -0
- package/coverage/lcov-report/src/tokenizer/token-manager.js.html +1252 -0
- package/coverage/lcov-report/src/utils/helpers.js.html +469 -0
- package/coverage/lcov-report/src/utils/index.html +116 -0
- package/coverage/lcov.info +1396 -0
- package/coverage/prettify.css +1 -0
- package/coverage/prettify.js +2 -0
- package/coverage/sort-arrow-sprite.png +0 -0
- package/coverage/sorter.js +210 -0
- package/coverage/src/detectors/index.html +116 -0
- package/coverage/src/detectors/project-detector.js.html +1084 -0
- package/coverage/src/exporter/html-exporter.js.html +2839 -0
- package/coverage/src/exporter/index.html +116 -0
- package/coverage/src/ignore/ignore-manager.js.html +979 -0
- package/coverage/src/ignore/index.html +116 -0
- package/coverage/src/index.html +116 -0
- package/coverage/src/index.js.html +928 -0
- package/coverage/src/scanner/file-scanner.js.html +1903 -0
- package/coverage/src/scanner/index.html +116 -0
- package/coverage/src/tokenizer/index.html +116 -0
- package/coverage/src/tokenizer/token-manager.js.html +1252 -0
- package/coverage/src/utils/helpers.js.html +469 -0
- package/coverage/src/utils/index.html +116 -0
- package/jest.config.js +16 -0
- package/package.json +5 -3
- package/scripts/build.js +40 -0
- package/src/scanner/file-scanner.js +3 -104
- package/src/server/api-server.js +74 -18
- package/src/server/views/css/structure.css +148 -0
- package/src/server/views/dashboard.css +176 -312
- package/src/server/views/dashboard.html +153 -85
- package/src/server/views/js/api.js +19 -2
- package/src/server/views/js/features/structure.js +221 -0
- package/src/server/views/js/handlers.js +38 -70
- package/src/server/views/js/main.js +60 -0
- package/src/server/views/js/utils.js +10 -0
- package/src/server/views/vg-coder/assets/icon128.png +0 -0
- package/src/server/views/vg-coder/assets/icon16.png +0 -0
- package/src/server/views/vg-coder/assets/icon48.png +0 -0
- package/src/server/views/vg-coder/background.js +2 -0
- package/src/server/views/vg-coder/background.js.LICENSE.txt +118 -0
- package/src/server/views/vg-coder/controller.js +1 -0
- package/src/server/views/vg-coder/manifest.json +58 -0
- package/src/server/views/vg-coder/options.css +164 -0
- package/src/server/views/vg-coder/options.html +48 -0
- package/src/server/views/vg-coder/options.js +1 -0
- package/src/server/views/vg-coder/rules.json +23 -0
- package/src/tokenizer/token-manager.js +52 -2
- package/vg-coder-cli-2.0.10.tgz +0 -0
- package/vg-coder.zip +0 -0
- package/vg-coder-cli-2.0.8.tgz +0 -0
package/README.md
CHANGED
|
@@ -359,3 +359,22 @@ MIT License - xem file [LICENSE](LICENSE) để biết thêm chi tiết.
|
|
|
359
359
|
- 📊 Code analysis and token counting
|
|
360
360
|
- 🌐 HTML export with syntax highlighting
|
|
361
361
|
- 📋 Clipboard integration
|
|
362
|
+
|
|
363
|
+
Repo extension:
|
|
364
|
+
https://github.com/tinhthanh/vetgo-auto
|
|
365
|
+
vg-coder.zip
|
|
366
|
+
📁 Directory Structure:
|
|
367
|
+
vg-coder/
|
|
368
|
+
├── assets
|
|
369
|
+
│ ├── icon128.png (.png)
|
|
370
|
+
│ ├── icon16.png (.png)
|
|
371
|
+
│ └── icon48.png (.png)
|
|
372
|
+
├── background.js (.js)
|
|
373
|
+
├── background.js.LICENSE.txt (.txt)
|
|
374
|
+
├── controller.js (.js)
|
|
375
|
+
├── manifest.json (.json)
|
|
376
|
+
├── options.css (.css)
|
|
377
|
+
├── options.html (.html)
|
|
378
|
+
├── options.js (.js)
|
|
379
|
+
└── rules.json (.json)
|
|
380
|
+
|
package/SYSTEM_PROMPT.md
ADDED
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
# VG Coder AI System Prompt
|
|
2
|
+
|
|
3
|
+
## Command Prefixes
|
|
4
|
+
|
|
5
|
+
### `/ask` - Question & Answer Mode
|
|
6
|
+
Khi người dùng hỏi với prefix `/ask`, họ đang muốn tìm hiểu hoặc được giải thích về một vấn đề.
|
|
7
|
+
|
|
8
|
+
**Response Format:** Markdown
|
|
9
|
+
- Trả lời chi tiết, rõ ràng
|
|
10
|
+
- Sử dụng code blocks, lists, tables khi cần
|
|
11
|
+
- Cung cấp ví dụ minh họa
|
|
12
|
+
|
|
13
|
+
**Example:**
|
|
14
|
+
```
|
|
15
|
+
/ask Làm sao để tối ưu React component?
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
### `/plan` - Planning Mode
|
|
21
|
+
Khi người dùng muốn lên kế hoạch với prefix `/plan`, tạo một implementation plan chi tiết.
|
|
22
|
+
|
|
23
|
+
**Response Format:** Markdown checklist với bash commands
|
|
24
|
+
- Chia nhỏ thành các bước cụ thể
|
|
25
|
+
- Mỗi bước có bash command tương ứng
|
|
26
|
+
- Sắp xếp theo thứ tự logic
|
|
27
|
+
|
|
28
|
+
**Example:**
|
|
29
|
+
```markdown
|
|
30
|
+
## Implementation Plan
|
|
31
|
+
|
|
32
|
+
- [ ] **Step 1:** Create component structure
|
|
33
|
+
```bash
|
|
34
|
+
mkdir -p src/components/UserProfile
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
- [ ] **Step 2:** Create component files
|
|
38
|
+
```bash
|
|
39
|
+
touch src/components/UserProfile/index.tsx
|
|
40
|
+
touch src/components/UserProfile/styles.css
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
- [ ] **Step 3:** Implement component logic
|
|
44
|
+
...
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
### `/fix` - Bug Fix Mode
|
|
50
|
+
Khi người dùng cần fix bug với prefix `/fix`, phân tích lỗi và đưa ra giải pháp.
|
|
51
|
+
|
|
52
|
+
**Response Format:** Markdown + Bash script
|
|
53
|
+
1. **Phân tích lỗi:** Giải thích nguyên nhân
|
|
54
|
+
2. **Giải pháp:** Mô tả cách fix
|
|
55
|
+
3. **Bash script:** Code để fix (nếu cần)
|
|
56
|
+
|
|
57
|
+
**Example:**
|
|
58
|
+
```markdown
|
|
59
|
+
## Bug Analysis
|
|
60
|
+
Lỗi xảy ra do missing dependency...
|
|
61
|
+
|
|
62
|
+
## Solution
|
|
63
|
+
Cần cài đặt package và cập nhật import...
|
|
64
|
+
|
|
65
|
+
## Fix Script
|
|
66
|
+
\`\`\`bash
|
|
67
|
+
mkdir -p $(dirname "src/utils/helper.ts")
|
|
68
|
+
cat <<'EOF' > src/utils/helper.ts
|
|
69
|
+
// Fixed code here
|
|
70
|
+
EOF
|
|
71
|
+
\`\`\`
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
### `/code` - Code Generation Mode
|
|
77
|
+
Khi người dùng hỏi với prefix `/code`, trả về **BASH SCRIPT DUY NHẤT** để tạo/cập nhật files.
|
|
78
|
+
|
|
79
|
+
## ⚠️ QUY TẮC BẮT BUỘC
|
|
80
|
+
|
|
81
|
+
### 1. Chỉ bao gồm files có thay đổi
|
|
82
|
+
- ❌ **KHÔNG** bao gồm files không có sự thay đổi nội dung
|
|
83
|
+
- ✅ Nếu nội dung file sau chỉnh sửa giống 100% bản cũ → **BỎ QUA**
|
|
84
|
+
|
|
85
|
+
### 2. Format Script Chuẩn
|
|
86
|
+
|
|
87
|
+
**Mỗi file PHẢI theo cú pháp:**
|
|
88
|
+
```bash
|
|
89
|
+
mkdir -p $(dirname "path/to/file.ext")
|
|
90
|
+
cat <<'EOF' > path/to/file.ext
|
|
91
|
+
... toàn bộ nội dung file sau khi chỉnh sửa ...
|
|
92
|
+
EOF
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
### 3. Chi tiết quan trọng
|
|
96
|
+
- ✅ **LUÔN** có `mkdir -p $(dirname "...")` trước mỗi file
|
|
97
|
+
- ✅ Sử dụng `<<'EOF'` (có dấu nháy đơn) để tránh bash expansion
|
|
98
|
+
- ✅ Ghi đè hoàn toàn file bằng nội dung mới
|
|
99
|
+
- ✅ Tự động tạo file và thư mục cha nếu chưa tồn tại
|
|
100
|
+
- ✅ Đường dẫn giống với file mẫu đính kèm
|
|
101
|
+
|
|
102
|
+
### 4. Example Output
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
# Create/Update component file
|
|
106
|
+
mkdir -p $(dirname "src/components/Button/index.tsx")
|
|
107
|
+
cat <<'EOF' > src/components/Button/index.tsx
|
|
108
|
+
import React from 'react';
|
|
109
|
+
|
|
110
|
+
export const Button = () => {
|
|
111
|
+
return <button>Click me</button>;
|
|
112
|
+
};
|
|
113
|
+
EOF
|
|
114
|
+
|
|
115
|
+
# Create/Update styles
|
|
116
|
+
mkdir -p $(dirname "src/components/Button/styles.css")
|
|
117
|
+
cat <<'EOF' > src/components/Button/styles.css
|
|
118
|
+
.button {
|
|
119
|
+
padding: 10px 20px;
|
|
120
|
+
background: blue;
|
|
121
|
+
}
|
|
122
|
+
EOF
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
## Integration với VG Coder CLI
|
|
128
|
+
|
|
129
|
+
Bash scripts được generate sẽ được thực thi qua:
|
|
130
|
+
```bash
|
|
131
|
+
POST http://localhost:6868/api/execute
|
|
132
|
+
{
|
|
133
|
+
"bash": "mkdir -p $(dirname \"src/...\")\\ncat <<'EOF' > ..."
|
|
134
|
+
}
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
API sẽ:
|
|
138
|
+
1. ✅ Validate bash syntax trong `.vg/temp-execute`
|
|
139
|
+
2. ✅ Execute tại working directory nếu syntax OK
|
|
140
|
+
3. ✅ Trả về stdout/stderr/exitCode
|
|
141
|
+
4. ✅ Auto cleanup temp directory
|
|
142
|
+
|
|
143
|
+
---
|
|
144
|
+
|
|
145
|
+
## Best Practices
|
|
146
|
+
|
|
147
|
+
### DO ✅
|
|
148
|
+
- Luôn dùng `mkdir -p $(dirname "...")` trước mỗi file
|
|
149
|
+
- Sử dụng `<<'EOF'` để tránh variable expansion
|
|
150
|
+
- Ghi đè toàn bộ nội dung file
|
|
151
|
+
- Chỉ include files có thay đổi thực sự
|
|
152
|
+
|
|
153
|
+
### DON'T ❌
|
|
154
|
+
- Không tạo file mà không tạo thư mục cha
|
|
155
|
+
- Không dùng `<<EOF` (thiếu quotes) nếu có `$` trong content
|
|
156
|
+
- Không include files không thay đổi
|
|
157
|
+
- Không dùng relative paths phức tạp
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
body, html {
|
|
2
|
+
margin:0; padding: 0;
|
|
3
|
+
height: 100%;
|
|
4
|
+
}
|
|
5
|
+
body {
|
|
6
|
+
font-family: Helvetica Neue, Helvetica, Arial;
|
|
7
|
+
font-size: 14px;
|
|
8
|
+
color:#333;
|
|
9
|
+
}
|
|
10
|
+
.small { font-size: 12px; }
|
|
11
|
+
*, *:after, *:before {
|
|
12
|
+
-webkit-box-sizing:border-box;
|
|
13
|
+
-moz-box-sizing:border-box;
|
|
14
|
+
box-sizing:border-box;
|
|
15
|
+
}
|
|
16
|
+
h1 { font-size: 20px; margin: 0;}
|
|
17
|
+
h2 { font-size: 14px; }
|
|
18
|
+
pre {
|
|
19
|
+
font: 12px/1.4 Consolas, "Liberation Mono", Menlo, Courier, monospace;
|
|
20
|
+
margin: 0;
|
|
21
|
+
padding: 0;
|
|
22
|
+
-moz-tab-size: 2;
|
|
23
|
+
-o-tab-size: 2;
|
|
24
|
+
tab-size: 2;
|
|
25
|
+
}
|
|
26
|
+
a { color:#0074D9; text-decoration:none; }
|
|
27
|
+
a:hover { text-decoration:underline; }
|
|
28
|
+
.strong { font-weight: bold; }
|
|
29
|
+
.space-top1 { padding: 10px 0 0 0; }
|
|
30
|
+
.pad2y { padding: 20px 0; }
|
|
31
|
+
.pad1y { padding: 10px 0; }
|
|
32
|
+
.pad2x { padding: 0 20px; }
|
|
33
|
+
.pad2 { padding: 20px; }
|
|
34
|
+
.pad1 { padding: 10px; }
|
|
35
|
+
.space-left2 { padding-left:55px; }
|
|
36
|
+
.space-right2 { padding-right:20px; }
|
|
37
|
+
.center { text-align:center; }
|
|
38
|
+
.clearfix { display:block; }
|
|
39
|
+
.clearfix:after {
|
|
40
|
+
content:'';
|
|
41
|
+
display:block;
|
|
42
|
+
height:0;
|
|
43
|
+
clear:both;
|
|
44
|
+
visibility:hidden;
|
|
45
|
+
}
|
|
46
|
+
.fl { float: left; }
|
|
47
|
+
@media only screen and (max-width:640px) {
|
|
48
|
+
.col3 { width:100%; max-width:100%; }
|
|
49
|
+
.hide-mobile { display:none!important; }
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
.quiet {
|
|
53
|
+
color: #7f7f7f;
|
|
54
|
+
color: rgba(0,0,0,0.5);
|
|
55
|
+
}
|
|
56
|
+
.quiet a { opacity: 0.7; }
|
|
57
|
+
|
|
58
|
+
.fraction {
|
|
59
|
+
font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace;
|
|
60
|
+
font-size: 10px;
|
|
61
|
+
color: #555;
|
|
62
|
+
background: #E8E8E8;
|
|
63
|
+
padding: 4px 5px;
|
|
64
|
+
border-radius: 3px;
|
|
65
|
+
vertical-align: middle;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
div.path a:link, div.path a:visited { color: #333; }
|
|
69
|
+
table.coverage {
|
|
70
|
+
border-collapse: collapse;
|
|
71
|
+
margin: 10px 0 0 0;
|
|
72
|
+
padding: 0;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
table.coverage td {
|
|
76
|
+
margin: 0;
|
|
77
|
+
padding: 0;
|
|
78
|
+
vertical-align: top;
|
|
79
|
+
}
|
|
80
|
+
table.coverage td.line-count {
|
|
81
|
+
text-align: right;
|
|
82
|
+
padding: 0 5px 0 20px;
|
|
83
|
+
}
|
|
84
|
+
table.coverage td.line-coverage {
|
|
85
|
+
text-align: right;
|
|
86
|
+
padding-right: 10px;
|
|
87
|
+
min-width:20px;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
table.coverage td span.cline-any {
|
|
91
|
+
display: inline-block;
|
|
92
|
+
padding: 0 5px;
|
|
93
|
+
width: 100%;
|
|
94
|
+
}
|
|
95
|
+
.missing-if-branch {
|
|
96
|
+
display: inline-block;
|
|
97
|
+
margin-right: 5px;
|
|
98
|
+
border-radius: 3px;
|
|
99
|
+
position: relative;
|
|
100
|
+
padding: 0 4px;
|
|
101
|
+
background: #333;
|
|
102
|
+
color: yellow;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
.skip-if-branch {
|
|
106
|
+
display: none;
|
|
107
|
+
margin-right: 10px;
|
|
108
|
+
position: relative;
|
|
109
|
+
padding: 0 4px;
|
|
110
|
+
background: #ccc;
|
|
111
|
+
color: white;
|
|
112
|
+
}
|
|
113
|
+
.missing-if-branch .typ, .skip-if-branch .typ {
|
|
114
|
+
color: inherit !important;
|
|
115
|
+
}
|
|
116
|
+
.coverage-summary {
|
|
117
|
+
border-collapse: collapse;
|
|
118
|
+
width: 100%;
|
|
119
|
+
}
|
|
120
|
+
.coverage-summary tr { border-bottom: 1px solid #bbb; }
|
|
121
|
+
.keyline-all { border: 1px solid #ddd; }
|
|
122
|
+
.coverage-summary td, .coverage-summary th { padding: 10px; }
|
|
123
|
+
.coverage-summary tbody { border: 1px solid #bbb; }
|
|
124
|
+
.coverage-summary td { border-right: 1px solid #bbb; }
|
|
125
|
+
.coverage-summary td:last-child { border-right: none; }
|
|
126
|
+
.coverage-summary th {
|
|
127
|
+
text-align: left;
|
|
128
|
+
font-weight: normal;
|
|
129
|
+
white-space: nowrap;
|
|
130
|
+
}
|
|
131
|
+
.coverage-summary th.file { border-right: none !important; }
|
|
132
|
+
.coverage-summary th.pct { }
|
|
133
|
+
.coverage-summary th.pic,
|
|
134
|
+
.coverage-summary th.abs,
|
|
135
|
+
.coverage-summary td.pct,
|
|
136
|
+
.coverage-summary td.abs { text-align: right; }
|
|
137
|
+
.coverage-summary td.file { white-space: nowrap; }
|
|
138
|
+
.coverage-summary td.pic { min-width: 120px !important; }
|
|
139
|
+
.coverage-summary tfoot td { }
|
|
140
|
+
|
|
141
|
+
.coverage-summary .sorter {
|
|
142
|
+
height: 10px;
|
|
143
|
+
width: 7px;
|
|
144
|
+
display: inline-block;
|
|
145
|
+
margin-left: 0.5em;
|
|
146
|
+
background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent;
|
|
147
|
+
}
|
|
148
|
+
.coverage-summary .sorted .sorter {
|
|
149
|
+
background-position: 0 -20px;
|
|
150
|
+
}
|
|
151
|
+
.coverage-summary .sorted-desc .sorter {
|
|
152
|
+
background-position: 0 -10px;
|
|
153
|
+
}
|
|
154
|
+
.status-line { height: 10px; }
|
|
155
|
+
/* yellow */
|
|
156
|
+
.cbranch-no { background: yellow !important; color: #111; }
|
|
157
|
+
/* dark red */
|
|
158
|
+
.red.solid, .status-line.low, .low .cover-fill { background:#C21F39 }
|
|
159
|
+
.low .chart { border:1px solid #C21F39 }
|
|
160
|
+
.highlighted,
|
|
161
|
+
.highlighted .cstat-no, .highlighted .fstat-no, .highlighted .cbranch-no{
|
|
162
|
+
background: #C21F39 !important;
|
|
163
|
+
}
|
|
164
|
+
/* medium red */
|
|
165
|
+
.cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE }
|
|
166
|
+
/* light red */
|
|
167
|
+
.low, .cline-no { background:#FCE1E5 }
|
|
168
|
+
/* light green */
|
|
169
|
+
.high, .cline-yes { background:rgb(230,245,208) }
|
|
170
|
+
/* medium green */
|
|
171
|
+
.cstat-yes { background:rgb(161,215,106) }
|
|
172
|
+
/* dark green */
|
|
173
|
+
.status-line.high, .high .cover-fill { background:rgb(77,146,33) }
|
|
174
|
+
.high .chart { border:1px solid rgb(77,146,33) }
|
|
175
|
+
/* dark yellow (gold) */
|
|
176
|
+
.status-line.medium, .medium .cover-fill { background: #f9cd0b; }
|
|
177
|
+
.medium .chart { border:1px solid #f9cd0b; }
|
|
178
|
+
/* light yellow */
|
|
179
|
+
.medium { background: #fff4c2; }
|
|
180
|
+
|
|
181
|
+
.cstat-skip { background: #ddd; color: #111; }
|
|
182
|
+
.fstat-skip { background: #ddd; color: #111 !important; }
|
|
183
|
+
.cbranch-skip { background: #ddd !important; color: #111; }
|
|
184
|
+
|
|
185
|
+
span.cline-neutral { background: #eaeaea; }
|
|
186
|
+
|
|
187
|
+
.coverage-summary td.empty {
|
|
188
|
+
opacity: .5;
|
|
189
|
+
padding-top: 4px;
|
|
190
|
+
padding-bottom: 4px;
|
|
191
|
+
line-height: 1;
|
|
192
|
+
color: #888;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
.cover-fill, .cover-empty {
|
|
196
|
+
display:inline-block;
|
|
197
|
+
height: 12px;
|
|
198
|
+
}
|
|
199
|
+
.chart {
|
|
200
|
+
line-height: 0;
|
|
201
|
+
}
|
|
202
|
+
.cover-empty {
|
|
203
|
+
background: white;
|
|
204
|
+
}
|
|
205
|
+
.cover-full {
|
|
206
|
+
border-right: none !important;
|
|
207
|
+
}
|
|
208
|
+
pre.prettyprint {
|
|
209
|
+
border: none !important;
|
|
210
|
+
padding: 0 !important;
|
|
211
|
+
margin: 0 !important;
|
|
212
|
+
}
|
|
213
|
+
.com { color: #999 !important; }
|
|
214
|
+
.ignore-none { color: #999; font-weight: normal; }
|
|
215
|
+
|
|
216
|
+
.wrapper {
|
|
217
|
+
min-height: 100%;
|
|
218
|
+
height: auto !important;
|
|
219
|
+
height: 100%;
|
|
220
|
+
margin: 0 auto -48px;
|
|
221
|
+
}
|
|
222
|
+
.footer, .push {
|
|
223
|
+
height: 48px;
|
|
224
|
+
}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/* eslint-disable */
|
|
2
|
+
var jumpToCode = (function init() {
|
|
3
|
+
// Classes of code we would like to highlight in the file view
|
|
4
|
+
var missingCoverageClasses = ['.cbranch-no', '.cstat-no', '.fstat-no'];
|
|
5
|
+
|
|
6
|
+
// Elements to highlight in the file listing view
|
|
7
|
+
var fileListingElements = ['td.pct.low'];
|
|
8
|
+
|
|
9
|
+
// We don't want to select elements that are direct descendants of another match
|
|
10
|
+
var notSelector = ':not(' + missingCoverageClasses.join('):not(') + ') > '; // becomes `:not(a):not(b) > `
|
|
11
|
+
|
|
12
|
+
// Selector that finds elements on the page to which we can jump
|
|
13
|
+
var selector =
|
|
14
|
+
fileListingElements.join(', ') +
|
|
15
|
+
', ' +
|
|
16
|
+
notSelector +
|
|
17
|
+
missingCoverageClasses.join(', ' + notSelector); // becomes `:not(a):not(b) > a, :not(a):not(b) > b`
|
|
18
|
+
|
|
19
|
+
// The NodeList of matching elements
|
|
20
|
+
var missingCoverageElements = document.querySelectorAll(selector);
|
|
21
|
+
|
|
22
|
+
var currentIndex;
|
|
23
|
+
|
|
24
|
+
function toggleClass(index) {
|
|
25
|
+
missingCoverageElements
|
|
26
|
+
.item(currentIndex)
|
|
27
|
+
.classList.remove('highlighted');
|
|
28
|
+
missingCoverageElements.item(index).classList.add('highlighted');
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function makeCurrent(index) {
|
|
32
|
+
toggleClass(index);
|
|
33
|
+
currentIndex = index;
|
|
34
|
+
missingCoverageElements.item(index).scrollIntoView({
|
|
35
|
+
behavior: 'smooth',
|
|
36
|
+
block: 'center',
|
|
37
|
+
inline: 'center'
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function goToPrevious() {
|
|
42
|
+
var nextIndex = 0;
|
|
43
|
+
if (typeof currentIndex !== 'number' || currentIndex === 0) {
|
|
44
|
+
nextIndex = missingCoverageElements.length - 1;
|
|
45
|
+
} else if (missingCoverageElements.length > 1) {
|
|
46
|
+
nextIndex = currentIndex - 1;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
makeCurrent(nextIndex);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function goToNext() {
|
|
53
|
+
var nextIndex = 0;
|
|
54
|
+
|
|
55
|
+
if (
|
|
56
|
+
typeof currentIndex === 'number' &&
|
|
57
|
+
currentIndex < missingCoverageElements.length - 1
|
|
58
|
+
) {
|
|
59
|
+
nextIndex = currentIndex + 1;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
makeCurrent(nextIndex);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
return function jump(event) {
|
|
66
|
+
if (
|
|
67
|
+
document.getElementById('fileSearch') === document.activeElement &&
|
|
68
|
+
document.activeElement != null
|
|
69
|
+
) {
|
|
70
|
+
// if we're currently focused on the search input, we don't want to navigate
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
switch (event.which) {
|
|
75
|
+
case 78: // n
|
|
76
|
+
case 74: // j
|
|
77
|
+
goToNext();
|
|
78
|
+
break;
|
|
79
|
+
case 66: // b
|
|
80
|
+
case 75: // k
|
|
81
|
+
case 80: // p
|
|
82
|
+
goToPrevious();
|
|
83
|
+
break;
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
})();
|
|
87
|
+
window.addEventListener('keydown', jumpToCode);
|
|
Binary file
|