From ab778ebf1d8be7d328570d18fe7ae5c6c4b1ab7a Mon Sep 17 00:00:00 2001
From: Rhys Arkins <rhys@arkins.net>
Date: Wed, 19 Jan 2022 09:06:21 +0100
Subject: [PATCH] feat: supportedDatasources (#13621)

Co-authored-by: Michael Kriese <michael.kriese@visualon.de>
Co-authored-by: Jamie Magee <jamie.magee@gmail.com>
---
 lib/manager/ansible-galaxy/extract.spec.ts |  2 +-
 lib/manager/ansible-galaxy/extract.ts      |  2 +-
 lib/manager/ansible-galaxy/index.ts        | 12 +++++++++--
 lib/manager/ansible/extract.spec.ts        |  2 +-
 lib/manager/ansible/extract.ts             |  4 +---
 lib/manager/ansible/index.ts               |  9 ++++----
 lib/manager/argocd/index.ts                |  4 ++++
 lib/manager/azure-pipelines/index.ts       |  3 +++
 lib/manager/batect-wrapper/index.ts        |  3 +++
 lib/manager/batect/index.ts                |  3 +++
 lib/manager/bazel/index.ts                 | 11 ++++++++++
 lib/manager/bitbucket-pipelines/index.ts   |  3 +++
 lib/manager/buildkite/index.ts             |  3 +++
 lib/manager/bundler/index.ts               |  3 +++
 lib/manager/cake/index.ts                  |  2 ++
 lib/manager/cargo/index.ts                 |  3 +++
 lib/manager/cdnurl/index.ts                |  3 +++
 lib/manager/circleci/index.ts              |  4 ++++
 lib/manager/cloudbuild/index.ts            |  3 +++
 lib/manager/cocoapods/index.ts             | 11 ++++++++++
 lib/manager/composer/index.ts              |  7 ++++++
 lib/manager/deps-edn/index.ts              |  3 +++
 lib/manager/docker-compose/index.ts        |  3 +++
 lib/manager/dockerfile/index.ts            |  3 +++
 lib/manager/droneci/index.ts               |  3 +++
 lib/manager/git-submodules/index.ts        |  3 +++
 lib/manager/github-actions/index.ts        | 10 +++++++--
 lib/manager/gitlabci-include/index.ts      |  3 +++
 lib/manager/gitlabci/index.ts              |  3 +++
 lib/manager/gomod/index.ts                 |  3 +++
 lib/manager/gradle-wrapper/index.ts        |  3 +++
 lib/manager/gradle/index.ts                |  3 +++
 lib/manager/helm-requirements/index.ts     |  3 +++
 lib/manager/helm-values/index.ts           |  3 +++
 lib/manager/helmfile/index.ts              |  3 +++
 lib/manager/helmsman/index.ts              |  3 +++
 lib/manager/helmv3/index.ts                |  4 ++++
 lib/manager/homebrew/index.ts              |  3 +++
 lib/manager/html/index.ts                  |  3 +++
 lib/manager/index.spec.ts                  | 25 ++++++++++++++++++++++
 lib/manager/jenkins/index.ts               |  3 +++
 lib/manager/jsonnet-bundler/index.ts       |  2 ++
 lib/manager/kubernetes/index.ts            |  3 +++
 lib/manager/kustomize/index.ts             | 11 ++++++++++
 lib/manager/leiningen/index.ts             |  3 +++
 lib/manager/maven/index.ts                 |  3 +++
 lib/manager/meteor/index.ts                |  3 +++
 lib/manager/mix/index.ts                   |  3 +++
 lib/manager/nodenv/index.ts                |  3 +++
 lib/manager/npm/index.ts                   |  4 ++++
 lib/manager/nuget/index.ts                 |  3 +++
 lib/manager/nvm/index.ts                   |  3 +++
 lib/manager/pip-compile/index.ts           |  3 +++
 lib/manager/pip_requirements/index.ts      |  3 +++
 lib/manager/pip_setup/index.ts             |  3 +++
 lib/manager/pipenv/index.ts                |  3 +++
 lib/manager/poetry/index.ts                |  3 +++
 lib/manager/pre-commit/index.ts            |  4 ++++
 lib/manager/pub/index.ts                   |  3 +++
 lib/manager/pyenv/index.ts                 |  3 +++
 lib/manager/regex/index.ts                 |  2 ++
 lib/manager/regex/readme.md                |  3 ++-
 lib/manager/ruby-version/index.ts          |  3 +++
 lib/manager/sbt/index.ts                   |  9 ++++++++
 lib/manager/setup-cfg/index.ts             |  3 +++
 lib/manager/swift/index.ts                 |  3 +++
 lib/manager/terraform-version/index.ts     |  3 +++
 lib/manager/terraform/index.ts             | 15 +++++++++++++
 lib/manager/terragrunt-version/index.ts    |  3 +++
 lib/manager/terragrunt/index.ts            |  9 ++++++++
 lib/manager/travis/index.ts                |  3 +++
 lib/manager/types.ts                       |  2 ++
 tools/docs/manager.ts                      | 11 ++++++++--
 73 files changed, 305 insertions(+), 17 deletions(-)

diff --git a/lib/manager/ansible-galaxy/extract.spec.ts b/lib/manager/ansible-galaxy/extract.spec.ts
index 1e2b80d0a6..c445492aa2 100644
--- a/lib/manager/ansible-galaxy/extract.spec.ts
+++ b/lib/manager/ansible-galaxy/extract.spec.ts
@@ -1,5 +1,5 @@
 import { loadFixture } from '../../../test/util';
-import extractPackageFile, { getSliceEndNumber } from './extract';
+import { extractPackageFile, getSliceEndNumber } from './extract';
 
 const yamlFile1 = loadFixture('requirements01.yml');
 const yamlFile2 = loadFixture('requirements02.yml');
diff --git a/lib/manager/ansible-galaxy/extract.ts b/lib/manager/ansible-galaxy/extract.ts
index b1ac37cc44..8ce428608f 100644
--- a/lib/manager/ansible-galaxy/extract.ts
+++ b/lib/manager/ansible-galaxy/extract.ts
@@ -22,7 +22,7 @@ export function getSliceEndNumber(
   return nearestEnd;
 }
 
-export default function extractPackageFile(
+export function extractPackageFile(
   content: string,
   fileName: string
 ): PackageFile | null {
diff --git a/lib/manager/ansible-galaxy/index.ts b/lib/manager/ansible-galaxy/index.ts
index ffde8df477..fc92ebe669 100644
--- a/lib/manager/ansible-galaxy/index.ts
+++ b/lib/manager/ansible-galaxy/index.ts
@@ -1,7 +1,15 @@
-import extractPackageFile from './extract';
+import { GalaxyCollectionDatasource } from '../../datasource/galaxy-collection';
+import { GitTagsDatasource } from '../../datasource/git-tags';
+import * as datasourceGithubTags from '../../datasource/github-tags';
 
-export { extractPackageFile };
+export { extractPackageFile } from './extract';
 
 export const defaultConfig = {
   fileMatch: ['(^|/)requirements\\.ya?ml$', '(^|/)galaxy\\.ya?ml$'],
 };
+
+export const supportedDatasources = [
+  GalaxyCollectionDatasource.id,
+  GitTagsDatasource.id,
+  datasourceGithubTags.id,
+];
diff --git a/lib/manager/ansible/extract.spec.ts b/lib/manager/ansible/extract.spec.ts
index f7217a3500..aedbcc2c1e 100644
--- a/lib/manager/ansible/extract.spec.ts
+++ b/lib/manager/ansible/extract.spec.ts
@@ -1,5 +1,5 @@
 import { loadFixture } from '../../../test/util';
-import extractPackageFile from './extract';
+import { extractPackageFile } from './extract';
 
 const yamlFile1 = loadFixture('main1.yaml');
 const yamlFile2 = loadFixture('main2.yaml');
diff --git a/lib/manager/ansible/extract.ts b/lib/manager/ansible/extract.ts
index 4ee13ef36f..740921fbc6 100644
--- a/lib/manager/ansible/extract.ts
+++ b/lib/manager/ansible/extract.ts
@@ -4,9 +4,7 @@ import * as dockerVersioning from '../../versioning/docker';
 import { getDep } from '../dockerfile/extract';
 import type { PackageDependency, PackageFile } from '../types';
 
-export default function extractPackageFile(
-  content: string
-): PackageFile | null {
+export function extractPackageFile(content: string): PackageFile | null {
   logger.trace('ansible.extractPackageFile()');
   let deps: PackageDependency[] = [];
   const re = regEx(/^\s*image:\s*'?"?([^\s'"]+)'?"?\s*$/);
diff --git a/lib/manager/ansible/index.ts b/lib/manager/ansible/index.ts
index 0af8b33e33..cbe22b4501 100644
--- a/lib/manager/ansible/index.ts
+++ b/lib/manager/ansible/index.ts
@@ -1,10 +1,11 @@
 import { ProgrammingLanguage } from '../../constants';
-import extractPackageFile from './extract';
+import * as datasourceDocker from '../../datasource/docker';
+export { extractPackageFile } from './extract';
 
-const language = ProgrammingLanguage.Docker;
-
-export { extractPackageFile, language };
+export const language = ProgrammingLanguage.Docker;
 
 export const defaultConfig = {
   fileMatch: ['(^|/)tasks/[^/]+\\.ya?ml$'],
 };
+
+export const supportedDatasources = [datasourceDocker.id];
diff --git a/lib/manager/argocd/index.ts b/lib/manager/argocd/index.ts
index 1012c71468..a02db98b72 100644
--- a/lib/manager/argocd/index.ts
+++ b/lib/manager/argocd/index.ts
@@ -1,5 +1,9 @@
+import { GitTagsDatasource } from '../../datasource/git-tags';
+import { HelmDatasource } from '../../datasource/helm';
 export { extractPackageFile } from './extract';
 
 export const defaultConfig = {
   fileMatch: [],
 };
+
+export const supportedDatasources = [GitTagsDatasource.id, HelmDatasource.id];
diff --git a/lib/manager/azure-pipelines/index.ts b/lib/manager/azure-pipelines/index.ts
index adbfba940a..bf14289b54 100644
--- a/lib/manager/azure-pipelines/index.ts
+++ b/lib/manager/azure-pipelines/index.ts
@@ -1,5 +1,8 @@
+import { GitTagsDatasource } from '../../datasource/git-tags';
 export { extractPackageFile } from './extract';
 
 export const defaultConfig = {
   fileMatch: ['azure.*pipelines?.*\\.ya?ml$'],
 };
+
+export const supportedDatasources = [GitTagsDatasource.id];
diff --git a/lib/manager/batect-wrapper/index.ts b/lib/manager/batect-wrapper/index.ts
index 3c3359a888..dcaa1c1e63 100644
--- a/lib/manager/batect-wrapper/index.ts
+++ b/lib/manager/batect-wrapper/index.ts
@@ -1,3 +1,4 @@
+import { id as githubReleaseDatasource } from '../../datasource/github-releases';
 import { id as versioning } from '../../versioning/semver';
 
 export { extractPackageFile } from './extract';
@@ -7,3 +8,5 @@ export const defaultConfig = {
   fileMatch: ['(^|/)batect$'],
   versioning,
 };
+
+export const supportedDatasources = [githubReleaseDatasource];
diff --git a/lib/manager/batect/index.ts b/lib/manager/batect/index.ts
index 708f939219..b8fd77a5e8 100644
--- a/lib/manager/batect/index.ts
+++ b/lib/manager/batect/index.ts
@@ -1,3 +1,4 @@
+import { GitTagsDatasource } from '../../datasource/git-tags';
 import { extractAllPackageFiles, extractPackageFile } from './extract';
 
 export { extractAllPackageFiles, extractPackageFile };
@@ -5,3 +6,5 @@ export { extractAllPackageFiles, extractPackageFile };
 export const defaultConfig = {
   fileMatch: ['(^|/)batect(-bundle)?\\.yml$'],
 };
+
+export const supportedDatasources = [GitTagsDatasource.id];
diff --git a/lib/manager/bazel/index.ts b/lib/manager/bazel/index.ts
index 61b6798640..b487be7da6 100644
--- a/lib/manager/bazel/index.ts
+++ b/lib/manager/bazel/index.ts
@@ -1,3 +1,7 @@
+import * as datasourceDocker from '../../datasource/docker';
+import * as datasourceGithubReleases from '../../datasource/github-releases';
+import * as datasourceGithubTags from '../../datasource/github-tags';
+import * as datasourceGo from '../../datasource/go';
 import { extractPackageFile } from './extract';
 import { updateDependency } from './update';
 
@@ -6,3 +10,10 @@ export { extractPackageFile, updateDependency };
 export const defaultConfig = {
   fileMatch: ['(^|/)WORKSPACE(|\\.bazel)$', '\\.bzl$'],
 };
+
+export const supportedDatasources = [
+  datasourceDocker.id,
+  datasourceGithubReleases.id,
+  datasourceGithubTags.id,
+  datasourceGo.id,
+];
diff --git a/lib/manager/bitbucket-pipelines/index.ts b/lib/manager/bitbucket-pipelines/index.ts
index acf2524bd4..a51d837bc5 100644
--- a/lib/manager/bitbucket-pipelines/index.ts
+++ b/lib/manager/bitbucket-pipelines/index.ts
@@ -1,3 +1,4 @@
+import * as datasourceDocker from '../../datasource/docker';
 import { extractPackageFile } from './extract';
 
 export { extractPackageFile };
@@ -5,3 +6,5 @@ export { extractPackageFile };
 export const defaultConfig = {
   fileMatch: ['(^|/)\\.?bitbucket-pipelines\\.ya?ml$'],
 };
+
+export const supportedDatasources = [datasourceDocker.id];
diff --git a/lib/manager/buildkite/index.ts b/lib/manager/buildkite/index.ts
index d678d7fd3c..3350b60ce6 100644
--- a/lib/manager/buildkite/index.ts
+++ b/lib/manager/buildkite/index.ts
@@ -1,3 +1,4 @@
+import * as datasourceGithubTags from '../../datasource/github-tags';
 import { extractPackageFile } from './extract';
 
 export { extractPackageFile };
@@ -8,3 +9,5 @@ export const defaultConfig = {
   commitMessageExtra:
     'to {{#if isMajor}}v{{{newMajor}}}{{else}}{{{newValue}}}{{/if}}',
 };
+
+export const supportedDatasources = [datasourceGithubTags.id];
diff --git a/lib/manager/bundler/index.ts b/lib/manager/bundler/index.ts
index 3ef026f8b7..310e0f63ec 100644
--- a/lib/manager/bundler/index.ts
+++ b/lib/manager/bundler/index.ts
@@ -1,4 +1,5 @@
 import { ProgrammingLanguage } from '../../constants';
+import { RubyGemsDatasource } from '../../datasource/rubygems';
 import * as rubyVersioning from '../../versioning/ruby';
 import { updateArtifacts } from './artifacts';
 import { extractPackageFile } from './extract';
@@ -25,3 +26,5 @@ export const defaultConfig = {
   fileMatch: ['(^|/)Gemfile$'],
   versioning: rubyVersioning.id,
 };
+
+export const supportedDatasources = [RubyGemsDatasource.id];
diff --git a/lib/manager/cake/index.ts b/lib/manager/cake/index.ts
index 5d2a05166c..68e0d1d3dc 100644
--- a/lib/manager/cake/index.ts
+++ b/lib/manager/cake/index.ts
@@ -69,3 +69,5 @@ export function extractPackageFile(content: string): PackageFile {
   }
   return { deps };
 }
+
+export const supportedDatasources = [datasource];
diff --git a/lib/manager/cargo/index.ts b/lib/manager/cargo/index.ts
index 37f2b4bd7c..b308ca9227 100644
--- a/lib/manager/cargo/index.ts
+++ b/lib/manager/cargo/index.ts
@@ -1,4 +1,5 @@
 import { ProgrammingLanguage } from '../../constants';
+import { CrateDatasource } from '../../datasource/crate';
 import * as cargoVersioning from '../../versioning/cargo';
 import { updateArtifacts } from './artifacts';
 import { extractPackageFile } from './extract';
@@ -14,3 +15,5 @@ export const defaultConfig = {
   versioning: cargoVersioning.id,
   rangeStrategy: 'bump',
 };
+
+export const supportedDatasources = [CrateDatasource.id];
diff --git a/lib/manager/cdnurl/index.ts b/lib/manager/cdnurl/index.ts
index edf2106e65..5480906fbf 100644
--- a/lib/manager/cdnurl/index.ts
+++ b/lib/manager/cdnurl/index.ts
@@ -1,3 +1,4 @@
+import { CdnJsDatasource } from '../../datasource/cdnjs';
 import * as semverVersioning from '../../versioning/semver';
 import { extractPackageFile } from './extract';
 
@@ -7,3 +8,5 @@ export const defaultConfig = {
   fileMatch: [],
   versioning: semverVersioning.id,
 };
+
+export const supportedDatasources = [CdnJsDatasource.id];
diff --git a/lib/manager/circleci/index.ts b/lib/manager/circleci/index.ts
index afef6591c1..705099e16d 100644
--- a/lib/manager/circleci/index.ts
+++ b/lib/manager/circleci/index.ts
@@ -1,3 +1,5 @@
+import * as datasourceDocker from '../../datasource/docker';
+import { OrbDatasource } from '../../datasource/orb';
 import { extractPackageFile } from './extract';
 
 export { extractPackageFile };
@@ -5,3 +7,5 @@ export { extractPackageFile };
 export const defaultConfig = {
   fileMatch: ['(^|/).circleci/config.yml$'],
 };
+
+export const supportedDatasources = [datasourceDocker.id, OrbDatasource.id];
diff --git a/lib/manager/cloudbuild/index.ts b/lib/manager/cloudbuild/index.ts
index 3b96731222..cb4dc10014 100644
--- a/lib/manager/cloudbuild/index.ts
+++ b/lib/manager/cloudbuild/index.ts
@@ -1,3 +1,4 @@
+import * as datasourceDocker from '../../datasource/docker';
 import { extractPackageFile } from './extract';
 
 export { extractPackageFile };
@@ -5,3 +6,5 @@ export { extractPackageFile };
 export const defaultConfig = {
   fileMatch: ['(^|/)cloudbuild.ya?ml'],
 };
+
+export const supportedDatasources = [datasourceDocker.id];
diff --git a/lib/manager/cocoapods/index.ts b/lib/manager/cocoapods/index.ts
index 783738d2bc..48284b915f 100644
--- a/lib/manager/cocoapods/index.ts
+++ b/lib/manager/cocoapods/index.ts
@@ -1,3 +1,7 @@
+import { GitTagsDatasource } from '../../datasource/git-tags';
+import * as datasourceGithubTags from '../../datasource/github-tags';
+import * as datasourceGitlabTags from '../../datasource/gitlab-tags';
+import * as datasourcePod from '../../datasource/pod';
 import * as rubyVersioning from '../../versioning/ruby';
 
 export { extractPackageFile } from './extract';
@@ -7,3 +11,10 @@ export const defaultConfig = {
   fileMatch: ['(^|/)Podfile$'],
   versioning: rubyVersioning.id,
 };
+
+export const supportedDatasources = [
+  GitTagsDatasource.id,
+  datasourceGithubTags.id,
+  datasourceGitlabTags.id,
+  datasourcePod.id,
+];
diff --git a/lib/manager/composer/index.ts b/lib/manager/composer/index.ts
index 2a6f551852..5295d55db7 100644
--- a/lib/manager/composer/index.ts
+++ b/lib/manager/composer/index.ts
@@ -1,4 +1,6 @@
 import { ProgrammingLanguage } from '../../constants';
+import { GitTagsDatasource } from '../../datasource/git-tags';
+import * as datasourcePackagist from '../../datasource/packagist';
 import { updateArtifacts } from './artifacts';
 import { extractPackageFile } from './extract';
 import { getRangeStrategy } from './range';
@@ -20,3 +22,8 @@ export const defaultConfig = {
   fileMatch: ['(^|/)([\\w-]*)composer.json$'],
   versioning: composerVersioningId,
 };
+
+export const supportedDatasources = [
+  GitTagsDatasource.id,
+  datasourcePackagist.id,
+];
diff --git a/lib/manager/deps-edn/index.ts b/lib/manager/deps-edn/index.ts
index 25df409449..599293213a 100644
--- a/lib/manager/deps-edn/index.ts
+++ b/lib/manager/deps-edn/index.ts
@@ -1,3 +1,4 @@
+import { ClojureDatasource } from '../../datasource/clojure';
 import * as mavenVersioning from '../../versioning/maven';
 import { extractPackageFile } from './extract';
 
@@ -7,3 +8,5 @@ export const defaultConfig = {
   fileMatch: ['(^|/)deps\\.edn$'],
   versioning: mavenVersioning.id,
 };
+
+export const supportedDatasources = [ClojureDatasource.id];
diff --git a/lib/manager/docker-compose/index.ts b/lib/manager/docker-compose/index.ts
index d89cad0cf0..d2314c5b64 100644
--- a/lib/manager/docker-compose/index.ts
+++ b/lib/manager/docker-compose/index.ts
@@ -1,4 +1,5 @@
 import { ProgrammingLanguage } from '../../constants';
+import * as datasourceDocker from '../../datasource/docker';
 import { extractPackageFile } from './extract';
 
 const language = ProgrammingLanguage.Docker;
@@ -8,3 +9,5 @@ export { extractPackageFile, language };
 export const defaultConfig = {
   fileMatch: ['(^|/)docker-compose[^/]*\\.ya?ml$'],
 };
+
+export const supportedDatasources = [datasourceDocker.id];
diff --git a/lib/manager/dockerfile/index.ts b/lib/manager/dockerfile/index.ts
index b9b8ed54f9..7ebec5c877 100644
--- a/lib/manager/dockerfile/index.ts
+++ b/lib/manager/dockerfile/index.ts
@@ -1,4 +1,5 @@
 import { ProgrammingLanguage } from '../../constants';
+import * as datasourceDocker from '../../datasource/docker';
 import { extractPackageFile } from './extract';
 
 const language = ProgrammingLanguage.Docker;
@@ -8,3 +9,5 @@ export { extractPackageFile, language };
 export const defaultConfig = {
   fileMatch: ['(^|/|\\.)Dockerfile$', '(^|/)Dockerfile\\.[^/]*$'],
 };
+
+export const supportedDatasources = [datasourceDocker.id];
diff --git a/lib/manager/droneci/index.ts b/lib/manager/droneci/index.ts
index 8bf495e68b..a46b91d3f3 100644
--- a/lib/manager/droneci/index.ts
+++ b/lib/manager/droneci/index.ts
@@ -1,4 +1,5 @@
 import { ProgrammingLanguage } from '../../constants';
+import * as datasourceDocker from '../../datasource/docker';
 import { extractPackageFile } from './extract';
 
 const language = ProgrammingLanguage.Docker;
@@ -8,3 +9,5 @@ export { extractPackageFile, language };
 export const defaultConfig = {
   fileMatch: ['(^|/).drone.yml$'],
 };
+
+export const supportedDatasources = [datasourceDocker.id];
diff --git a/lib/manager/git-submodules/index.ts b/lib/manager/git-submodules/index.ts
index 22dde889ee..a420292c7c 100644
--- a/lib/manager/git-submodules/index.ts
+++ b/lib/manager/git-submodules/index.ts
@@ -1,3 +1,4 @@
+import { GitRefsDatasource } from '../../datasource/git-refs';
 import * as gitVersioning from '../../versioning/git';
 
 export { default as extractPackageFile } from './extract';
@@ -9,3 +10,5 @@ export const defaultConfig = {
   versioning: gitVersioning.id,
   fileMatch: ['(^|/).gitmodules$'],
 };
+
+export const supportedDatasources = [GitRefsDatasource.id];
diff --git a/lib/manager/github-actions/index.ts b/lib/manager/github-actions/index.ts
index 7899690d2b..5d39f85406 100644
--- a/lib/manager/github-actions/index.ts
+++ b/lib/manager/github-actions/index.ts
@@ -1,6 +1,7 @@
-import { extractPackageFile } from './extract';
+import * as githubTagsDatasource from '../../datasource/github-tags';
+import * as dockerVersioning from '../../versioning/docker';
 
-export { extractPackageFile };
+export { extractPackageFile } from './extract';
 
 export const defaultConfig = {
   fileMatch: [
@@ -8,3 +9,8 @@ export const defaultConfig = {
     '(^|\\/)action\\.ya?ml$',
   ],
 };
+
+export const supportedDatasources = [
+  githubTagsDatasource.id,
+  dockerVersioning.id,
+];
diff --git a/lib/manager/gitlabci-include/index.ts b/lib/manager/gitlabci-include/index.ts
index 9fa1f4d99f..77119f696a 100644
--- a/lib/manager/gitlabci-include/index.ts
+++ b/lib/manager/gitlabci-include/index.ts
@@ -1,3 +1,4 @@
+import * as datasourceGitlabTags from '../../datasource/gitlab-tags';
 import { extractPackageFile } from './extract';
 
 export { extractPackageFile };
@@ -5,3 +6,5 @@ export { extractPackageFile };
 export const defaultConfig = {
   fileMatch: ['\\.gitlab-ci\\.yml$'],
 };
+
+export const supportedDatasources = [datasourceGitlabTags.id];
diff --git a/lib/manager/gitlabci/index.ts b/lib/manager/gitlabci/index.ts
index 44f7928318..802c5072bb 100644
--- a/lib/manager/gitlabci/index.ts
+++ b/lib/manager/gitlabci/index.ts
@@ -1,4 +1,5 @@
 import { ProgrammingLanguage } from '../../constants';
+import * as datasourceDocker from '../../datasource/docker';
 import { extractAllPackageFiles, extractPackageFile } from './extract';
 
 const language = ProgrammingLanguage.Docker;
@@ -8,3 +9,5 @@ export { extractAllPackageFiles, extractPackageFile, language };
 export const defaultConfig = {
   fileMatch: ['\\.gitlab-ci\\.yml$'],
 };
+
+export const supportedDatasources = [datasourceDocker.id];
diff --git a/lib/manager/gomod/index.ts b/lib/manager/gomod/index.ts
index f5283a240d..979f955d89 100644
--- a/lib/manager/gomod/index.ts
+++ b/lib/manager/gomod/index.ts
@@ -1,4 +1,5 @@
 import { ProgrammingLanguage } from '../../constants';
+import * as datasourceGo from '../../datasource/go';
 import { updateArtifacts } from './artifacts';
 import { extractPackageFile } from './extract';
 import { updateDependency } from './update';
@@ -9,3 +10,5 @@ export { extractPackageFile, updateDependency, updateArtifacts };
 export const defaultConfig = {
   fileMatch: ['(^|/)go.mod$'],
 };
+
+export const supportedDatasources = [datasourceGo.id];
diff --git a/lib/manager/gradle-wrapper/index.ts b/lib/manager/gradle-wrapper/index.ts
index f65174938d..f3b90c2237 100644
--- a/lib/manager/gradle-wrapper/index.ts
+++ b/lib/manager/gradle-wrapper/index.ts
@@ -1,3 +1,4 @@
+import { GradleVersionDatasource } from '../../datasource/gradle-version';
 import { id as versioning } from '../../versioning/gradle';
 
 export { extractPackageFile } from './extract';
@@ -7,3 +8,5 @@ export const defaultConfig = {
   fileMatch: ['(^|/)gradle/wrapper/gradle-wrapper.properties$'],
   versioning,
 };
+
+export const supportedDatasources = [GradleVersionDatasource.id];
diff --git a/lib/manager/gradle/index.ts b/lib/manager/gradle/index.ts
index b3ff818c5e..2dd67902e1 100644
--- a/lib/manager/gradle/index.ts
+++ b/lib/manager/gradle/index.ts
@@ -1,4 +1,5 @@
 import { ProgrammingLanguage } from '../../constants';
+import * as datasourceMaven from '../../datasource/maven';
 import * as gradleVersioning from '../../versioning/gradle';
 import type {
   ExtractConfig,
@@ -38,3 +39,5 @@ export const defaultConfig = {
   timeout: 600,
   versioning: gradleVersioning.id,
 };
+
+export const supportedDatasources = [datasourceMaven.id];
diff --git a/lib/manager/helm-requirements/index.ts b/lib/manager/helm-requirements/index.ts
index e8cf05e2bf..186ec412d9 100644
--- a/lib/manager/helm-requirements/index.ts
+++ b/lib/manager/helm-requirements/index.ts
@@ -1,3 +1,4 @@
+import { HelmDatasource } from '../../datasource/helm';
 export { extractPackageFile } from './extract';
 
 export const defaultConfig = {
@@ -7,3 +8,5 @@ export const defaultConfig = {
   commitMessageTopic: 'helm chart {{depName}}',
   fileMatch: ['(^|/)requirements\\.yaml$'],
 };
+
+export const supportedDatasources = [HelmDatasource.id];
diff --git a/lib/manager/helm-values/index.ts b/lib/manager/helm-values/index.ts
index 1ef75d2873..2e26725500 100644
--- a/lib/manager/helm-values/index.ts
+++ b/lib/manager/helm-values/index.ts
@@ -1,3 +1,4 @@
+import * as datasourceDocker from '../../datasource/docker';
 export { extractPackageFile } from './extract';
 
 export const defaultConfig = {
@@ -5,3 +6,5 @@ export const defaultConfig = {
   fileMatch: ['(^|/)values.yaml$'],
   pinDigests: false,
 };
+
+export const supportedDatasources = [datasourceDocker.id];
diff --git a/lib/manager/helmfile/index.ts b/lib/manager/helmfile/index.ts
index d8d3e54196..915cbcf5b0 100644
--- a/lib/manager/helmfile/index.ts
+++ b/lib/manager/helmfile/index.ts
@@ -1,3 +1,4 @@
+import { HelmDatasource } from '../../datasource/helm';
 export { extractPackageFile } from './extract';
 
 export const defaultConfig = {
@@ -7,3 +8,5 @@ export const defaultConfig = {
   commitMessageTopic: 'helm chart {{depName}}',
   fileMatch: ['(^|/)helmfile.yaml$'],
 };
+
+export const supportedDatasources = [HelmDatasource.id];
diff --git a/lib/manager/helmsman/index.ts b/lib/manager/helmsman/index.ts
index 1012c71468..9f0cf9c133 100644
--- a/lib/manager/helmsman/index.ts
+++ b/lib/manager/helmsman/index.ts
@@ -1,5 +1,8 @@
+import { HelmDatasource } from '../../datasource/helm';
 export { extractPackageFile } from './extract';
 
 export const defaultConfig = {
   fileMatch: [],
 };
+
+export const supportedDatasources = [HelmDatasource.id];
diff --git a/lib/manager/helmv3/index.ts b/lib/manager/helmv3/index.ts
index 21a0ccd14f..de5feaa373 100644
--- a/lib/manager/helmv3/index.ts
+++ b/lib/manager/helmv3/index.ts
@@ -1,3 +1,5 @@
+import * as datasourceDocker from '../../datasource/docker';
+import { HelmDatasource } from '../../datasource/helm';
 export { updateArtifacts } from './artifacts';
 export { extractPackageFile } from './extract';
 export { bumpPackageVersion } from './update';
@@ -11,3 +13,5 @@ export const defaultConfig = {
   commitMessageTopic: 'helm chart {{depName}}',
   fileMatch: ['(^|/)Chart.yaml$'],
 };
+
+export const supportedDatasources = [datasourceDocker.id, HelmDatasource.id];
diff --git a/lib/manager/homebrew/index.ts b/lib/manager/homebrew/index.ts
index b45e932cf7..f41a1a8406 100644
--- a/lib/manager/homebrew/index.ts
+++ b/lib/manager/homebrew/index.ts
@@ -1,3 +1,4 @@
+import * as datasourceGithubTags from '../../datasource/github-tags';
 export { extractPackageFile } from './extract';
 export { updateDependency } from './update';
 
@@ -5,3 +6,5 @@ export const defaultConfig = {
   commitMessageTopic: 'Homebrew Formula {{depName}}',
   fileMatch: ['^Formula/[^/]+[.]rb$'],
 };
+
+export const supportedDatasources = [datasourceGithubTags.id];
diff --git a/lib/manager/html/index.ts b/lib/manager/html/index.ts
index 5b19123f0f..c196d4af86 100644
--- a/lib/manager/html/index.ts
+++ b/lib/manager/html/index.ts
@@ -1,3 +1,4 @@
+import { CdnJsDatasource } from '../../datasource/cdnjs';
 import * as semverVersioning from '../../versioning/semver';
 import { extractPackageFile } from './extract';
 
@@ -11,3 +12,5 @@ export const defaultConfig = {
   },
   pinDigests: false,
 };
+
+export const supportedDatasources = [CdnJsDatasource.id];
diff --git a/lib/manager/index.spec.ts b/lib/manager/index.spec.ts
index 53da1cc527..009979be19 100644
--- a/lib/manager/index.spec.ts
+++ b/lib/manager/index.spec.ts
@@ -1,10 +1,28 @@
+import { getDatasourceList } from '../datasource';
 import { loadModules } from '../util/modules';
 import type { ManagerApi } from './types';
 import * as manager from '.';
 
 jest.mock('../util/fs');
 
+const datasources = getDatasourceList();
+
 describe('manager/index', () => {
+  describe('supportedDatasources', () => {
+    for (const m of manager.getManagerList()) {
+      if (m === 'regex') {
+        // regex supports any
+        continue;
+      }
+      const supportedDatasources = manager.get(m, 'supportedDatasources');
+      it(`has valid supportedDatasources for ${m}`, () => {
+        expect(supportedDatasources).toBeNonEmptyArray();
+        supportedDatasources.every((d) => {
+          expect(datasources.includes(d)).toBeTrue();
+        });
+      });
+    }
+  });
   describe('get()', () => {
     it('gets something', () => {
       expect(manager.get('dockerfile', 'extractPackageFile')).not.toBeNull();
@@ -55,6 +73,7 @@ describe('manager/index', () => {
     it('returns null', async () => {
       manager.getManagers().set('dummy', {
         defaultConfig: {},
+        supportedDatasources: [],
       });
       expect(
         await manager.extractAllPackageFiles('unknown', {} as any, [])
@@ -66,6 +85,7 @@ describe('manager/index', () => {
     it('returns non-null', async () => {
       manager.getManagers().set('dummy', {
         defaultConfig: {},
+        supportedDatasources: [],
         extractAllPackageFiles: () => Promise.resolve([]),
       });
       expect(
@@ -81,6 +101,7 @@ describe('manager/index', () => {
     it('returns null', () => {
       manager.getManagers().set('dummy', {
         defaultConfig: {},
+        supportedDatasources: [],
       });
       expect(manager.extractPackageFile('unknown', null)).toBeNull();
       expect(manager.extractPackageFile('dummy', null)).toBeNull();
@@ -88,6 +109,7 @@ describe('manager/index', () => {
     it('returns non-null', () => {
       manager.getManagers().set('dummy', {
         defaultConfig: {},
+        supportedDatasources: [],
         extractPackageFile: () => Promise.resolve({ deps: [] }),
       });
 
@@ -102,6 +124,7 @@ describe('manager/index', () => {
     it('returns null', () => {
       manager.getManagers().set('dummy', {
         defaultConfig: {},
+        supportedDatasources: [],
       });
       expect(
         manager.getRangeStrategy({ manager: 'unknown', rangeStrategy: 'auto' })
@@ -110,6 +133,7 @@ describe('manager/index', () => {
     it('returns non-null', () => {
       manager.getManagers().set('dummy', {
         defaultConfig: {},
+        supportedDatasources: [],
         getRangeStrategy: () => 'replace',
       });
       expect(
@@ -118,6 +142,7 @@ describe('manager/index', () => {
 
       manager.getManagers().set('dummy', {
         defaultConfig: {},
+        supportedDatasources: [],
       });
       expect(
         manager.getRangeStrategy({ manager: 'dummy', rangeStrategy: 'auto' })
diff --git a/lib/manager/jenkins/index.ts b/lib/manager/jenkins/index.ts
index 6b8b845d29..afe5c64994 100644
--- a/lib/manager/jenkins/index.ts
+++ b/lib/manager/jenkins/index.ts
@@ -1,5 +1,8 @@
+import { JenkinsPluginsDatasource } from '../../datasource/jenkins-plugins';
 export { extractPackageFile } from './extract';
 
 export const defaultConfig = {
   fileMatch: ['(^|/)plugins\\.(txt|ya?ml)$'],
 };
+
+export const supportedDatasources = [JenkinsPluginsDatasource.id];
diff --git a/lib/manager/jsonnet-bundler/index.ts b/lib/manager/jsonnet-bundler/index.ts
index aa3fd5480c..df3ddd9a4d 100644
--- a/lib/manager/jsonnet-bundler/index.ts
+++ b/lib/manager/jsonnet-bundler/index.ts
@@ -8,3 +8,5 @@ export const defaultConfig = {
   fileMatch: ['(^|/)jsonnetfile.json$'],
   datasource: GitTagsDatasource.id,
 };
+
+export const supportedDatasources = [GitTagsDatasource.id];
diff --git a/lib/manager/kubernetes/index.ts b/lib/manager/kubernetes/index.ts
index bc2ce7d3bb..053562ef18 100644
--- a/lib/manager/kubernetes/index.ts
+++ b/lib/manager/kubernetes/index.ts
@@ -1,4 +1,5 @@
 import { ProgrammingLanguage } from '../../constants';
+import * as datasourceDocker from '../../datasource/docker';
 
 export { extractPackageFile } from './extract';
 
@@ -7,3 +8,5 @@ export const language = ProgrammingLanguage.Docker;
 export const defaultConfig = {
   fileMatch: [],
 };
+
+export const supportedDatasources = [datasourceDocker.id];
diff --git a/lib/manager/kustomize/index.ts b/lib/manager/kustomize/index.ts
index d28c8186e0..c3ac88cd6e 100644
--- a/lib/manager/kustomize/index.ts
+++ b/lib/manager/kustomize/index.ts
@@ -1,6 +1,17 @@
+import * as datasourceDocker from '../../datasource/docker';
+import { GitTagsDatasource } from '../../datasource/git-tags';
+import * as datasourceGitHubTags from '../../datasource/github-tags';
+import { HelmDatasource } from '../../datasource/helm';
 export { extractPackageFile } from './extract';
 
 export const defaultConfig = {
   fileMatch: ['(^|/)kustomization\\.yaml'],
   pinDigests: false,
 };
+
+export const supportedDatasources = [
+  datasourceDocker.id,
+  GitTagsDatasource.id,
+  datasourceGitHubTags.id,
+  HelmDatasource.id,
+];
diff --git a/lib/manager/leiningen/index.ts b/lib/manager/leiningen/index.ts
index f501592d2c..831fa32857 100644
--- a/lib/manager/leiningen/index.ts
+++ b/lib/manager/leiningen/index.ts
@@ -1,3 +1,4 @@
+import { ClojureDatasource } from '../../datasource/clojure';
 import * as mavenVersioning from '../../versioning/maven';
 
 export { extractPackageFile } from './extract';
@@ -6,3 +7,5 @@ export const defaultConfig = {
   fileMatch: ['(^|/)project\\.clj$'],
   versioning: mavenVersioning.id,
 };
+
+export const supportedDatasources = [ClojureDatasource.id];
diff --git a/lib/manager/maven/index.ts b/lib/manager/maven/index.ts
index 3c6c02bfe1..b53ff32133 100644
--- a/lib/manager/maven/index.ts
+++ b/lib/manager/maven/index.ts
@@ -1,4 +1,5 @@
 import { ProgrammingLanguage } from '../../constants';
+import * as datasourceMaven from '../../datasource/maven';
 import * as mavenVersioning from '../../versioning/maven';
 
 export { extractAllPackageFiles } from './extract';
@@ -10,3 +11,5 @@ export const defaultConfig = {
   fileMatch: ['\\.pom\\.xml$', '(^|/)pom\\.xml$'],
   versioning: mavenVersioning.id,
 };
+
+export const supportedDatasources = [datasourceMaven.id];
diff --git a/lib/manager/meteor/index.ts b/lib/manager/meteor/index.ts
index 81f312736e..63a1000f81 100644
--- a/lib/manager/meteor/index.ts
+++ b/lib/manager/meteor/index.ts
@@ -1,4 +1,5 @@
 import { ProgrammingLanguage } from '../../constants';
+import { id as npmId } from '../../datasource/npm';
 
 export { extractPackageFile } from './extract';
 
@@ -7,3 +8,5 @@ export const language = ProgrammingLanguage.JavaScript;
 export const defaultConfig = {
   fileMatch: ['(^|/)package.js$'],
 };
+
+export const supportedDatasources = [npmId];
diff --git a/lib/manager/mix/index.ts b/lib/manager/mix/index.ts
index ca250c6fe9..fc2ce8347a 100644
--- a/lib/manager/mix/index.ts
+++ b/lib/manager/mix/index.ts
@@ -1,4 +1,5 @@
 import { ProgrammingLanguage } from '../../constants';
+import { HexDatasource } from '../../datasource/hex';
 import * as hexVersioning from '../../versioning/hex';
 
 export { extractPackageFile } from './extract';
@@ -10,3 +11,5 @@ export const defaultConfig = {
   fileMatch: ['(^|/)mix\\.exs$'],
   versioning: hexVersioning.id,
 };
+
+export const supportedDatasources = [HexDatasource.id];
diff --git a/lib/manager/nodenv/index.ts b/lib/manager/nodenv/index.ts
index d25368b739..cf206a758f 100644
--- a/lib/manager/nodenv/index.ts
+++ b/lib/manager/nodenv/index.ts
@@ -1,4 +1,5 @@
 import { ProgrammingLanguage } from '../../constants';
+import * as datasourceGithubTags from '../../datasource/github-tags';
 import * as nodeVersioning from '../../versioning/node';
 
 export { extractPackageFile } from './extract';
@@ -9,3 +10,5 @@ export const defaultConfig = {
   fileMatch: ['(^|/).node-version$'],
   versioning: nodeVersioning.id,
 };
+
+export const supportedDatasources = [datasourceGithubTags.id];
diff --git a/lib/manager/npm/index.ts b/lib/manager/npm/index.ts
index 35286fb455..0d5bdbf49d 100644
--- a/lib/manager/npm/index.ts
+++ b/lib/manager/npm/index.ts
@@ -1,4 +1,6 @@
 import { ProgrammingLanguage } from '../../constants';
+import * as datasourceGithubTags from '../../datasource/github-tags';
+import { id as npmId } from '../../datasource/npm';
 import * as npmVersioning from '../../versioning/npm';
 
 export { detectGlobalConfig } from './detect';
@@ -28,3 +30,5 @@ export const defaultConfig = {
       "[{{#if displayFrom}}`{{{displayFrom}}}` -> {{else}}{{#if currentValue}}`{{{currentValue}}}` -> {{/if}}{{/if}}{{#if displayTo}}`{{{displayTo}}}`{{else}}`{{{newValue}}}`{{/if}}]({{#if depName}}https://renovatebot.com/diffs/npm/{{replace '/' '%2f' depName}}/{{{currentVersion}}}/{{{newVersion}}}{{/if}})",
   },
 };
+
+export const supportedDatasources = [datasourceGithubTags.id, npmId];
diff --git a/lib/manager/nuget/index.ts b/lib/manager/nuget/index.ts
index 35f8756468..0fbdfe63c4 100644
--- a/lib/manager/nuget/index.ts
+++ b/lib/manager/nuget/index.ts
@@ -1,4 +1,5 @@
 import { ProgrammingLanguage } from '../../constants';
+import * as datasourceNuget from '../../datasource/nuget';
 
 export { extractPackageFile } from './extract';
 export { updateArtifacts } from './artifacts';
@@ -13,3 +14,5 @@ export const defaultConfig = {
     '(^|\\/)global\\.json$',
   ],
 };
+
+export const supportedDatasources = [datasourceNuget.id];
diff --git a/lib/manager/nvm/index.ts b/lib/manager/nvm/index.ts
index 2bdae05167..337f088cac 100644
--- a/lib/manager/nvm/index.ts
+++ b/lib/manager/nvm/index.ts
@@ -1,4 +1,5 @@
 import { ProgrammingLanguage } from '../../constants';
+import * as datasourceGithubTags from '../../datasource/github-tags';
 import * as nodeVersioning from '../../versioning/node';
 
 export { extractPackageFile } from './extract';
@@ -10,3 +11,5 @@ export const defaultConfig = {
   versioning: nodeVersioning.id,
   pinDigests: false,
 };
+
+export const supportedDatasources = [datasourceGithubTags.id];
diff --git a/lib/manager/pip-compile/index.ts b/lib/manager/pip-compile/index.ts
index 99266a9dbe..0e9c061353 100644
--- a/lib/manager/pip-compile/index.ts
+++ b/lib/manager/pip-compile/index.ts
@@ -1,4 +1,5 @@
 import { ProgrammingLanguage } from '../../constants';
+import { PypiDatasource } from '../../datasource/pypi';
 
 export { extractPackageFile } from '../pip_requirements/extract';
 export { updateArtifacts } from './artifacts';
@@ -6,6 +7,8 @@ export { updateArtifacts } from './artifacts';
 export const language = ProgrammingLanguage.Python;
 export const supportsLockFileMaintenance = true;
 
+export const supportedDatasources = [PypiDatasource.id];
+
 export const defaultConfig = {
   fileMatch: [],
   lockFileMaintenance: {
diff --git a/lib/manager/pip_requirements/index.ts b/lib/manager/pip_requirements/index.ts
index 351c36b7d7..a2bf950ff2 100644
--- a/lib/manager/pip_requirements/index.ts
+++ b/lib/manager/pip_requirements/index.ts
@@ -1,4 +1,5 @@
 import { ProgrammingLanguage } from '../../constants';
+import { PypiDatasource } from '../../datasource/pypi';
 
 export { updateArtifacts } from './artifacts';
 export { extractPackageFile } from './extract';
@@ -9,3 +10,5 @@ export const language = ProgrammingLanguage.Python;
 export const defaultConfig = {
   fileMatch: ['(^|/)([\\w-]*)requirements\\.(txt|pip)$'],
 };
+
+export const supportedDatasources = [PypiDatasource.id];
diff --git a/lib/manager/pip_setup/index.ts b/lib/manager/pip_setup/index.ts
index 643123288b..9219cd5026 100644
--- a/lib/manager/pip_setup/index.ts
+++ b/lib/manager/pip_setup/index.ts
@@ -1,4 +1,5 @@
 import { ProgrammingLanguage } from '../../constants';
+import { PypiDatasource } from '../../datasource/pypi';
 
 export { extractPackageFile } from './extract';
 
@@ -7,3 +8,5 @@ export const language = ProgrammingLanguage.Python;
 export const defaultConfig = {
   fileMatch: ['(^|/)setup.py$'],
 };
+
+export const supportedDatasources = [PypiDatasource.id];
diff --git a/lib/manager/pipenv/index.ts b/lib/manager/pipenv/index.ts
index 3f4726a362..acb2766bc3 100644
--- a/lib/manager/pipenv/index.ts
+++ b/lib/manager/pipenv/index.ts
@@ -1,4 +1,5 @@
 import { ProgrammingLanguage } from '../../constants';
+import { PypiDatasource } from '../../datasource/pypi';
 
 export { extractPackageFile } from './extract';
 export { updateArtifacts } from './artifacts';
@@ -6,6 +7,8 @@ export { updateArtifacts } from './artifacts';
 export const language = ProgrammingLanguage.Python;
 export const supportsLockFileMaintenance = true;
 
+export const supportedDatasources = [PypiDatasource.id];
+
 export const defaultConfig = {
   fileMatch: ['(^|/)Pipfile$'],
 };
diff --git a/lib/manager/poetry/index.ts b/lib/manager/poetry/index.ts
index 9ce8080082..3440d2cbaa 100644
--- a/lib/manager/poetry/index.ts
+++ b/lib/manager/poetry/index.ts
@@ -1,8 +1,11 @@
 import { ProgrammingLanguage } from '../../constants';
+import { PypiDatasource } from '../../datasource/pypi';
 
 export { extractPackageFile } from './extract';
 export { updateArtifacts } from './artifacts';
 
+export const supportedDatasources = [PypiDatasource.id];
+
 export const language = ProgrammingLanguage.Python;
 export const supportsLockFileMaintenance = true;
 
diff --git a/lib/manager/pre-commit/index.ts b/lib/manager/pre-commit/index.ts
index f8d1af6668..e596a40816 100644
--- a/lib/manager/pre-commit/index.ts
+++ b/lib/manager/pre-commit/index.ts
@@ -1,5 +1,9 @@
+import { id as githubTagsId } from '../../datasource/github-tags';
+import { id as gitlabTagsId } from '../../datasource/gitlab-tags';
 export { extractPackageFile } from './extract';
 
+export const supportedDatasources = [githubTagsId, gitlabTagsId];
+
 export const defaultConfig = {
   commitMessageTopic: 'pre-commit hook {{depName}}',
   enabled: false,
diff --git a/lib/manager/pub/index.ts b/lib/manager/pub/index.ts
index dcdceecd7f..1fde801f57 100644
--- a/lib/manager/pub/index.ts
+++ b/lib/manager/pub/index.ts
@@ -1,7 +1,10 @@
+import { DartDatasource } from '../../datasource/dart';
 import * as npmVersioning from '../../versioning/npm';
 
 export { extractPackageFile } from './extract';
 
+export const supportedDatasources = [DartDatasource.id];
+
 export const defaultConfig = {
   fileMatch: ['(^|/)pubspec\\.ya?ml$'],
   versioning: npmVersioning.id,
diff --git a/lib/manager/pyenv/index.ts b/lib/manager/pyenv/index.ts
index a569478bcb..3be9c1f583 100644
--- a/lib/manager/pyenv/index.ts
+++ b/lib/manager/pyenv/index.ts
@@ -1,10 +1,13 @@
 import { ProgrammingLanguage } from '../../constants';
+import * as datasourceDocker from '../../datasource/docker';
 import * as dockerVersioning from '../../versioning/docker';
 
 export { extractPackageFile } from './extract';
 
 export const language = ProgrammingLanguage.Python;
 
+export const supportedDatasources = [datasourceDocker.id];
+
 export const defaultConfig = {
   fileMatch: ['(^|/).python-version$'],
   versioning: dockerVersioning.id,
diff --git a/lib/manager/regex/index.ts b/lib/manager/regex/index.ts
index 7557012ad6..0856607cff 100644
--- a/lib/manager/regex/index.ts
+++ b/lib/manager/regex/index.ts
@@ -11,6 +11,8 @@ export const defaultConfig = {
   pinDigests: false,
 };
 
+export const supportedDatasources = ['*'];
+
 export function extractPackageFile(
   content: string,
   packageFile: string,
diff --git a/lib/manager/regex/readme.md b/lib/manager/regex/readme.md
index 71d5337bb0..75becb1c6f 100644
--- a/lib/manager/regex/readme.md
+++ b/lib/manager/regex/readme.md
@@ -3,7 +3,8 @@ The `regex` manager is designed to allow users to manually configure Renovate fo
 This manager is unique in Renovate in that:
 
 - It is configurable via regex named capture groups
-- Through the use of the `regexManagers` config, multiple "regex managers" can be created for the same repository.
+- Through the use of the `regexManagers` config, multiple "regex managers" can be created for the same repository
+- It can extract any `datasource`
 
 ### Required Fields
 
diff --git a/lib/manager/ruby-version/index.ts b/lib/manager/ruby-version/index.ts
index dd4c721415..757ef8d800 100644
--- a/lib/manager/ruby-version/index.ts
+++ b/lib/manager/ruby-version/index.ts
@@ -1,8 +1,11 @@
 import { ProgrammingLanguage } from '../../constants';
+import { RubyVersionDatasource } from '../../datasource/ruby-version';
 import * as rubyVersioning from '../../versioning/ruby';
 
 export { extractPackageFile } from './extract';
 
+export const supportedDatasources = [RubyVersionDatasource.id];
+
 export const language = ProgrammingLanguage.Ruby;
 
 export const defaultConfig = {
diff --git a/lib/manager/sbt/index.ts b/lib/manager/sbt/index.ts
index 017a1a8acb..e281179a86 100644
--- a/lib/manager/sbt/index.ts
+++ b/lib/manager/sbt/index.ts
@@ -1,8 +1,17 @@
+import * as datasourceMaven from '../../datasource/maven';
+import * as datasourceSbtPackage from '../../datasource/sbt-package';
+import * as datasourceSbtPlugin from '../../datasource/sbt-plugin';
 import * as ivyVersioning from '../../versioning/ivy';
 
 export { extractPackageFile } from './extract';
 export { bumpPackageVersion } from './update';
 
+export const supportedDatasources = [
+  datasourceMaven.id,
+  datasourceSbtPackage.id,
+  datasourceSbtPlugin.id,
+];
+
 export const defaultConfig = {
   fileMatch: ['\\.sbt$', 'project/[^/]*.scala$'],
   versioning: ivyVersioning.id,
diff --git a/lib/manager/setup-cfg/index.ts b/lib/manager/setup-cfg/index.ts
index 270df5da4d..d954804eb5 100644
--- a/lib/manager/setup-cfg/index.ts
+++ b/lib/manager/setup-cfg/index.ts
@@ -1,9 +1,12 @@
 import { ProgrammingLanguage } from '../../constants';
+import { PypiDatasource } from '../../datasource/pypi';
 import { id as versioning } from '../../versioning/pep440';
 
 export { extractPackageFile } from './extract';
 export { getRangeStrategy } from './range';
 
+export const supportedDatasources = [PypiDatasource.id];
+
 export const language = ProgrammingLanguage.Python;
 
 export const defaultConfig = {
diff --git a/lib/manager/swift/index.ts b/lib/manager/swift/index.ts
index e9102b4cf2..4d5967e2f5 100644
--- a/lib/manager/swift/index.ts
+++ b/lib/manager/swift/index.ts
@@ -1,7 +1,10 @@
+import { GitTagsDatasource } from '../../datasource/git-tags';
 import * as swiftVersioning from '../../versioning/swift';
 
 export { extractPackageFile } from './extract';
 
+export const supportedDatasources = [GitTagsDatasource.id];
+
 export const defaultConfig = {
   fileMatch: ['(^|/)Package\\.swift'],
   versioning: swiftVersioning.id,
diff --git a/lib/manager/terraform-version/index.ts b/lib/manager/terraform-version/index.ts
index 9a55bdbd5c..718e39968c 100644
--- a/lib/manager/terraform-version/index.ts
+++ b/lib/manager/terraform-version/index.ts
@@ -1,7 +1,10 @@
+import * as datasourceGitHubRelease from '../../datasource/github-releases';
 import * as hashicorpVersioning from '../../versioning/hashicorp';
 
 export { extractPackageFile } from './extract';
 
+export const supportedDatasources = [datasourceGitHubRelease.id];
+
 export const defaultConfig = {
   fileMatch: ['(^|/)\\.terraform-version$'],
   versioning: hashicorpVersioning.id,
diff --git a/lib/manager/terraform/index.ts b/lib/manager/terraform/index.ts
index 17107d2b17..cea16def59 100644
--- a/lib/manager/terraform/index.ts
+++ b/lib/manager/terraform/index.ts
@@ -1,8 +1,23 @@
+import { BitBucketTagsDatasource } from '../../datasource/bitbucket-tags';
+import { GitTagsDatasource } from '../../datasource/git-tags';
+import * as datasourceGithubTags from '../../datasource/github-tags';
+import { HelmDatasource } from '../../datasource/helm';
+import { TerraformModuleDatasource } from '../../datasource/terraform-module';
+import { TerraformProviderDatasource } from '../../datasource/terraform-provider';
 import * as hashicorpVersioning from '../../versioning/hashicorp';
 
 export { updateArtifacts } from './lockfile';
 export { extractPackageFile } from './extract';
 
+export const supportedDatasources = [
+  BitBucketTagsDatasource.id,
+  GitTagsDatasource.id,
+  datasourceGithubTags.id,
+  HelmDatasource.id,
+  TerraformModuleDatasource.id,
+  TerraformProviderDatasource.id,
+];
+
 export const supportsLockFileMaintenance = true;
 export const defaultConfig = {
   commitMessageTopic:
diff --git a/lib/manager/terragrunt-version/index.ts b/lib/manager/terragrunt-version/index.ts
index fe24c1f17b..1b6aa3b029 100644
--- a/lib/manager/terragrunt-version/index.ts
+++ b/lib/manager/terragrunt-version/index.ts
@@ -1,7 +1,10 @@
+import * as datasourceGitHubRelease from '../../datasource/github-releases';
 import * as hashicorpVersioning from '../../versioning/hashicorp';
 
 export { extractPackageFile } from './extract';
 
+export const supportedDatasources = [datasourceGitHubRelease.id];
+
 export const defaultConfig = {
   fileMatch: ['(^|/)\\.terragrunt-version$'],
   versioning: hashicorpVersioning.id,
diff --git a/lib/manager/terragrunt/index.ts b/lib/manager/terragrunt/index.ts
index 61960a825b..ac5b5a0628 100644
--- a/lib/manager/terragrunt/index.ts
+++ b/lib/manager/terragrunt/index.ts
@@ -1,7 +1,16 @@
+import { GitTagsDatasource } from '../../datasource/git-tags';
+import * as datasourceGithubTags from '../../datasource/github-tags';
+import { TerraformModuleDatasource } from '../../datasource/terraform-module';
 import * as hashicorpVersioning from '../../versioning/hashicorp';
 
 export { extractPackageFile } from './extract';
 
+export const supportedDatasources = [
+  GitTagsDatasource.id,
+  datasourceGithubTags.id,
+  TerraformModuleDatasource.id,
+];
+
 export const defaultConfig = {
   commitMessageTopic: 'Terragrunt dependency {{depName}}',
   fileMatch: ['(^|/)terragrunt\\.hcl$'],
diff --git a/lib/manager/travis/index.ts b/lib/manager/travis/index.ts
index 14e453374c..ee13640188 100644
--- a/lib/manager/travis/index.ts
+++ b/lib/manager/travis/index.ts
@@ -1,10 +1,13 @@
 import { ProgrammingLanguage } from '../../constants';
+import * as datasourceGithubTags from '../../datasource/github-tags';
 import * as nodeVersioning from '../../versioning/node';
 
 export { extractPackageFile } from './extract';
 
 export const language = ProgrammingLanguage.NodeJS;
 
+export const supportedDatasources = [datasourceGithubTags.id];
+
 export const defaultConfig = {
   fileMatch: ['^.travis.yml$'],
   major: {
diff --git a/lib/manager/types.ts b/lib/manager/types.ts
index 6bfecd4489..0ce2162f26 100644
--- a/lib/manager/types.ts
+++ b/lib/manager/types.ts
@@ -246,6 +246,8 @@ export interface ManagerApi extends ModuleApi {
   language?: ProgrammingLanguage;
   supportsLockFileMaintenance?: boolean;
 
+  supportedDatasources: string[];
+
   bumpPackageVersion?(
     content: string,
     currentValue: string,
diff --git a/tools/docs/manager.ts b/tools/docs/manager.ts
index bf3bbd4323..b4eb71109f 100644
--- a/tools/docs/manager.ts
+++ b/tools/docs/manager.ts
@@ -21,7 +21,7 @@ export async function generateManagers(dist: string): Promise<void> {
     const language = definition.language || 'other';
     allLanguages[language] = allLanguages[language] || [];
     allLanguages[language].push(manager);
-    const { defaultConfig } = definition;
+    const { defaultConfig, supportedDatasources } = definition;
     const { fileMatch } = defaultConfig as RenovateConfig;
     const displayName = getDisplayName(manager, definition);
     let md = `---
@@ -56,8 +56,15 @@ sidebar_label: ${displayName}
         }
       }
       md += `For details on how to extend a manager's \`fileMatch\` value, please follow [this link](/modules/manager/#file-matching).\n\n`;
+      md += '## Supported datasources\n\n';
+      const escapedDatasources = (supportedDatasources || [])
+        .map(
+          (datasource) =>
+            `[\`${datasource}\`](../datasource/#${datasource}-datasource)`
+        )
+        .join(', ');
+      md += `This manager supports extracting the following datasources: ${escapedDatasources}.\n\n`;
     }
-
     const managerReadmeContent = await readFile(
       `lib/manager/${manager}/readme.md`
     );
-- 
GitLab