mirror of
https://github.com/prowler-cloud/prowler.git
synced 2026-07-04 19:21:51 +00:00
f2e6a3264d
Co-authored-by: Pablo F.G <pablo.fernandez@prowler.com> Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
98 lines
2.6 KiB
JavaScript
98 lines
2.6 KiB
JavaScript
const fs = require("fs");
|
|
const path = require("path");
|
|
|
|
function readJSON(p) {
|
|
return JSON.parse(fs.readFileSync(p, "utf8"));
|
|
}
|
|
|
|
function getInstalledVersion(pkgName) {
|
|
try {
|
|
const parts = pkgName.split("/");
|
|
const pkgPath = path.join("node_modules", ...parts, "package.json");
|
|
const meta = readJSON(pkgPath);
|
|
return meta.version;
|
|
} catch (e) {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
function collect(sectionName, obj) {
|
|
if (!obj) return [];
|
|
return Object.entries(obj).map(([name, declared]) => {
|
|
const installed = getInstalledVersion(name);
|
|
return {
|
|
section: sectionName,
|
|
name,
|
|
from: declared,
|
|
to: installed || null,
|
|
strategy: "installed",
|
|
};
|
|
});
|
|
}
|
|
|
|
function main() {
|
|
// If node_modules is missing, skip to avoid generating noisy diffs
|
|
if (!fs.existsSync("node_modules")) {
|
|
console.log("Skip: node_modules not found. Run npm install first.");
|
|
return;
|
|
}
|
|
|
|
const pkg = readJSON("package.json");
|
|
const entries = [
|
|
...collect("dependencies", pkg.dependencies),
|
|
...collect("devDependencies", pkg.devDependencies),
|
|
];
|
|
|
|
// Stable sort by section then name
|
|
entries.sort((a, b) =>
|
|
a.section === b.section
|
|
? a.name.localeCompare(b.name)
|
|
: a.section.localeCompare(b.section),
|
|
);
|
|
|
|
const outPath = path.join(process.cwd(), "dependency-log.json");
|
|
// Merge with previous to preserve generatedAt when unchanged
|
|
let prevMap = new Map();
|
|
if (fs.existsSync(outPath)) {
|
|
try {
|
|
const prev = JSON.parse(fs.readFileSync(outPath, "utf8"));
|
|
for (const e of prev) {
|
|
prevMap.set(`${e.section}::${e.name}`, e);
|
|
}
|
|
} catch {}
|
|
}
|
|
|
|
const now = new Date().toISOString();
|
|
const merged = entries.map((e) => {
|
|
const key = `${e.section}::${e.name}`;
|
|
const prev = prevMap.get(key);
|
|
if (!prev) {
|
|
// New entry: keep declared as from
|
|
return { ...e, generatedAt: now };
|
|
}
|
|
|
|
// If installed version changed, set from to previous installed version
|
|
if (prev.to !== e.to) {
|
|
return { ...e, from: prev.to, generatedAt: now };
|
|
}
|
|
|
|
// Otherwise preserve previous 'from' and timestamp
|
|
return { ...e, from: prev.from, generatedAt: prev.generatedAt || now };
|
|
});
|
|
|
|
const nextContent = JSON.stringify(merged, null, 2) + "\n";
|
|
if (fs.existsSync(outPath)) {
|
|
try {
|
|
const prevContent = fs.readFileSync(outPath, "utf8");
|
|
if (prevContent === nextContent) {
|
|
console.log(`No changes for ${outPath} (entries: ${entries.length}).`);
|
|
return;
|
|
}
|
|
} catch {}
|
|
}
|
|
fs.writeFileSync(outPath, nextContent);
|
|
console.log(`Updated ${outPath} with ${entries.length} entries.`);
|
|
}
|
|
|
|
main();
|