viberadar 0.2.2 → 0.3.1
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/dist/scanner/index.d.ts +23 -0
- package/dist/scanner/index.d.ts.map +1 -1
- package/dist/scanner/index.js +110 -8
- package/dist/scanner/index.js.map +1 -1
- package/dist/ui/dashboard.html +571 -402
- package/package.json +1 -1
package/dist/scanner/index.d.ts
CHANGED
|
@@ -9,6 +9,7 @@ export interface ModuleInfo {
|
|
|
9
9
|
coverage?: CoverageInfo;
|
|
10
10
|
size: number;
|
|
11
11
|
dependencies: string[];
|
|
12
|
+
featureKeys: string[];
|
|
12
13
|
}
|
|
13
14
|
export interface CoverageInfo {
|
|
14
15
|
lines: number;
|
|
@@ -16,12 +17,34 @@ export interface CoverageInfo {
|
|
|
16
17
|
functions: number;
|
|
17
18
|
branches: number;
|
|
18
19
|
}
|
|
20
|
+
export interface FeatureConfig {
|
|
21
|
+
label: string;
|
|
22
|
+
description?: string;
|
|
23
|
+
include: string[];
|
|
24
|
+
color: string;
|
|
25
|
+
}
|
|
26
|
+
export interface VibeRadarConfig {
|
|
27
|
+
version: string;
|
|
28
|
+
features: Record<string, FeatureConfig>;
|
|
29
|
+
}
|
|
30
|
+
export interface FeatureResult {
|
|
31
|
+
key: string;
|
|
32
|
+
label: string;
|
|
33
|
+
description: string;
|
|
34
|
+
color: string;
|
|
35
|
+
fileCount: number;
|
|
36
|
+
testFileCount: number;
|
|
37
|
+
testedCount: number;
|
|
38
|
+
coveragePct?: number;
|
|
39
|
+
}
|
|
19
40
|
export interface ScanResult {
|
|
20
41
|
projectRoot: string;
|
|
21
42
|
projectName: string;
|
|
22
43
|
scannedAt: string;
|
|
23
44
|
modules: ModuleInfo[];
|
|
24
45
|
totalCoverage?: CoverageInfo;
|
|
46
|
+
features: FeatureResult[] | null;
|
|
47
|
+
hasConfig: boolean;
|
|
25
48
|
}
|
|
26
49
|
export declare function scanProject(projectRoot: string): Promise<ScanResult>;
|
|
27
50
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/scanner/index.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,WAAW,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;IACrE,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/scanner/index.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,WAAW,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;IACrE,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAID,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;CACzC;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,aAAa,CAAC,EAAE,YAAY,CAAC;IAC7B,QAAQ,EAAE,aAAa,EAAE,GAAG,IAAI,CAAC;IACjC,SAAS,EAAE,OAAO,CAAC;CACpB;AA0FD,wBAAsB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAyJ1E"}
|
package/dist/scanner/index.js
CHANGED
|
@@ -37,12 +37,38 @@ exports.scanProject = scanProject;
|
|
|
37
37
|
const fs = __importStar(require("fs"));
|
|
38
38
|
const path = __importStar(require("path"));
|
|
39
39
|
const glob_1 = require("glob");
|
|
40
|
+
// ─── Constants ───────────────────────────────────────────────────────────────
|
|
40
41
|
const IGNORE_DIRS = [
|
|
41
42
|
'node_modules', 'dist', 'build', '.git', '.next',
|
|
42
43
|
'coverage', '.nyc_output', '__pycache__', '.venv',
|
|
43
44
|
];
|
|
44
45
|
const SOURCE_EXTENSIONS = ['.ts', '.tsx', '.js', '.jsx', '.vue', '.svelte'];
|
|
45
46
|
const TEST_PATTERNS = ['.test.', '.spec.', '__tests__'];
|
|
47
|
+
// ─── Glob pattern matcher ─────────────────────────────────────────────────────
|
|
48
|
+
/**
|
|
49
|
+
* Converts a glob pattern (relative to project root) to a RegExp and tests relPath.
|
|
50
|
+
* Supports: **, *, exact paths.
|
|
51
|
+
*/
|
|
52
|
+
function fileMatchesGlob(relPath, pattern) {
|
|
53
|
+
const normalPath = relPath.replace(/\\/g, '/');
|
|
54
|
+
let regexStr = pattern
|
|
55
|
+
.replace(/\\/g, '/')
|
|
56
|
+
.replace(/[.+^${}()|[\]]/g, '\\$&') // escape regex special chars (not *)
|
|
57
|
+
.replace(/\*\*/g, '\x00') // placeholder for **
|
|
58
|
+
.replace(/\*/g, '[^/]*') // * = anything except /
|
|
59
|
+
.replace(/\x00\//g, '(.+/)?') // **/ = zero or more directory segments
|
|
60
|
+
.replace(/\x00/g, '.*'); // ** alone = anything
|
|
61
|
+
try {
|
|
62
|
+
return new RegExp('^' + regexStr + '$').test(normalPath);
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
function fileMatchesFeature(relPath, include) {
|
|
69
|
+
return include.some(p => fileMatchesGlob(relPath, p));
|
|
70
|
+
}
|
|
71
|
+
// ─── Module detection helpers ─────────────────────────────────────────────────
|
|
46
72
|
function detectType(filePath) {
|
|
47
73
|
const p = filePath.toLowerCase();
|
|
48
74
|
if (TEST_PATTERNS.some((t) => p.includes(t)))
|
|
@@ -74,11 +100,8 @@ function extractDependencies(filePath) {
|
|
|
74
100
|
return [];
|
|
75
101
|
}
|
|
76
102
|
}
|
|
77
|
-
function
|
|
103
|
+
function loadCoverageMap(projectRoot) {
|
|
78
104
|
const coverageMap = new Map();
|
|
79
|
-
// Try Playwright JSON report
|
|
80
|
-
const playwrightReport = path.join(projectRoot, 'playwright-report', 'results.json');
|
|
81
|
-
// Try V8/Istanbul coverage
|
|
82
105
|
const v8Coverage = path.join(projectRoot, 'coverage', 'coverage-summary.json');
|
|
83
106
|
if (fs.existsSync(v8Coverage)) {
|
|
84
107
|
try {
|
|
@@ -100,6 +123,7 @@ function loadPlaywrightCoverage(projectRoot) {
|
|
|
100
123
|
}
|
|
101
124
|
return coverageMap;
|
|
102
125
|
}
|
|
126
|
+
// ─── Main scan function ───────────────────────────────────────────────────────
|
|
103
127
|
async function scanProject(projectRoot) {
|
|
104
128
|
const pkgPath = path.join(projectRoot, 'package.json');
|
|
105
129
|
let projectName = path.basename(projectRoot);
|
|
@@ -117,13 +141,12 @@ async function scanProject(projectRoot) {
|
|
|
117
141
|
ignore: ignorePattern,
|
|
118
142
|
absolute: true,
|
|
119
143
|
});
|
|
120
|
-
const coverageMap =
|
|
121
|
-
const
|
|
144
|
+
const coverageMap = loadCoverageMap(projectRoot);
|
|
145
|
+
const testFileSet = new Set(files.filter((f) => TEST_PATTERNS.some((t) => f.includes(t))));
|
|
122
146
|
const modules = files.map((filePath) => {
|
|
123
147
|
const relativePath = path.relative(projectRoot, filePath);
|
|
124
148
|
const name = path.basename(filePath, path.extname(filePath));
|
|
125
149
|
const isTest = TEST_PATTERNS.some((t) => filePath.includes(t));
|
|
126
|
-
// Try to find test file for non-test modules
|
|
127
150
|
let testFile;
|
|
128
151
|
if (!isTest) {
|
|
129
152
|
const base = filePath.replace(/\.[^.]+$/, '');
|
|
@@ -132,8 +155,9 @@ async function scanProject(projectRoot) {
|
|
|
132
155
|
`${base}.test${ext}`,
|
|
133
156
|
`${base}.spec${ext}`,
|
|
134
157
|
filePath.replace('/src/', '/tests/').replace(ext, `.test${ext}`),
|
|
158
|
+
filePath.replace('\\src\\', '\\tests\\').replace(ext, `.test${ext}`),
|
|
135
159
|
];
|
|
136
|
-
testFile = candidates.find((c) =>
|
|
160
|
+
testFile = candidates.find((c) => testFileSet.has(c));
|
|
137
161
|
}
|
|
138
162
|
let size = 0;
|
|
139
163
|
try {
|
|
@@ -151,13 +175,91 @@ async function scanProject(projectRoot) {
|
|
|
151
175
|
coverage: coverageMap.get(filePath),
|
|
152
176
|
size,
|
|
153
177
|
dependencies: extractDependencies(filePath),
|
|
178
|
+
featureKeys: [], // filled below
|
|
154
179
|
};
|
|
155
180
|
});
|
|
181
|
+
// ─── Fuzzy test pairing for centralized test directories ─────────────────────
|
|
182
|
+
// Handles patterns like: server/routes/auth.routes.ts → tests/auth.test.ts
|
|
183
|
+
// Also: WorkspaceSettings.tsx → workspace-settings.test.ts
|
|
184
|
+
//
|
|
185
|
+
// Strategy: strip extensions + .test/.spec + dashes/underscores + lowercase
|
|
186
|
+
// and match source file's first name segment against test file's clean name.
|
|
187
|
+
function cleanName(s) {
|
|
188
|
+
return s.toLowerCase().replace(/[_\-]/g, '');
|
|
189
|
+
}
|
|
190
|
+
// Build map: cleanName → test file absolute path (first match wins)
|
|
191
|
+
const testByCleanName = new Map();
|
|
192
|
+
for (const tf of testFileSet) {
|
|
193
|
+
let base = path.basename(tf, path.extname(tf)); // e.g. "auth.test" or "chat.spec"
|
|
194
|
+
base = base.replace(/\.(test|spec)$/, ''); // → "auth"
|
|
195
|
+
const clean = cleanName(base.split('.')[0]); // first dot-segment, cleaned
|
|
196
|
+
if (!testByCleanName.has(clean)) {
|
|
197
|
+
testByCleanName.set(clean, tf);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
// Second pass: for source modules still missing a test, try fuzzy match
|
|
201
|
+
for (const m of modules) {
|
|
202
|
+
if (m.hasTests || m.type === 'test')
|
|
203
|
+
continue;
|
|
204
|
+
// Try each dot-segment of the module name from left to right
|
|
205
|
+
const segments = m.name.split('.');
|
|
206
|
+
for (const seg of segments) {
|
|
207
|
+
const clean = cleanName(seg);
|
|
208
|
+
if (clean.length < 3)
|
|
209
|
+
continue; // skip too-short segments (avoid false positives)
|
|
210
|
+
const matched = testByCleanName.get(clean);
|
|
211
|
+
if (matched) {
|
|
212
|
+
m.hasTests = true;
|
|
213
|
+
m.testFile = path.relative(projectRoot, matched);
|
|
214
|
+
break;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
// ─── Load viberadar.config.json ──────────────────────────────────────────────
|
|
219
|
+
let config = null;
|
|
220
|
+
const configPath = path.join(projectRoot, 'viberadar.config.json');
|
|
221
|
+
try {
|
|
222
|
+
config = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
|
|
223
|
+
}
|
|
224
|
+
catch { }
|
|
225
|
+
let features = null;
|
|
226
|
+
if (config) {
|
|
227
|
+
const featureEntries = Object.entries(config.features);
|
|
228
|
+
// Assign feature keys to each module
|
|
229
|
+
for (const m of modules) {
|
|
230
|
+
m.featureKeys = featureEntries
|
|
231
|
+
.filter(([, f]) => fileMatchesFeature(m.relativePath, f.include))
|
|
232
|
+
.map(([key]) => key);
|
|
233
|
+
}
|
|
234
|
+
const sourceModules = modules.filter(m => m.type !== 'test');
|
|
235
|
+
const testModules = modules.filter(m => m.type === 'test');
|
|
236
|
+
features = featureEntries.map(([key, feat]) => {
|
|
237
|
+
const srcFiles = sourceModules.filter(m => fileMatchesFeature(m.relativePath, feat.include));
|
|
238
|
+
const tstFiles = testModules.filter(m => fileMatchesFeature(m.relativePath, feat.include));
|
|
239
|
+
const testedCount = srcFiles.filter(m => m.hasTests).length;
|
|
240
|
+
const covFiles = srcFiles.filter(m => m.coverage?.lines !== undefined);
|
|
241
|
+
const coveragePct = covFiles.length > 0
|
|
242
|
+
? covFiles.reduce((s, m) => s + m.coverage.lines, 0) / covFiles.length
|
|
243
|
+
: undefined;
|
|
244
|
+
return {
|
|
245
|
+
key,
|
|
246
|
+
label: feat.label,
|
|
247
|
+
description: feat.description || '',
|
|
248
|
+
color: feat.color,
|
|
249
|
+
fileCount: srcFiles.length,
|
|
250
|
+
testFileCount: tstFiles.length,
|
|
251
|
+
testedCount,
|
|
252
|
+
coveragePct,
|
|
253
|
+
};
|
|
254
|
+
});
|
|
255
|
+
}
|
|
156
256
|
return {
|
|
157
257
|
projectRoot,
|
|
158
258
|
projectName,
|
|
159
259
|
scannedAt: new Date().toISOString(),
|
|
160
260
|
modules,
|
|
261
|
+
features,
|
|
262
|
+
hasConfig: config !== null,
|
|
161
263
|
};
|
|
162
264
|
}
|
|
163
265
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/scanner/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/scanner/index.ts"],"names":[],"mappings":"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"}
|