@vyuhlabs/dxkit 2.4.3 → 2.4.5

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 (78) hide show
  1. package/CHANGELOG.md +347 -0
  2. package/README.md +15 -11
  3. package/dist/analyzers/health.js +9 -9
  4. package/dist/analyzers/health.js.map +1 -1
  5. package/dist/analyzers/licenses/gather.js +1 -1
  6. package/dist/analyzers/licenses/gather.js.map +1 -1
  7. package/dist/analyzers/quality/gather.js +2 -2
  8. package/dist/analyzers/quality/gather.js.map +1 -1
  9. package/dist/analyzers/security/gather.d.ts.map +1 -1
  10. package/dist/analyzers/security/gather.js +11 -2
  11. package/dist/analyzers/security/gather.js.map +1 -1
  12. package/dist/analyzers/tests/import-graph.d.ts.map +1 -1
  13. package/dist/analyzers/tests/import-graph.js +5 -0
  14. package/dist/analyzers/tests/import-graph.js.map +1 -1
  15. package/dist/analyzers/tests/index.d.ts.map +1 -1
  16. package/dist/analyzers/tests/index.js +2 -0
  17. package/dist/analyzers/tests/index.js.map +1 -1
  18. package/dist/analyzers/tests/types.d.ts +12 -2
  19. package/dist/analyzers/tests/types.d.ts.map +1 -1
  20. package/dist/analyzers/tools/coverage.d.ts +1 -1
  21. package/dist/analyzers/tools/coverage.d.ts.map +1 -1
  22. package/dist/analyzers/tools/coverage.js.map +1 -1
  23. package/dist/analyzers/tools/jacoco.d.ts +76 -0
  24. package/dist/analyzers/tools/jacoco.d.ts.map +1 -0
  25. package/dist/analyzers/tools/jacoco.js +228 -0
  26. package/dist/analyzers/tools/jacoco.js.map +1 -0
  27. package/dist/analyzers/tools/jscpd.d.ts +8 -7
  28. package/dist/analyzers/tools/jscpd.d.ts.map +1 -1
  29. package/dist/analyzers/tools/jscpd.js +30 -13
  30. package/dist/analyzers/tools/jscpd.js.map +1 -1
  31. package/dist/analyzers/tools/osv-scanner-fix.d.ts +20 -0
  32. package/dist/analyzers/tools/osv-scanner-fix.d.ts.map +1 -1
  33. package/dist/analyzers/tools/osv-scanner-fix.js +45 -20
  34. package/dist/analyzers/tools/osv-scanner-fix.js.map +1 -1
  35. package/dist/analyzers/tools/osv-scanner-maven.d.ts +42 -0
  36. package/dist/analyzers/tools/osv-scanner-maven.d.ts.map +1 -0
  37. package/dist/analyzers/tools/osv-scanner-maven.js +161 -0
  38. package/dist/analyzers/tools/osv-scanner-maven.js.map +1 -0
  39. package/dist/analyzers/tools/runner.d.ts +47 -0
  40. package/dist/analyzers/tools/runner.d.ts.map +1 -1
  41. package/dist/analyzers/tools/runner.js +79 -0
  42. package/dist/analyzers/tools/runner.js.map +1 -1
  43. package/dist/analyzers/tools/tool-registry.d.ts.map +1 -1
  44. package/dist/analyzers/tools/tool-registry.js +47 -0
  45. package/dist/analyzers/tools/tool-registry.js.map +1 -1
  46. package/dist/cli.d.ts.map +1 -1
  47. package/dist/cli.js +36 -2
  48. package/dist/cli.js.map +1 -1
  49. package/dist/constants.d.ts +3 -0
  50. package/dist/constants.d.ts.map +1 -1
  51. package/dist/languages/capabilities/index.d.ts +21 -12
  52. package/dist/languages/capabilities/index.d.ts.map +1 -1
  53. package/dist/languages/capabilities/index.js +47 -13
  54. package/dist/languages/capabilities/index.js.map +1 -1
  55. package/dist/languages/index.d.ts.map +1 -1
  56. package/dist/languages/index.js +11 -1
  57. package/dist/languages/index.js.map +1 -1
  58. package/dist/languages/java.d.ts +67 -0
  59. package/dist/languages/java.d.ts.map +1 -0
  60. package/dist/languages/java.js +419 -0
  61. package/dist/languages/java.js.map +1 -0
  62. package/dist/languages/kotlin.d.ts +52 -0
  63. package/dist/languages/kotlin.d.ts.map +1 -0
  64. package/dist/languages/kotlin.js +404 -0
  65. package/dist/languages/kotlin.js.map +1 -0
  66. package/dist/languages/types.d.ts +9 -1
  67. package/dist/languages/types.d.ts.map +1 -1
  68. package/dist/tools-cli.d.ts +16 -1
  69. package/dist/tools-cli.d.ts.map +1 -1
  70. package/dist/tools-cli.js +69 -6
  71. package/dist/tools-cli.js.map +1 -1
  72. package/dist/types.d.ts +12 -10
  73. package/dist/types.d.ts.map +1 -1
  74. package/package.json +2 -1
  75. package/templates/.claude/rules/java.md +11 -0
  76. package/templates/.claude/rules/kotlin.md +11 -0
  77. package/templates/configs/java/README.md +6 -0
  78. package/templates/configs/kotlin/README.md +6 -0
