@vyuhlabs/dxkit 2.4.4 → 2.4.6

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.
Files changed (61) hide show
  1. package/CHANGELOG.md +339 -0
  2. package/README.md +33 -19
  3. package/dist/analyzers/tests/index.d.ts.map +1 -1
  4. package/dist/analyzers/tests/index.js +2 -0
  5. package/dist/analyzers/tests/index.js.map +1 -1
  6. package/dist/analyzers/tools/coverage.d.ts +1 -1
  7. package/dist/analyzers/tools/coverage.d.ts.map +1 -1
  8. package/dist/analyzers/tools/coverage.js.map +1 -1
  9. package/dist/analyzers/tools/jacoco.d.ts +76 -0
  10. package/dist/analyzers/tools/jacoco.d.ts.map +1 -0
  11. package/dist/analyzers/tools/jacoco.js +228 -0
  12. package/dist/analyzers/tools/jacoco.js.map +1 -0
  13. package/dist/analyzers/tools/osv-scanner-deps.d.ts +47 -0
  14. package/dist/analyzers/tools/osv-scanner-deps.d.ts.map +1 -0
  15. package/dist/analyzers/tools/osv-scanner-deps.js +175 -0
  16. package/dist/analyzers/tools/osv-scanner-deps.js.map +1 -0
  17. package/dist/analyzers/tools/osv-scanner-fix.d.ts +20 -0
  18. package/dist/analyzers/tools/osv-scanner-fix.d.ts.map +1 -1
  19. package/dist/analyzers/tools/osv-scanner-fix.js +45 -20
  20. package/dist/analyzers/tools/osv-scanner-fix.js.map +1 -1
  21. package/dist/analyzers/tools/runner.d.ts +47 -0
  22. package/dist/analyzers/tools/runner.d.ts.map +1 -1
  23. package/dist/analyzers/tools/runner.js +79 -0
  24. package/dist/analyzers/tools/runner.js.map +1 -1
  25. package/dist/analyzers/tools/tool-registry.d.ts +10 -0
  26. package/dist/analyzers/tools/tool-registry.d.ts.map +1 -1
  27. package/dist/analyzers/tools/tool-registry.js +131 -0
  28. package/dist/analyzers/tools/tool-registry.js.map +1 -1
  29. package/dist/cli.d.ts.map +1 -1
  30. package/dist/cli.js +36 -2
  31. package/dist/cli.js.map +1 -1
  32. package/dist/constants.d.ts +2 -0
  33. package/dist/constants.d.ts.map +1 -1
  34. package/dist/languages/index.d.ts.map +1 -1
  35. package/dist/languages/index.js +12 -1
  36. package/dist/languages/index.js.map +1 -1
  37. package/dist/languages/java.d.ts +67 -0
  38. package/dist/languages/java.d.ts.map +1 -0
  39. package/dist/languages/java.js +421 -0
  40. package/dist/languages/java.js.map +1 -0
  41. package/dist/languages/kotlin.d.ts +1 -52
  42. package/dist/languages/kotlin.d.ts.map +1 -1
  43. package/dist/languages/kotlin.js +16 -286
  44. package/dist/languages/kotlin.js.map +1 -1
  45. package/dist/languages/ruby.d.ts +77 -0
  46. package/dist/languages/ruby.d.ts.map +1 -0
  47. package/dist/languages/ruby.js +531 -0
  48. package/dist/languages/ruby.js.map +1 -0
  49. package/dist/languages/types.d.ts +9 -1
  50. package/dist/languages/types.d.ts.map +1 -1
  51. package/dist/tools-cli.d.ts +16 -1
  52. package/dist/tools-cli.d.ts.map +1 -1
  53. package/dist/tools-cli.js +69 -6
  54. package/dist/tools-cli.js.map +1 -1
  55. package/dist/types.d.ts +1 -1
  56. package/dist/types.d.ts.map +1 -1
  57. package/package.json +2 -1
  58. package/templates/.claude/rules/java.md +11 -0
  59. package/templates/.claude/rules/ruby.md +11 -0
  60. package/templates/configs/java/README.md +6 -0
  61. package/templates/configs/ruby/README.md +6 -0
