Skip to content

Commit

Permalink
feat(check-package-dependencies): improve error messages and add color
Browse files Browse the repository at this point in the history
  • Loading branch information
christophehurpeau committed Mar 13, 2021
1 parent fede23a commit d89820c
Show file tree
Hide file tree
Showing 10 changed files with 64 additions and 39 deletions.
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
/* eslint-disable complexity */

'use strict';

const semver = require('semver');
Expand Down Expand Up @@ -63,7 +61,8 @@ exports.checkDirectDuplicateDependencies = (
if (shouldWarns) warnedFor.add(depKey);

reportError(
`Invalid duplicate dependency "${depKey}": "${versions[0]}" (in ${versionInType}) should satisfies "${range}" from "${depPkg.name}" ${depType}`,
`Invalid duplicate dependency "${depKey}"`,
`"${versions[0]}" (in ${versionInType}) should satisfies "${range}" from "${depPkg.name}" ${depType}.`,
shouldWarns,
);
});
Expand Down
5 changes: 2 additions & 3 deletions packages/check-package-dependencies/lib/checkExactVersions.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,8 @@ exports.checkExactVersions = (pkg, pkgPath, type) => {
for (const [depKey, version] of Object.entries(pkgDependencies)) {
if (version.startsWith('^') || version.startsWith('~')) {
reportError(
`Unexpected range dependency in "${type}" for "${depKey}": "${version}" should be exact ("${version.slice(
1,
)}")`,
`Unexpected range dependency in "${type}" for "${depKey}"`,
`expecting "${version}" to be exact "${version.slice(1)}".`,
);
return;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,22 +15,24 @@ exports.checkIdenticalVersions = (
Object.keys(deps).forEach((depKey) => {
const version = pkgDependencies[depKey];
if (!version) {
reportError(`Unexpected missing ${type} for "${depKey}"`);
reportError(`Unexpected missing ${type} for "${depKey}".`);
return;
}

deps[depKey].forEach((depKeyIdentical) => {
const value = pkgDependencies[depKeyIdentical];
if (!value) {
reportError(
`Missing "${depKeyIdentical}" in ${type}, it should be "${version}"`,
`Missing "${depKeyIdentical}" in ${type}`,
`it should be "${version}".`,
onlyWarnsFor.includes(depKey),
);
}

if (value !== version) {
reportError(
`Invalid "${depKeyIdentical}" in ${type}, expecting "${value}" be "${version}"`,
`Invalid "${depKeyIdentical}" in ${type}`,
`expecting "${value}" be "${version}".`,
onlyWarnsFor.includes(depKey),
);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,14 +21,15 @@ exports.checkIdenticalVersionsThanDependency = (
const version = dependencies[depKey];
if (!version) {
reportError(
`Unexpected missing dependency version in "${depPkg.name}" for "${depKey}"`,
`Unexpected missing dependency version in "${depPkg.name}" for "${depKey}".`,
);
return;
}

if (version.startsWith('^') || version.startsWith('~')) {
reportError(
`Unexpected range dependency in "${depPkg.name}" for "${depKey}", perhaps use checkSatisfiesVersionsFromDependency() instead`,
`Unexpected range dependency in "${depPkg.name}" for "${depKey}"`,
'perhaps use checkSatisfiesVersionsFromDependency() instead.',
);
return;
}
Expand All @@ -37,14 +38,16 @@ exports.checkIdenticalVersionsThanDependency = (

if (!value) {
reportError(
`Missing "${depKey}" in ${type}: expecting to be "${version}"`,
`Missing "${depKey}" in ${type}`,
`expecting to be "${version}".`,
onlyWarnsFor.includes(depKey),
);
}

if (value !== version) {
reportError(
`Invalid "${depKey}" in ${type}: expecting "${value}" be "${version}"`,
`Invalid "${depKey}" in ${type}`,
`expecting "${value}" to be "${version}".`,
onlyWarnsFor.includes(depKey),
);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ exports.checkNoDependencies = (

const reportError = createReportError('No dependencies', pkgPath);
reportError(
`Unexpected ${type}, you should move them in ${moveToSuggestion}`,
`Unexpected ${type}`,
`you should move them in ${moveToSuggestion}`,
);
};
45 changes: 28 additions & 17 deletions packages/check-package-dependencies/lib/checkPeerDependencies.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
/* eslint-disable complexity */

'use strict';

const semver = require('semver');
Expand All @@ -15,34 +17,43 @@ exports.checkPeerDependencies = (
const reportError = createReportError('Peer Dependencies', pkgPath);
const { peerDependencies, peerDependenciesMeta = {} } = depPkg;

const pkgDependenciesList = allowedPeerIn
.map((allowedType) => pkg[allowedType])
.filter(Boolean);
const allowedPeerInExisting = allowedPeerIn.filter((type) => pkg[type]);

for (const [peerDepKey, range] of Object.entries(peerDependencies)) {
const versions = pkgDependenciesList
.map((d) => d[peerDepKey])
.filter(Boolean);
if (versions.length === 0) {
const versionsIn = allowedPeerInExisting.filter(
(type) => pkg[type][peerDepKey],
);
if (versionsIn.length === 0) {
if (
peerDependenciesMeta[peerDepKey] &&
peerDependenciesMeta[peerDepKey].optional
) {
return;
}
reportError(
`Missing "${peerDepKey}" peer dependency from "${depPkg.name}" in ${type}, it should satisfies "${range}"`,
onlyWarnsFor.includes(peerDepKey),
);
} else if (versions.length > 1) {
reportError(
`${peerDepKey} is present in both devDependencies and dependencies, please place it only in dependencies`,
);
} else if (!semver.satisfies(semver.minVersion(versions[0]), range)) {
reportError(
`Invalid "${peerDepKey}" peer dependency from "${depPkg.name}" in ${type}: "${versions[0]}" should satisfies "${range}"`,
`Missing "${peerDepKey}" peer dependency from "${depPkg.name}" in ${type}`,
`it should satisfies "${range}"`,
onlyWarnsFor.includes(peerDepKey),
);
} else {
const versions = versionsIn.map((type) => pkg[type][peerDepKey]);
if (versions.length > 1) {
reportError(
`${peerDepKey} is present in both devDependencies and dependencies`,
'place it only in dependencies',
);
return;
}

versions.forEach((version, index) => {
if (!semver.satisfies(semver.minVersion(version), range)) {
reportError(
`Invalid "${peerDepKey}" peer dependency`,
`"${version}" (in ${allowedPeerInExisting[index]}) should satisfies "${range}" from "${depPkg.name}" ${type}`,
onlyWarnsFor.includes(peerDepKey),
);
}
});
}
}
};
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ exports.checkResolutionsHasExplanation = (

Object.keys(pkgResolutions).forEach((depKey) => {
if (!pkgResolutionsExplained[depKey]) {
reportError(`Missing "${depKey}" in resolutionsExplained`);
reportError(`Missing "${depKey}" in resolutionsExplained.`);
}
});

Expand All @@ -29,7 +29,8 @@ exports.checkResolutionsHasExplanation = (
});
if (error) {
reportError(
`Invalid message for "${depKey}" in resolutionsExplained: ${error}.`,
`Invalid message for "${depKey}" in resolutionsExplained`,
`${error}.`,
);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,20 +22,22 @@ exports.checkSatisfiesVersionsFromDependency = (
const range = dependencies[depKey];
if (!range) {
throw new Error(
`Unexpected missing dependency range in "${depPkg.name}" for "${depKey}"`,
`Unexpected missing dependency range in "${depPkg.name}" for "${depKey}".`,
);
}

const version = pkgDependencies[depKey];

if (!version) {
reportError(
`Missing "${depKey}" in ${type}, it should satisfies "${range}"`,
`Missing "${depKey}" in ${type}`,
`should satisfies "${range}" from "${depPkg.name}" ${depKey}.`,
onlyWarnsFor.includes(depKey),
);
} else if (!semver.satisfies(semver.minVersion(version), range)) {
reportError(
`Invalid "${depKey}" in ${type}, it should satisfies "${depPkg.name}" from "${depPkg.name}": "${version}" should satisfies "${range}"`,
`Invalid "${depKey}" in ${type}`,
`"${version}" (in "${depKey}") should satisfies "${range}" from "${depPkg.name}" ${depKey}.`,
onlyWarnsFor.includes(depKey),
);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,16 +1,22 @@
'use strict';

const chalk = require('chalk');

let titleDisplayed = null;
let pkgPathDisplayed = null;
exports.createReportError = (title, pkgPath) => {
return (msg, onlyWarns) => {
return function reportError(msgTitle, msgInfo, onlyWarns) {
if (titleDisplayed !== title || pkgPath !== pkgPathDisplayed) {
if (titleDisplayed) console.error();
console.error(`== ${title} in ${pkgPath} ==`);
console.error(chalk.cyan(`== ${title} in ${pkgPath} ==`));
titleDisplayed = title;
pkgPathDisplayed = pkgPath;
}
console.error((onlyWarns ? '⚠ ' : '❌ ') + msg);
console.error(
`${
onlyWarns ? chalk.yellow(`⚠ ${msgTitle}`) : chalk.red(`❌ ${msgTitle}`)
}${msgInfo ? `: ${msgInfo}` : ''}`,
);
if (!onlyWarns) {
// console.trace();
process.exitCode = 1;
Expand Down
1 change: 1 addition & 0 deletions packages/check-package-dependencies/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
},
"pob": {},
"dependencies": {
"chalk": "^4.1.0",
"glob": "^7.1.6",
"semver": "^7.3.4"
}
Expand Down

0 comments on commit d89820c

Please sign in to comment.