vg-coder-cli 2.0.28 → 2.0.30
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/package.json +3 -2
- package/scripts/postinstall.js +30 -0
- package/src/server/terminal-manager.js +30 -2
- package/.vg/tree-state.json +0 -3
- package/DEVELOPMENT.md +0 -95
- package/SYSTEM_PROMPT.md +0 -157
- package/coverage/base.css +0 -224
- package/coverage/block-navigation.js +0 -87
- package/coverage/favicon.png +0 -0
- package/coverage/index.html +0 -206
- package/coverage/lcov-report/base.css +0 -224
- package/coverage/lcov-report/block-navigation.js +0 -87
- package/coverage/lcov-report/favicon.png +0 -0
- package/coverage/lcov-report/index.html +0 -206
- package/coverage/lcov-report/prettify.css +0 -1
- package/coverage/lcov-report/prettify.js +0 -2
- package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/coverage/lcov-report/sorter.js +0 -210
- package/coverage/lcov-report/src/detectors/index.html +0 -116
- package/coverage/lcov-report/src/detectors/project-detector.js.html +0 -1084
- package/coverage/lcov-report/src/exporter/html-exporter.js.html +0 -2839
- package/coverage/lcov-report/src/exporter/index.html +0 -116
- package/coverage/lcov-report/src/ignore/ignore-manager.js.html +0 -979
- package/coverage/lcov-report/src/ignore/index.html +0 -116
- package/coverage/lcov-report/src/index.html +0 -116
- package/coverage/lcov-report/src/index.js.html +0 -928
- package/coverage/lcov-report/src/scanner/file-scanner.js.html +0 -1903
- package/coverage/lcov-report/src/scanner/index.html +0 -116
- package/coverage/lcov-report/src/tokenizer/index.html +0 -116
- package/coverage/lcov-report/src/tokenizer/token-manager.js.html +0 -1252
- package/coverage/lcov-report/src/utils/helpers.js.html +0 -469
- package/coverage/lcov-report/src/utils/index.html +0 -116
- package/coverage/lcov.info +0 -1396
- package/coverage/prettify.css +0 -1
- package/coverage/prettify.js +0 -2
- package/coverage/sort-arrow-sprite.png +0 -0
- package/coverage/sorter.js +0 -210
- package/coverage/src/detectors/index.html +0 -116
- package/coverage/src/detectors/project-detector.js.html +0 -1084
- package/coverage/src/exporter/html-exporter.js.html +0 -2839
- package/coverage/src/exporter/index.html +0 -116
- package/coverage/src/ignore/ignore-manager.js.html +0 -979
- package/coverage/src/ignore/index.html +0 -116
- package/coverage/src/index.html +0 -116
- package/coverage/src/index.js.html +0 -928
- package/coverage/src/scanner/file-scanner.js.html +0 -1903
- package/coverage/src/scanner/index.html +0 -116
- package/coverage/src/tokenizer/index.html +0 -116
- package/coverage/src/tokenizer/token-manager.js.html +0 -1252
- package/coverage/src/utils/helpers.js.html +0 -469
- package/coverage/src/utils/index.html +0 -116
- package/jest.config.js +0 -16
- package/vg-coder-cli-2.0.26.tgz +0 -0
- package/vg-coder-cli-2.0.27.tgz +0 -0
- package/vg-coder-cli-2.0.28.tgz +0 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "vg-coder-cli",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.30",
|
|
4
4
|
"description": "🚀 CLI tool to analyze projects, concatenate source files, count tokens, and export HTML with syntax highlighting and copy functionality",
|
|
5
5
|
"main": "src/index.js",
|
|
6
6
|
"bin": {
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
"vg-coder": "./bin/vg-coder.js"
|
|
9
9
|
},
|
|
10
10
|
"scripts": {
|
|
11
|
+
"postinstall": "node scripts/postinstall.js",
|
|
11
12
|
"install:local": "npm install -g .",
|
|
12
13
|
"start": "node src/index.js",
|
|
13
14
|
"test": "jest",
|
|
@@ -42,7 +43,7 @@
|
|
|
42
43
|
"fs-extra": "^11.2.0",
|
|
43
44
|
"highlight.js": "^11.9.0",
|
|
44
45
|
"ignore": "^5.3.0",
|
|
45
|
-
"node-pty": "^1.
|
|
46
|
+
"node-pty": "^1.1.0",
|
|
46
47
|
"ora": "^5.4.1",
|
|
47
48
|
"path": "^0.12.7",
|
|
48
49
|
"socket.io": "^4.7.2",
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
const { execSync } = require('child_process');
|
|
4
|
+
const path = require('path');
|
|
5
|
+
const fs = require('fs');
|
|
6
|
+
|
|
7
|
+
// Path to node-pty module
|
|
8
|
+
const nodePtyPath = path.join(__dirname, '..', 'node_modules', 'node-pty');
|
|
9
|
+
|
|
10
|
+
// Check if node-pty exists
|
|
11
|
+
if (!fs.existsSync(nodePtyPath)) {
|
|
12
|
+
console.log('⚠️ node-pty not found, skipping rebuild');
|
|
13
|
+
process.exit(0);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
console.log('🔨 Building node-pty native binaries...');
|
|
17
|
+
|
|
18
|
+
try {
|
|
19
|
+
// Run npm install in node-pty directory (which triggers its install scripts)
|
|
20
|
+
execSync('npm run install', {
|
|
21
|
+
cwd: nodePtyPath,
|
|
22
|
+
stdio: 'inherit'
|
|
23
|
+
});
|
|
24
|
+
console.log('✅ node-pty built successfully!');
|
|
25
|
+
} catch (error) {
|
|
26
|
+
console.warn('⚠️ node-pty rebuild failed. Terminal functionality may not work.');
|
|
27
|
+
console.warn(' Run manually: cd node_modules/node-pty && npm run install');
|
|
28
|
+
// Don't fail the installation
|
|
29
|
+
process.exit(0);
|
|
30
|
+
}
|
|
@@ -24,12 +24,40 @@ class TerminalManager {
|
|
|
24
24
|
|
|
25
25
|
createTerminal(socket, termId, cols = 80, rows = 24, cwd, projectId = null) {
|
|
26
26
|
try {
|
|
27
|
+
const fs = require('fs');
|
|
28
|
+
const targetCwd = cwd || process.cwd();
|
|
29
|
+
|
|
30
|
+
console.log('[Terminal] Creating terminal with shell:', this.shell);
|
|
31
|
+
console.log('[Terminal] CWD:', targetCwd);
|
|
32
|
+
console.log('[Terminal] SHELL env var:', process.env.SHELL);
|
|
33
|
+
console.log('[Terminal] Platform:', os.platform());
|
|
34
|
+
|
|
35
|
+
// Verify shell exists and is executable
|
|
36
|
+
if (!fs.existsSync(this.shell)) {
|
|
37
|
+
throw new Error(`Shell not found at path: ${this.shell}`);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// Verify CWD exists
|
|
41
|
+
if (!fs.existsSync(targetCwd)) {
|
|
42
|
+
throw new Error(`Working directory not found: ${targetCwd}`);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// Ensure PATH includes common binary directories
|
|
46
|
+
const env = {
|
|
47
|
+
...process.env,
|
|
48
|
+
PATH: process.env.PATH || '/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin',
|
|
49
|
+
TERM: 'xterm-256color'
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
console.log('[Terminal] Environment PATH:', env.PATH);
|
|
53
|
+
console.log('[Terminal] Spawning with args:', { shell: this.shell, cwd: targetCwd });
|
|
54
|
+
|
|
27
55
|
const term = pty.spawn(this.shell, [], {
|
|
28
56
|
name: 'xterm-256color',
|
|
29
57
|
cols: cols,
|
|
30
58
|
rows: rows,
|
|
31
|
-
cwd:
|
|
32
|
-
env:
|
|
59
|
+
cwd: targetCwd,
|
|
60
|
+
env: env
|
|
33
61
|
});
|
|
34
62
|
|
|
35
63
|
this.sessions.set(termId, {
|
package/.vg/tree-state.json
DELETED
package/DEVELOPMENT.md
DELETED
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
# VG Coder - Development & Architecture Guide
|
|
2
|
-
|
|
3
|
-
Tài liệu này quy định kiến trúc Frontend (Dashboard) để đảm bảo tính dễ bảo trì, mở rộng và code sạch (Clean Code).
|
|
4
|
-
|
|
5
|
-
## 1. Directory Structure (Cấu trúc thư mục)
|
|
6
|
-
|
|
7
|
-
Frontend nằm trong `src/server/views/`.
|
|
8
|
-
|
|
9
|
-
```text
|
|
10
|
-
src/server/views/
|
|
11
|
-
├── dashboard.html # File HTML chính (Layout & Markup)
|
|
12
|
-
├── dashboard.css # CSS Global (Variables, Reset, Layout khung sườn)
|
|
13
|
-
├── css/ # 📁 MODULE CSS (Chứa style riêng biệt cho từng feature)
|
|
14
|
-
│ ├── structure.css # Style cho cây thư mục
|
|
15
|
-
│ ├── iframe.css # Style cho Iframe/AI Panel
|
|
16
|
-
│ └── [feature].css # -> Style cho tính năng mới đặt tại đây
|
|
17
|
-
├── js/ # 📁 JAVASCRIPT
|
|
18
|
-
│ ├── main.js # Entry Point (Khởi tạo, Import các feature)
|
|
19
|
-
│ ├── config.js # Constants & Config
|
|
20
|
-
│ ├── api.js # API Layer (Fetch requests)
|
|
21
|
-
│ ├── utils.js # Helper functions
|
|
22
|
-
│ ├── handlers.js # Global event handlers (để bind vào window)
|
|
23
|
-
│ └── features/ # 📁 MODULE JS (Logic riêng biệt cho từng feature)
|
|
24
|
-
│ ├── structure.js # Logic cây thư mục
|
|
25
|
-
│ ├── iframe-manager.js # Logic Iframe AI
|
|
26
|
-
│ └── [feature].js # -> Logic tính năng mới đặt tại đây
|
|
27
|
-
```
|
|
28
|
-
|
|
29
|
-
---
|
|
30
|
-
|
|
31
|
-
## 2. Quy trình thêm tính năng mới (Workflow)
|
|
32
|
-
|
|
33
|
-
Khi thêm một tính năng mới (ví dụ: `Settings`), tuân thủ 4 bước sau:
|
|
34
|
-
|
|
35
|
-
### Bước 1: Tạo CSS Module
|
|
36
|
-
Tạo file `src/server/views/css/settings.css`.
|
|
37
|
-
* **Quy tắc:** Chỉ viết style liên quan đến settings.
|
|
38
|
-
* **Import:** Thêm thẻ `<link>` vào `dashboard.html`.
|
|
39
|
-
|
|
40
|
-
### Bước 2: Tạo JS Module
|
|
41
|
-
Tạo file `src/server/views/js/features/settings.js`.
|
|
42
|
-
* **Quy tắc:** Export hàm khởi tạo (`initSettings`) hoặc các hàm xử lý logic.
|
|
43
|
-
* **Không** viết code chạy ngay lập tức (IIFE) trừ khi cần thiết.
|
|
44
|
-
|
|
45
|
-
```javascript
|
|
46
|
-
// Example: src/server/views/js/features/settings.js
|
|
47
|
-
export function initSettings() {
|
|
48
|
-
console.log('Settings initialized');
|
|
49
|
-
// Logic here
|
|
50
|
-
}
|
|
51
|
-
```
|
|
52
|
-
|
|
53
|
-
### Bước 3: Cập nhật HTML
|
|
54
|
-
Thêm Markup vào `src/server/views/dashboard.html`.
|
|
55
|
-
* Thêm ID cụ thể để JS dễ query (ví dụ: `id="settings-panel"`).
|
|
56
|
-
* Thêm link CSS mới vào `<head>`.
|
|
57
|
-
|
|
58
|
-
### Bước 4: Đăng ký (Register) trong `main.js`
|
|
59
|
-
Import và gọi hàm khởi tạo trong `src/server/views/js/main.js`.
|
|
60
|
-
|
|
61
|
-
```javascript
|
|
62
|
-
// src/server/views/js/main.js
|
|
63
|
-
import { initSettings } from './features/settings.js';
|
|
64
|
-
|
|
65
|
-
document.addEventListener('DOMContentLoaded', async () => {
|
|
66
|
-
// ... các init khác
|
|
67
|
-
initSettings();
|
|
68
|
-
});
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
---
|
|
72
|
-
|
|
73
|
-
## 3. Coding Standards (Quy chuẩn Code)
|
|
74
|
-
|
|
75
|
-
### CSS
|
|
76
|
-
* Sử dụng **CSS Variables** (`var(--ios-bg)`) định nghĩa trong `dashboard.css` để đồng bộ Dark/Light mode.
|
|
77
|
-
* Tránh sửa trực tiếp `dashboard.css` trừ khi thay đổi Layout toàn cục.
|
|
78
|
-
|
|
79
|
-
### JavaScript
|
|
80
|
-
* **ES Modules:** Sử dụng `import/export`.
|
|
81
|
-
* **Global Scope:** Hạn chế gán biến vào `window`. Nếu cần dùng cho `onclick=""` trong HTML, hãy gán thông qua file `handlers.js` hoặc gán explicit trong `main.js`.
|
|
82
|
-
* **API Calls:** Mọi lệnh `fetch` gọi về server nên được viết trong `js/api.js`, sau đó feature import về dùng.
|
|
83
|
-
|
|
84
|
-
---
|
|
85
|
-
|
|
86
|
-
## 4. Prompt mẫu cho AI
|
|
87
|
-
|
|
88
|
-
Khi yêu cầu AI code tính năng mới, hãy dùng prompt sau để đảm bảo AI tuân thủ kiến trúc:
|
|
89
|
-
|
|
90
|
-
> "Hãy thêm tính năng [TÊN_TÍNH_NĂNG].
|
|
91
|
-
> Tuân thủ kiến trúc trong `DEVELOPMENT.md`:
|
|
92
|
-
> 1. Tạo file CSS riêng trong `views/css/`.
|
|
93
|
-
> 2. Tạo file JS logic riêng trong `views/js/features/`.
|
|
94
|
-
> 3. Cập nhật `dashboard.html` và `main.js`.
|
|
95
|
-
> 4. Sử dụng style từ biến CSS có sẵn."
|
package/SYSTEM_PROMPT.md
DELETED
|
@@ -1,157 +0,0 @@
|
|
|
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
|
package/coverage/base.css
DELETED
|
@@ -1,224 +0,0 @@
|
|
|
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
|
-
}
|
|
@@ -1,87 +0,0 @@
|
|
|
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);
|
package/coverage/favicon.png
DELETED
|
Binary file
|