109 lines
2.8 KiB
TypeScript
109 lines
2.8 KiB
TypeScript
import { readFileSync, readdirSync } from 'fs';
|
|
import { join } from 'path';
|
|
import * as chalk from 'chalk';
|
|
import getDiscrepancies from './discrepancies';
|
|
import getMissingDependencies from './missing';
|
|
|
|
const argv = require('yargs')
|
|
.usage('Check projects for dependency discrepancies.')
|
|
.option('projects', {
|
|
alias: 'p',
|
|
type: 'array',
|
|
description: 'Projects to check',
|
|
})
|
|
.option('missing', {
|
|
alias: 'm',
|
|
type: 'boolean',
|
|
default: true,
|
|
description: 'Check for missing dependencies',
|
|
})
|
|
.option('discrepancies', {
|
|
alias: 'd',
|
|
type: 'boolean',
|
|
default: true,
|
|
description: 'Check for discrepancies between package and dev dependencies',
|
|
})
|
|
.option('verbose', {
|
|
alias: 'v',
|
|
type: 'boolean',
|
|
description: 'Run with verbose logging',
|
|
}).argv;
|
|
|
|
(async () => {
|
|
const { devDependencies } = JSON.parse(
|
|
readFileSync(`./package.json`).toString()
|
|
);
|
|
|
|
const packagesDirectory = join(__dirname, '../..', 'packages');
|
|
|
|
const projects =
|
|
argv.projects ||
|
|
readdirSync(packagesDirectory, { withFileTypes: true })
|
|
.filter((dirent) => dirent.isDirectory())
|
|
.map((dirent) => dirent.name);
|
|
|
|
const results = await Promise.all(
|
|
projects
|
|
.sort()
|
|
.map((name) => ({ name }))
|
|
.map(async (project) => {
|
|
const projectPath = join(packagesDirectory, project.name);
|
|
const { dependencies } = JSON.parse(
|
|
readFileSync(`${projectPath}/package.json`).toString()
|
|
);
|
|
|
|
const missing = argv.missing
|
|
? await getMissingDependencies(
|
|
project.name,
|
|
projectPath,
|
|
dependencies,
|
|
argv.verbose
|
|
)
|
|
: [];
|
|
|
|
const discrepancies = argv.discrepancies
|
|
? getDiscrepancies(dependencies, devDependencies)
|
|
: [];
|
|
|
|
return { ...project, missing, discrepancies };
|
|
})
|
|
);
|
|
|
|
const total = { missing: 0, discrepancies: 0 };
|
|
|
|
results.forEach(({ name, missing, discrepancies }) => {
|
|
if (!missing.length && !discrepancies.length) {
|
|
return;
|
|
}
|
|
|
|
console.log(`${chalk.inverse.bold.cyan(` ${name.toUpperCase()} `)}`);
|
|
|
|
if (missing.length > 0) {
|
|
total.missing += missing.length;
|
|
console.log(
|
|
`⚠️ ${chalk.bold.inverse(` Missing `)}\n${missing
|
|
.sort()
|
|
.map(
|
|
(p) => ` ${devDependencies[p] ? `${p}@${devDependencies[p]}` : p}`
|
|
)
|
|
.join(`\n`)}\n`
|
|
);
|
|
}
|
|
|
|
if (discrepancies.length > 0) {
|
|
total.discrepancies += discrepancies.length;
|
|
console.log(
|
|
`⛔ ${chalk.bold.inverse(` Discrepancies `)}\n${discrepancies
|
|
.map((d) => ` ${d}`)
|
|
.join(`\n`)}\n`
|
|
);
|
|
}
|
|
});
|
|
|
|
if (total.discrepancies > 0) {
|
|
process.exit(1);
|
|
}
|
|
|
|
process.exit(0);
|
|
})().catch((err) => console.log(err));
|