flybrain/tools/check_package_age.mjs
acamilo 660c3cf00d
Some checks failed
ci / node 22 (test + typecheck) (push) Has been cancelled
ci / rust stable (cargo test --workspace --release) (push) Has been cancelled
ci / infra/tests/lint.sh (push) Has been cancelled
ci / playwright apps/stage (allowed to fail) (push) Has been cancelled
flybrain v0.4.0: public tree (history retained privately)
2026-09-21 15:09:46 +00:00

29 lines
1.3 KiB
JavaScript

import { readFile } from 'node:fs/promises';
const minimumAgeMs = 30 * 24 * 60 * 60 * 1000;
const cutoff = new Date(Date.now() - minimumAgeMs);
const lock = JSON.parse(await readFile(new URL('../package-lock.json', import.meta.url), 'utf8'));
const dependencies = new Map();
for (const [path, metadata] of Object.entries(lock.packages)) {
if (!path.startsWith('node_modules/') || !metadata.version) continue;
const name = path.split('node_modules/').at(-1);
dependencies.set(`${name}@${metadata.version}`, { name, version: metadata.version });
}
const failures = [];
for (const { name, version } of dependencies.values()) {
const response = await fetch(`https://registry.npmjs.org/${name.replace('/', '%2f')}`);
if (!response.ok) throw new Error(`Unable to inspect ${name}: HTTP ${response.status}`);
const packument = await response.json();
const published = packument.time?.[version];
if (!published) failures.push(`${name}@${version}: publication date unavailable`);
else if (new Date(published) > cutoff) failures.push(`${name}@${version}: published ${published}`);
}
if (failures.length) {
console.error(`Packages newer than the 30-day cutoff (${cutoff.toISOString()}):\n${failures.join('\n')}`);
process.exitCode = 1;
} else {
console.log(`${dependencies.size} locked packages were published before ${cutoff.toISOString()}`);
}