diff --git a/.gitignore b/.gitignore index fb71345..bef3d95 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,6 @@ dist/ .cache public scratchings.js + +# IDEs +.idea diff --git a/packages/cli/src/checks/INVALID_DEV_AND_PEER_DEPENDENCY_RELATIONSHIP.ts b/packages/cli/src/checks/INVALID_DEV_AND_PEER_DEPENDENCY_RELATIONSHIP.ts index 6462d84..40ac076 100644 --- a/packages/cli/src/checks/INVALID_DEV_AND_PEER_DEPENDENCY_RELATIONSHIP.ts +++ b/packages/cli/src/checks/INVALID_DEV_AND_PEER_DEPENDENCY_RELATIONSHIP.ts @@ -14,13 +14,17 @@ type ErrorType = { export default makeCheck({ type: "all", - validate: (workspace, allWorkspaces) => { - let errors: ErrorType[] = []; - let peerDeps = workspace.packageJson.peerDependencies; - let devDeps = workspace.packageJson.devDependencies || {}; + validate: (workspace, allWorkspaces, rootWorkspace) => { + const errors: ErrorType[] = []; + const peerDeps = workspace.packageJson.peerDependencies; + const devDeps = workspace.packageJson.devDependencies || {}; + const rootDeps = rootWorkspace.packageJson.dependencies || {}; + if (peerDeps) { for (let depName in peerDeps) { - if (!devDeps[depName]) { + const devOrRootDep = devDeps[depName] || rootDeps[depName]; + + if (!devOrRootDep) { let highestRanges = getHighestExternalRanges(allWorkspaces); let idealDevVersion = highestRanges.get(depName); let isInternalDependency = allWorkspaces.has(depName); @@ -39,12 +43,12 @@ export default makeCheck({ idealDevVersion }); } else if ( - semver.validRange(devDeps[depName]) && + semver.validRange(devOrRootDep) && // TODO: we should probably error when a peer dep has an invalid range (in a seperate rule) // (also would be good to do a bit more validation instead of just ignoring invalid ranges for normal dep types) semver.validRange(peerDeps[depName]) && !upperBoundOfRangeAWithinBoundsOfB( - devDeps[depName], + devOrRootDep, peerDeps[depName] ) ) { @@ -58,7 +62,7 @@ export default makeCheck({ workspace, dependencyName: depName, peerVersion: peerDeps[depName], - devVersion: devDeps[depName], + devVersion: devOrRootDep, idealDevVersion }); } diff --git a/packages/cli/src/checks/__tests__/INVALID_DEV_AND_PEER_DEPENDENCY.ts b/packages/cli/src/checks/__tests__/INVALID_DEV_AND_PEER_DEPENDENCY.ts index 960c4bf..0e2b8ef 100644 --- a/packages/cli/src/checks/__tests__/INVALID_DEV_AND_PEER_DEPENDENCY.ts +++ b/packages/cli/src/checks/__tests__/INVALID_DEV_AND_PEER_DEPENDENCY.ts @@ -181,4 +181,19 @@ describe("invalid dev and peer dependency", () => { let errors = makeCheck.validate(pkg1, ws, rootWorkspace, {}); expect(errors).toHaveLength(0); }); + + it("should work when peer dependency is in root dependencies", () => { + let ws = getWS(); + let pkg1 = ws.get("pkg-1")!; + + pkg1.packageJson.peerDependencies = { + "external-dep": "^1.0.0" + }; + rootWorkspace.packageJson.dependencies = { + "external-dep": "^1.0.0" + }; + + let errors = makeCheck.validate(pkg1, ws, rootWorkspace, {}); + expect(errors).toHaveLength(0); + }); });