fad-checker 1.0.0
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/CLAUDE.md +126 -0
- package/README.md +279 -0
- package/completions/fad-check.bash +23 -0
- package/completions/fad-check.zsh +27 -0
- package/data/cpe-coord-map.json +112 -0
- package/data/eol-mapping.json +34 -0
- package/data/known-obsolete.json +142 -0
- package/data/known-public-namespaces.json +79 -0
- package/docs/ARCHITECTURE.md +152 -0
- package/docs/USAGE.md +179 -0
- package/fad-check.js +665 -0
- package/lib/cache-archive.js +107 -0
- package/lib/config.js +87 -0
- package/lib/core.js +317 -0
- package/lib/cpe.js +287 -0
- package/lib/cve-download.js +369 -0
- package/lib/cve-match.js +228 -0
- package/lib/cve-report.js +1455 -0
- package/lib/maven-repo.js +134 -0
- package/lib/maven-version.js +153 -0
- package/lib/npm/collect.js +224 -0
- package/lib/npm/parse.js +291 -0
- package/lib/nvd.js +239 -0
- package/lib/osv.js +298 -0
- package/lib/outdated.js +265 -0
- package/lib/retire.js +211 -0
- package/lib/scan-completeness.js +67 -0
- package/lib/snyk.js +127 -0
- package/lib/transitive.js +410 -0
- package/package.json +35 -0
- package/test/core.test.js +153 -0
- package/test/cpe.test.js +148 -0
- package/test/cve-download.test.js +39 -0
- package/test/cve-match.test.js +108 -0
- package/test/cve-report.test.js +79 -0
- package/test/fixtures/complex-enterprise/api/pom.xml +32 -0
- package/test/fixtures/complex-enterprise/build/pom.xml +46 -0
- package/test/fixtures/complex-enterprise/dao/pom.xml +37 -0
- package/test/fixtures/complex-enterprise/pom.xml +66 -0
- package/test/fixtures/complex-enterprise/web/pom.xml +77 -0
- package/test/fixtures/cve-samples/cve-non-java.json +19 -0
- package/test/fixtures/cve-samples/cve-product-only.json +31 -0
- package/test/fixtures/cve-samples/cve-with-packagename.json +37 -0
- package/test/fixtures/cve-samples/nvd-log4shell.json +40 -0
- package/test/fixtures/cve-samples/nvd-npm-lodash.json +22 -0
- package/test/fixtures/monorepo-mixed/libs/common-bom/pom.xml +26 -0
- package/test/fixtures/monorepo-mixed/packages/cli/package.json +14 -0
- package/test/fixtures/monorepo-mixed/packages/cli/yarn.lock +41 -0
- package/test/fixtures/monorepo-mixed/packages/no-lock/package.json +9 -0
- package/test/fixtures/monorepo-mixed/packages/web-app/package-lock.json +71 -0
- package/test/fixtures/monorepo-mixed/packages/web-app/package.json +17 -0
- package/test/fixtures/monorepo-mixed/pom.xml +29 -0
- package/test/fixtures/monorepo-mixed/services/api/pom.xml +27 -0
- package/test/fixtures/monorepo-mixed/services/worker/pom.xml +28 -0
- package/test/fixtures/private-lib-detection/core/pom.xml +26 -0
- package/test/fixtures/private-lib-detection/plugin/pom.xml +23 -0
- package/test/fixtures/private-lib-detection/pom.xml +35 -0
- package/test/fixtures/simple/app/pom.xml +28 -0
- package/test/fixtures/simple/lib/pom.xml +18 -0
- package/test/fixtures/simple/pom.xml +24 -0
- package/test/maven-repo.test.js +111 -0
- package/test/maven-version.test.js +48 -0
- package/test/monorepo.test.js +132 -0
- package/test/npm.test.js +146 -0
- package/test/outdated.test.js +56 -0
- package/test/snyk.test.js +64 -0
- package/test/transitive.test.js +305 -0
package/CLAUDE.md
ADDED
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
# CLAUDE.md
|
|
2
|
+
|
|
3
|
+
Code-level orientation for contributors and Claude Code sessions on this repo.
|
|
4
|
+
|
|
5
|
+
## What this is
|
|
6
|
+
|
|
7
|
+
`fad-check` — **Fucking Autonomous Dependency Checker**. Node.js CLI (`fad-check`, or short alias `fad`) that:
|
|
8
|
+
|
|
9
|
+
1. Walks a multi-module Maven tree, removes private/excluded dependencies (regex on groupId), writes a parallel directory of "cleaned" POMs that can be fed to Snyk.
|
|
10
|
+
2. Walks every JS package (`package.json` + `package-lock.json` v1/v2/v3 or `yarn.lock` v1) in the same source tree.
|
|
11
|
+
3. Scans the union against:
|
|
12
|
+
- the CVEProject `cvelistV5` Maven-relevant index (built locally),
|
|
13
|
+
- OSV.dev (multi-ecosystem),
|
|
14
|
+
- NIST NVD (enrichment: CVSS, CPE configurations, references),
|
|
15
|
+
- retire.js (vendored JS signatures),
|
|
16
|
+
- optionally Snyk (`--snyk`).
|
|
17
|
+
4. Cross-checks every match's NVD CPE configurations against the dep version (`lib/cpe.js`) to filter false positives.
|
|
18
|
+
5. Reports EOL frameworks (endoflife.date), obsolete libs (curated), outdated libs (Maven Central).
|
|
19
|
+
6. Produces a self-contained HTML report + Word-compatible `.doc`, organised by ecosystem and by defining manifest, with per-tool fix recipes and an executive summary.
|
|
20
|
+
|
|
21
|
+
No build tool (`mvn`, `npm install`, `yarn`) is required on PATH — `pom.xml` / `package-lock.json` / `yarn.lock` are parsed directly.
|
|
22
|
+
|
|
23
|
+
## Running
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
npm install
|
|
27
|
+
npm test # 96 unit tests via node --test
|
|
28
|
+
|
|
29
|
+
# basic cleanup workflow
|
|
30
|
+
node fad-check.js -s ./proj # read-only, full report
|
|
31
|
+
node fad-check.js -s ./proj -t ../pom-clean -e "^client\\." # write cleaned tree
|
|
32
|
+
node fad-check.js -s ./proj -t ../pom-clean -e "^client\\." --snyk # also drive snyk
|
|
33
|
+
|
|
34
|
+
# read the full usage doc
|
|
35
|
+
cat docs/USAGE.md
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
Binary builds (requires `bun`):
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
npm run build:linux # → dist/fad-check-linux
|
|
42
|
+
npm run build:win # → dist/fad-check.exe
|
|
43
|
+
npm run build # both
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
Guardrails enforced at startup:
|
|
47
|
+
- `--target` is required only when you want a cleaned POM tree. Without it the run is read-only.
|
|
48
|
+
- `--target` may not equal or be a subdirectory of `--src`.
|
|
49
|
+
- `--target` is `rimraf`'d before being rewritten — never point at anything precious.
|
|
50
|
+
|
|
51
|
+
## Architecture (one-liner per file)
|
|
52
|
+
|
|
53
|
+
```
|
|
54
|
+
fad-check.js Thin CLI: commander parsing, orchestration only.
|
|
55
|
+
lib/core.js POM parsing, parent resolution, all-profile merge, rewrite.
|
|
56
|
+
lib/maven-version.js Maven version parsing + range comparison (no external deps).
|
|
57
|
+
lib/cve-download.js Bulk download of CVEProject/cvelistV5 + Maven-relevant index build.
|
|
58
|
+
lib/cve-match.js Resolved-dep collection + 3-tier CVE matching with dedup.
|
|
59
|
+
lib/cve-report.js Self-contained HTML and Word-compatible (.doc) report rendering.
|
|
60
|
+
lib/cpe.js CPE 2.3 parsing + NVD configurations evaluator (post-match refinement).
|
|
61
|
+
lib/outdated.js EOL (endoflife.date), obsolete (curated), outdated (Maven Central).
|
|
62
|
+
lib/transitive.js Maven Central POM walker (transitive resolution).
|
|
63
|
+
lib/osv.js OSV.dev batched query + per-vuln detail fetch.
|
|
64
|
+
lib/nvd.js NIST NVD enrichment (CVSS, references, CPE configurations).
|
|
65
|
+
lib/snyk.js `snyk test --all-projects --json` runner + merge.
|
|
66
|
+
lib/retire.js retire.js (vendored-JS scanner) wrapper + cache + normaliser.
|
|
67
|
+
lib/scan-completeness.js Warnings for deps fad-check couldn't fully resolve.
|
|
68
|
+
lib/npm/parse.js package.json, package-lock.json (v1/2/3), yarn.lock v1 parsers.
|
|
69
|
+
lib/npm/collect.js Merge across JS manifests → unified resolvedDeps Map.
|
|
70
|
+
lib/cache-archive.js tar.gz / zip export & import of ~/.fad-check/.
|
|
71
|
+
lib/config.js Persistent user config in ~/.fad-check/config.json (mode 0600).
|
|
72
|
+
data/ known-obsolete.json, eol-mapping.json, cpe-coord-map.json, known-public-namespaces.json
|
|
73
|
+
completions/ fad-check.bash, fad-check.zsh
|
|
74
|
+
test/ node:test suite + fixtures (simple, complex-enterprise, monorepo-mixed, …).
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
For the deep dive — pipeline stages, the resolved-deps Map shape, report structure — see [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md).
|
|
78
|
+
|
|
79
|
+
## Important conventions
|
|
80
|
+
|
|
81
|
+
- **`coord()` always trims**: real-world POMs occasionally contain whitespace around `<artifactId>`. Every coord-derived lookup goes through `coord()` in `lib/core.js`.
|
|
82
|
+
- **`byId` keys are never polluted with `undefined`**: only indexed when both `groupId` and `artifactId` are present. Enforced by test.
|
|
83
|
+
- **All profiles are merged, never prompted for**: every profile's deps are unioned so Snyk sees every dep any profile could pull in. `activeByDefault` wins only for property value conflicts.
|
|
84
|
+
- **No `process.exit(1)` mid-pipeline**: a parse/rewrite failure for one POM logs and continues so the summary still prints.
|
|
85
|
+
- **HTML report is self-contained**: inline CSS, no external assets. The `.doc` variant is the same HTML with Office XML namespace meta tags — Word opens it natively.
|
|
86
|
+
- **Map keys are ecosystem-namespaced**: Maven uses `g:a`, npm uses `npm:name`. They never collide so they share one resolved-deps Map.
|
|
87
|
+
- **Lockfile-only npm**: `package.json` without sibling `package-lock.json`/`yarn.lock` is intentionally skipped (its ranges aren't queryable) and reported in chapter 0.
|
|
88
|
+
- **Source identifiers**: every match carries `source: "fad" | "osv" | "nvd" | "snyk" | "retire"` (or a `+`-joined combination).
|
|
89
|
+
|
|
90
|
+
## Testing
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
node --test test/*.test.js # full suite (96 tests)
|
|
94
|
+
node --test test/core.test.js # one file
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
Test fixtures live in `test/fixtures/`:
|
|
98
|
+
- `simple/` — 3 POMs with parent inheritance + property substitution
|
|
99
|
+
- `complex-enterprise/` — Spring Boot parent (external), local BOM via `scope=import`, three profiles
|
|
100
|
+
- `private-lib-detection/` — mixed public/private groupIds, external private parent
|
|
101
|
+
- `monorepo-mixed/` — Maven + npm (package-lock v3) + yarn.lock v1 + a no-lockfile package.json
|
|
102
|
+
- `cve-samples/` — small CVE / NVD JSON files for the matchers
|
|
103
|
+
|
|
104
|
+
## Gotchas / edge cases worth knowing
|
|
105
|
+
|
|
106
|
+
- CVE bundle from CVEProject is ~500 MB unpacked. Shells out to `curl + unzip` (fallback to `fetch()` + `unzip` / `Expand-Archive`). Extracted JSON deleted after index build. Ships as `cves.zip.zip` (nested zip) — `extractZip()` recurses up to 3 levels.
|
|
107
|
+
- `endoflife.date` API responses cached 7 days; Maven Central version lookups cached 24 hours. Cache lives in `~/.fad-check/`.
|
|
108
|
+
- **Persistent config**: `~/.fad-check/config.json` (mode 0600). Set NVD key via `fad-check --set-nvd-key <KEY>` (free, instant from <https://nvd.nist.gov/developers/request-an-api-key> — bumps rate limit from 5/30s to 50/30s).
|
|
109
|
+
- **`--offline` umbrella flag**: skips every network call (CVE/OSV/NVD/Maven Central/endoflife/retire). Falls back to whatever is already cached. Per-source variants (`--cve-offline`, `--no-osv`, `--no-nvd`, `--no-retire`, `--no-transitive`) still work independently.
|
|
110
|
+
- `snyk` is not a hard dep — shells out via `execFile`. `snyk` exits 1 on findings; the JSON is still on stdout.
|
|
111
|
+
- The cleaned POM is the union of every profile's deps. Counts will be larger than the source POM. Intentional — don't "fix" that.
|
|
112
|
+
- Unresolved `${…}` Maven variables stay verbatim in the rewritten POM. `lib/cve-match.js` resolves them lazily via `resolveDepVersion()` when scanning. Deps that *still* can't be resolved (external BOM not in source tree) surface in chapter 0 as `unresolved-versions` warnings.
|
|
113
|
+
- **retire.js** doesn't like `--outputpath /dev/stdout`. We write to a temp file and read it back. Exit code 13 means "vulns found" — expected, not an error.
|
|
114
|
+
|
|
115
|
+
### Per-cache TTLs
|
|
116
|
+
|
|
117
|
+
| Cache | Location | TTL |
|
|
118
|
+
|---|---|---|
|
|
119
|
+
| CVEProject bulk index | `~/.fad-check/cve-data/maven-cve-index.json` | 24 h |
|
|
120
|
+
| OSV per-dep stub list | `~/.fad-check/osv-cache/<eco>__<g>__<a>__<v>.json` | 12 h |
|
|
121
|
+
| OSV vuln details | `~/.fad-check/osv-cache/vuln_<id>.json` | 12 h |
|
|
122
|
+
| NVD CVE record | `~/.fad-check/nvd-cache/<cveId>.json` | 7 d |
|
|
123
|
+
| endoflife.date cycles | `~/.fad-check/eol-cache.json` | 7 d |
|
|
124
|
+
| Maven Central latest | `~/.fad-check/version-cache.json` | 24 h |
|
|
125
|
+
| Transitive POM | `~/.fad-check/poms-cache/<g>__<a>__<v>.pom` | ∞ (immutable on Maven Central) |
|
|
126
|
+
| retire.js findings | `~/.fad-check/retire-cache/<md5(src)>.json` | 24 h |
|
package/README.md
ADDED
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
# fad-check
|
|
2
|
+
|
|
3
|
+
> **F**ucking **A**utonomous **D**ependency **C**hecker
|
|
4
|
+
|
|
5
|
+
`fad-check` scans **Maven**, **npm**, **Yarn** and **vendored JavaScript** in any source tree — multi-module, monorepo, polyglot, whatever you've got — and produces a single self-contained HTML report with CVE, EOL, obsolete and outdated findings, plus per-ecosystem fix recipes.
|
|
6
|
+
|
|
7
|
+
It runs against the source files alone. **No `mvn`, no `npm install`, no `yarn`, no Docker.** It reads `pom.xml`, `package-lock.json` and `yarn.lock` directly.
|
|
8
|
+
|
|
9
|
+
> **Currently supported ecosystems: Maven, npm, Yarn (v1).** Vendored JS (jQuery, Bootstrap, PDF.js, etc.) is also scanned via retire.js. Yarn v2/Berry and pnpm are not yet supported — they're surfaced as warnings in chapter 0 so you know they were skipped.
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## Why "Autonomous"?
|
|
14
|
+
|
|
15
|
+
Because it doesn't need anything you don't already have on disk:
|
|
16
|
+
|
|
17
|
+
| You don't need | Why |
|
|
18
|
+
| --- | --- |
|
|
19
|
+
| Maven installed | `pom.xml` files are parsed directly with xml2js. Properties, profiles and local BOMs are resolved in-process. Transitive deps fetched from Maven Central if `--transitive` (cached forever). |
|
|
20
|
+
| `mvn dependency:tree` | Same as above. We walk the tree ourselves. |
|
|
21
|
+
| `npm install` / a `node_modules/` | `package-lock.json` (v1/v2/v3) and `yarn.lock` v1 are parsed as text/JSON. Versions come from the lockfile — no installation. |
|
|
22
|
+
| `yarn install` | Same. We read `yarn.lock` v1. |
|
|
23
|
+
| `snyk` binary | Built-in CVE matching via 4 independent sources (see below). Snyk is *optional* (`--snyk`). |
|
|
24
|
+
| A network connection | First run downloads CVE / OSV / EOL data; subsequent runs use cached copies (`--offline` to force). |
|
|
25
|
+
|
|
26
|
+
Exactly **two** runtime dependencies must be on PATH (or installed automatically through npm): Node ≥ 20 and `retire` (the npm package, installed by `npm install`). Everything else is bundled or fetched lazily.
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## What it finds
|
|
31
|
+
|
|
32
|
+
| Chapter | Source | What it catches |
|
|
33
|
+
| --- | --- | --- |
|
|
34
|
+
| **0. Warnings** | local heuristics | Missing lockfiles, unresolved Maven versions (BOM-managed), private libs not on Maven Central |
|
|
35
|
+
| **1. CVE (production)** | CVEProject + OSV.dev + NVD + CPE | Public CVE / GHSA in production deps, per ecosystem, per manifest file |
|
|
36
|
+
| **2. CVE in dev deps** | same | Same, but for `test`/`provided` (Maven) and `dev`/`optional`/`peer` (npm) |
|
|
37
|
+
| **3. Vendored JS** | [retire.js](https://retirejs.github.io/) | Old jQuery/Bootstrap/Angular/PDF.js copies sitting in `static/` or `webapp/` with no lockfile |
|
|
38
|
+
| **4. EOL frameworks** | endoflife.date | Spring Boot 2.5, Hibernate 4.x, EOL JDKs, etc. |
|
|
39
|
+
| **5. Obsolete libraries** | curated list (`data/known-obsolete.json`) | log4j 1.x, jackson-mapper-asl, joda-time, commons-httpclient 3.x, … |
|
|
40
|
+
| **6. Outdated libraries** | Maven Central Solr API | Available newer versions, with release dates |
|
|
41
|
+
| **7. Fix Recommendations** | computed | Per-ecosystem pin recipes: Maven `<dependencyManagement>`, npm `overrides`, yarn `resolutions` |
|
|
42
|
+
|
|
43
|
+
The HTML report opens in any browser, contains every detail (CVSS vectors, references, full descriptions, CPE configurations, via-paths for transitives) and ships a Word-compatible `.doc` twin.
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## Quick start
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
npm install -g fad-check
|
|
51
|
+
fad-check -s ./my-project
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
That's it. The report lands in `./fad-check-report/cve-report.html`.
|
|
55
|
+
|
|
56
|
+
Want a 10× faster NVD enrichment? [Get a free NVD API key](https://nvd.nist.gov/developers/request-an-api-key) (instant), then:
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
fad-check --set-nvd-key YOUR_KEY
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
## Common runs
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
# Read-only full scan (default: all sources on)
|
|
68
|
+
fad-check -s ./proj
|
|
69
|
+
|
|
70
|
+
# Exclude private/internal libs by groupId regex
|
|
71
|
+
fad-check -s ./proj -e "^(com\.acme|org\.private)\."
|
|
72
|
+
|
|
73
|
+
# Also write cleaned POMs (private deps stripped, ready for Snyk)
|
|
74
|
+
fad-check -s ./proj -t ../proj-clean -e "^com\.acme\."
|
|
75
|
+
|
|
76
|
+
# Then run Snyk on the cleaned tree and merge findings
|
|
77
|
+
fad-check -s ./proj -t ../proj-clean -e "^com\.acme\." --snyk
|
|
78
|
+
|
|
79
|
+
# Faster: skip Maven Central / no transitive walk
|
|
80
|
+
fad-check -s ./proj --no-all-libs --no-transitive
|
|
81
|
+
|
|
82
|
+
# Fully offline (uses cached data only)
|
|
83
|
+
fad-check -s ./proj --offline
|
|
84
|
+
|
|
85
|
+
# Only one ecosystem
|
|
86
|
+
fad-check -s ./proj --ecosystem maven # or npm | both | auto (default)
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
Run `fad-check --help` for the full flag list.
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
## What a report looks like
|
|
94
|
+
|
|
95
|
+
```
|
|
96
|
+
Executive Summary [CRITICAL] — 1708 dependencies scanned
|
|
97
|
+
• 81 CVE in production deps (critical=5, high=53, medium=12, low=11)
|
|
98
|
+
• 32 CVE in dev/test deps
|
|
99
|
+
• 17 vulnerable vendored JS finding(s) (retire.js)
|
|
100
|
+
• 2 end-of-life frameworks
|
|
101
|
+
• 13 obsolete / deprecated libs
|
|
102
|
+
• 172 outdated libs
|
|
103
|
+
• 4 scan-completeness alerts — see chapter 0
|
|
104
|
+
|
|
105
|
+
0. Warnings & scan-completeness (4)
|
|
106
|
+
1. CVE Vulnerabilities — production (81)
|
|
107
|
+
1.a Maven (49)
|
|
108
|
+
1.a.0 All (49)
|
|
109
|
+
By pom.xml (14 files)
|
|
110
|
+
build/building/pom.xml (17)
|
|
111
|
+
services/api/pom.xml (17)
|
|
112
|
+
… 12 more
|
|
113
|
+
1.b npm (package-lock) (32)
|
|
114
|
+
1.b.0 All (32)
|
|
115
|
+
By package-lock.json (1 file)
|
|
116
|
+
web/package-lock.json (32)
|
|
117
|
+
2. CVE in dev dependencies (32)
|
|
118
|
+
3. Vendored JS scan — retire.js (17)
|
|
119
|
+
4. End-of-Life Frameworks (2)
|
|
120
|
+
5. Obsolete / Deprecated Libraries (13)
|
|
121
|
+
6. Outdated Libraries (172)
|
|
122
|
+
7. Fix Recommendations
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
Each CVE row shows: severity badge · CVE / GHSA id · dep coord & version · which manifest file declares it · source(s) (CVEProject / OSV / NVD / Snyk / retire / fad) · fix-version · summary. Click a row for the full panel (CVSS vectors, NVD references categorised by type, transitive paths, CPE configurations).
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
## Install
|
|
130
|
+
|
|
131
|
+
### As a global CLI
|
|
132
|
+
|
|
133
|
+
```bash
|
|
134
|
+
npm install -g fad-check
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
### From source
|
|
138
|
+
|
|
139
|
+
```bash
|
|
140
|
+
git clone <repo-url> fad-check
|
|
141
|
+
cd fad-check
|
|
142
|
+
npm install
|
|
143
|
+
node fad-check.js --help
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
### Single-binary build (no Node required)
|
|
147
|
+
|
|
148
|
+
```bash
|
|
149
|
+
npm install # one-time, brings in bun
|
|
150
|
+
npm run build # → dist/fad-check-linux + dist/fad-check.exe
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
### Shell completion
|
|
154
|
+
|
|
155
|
+
```bash
|
|
156
|
+
fad-check --completion bash > /etc/bash_completion.d/fad-check
|
|
157
|
+
# or for zsh:
|
|
158
|
+
fad-check --completion zsh > ~/.zsh/completions/_fad-check
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
---
|
|
162
|
+
|
|
163
|
+
## How it scans without any build tool
|
|
164
|
+
|
|
165
|
+
This is the surprising bit. The whole point is that you can run `fad-check` against a *checkout* with no build environment.
|
|
166
|
+
|
|
167
|
+
- **Maven** — `pom.xml` files are parsed with xml2js. Property substitution (`${jackson.version}`), parent inheritance, local BOM imports (`<scope>import</scope>`) and every profile are resolved in-process. Transitive deps are walked by fetching child POMs from Maven Central (cached forever — POMs are immutable). When the project uses an **external BOM** (`spring-boot-dependencies` etc.), the deps whose version comes from that BOM can't be resolved without `mvn` itself — those are surfaced in chapter 0 as "unresolved-versions" so you know what's missing.
|
|
168
|
+
- **npm / Yarn** — `package-lock.json` (v1, v2, v3) and `yarn.lock` v1 are parsed directly. Lockfiles already contain every transitive version. No `node_modules/` traversal, no `npm install`. A package.json *without* a sibling lockfile is intentionally skipped (its ranges aren't queryable) and reported in chapter 0.
|
|
169
|
+
- **Vendored JavaScript** — `retire.js` shells out and scans `.js` / `.min.js` files by signature, catching old jQuery / Bootstrap / Angular / PDF.js copies that no lockfile knows about.
|
|
170
|
+
- **CVE data** — three independent sources merged:
|
|
171
|
+
- **CVEProject** (the canonical `cvelistV5` bundle, filtered to Maven-relevant entries)
|
|
172
|
+
- **OSV.dev** (Google + GitHub Security Lab, multi-ecosystem)
|
|
173
|
+
- **NVD** (official NIST records, used for enrichment: full CVSS, references, CPE configurations)
|
|
174
|
+
- **CPE refinement** — once a CVE is matched, its NVD CPE configurations are checked against the dep version range. A match outside the vulnerable range is flagged `cpeFiltered: true` (likely false positive). A curated `data/cpe-coord-map.json` maps CPE `vendor:product` to Maven `g:a` (60+ entries seeded: log4j, jackson, spring, tomcat, jetty, netty, …).
|
|
175
|
+
|
|
176
|
+
---
|
|
177
|
+
|
|
178
|
+
## Caching
|
|
179
|
+
|
|
180
|
+
All cached data lives in `~/.fad-check/`:
|
|
181
|
+
|
|
182
|
+
| Cache | Path | TTL |
|
|
183
|
+
| --- | --- | --- |
|
|
184
|
+
| Maven CVE index (CVEProject bundle, filtered) | `cve-data/maven-cve-index.json` | 24 h |
|
|
185
|
+
| OSV per-dep lookups | `osv-cache/<ecosystem>__<g>__<a>__<v>.json` | 12 h |
|
|
186
|
+
| OSV vuln details | `osv-cache/vuln_<id>.json` | 12 h |
|
|
187
|
+
| NVD CVE records | `nvd-cache/<cveId>.json` | 7 d |
|
|
188
|
+
| endoflife.date cycles | `eol-cache.json` | 7 d |
|
|
189
|
+
| Maven Central latest versions | `version-cache.json` | 24 h |
|
|
190
|
+
| Transitive POMs from Maven Central | `poms-cache/<g>__<a>__<v>.pom` | ∞ (immutable) |
|
|
191
|
+
| retire.js findings | `retire-cache/<md5(src)>.json` | 24 h |
|
|
192
|
+
| User config (NVD key) | `config.json` (mode 0600) | — |
|
|
193
|
+
|
|
194
|
+
Export the lot to share between machines:
|
|
195
|
+
|
|
196
|
+
```bash
|
|
197
|
+
fad-check --export-cache fad-cache.tar.gz
|
|
198
|
+
# on the other box:
|
|
199
|
+
fad-check --import-cache fad-cache.tar.gz
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
`--include-config` ships the NVD API key too (off by default).
|
|
203
|
+
|
|
204
|
+
---
|
|
205
|
+
|
|
206
|
+
## Custom Maven repositories
|
|
207
|
+
|
|
208
|
+
Out of the box `fad-check` queries Maven Central for transitive POMs and latest versions. If your project depends on artifacts that live on a private Nexus / Artifactory / JBoss repo, add them so transitive resolution and outdated checks work end-to-end.
|
|
209
|
+
|
|
210
|
+
```bash
|
|
211
|
+
# Persist a repo (lives in ~/.fad-check/config.json)
|
|
212
|
+
fad-check --add-repo nexus https://nexus.acme.com/repository/maven-public/
|
|
213
|
+
fad-check --add-repo nexus-priv https://nexus.acme.com/repository/maven-private/ --auth alice:s3cr3t
|
|
214
|
+
fad-check --list-repos
|
|
215
|
+
fad-check --remove-repo nexus-priv
|
|
216
|
+
|
|
217
|
+
# One-off (not persisted) — repeatable
|
|
218
|
+
fad-check -s ./proj --repo https://nexus.acme.com/repository/maven-public/
|
|
219
|
+
# Inline auth in the URL also works:
|
|
220
|
+
fad-check -s ./proj --repo https://alice:s3cr3t@nexus.acme.com/repository/maven-public/
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
Repos are tried **in declared order, Maven Central last**. Auth is sent as a `Basic <base64>` header. POMs and `maven-metadata.xml` are cached per coord, so subsequent runs are free even against a private repo.
|
|
224
|
+
|
|
225
|
+
---
|
|
226
|
+
|
|
227
|
+
## Data sources & acknowledgments
|
|
228
|
+
|
|
229
|
+
`fad-check` is glue around several outstanding public datasets. Each is used per its license terms.
|
|
230
|
+
|
|
231
|
+
| Source | What we use | License | API / endpoint |
|
|
232
|
+
| --- | --- | --- | --- |
|
|
233
|
+
| [CVEProject `cvelistV5`](https://github.com/CVEProject/cvelistV5) | Daily bulk CVE bundle, filtered to Maven-relevant entries | CC0-1.0 | GitHub release asset (zip) |
|
|
234
|
+
| [OSV.dev](https://osv.dev/) (Google + GitHub Security Lab) | Per-dep vulnerability lookup (Maven + npm + many more ecosystems) | CC-BY 4.0 | `POST api.osv.dev/v1/querybatch`, `GET api.osv.dev/v1/vulns/{id}` |
|
|
235
|
+
| [NIST NVD](https://nvd.nist.gov/) | Canonical CVE description + CVSS vectors + CPE configurations + CWE | US-gov public domain | `GET services.nvd.nist.gov/rest/json/cves/2.0?cveId=…` — free [API key](https://nvd.nist.gov/developers/request-an-api-key) bumps the rate limit 10× |
|
|
236
|
+
| [endoflife.date](https://endoflife.date/) | Framework / runtime EOL cycle data | MIT | `GET endoflife.date/api/{product}.json` |
|
|
237
|
+
| [Maven Central](https://search.maven.org/) | Latest-version lookups + transitive POM fetches | Free public service | Solr `search.maven.org/solrsearch/select?q=…` + `repo1.maven.org/maven2/<coord>` |
|
|
238
|
+
| [retire.js](https://retirejs.github.io/retire.js/) | Vendored-JS signature DB + scanner | Apache-2.0 | npm package `retire`, executed locally |
|
|
239
|
+
| [Snyk](https://snyk.io/) (optional) | Additional CVE source via `snyk test --all-projects --json` | Per Snyk EULA; needs a Snyk account | Local CLI `snyk` |
|
|
240
|
+
| [MITRE CWE](https://cwe.mitre.org/) | Weakness category links in the report | Free public reference | Linked by URL only, no API call |
|
|
241
|
+
|
|
242
|
+
Persistent caches mean each source is hit at most once per its TTL (see [Caching](#caching) table). No telemetry, no third-party analytics — every request listed above is made directly to the named endpoint with a `User-Agent: fad-check-*` header.
|
|
243
|
+
|
|
244
|
+
---
|
|
245
|
+
|
|
246
|
+
## Safety rails
|
|
247
|
+
|
|
248
|
+
Built-in guardrails that fire **before** any disk write:
|
|
249
|
+
|
|
250
|
+
- `--target` is required unless you're running read-only (no `-t`).
|
|
251
|
+
- `--target` may not equal or be a subdirectory of `--src`.
|
|
252
|
+
- `--target` is `rimraf`'d before being rewritten — never point it at anything precious.
|
|
253
|
+
|
|
254
|
+
---
|
|
255
|
+
|
|
256
|
+
## Compared to…
|
|
257
|
+
|
|
258
|
+
| Tool | What `fad-check` adds |
|
|
259
|
+
| --- | --- |
|
|
260
|
+
| `mvn dependency:tree` | No Maven needed; multi-source CVE scan; HTML report |
|
|
261
|
+
| `npm audit` | Polyglot (Maven + npm + vendored JS in one report); EOL & obsolete checks; works without `npm install` |
|
|
262
|
+
| Snyk CLI | Free; offline-capable; integrates Snyk's results if you have it |
|
|
263
|
+
| OWASP DC | Faster (cached); cleaner UI; multi-source dedup |
|
|
264
|
+
|
|
265
|
+
You don't have to choose — `fad-check` will use any of them as input (`--snyk`) and merge results.
|
|
266
|
+
|
|
267
|
+
---
|
|
268
|
+
|
|
269
|
+
## Docs
|
|
270
|
+
|
|
271
|
+
- [`docs/USAGE.md`](docs/USAGE.md) — every flag, every workflow, examples.
|
|
272
|
+
- [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md) — internals: collection, matching, report pipeline.
|
|
273
|
+
- [`CLAUDE.md`](CLAUDE.md) — code-level orientation for contributors.
|
|
274
|
+
|
|
275
|
+
---
|
|
276
|
+
|
|
277
|
+
## License
|
|
278
|
+
|
|
279
|
+
MIT — see [`LICENSE`](LICENSE).
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Bash completion for fad-check (Fucking Autonomous Dependency Checker)
|
|
3
|
+
# Source this file or copy it to /etc/bash_completion.d/fad-check
|
|
4
|
+
_fad_check_complete() {
|
|
5
|
+
local cur prev opts
|
|
6
|
+
COMPREPLY=()
|
|
7
|
+
cur="${COMP_WORDS[COMP_CWORD]}"
|
|
8
|
+
prev="${COMP_WORDS[COMP_CWORD-1]}"
|
|
9
|
+
opts="--src --target --exclude --verbose --no-report --no-transitive --no-all-libs --no-osv --no-nvd --report-output --ignore-test --cve-refresh --cve-offline --snyk --transitive-depth --offline --set-nvd-key --show-config --completion --help --version -s -t -e -v"
|
|
10
|
+
case "$prev" in
|
|
11
|
+
--src|-s|--target|-t|--report-output)
|
|
12
|
+
COMPREPLY=( $(compgen -d -- "$cur") )
|
|
13
|
+
return 0 ;;
|
|
14
|
+
--completion)
|
|
15
|
+
COMPREPLY=( $(compgen -W "bash zsh" -- "$cur") )
|
|
16
|
+
return 0 ;;
|
|
17
|
+
esac
|
|
18
|
+
if [[ "$cur" == -* ]]; then
|
|
19
|
+
COMPREPLY=( $(compgen -W "$opts" -- "$cur") )
|
|
20
|
+
return 0
|
|
21
|
+
fi
|
|
22
|
+
}
|
|
23
|
+
complete -F _fad_check_complete fad-check
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
#compdef fad-check
|
|
2
|
+
# Zsh completion for fad-check (Fucking Autonomous Dependency Checker)
|
|
3
|
+
_fad_check() {
|
|
4
|
+
local -a opts
|
|
5
|
+
opts=(
|
|
6
|
+
'-s[root directory containing pom.xml files]:directory:_directories'
|
|
7
|
+
'--src[root directory containing pom.xml files]:directory:_directories'
|
|
8
|
+
'-t[output directory]:directory:_directories'
|
|
9
|
+
'--target[output directory]:directory:_directories'
|
|
10
|
+
'-e[regex of groupId to exclude]:regex:'
|
|
11
|
+
'--exclude[regex of groupId to exclude]:regex:'
|
|
12
|
+
'-a[query Maven Central]'
|
|
13
|
+
'--allLibs[query Maven Central]'
|
|
14
|
+
'-v[verbose]'
|
|
15
|
+
'--verbose[verbose]'
|
|
16
|
+
'--test[read-only]'
|
|
17
|
+
'--report[generate CVE/EOL/obsolete report]'
|
|
18
|
+
'--report-output[report output dir]:directory:_directories'
|
|
19
|
+
'--ignore-test[skip test-scoped deps]'
|
|
20
|
+
'--cve-refresh[force CVE re-download]'
|
|
21
|
+
'--cve-offline[use cached CVE only]'
|
|
22
|
+
'--snyk[run snyk and merge]'
|
|
23
|
+
'--completion[print shell completion]:shell:(bash zsh)'
|
|
24
|
+
)
|
|
25
|
+
_arguments $opts
|
|
26
|
+
}
|
|
27
|
+
_fad_check
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
{
|
|
2
|
+
"_comment": "Curated CPE vendor:product → ecosystem coord. Used by lib/cpe.js to upgrade confidence of CVE matches. Keys are lowercased. Values are arrays — one CPE may legitimately map to several Maven artifacts (e.g. fasterxml/jackson splits into databind / core / annotations).",
|
|
3
|
+
|
|
4
|
+
"byVendorProduct": {
|
|
5
|
+
"apache:log4j": ["log4j:log4j", "org.apache.logging.log4j:log4j-core", "org.apache.logging.log4j:log4j-api"],
|
|
6
|
+
"apache:log4j-core": ["org.apache.logging.log4j:log4j-core"],
|
|
7
|
+
"apache:log4j-api": ["org.apache.logging.log4j:log4j-api"],
|
|
8
|
+
"apache:struts": ["org.apache.struts:struts2-core"],
|
|
9
|
+
"apache:struts2-core": ["org.apache.struts:struts2-core"],
|
|
10
|
+
"apache:tomcat": ["org.apache.tomcat:tomcat-catalina", "org.apache.tomcat:tomcat-coyote", "org.apache.tomcat.embed:tomcat-embed-core"],
|
|
11
|
+
"apache:tomcat_jk_connector": ["org.apache.tomcat:tomcat-jk"],
|
|
12
|
+
"apache:commons_collections": ["commons-collections:commons-collections", "org.apache.commons:commons-collections4"],
|
|
13
|
+
"apache:commons_compress": ["org.apache.commons:commons-compress"],
|
|
14
|
+
"apache:commons_fileupload": ["commons-fileupload:commons-fileupload", "org.apache.commons:commons-fileupload2-core"],
|
|
15
|
+
"apache:commons_text": ["org.apache.commons:commons-text"],
|
|
16
|
+
"apache:commons_io": ["commons-io:commons-io", "org.apache.commons:commons-io"],
|
|
17
|
+
"apache:commons_beanutils": ["commons-beanutils:commons-beanutils"],
|
|
18
|
+
"apache:commons_configuration": ["org.apache.commons:commons-configuration2", "commons-configuration:commons-configuration"],
|
|
19
|
+
"apache:cxf": ["org.apache.cxf:cxf-core"],
|
|
20
|
+
"apache:cxf-core": ["org.apache.cxf:cxf-core"],
|
|
21
|
+
"apache:poi": ["org.apache.poi:poi", "org.apache.poi:poi-ooxml"],
|
|
22
|
+
"apache:httpclient": ["org.apache.httpcomponents:httpclient", "org.apache.httpcomponents.client5:httpclient5"],
|
|
23
|
+
"apache:httpcore": ["org.apache.httpcomponents:httpcore", "org.apache.httpcomponents.core5:httpcore5"],
|
|
24
|
+
"apache:shiro": ["org.apache.shiro:shiro-core"],
|
|
25
|
+
"apache:activemq": ["org.apache.activemq:activemq-broker", "org.apache.activemq:activemq-client"],
|
|
26
|
+
"apache:xalan-java": ["xalan:xalan"],
|
|
27
|
+
"apache:xerces2_java": ["xerces:xercesImpl"],
|
|
28
|
+
|
|
29
|
+
"fasterxml:jackson-databind": ["com.fasterxml.jackson.core:jackson-databind"],
|
|
30
|
+
"fasterxml:jackson": ["com.fasterxml.jackson.core:jackson-databind", "com.fasterxml.jackson.core:jackson-core", "com.fasterxml.jackson.core:jackson-annotations"],
|
|
31
|
+
|
|
32
|
+
"vmware:spring_framework": ["org.springframework:spring-core", "org.springframework:spring-web", "org.springframework:spring-webmvc", "org.springframework:spring-context", "org.springframework:spring-beans"],
|
|
33
|
+
"pivotal_software:spring_framework": ["org.springframework:spring-core", "org.springframework:spring-web", "org.springframework:spring-webmvc"],
|
|
34
|
+
"vmware:spring_boot": ["org.springframework.boot:spring-boot", "org.springframework.boot:spring-boot-autoconfigure"],
|
|
35
|
+
"vmware:spring_security": ["org.springframework.security:spring-security-core", "org.springframework.security:spring-security-web"],
|
|
36
|
+
"vmware:spring_cloud": ["org.springframework.cloud:spring-cloud-context"],
|
|
37
|
+
"vmware:spring_data_jpa": ["org.springframework.data:spring-data-jpa"],
|
|
38
|
+
|
|
39
|
+
"redhat:hibernate": ["org.hibernate:hibernate-core"],
|
|
40
|
+
"redhat:hibernate_orm": ["org.hibernate:hibernate-core", "org.hibernate.orm:hibernate-core"],
|
|
41
|
+
"redhat:hibernate-validator": ["org.hibernate:hibernate-validator", "org.hibernate.validator:hibernate-validator"],
|
|
42
|
+
"redhat:undertow": ["io.undertow:undertow-core"],
|
|
43
|
+
"redhat:wildfly": ["org.wildfly:wildfly-server"],
|
|
44
|
+
"redhat:keycloak": ["org.keycloak:keycloak-core", "org.keycloak:keycloak-services"],
|
|
45
|
+
"redhat:resteasy": ["org.jboss.resteasy:resteasy-core"],
|
|
46
|
+
|
|
47
|
+
"eclipse:jetty": ["org.eclipse.jetty:jetty-server", "org.eclipse.jetty:jetty-http", "org.eclipse.jetty:jetty-util"],
|
|
48
|
+
"eclipse:jetty_server": ["org.eclipse.jetty:jetty-server"],
|
|
49
|
+
"eclipse:vert.x": ["io.vertx:vertx-core"],
|
|
50
|
+
"eclipse:mosquitto": [],
|
|
51
|
+
|
|
52
|
+
"netty:netty": ["io.netty:netty-all", "io.netty:netty-codec", "io.netty:netty-codec-http", "io.netty:netty-handler", "io.netty:netty-common"],
|
|
53
|
+
|
|
54
|
+
"google:guava": ["com.google.guava:guava"],
|
|
55
|
+
"google:gson": ["com.google.code.gson:gson"],
|
|
56
|
+
"google:protobuf-java": ["com.google.protobuf:protobuf-java"],
|
|
57
|
+
"google:protobuf": ["com.google.protobuf:protobuf-java"],
|
|
58
|
+
|
|
59
|
+
"squareup:okhttp": ["com.squareup.okhttp3:okhttp", "com.squareup.okhttp:okhttp"],
|
|
60
|
+
"squareup:retrofit": ["com.squareup.retrofit2:retrofit"],
|
|
61
|
+
|
|
62
|
+
"snakeyaml_project:snakeyaml": ["org.yaml:snakeyaml"],
|
|
63
|
+
"thoughtworks:xstream": ["com.thoughtworks.xstream:xstream"],
|
|
64
|
+
"oracle:mysql_connectors": ["mysql:mysql-connector-java", "com.mysql:mysql-connector-j"],
|
|
65
|
+
"postgresql:postgresql_jdbc_driver": ["org.postgresql:postgresql"],
|
|
66
|
+
"h2database:h2": ["com.h2database:h2"],
|
|
67
|
+
|
|
68
|
+
"jsoup:jsoup": ["org.jsoup:jsoup"],
|
|
69
|
+
"slf4j:slf4j": ["org.slf4j:slf4j-api", "org.slf4j:slf4j-simple"],
|
|
70
|
+
"qos-ch:logback": ["ch.qos.logback:logback-core", "ch.qos.logback:logback-classic"],
|
|
71
|
+
"qos:logback": ["ch.qos.logback:logback-core", "ch.qos.logback:logback-classic"],
|
|
72
|
+
|
|
73
|
+
"npm:lodash": ["npm:lodash"],
|
|
74
|
+
"npm:axios": ["npm:axios"],
|
|
75
|
+
"npm:express": ["npm:express"],
|
|
76
|
+
"npm:minimist": ["npm:minimist"],
|
|
77
|
+
"npm:node-fetch": ["npm:node-fetch"],
|
|
78
|
+
"npm:moment": ["npm:moment"],
|
|
79
|
+
"npm:jquery": ["npm:jquery"],
|
|
80
|
+
"npm:yargs-parser": ["npm:yargs-parser"],
|
|
81
|
+
"npm:tar": ["npm:tar"],
|
|
82
|
+
"npm:json5": ["npm:json5"],
|
|
83
|
+
"npm:semver": ["npm:semver"],
|
|
84
|
+
"npm:underscore": ["npm:underscore"],
|
|
85
|
+
"npm:async": ["npm:async"],
|
|
86
|
+
"npm:debug": ["npm:debug"],
|
|
87
|
+
"npm:braces": ["npm:braces"],
|
|
88
|
+
"npm:micromatch": ["npm:micromatch"],
|
|
89
|
+
|
|
90
|
+
"axios:axios": ["npm:axios"],
|
|
91
|
+
"lodash:lodash": ["npm:lodash"],
|
|
92
|
+
"openjsf:express": ["npm:express"],
|
|
93
|
+
"json5:json5": ["npm:json5"],
|
|
94
|
+
"npmjs:tar": ["npm:tar"],
|
|
95
|
+
"isaacs:minimatch": ["npm:minimatch"]
|
|
96
|
+
},
|
|
97
|
+
|
|
98
|
+
"byProduct": {
|
|
99
|
+
"log4j": ["log4j:log4j"],
|
|
100
|
+
"log4j-core": ["org.apache.logging.log4j:log4j-core"],
|
|
101
|
+
"jackson-databind": ["com.fasterxml.jackson.core:jackson-databind"],
|
|
102
|
+
"tomcat": ["org.apache.tomcat:tomcat-catalina", "org.apache.tomcat.embed:tomcat-embed-core"],
|
|
103
|
+
"struts": ["org.apache.struts:struts2-core"],
|
|
104
|
+
"spring_framework": ["org.springframework:spring-core"],
|
|
105
|
+
"spring_boot": ["org.springframework.boot:spring-boot"],
|
|
106
|
+
"jetty": ["org.eclipse.jetty:jetty-server"],
|
|
107
|
+
"netty": ["io.netty:netty-all"],
|
|
108
|
+
"guava": ["com.google.guava:guava"],
|
|
109
|
+
"hibernate-validator": ["org.hibernate.validator:hibernate-validator"],
|
|
110
|
+
"snakeyaml": ["org.yaml:snakeyaml"]
|
|
111
|
+
}
|
|
112
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
{
|
|
2
|
+
"by_group_artifact": {
|
|
3
|
+
"org.springframework.boot:spring-boot": { "product": "spring-boot", "label": "Spring Boot" },
|
|
4
|
+
"org.springframework.boot:spring-boot-starter-parent": { "product": "spring-boot", "label": "Spring Boot" },
|
|
5
|
+
"org.springframework.boot:spring-boot-dependencies": { "product": "spring-boot", "label": "Spring Boot" },
|
|
6
|
+
"org.springframework:spring-core": { "product": "spring-framework", "label": "Spring Framework" },
|
|
7
|
+
"org.springframework:spring-context": { "product": "spring-framework", "label": "Spring Framework" },
|
|
8
|
+
"org.springframework:spring-web": { "product": "spring-framework", "label": "Spring Framework" },
|
|
9
|
+
"org.springframework:spring-webmvc": { "product": "spring-framework", "label": "Spring Framework" },
|
|
10
|
+
"org.springframework:spring-beans": { "product": "spring-framework", "label": "Spring Framework" },
|
|
11
|
+
"org.springframework.security:spring-security-core": { "product": "spring-framework", "label": "Spring Security" },
|
|
12
|
+
"org.springframework.security:spring-security-web": { "product": "spring-framework", "label": "Spring Security" },
|
|
13
|
+
"org.hibernate:hibernate-core": { "product": "hibernate", "label": "Hibernate ORM" },
|
|
14
|
+
"org.hibernate.orm:hibernate-core": { "product": "hibernate", "label": "Hibernate ORM" },
|
|
15
|
+
"org.apache.tomcat:tomcat-catalina": { "product": "tomcat", "label": "Apache Tomcat" },
|
|
16
|
+
"org.apache.tomcat.embed:tomcat-embed-core": { "product": "tomcat", "label": "Apache Tomcat" },
|
|
17
|
+
"org.eclipse.jetty:jetty-server": { "product": "jetty", "label": "Eclipse Jetty" },
|
|
18
|
+
"io.netty:netty-all": { "product": "netty", "label": "Netty" },
|
|
19
|
+
"io.netty:netty-handler": { "product": "netty", "label": "Netty" },
|
|
20
|
+
"org.apache.maven:maven-core": { "product": "maven", "label": "Apache Maven" },
|
|
21
|
+
"junit:junit": { "product": "junit", "label": "JUnit 4" },
|
|
22
|
+
"org.junit.jupiter:junit-jupiter": { "product": "junit", "label": "JUnit 5" },
|
|
23
|
+
"org.apache.logging.log4j:log4j-core": { "product": "log4j", "label": "Apache Log4j 2" },
|
|
24
|
+
"ch.qos.logback:logback-classic": { "product": "logback", "label": "Logback" },
|
|
25
|
+
"com.fasterxml.jackson.core:jackson-databind": { "product": "jackson", "label": "Jackson Databind" }
|
|
26
|
+
},
|
|
27
|
+
"by_group_prefix": {
|
|
28
|
+
"org.springframework.boot": { "product": "spring-boot", "label": "Spring Boot" },
|
|
29
|
+
"org.springframework.security": { "product": "spring-framework", "label": "Spring Security" },
|
|
30
|
+
"org.springframework": { "product": "spring-framework", "label": "Spring Framework" },
|
|
31
|
+
"org.hibernate": { "product": "hibernate", "label": "Hibernate ORM" },
|
|
32
|
+
"io.netty": { "product": "netty", "label": "Netty" }
|
|
33
|
+
}
|
|
34
|
+
}
|