Skip to content

Commit

Permalink
fix: make sure all dependencies matches peerdependency range before s…
Browse files Browse the repository at this point in the history
…kipping it
  • Loading branch information
christophehurpeau committed Mar 13, 2023
1 parent 0093237 commit 6b0db57
Show file tree
Hide file tree
Showing 5 changed files with 64 additions and 15 deletions.
2 changes: 1 addition & 1 deletion dist/definitions/checks/checkPeerDependencies.d.ts.map

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

14 changes: 9 additions & 5 deletions dist/index-node16.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -125,12 +125,16 @@ function checkPeerDependencies(pkg, reportError, type, allowedPeerIn, providedDe
if (peerDependenciesMetaPeerDep?.optional) {
continue;
}

let additionalDetails = '';
// satisfied by another direct dependency
if (providedDependencies.some(([depName, depRange]) => depName === peerDepName && semver.intersects(range, depRange))) {
continue;
const providedDependenciesForDepName = providedDependencies.filter(([depName]) => depName === peerDepName);
if (providedDependenciesForDepName.length > 0) {
if (providedDependenciesForDepName.every(([, depRange]) => semver.intersects(range, depRange))) {
continue;
}
additionalDetails += ' (required as some dependencies have non-satisfying range too)';
}
reportError(`Missing "${peerDepName}" peer dependency from "${depPkg.name}" in ${type}`, `it should satisfies "${range}" and be in ${allowedPeerIn.join(' or ')}`, missingOnlyWarnsForCheck.shouldWarnsFor(peerDepName));
reportError(`Missing "${peerDepName}" peer dependency from "${depPkg.name}" in ${type}`, `it should satisfies "${range}" and be in ${allowedPeerIn.join(' or ')}${additionalDetails}`, missingOnlyWarnsForCheck.shouldWarnsFor(peerDepName));
} else {
const versions = versionsIn.map(versionsInType => pkg[versionsInType][peerDepName]);
versions.forEach((version, index) => {
Expand Down Expand Up @@ -173,7 +177,7 @@ async function checkDirectPeerDependencies(isLibrary, pkg, pkgPathName, getDepen
type: depType,
pkg: depPkg
});
if (depPkg.dependencies) {
if (depPkg.dependencies && !isLibrary) {
allDirectDependenciesDependencies.push(...Object.entries(depPkg.dependencies));
}
}
Expand Down
2 changes: 1 addition & 1 deletion dist/index-node16.mjs.map

Large diffs are not rendered by default.

37 changes: 37 additions & 0 deletions src/checks/checkDirectPeerDependencies.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -305,4 +305,41 @@ describe('checkDirectPeerDependencies', () => {
);
expect(mockReportError).not.toHaveBeenCalled();
});

it('should report error when peer dependency is provided by multiple dependencies including non-satisfying range', async () => {
await checkDirectPeerDependencies(
false,
{
name: 'test',
dependencies: {
'some-lib-using-rollup': '1.0.0',
'some-lib-providing-rollup-1': '1.0.0',
'some-lib-providing-rollup-2': '1.0.0',
},
},
'path',
jest
.fn()
.mockImplementationOnce(() => ({
name: 'some-lib-using-rollup',
peerDependencies: { rollup: '^1.0.0' },
}))
.mockImplementationOnce(() => ({
name: 'some-lib-providing-rollup-1',
dependencies: { rollup: '^1.0.0' },
}))
.mockImplementationOnce(() => ({
name: 'some-lib-providing-rollup-2',
dependencies: { rollup: '^2.0.0' },
})),
createOnlyWarnsForMappingCheck('test', []),
createOnlyWarnsForMappingCheck('test', []),
createReportError,
);
expect(mockReportError).toHaveBeenCalledWith(
'Missing "rollup" peer dependency from "some-lib-using-rollup" in dependencies',
'it should satisfies "^1.0.0" and be in devDependencies or dependencies (required as some dependencies have non-satisfying range too)',
false,
);
});
});
24 changes: 16 additions & 8 deletions src/checks/checkPeerDependencies.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,21 +31,29 @@ export function checkPeerDependencies(
continue;
}

let additionalDetails = '';
// satisfied by another direct dependency
if (
providedDependencies.some(
([depName, depRange]) =>
depName === peerDepName && semver.intersects(range, depRange),
)
) {
continue;
const providedDependenciesForDepName = providedDependencies.filter(
([depName]) => depName === peerDepName,
);
if (providedDependenciesForDepName.length > 0) {
if (
providedDependenciesForDepName.every(([, depRange]) =>
semver.intersects(range, depRange),
)
) {
continue;
}

additionalDetails +=
' (required as some dependencies have non-satisfying range too)';
}

reportError(
`Missing "${peerDepName}" peer dependency from "${depPkg.name}" in ${type}`,
`it should satisfies "${range}" and be in ${allowedPeerIn.join(
' or ',
)}`,
)}${additionalDetails}`,
missingOnlyWarnsForCheck.shouldWarnsFor(peerDepName),
);
} else {
Expand Down

0 comments on commit 6b0db57

Please sign in to comment.