Skip to content

Commit 008c502

Browse files
authored
[9.0] [Renovate] - Enhance dependency ownership checks (elastic#231962) (elastic#233530)
# Backport This will backport the following commits from `main` to `9.0`: - [[Renovate] - Enhance dependency ownership checks (elastic#231962)](elastic#231962) <!--- Backport version: 10.0.1 --> ### Questions ? Please refer to the [Backport tool documentation](https://github.com/sorenlouv/backport) <!--BACKPORT [{"author":{"name":"Larry Gregory","email":"[email protected]"},"sourceCommit":{"committedDate":"2025-08-28T20:19:23Z","message":"[Renovate] - Enhance dependency ownership checks (elastic#231962)\n\nThis pull request improves the dependency ownership tooling and\ndocumentation by enhancing error detection for Renovate rules, updating\nlabels to use `upgrade-risk` instead of `risk`, and cleaning up unused\ndependencies and rules. The main changes are grouped below.\n\n**Dependency Ownership Tooling Improvements:**\n\n* Added detection and reporting of invalid Renovate rules that declare\npackages not found in `package.json`, with CLI and test updates to\nsurface these errors.\n(`packages/kbn-dependency-ownership/src/dependency_ownership.ts`,\n`packages/kbn-dependency-ownership/src/cli.ts`,\n`packages/kbn-dependency-ownership/src/dependency_ownership.test.ts`)\n[[1]](diffhunk://#diff-c5dc715085771090ec5994cb4ee3ead140b72e42cc79290ba8ea95d62fe8e571R110-R134)\n[[2]](diffhunk://#diff-c5dc715085771090ec5994cb4ee3ead140b72e42cc79290ba8ea95d62fe8e571R197-R203)\n[[3]](diffhunk://#diff-bd67d71b8125f465a67bb6c6ef93e341f553f0584aab086fdd8e0876e3ea3c0eL49-R53)\n[[4]](diffhunk://#diff-bd67d71b8125f465a67bb6c6ef93e341f553f0584aab086fdd8e0876e3ea3c0eL59-R72)\n[[5]](diffhunk://#diff-b57928a4400275ad152ccab121e0745fa94387095458007b2b7187234e44c2b3L83-R120)\n* Extended the Renovate rule filter to ignore rules using custom\nmanagers (e.g., GitHub Actions), ensuring only supported rules are\nprocessed. (`packages/kbn-dependency-ownership/src/rule.ts`)\n\n**Documentation and Label Updates:**\n\n* Updated documentation and configuration to replace the `risk` label\nwith `upgrade-risk` for consistency and clarity.\n(`dev_docs/contributing/third_party_dependencies.mdx`, `renovate.json`)\n[[1]](diffhunk://#diff-b59b40c70511ae917f0ad9b9fa04c533253b92199a6b9ead6d0755d6f57c81d3L173-R173)\n[[2]](diffhunk://#diff-b59b40c70511ae917f0ad9b9fa04c533253b92199a6b9ead6d0755d6f57c81d3L188-R188)\n[[3]](diffhunk://#diff-7b5c8955fc544a11b4b74eddb4115f9cc51c9cf162dbffa60d37eeed82a55a57L530-R523)\n[[4]](diffhunk://#diff-7b5c8955fc544a11b4b74eddb4115f9cc51c9cf162dbffa60d37eeed82a55a57L597-R590)\n[[5]](diffhunk://#diff-7b5c8955fc544a11b4b74eddb4115f9cc51c9cf162dbffa60d37eeed82a55a57L2332-R2324)\n\n**Renovate Rule and Dependency Cleanup:**\n\n* Removed unused dependencies and rules from `renovate.json` and\n`package.json`, including several loader and type packages, and\nreorganized some group names and labels for clarity. (`renovate.json`,\n`package.json`)\n[[1]](diffhunk://#diff-7b5c8955fc544a11b4b74eddb4115f9cc51c9cf162dbffa60d37eeed82a55a57L52-L72)\n[[2]](diffhunk://#diff-7b5c8955fc544a11b4b74eddb4115f9cc51c9cf162dbffa60d37eeed82a55a57L231)\n[[3]](diffhunk://#diff-7b5c8955fc544a11b4b74eddb4115f9cc51c9cf162dbffa60d37eeed82a55a57L661-R654)\n[[4]](diffhunk://#diff-7b5c8955fc544a11b4b74eddb4115f9cc51c9cf162dbffa60d37eeed82a55a57L785-R777)\n[[5]](diffhunk://#diff-7b5c8955fc544a11b4b74eddb4115f9cc51c9cf162dbffa60d37eeed82a55a57L1154-L1173)\n[[6]](diffhunk://#diff-7ae45ad102eab3b6d7e7896acd08c427a9b25b346470d7bc6507b6481575d519L1746)\n\n**Configuration Parsing Enhancements:**\n\n* Updated config parsing to include `resolutions` from `package.json`\nfor more accurate dependency checks.\n(`packages/kbn-dependency-ownership/src/parse_config.ts`)\n[[1]](diffhunk://#diff-047e08324c0973a44d942ff32611200c2cd13ac56d9678ad232622093abc5069R20)\n[[2]](diffhunk://#diff-047e08324c0973a44d942ff32611200c2cd13ac56d9678ad232622093abc5069R41-R43)\n\n**Test Coverage Expansion:**\n\n* Added and improved tests to verify detection of invalid Renovate rules\nand proper filtering of disabled or custom-manager rules.\n(`packages/kbn-dependency-ownership/src/dependency_ownership.test.ts`)\n[[1]](diffhunk://#diff-b57928a4400275ad152ccab121e0745fa94387095458007b2b7187234e44c2b3R22-R40)\n[[2]](diffhunk://#diff-b57928a4400275ad152ccab121e0745fa94387095458007b2b7187234e44c2b3L83-R120)\n\nThese changes enhance the reliability and clarity of dependency\nownership checks and Renovate rule management.","sha":"d82fc929a11a6f78f0a5cd931d8ab7c3085406f7","branchLabelMapping":{"^v9.2.0$":"main","^v(\\d+).(\\d+).\\d+$":"$1.$2"}},"sourcePullRequest":{"labels":["Team:Security","release_note:skip","backport:prev-minor","backport:prev-major","v9.2.0"],"title":"[Renovate] - Enhance dependency ownership checks","number":231962,"url":"https://github.com/elastic/kibana/pull/231962","mergeCommit":{"message":"[Renovate] - Enhance dependency ownership checks (elastic#231962)\n\nThis pull request improves the dependency ownership tooling and\ndocumentation by enhancing error detection for Renovate rules, updating\nlabels to use `upgrade-risk` instead of `risk`, and cleaning up unused\ndependencies and rules. The main changes are grouped below.\n\n**Dependency Ownership Tooling Improvements:**\n\n* Added detection and reporting of invalid Renovate rules that declare\npackages not found in `package.json`, with CLI and test updates to\nsurface these errors.\n(`packages/kbn-dependency-ownership/src/dependency_ownership.ts`,\n`packages/kbn-dependency-ownership/src/cli.ts`,\n`packages/kbn-dependency-ownership/src/dependency_ownership.test.ts`)\n[[1]](diffhunk://#diff-c5dc715085771090ec5994cb4ee3ead140b72e42cc79290ba8ea95d62fe8e571R110-R134)\n[[2]](diffhunk://#diff-c5dc715085771090ec5994cb4ee3ead140b72e42cc79290ba8ea95d62fe8e571R197-R203)\n[[3]](diffhunk://#diff-bd67d71b8125f465a67bb6c6ef93e341f553f0584aab086fdd8e0876e3ea3c0eL49-R53)\n[[4]](diffhunk://#diff-bd67d71b8125f465a67bb6c6ef93e341f553f0584aab086fdd8e0876e3ea3c0eL59-R72)\n[[5]](diffhunk://#diff-b57928a4400275ad152ccab121e0745fa94387095458007b2b7187234e44c2b3L83-R120)\n* Extended the Renovate rule filter to ignore rules using custom\nmanagers (e.g., GitHub Actions), ensuring only supported rules are\nprocessed. (`packages/kbn-dependency-ownership/src/rule.ts`)\n\n**Documentation and Label Updates:**\n\n* Updated documentation and configuration to replace the `risk` label\nwith `upgrade-risk` for consistency and clarity.\n(`dev_docs/contributing/third_party_dependencies.mdx`, `renovate.json`)\n[[1]](diffhunk://#diff-b59b40c70511ae917f0ad9b9fa04c533253b92199a6b9ead6d0755d6f57c81d3L173-R173)\n[[2]](diffhunk://#diff-b59b40c70511ae917f0ad9b9fa04c533253b92199a6b9ead6d0755d6f57c81d3L188-R188)\n[[3]](diffhunk://#diff-7b5c8955fc544a11b4b74eddb4115f9cc51c9cf162dbffa60d37eeed82a55a57L530-R523)\n[[4]](diffhunk://#diff-7b5c8955fc544a11b4b74eddb4115f9cc51c9cf162dbffa60d37eeed82a55a57L597-R590)\n[[5]](diffhunk://#diff-7b5c8955fc544a11b4b74eddb4115f9cc51c9cf162dbffa60d37eeed82a55a57L2332-R2324)\n\n**Renovate Rule and Dependency Cleanup:**\n\n* Removed unused dependencies and rules from `renovate.json` and\n`package.json`, including several loader and type packages, and\nreorganized some group names and labels for clarity. (`renovate.json`,\n`package.json`)\n[[1]](diffhunk://#diff-7b5c8955fc544a11b4b74eddb4115f9cc51c9cf162dbffa60d37eeed82a55a57L52-L72)\n[[2]](diffhunk://#diff-7b5c8955fc544a11b4b74eddb4115f9cc51c9cf162dbffa60d37eeed82a55a57L231)\n[[3]](diffhunk://#diff-7b5c8955fc544a11b4b74eddb4115f9cc51c9cf162dbffa60d37eeed82a55a57L661-R654)\n[[4]](diffhunk://#diff-7b5c8955fc544a11b4b74eddb4115f9cc51c9cf162dbffa60d37eeed82a55a57L785-R777)\n[[5]](diffhunk://#diff-7b5c8955fc544a11b4b74eddb4115f9cc51c9cf162dbffa60d37eeed82a55a57L1154-L1173)\n[[6]](diffhunk://#diff-7ae45ad102eab3b6d7e7896acd08c427a9b25b346470d7bc6507b6481575d519L1746)\n\n**Configuration Parsing Enhancements:**\n\n* Updated config parsing to include `resolutions` from `package.json`\nfor more accurate dependency checks.\n(`packages/kbn-dependency-ownership/src/parse_config.ts`)\n[[1]](diffhunk://#diff-047e08324c0973a44d942ff32611200c2cd13ac56d9678ad232622093abc5069R20)\n[[2]](diffhunk://#diff-047e08324c0973a44d942ff32611200c2cd13ac56d9678ad232622093abc5069R41-R43)\n\n**Test Coverage Expansion:**\n\n* Added and improved tests to verify detection of invalid Renovate rules\nand proper filtering of disabled or custom-manager rules.\n(`packages/kbn-dependency-ownership/src/dependency_ownership.test.ts`)\n[[1]](diffhunk://#diff-b57928a4400275ad152ccab121e0745fa94387095458007b2b7187234e44c2b3R22-R40)\n[[2]](diffhunk://#diff-b57928a4400275ad152ccab121e0745fa94387095458007b2b7187234e44c2b3L83-R120)\n\nThese changes enhance the reliability and clarity of dependency\nownership checks and Renovate rule management.","sha":"d82fc929a11a6f78f0a5cd931d8ab7c3085406f7"}},"sourceBranch":"main","suggestedTargetBranches":[],"targetPullRequestStates":[{"branch":"main","label":"v9.2.0","branchLabelMappingKey":"^v9.2.0$","isSourceBranch":true,"state":"MERGED","url":"https://github.com/elastic/kibana/pull/231962","number":231962,"mergeCommit":{"message":"[Renovate] - Enhance dependency ownership checks (elastic#231962)\n\nThis pull request improves the dependency ownership tooling and\ndocumentation by enhancing error detection for Renovate rules, updating\nlabels to use `upgrade-risk` instead of `risk`, and cleaning up unused\ndependencies and rules. The main changes are grouped below.\n\n**Dependency Ownership Tooling Improvements:**\n\n* Added detection and reporting of invalid Renovate rules that declare\npackages not found in `package.json`, with CLI and test updates to\nsurface these errors.\n(`packages/kbn-dependency-ownership/src/dependency_ownership.ts`,\n`packages/kbn-dependency-ownership/src/cli.ts`,\n`packages/kbn-dependency-ownership/src/dependency_ownership.test.ts`)\n[[1]](diffhunk://#diff-c5dc715085771090ec5994cb4ee3ead140b72e42cc79290ba8ea95d62fe8e571R110-R134)\n[[2]](diffhunk://#diff-c5dc715085771090ec5994cb4ee3ead140b72e42cc79290ba8ea95d62fe8e571R197-R203)\n[[3]](diffhunk://#diff-bd67d71b8125f465a67bb6c6ef93e341f553f0584aab086fdd8e0876e3ea3c0eL49-R53)\n[[4]](diffhunk://#diff-bd67d71b8125f465a67bb6c6ef93e341f553f0584aab086fdd8e0876e3ea3c0eL59-R72)\n[[5]](diffhunk://#diff-b57928a4400275ad152ccab121e0745fa94387095458007b2b7187234e44c2b3L83-R120)\n* Extended the Renovate rule filter to ignore rules using custom\nmanagers (e.g., GitHub Actions), ensuring only supported rules are\nprocessed. (`packages/kbn-dependency-ownership/src/rule.ts`)\n\n**Documentation and Label Updates:**\n\n* Updated documentation and configuration to replace the `risk` label\nwith `upgrade-risk` for consistency and clarity.\n(`dev_docs/contributing/third_party_dependencies.mdx`, `renovate.json`)\n[[1]](diffhunk://#diff-b59b40c70511ae917f0ad9b9fa04c533253b92199a6b9ead6d0755d6f57c81d3L173-R173)\n[[2]](diffhunk://#diff-b59b40c70511ae917f0ad9b9fa04c533253b92199a6b9ead6d0755d6f57c81d3L188-R188)\n[[3]](diffhunk://#diff-7b5c8955fc544a11b4b74eddb4115f9cc51c9cf162dbffa60d37eeed82a55a57L530-R523)\n[[4]](diffhunk://#diff-7b5c8955fc544a11b4b74eddb4115f9cc51c9cf162dbffa60d37eeed82a55a57L597-R590)\n[[5]](diffhunk://#diff-7b5c8955fc544a11b4b74eddb4115f9cc51c9cf162dbffa60d37eeed82a55a57L2332-R2324)\n\n**Renovate Rule and Dependency Cleanup:**\n\n* Removed unused dependencies and rules from `renovate.json` and\n`package.json`, including several loader and type packages, and\nreorganized some group names and labels for clarity. (`renovate.json`,\n`package.json`)\n[[1]](diffhunk://#diff-7b5c8955fc544a11b4b74eddb4115f9cc51c9cf162dbffa60d37eeed82a55a57L52-L72)\n[[2]](diffhunk://#diff-7b5c8955fc544a11b4b74eddb4115f9cc51c9cf162dbffa60d37eeed82a55a57L231)\n[[3]](diffhunk://#diff-7b5c8955fc544a11b4b74eddb4115f9cc51c9cf162dbffa60d37eeed82a55a57L661-R654)\n[[4]](diffhunk://#diff-7b5c8955fc544a11b4b74eddb4115f9cc51c9cf162dbffa60d37eeed82a55a57L785-R777)\n[[5]](diffhunk://#diff-7b5c8955fc544a11b4b74eddb4115f9cc51c9cf162dbffa60d37eeed82a55a57L1154-L1173)\n[[6]](diffhunk://#diff-7ae45ad102eab3b6d7e7896acd08c427a9b25b346470d7bc6507b6481575d519L1746)\n\n**Configuration Parsing Enhancements:**\n\n* Updated config parsing to include `resolutions` from `package.json`\nfor more accurate dependency checks.\n(`packages/kbn-dependency-ownership/src/parse_config.ts`)\n[[1]](diffhunk://#diff-047e08324c0973a44d942ff32611200c2cd13ac56d9678ad232622093abc5069R20)\n[[2]](diffhunk://#diff-047e08324c0973a44d942ff32611200c2cd13ac56d9678ad232622093abc5069R41-R43)\n\n**Test Coverage Expansion:**\n\n* Added and improved tests to verify detection of invalid Renovate rules\nand proper filtering of disabled or custom-manager rules.\n(`packages/kbn-dependency-ownership/src/dependency_ownership.test.ts`)\n[[1]](diffhunk://#diff-b57928a4400275ad152ccab121e0745fa94387095458007b2b7187234e44c2b3R22-R40)\n[[2]](diffhunk://#diff-b57928a4400275ad152ccab121e0745fa94387095458007b2b7187234e44c2b3L83-R120)\n\nThese changes enhance the reliability and clarity of dependency\nownership checks and Renovate rule management.","sha":"d82fc929a11a6f78f0a5cd931d8ab7c3085406f7"}}]}] BACKPORT-->
1 parent 845e88e commit 008c502

File tree

9 files changed

+199
-247
lines changed

9 files changed

+199
-247
lines changed

dev_docs/contributing/third_party_dependencies.mdx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ Here is an example configuration for a dependency in the `renovate.json` file:
102102
"release_note:skip",
103103
"backport:all-open",
104104
"effort:low",
105-
"risk:high"
105+
"upgrade-risk:high"
106106
],
107107
// [5]
108108
"minimumReleaseAge": "7 days",
@@ -117,7 +117,7 @@ Here is an example configuration for a dependency in the `renovate.json` file:
117117

