Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
edc4379
Add verbose CLI logging and update 1
JosephMaynard Feb 5, 2026
0c98ec6
Add new SVG assets to report
JosephMaynard Feb 5, 2026
ba76940
Fix report dependency link filters
JosephMaynard Feb 6, 2026
dfd50df
Fix dependency report link behavior
JosephMaynard Feb 6, 2026
f2272bd
Document dependency-radar scan
JosephMaynard Feb 8, 2026
2a9dff6
Document dependency scan process
JosephMaynard Feb 8, 2026
49b79e9
Document usage metrics and add usage
JosephMaynard Feb 8, 2026
0616c26
Document dependency usage metrics
JosephMaynard Feb 8, 2026
6e94c85
Document fixtures and link fixes
JosephMaynard Feb 8, 2026
bc5645d
Document fixture logic and scaffold
JosephMaynard Feb 8, 2026
90138ef
Add top fixtures and fix dep links
JosephMaynard Feb 8, 2026
8e29a93
Fix report links and dotfile checks
JosephMaynard Feb 8, 2026
fba095d
Fix report links and config regexes
JosephMaynard Feb 8, 2026
6484e6d
Adjust peer tooling classification
JosephMaynard Feb 8, 2026
62b5aba
Fix npm alias parsing inconsistences
JosephMaynard Feb 8, 2026
7d48ecf
Investigate dependencies parse bugs
JosephMaynard Feb 8, 2026
c82303d
Fix npm alias parsing and docs
JosephMaynard Feb 9, 2026
f6b795e
Fix npm alias parsing
JosephMaynard Feb 9, 2026
139121b
Fix npm alias parsing and docs
JosephMaynard Feb 9, 2026
1e567c9
Investigate upgrade blockers accurac
JosephMaynard Feb 9, 2026
b406565
Improve npm alias parsing errors
JosephMaynard Feb 9, 2026
0df63bf
Design tweaks
JosephMaynard Feb 12, 2026
da680e1
Exclude workspace packages from scan
JosephMaynard Feb 12, 2026
209e848
Filter workspace packages from deps
JosephMaynard Feb 12, 2026
4997be1
Update report UI templates and read4
JosephMaynard Feb 12, 2026
8441dfe
Update report template from UI
JosephMaynard Feb 12, 2026
b6a2c4e
Update report UI mobile filters
JosephMaynard Feb 12, 2026
075c3c2
Update mobile filters UI
JosephMaynard Feb 13, 2026
3fc67b0
Investigate dependency scan failure
JosephMaynard Feb 13, 2026
9bc0084
Collect extended project metadata
JosephMaynard Feb 14, 2026
adb0023
Document license mismatch risk
JosephMaynard Feb 15, 2026
a370999
Add desktop licence filters
JosephMaynard Feb 17, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
190 changes: 171 additions & 19 deletions README.md

Large diffs are not rendered by default.

431 changes: 386 additions & 45 deletions dist/aggregator.js

Large diffs are not rendered by default.

477 changes: 399 additions & 78 deletions dist/cli.js

Large diffs are not rendered by default.

4 changes: 2 additions & 2 deletions dist/report-assets.js

Large diffs are not rendered by default.

375 changes: 232 additions & 143 deletions dist/report.js

Large diffs are not rendered by default.