@@ -0,0 +1,419 @@
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_maven_1 = require("../analyzers/tools/osv-scanner-maven");
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-maven.ts` (extracted from kotlin
365
+ // pack in 10k.1.4 for SSOT). Java contributes the same Maven manifest
366
+ // candidates (pom.xml, gradle.lockfile, gradle/verification-metadata.xml)
367
+ // — JVM ecosystem manifests are language-agnostic.
368
+ const javaDepVulnsProvider = {
369
+ source: 'java',
370
+ async gather(cwd) {
371
+ const outcome = await (0, osv_scanner_maven_1.gatherOsvScannerMavenDepVulnsResult)(cwd, 'java');
372
+ return outcome.kind === 'success' ? outcome.envelope : null;
373
+ },
374
+ };
375
+ // ─── Pack export ────────────────────────────────────────────────────────────
376
+ exports.java = {
377
+ id: 'java',
378
+ displayName: 'Java',
379
+ sourceExtensions: ['.java'],
380
+ // JUnit 4/5, TestNG, Spock all converge on these naming conventions.
381
+ // *IT.java is the Maven Failsafe convention for integration tests.
382
+ testFilePatterns: ['*Test.java', '*Tests.java', '*IT.java'],
383
+ // Build artifact dirs across Maven (target), Gradle (build, .gradle,
384
+ // out). Universal exclusions live in src/analyzers/tools/exclusions.ts.
385
+ extraExcludes: ['target', 'build', '.gradle', 'out'],
386
+ detect: detectJava,
387
+ tools: ['pmd', 'osv-scanner'],
388
+ // Semgrep ships a Java ruleset under p/java.
389
+ semgrepRulesets: ['p/java'],
390
+ capabilities: {
391
+ imports: javaImportsProvider,
392
+ testFramework: javaTestFrameworkProvider,
393
+ coverage: javaCoverageProvider,
394
+ lint: javaLintProvider,
395
+ depVulns: javaDepVulnsProvider,
396
+ },
397
+ // ─── LP-recipe metadata ────────────────────────────────────────────────
398
+ permissions: [
399
+ 'Bash(mvn:*)',
400
+ 'Bash(./gradlew:*)',
401
+ 'Bash(gradle:*)',
402
+ 'Bash(java:*)',
403
+ 'Bash(javac:*)',
404
+ ],
405
+ ruleFile: 'java.md',
406
+ templateFiles: [],
407
+ // doctor checks the runtime + build tool + linter. `java` is the
408
+ // JVM runtime PMD/JaCoCo wrappers shell into; `mvn` is the dominant
409
+ // build tool; `pmd` is the canonical linter wired in 10k.1.3.
410
+ cliBinaries: ['java', 'mvn', 'pmd'],
411
+ // Java 17 is current LTS as of 2026-04 with very wide deployment.
412
+ defaultVersion: '17',
413
+ projectYamlBlock: ({ config, enabled }) => [
414
+ ` java:`,
415
+ ` enabled: ${enabled}`,
416
+ ` version: "${config.versions['java'] ?? '17'}"`,
417
+ ].join('\n'),
418
+ };
419
+ //# 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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"}
@@ -0,0 +1,52 @@
1
+ import type { SeverityCounts } from './capabilities/types';
2
+ import type { LanguageSupport, LintSeverity } from './types';
3
+ /**
4
+ * Map detekt's lowercased Severity enum to dxkit's four-tier scheme.
5
+ * detekt 1.23+ emits `error|warning|info` (the `dev.detekt.api.Severity`
6
+ * enum lowercased — see CheckstyleOutputReportSpec in detekt's repo).
7
+ *
8
+ * Tiering rationale (no source-of-truth from detekt — they don't tier):
9
+ * - error → high (detekt's authors classify as a real defect)
10
+ * - warning → medium (style/maintainability concerns)
11
+ * - info → low (informational signals)
12
+ * - unknown → medium (defensive default — never trust an empty string)
13
+ *
14
+ * detekt's older `Defect`/`Style`/`Maintainability`/etc. taxonomy was
15
+ * collapsed in 1.23; we only need to recognise the lowercased modern
16
+ * names. Any future taxonomy change shows up here as an unknown bucket
17
+ * rather than silently miscounting.
18
+ */
19
+ export declare function mapDetektSeverity(severity: string): LintSeverity;
20
+ /**
21
+ * Pure parser for detekt's Checkstyle XML report. The format is fixed
22
+ * (detekt's CheckstyleOutputReport renders verbatim per its 1.23 spec):
23
+ *
24
+ * <?xml version="1.0" encoding="UTF-8"?>
25
+ * <checkstyle version="4.3">
26
+ * <file name="src/main/Sample1.kt">
27
+ * <TAB><error line="11" column="1" severity="error" message="..." source="detekt.style/MagicNumber" />
28
+ * ...
29
+ * </file>
30
+ * </checkstyle>
31
+ *
32
+ * We tally `<error severity="...">` attribute values; we don't need the
33
+ * full file/line index because the lint envelope only carries
34
+ * SeverityCounts. Future enrichment (per-finding paths) would extend
35
+ * the parser without breaking this signature.
36
+ *
37
+ * Exported for unit tests; consumed by `gatherKotlinLintResult`.
38
+ */
39
+ export declare function parseDetektCheckstyleXml(raw: string): SeverityCounts;
40
+ /**
41
+ * Capture Kotlin import specifiers from source text. Handles both
42
+ * `import com.foo.Bar` (single) and `import com.foo.*` (wildcard) plus
43
+ * the `import com.foo.Bar as Baz` alias form. Comments are stripped
44
+ * conservatively — single-line `//` and inline `/* ... *\/`. Multi-line
45
+ * `/* ... *\/` blocks containing `import` statements are not extracted
46
+ * (acceptable: comment-out-import is intentional non-use).
47
+ *
48
+ * Exported for unit tests; consumed by `gatherKotlinImportsResult`.
49
+ */
50
+ export declare function extractKotlinImportsRaw(content: string): string[];
51
+ export declare const kotlin: LanguageSupport;
52
+ //# sourceMappingURL=kotlin.d.ts.map
@@ -0,0 +1 @@
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;AAuFD;;;;;;;;;GASG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAYjE;AA8FD,eAAO,MAAM,MAAM,EAAE,eA6DpB,CAAC"}