118118
[3] `matchBaseBranches`: The branches that the rule will apply to. This should be set to `main` for most dependencies.
119119

120-
[4] `labels`: Labels to apply to the PRs created by Renovate. The `Team:My-Team-Label` label should be replaced with your team's GitHub label from the Kibana repository. Include an `effort:low|medium|high` label to indicate the level of effort required to update the codebase, and a `risk:low|medium|high` label to indicate the level of testing required to be confident in the changes. The `release_note:skip` and `backport:all-open` labels are used to control the release process and should not be changed without first consulting the AppEx Platform Security team.
120+
[4] `labels`: Labels to apply to the PRs created by Renovate. The `Team:My-Team-Label` label should be replaced with your team's GitHub label from the Kibana repository. Include an `effort:low|medium|high` label to indicate the level of effort required to update the codebase, and an `upgrade-risk:low|medium|high` label to indicate the level of testing required to be confident in the changes. The `release_note:skip` and `backport:all-open` labels are used to control the release process and should not be changed without first consulting the AppEx Platform Security team.
121121

122122
[5] `minimumReleaseAge`: The minimum age of a release before it can be upgraded. This is set to `7 days` to allow time for any issues to be identified and resolved before upgrading. You may adjust this value as needed.
123123

package.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1607,7 +1607,6 @@
16071607
"@types/json5": "^2.2.0",
16081608
"@types/jsonwebtoken": "^9.0.0",
16091609
"@types/license-checker": "15.0.0",
1610-
"@types/loader-utils": "^2.0.3",
16111610
"@types/lodash": "^4.17.16",
16121611
"@types/lz-string": "^1.5.0",
16131612
"@types/mapbox__vector-tile": "1.3.0",