12 changes: 10 additions & 2 deletions dist/runners/npmLs.js
Original file line number Diff line number Diff line change
Expand Up @@ -213,13 +213,21 @@ function normalizeNpmNode(name, node) {
return out;
}
function normalizePnpmTree(data) {
const roots = Array.isArray(data) ? data : [data];
const root = roots.find((entry) => entry && typeof entry === 'object');
const roots = (Array.isArray(data) ? data : [data]).filter((entry) => entry && typeof entry === 'object');
const root = roots.find((entry) => !isPnpmErrorPayload(entry));
if (!root || typeof root !== 'object')
return undefined;
const dependencies = collectPnpmDependencyMap(root);
return { dependencies };
}
function isPnpmErrorPayload(node) {
if (!node || typeof node !== 'object')
return false;
if (!('error' in node))
return false;
const error = node.error;
return typeof error === 'string' || (error !== null && typeof error === 'object');
}
function collectPnpmDependencyMap(node) {
const out = {};
const groups = ['dependencies', 'devDependencies', 'optionalDependencies', 'peerDependencies'];
Expand Down
52 changes: 34 additions & 18 deletions dist/runners/npmOutdated.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,24 +11,7 @@ function normalizeOutdatedOutput(tool, data) {
return undefined;
if (typeof data === "object" && !Array.isArray(data) && !data.type)
return data;
if (Array.isArray(data)) {
// pnpm often returns arrays of rows
const out = {};
for (const entry of data) {
if (!entry || typeof entry !== "object")
continue;
const name = entry.name || entry.packageName;
if (typeof name !== "string" || !name.trim())
continue;
out[name] = {
current: entry.current || entry.currentVersion || entry.from,
latest: entry.latest || entry.latestVersion || entry.to,
wanted: entry.wanted,
};
}
return Object.keys(out).length > 0 ? out : undefined;
}
// Yarn JSONL table output
// Yarn JSONL table output (classic) must be checked before generic array parsing.
const entries = Array.isArray(data) ? data : [data];
const tableEntry = entries.find((e) => { var _a; return e && typeof e === "object" && (e.type === "table" || ((_a = e.data) === null || _a === void 0 ? void 0 : _a.body)); });
const table = (tableEntry === null || tableEntry === void 0 ? void 0 : tableEntry.data) || tableEntry;
Expand All @@ -55,10 +38,31 @@ function normalizeOutdatedOutput(tool, data) {
}
return Object.keys(out).length > 0 ? out : undefined;
}
if (Array.isArray(data)) {
// pnpm often returns arrays of rows
const out = {};
for (const entry of data) {
if (!entry || typeof entry !== "object")
continue;
const name = entry.name || entry.packageName;
if (typeof name !== "string" || !name.trim())
continue;
out[name] = {
current: entry.current || entry.currentVersion || entry.from,
latest: entry.latest || entry.latestVersion || entry.to,
wanted: entry.wanted,
};
}
return Object.keys(out).length > 0 ? out : undefined;
}
if (tool === "pnpm" && data.outdated)
return data.outdated;
return undefined;
}
function isYarnOutdatedUnsupported(result) {
const output = `${result.stdout}\n${result.stderr}`;
return /Couldn't find a script named "outdated"/i.test(output);
}
function buildOutdatedCommand(tool) {
if (tool === "pnpm") {
return {
Expand Down Expand Up @@ -93,6 +97,18 @@ async function runPackageOutdated(projectPath, tempDir, tool) {
await (0, utils_1.writeJsonFile)(targetFile, normalized);
return { ok: true, data: normalized, file: targetFile };
}
if (tool === "yarn" && isYarnOutdatedUnsupported(result)) {
await (0, utils_1.writeJsonFile)(targetFile, {
stdout: result.stdout,
stderr: result.stderr,
code: result.code,
});
return {
ok: false,
error: 'Yarn outdated is not available in this Yarn release (common on Yarn Berry).',
file: targetFile,
};
}
await (0, utils_1.writeJsonFile)(targetFile, {
stdout: result.stdout,
stderr: result.stderr,
Expand Down
10 changes: 8 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -24,17 +24,23 @@
"fixtures:install:yarn": "cd test-fixtures/yarn-workspace && yarn install",
"fixtures:install:yarn-berry": "cd test-fixtures/yarn-berry-workspace && yarn install",
"fixtures:install:optional": "cd test-fixtures/optional-deps && npm install",
"fixtures:install:license": "cd test-fixtures/license-edge-cases && npm install",
"fixtures:install:execution": "cd test-fixtures/execution-signals && npm install",
"fixtures:install:usage": "cd test-fixtures/usage-classification && npm install",
"fixtures:scan:npm": "npm run dev -- --project test-fixtures/npm-basic --out test-fixtures/npm-basic/dependency-radar.html --json --keep-temp",
"fixtures:scan:npm-heavy": "npm run dev -- --project test-fixtures/npm-heavy --out test-fixtures/npm-heavy/dependency-radar.html --json --keep-temp",
"fixtures:scan:pnpm": "npm run dev -- --project test-fixtures/pnpm-workspace --out test-fixtures/pnpm-workspace/dependency-radar.html --json --keep-temp",
"fixtures:scan:pnpm-hoisted": "npm run dev -- --project test-fixtures/pnpm-workspace-hoisted --out test-fixtures/pnpm-workspace-hoisted/dependency-radar.html --json --keep-temp",
"fixtures:scan:yarn": "npm run dev -- --project test-fixtures/yarn-workspace --out test-fixtures/yarn-workspace/dependency-radar.html --json --keep-temp",
"fixtures:scan:yarn-berry": "npm run dev -- --project test-fixtures/yarn-berry-workspace --out test-fixtures/yarn-berry-workspace/dependency-radar.html --json --keep-temp",
"fixtures:scan:optional": "npm run dev -- --project test-fixtures/optional-deps --out test-fixtures/optional-deps/dependency-radar.html --json --keep-temp",
"fixtures:scan:license": "npm run dev -- --project test-fixtures/license-edge-cases --out test-fixtures/license-edge-cases/dependency-radar.json --json --keep-temp",
"fixtures:scan:execution": "npm run dev -- --project test-fixtures/execution-signals --out test-fixtures/execution-signals/dependency-radar.json --json --keep-temp",
"fixtures:scan:usage": "npm run dev -- --project test-fixtures/usage-classification --out test-fixtures/usage-classification/dependency-radar.json --json --keep-temp",
"fixtures:scan:no-node-modules": "npm run dev -- --project test-fixtures/no-node-modules --out test-fixtures/no-node-modules/dependency-radar.html --json --keep-temp",
"fixtures:install": "npm run fixtures:install:npm && npm run fixtures:install:npm-heavy && npm run fixtures:install:pnpm && npm run fixtures:install:yarn",
"fixtures:scan": "npm run fixtures:scan:npm && npm run fixtures:scan:npm-heavy && npm run fixtures:scan:pnpm && npm run fixtures:scan:pnpm-hoisted && npm run fixtures:scan:yarn && npm run fixtures:scan:yarn-berry && npm run fixtures:scan:optional",
"fixtures:install:all": "npm run fixtures:install:npm && npm run fixtures:install:npm-heavy && npm run fixtures:install:pnpm && npm run fixtures:install:pnpm-hoisted && npm run fixtures:install:yarn && npm run fixtures:install:yarn-berry && npm run fixtures:install:optional",
"fixtures:scan": "npm run fixtures:scan:npm && npm run fixtures:scan:npm-heavy && npm run fixtures:scan:pnpm && npm run fixtures:scan:pnpm-hoisted && npm run fixtures:scan:yarn && npm run fixtures:scan:yarn-berry && npm run fixtures:scan:optional && npm run fixtures:scan:license && npm run fixtures:scan:execution && npm run fixtures:scan:usage",
"fixtures:install:all": "npm run fixtures:install:npm && npm run fixtures:install:npm-heavy && npm run fixtures:install:pnpm && npm run fixtures:install:pnpm-hoisted && npm run fixtures:install:yarn && npm run fixtures:install:yarn-berry && npm run fixtures:install:optional && npm run fixtures:install:license && npm run fixtures:install:execution && npm run fixtures:install:usage",
"prepublishOnly": "npm run build",
"test": "echo \"Error: no test specified\" && exit 1"
},
Expand Down
2 changes: 1 addition & 1 deletion report-ui/dist/report.css

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion report-ui/dist/report.iife.js

Large diffs are not rendered by default.

Loading