@@ -0,0 +1,421 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.java = void 0;
37
+ exports.extractJavaImportsRaw = extractJavaImportsRaw;
38
+ exports.mapPmdRuleSeverity = mapPmdRuleSeverity;
39
+ exports.parsePmdOutput = parsePmdOutput;
40
+ const fs = __importStar(require("fs"));
41
+ const path = __importStar(require("path"));
42
+ const exclusions_1 = require("../analyzers/tools/exclusions");
43
+ const jacoco_1 = require("../analyzers/tools/jacoco");
44
+ const osv_scanner_deps_1 = require("../analyzers/tools/osv-scanner-deps");
45
+ const runner_1 = require("../analyzers/tools/runner");
46
+ const tool_registry_1 = require("../analyzers/tools/tool-registry");
47
+ // ─── Detection ──────────────────────────────────────────────────────────────
48
+ /**
49
+ * Walk the project tree looking for a `.java` source file. Java's
50
+ * standard layout (`src/main/java/com/example/...`) is much deeper
51
+ * than Kotlin's `src/main/kotlin/`, so this walk uses a deeper bound
52
+ * than the kotlin pack's depth-3 — package hierarchies of 4-5
53
+ * segments are common in real-world Java projects. Stops short of
54
+ * a full filesystem scan (build/, target/, .gradle/, node_modules/
55
+ * are pruned).
56
+ */
57
+ function hasJavaSourceWithinDepth(cwd, maxDepth = 5) {
58
+ function search(dir, depth) {
59
+ if (depth > maxDepth)
60
+ return false;
61
+ let entries;
62
+ try {
63
+ entries = fs.readdirSync(dir, { withFileTypes: true });
64
+ }
65
+ catch {
66
+ return false;
67
+ }
68
+ for (const e of entries) {
69
+ if (e.name.startsWith('.') ||
70
+ ['node_modules', 'build', '.gradle', 'target', 'out'].includes(e.name)) {
71
+ continue;
72
+ }
73
+ if (e.isFile() && e.name.endsWith('.java'))
74
+ return true;
75
+ if (e.isDirectory() && search(path.join(dir, e.name), depth + 1))
76
+ return true;
77
+ }
78
+ return false;
79
+ }
80
+ return search(cwd, 0);
81
+ }
82
+ /**
83
+ * Java pack detection. Strict: requires evidence of actual Java SOURCE,
84
+ * not just a JVM build manifest. `pom.xml` alone is NOT a Java signal —
85
+ * Kotlin (incl. our own `test/fixtures/benchmarks/kotlin/pom.xml` for
86
+ * osv-scanner) and Scala projects also ship Maven POMs. The two
87
+ * unambiguous signals:
88
+ *
89
+ * 1. `src/main/java/` directory exists — the path itself is the
90
+ * Maven/Gradle convention for Java sources.
91
+ * 2. A `.java` file lives within depth 5 of cwd (Java package
92
+ * hierarchies are routinely 4-5 segments under `src/`).
93
+ *
94
+ * Mixed Kotlin+Java projects (legacy Android migrations, polyglot
95
+ * monorepos) activate BOTH packs — correct, the project genuinely is
96
+ * both. Pure Kotlin/Scala/Groovy projects with `pom.xml` but no
97
+ * `.java` source no longer false-trigger Java (10k.1.3 fix).
98
+ */
99
+ function detectJava(cwd) {
100
+ // Standard Maven/Gradle Java layout — directory name is the signal.
101
+ if (fs.existsSync(path.join(cwd, 'src', 'main', 'java')))
102
+ return true;
103
+ // Otherwise require actual `.java` source presence.
104
+ return hasJavaSourceWithinDepth(cwd, 5);
105
+ }
106
+ // ─── Imports (regex extraction, no resolver) ───────────────────────────────
107
+ /**
108
+ * Extract `import com.foo.Bar;` paths from a Java source string. Handles:
109
+ * - regular imports: `import com.foo.Bar;`
110
+ * - static imports: `import static com.foo.Bar.method;`
111
+ * - wildcard imports: `import com.foo.*;`
112
+ * Strips line + block comments first so commented-out imports don't
113
+ * false-match.
114
+ *
115
+ * Exported for unit tests; consumed by `gatherJavaImportsResult`.
116
+ */
117
+ function extractJavaImportsRaw(content) {
118
+ const out = [];
119
+ // Strip block comments first (they may span multiple lines and contain
120
+ // `import` text), then line comments.
121
+ const stripped = content.replace(/\/\*[\s\S]*?\*\//g, '').replace(/\/\/[^\n]*/g, '');
122
+ // Match `import` at line start (after optional whitespace), optionally
123
+ // `static`, then a dotted path with optional trailing `*`, then `;`.
124
+ // The `as` aliasing Kotlin allows isn't valid Java syntax.
125
+ const re = /^\s*import\s+(?:static\s+)?([\w.*]+)\s*;/gm;
126
+ let m;
127
+ while ((m = re.exec(stripped)) !== null) {
128
+ out.push(m[1]);
129
+ }
130
+ return out;
131
+ }
132
+ /**
133
+ * Enumerate `.java` files under cwd and capture per-file imports. Java
134
+ * package paths don't 1:1 map to filesystem paths in all build layouts
135
+ * (a single package can span `src/main/java/com/foo/` *and*
136
+ * `src/test/java/com/foo/`, plus IDE-generated extras), so we don't
137
+ * produce `edges` — the resolution would be heuristic. Mirrors the
138
+ * kotlin/rust pack choice.
139
+ */
140
+ function gatherJavaImportsResult(cwd) {
141
+ const excludes = (0, exclusions_1.getFindExcludeFlags)(cwd);
142
+ const raw = (0, runner_1.run)(`find . -type f -name "*.java" ${excludes} 2>/dev/null`, cwd);
143
+ if (!raw)
144
+ return null;
145
+ const extracted = new Map();
146
+ for (const line of raw.split('\n')) {
147
+ const p = line.trim();
148
+ if (!p)
149
+ continue;
150
+ const rel = p.replace(/^\.\//, '');
151
+ let content;
152
+ try {
153
+ content = fs.readFileSync(path.join(cwd, rel), 'utf-8');
154
+ }
155
+ catch {
156
+ continue;
157
+ }
158
+ extracted.set(rel, extractJavaImportsRaw(content));
159
+ }
160
+ if (extracted.size === 0)
161
+ return null;
162
+ return {
163
+ schemaVersion: 1,
164
+ tool: 'java-imports',
165
+ sourceExtensions: ['.java'],
166
+ extracted,
167
+ edges: new Map(),
168
+ };
169
+ }
170
+ const javaImportsProvider = {
171
+ source: 'java',
172
+ async gather(cwd) {
173
+ return gatherJavaImportsResult(cwd);
174
+ },
175
+ };
176
+ // ─── Test framework detection (build-file substring scan) ──────────────────
177
+ /**
178
+ * Detect which test framework a Java project uses by scanning Maven and
179
+ * Gradle build files for the canonical artifact substrings. Order of
180
+ * preference matches what coexisting projects most likely standardize
181
+ * on:
182
+ * - JUnit 5 (Jupiter) — modern default; `junit-jupiter` artifact
183
+ * - Spock — `org.spockframework` / `spock-core`
184
+ * - TestNG — `org.testng` / `:testng:`
185
+ * - JUnit 4 — `junit:junit` or any other `junit` mention as last
186
+ * resort, since `junit-jupiter` already matched JUnit 5
187
+ *
188
+ * Substring matching is intentional — same approach as the kotlin pack.
189
+ * Robust to syntactic variation across pom.xml (XML <artifactId>) and
190
+ * build.gradle{,.kts} (Groovy/Kotlin DSL string literals).
191
+ */
192
+ function gatherJavaTestFrameworkResult(cwd) {
193
+ const buildFiles = ['pom.xml', 'build.gradle.kts', 'build.gradle'];
194
+ let combined = '';
195
+ for (const rel of buildFiles) {
196
+ if (!(0, runner_1.fileExists)(cwd, rel))
197
+ continue;
198
+ try {
199
+ combined += fs.readFileSync(path.join(cwd, rel), 'utf-8') + '\n';
200
+ }
201
+ catch {
202
+ /* ignore unreadable */
203
+ }
204
+ }
205
+ if (!combined)
206
+ return null;
207
+ if (combined.includes('junit-jupiter')) {
208
+ return { schemaVersion: 1, tool: 'java', name: 'junit5' };
209
+ }
210
+ if (combined.includes('org.spockframework') || combined.includes('spock-core')) {
211
+ return { schemaVersion: 1, tool: 'java', name: 'spock' };
212
+ }
213
+ if (combined.includes('org.testng') || combined.includes(':testng:')) {
214
+ return { schemaVersion: 1, tool: 'java', name: 'testng' };
215
+ }
216
+ if (combined.toLowerCase().includes('junit')) {
217
+ return { schemaVersion: 1, tool: 'java', name: 'junit4' };
218
+ }
219
+ return null;
220
+ }
221
+ const javaTestFrameworkProvider = {
222
+ source: 'java',
223
+ async gather(cwd) {
224
+ return gatherJavaTestFrameworkResult(cwd);
225
+ },
226
+ };
227
+ // ─── Lint (PMD JSON output) ────────────────────────────────────────────────
228
+ /**
229
+ * Map PMD's 1-5 priority scale to dxkit's 4-tier severity. PMD's
230
+ * priority semantics (per official docs):
231
+ * 1 = High → critical
232
+ * 2 = Medium High → high
233
+ * 3 = Medium → medium
234
+ * 4 = Medium Low → low
235
+ * 5 = Low → low
236
+ *
237
+ * Defensive: unknown / missing priorities tier as 'medium' — visibility
238
+ * tilts toward "developer sees it" rather than "silently dropped". Same
239
+ * defensive-default approach as detekt / mapDetektSeverity.
240
+ *
241
+ * Exported for unit tests.
242
+ */
243
+ function mapPmdRuleSeverity(priority) {
244
+ if (priority === 1)
245
+ return 'critical';
246
+ if (priority === 2)
247
+ return 'high';
248
+ if (priority === 3)
249
+ return 'medium';
250
+ if (priority === 4 || priority === 5)
251
+ return 'low';
252
+ return 'medium';
253
+ }
254
+ /**
255
+ * Parse PMD 7.x JSON output (`pmd check -f json`) into a tiered
256
+ * SeverityCounts. Shape:
257
+ *
258
+ * {
259
+ * "formatVersion": 0,
260
+ * "pmdVersion": "7.24.0",
261
+ * "files": [
262
+ * {
263
+ * "filename": "<path>",
264
+ * "violations": [
265
+ * {
266
+ * "beginline": N, "begincolumn": N,
267
+ * "endline": N, "endcolumn": N,
268
+ * "description": "...",
269
+ * "rule": "<ruleName>",
270
+ * "ruleset": "<rulesetCategory>",
271
+ * "priority": 1-5,
272
+ * "externalInfoUrl": "..."
273
+ * }
274
+ * ]
275
+ * }
276
+ * ],
277
+ * "suppressedViolations": [],
278
+ * "processingErrors": [],
279
+ * "configurationErrors": []
280
+ * }
281
+ *
282
+ * Tolerates malformed JSON (returns empty counts) and missing
283
+ * `files`/`violations` arrays. Real-fixture tests live in
284
+ * `test/languages-java.test.ts` against
285
+ * `test/fixtures/raw/java/pmd-output.json`.
286
+ *
287
+ * Exported for unit tests; consumed by `gatherJavaLintResult`.
288
+ */
289
+ function parsePmdOutput(raw) {
290
+ const counts = { critical: 0, high: 0, medium: 0, low: 0 };
291
+ let parsed;
292
+ try {
293
+ parsed = JSON.parse(raw);
294
+ }
295
+ catch {
296
+ return counts;
297
+ }
298
+ for (const file of parsed.files ?? []) {
299
+ for (const v of file.violations ?? []) {
300
+ counts[mapPmdRuleSeverity(v.priority)]++;
301
+ }
302
+ }
303
+ return counts;
304
+ }
305
+ /**
306
+ * Single source of truth for the java pack's lint gathering. Consumed
307
+ * by `javaLintProvider`.
308
+ *
309
+ * PMD 7.x switched to subcommand syntax (`pmd check -d <dir> -R
310
+ * <ruleset> -f <format>`). We use the built-in
311
+ * `rulesets/java/quickstart.xml` — the curated subset PMD recommends
312
+ * for general scanning across rule categories (Best Practices, Code
313
+ * Style, Design, Documentation, Error Prone, Multithreading,
314
+ * Performance, Security). Projects that ship their own
315
+ * `pmd-ruleset.xml` aren't honored yet — Recipe v3 candidate if
316
+ * customer-need surfaces.
317
+ *
318
+ * Exit codes: PMD exits 0 (no violations), 4 (violations found),
319
+ * other (error). Our `run` helper captures stdout regardless of exit
320
+ * code, so violations-found doesn't block parsing.
321
+ */
322
+ function gatherJavaLintResult(cwd) {
323
+ // Activation gate — match detectJava (no pom.xml-alone trigger).
324
+ if (!fs.existsSync(path.join(cwd, 'src', 'main', 'java')) && !hasJavaSourceWithinDepth(cwd, 5)) {
325
+ return { kind: 'unavailable', reason: 'no java source' };
326
+ }
327
+ const pmd = (0, tool_registry_1.findTool)(tool_registry_1.TOOL_DEFS.pmd, cwd);
328
+ if (!pmd.available || !pmd.path) {
329
+ return { kind: 'unavailable', reason: 'not installed' };
330
+ }
331
+ const cmd = `${pmd.path} check -d . -R rulesets/java/quickstart.xml -f json 2>/dev/null`;
332
+ const raw = (0, runner_1.run)(cmd, cwd, 120000);
333
+ if (!raw)
334
+ return { kind: 'unavailable', reason: 'no pmd output' };
335
+ const counts = parsePmdOutput(raw);
336
+ const envelope = { schemaVersion: 1, tool: 'pmd', counts };
337
+ return { kind: 'success', envelope };
338
+ }
339
+ const javaLintProvider = {
340
+ source: 'java',
341
+ async gather(cwd) {
342
+ const outcome = gatherJavaLintResult(cwd);
343
+ return outcome.kind === 'success' ? outcome.envelope : null;
344
+ },
345
+ };
346
+ // ─── Coverage (JaCoCo XML — shared with kotlin pack) ───────────────────────
347
+ //
348
+ // Per CLAUDE.md rule #2 ("Each tool has ONE gather function"), the
349
+ // JaCoCo parser + locator + gather glue all live in
350
+ // `src/analyzers/tools/jacoco.ts`. Both kotlin and java packs delegate.
351
+ // Java's Maven paths (`target/site/jacoco/jacoco.xml`) and Gradle paths
352
+ // share the same candidate list because they're mutually exclusive on
353
+ // any given project root.
354
+ const javaCoverageProvider = {
355
+ source: 'java',
356
+ async gather(cwd) {
357
+ return (0, jacoco_1.gatherJaCoCoCoverageResult)(cwd);
358
+ },
359
+ };
360
+ // ─── DepVulns (osv-scanner against Maven — shared with kotlin pack) ────────
361
+ //
362
+ // Same shape as coverage above — parser + manifest discovery + tool
363
+ // invocation + CVSS resolution all live in
364
+ // `src/analyzers/tools/osv-scanner-deps.ts` (extracted from kotlin
365
+ // pack in 10k.1.4 for SSOT, generalized to all ecosystems in 10k.2.6a).
366
+ // Java contributes the same Maven manifest candidates as kotlin:
367
+ // pom.xml, gradle.lockfile, gradle/verification-metadata.xml. Both
368
+ // packs pass the `'Maven'` ecosystem string for the OSV filter.
369
+ const JAVA_DEP_MANIFESTS = ['gradle.lockfile', 'pom.xml', 'gradle/verification-metadata.xml'];
370
+ const javaDepVulnsProvider = {
371
+ source: 'java',
372
+ async gather(cwd) {
373
+ const outcome = await (0, osv_scanner_deps_1.gatherOsvScannerDepVulnsResult)(cwd, 'java', 'Maven', JAVA_DEP_MANIFESTS);
374
+ return outcome.kind === 'success' ? outcome.envelope : null;
375
+ },
376
+ };
377
+ // ─── Pack export ────────────────────────────────────────────────────────────
378
+ exports.java = {
379
+ id: 'java',
380
+ displayName: 'Java',
381
+ sourceExtensions: ['.java'],
382
+ // JUnit 4/5, TestNG, Spock all converge on these naming conventions.
383
+ // *IT.java is the Maven Failsafe convention for integration tests.
384
+ testFilePatterns: ['*Test.java', '*Tests.java', '*IT.java'],
385
+ // Build artifact dirs across Maven (target), Gradle (build, .gradle,
386
+ // out). Universal exclusions live in src/analyzers/tools/exclusions.ts.
387
+ extraExcludes: ['target', 'build', '.gradle', 'out'],
388
+ detect: detectJava,
389
+ tools: ['pmd', 'osv-scanner'],
390
+ // Semgrep ships a Java ruleset under p/java.
391
+ semgrepRulesets: ['p/java'],
392
+ capabilities: {
393
+ imports: javaImportsProvider,
394
+ testFramework: javaTestFrameworkProvider,
395
+ coverage: javaCoverageProvider,
396
+ lint: javaLintProvider,
397
+ depVulns: javaDepVulnsProvider,
398
+ },
399
+ // ─── LP-recipe metadata ────────────────────────────────────────────────
400
+ permissions: [
401
+ 'Bash(mvn:*)',
402
+ 'Bash(./gradlew:*)',
403
+ 'Bash(gradle:*)',
404
+ 'Bash(java:*)',
405
+ 'Bash(javac:*)',
406
+ ],
407
+ ruleFile: 'java.md',
408
+ templateFiles: [],
409
+ // doctor checks the runtime + build tool + linter. `java` is the
410
+ // JVM runtime PMD/JaCoCo wrappers shell into; `mvn` is the dominant
411
+ // build tool; `pmd` is the canonical linter wired in 10k.1.3.
412
+ cliBinaries: ['java', 'mvn', 'pmd'],
413
+ // Java 17 is current LTS as of 2026-04 with very wide deployment.
414
+ defaultVersion: '17',
415
+ projectYamlBlock: ({ config, enabled }) => [
416
+ ` java:`,
417
+ ` enabled: ${enabled}`,
418
+ ` version: "${config.versions['java'] ?? '17'}"`,
419
+ ].join('\n'),
420
+ };
421
+ //# sourceMappingURL=java.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"java.js","sourceRoot":"","sources":["../../src/languages/java.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,4 @@
1
- import { type Coverage } from '../analyzers/tools/coverage';
2
- import type { DepVulnFinding, SeverityCounts } from './capabilities/types';
1
+ import type { SeverityCounts } from './capabilities/types';
3
2
  import type { LanguageSupport, LintSeverity } from './types';
4
3
  /**
5
4
  * Map detekt's lowercased Severity enum to dxkit's four-tier scheme.
@@ -38,56 +37,6 @@ export declare function mapDetektSeverity(severity: string): LintSeverity;
38
37
  * Exported for unit tests; consumed by `gatherKotlinLintResult`.
39
38
  */
40
39
  export declare function parseDetektCheckstyleXml(raw: string): SeverityCounts;
41
- /**
42
- * Pure parser for JaCoCo's XML report (DTD: `report.dtd`). The structure:
43
- *
44
- * <report name="...">
45
- * <package name="com/example">
46
- * <class name="com/example/Foo" sourcefilename="Foo.kt">...</class>
47
- * <sourcefile name="Foo.kt">
48
- * <line nr="N" mi="..." ci="..." mb="..." cb="..."/>
49
- * <counter type="LINE" missed="X" covered="Y"/>
50
- * </sourcefile>
51
- * <counter type="LINE" missed="X" covered="Y"/>
52
- * </package>
53
- * <counter type="LINE" missed="X" covered="Y"/>
54
- * </report>
55
- *
56
- * Per-file coverage comes from `<sourcefile>` blocks: their LINE counter
57
- * holds the file's missed/covered totals. Project-level total comes from
58
- * the top-level `<counter type="LINE">` (last in the document).
59
- *
60
- * Path attribution joins `<package name>` (forward-slashed, JVM-style)
61
- * with `<sourcefile name>` to produce the canonical relative path the
62
- * downstream consumers expect (`com/example/Foo.kt`). JVM bytecode
63
- * namespacing isn't 1:1 with on-disk source paths in multi-module
64
- * projects — accepted limitation (matches C#'s cobertura attribution).
65
- *
66
- * Returns null when no `<counter type="LINE">` exists at the top level
67
- * — that's JaCoCo's "no coverage data" signal, distinct from "0%
68
- * coverage" (where the counter exists with covered=0).
69
- *
70
- * Exported for unit tests; consumed by `gatherKotlinCoverageResult`.
71
- */
72
- export declare function parseJaCoCoXml(raw: string, sourceFile: string, _cwd: string): Coverage | null;
73
- /**
74
- * Pure parser for osv-scanner v2.x JSON output, scoped to Maven
75
- * findings only. Other ecosystems (npm, PyPI, Go) are filtered out so
76
- * polyglot repos don't double-count: the typescript pack handles npm,
77
- * the python pack handles PyPI, etc. The kotlin pack owns Maven.
78
- *
79
- * Returns counts + findings + the raw OSV vuln records for downstream
80
- * CVSS resolution. Exported for unit tests.
81
- */
82
- export declare function parseOsvScannerMavenFindings(raw: string): {
83
- counts: SeverityCounts;
84
- findings: DepVulnFinding[];
85
- vulnsForCvss: Array<{
86
- primaryId: string;
87
- embeddedCvss: number | null;
88
- aliases: string[];
89
- }>;
90
- };
91
40
  /**
92
41
  * Capture Kotlin import specifiers from source text. Handles both
93
42
  * `import com.foo.Bar` (single) and `import com.foo.*` (wildcard) plus
@@ -1 +1 @@
1
- {"version":3,"file":"kotlin.d.ts","sourceRoot":"","sources":["../../src/languages/kotlin.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,QAAQ,EAA6B,MAAM,6BAA6B,CAAC;AAWvF,OAAO,KAAK,EAEV,cAAc,EAMd,cAAc,EAEf,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAmE7D;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,CAMhE;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,CAWpE;AA2DD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAmE7F;AAqED;;;;;;;;GAQG;AACH,wBAAgB,4BAA4B,CAAC,GAAG,EAAE,MAAM,GAAG;IACzD,MAAM,EAAE,cAAc,CAAC;IACvB,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,YAAY,EAAE,KAAK,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;CAC5F,CAiEA;AAkFD;;;;;;;;;GASG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAYjE;AA8FD,eAAO,MAAM,MAAM,EAAE,eA6DpB,CAAC"}
1
+ {"version":3,"file":"kotlin.d.ts","sourceRoot":"","sources":["../../src/languages/kotlin.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAMV,cAAc,EAEf,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAmE7D;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,CAMhE;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,CAWpE;AA+FD;;;;;;;;;GASG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAYjE;AA8FD,eAAO,MAAM,MAAM,EAAE,eA6DpB,CAAC"}