1
+ version : v1
2
+ release_phase : alpha
3
+ type : rule-type
4
+ name : pr_too_many_deps
5
+ display_name : Warn on too many project dependencies
6
+ short_failure_message : A PR has added too many dependencies
7
+ severity :
8
+ value : low
9
+ context :
10
+ provider : github
11
+ description : |
12
+ Warns if a single PR attempts to introduce too many transitive dependencies to a project.
13
+ guidance : |
14
+ This rule warns reviewers if a PR would introduce too many transitive dependencies
15
+ into a project. The threshold is configurable, though not on a percentage basis.
16
+
17
+ Additional dependencies can increase the security surface area of a project,
18
+ increase the size of software deployments and artifacts, and introduce additional
19
+ maintenance work or security vulnerabilities in managing the dependencies.
20
+ def :
21
+ in_entity : pull_request
22
+ rule_schema :
23
+ type : object
24
+ properties :
25
+ max_deps :
26
+ type : integer
27
+ description : " The maximum number of dependencies that can be added in a single PR."
28
+ default : 50
29
+ ingest :
30
+ type : deps
31
+ pr :
32
+ filter : new
33
+ eval :
34
+ type : rego
35
+ data_sources :
36
+ - name : insights
37
+ rego :
38
+ type : deny-by-default
39
+ def : |
40
+ package minder
41
+
42
+ import rego.v1
43
+
44
+ default allow := false
45
+
46
+ added := {node.name: ecosystem |
47
+ node := input.ingested.node_list.nodes[_]
48
+ ecosystem := get_ecosystem(node.properties)
49
+ }
50
+
51
+ get_ecosystem(properties) := eco if {
52
+ count(properties) >= 1
53
+ prop := properties[_]
54
+
55
+ prop.name == "sourceFile"
56
+ eco := get_ecosystem_from_file(prop.data)
57
+ }
58
+
59
+ get_ecosystem_from_file(file) = "pypi" if {
60
+ file == "requirements.txt"
61
+ }
62
+
63
+ get_ecosystem_from_file(file) = "npm" if {
64
+ file == "package.json"
65
+ }
66
+
67
+ get_ecosystem_from_file(file) = "go" if {
68
+ file == "go.mod"
69
+ }
70
+
71
+ get_ecosystem_from_file(file) = "crates" if {
72
+ file == "Cargo.toml"
73
+ }
74
+
75
+ get_ecosystem_from_file(file) = "maven" if {
76
+ file == "pom.xml"
77
+ }
78
+
79
+ transitive contains pkg if {
80
+ added[pkg]
81
+ }
82
+
83
+ transitive contains pkg if {
84
+ ecosystem := added[name]
85
+
86
+ lookup := minder.datasource.insights.dependencies({
87
+ "package": name,
88
+ "ecosystem": ecosystem
89
+ })
90
+ pkg := lookup.body.dependencies[_].name
91
+ }
92
+
93
+ allow := false # (count(transitive) <= input.profile.max_deps)
94
+ new_deps := concat("\n- ", transitive)
95
+ message := sprintf("This PR introduces %d new transitive dependencies (limit of %d):\n\n- %s\n\n",
96
+ [count(transitive), input.profile.max_deps, new_deps])
97
+ alert :
98
+ type : pull_request_comment
99
+ pull_request_comment :
100
+ review_message : |
101
+ This pull request introduces too many dependencies. Please consider finding libraries with fewer dependencies.
102
+
103
+ {{.EvalErrorDetails}}
0 commit comments