packages/kbn-dependency-ownership/src/cli.ts

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,11 @@ export async function identifyDependencyOwnershipCLI() {
4646

4747
const result = identifyDependencyOwnership({ dependency, owner, missingOwner });
4848
if (failIfUnowned) {
49-
const { prodDependencies = [] as string[], devDependencies = [] as string[] } =
50-
result as DependenciesByOwner;
49+
const {
50+
prodDependencies = [] as string[],
51+
devDependencies = [] as string[],
52+
invalidRenovateRules = [] as string[],
53+
} = result as DependenciesByOwner;
5154

5255
const uncoveredDependencies = [...prodDependencies, ...devDependencies];
5356
if (uncoveredDependencies.length > 0) {
@@ -56,9 +59,17 @@ export async function identifyDependencyOwnershipCLI() {
5659
throw createFailError(
5760
`Found ${uncoveredDependencies.length} dependencies without an owner. Please update \`renovate.json\` to include these dependencies.\nVisit https://docs.elastic.dev/kibana-dev-docs/third-party-dependencies#dependency-ownership for more information.`
5861
);
59-
} else {
60-
log.success('All dependencies have an owner');
6162
}
63+
64+
if (invalidRenovateRules.length > 0) {
65+
log.write('Invalid renovate rules:');
66+
log.write(invalidRenovateRules.map((rule) => ` - ${rule}`).join('\n'));
67+
throw createFailError(
68+
`Found ${invalidRenovateRules.length} invalid renovate rules. Please update \`renovate.json\` to fix these errors.\nVisit https://docs.elastic.dev/kibana-dev-docs/third-party-dependencies#dependency-ownership for more information.`
69+
);
70+
}
71+
72+
log.success('All dependencies have an owner');
6273
}
6374

6475
if (outputPath) {

packages/kbn-dependency-ownership/src/dependency_ownership.test.ts

Lines changed: 34 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,10 @@
77
* License v3.0 only", or the "Server Side Public License, v 1".
88
*/
99

10+
import type { DependenciesByOwner } from './dependency_ownership';
1011
import { identifyDependencyOwnership } from './dependency_ownership';
1112
import { parseConfig } from './parse_config';
13+
import { ruleFilter } from './rule';
1214

1315
jest.mock('./parse_config', () => ({
1416
parseConfig: jest.fn(),
@@ -18,23 +20,33 @@ describe('identifyDependencyOwnership', () => {
1820
const mockConfig = {
1921
renovateRules: [
2022
{
23+
groupName: 'core-libs',
2124
reviewers: ['team:elastic', 'team:infra'],
2225
matchPackageNames: ['lodash', 'react'],
2326
enabled: true,
2427
},
2528
{
29+
groupName: 'testing-libs',
2630
reviewers: ['team:ui'],
27-
matchPackageNames: ['@testing-library/react'],
31+
matchPackageNames: ['@testing-library/react', 'undefined-package'],
2832
enabled: true,
2933
},
3034
{
35+
groupName: 'resolved-libs',
36+
reviewers: ['team:resolved'],
37+
matchPackageNames: ['some-resolved-lib'],
38+
enabled: true,
39+
},
40+
{
41+
groupName: 'disabled-libs',
3142
reviewers: ['team:disabled-team'],
3243
matchPackageNames: ['disabled-package'],
3344
enabled: false, // Disabled rule
3445
},
35-
],
36-
packageDependencies: ['lodash', 'react'],
46+
].filter(ruleFilter),
47+
packageDependencies: ['lodash', 'react', 'disabled-package'],
3748
packageDevDependencies: ['jest', '@testing-library/react'],
49+
packageResolutions: ['**/some-resolved-lib'],
3850
};
3951

4052
beforeEach(() => {
@@ -80,29 +92,42 @@ describe('identifyDependencyOwnership', () => {
8092
});
8193

8294
it('returns uncovered dependencies when missingOwner is true', () => {
83-
const result = identifyDependencyOwnership({ missingOwner: true });
84-
expect(result).toEqual({
85-
prodDependencies: [],
95+
const { prodDependencies, devDependencies } = identifyDependencyOwnership({
96+
missingOwner: true,
97+
}) as DependenciesByOwner;
98+
expect({ prodDependencies, devDependencies }).toEqual({
99+
prodDependencies: ['disabled-package'],
86100
devDependencies: ['jest'],
87101
});
88102
});
89103

104+
it('returns renovate rule errors for undeclared dependencies', () => {
105+
const { invalidRenovateRules } = identifyDependencyOwnership({
106+
missingOwner: true,
107+
}) as DependenciesByOwner;
108+
expect(invalidRenovateRules).toMatchInlineSnapshot(`
109+
Array [
110+
"Invalid renovate rule: 'testing-libs' declares package 'undefined-package', which is not found in package.json.",
111+
]
112+
`);
113+
});
114+
90115
it('returns comprehensive ownership coverage, considering only enabled rules', () => {
91116
const result = identifyDependencyOwnership({});
92117
expect(result).toEqual({
93118
prodDependenciesByOwner: {
94119
'@elastic/elastic': ['lodash', 'react'],
95120
'@elastic/infra': ['lodash', 'react'],
96121
'@elastic/ui': [],
97-
'@elastic/disabled-team': [],
122+
'@elastic/resolved': [],
98123
},
99124
devDependenciesByOwner: {
100125
'@elastic/elastic': [],
101126
'@elastic/infra': [],
102127
'@elastic/ui': ['@testing-library/react'],
103-
'@elastic/disabled-team': [],
128+
'@elastic/resolved': [],
104129
},
105-
uncoveredProdDependencies: [],
130+
uncoveredProdDependencies: ['disabled-package'],
106131
uncoveredDevDependencies: ['jest'],
107132
coveredProdDependencies: ['lodash', 'react'],
108133
coveredDevDependencies: ['@testing-library/react'],

packages/kbn-dependency-ownership/src/dependency_ownership.ts

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ interface GetDependencyOwnershipParams {
2121
export interface DependenciesByOwner {
2222
prodDependencies: string[];
2323
devDependencies: string[];
24+
invalidRenovateRules?: string[];
2425
}
2526

2627
interface DependenciesByOwners {
@@ -106,6 +107,31 @@ const getDependenciesByOwner = (): DependenciesByOwners => {
106107
return dependenciesByOwner;
107108
};
108109

110+
const getInvalidRenovateRules = (): string[] => {
111+
const { renovateRules, packageDependencies, packageDevDependencies, packageResolutions } =
112+
parseConfig();
113+
const declaredDependencies = new Set([...packageDependencies, ...packageDevDependencies]);
114+
115+
const errors: string[] = [];
116+
117+
renovateRules.forEach((rule) => {
118+
const { matchPackageNames = [], matchDepNames = [] } = rule;
119+
const allMatchedNames = [...matchPackageNames, ...matchDepNames];
120+
allMatchedNames.forEach((name) => {
121+
if (
122+
!declaredDependencies.has(name) &&
123+
!packageResolutions.some((resolution) => resolution.includes(name))
124+
) {
125+
errors.push(
126+
`Invalid renovate rule: '${rule.groupName}' declares package '${name}', which is not found in package.json.`
127+
);
128+
}
129+
});
130+
});
131+
132+
return errors;
133+
};
134+
109135
const getDependenciesCoverage = (): DependenciesCoverage => {
110136
const { renovateRules, packageDependencies, packageDevDependencies } = parseConfig();
111137

@@ -168,10 +194,13 @@ export const identifyDependencyOwnership = ({
168194
coveredProdDependencies,
169195
} = getDependenciesCoverage();
170196

197+
const invalidRenovateRules = getInvalidRenovateRules();
198+
171199
if (missingOwner) {
172200
return {
173201
prodDependencies: uncoveredProdDependencies,
174202
devDependencies: uncoveredDevDependencies,
203+
invalidRenovateRules,
175204
};
176205
}
177206

packages/kbn-dependency-ownership/src/parse_config.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ export const parseConfig = (() => {
1717
renovateRules: RenovatePackageRule[];
1818
packageDependencies: string[];
1919
packageDevDependencies: string[];
20+
packageResolutions: string[];
2021
} | null = null;
2122

2223
return () => {
@@ -37,8 +38,9 @@ export const parseConfig = (() => {
3738
const packageDevDependencies = Object.keys(packageConfig?.devDependencies || {}).filter(
3839
packageFilter
3940
);
41+
const packageResolutions = Object.keys(packageConfig?.resolutions || {});
4042

41-
cache = { renovateRules, packageDependencies, packageDevDependencies };
43+
cache = { renovateRules, packageDependencies, packageDevDependencies, packageResolutions };
4244
return cache;
4345
};
4446
})();

packages/kbn-dependency-ownership/src/rule.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ export interface RenovatePackageRule {
1313
matchDepNames?: string[];
1414
matchPackagePatterns?: string[];
1515
matchDepPatterns?: string[];
16+
matchManagers?: string[];
1617
excludePackageNames?: string[];
1718
excludePackagePatterns?: string[];
1819
enabled?: boolean;
@@ -26,11 +27,18 @@ export function ruleFilter(rule: RenovatePackageRule) {
2627
'typescript', // These updates are always handled manually
2728
'webpack', // While we are in the middle of a webpack upgrade. TODO: Remove this once we are done.
2829
];
30+
// Rules that use custom managers are not supported by this tool, and are ignored.
31+
const rulesWithCustomManagers = ['chainguard', 'chainguard-fips'];
32+
2933
return (
3034
// Only include rules that are enabled or explicitly allowed to be disabled
3135
(allowedDisabledRules.includes(rule.groupName) || rule.enabled !== false) &&
3236
// Only include rules that have a team reviewer
33-
rule.reviewers?.some((reviewer) => reviewer.startsWith('team:'))
37+
rule.reviewers?.some((reviewer) => reviewer.startsWith('team:')) &&
38+
// Only include rules that use the default manager, or specify npm
39+
(!rule.matchManagers || !rule.matchManagers.length || rule.matchManagers.includes('npm')) &&
40+
// Exclude rules that use custom managers
41+
!rulesWithCustomManagers.includes(rule.groupName)
3442
);
3543
}
3644

0 commit comments

Comments
 (0)