| 18 | |
| 19 | module.exports = defineConfig({ |
| 20 | async constraints({Yarn}) { |
| 21 | const allNonPeerDeps = Yarn.dependencies().filter( |
| 22 | d => d.type !== 'peerDependencies', |
| 23 | ); |
| 24 | |
| 25 | // 1. Enforce same dependency version across workspaces (with exceptions) |
| 26 | for (const dependency of Yarn.dependencies()) { |
| 27 | const {ident, type} = dependency; |
| 28 | if (type === 'peerDependencies') continue; |
| 29 | if (EXCEPTIONS.has(ident)) continue; |
| 30 | const allDeps = allNonPeerDeps.filter(d => d.ident === ident); |
| 31 | const uniqueRanges = [...new Set(allDeps.map(d => d.range))]; |
| 32 | if (uniqueRanges.length > 1) { |
| 33 | for (const d of allDeps) { |
| 34 | d.error( |
| 35 | `Dependency \`${ident}\` should have the same version across all workspaces (found: ${uniqueRanges.join(', ')})`, |
| 36 | ); |
| 37 | } |
| 38 | } |
| 39 | } |
| 40 | |
| 41 | // 2. Prevent dependency in both dependencies and devDependencies |
| 42 | for (const workspace of Yarn.workspaces()) { |
| 43 | const deps = workspace.manifest.dependencies; |
| 44 | const devDeps = workspace.manifest.devDependencies; |
| 45 | if (deps == null || devDeps == null) { |
| 46 | continue; |
| 47 | } |
| 48 | for (const devDep of Object.keys(devDeps)) { |
| 49 | if (deps[devDep]) { |
| 50 | workspace.error( |
| 51 | `Dependency \`${devDep}\` appears in both dependencies and devDependencies`, |
| 52 | ); |
| 53 | } |
| 54 | } |
| 55 | } |
| 56 | |
| 57 | // 3. Enforce license field for public workspaces, remove for private |
| 58 | for (const workspace of Yarn.workspaces()) { |
| 59 | if (workspace.manifest.private === true) { |
| 60 | workspace.unset('license'); |
| 61 | } else { |
| 62 | workspace.set('license', 'MIT'); |
| 63 | } |
| 64 | } |
| 65 | |
| 66 | // 4. Enforce repository field for public workspaces, remove for private |
| 67 | for (const workspace of Yarn.workspaces()) { |
| 68 | if (workspace.manifest.private === true) { |
| 69 | workspace.unset('repository'); |
| 70 | } else { |
| 71 | workspace.set(['repository', 'type'], 'git'); |
| 72 | workspace.set( |
| 73 | ['repository', 'url'], |
| 74 | 'https://github.com/jestjs/jest.git', |
| 75 | ); |
| 76 | workspace.set(['repository', 'directory'], workspace.cwd); |
| 77 | } |