From 8621fe42d76b809e9ba4ae844920f8ed0373817a Mon Sep 17 00:00:00 2001
From: chris48s <chris48s@users.noreply.github.com>
Date: Sun, 2 Jun 2019 21:59:55 +0100
Subject: [PATCH] Upgrade Joi (#3505)

* upgrade joi
* find & replace ALL THE THINGS
* update related deps
---
 core/base-service/base-json.spec.js           |  2 +-
 core/base-service/base-svg-scraping.spec.js   |  2 +-
 core/base-service/base-xml.spec.js            |  2 +-
 core/base-service/base-yaml.spec.js           |  2 +-
 core/base-service/base.js                     |  2 +-
 core/base-service/base.spec.js                |  2 +-
 core/base-service/cache-headers.js            |  2 +-
 core/base-service/categories.js               |  2 +-
 core/base-service/deprecated-service.js       |  2 +-
 core/base-service/examples.js                 |  2 +-
 core/base-service/redirector.js               |  2 +-
 core/base-service/route.js                    |  2 +-
 core/base-service/route.spec.js               |  2 +-
 core/base-service/service-definitions.js      |  2 +-
 core/base-service/validate.js                 |  2 +-
 core/base-service/validate.spec.js            |  2 +-
 core/server/server.js                         |  2 +-
 .../service-test-runner/icedfrisby-shields.js |  2 +-
 doc/TUTORIAL.md                               |  2 +-
 doc/rewriting-services.md                     |  4 +-
 lib/logos.js                                  |  2 +-
 package-lock.json                             | 75 +++++++++++++++----
 package.json                                  |  6 +-
 services/amo/amo-base.js                      |  2 +-
 services/amo/amo-rating.tester.js             |  2 +-
 services/ansible/ansible-quality.service.js   |  2 +-
 services/ansible/ansible-role.service.js      |  2 +-
 services/apm/apm.service.js                   |  2 +-
 services/appveyor/appveyor-base.js            |  2 +-
 services/appveyor/appveyor-tests.tester.js    |  2 +-
 services/archlinux/archlinux.service.js       |  2 +-
 services/aur/aur.service.js                   |  2 +-
 services/azure-devops/azure-devops-base.js    |  2 +-
 .../azure-devops-coverage.service.js          |  2 +-
 services/azure-devops/azure-devops-helpers.js |  2 +-
 .../azure-devops-tests.service.js             |  2 +-
 .../azure-devops/azure-devops-tests.tester.js |  2 +-
 services/beerpay/beerpay.service.js           |  2 +-
 services/bintray/bintray.service.js           |  2 +-
 services/bit/bit-components.service.js        |  2 +-
 .../bitbucket/bitbucket-issues.service.js     |  2 +-
 .../bitbucket/bitbucket-pipelines.service.js  |  2 +-
 .../bitbucket-pull-request.service.js         |  2 +-
 services/bitrise/bitrise.service.js           |  2 +-
 services/bountysource/bountysource.service.js |  2 +-
 services/bower/bower-base.js                  |  2 +-
 services/bower/bower-version.tester.js        |  2 +-
 services/bstats/bstats-players.service.js     |  2 +-
 services/bstats/bstats-servers.service.js     |  2 +-
 services/bugzilla/bugzilla.service.js         |  2 +-
 services/bugzilla/bugzilla.tester.js          |  2 +-
 services/build-status.js                      |  2 +-
 services/buildkite/buildkite.service.js       |  2 +-
 services/buildkite/buildkite.tester.js        |  2 +-
 services/bundlephobia/bundlephobia.service.js |  2 +-
 services/cdnjs/cdnjs.service.js               |  2 +-
 .../chrome-web-store-price.tester.js          |  2 +-
 .../chrome-web-store-rating.tester.js         |  2 +-
 .../cii-best-practices.service.js             |  2 +-
 services/circleci/circleci.service.js         |  2 +-
 services/clojars/clojars-base.js              |  2 +-
 services/cocoapods/cocoapods-base.js          |  2 +-
 services/cocoapods/cocoapods-docs.service.js  |  2 +-
 .../cocoapods/cocoapods-platform.tester.js    |  2 +-
 services/codacy/codacy-coverage.service.js    |  2 +-
 services/codacy/codacy-grade.service.js       |  2 +-
 services/codacy/codacy-helpers.js             |  2 +-
 .../codeclimate-analysis.service.js           |  2 +-
 .../codeclimate-analysis.tester.js            |  2 +-
 services/codeclimate/codeclimate-common.js    |  2 +-
 .../codeclimate-coverage.service.js           |  2 +-
 .../codeclimate-coverage.tester.js            |  2 +-
 services/codecov/codecov.service.js           |  2 +-
 services/codeship/codeship.service.js         |  2 +-
 services/codetally/codetally.service.js       |  2 +-
 services/codetally/codetally.tester.js        |  2 +-
 services/conda/conda-base.js                  |  2 +-
 services/conda/conda.tester.js                |  2 +-
 .../continuousphp/continuousphp.service.js    |  2 +-
 .../continuousphp/continuousphp.tester.js     |  2 +-
 services/cookbook/cookbook.service.js         |  2 +-
 services/coveralls/coveralls.service.js       |  2 +-
 services/coverity/coverity-scan.service.js    |  2 +-
 services/coverity/coverity-scan.tester.js     |  2 +-
 services/cpan/cpan.js                         |  2 +-
 services/cran/cran.service.js                 |  2 +-
 services/crates/crates-base.js                |  2 +-
 services/ctan/ctan.service.js                 |  2 +-
 services/david/david.service.js               |  2 +-
 services/david/david.tester.js                |  2 +-
 services/debian/debian.service.js             |  2 +-
 services/debug/debug.tester.js                |  2 +-
 services/dependabot/dependabot.service.js     |  2 +-
 services/depfu/depfu.service.js               |  2 +-
 services/depfu/depfu.tester.js                |  2 +-
 services/discord/discord.service.js           |  2 +-
 services/discord/discord.tester.js            |  2 +-
 services/discourse/discourse.service.js       |  2 +-
 services/discourse/discourse.tester.js        |  2 +-
 services/docker/docker-automated.service.js   |  2 +-
 services/docker/docker-automated.tester.js    |  2 +-
 services/docker/docker-build.service.js       |  2 +-
 .../docker/docker-cloud-automated.tester.js   |  2 +-
 services/docker/docker-cloud-common-fetch.js  |  2 +-
 services/docker/docker-pulls.service.js       |  2 +-
 services/drone/drone-build.service.js         |  2 +-
 services/drone/drone-build.tester.js          |  2 +-
 services/dub/dub-download.service.js          |  2 +-
 services/dub/dub-download.tester.js           |  2 +-
 services/dub/dub-license.service.js           |  2 +-
 services/dub/dub-version.service.js           |  2 +-
 services/dub/dub-version.tester.js            |  2 +-
 services/dynamic-common.js                    |  2 +-
 services/dynamic/dynamic-helpers.js           |  2 +-
 services/dynamic/dynamic-json.service.js      |  2 +-
 services/dynamic/dynamic-json.tester.js       |  2 +-
 services/dynamic/dynamic-yaml.service.js      |  2 +-
 .../eclipse-marketplace-downloads.service.js  |  2 +-
 .../eclipse-marketplace-favorites.service.js  |  2 +-
 .../eclipse-marketplace-favorites.tester.js   |  2 +-
 .../eclipse-marketplace-license.service.js    |  2 +-
 .../eclipse-marketplace-update.service.js     |  2 +-
 .../eclipse-marketplace-version.service.js    |  2 +-
 services/elm-package/elm-package.service.js   |  2 +-
 services/endpoint-common.js                   |  2 +-
 services/endpoint/endpoint.service.js         |  2 +-
 services/f-droid/f-droid.service.js           |  2 +-
 services/fedora/fedora.service.js             |  2 +-
 services/gem/gem-downloads.service.js         |  2 +-
 services/gem/gem-owner.service.js             |  2 +-
 services/gem/gem-owner.tester.js              |  2 +-
 services/gem/gem-rank.service.js              |  2 +-
 services/gem/gem-rank.tester.js               |  2 +-
 services/gem/gem-version.service.js           |  2 +-
 services/github/github-api-provider.js        |  2 +-
 .../github/github-commit-activity.service.js  |  2 +-
 .../github/github-commit-status.service.js    |  2 +-
 .../github/github-commits-since.service.js    |  2 +-
 .../github/github-commits-since.tester.js     |  2 +-
 services/github/github-common-fetch.js        |  2 +-
 .../github/github-contributors.service.js     |  2 +-
 services/github/github-downloads.service.js   |  2 +-
 services/github/github-downloads.tester.js    |  2 +-
 services/github/github-followers.service.js   |  2 +-
 services/github/github-followers.tester.js    |  2 +-
 services/github/github-forks.service.js       |  2 +-
 .../github/github-issue-detail.service.js     |  2 +-
 services/github/github-issue-detail.tester.js |  2 +-
 services/github/github-issues.service.js      |  2 +-
 services/github/github-issues.tester.js       |  2 +-
 .../github/github-language-count.tester.js    |  2 +-
 services/github/github-languages-base.js      |  2 +-
 services/github/github-last-commit.service.js |  2 +-
 services/github/github-license.service.js     |  2 +-
 services/github/github-manifest.service.js    |  2 +-
 services/github/github-manifest.tester.js     |  2 +-
 .../github/github-package-json.service.js     |  2 +-
 services/github/github-package-json.tester.js |  2 +-
 ...github-pull-request-check-state.service.js |  2 +-
 .../github/github-release-date.service.js     |  2 +-
 services/github/github-repo-size.service.js   |  2 +-
 services/github/github-search.service.js      |  2 +-
 services/github/github-size.service.js        |  2 +-
 services/github/github-stars.service.js       |  2 +-
 services/github/github-stars.tester.js        |  2 +-
 services/github/github-tag.service.js         |  2 +-
 services/github/github-tag.tester.js          |  2 +-
 services/github/github-top-language.tester.js |  2 +-
 services/github/github-watchers.service.js    |  2 +-
 services/github/github-watchers.tester.js     |  2 +-
 .../gitlab/gitlab-pipeline-status.service.js  |  2 +-
 services/hackage/hackage-deps.tester.js       |  2 +-
 services/hexpm/hexpm.service.js               |  2 +-
 services/hexpm/hexpm.tester.js                |  2 +-
 services/homebrew/homebrew.service.js         |  2 +-
 services/hsts/hsts.service.js                 |  2 +-
 services/itunes/itunes.service.js             |  2 +-
 services/jenkins/jenkins-build.service.js     |  2 +-
 services/jenkins/jenkins-build.tester.js      |  2 +-
 services/jenkins/jenkins-common.js            |  2 +-
 services/jenkins/jenkins-coverage.service.js  |  2 +-
 .../jenkins-plugin-installs.service.js        |  2 +-
 .../jenkins/jenkins-plugin-version.tester.js  |  2 +-
 services/jenkins/jenkins-tests.service.js     |  2 +-
 .../jetbrains/jetbrains-downloads.service.js  |  2 +-
 .../jetbrains/jetbrains-version.service.js    |  2 +-
 services/jira/jira-issue.service.js           |  2 +-
 services/jira/jira-sprint.service.js          |  2 +-
 services/jitpack/jitpack-version.service.js   |  2 +-
 services/jitpack/jitpack-version.tester.js    |  2 +-
 services/jsdelivr/jsdelivr-base.js            |  2 +-
 services/keybase/keybase-btc.service.js       |  2 +-
 services/keybase/keybase-pgp.service.js       |  2 +-
 services/keybase/keybase-pgp.tester.js        |  2 +-
 services/keybase/keybase-xlm.service.js       |  2 +-
 services/keybase/keybase-zec.service.js       |  2 +-
 .../leanpub/leanpub-book-summary.service.js   |  2 +-
 .../leanpub/leanpub-book-summary.tester.js    |  2 +-
 services/lgtm/lgtm-base.js                    |  2 +-
 services/lgtm/lgtm.tester.js                  |  2 +-
 services/liberapay/liberapay-base.js          |  2 +-
 services/librariesio/librariesio-common.js    |  2 +-
 .../librariesio-dependencies.service.js       |  2 +-
 services/luarocks/luarocks.service.js         |  2 +-
 services/luarocks/luarocks.tester.js          |  2 +-
 services/mastodon/mastodon-follow.service.js  |  2 +-
 services/matrix/matrix.service.js             |  2 +-
 services/matrix/matrix.tester.js              |  2 +-
 .../maven-central/maven-central.service.js    |  2 +-
 .../maven-metadata/maven-metadata.service.js  |  2 +-
 services/microbadger/microbadger-base.js      |  2 +-
 .../microbadger/microbadger-layers.tester.js  |  2 +-
 .../mozilla-observatory.service.js            |  2 +-
 .../mozilla-observatory.tester.js             |  2 +-
 services/nexus/nexus.service.js               |  2 +-
 services/nodeping/nodeping-status.service.js  |  2 +-
 services/nodeping/nodeping-status.tester.js   |  2 +-
 services/nodeping/nodeping-uptime.service.js  |  2 +-
 services/npm/npm-base.js                      |  2 +-
 services/npm/npm-downloads.service.js         |  2 +-
 services/npm/npm-type-definitions.tester.js   |  2 +-
 services/npm/npm-version.service.js           |  2 +-
 services/nuget/nuget-v2-service-family.js     |  2 +-
 services/nuget/nuget-v3-service-family.js     |  2 +-
 .../opencollective/opencollective-base.js     |  2 +-
 services/package-json-helpers.js              |  2 +-
 .../packagecontrol/packagecontrol.service.js  |  2 +-
 services/packagist/packagist-base.js          |  2 +-
 .../packagist/packagist-downloads.service.js  |  2 +-
 .../packagist/packagist-license.service.js    |  2 +-
 .../packagist/packagist-version.service.js    |  2 +-
 .../packagist/packagist-version.tester.js     |  2 +-
 .../powershellgallery.tester.js               |  2 +-
 services/pub/pub.service.js                   |  2 +-
 services/puppetforge/puppetforge-base.js      |  2 +-
 services/pypi/pypi-base.js                    |  2 +-
 services/pypi/pypi-downloads.service.js       |  2 +-
 services/pypi/pypi.tester.js                  |  2 +-
 services/readthedocs/readthedocs.service.js   |  2 +-
 services/readthedocs/readthedocs.tester.js    |  2 +-
 .../reddit/subreddit-subscribers.service.js   |  2 +-
 services/redmine/redmine.service.js           |  2 +-
 services/redmine/redmine.tester.js            |  2 +-
 services/requires/requires.service.js         |  2 +-
 services/requires/requires.tester.js          |  2 +-
 .../scrutinizer/scrutinizer-build.service.js  |  2 +-
 .../scrutinizer/scrutinizer-build.tester.js   |  2 +-
 .../scrutinizer-coverage.service.js           |  2 +-
 .../scrutinizer-quality.service.js            |  2 +-
 .../scrutinizer/scrutinizer-quality.tester.js |  2 +-
 services/shippable/shippable.service.js       |  2 +-
 services/snyk/snyk-vulnerability-base.js      |  2 +-
 .../snyk/snyk-vulnerability-github.tester.js  |  2 +-
 .../snyk/snyk-vulnerability-npm.tester.js     |  2 +-
 services/sonar/sonar-base.js                  |  2 +-
 services/sonar/sonar-helpers.js               |  2 +-
 services/sonar/sonar-quality-gate.tester.js   |  2 +-
 services/sonar/sonar-violations.tester.js     |  2 +-
 services/sourceforge/sourceforge.service.js   |  2 +-
 services/sourcegraph/sourcegraph.service.js   |  2 +-
 services/spiget/spiget-base.js                |  2 +-
 .../spiget/spiget-latest-version.service.js   |  2 +-
 .../stackexchange-monthlyquestions.service.js |  2 +-
 .../stackexchange-reputation.service.js       |  2 +-
 .../stackexchange-taginfo.service.js          |  2 +-
 .../query-string-static.service.js            |  2 +-
 services/steam/steam-workshop.service.js      |  2 +-
 services/swagger/swagger.service.js           |  2 +-
 services/symfony/symfony-insight-base.js      |  2 +-
 .../symfony/symfony-insight-grade.tester.js   |  2 +-
 services/teamcity/teamcity-build.service.js   |  2 +-
 services/teamcity/teamcity-build.tester.js    |  2 +-
 .../teamcity/teamcity-coverage.service.js     |  2 +-
 services/test-results.js                      |  2 +-
 services/test-validators.js                   |  2 +-
 services/travis/travis-build.service.js       |  2 +-
 services/travis/travis-build.tester.js        |  2 +-
 services/travis/travis-php-version.service.js |  2 +-
 services/twitter/twitter.service.js           |  2 +-
 services/ubuntu/ubuntu.service.js             |  2 +-
 services/uptimerobot/uptimerobot-base.js      |  2 +-
 .../uptimerobot/uptimerobot-status.tester.js  |  2 +-
 .../vaadin-directory/vaadin-directory-base.js |  2 +-
 .../vaadin-directory-rating-count.tester.js   |  2 +-
 .../vaadin-directory-rating.tester.js         |  2 +-
 .../vaadin-directory-status.tester.js         |  2 +-
 services/validators.js                        |  2 +-
 .../visual-studio-marketplace-base.js         |  2 +-
 services/website-status.js                    |  2 +-
 services/wercker/wercker.service.js           |  2 +-
 services/wheelmap/wheelmap.service.js         |  2 +-
 services/wordpress/wordpress-base.js          |  2 +-
 .../wordpress/wordpress-downloads.service.js  |  2 +-
 .../wordpress/wordpress-downloads.tester.js   |  2 +-
 .../wordpress/wordpress-platform.tester.js    |  2 +-
 295 files changed, 356 insertions(+), 313 deletions(-)

diff --git a/core/base-service/base-json.spec.js b/core/base-service/base-json.spec.js
index 4ecbc36d9e..a5286e9ca7 100644
--- a/core/base-service/base-json.spec.js
+++ b/core/base-service/base-json.spec.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { expect } = require('chai')
 const sinon = require('sinon')
 const BaseJsonService = require('./base-json')
diff --git a/core/base-service/base-svg-scraping.spec.js b/core/base-service/base-svg-scraping.spec.js
index 7cc37ac3ea..82eb0787df 100644
--- a/core/base-service/base-svg-scraping.spec.js
+++ b/core/base-service/base-svg-scraping.spec.js
@@ -2,7 +2,7 @@
 
 const { expect } = require('chai')
 const sinon = require('sinon')
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const makeBadge = require('../../gh-badges/lib/make-badge')
 const BaseSvgScrapingService = require('./base-svg-scraping')
 
diff --git a/core/base-service/base-xml.spec.js b/core/base-service/base-xml.spec.js
index 3c20ab371d..fea06c2a90 100644
--- a/core/base-service/base-xml.spec.js
+++ b/core/base-service/base-xml.spec.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { expect } = require('chai')
 const sinon = require('sinon')
 const BaseXmlService = require('./base-xml')
diff --git a/core/base-service/base-yaml.spec.js b/core/base-service/base-yaml.spec.js
index 7d2e7a4bd7..8098501a0e 100644
--- a/core/base-service/base-yaml.spec.js
+++ b/core/base-service/base-yaml.spec.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { expect } = require('chai')
 const sinon = require('sinon')
 const BaseYamlService = require('./base-yaml')
diff --git a/core/base-service/base.js b/core/base-service/base.js
index b4a4292a73..310da7029f 100644
--- a/core/base-service/base.js
+++ b/core/base-service/base.js
@@ -3,7 +3,7 @@
 const decamelize = require('decamelize')
 // See available emoji at http://emoji.muan.co/
 const emojic = require('emojic')
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { assertValidCategory } = require('./categories')
 const checkErrorResponse = require('./check-error-response')
 const coalesceBadge = require('./coalesce-badge')
diff --git a/core/base-service/base.spec.js b/core/base-service/base.spec.js
index 274daf6ece..4c2f99a4ba 100644
--- a/core/base-service/base.spec.js
+++ b/core/base-service/base.spec.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { expect } = require('chai')
 const sinon = require('sinon')
 const trace = require('./trace')
diff --git a/core/base-service/cache-headers.js b/core/base-service/cache-headers.js
index eace490079..ba3455fdca 100644
--- a/core/base-service/cache-headers.js
+++ b/core/base-service/cache-headers.js
@@ -1,7 +1,7 @@
 'use strict'
 
 const assert = require('assert')
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const coalesce = require('./coalesce')
 
 const serverStartTimeGMTString = new Date().toGMTString()
diff --git a/core/base-service/categories.js b/core/base-service/categories.js
index 760590ced4..44fb273510 100644
--- a/core/base-service/categories.js
+++ b/core/base-service/categories.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const categories = require('../../services/categories')
 
 const isRealCategory = Joi.equal(categories.map(({ id }) => id)).required()
diff --git a/core/base-service/deprecated-service.js b/core/base-service/deprecated-service.js
index 8358e1f0f1..81942ca758 100644
--- a/core/base-service/deprecated-service.js
+++ b/core/base-service/deprecated-service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const camelcase = require('camelcase')
 const BaseService = require('./base')
 const { isValidCategory } = require('./categories')
diff --git a/core/base-service/examples.js b/core/base-service/examples.js
index 602ad533bf..ca92ec97c6 100644
--- a/core/base-service/examples.js
+++ b/core/base-service/examples.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const pathToRegexp = require('path-to-regexp')
 const coalesceBadge = require('./coalesce-badge')
 const { makeFullUrl } = require('./route')
diff --git a/core/base-service/redirector.js b/core/base-service/redirector.js
index 490296e4b6..ab4879faa2 100644
--- a/core/base-service/redirector.js
+++ b/core/base-service/redirector.js
@@ -2,7 +2,7 @@
 
 const camelcase = require('camelcase')
 const emojic = require('emojic')
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const queryString = require('query-string')
 const BaseService = require('./base')
 const {
diff --git a/core/base-service/route.js b/core/base-service/route.js
index ecae022e68..e9678eb28a 100644
--- a/core/base-service/route.js
+++ b/core/base-service/route.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const pathToRegexp = require('path-to-regexp')
 
 function makeFullUrl(base, partialUrl) {
diff --git a/core/base-service/route.spec.js b/core/base-service/route.spec.js
index b3f9c2e23c..8eda13d666 100644
--- a/core/base-service/route.spec.js
+++ b/core/base-service/route.spec.js
@@ -1,7 +1,7 @@
 'use strict'
 
 const { expect } = require('chai')
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { test, given, forCases } = require('sazerac')
 const {
   prepareRoute,
diff --git a/core/base-service/service-definitions.js b/core/base-service/service-definitions.js
index b38b04efae..a98c616303 100644
--- a/core/base-service/service-definitions.js
+++ b/core/base-service/service-definitions.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 
 // This should be kept in sync with the schema in
 // `frontend/lib/service-definitions/service-definition-prop-types.js`.
diff --git a/core/base-service/validate.js b/core/base-service/validate.js
index 60369a5ca5..f27ee66018 100644
--- a/core/base-service/validate.js
+++ b/core/base-service/validate.js
@@ -1,7 +1,7 @@
 'use strict'
 
 const emojic = require('emojic')
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const trace = require('./trace')
 
 function validate(
diff --git a/core/base-service/validate.spec.js b/core/base-service/validate.spec.js
index a2680f0d03..72e34698da 100644
--- a/core/base-service/validate.spec.js
+++ b/core/base-service/validate.spec.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { expect } = require('chai')
 const sinon = require('sinon')
 const trace = require('./trace')
diff --git a/core/server/server.js b/core/server/server.js
index d8c21943ad..27b0a199af 100644
--- a/core/server/server.js
+++ b/core/server/server.js
@@ -4,7 +4,7 @@ const fs = require('fs')
 const path = require('path')
 const url = require('url')
 const bytes = require('bytes')
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const Camp = require('camp')
 const makeBadge = require('../../gh-badges/lib/make-badge')
 const GithubConstellation = require('../../services/github/github-constellation')
diff --git a/core/service-test-runner/icedfrisby-shields.js b/core/service-test-runner/icedfrisby-shields.js
index c227963c31..e846c65393 100644
--- a/core/service-test-runner/icedfrisby-shields.js
+++ b/core/service-test-runner/icedfrisby-shields.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { expect } = require('chai')
 
 // based on https://github.com/paulmelnikow/icedfrisby-nock/blob/master/icedfrisby-nock.js
diff --git a/doc/TUTORIAL.md b/doc/TUTORIAL.md
index 27ff5237a0..77af23ae4b 100644
--- a/doc/TUTORIAL.md
+++ b/doc/TUTORIAL.md
@@ -188,7 +188,7 @@ const { renderVersionBadge } = require('..//version')
 const { BaseJsonService } = require('..')
 
 // (4)
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const schema = Joi.object({
   version: Joi.string().required(),
 }).required()
diff --git a/doc/rewriting-services.md b/doc/rewriting-services.md
index df7145b254..217af55515 100644
--- a/doc/rewriting-services.md
+++ b/doc/rewriting-services.md
@@ -152,7 +152,7 @@ Once the route is working, fill out `render()` and `handle()`.
 <details>
 
 ```js
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { errorMessagesFor } = require('./github-helpers')
 
 const issueSchema = Joi.object({
@@ -181,7 +181,7 @@ or create an abstract superclass like **PypiBase**:
 <details>
 
 ```js
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const BaseJsonService = require('../base-json')
 
 const schema = Joi.object({
diff --git a/lib/logos.js b/lib/logos.js
index dd639d7bff..adbda6c0b6 100644
--- a/lib/logos.js
+++ b/lib/logos.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { toSvgColor } = require('../gh-badges/lib/color')
 const coalesce = require('../core/base-service/coalesce')
 const { svg2base64 } = require('./svg-helpers')
diff --git a/package-lock.json b/package-lock.json
index 6a51f9334f..82aa052e99 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -2082,6 +2082,34 @@
         }
       }
     },
+    "@hapi/address": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.0.0.tgz",
+      "integrity": "sha512-mV6T0IYqb0xL1UALPFplXYQmR0twnXG0M6jUswpquqT2sD12BOiCiLy3EvMp/Fy7s3DZElC4/aPjEjo2jeZpvw=="
+    },
+    "@hapi/hoek": {
+      "version": "6.2.4",
+      "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-6.2.4.tgz",
+      "integrity": "sha512-HOJ20Kc93DkDVvjwHyHawPwPkX44sIrbXazAUDiUXaY2R9JwQGo2PhFfnQtdrsIe4igjG2fPgMra7NYw7qhy0A=="
+    },
+    "@hapi/joi": {
+      "version": "15.0.3",
+      "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-15.0.3.tgz",
+      "integrity": "sha512-z6CesJ2YBwgVCi+ci8SI8zixoj8bGFn/vZb9MBPbSyoxsS2PnWYjHcyTM17VLK6tx64YVK38SDIh10hJypB+ig==",
+      "requires": {
+        "@hapi/address": "2.x.x",
+        "@hapi/hoek": "6.x.x",
+        "@hapi/topo": "3.x.x"
+      }
+    },
+    "@hapi/topo": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.0.tgz",
+      "integrity": "sha512-gZDI/eXOIk8kP2PkUKjWu9RW8GGVd2Hkgjxyr/S7Z+JF+0mr7bAlbw+DkTRxnD580o8Kqxlnba9wvqp5aOHBww==",
+      "requires": {
+        "@hapi/hoek": "6.x.x"
+      }
+    },
     "@mapbox/react-click-to-select": {
       "version": "2.2.0",
       "resolved": "https://registry.npmjs.org/@mapbox/react-click-to-select/-/react-click-to-select-2.2.0.tgz",
@@ -5265,9 +5293,9 @@
       }
     },
     "check-types": {
-      "version": "8.0.2",
-      "resolved": "https://registry.npmjs.org/check-types/-/check-types-8.0.2.tgz",
-      "integrity": "sha512-rS6P/iiI/5YVTKc2uYi30l6rp3ygz3+C8woEGQMsJ/77tl5LiSrLxOIm4cNAG3RhjHeKXUn1GrzTED3heX3tPw==",
+      "version": "8.0.3",
+      "resolved": "https://registry.npmjs.org/check-types/-/check-types-8.0.3.tgz",
+      "integrity": "sha512-YpeKZngUmG65rLudJ4taU7VLkOCTMhNl/u4ctNC56LQS/zJTyNH0Lrtwm1tfTsbLlwvlfsA2d1c8vCf/Kh2KwQ==",
       "dev": true
     },
     "cheerio": {
@@ -12134,6 +12162,16 @@
         "svgo": "^1.1.1"
       },
       "dependencies": {
+        "@hapi/joi": {
+          "version": "15.0.3",
+          "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-15.0.3.tgz",
+          "integrity": "sha512-z6CesJ2YBwgVCi+ci8SI8zixoj8bGFn/vZb9MBPbSyoxsS2PnWYjHcyTM17VLK6tx64YVK38SDIh10hJypB+ig==",
+          "requires": {
+            "@hapi/address": "2.x.x",
+            "@hapi/hoek": "6.x.x",
+            "@hapi/topo": "3.x.x"
+          }
+        },
         "anafanafo": {
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/anafanafo/-/anafanafo-1.0.0.tgz",
@@ -12645,7 +12683,8 @@
     "hoek": {
       "version": "6.1.2",
       "resolved": "https://registry.npmjs.org/hoek/-/hoek-6.1.2.tgz",
-      "integrity": "sha512-6qhh/wahGYZHFSFw12tBbJw5fsAhhwrrG/y3Cs0YMTv2WzMnL0oLPnQJjv1QJvEfylRSOFuP+xCu+tdx0tD16Q=="
+      "integrity": "sha512-6qhh/wahGYZHFSFw12tBbJw5fsAhhwrrG/y3Cs0YMTv2WzMnL0oLPnQJjv1QJvEfylRSOFuP+xCu+tdx0tD16Q==",
+      "dev": true
     },
     "hoist-non-react-statics": {
       "version": "3.3.0",
@@ -13132,17 +13171,17 @@
       "dev": true
     },
     "icedfrisby": {
-      "version": "2.0.0-alpha.5",
-      "resolved": "https://registry.npmjs.org/icedfrisby/-/icedfrisby-2.0.0-alpha.5.tgz",
-      "integrity": "sha512-6Eqk/1P+yLWbvZOh9mblfAfDQWnNVadt7eoyJAaqEvnRSarvdj+qgTgAXKSLe2c3gF/PlcK9hSHIFJTyLj9Kpg==",
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/icedfrisby/-/icedfrisby-2.0.0.tgz",
+      "integrity": "sha512-jtFPSjvMEsGJwnJXWElXs6gKzelktiqjlf4rR4P/M5pNPnUJFZDMMStiW4SUUxGC24FwTfn0e6rths0aQnAL5A==",
       "dev": true,
       "requires": {
+        "@hapi/joi": "*",
         "chai": "^4.0.1",
         "chai-subset": "^1.3.0",
         "chai-things": "^0.2.0",
         "chalk": "^2.0.1",
         "check-types": "^8.0.1",
-        "joi": "*",
         "lodash": "^4.16.6",
         "qs": "^6.3.0",
         "request": "^2.76.0",
@@ -13964,6 +14003,7 @@
       "version": "3.2.0",
       "resolved": "https://registry.npmjs.org/isemail/-/isemail-3.2.0.tgz",
       "integrity": "sha512-zKqkK+O+dGqevc93KNsbZ/TqTUFd46MwWjYOoMrjIMZ51eU7DtQG3Wmd9SQQT7i7RVnuTPEiYEWHU3MSbxC1Tg==",
+      "dev": true,
       "requires": {
         "punycode": "2.x.x"
       },
@@ -13971,7 +14011,8 @@
         "punycode": {
           "version": "2.1.1",
           "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
-          "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
+          "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
+          "dev": true
         }
       }
     },
@@ -14324,6 +14365,7 @@
       "version": "14.3.1",
       "resolved": "https://registry.npmjs.org/joi/-/joi-14.3.1.tgz",
       "integrity": "sha512-LQDdM+pkOrpAn4Lp+neNIFV3axv1Vna3j38bisbQhETPMANYRbFJFUyOZcOClYvM/hppMhGWuKSFEK9vjrB+bQ==",
+      "dev": true,
       "requires": {
         "hoek": "6.x.x",
         "isemail": "3.x.x",
@@ -14331,17 +14373,17 @@
       }
     },
     "joi-extension-semver": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/joi-extension-semver/-/joi-extension-semver-2.0.0.tgz",
-      "integrity": "sha1-/XTCn1nDm2hlIlj0MCVDV2qYVQU=",
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/joi-extension-semver/-/joi-extension-semver-3.0.0.tgz",
+      "integrity": "sha512-uN1MwgMyUsXif7CH1CCxhrsr9cfbSkvSs8l/rMDzTBJNqbFijkNZ1dEI/7s8RlKOc0ljuPQFQYx6g1LBFNn93Q==",
       "requires": {
-        "semver": "^5.3.0"
+        "semver": "^6.1.1"
       },
       "dependencies": {
         "semver": {
-          "version": "5.7.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz",
-          "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA=="
+          "version": "6.1.1",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.1.1.tgz",
+          "integrity": "sha512-rWYq2e5iYW+fFe/oPPtYJxYgjBm8sC4rmoGdUOgBB7VnwKt6HrL793l2voH1UlsyYZpJ4g0wfjnTEO1s1NP2eQ=="
         }
       }
     },
@@ -23292,6 +23334,7 @@
       "version": "3.0.3",
       "resolved": "https://registry.npmjs.org/topo/-/topo-3.0.3.tgz",
       "integrity": "sha512-IgpPtvD4kjrJ7CRA3ov2FhWQADwv+Tdqbsf1ZnPUSAtCJ9e1Z44MmoSGDXGk4IppoZA7jd/QRkNddlLJWlUZsQ==",
+      "dev": true,
       "requires": {
         "hoek": "6.x.x"
       }
diff --git a/package.json b/package.json
index 70407b3bad..9b5f368a68 100644
--- a/package.json
+++ b/package.json
@@ -37,8 +37,8 @@
     "fsos": "^1.1.3",
     "gh-badges": "file:gh-badges",
     "glob": "^7.1.4",
-    "joi": "14.3.1",
-    "joi-extension-semver": "2.0.0",
+    "@hapi/joi": "^15.0.3",
+    "joi-extension-semver": "3.0.0",
     "js-yaml": "^3.13.1",
     "jsonpath": "~1.0.1",
     "lodash.countby": "^4.6.0",
@@ -192,7 +192,7 @@
     "got": "^9.6.0",
     "humanize-string": "^2.1.0",
     "husky": "^2.3.0",
-    "icedfrisby": "2.0.0-alpha.5",
+    "icedfrisby": "2.0.0",
     "icedfrisby-nock": "^1.1.0",
     "is-png": "^2.0.0",
     "is-svg": "^4.1.0",
diff --git a/services/amo/amo-base.js b/services/amo/amo-base.js
index 394f4014cf..20f1815786 100644
--- a/services/amo/amo-base.js
+++ b/services/amo/amo-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService } = require('..')
 const { nonNegativeInteger } = require('../validators')
 
diff --git a/services/amo/amo-rating.tester.js b/services/amo/amo-rating.tester.js
index f17a90656f..55d83c436e 100644
--- a/services/amo/amo-rating.tester.js
+++ b/services/amo/amo-rating.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { isStarRating } = require('../test-validators')
 const t = (module.exports = require('../tester').createServiceTester())
 
diff --git a/services/ansible/ansible-quality.service.js b/services/ansible/ansible-quality.service.js
index b73e7805b0..3590e03f6a 100644
--- a/services/ansible/ansible-quality.service.js
+++ b/services/ansible/ansible-quality.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { floorCount } = require('../color-formatters')
 const { BaseJsonService, InvalidResponse } = require('..')
 
diff --git a/services/ansible/ansible-role.service.js b/services/ansible/ansible-role.service.js
index 023219860b..4a121de3fb 100644
--- a/services/ansible/ansible-role.service.js
+++ b/services/ansible/ansible-role.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { downloadCount } = require('../color-formatters')
 const { metric } = require('../text-formatters')
 const { BaseJsonService } = require('..')
diff --git a/services/apm/apm.service.js b/services/apm/apm.service.js
index d125b8bea2..1077daa9b8 100644
--- a/services/apm/apm.service.js
+++ b/services/apm/apm.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { renderLicenseBadge } = require('../licenses')
 const { renderVersionBadge } = require('../version')
 const { metric } = require('../text-formatters')
diff --git a/services/appveyor/appveyor-base.js b/services/appveyor/appveyor-base.js
index 6dea851976..9ba151d59e 100644
--- a/services/appveyor/appveyor-base.js
+++ b/services/appveyor/appveyor-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService } = require('..')
 const { nonNegativeInteger } = require('../validators')
 const { isBuildStatus } = require('../build-status')
diff --git a/services/appveyor/appveyor-tests.tester.js b/services/appveyor/appveyor-tests.tester.js
index df81a2de2e..a08bc2937a 100644
--- a/services/appveyor/appveyor-tests.tester.js
+++ b/services/appveyor/appveyor-tests.tester.js
@@ -1,7 +1,7 @@
 'use strict'
 
 const queryString = require('querystring')
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 const isAppveyorTestTotals = Joi.string().regex(
diff --git a/services/archlinux/archlinux.service.js b/services/archlinux/archlinux.service.js
index 4e44952991..8f3b8d3257 100644
--- a/services/archlinux/archlinux.service.js
+++ b/services/archlinux/archlinux.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { renderVersionBadge } = require('../version')
 const { BaseJsonService } = require('..')
 
diff --git a/services/aur/aur.service.js b/services/aur/aur.service.js
index 1abee0c2e3..fcbecb199c 100644
--- a/services/aur/aur.service.js
+++ b/services/aur/aur.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { floorCount: floorCountColor } = require('../color-formatters')
 const { addv, metric } = require('../text-formatters')
 const { BaseJsonService, NotFound } = require('..')
diff --git a/services/azure-devops/azure-devops-base.js b/services/azure-devops/azure-devops-base.js
index a628e97fbf..803156c6c6 100644
--- a/services/azure-devops/azure-devops-base.js
+++ b/services/azure-devops/azure-devops-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService, NotFound } = require('..')
 
 const latestBuildSchema = Joi.object({
diff --git a/services/azure-devops/azure-devops-coverage.service.js b/services/azure-devops/azure-devops-coverage.service.js
index 4570d6c0ae..9a72c5b1ff 100644
--- a/services/azure-devops/azure-devops-coverage.service.js
+++ b/services/azure-devops/azure-devops-coverage.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const {
   coveragePercentage: coveragePercentageColor,
 } = require('../color-formatters')
diff --git a/services/azure-devops/azure-devops-helpers.js b/services/azure-devops/azure-devops-helpers.js
index 645e80a692..2bfbc66d38 100644
--- a/services/azure-devops/azure-devops-helpers.js
+++ b/services/azure-devops/azure-devops-helpers.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const serverSecrets = require('../../lib/server-secrets')
 const { isBuildStatus } = require('../build-status')
 
diff --git a/services/azure-devops/azure-devops-tests.service.js b/services/azure-devops/azure-devops-tests.service.js
index 53c78400bc..dac59b834a 100644
--- a/services/azure-devops/azure-devops-tests.service.js
+++ b/services/azure-devops/azure-devops-tests.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const {
   testResultQueryParamSchema,
   renderTestResultBadge,
diff --git a/services/azure-devops/azure-devops-tests.tester.js b/services/azure-devops/azure-devops-tests.tester.js
index bcc1bc8f22..23b1a94fdf 100644
--- a/services/azure-devops/azure-devops-tests.tester.js
+++ b/services/azure-devops/azure-devops-tests.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 const org = 'azuredevops-powershell'
diff --git a/services/beerpay/beerpay.service.js b/services/beerpay/beerpay.service.js
index 8b2f991b26..9e9619a09f 100644
--- a/services/beerpay/beerpay.service.js
+++ b/services/beerpay/beerpay.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService } = require('..')
 
 const schema = Joi.object({
diff --git a/services/bintray/bintray.service.js b/services/bintray/bintray.service.js
index e3f31577ef..09e3940558 100644
--- a/services/bintray/bintray.service.js
+++ b/services/bintray/bintray.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { renderVersionBadge } = require('../version')
 const serverSecrets = require('../../lib/server-secrets')
 const { BaseJsonService } = require('..')
diff --git a/services/bit/bit-components.service.js b/services/bit/bit-components.service.js
index 84b1a91004..41cd899295 100644
--- a/services/bit/bit-components.service.js
+++ b/services/bit/bit-components.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService } = require('..')
 const { metric } = require('../text-formatters')
 const { nonNegativeInteger } = require('../validators')
diff --git a/services/bitbucket/bitbucket-issues.service.js b/services/bitbucket/bitbucket-issues.service.js
index f4a88d440d..6acbbec2f1 100644
--- a/services/bitbucket/bitbucket-issues.service.js
+++ b/services/bitbucket/bitbucket-issues.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { metric } = require('../text-formatters')
 const { BaseJsonService } = require('..')
 const { nonNegativeInteger } = require('../validators')
diff --git a/services/bitbucket/bitbucket-pipelines.service.js b/services/bitbucket/bitbucket-pipelines.service.js
index b4d1ae3b4d..048d44788a 100644
--- a/services/bitbucket/bitbucket-pipelines.service.js
+++ b/services/bitbucket/bitbucket-pipelines.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { renderBuildStatusBadge } = require('../build-status')
 const { BaseJsonService } = require('..')
 
diff --git a/services/bitbucket/bitbucket-pull-request.service.js b/services/bitbucket/bitbucket-pull-request.service.js
index aff30a50aa..9e46c5dbff 100644
--- a/services/bitbucket/bitbucket-pull-request.service.js
+++ b/services/bitbucket/bitbucket-pull-request.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const serverSecrets = require('../../lib/server-secrets')
 const { metric } = require('../text-formatters')
 const { nonNegativeInteger, optionalUrl } = require('../validators')
diff --git a/services/bitrise/bitrise.service.js b/services/bitrise/bitrise.service.js
index bea0999be3..95b635a4f1 100644
--- a/services/bitrise/bitrise.service.js
+++ b/services/bitrise/bitrise.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService } = require('..')
 
 // https://devcenter.bitrise.io/api/app-status-badge/
diff --git a/services/bountysource/bountysource.service.js b/services/bountysource/bountysource.service.js
index 9226c9b001..7f1a05b9e3 100644
--- a/services/bountysource/bountysource.service.js
+++ b/services/bountysource/bountysource.service.js
@@ -1,7 +1,7 @@
 'use strict'
 
 const { BaseJsonService } = require('..')
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { nonNegativeInteger } = require('../validators')
 const { metric } = require('../text-formatters')
 
diff --git a/services/bower/bower-base.js b/services/bower/bower-base.js
index 035844993a..793102d70a 100644
--- a/services/bower/bower-base.js
+++ b/services/bower/bower-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService } = require('..')
 
 const schema = Joi.object()
diff --git a/services/bower/bower-version.tester.js b/services/bower/bower-version.tester.js
index 15ed9f06d0..1d2af8795b 100644
--- a/services/bower/bower-version.tester.js
+++ b/services/bower/bower-version.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { isVPlusDottedVersionAtLeastOne } = require('../test-validators')
 const t = (module.exports = require('../tester').createServiceTester())
 
diff --git a/services/bstats/bstats-players.service.js b/services/bstats/bstats-players.service.js
index 1475436895..38258ac9dd 100644
--- a/services/bstats/bstats-players.service.js
+++ b/services/bstats/bstats-players.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { metric } = require('../text-formatters')
 const { BaseJsonService } = require('..')
 
diff --git a/services/bstats/bstats-servers.service.js b/services/bstats/bstats-servers.service.js
index b5efdb38a3..27c7df7395 100644
--- a/services/bstats/bstats-servers.service.js
+++ b/services/bstats/bstats-servers.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { metric } = require('../text-formatters')
 const { BaseJsonService } = require('..')
 
diff --git a/services/bugzilla/bugzilla.service.js b/services/bugzilla/bugzilla.service.js
index f957e605df..29ae2045c5 100644
--- a/services/bugzilla/bugzilla.service.js
+++ b/services/bugzilla/bugzilla.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService } = require('..')
 
 const schema = Joi.object({
diff --git a/services/bugzilla/bugzilla.tester.js b/services/bugzilla/bugzilla.tester.js
index 4f13773f44..fd8f4ba9df 100644
--- a/services/bugzilla/bugzilla.tester.js
+++ b/services/bugzilla/bugzilla.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 const bzBugStatus = Joi.equal(
diff --git a/services/build-status.js b/services/build-status.js
index 400de71f33..f203de9796 100644
--- a/services/build-status.js
+++ b/services/build-status.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 
 const greenStatuses = [
   'fixed',
diff --git a/services/buildkite/buildkite.service.js b/services/buildkite/buildkite.service.js
index f9578cfddf..510c37562c 100644
--- a/services/buildkite/buildkite.service.js
+++ b/services/buildkite/buildkite.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService } = require('..')
 const { isBuildStatus, renderBuildStatusBadge } = require('../build-status')
 
diff --git a/services/buildkite/buildkite.tester.js b/services/buildkite/buildkite.tester.js
index bca5c506e7..fe15e3d088 100644
--- a/services/buildkite/buildkite.tester.js
+++ b/services/buildkite/buildkite.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { isBuildStatus } = require('../build-status')
 const t = (module.exports = require('../tester').createServiceTester())
 
diff --git a/services/bundlephobia/bundlephobia.service.js b/services/bundlephobia/bundlephobia.service.js
index 869d24175f..fb8ccf924b 100644
--- a/services/bundlephobia/bundlephobia.service.js
+++ b/services/bundlephobia/bundlephobia.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const prettyBytes = require('pretty-bytes')
 const { BaseJsonService } = require('..')
 const { nonNegativeInteger } = require('../validators')
diff --git a/services/cdnjs/cdnjs.service.js b/services/cdnjs/cdnjs.service.js
index c993c5bba1..a9b600d710 100644
--- a/services/cdnjs/cdnjs.service.js
+++ b/services/cdnjs/cdnjs.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { renderVersionBadge } = require('../version')
 const { BaseJsonService, NotFound } = require('..')
 
diff --git a/services/chrome-web-store/chrome-web-store-price.tester.js b/services/chrome-web-store/chrome-web-store-price.tester.js
index cc2ffaa587..4f0201aa71 100644
--- a/services/chrome-web-store/chrome-web-store-price.tester.js
+++ b/services/chrome-web-store/chrome-web-store-price.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 t.create('Price')
diff --git a/services/chrome-web-store/chrome-web-store-rating.tester.js b/services/chrome-web-store/chrome-web-store-rating.tester.js
index bf5d670442..a364b0fde1 100644
--- a/services/chrome-web-store/chrome-web-store-rating.tester.js
+++ b/services/chrome-web-store/chrome-web-store-rating.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { isStarRating } = require('../test-validators')
 const { ServiceTester } = require('../tester')
 
diff --git a/services/cii-best-practices/cii-best-practices.service.js b/services/cii-best-practices/cii-best-practices.service.js
index 5a479aac59..bc7eda1469 100644
--- a/services/cii-best-practices/cii-best-practices.service.js
+++ b/services/cii-best-practices/cii-best-practices.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { colorScale, coveragePercentage } = require('../color-formatters')
 const { BaseJsonService } = require('..')
 
diff --git a/services/circleci/circleci.service.js b/services/circleci/circleci.service.js
index 02e3dfc8d3..5979a1bf7a 100644
--- a/services/circleci/circleci.service.js
+++ b/services/circleci/circleci.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { isBuildStatus, renderBuildStatusBadge } = require('../build-status')
 const { BaseSvgScrapingService, redirector } = require('..')
 
diff --git a/services/clojars/clojars-base.js b/services/clojars/clojars-base.js
index 091cea7a40..f9e042499f 100644
--- a/services/clojars/clojars-base.js
+++ b/services/clojars/clojars-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { version: versionColor } = require('../color-formatters')
 const { nonNegativeInteger } = require('../validators')
 const { BaseJsonService } = require('..')
diff --git a/services/cocoapods/cocoapods-base.js b/services/cocoapods/cocoapods-base.js
index 240d69d59a..505196f483 100644
--- a/services/cocoapods/cocoapods-base.js
+++ b/services/cocoapods/cocoapods-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService } = require('..')
 
 const schema = Joi.object({
diff --git a/services/cocoapods/cocoapods-docs.service.js b/services/cocoapods/cocoapods-docs.service.js
index 97ee6af84a..b2b0e8932e 100644
--- a/services/cocoapods/cocoapods-docs.service.js
+++ b/services/cocoapods/cocoapods-docs.service.js
@@ -3,7 +3,7 @@
 const {
   coveragePercentage: coveragePercentageColor,
 } = require('../color-formatters')
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService } = require('..')
 
 const schema = Joi.object({
diff --git a/services/cocoapods/cocoapods-platform.tester.js b/services/cocoapods/cocoapods-platform.tester.js
index 74f8c3f40d..d8ffe16723 100644
--- a/services/cocoapods/cocoapods-platform.tester.js
+++ b/services/cocoapods/cocoapods-platform.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 const isPlatform = Joi.string().regex(
diff --git a/services/codacy/codacy-coverage.service.js b/services/codacy/codacy-coverage.service.js
index fe8da74e61..dc4436b8dd 100644
--- a/services/codacy/codacy-coverage.service.js
+++ b/services/codacy/codacy-coverage.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const {
   coveragePercentage: coveragePercentageColor,
 } = require('../color-formatters')
diff --git a/services/codacy/codacy-grade.service.js b/services/codacy/codacy-grade.service.js
index b375fa829b..337a835ae4 100644
--- a/services/codacy/codacy-grade.service.js
+++ b/services/codacy/codacy-grade.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseSvgScrapingService } = require('..')
 const { codacyGrade } = require('./codacy-helpers')
 
diff --git a/services/codacy/codacy-helpers.js b/services/codacy/codacy-helpers.js
index 9c222194c3..308456981b 100644
--- a/services/codacy/codacy-helpers.js
+++ b/services/codacy/codacy-helpers.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 
 const codacyGrade = Joi.equal('A', 'B', 'C', 'D', 'E', 'F')
 
diff --git a/services/codeclimate/codeclimate-analysis.service.js b/services/codeclimate/codeclimate-analysis.service.js
index e41ff49979..c5686cbec8 100644
--- a/services/codeclimate/codeclimate-analysis.service.js
+++ b/services/codeclimate/codeclimate-analysis.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService, NotFound } = require('..')
 const { colorScale, letterScore } = require('../color-formatters')
 const { nonNegativeInteger } = require('../validators')
diff --git a/services/codeclimate/codeclimate-analysis.tester.js b/services/codeclimate/codeclimate-analysis.tester.js
index 27b272f2b3..1b2dc6d70a 100644
--- a/services/codeclimate/codeclimate-analysis.tester.js
+++ b/services/codeclimate/codeclimate-analysis.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { isIntegerPercentage } = require('../test-validators')
 const t = (module.exports = require('../tester').createServiceTester())
 
diff --git a/services/codeclimate/codeclimate-common.js b/services/codeclimate/codeclimate-common.js
index 94c441a5ca..fc5b09fca7 100644
--- a/services/codeclimate/codeclimate-common.js
+++ b/services/codeclimate/codeclimate-common.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { NotFound } = require('..')
 
 const keywords = ['codeclimate']
diff --git a/services/codeclimate/codeclimate-coverage.service.js b/services/codeclimate/codeclimate-coverage.service.js
index 96c7972d06..c7c59ea8d6 100644
--- a/services/codeclimate/codeclimate-coverage.service.js
+++ b/services/codeclimate/codeclimate-coverage.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService, NotFound } = require('..')
 const { coveragePercentage, letterScore } = require('../color-formatters')
 const { keywords, isLetterGrade, fetchRepo } = require('./codeclimate-common')
diff --git a/services/codeclimate/codeclimate-coverage.tester.js b/services/codeclimate/codeclimate-coverage.tester.js
index ebda92499a..0157c9fb15 100644
--- a/services/codeclimate/codeclimate-coverage.tester.js
+++ b/services/codeclimate/codeclimate-coverage.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { isIntegerPercentage } = require('../test-validators')
 const t = (module.exports = require('../tester').createServiceTester())
 
diff --git a/services/codecov/codecov.service.js b/services/codecov/codecov.service.js
index ac945a1e80..f69cfe7653 100644
--- a/services/codecov/codecov.service.js
+++ b/services/codecov/codecov.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { coveragePercentage } = require('../color-formatters')
 const { BaseJsonService } = require('..')
 
diff --git a/services/codeship/codeship.service.js b/services/codeship/codeship.service.js
index 5768fee7b9..64f966c93a 100644
--- a/services/codeship/codeship.service.js
+++ b/services/codeship/codeship.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseSvgScrapingService } = require('..')
 const { isBuildStatus, renderBuildStatusBadge } = require('../build-status')
 
diff --git a/services/codetally/codetally.service.js b/services/codetally/codetally.service.js
index 657d6efc3f..22f5698a33 100644
--- a/services/codetally/codetally.service.js
+++ b/services/codetally/codetally.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService } = require('..')
 
 const schema = Joi.object({
diff --git a/services/codetally/codetally.tester.js b/services/codetally/codetally.tester.js
index 3fc5e5b0ab..88384254c6 100644
--- a/services/codetally/codetally.tester.js
+++ b/services/codetally/codetally.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 // This test will extract the currency value from the
diff --git a/services/conda/conda-base.js b/services/conda/conda-base.js
index 897318af03..0752f22184 100644
--- a/services/conda/conda-base.js
+++ b/services/conda/conda-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService } = require('..')
 const { nonNegativeInteger } = require('../validators')
 
diff --git a/services/conda/conda.tester.js b/services/conda/conda.tester.js
index 8d222f21a3..12e3f69f2c 100644
--- a/services/conda/conda.tester.js
+++ b/services/conda/conda.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { ServiceTester } = require('../tester')
 const { isVPlusTripleDottedVersion, isMetric } = require('../test-validators')
 
diff --git a/services/continuousphp/continuousphp.service.js b/services/continuousphp/continuousphp.service.js
index a56b8284a2..69f3bf460c 100644
--- a/services/continuousphp/continuousphp.service.js
+++ b/services/continuousphp/continuousphp.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { isBuildStatus, renderBuildStatusBadge } = require('../build-status')
 const { BaseJsonService } = require('..')
 
diff --git a/services/continuousphp/continuousphp.tester.js b/services/continuousphp/continuousphp.tester.js
index 6fa7f59fc5..7f597be6b5 100644
--- a/services/continuousphp/continuousphp.tester.js
+++ b/services/continuousphp/continuousphp.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { isBuildStatus } = require('../build-status')
 const t = (module.exports = require('../tester').createServiceTester())
 
diff --git a/services/cookbook/cookbook.service.js b/services/cookbook/cookbook.service.js
index 249d8f4a92..98106e6df7 100644
--- a/services/cookbook/cookbook.service.js
+++ b/services/cookbook/cookbook.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService } = require('..')
 const { renderVersionBadge } = require('../version')
 
diff --git a/services/coveralls/coveralls.service.js b/services/coveralls/coveralls.service.js
index a65720cf04..5c1467fadc 100644
--- a/services/coveralls/coveralls.service.js
+++ b/services/coveralls/coveralls.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService } = require('..')
 const { coveragePercentage } = require('../color-formatters')
 
diff --git a/services/coverity/coverity-scan.service.js b/services/coverity/coverity-scan.service.js
index ab3a0d866a..ac8e95b509 100644
--- a/services/coverity/coverity-scan.service.js
+++ b/services/coverity/coverity-scan.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService } = require('..')
 
 const messageRegex = /passed|passed .* new defects|pending|failed/
diff --git a/services/coverity/coverity-scan.tester.js b/services/coverity/coverity-scan.tester.js
index acbd517cc5..7dbb39ccf3 100644
--- a/services/coverity/coverity-scan.tester.js
+++ b/services/coverity/coverity-scan.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 t.create('live: known project id')
diff --git a/services/cpan/cpan.js b/services/cpan/cpan.js
index 8c0932a453..818b0f80e4 100644
--- a/services/cpan/cpan.js
+++ b/services/cpan/cpan.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService } = require('..')
 
 const schema = Joi.object({
diff --git a/services/cran/cran.service.js b/services/cran/cran.service.js
index d91c59fc79..d54800a231 100644
--- a/services/cran/cran.service.js
+++ b/services/cran/cran.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService } = require('..')
 const { renderVersionBadge } = require('../version')
 
diff --git a/services/crates/crates-base.js b/services/crates/crates-base.js
index f7ba70734f..7713ad7456 100644
--- a/services/crates/crates-base.js
+++ b/services/crates/crates-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService } = require('..')
 const { nonNegativeInteger } = require('../validators')
 
diff --git a/services/ctan/ctan.service.js b/services/ctan/ctan.service.js
index 646bf24fd4..342bbfa924 100644
--- a/services/ctan/ctan.service.js
+++ b/services/ctan/ctan.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { renderLicenseBadge } = require('../licenses')
 const { renderVersionBadge } = require('../version')
 const { BaseJsonService } = require('..')
diff --git a/services/david/david.service.js b/services/david/david.service.js
index 030bf4b499..a48874ea95 100644
--- a/services/david/david.service.js
+++ b/services/david/david.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService } = require('..')
 
 const schema = Joi.object({
diff --git a/services/david/david.tester.js b/services/david/david.tester.js
index 21400f45a8..72f50c5057 100644
--- a/services/david/david.tester.js
+++ b/services/david/david.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 const isDependencyStatus = Joi.string().valid(
diff --git a/services/debian/debian.service.js b/services/debian/debian.service.js
index c993ad2902..fecfb8b0f1 100644
--- a/services/debian/debian.service.js
+++ b/services/debian/debian.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { latest, renderVersionBadge } = require('../version')
 const { BaseJsonService, NotFound } = require('..')
 
diff --git a/services/debug/debug.tester.js b/services/debug/debug.tester.js
index 2885b9479d..745862ad3f 100644
--- a/services/debug/debug.tester.js
+++ b/services/debug/debug.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 t.create('start time')
diff --git a/services/dependabot/dependabot.service.js b/services/dependabot/dependabot.service.js
index d403048e64..73b683415f 100644
--- a/services/dependabot/dependabot.service.js
+++ b/services/dependabot/dependabot.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const url = require('url')
 const { BaseJsonService } = require('..')
 
diff --git a/services/depfu/depfu.service.js b/services/depfu/depfu.service.js
index 489302b57c..77fe36b024 100644
--- a/services/depfu/depfu.service.js
+++ b/services/depfu/depfu.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService } = require('..')
 
 const depfuSchema = Joi.object({
diff --git a/services/depfu/depfu.tester.js b/services/depfu/depfu.tester.js
index 957704f3c4..d8fea928d4 100644
--- a/services/depfu/depfu.tester.js
+++ b/services/depfu/depfu.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { ServiceTester } = require('../tester')
 
 const isDependencyStatus = Joi.string().valid(
diff --git a/services/discord/discord.service.js b/services/discord/discord.service.js
index d112b3ea74..3791781be0 100644
--- a/services/discord/discord.service.js
+++ b/services/discord/discord.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService } = require('..')
 
 const discordSchema = Joi.object({
diff --git a/services/discord/discord.tester.js b/services/discord/discord.tester.js
index 5e3d8aff38..86517e1a40 100644
--- a/services/discord/discord.tester.js
+++ b/services/discord/discord.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 t.create('gets status for Reactiflux')
diff --git a/services/discourse/discourse.service.js b/services/discourse/discourse.service.js
index ab5e38c29c..485030d02a 100644
--- a/services/discourse/discourse.service.js
+++ b/services/discourse/discourse.service.js
@@ -1,7 +1,7 @@
 'use strict'
 
 const camelcase = require('camelcase')
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService } = require('..')
 const { metric } = require('../text-formatters')
 const { nonNegativeInteger } = require('../validators')
diff --git a/services/discourse/discourse.tester.js b/services/discourse/discourse.tester.js
index 39ef838eda..ba1f07e655 100644
--- a/services/discourse/discourse.tester.js
+++ b/services/discourse/discourse.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { ServiceTester } = require('../tester')
 
 const t = (module.exports = new ServiceTester({
diff --git a/services/docker/docker-automated.service.js b/services/docker/docker-automated.service.js
index 80cc56f385..509a85a19a 100644
--- a/services/docker/docker-automated.service.js
+++ b/services/docker/docker-automated.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService } = require('..')
 const {
   dockerBlue,
diff --git a/services/docker/docker-automated.tester.js b/services/docker/docker-automated.tester.js
index 4cc144d7ce..f98d214428 100644
--- a/services/docker/docker-automated.tester.js
+++ b/services/docker/docker-automated.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const t = (module.exports = require('../tester').createServiceTester())
 const { dockerBlue } = require('./docker-helpers')
 
diff --git a/services/docker/docker-build.service.js b/services/docker/docker-build.service.js
index 698c58b396..0dc6000f86 100644
--- a/services/docker/docker-build.service.js
+++ b/services/docker/docker-build.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService } = require('..')
 const { anyInteger } = require('../validators')
 const {
diff --git a/services/docker/docker-cloud-automated.tester.js b/services/docker/docker-cloud-automated.tester.js
index 22d508dcc3..e3827f21b5 100644
--- a/services/docker/docker-cloud-automated.tester.js
+++ b/services/docker/docker-cloud-automated.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const t = (module.exports = require('../tester').createServiceTester())
 const { dockerBlue } = require('./docker-helpers')
 
diff --git a/services/docker/docker-cloud-common-fetch.js b/services/docker/docker-cloud-common-fetch.js
index 8ac3db1fa4..2f10c52eeb 100644
--- a/services/docker/docker-cloud-common-fetch.js
+++ b/services/docker/docker-cloud-common-fetch.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 
 const cloudBuildSchema = Joi.object({
   objects: Joi.array()
diff --git a/services/docker/docker-pulls.service.js b/services/docker/docker-pulls.service.js
index 12bdcd69eb..deddccd4e7 100644
--- a/services/docker/docker-pulls.service.js
+++ b/services/docker/docker-pulls.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { metric } = require('../text-formatters')
 const { BaseJsonService } = require('..')
 const { nonNegativeInteger } = require('../validators')
diff --git a/services/drone/drone-build.service.js b/services/drone/drone-build.service.js
index 77018457e1..3375fed785 100644
--- a/services/drone/drone-build.service.js
+++ b/services/drone/drone-build.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const serverSecrets = require('../../lib/server-secrets')
 const { isBuildStatus, renderBuildStatusBadge } = require('../build-status')
 const { optionalUrl } = require('../validators')
diff --git a/services/drone/drone-build.tester.js b/services/drone/drone-build.tester.js
index 1ea88667cf..9a9f3e07da 100644
--- a/services/drone/drone-build.tester.js
+++ b/services/drone/drone-build.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { isBuildStatus } = require('../build-status')
 const t = (module.exports = require('../tester').createServiceTester())
 const { mockDroneCreds, token, restore } = require('./drone-test-helpers')
diff --git a/services/dub/dub-download.service.js b/services/dub/dub-download.service.js
index 188a1cb690..f25d94893c 100644
--- a/services/dub/dub-download.service.js
+++ b/services/dub/dub-download.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { metric } = require('../text-formatters')
 const { downloadCount: downloadCountColor } = require('../color-formatters')
 const { BaseJsonService } = require('..')
diff --git a/services/dub/dub-download.tester.js b/services/dub/dub-download.tester.js
index 22d3407ecf..32f06a887b 100644
--- a/services/dub/dub-download.tester.js
+++ b/services/dub/dub-download.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { isMetric, isMetricOverTimePeriod } = require('../test-validators')
 const t = (module.exports = require('../tester').createServiceTester())
 
diff --git a/services/dub/dub-license.service.js b/services/dub/dub-license.service.js
index 86982292e0..3a68c843f7 100644
--- a/services/dub/dub-license.service.js
+++ b/services/dub/dub-license.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { renderLicenseBadge } = require('../licenses')
 const { BaseJsonService } = require('..')
 
diff --git a/services/dub/dub-version.service.js b/services/dub/dub-version.service.js
index c4eb2ff6ca..e209feba84 100644
--- a/services/dub/dub-version.service.js
+++ b/services/dub/dub-version.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService } = require('..')
 const { renderVersionBadge } = require('../version')
 
diff --git a/services/dub/dub-version.tester.js b/services/dub/dub-version.tester.js
index 972c7256e3..26824bdee4 100644
--- a/services/dub/dub-version.tester.js
+++ b/services/dub/dub-version.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const {
   isVPlusDottedVersionNClausesWithOptionalSuffix,
 } = require('../test-validators')
diff --git a/services/dynamic-common.js b/services/dynamic-common.js
index 060b075982..80e25754fc 100644
--- a/services/dynamic-common.js
+++ b/services/dynamic-common.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const toArray = require('../core/base-service/to-array')
 const validate = require('../core/base-service/validate')
 const { InvalidResponse } = require('.')
diff --git a/services/dynamic/dynamic-helpers.js b/services/dynamic/dynamic-helpers.js
index 6921857674..ceddf69f74 100644
--- a/services/dynamic/dynamic-helpers.js
+++ b/services/dynamic/dynamic-helpers.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { optionalUrl } = require('../validators')
 
 const queryParamSchema = Joi.object({
diff --git a/services/dynamic/dynamic-json.service.js b/services/dynamic/dynamic-json.service.js
index abce5fc774..7b0f6443a7 100644
--- a/services/dynamic/dynamic-json.service.js
+++ b/services/dynamic/dynamic-json.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const jp = require('jsonpath')
 const { BaseJsonService, InvalidResponse } = require('..')
 const { renderDynamicBadge, errorMessages } = require('../dynamic-common')
diff --git a/services/dynamic/dynamic-json.tester.js b/services/dynamic/dynamic-json.tester.js
index 41b7435479..605748af2a 100644
--- a/services/dynamic/dynamic-json.tester.js
+++ b/services/dynamic/dynamic-json.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { expect } = require('chai')
 const t = (module.exports = require('../tester').createServiceTester())
 
diff --git a/services/dynamic/dynamic-yaml.service.js b/services/dynamic/dynamic-yaml.service.js
index 800467f29a..1cf8a07851 100644
--- a/services/dynamic/dynamic-yaml.service.js
+++ b/services/dynamic/dynamic-yaml.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const jp = require('jsonpath')
 const { BaseYamlService, InvalidResponse } = require('..')
 const { renderDynamicBadge, errorMessages } = require('../dynamic-common')
diff --git a/services/eclipse-marketplace/eclipse-marketplace-downloads.service.js b/services/eclipse-marketplace/eclipse-marketplace-downloads.service.js
index 45b1f3fe20..abd347f20c 100644
--- a/services/eclipse-marketplace/eclipse-marketplace-downloads.service.js
+++ b/services/eclipse-marketplace/eclipse-marketplace-downloads.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { metric } = require('../text-formatters')
 const { downloadCount: downloadCountColor } = require('../color-formatters')
 const { nonNegativeInteger } = require('../validators')
diff --git a/services/eclipse-marketplace/eclipse-marketplace-favorites.service.js b/services/eclipse-marketplace/eclipse-marketplace-favorites.service.js
index 2a2d5acbb6..7406cf51fb 100644
--- a/services/eclipse-marketplace/eclipse-marketplace-favorites.service.js
+++ b/services/eclipse-marketplace/eclipse-marketplace-favorites.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { nonNegativeInteger } = require('../validators')
 const EclipseMarketplaceBase = require('./eclipse-marketplace-base')
 
diff --git a/services/eclipse-marketplace/eclipse-marketplace-favorites.tester.js b/services/eclipse-marketplace/eclipse-marketplace-favorites.tester.js
index 3a3c9070e8..e8c2f77b5a 100644
--- a/services/eclipse-marketplace/eclipse-marketplace-favorites.tester.js
+++ b/services/eclipse-marketplace/eclipse-marketplace-favorites.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 t.create('favorites count')
diff --git a/services/eclipse-marketplace/eclipse-marketplace-license.service.js b/services/eclipse-marketplace/eclipse-marketplace-license.service.js
index 44ab9d76ea..856e6d24d3 100644
--- a/services/eclipse-marketplace/eclipse-marketplace-license.service.js
+++ b/services/eclipse-marketplace/eclipse-marketplace-license.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const EclipseMarketplaceBase = require('./eclipse-marketplace-base')
 
 const licenseResponseSchema = Joi.object({
diff --git a/services/eclipse-marketplace/eclipse-marketplace-update.service.js b/services/eclipse-marketplace/eclipse-marketplace-update.service.js
index e931f6e274..2fa6e32553 100644
--- a/services/eclipse-marketplace/eclipse-marketplace-update.service.js
+++ b/services/eclipse-marketplace/eclipse-marketplace-update.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { formatDate } = require('../text-formatters')
 const { age: ageColor } = require('../color-formatters')
 const { nonNegativeInteger } = require('../validators')
diff --git a/services/eclipse-marketplace/eclipse-marketplace-version.service.js b/services/eclipse-marketplace/eclipse-marketplace-version.service.js
index bf05533df9..5d35707b6d 100644
--- a/services/eclipse-marketplace/eclipse-marketplace-version.service.js
+++ b/services/eclipse-marketplace/eclipse-marketplace-version.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { renderVersionBadge } = require('../version')
 const EclipseMarketplaceBase = require('./eclipse-marketplace-base')
 
diff --git a/services/elm-package/elm-package.service.js b/services/elm-package/elm-package.service.js
index 6b4a180e67..7ee72c11d9 100644
--- a/services/elm-package/elm-package.service.js
+++ b/services/elm-package/elm-package.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { renderVersionBadge } = require('../version')
 const { BaseJsonService } = require('..')
 const { semver } = require('../validators')
diff --git a/services/endpoint-common.js b/services/endpoint-common.js
index c404a5e2e3..6794a20d84 100644
--- a/services/endpoint-common.js
+++ b/services/endpoint-common.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const validate = require('../core/base-service/validate')
 const { InvalidResponse } = require('.')
 
diff --git a/services/endpoint/endpoint.service.js b/services/endpoint/endpoint.service.js
index 65e1504db6..8b8ad69c1a 100644
--- a/services/endpoint/endpoint.service.js
+++ b/services/endpoint/endpoint.service.js
@@ -1,7 +1,7 @@
 'use strict'
 
 const { URL } = require('url')
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService, InvalidParameter } = require('..')
 const { errorMessages } = require('../dynamic-common')
 const { optionalUrl } = require('../validators')
diff --git a/services/f-droid/f-droid.service.js b/services/f-droid/f-droid.service.js
index 89209c7160..df87f325f9 100644
--- a/services/f-droid/f-droid.service.js
+++ b/services/f-droid/f-droid.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { addv } = require('../text-formatters')
 const { version: versionColor } = require('../color-formatters')
 const { BaseYamlService, InvalidResponse } = require('..')
diff --git a/services/fedora/fedora.service.js b/services/fedora/fedora.service.js
index ee087866c0..240df13c93 100644
--- a/services/fedora/fedora.service.js
+++ b/services/fedora/fedora.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { renderVersionBadge } = require('../version')
 const { BaseJsonService } = require('..')
 
diff --git a/services/gem/gem-downloads.service.js b/services/gem/gem-downloads.service.js
index 8b940c94ab..db5848a521 100644
--- a/services/gem/gem-downloads.service.js
+++ b/services/gem/gem-downloads.service.js
@@ -1,7 +1,7 @@
 'use strict'
 
 const semver = require('semver')
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { downloadCount } = require('../color-formatters')
 const { metric } = require('../text-formatters')
 const { latest: latestVersion } = require('../version')
diff --git a/services/gem/gem-owner.service.js b/services/gem/gem-owner.service.js
index 68ad57f7be..19932243fc 100644
--- a/services/gem/gem-owner.service.js
+++ b/services/gem/gem-owner.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService } = require('..')
 const { floorCount: floorCountColor } = require('../color-formatters')
 
diff --git a/services/gem/gem-owner.tester.js b/services/gem/gem-owner.tester.js
index 80d1d9286c..4513dce246 100644
--- a/services/gem/gem-owner.tester.js
+++ b/services/gem/gem-owner.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 t.create('users (valid)')
diff --git a/services/gem/gem-rank.service.js b/services/gem/gem-rank.service.js
index 557914024c..e63470d413 100644
--- a/services/gem/gem-rank.service.js
+++ b/services/gem/gem-rank.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { floorCount } = require('../color-formatters')
 const { ordinalNumber } = require('../text-formatters')
 const { BaseJsonService, InvalidResponse } = require('..')
diff --git a/services/gem/gem-rank.tester.js b/services/gem/gem-rank.tester.js
index 6546d889de..5a8bd5b4fc 100644
--- a/services/gem/gem-rank.tester.js
+++ b/services/gem/gem-rank.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 const isOrdinalNumber = Joi.string().regex(/^[1-9][0-9]+(ᵗʰ|ˢᵗ|ⁿᵈ|ʳᵈ)$/)
diff --git a/services/gem/gem-version.service.js b/services/gem/gem-version.service.js
index 160b083eb3..abbdfecce4 100644
--- a/services/gem/gem-version.service.js
+++ b/services/gem/gem-version.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { renderVersionBadge } = require('../version')
 const { BaseJsonService } = require('..')
 
diff --git a/services/github/github-api-provider.js b/services/github/github-api-provider.js
index b2c1663add..6def1f9fcb 100644
--- a/services/github/github-api-provider.js
+++ b/services/github/github-api-provider.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { TokenPool } = require('../../core/token-pooling/token-pool')
 const { nonNegativeInteger } = require('../validators')
 
diff --git a/services/github/github-commit-activity.service.js b/services/github/github-commit-activity.service.js
index 73c5723f50..e5701b2e98 100644
--- a/services/github/github-commit-activity.service.js
+++ b/services/github/github-commit-activity.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { metric } = require('../text-formatters')
 const { nonNegativeInteger } = require('../validators')
 const { GithubAuthService } = require('./github-auth-service')
diff --git a/services/github/github-commit-status.service.js b/services/github/github-commit-status.service.js
index 90af2856e9..f6be212f76 100644
--- a/services/github/github-commit-status.service.js
+++ b/services/github/github-commit-status.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { NotFound, InvalidParameter } = require('..')
 const { GithubAuthService } = require('./github-auth-service')
 const { documentation, errorMessagesFor } = require('./github-helpers')
diff --git a/services/github/github-commits-since.service.js b/services/github/github-commits-since.service.js
index 175e2c53a4..8794d77e2f 100644
--- a/services/github/github-commits-since.service.js
+++ b/services/github/github-commits-since.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { metric } = require('../text-formatters')
 const { nonNegativeInteger } = require('../validators')
 const { GithubAuthService } = require('./github-auth-service')
diff --git a/services/github/github-commits-since.tester.js b/services/github/github-commits-since.tester.js
index 2e22511892..4bcc23d123 100644
--- a/services/github/github-commits-since.tester.js
+++ b/services/github/github-commits-since.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 t.create('Commits since')
diff --git a/services/github/github-common-fetch.js b/services/github/github-common-fetch.js
index eeac823d31..fd4d189e2d 100644
--- a/services/github/github-common-fetch.js
+++ b/services/github/github-common-fetch.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { InvalidResponse } = require('..')
 const { errorMessagesFor } = require('./github-helpers')
 
diff --git a/services/github/github-contributors.service.js b/services/github/github-contributors.service.js
index a02c2a698f..ee07898098 100644
--- a/services/github/github-contributors.service.js
+++ b/services/github/github-contributors.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const parseLinkHeader = require('parse-link-header')
 const { renderContributorBadge } = require('../contributor-count')
 const { GithubAuthService } = require('./github-auth-service')
diff --git a/services/github/github-downloads.service.js b/services/github/github-downloads.service.js
index d9738bf4fb..7c9861d578 100644
--- a/services/github/github-downloads.service.js
+++ b/services/github/github-downloads.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { NotFound } = require('..')
 const { metric } = require('../text-formatters')
 const { nonNegativeInteger } = require('../validators')
diff --git a/services/github/github-downloads.tester.js b/services/github/github-downloads.tester.js
index c48af01754..9f741ad5f8 100644
--- a/services/github/github-downloads.tester.js
+++ b/services/github/github-downloads.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { isMetric } = require('../test-validators')
 const t = (module.exports = require('../tester').createServiceTester())
 
diff --git a/services/github/github-followers.service.js b/services/github/github-followers.service.js
index 4e14a08edf..6415837492 100644
--- a/services/github/github-followers.service.js
+++ b/services/github/github-followers.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { metric } = require('../text-formatters')
 const { nonNegativeInteger } = require('../validators')
 const { GithubAuthService } = require('./github-auth-service')
diff --git a/services/github/github-followers.tester.js b/services/github/github-followers.tester.js
index 8e1fd07505..852d29c79c 100644
--- a/services/github/github-followers.tester.js
+++ b/services/github/github-followers.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 t.create('Followers')
diff --git a/services/github/github-forks.service.js b/services/github/github-forks.service.js
index 9d2747eb36..5a4db261ab 100644
--- a/services/github/github-forks.service.js
+++ b/services/github/github-forks.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { metric } = require('../text-formatters')
 const { nonNegativeInteger } = require('../validators')
 const { GithubAuthService } = require('./github-auth-service')
diff --git a/services/github/github-issue-detail.service.js b/services/github/github-issue-detail.service.js
index 31324ddc31..b4e71ac550 100644
--- a/services/github/github-issue-detail.service.js
+++ b/services/github/github-issue-detail.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { InvalidResponse } = require('..')
 const { nonNegativeInteger } = require('../validators')
 const { formatDate, metric } = require('../text-formatters')
diff --git a/services/github/github-issue-detail.tester.js b/services/github/github-issue-detail.tester.js
index 0a9de66414..8b5775d928 100644
--- a/services/github/github-issue-detail.tester.js
+++ b/services/github/github-issue-detail.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { isFormattedDate } = require('../test-validators')
 const t = (module.exports = require('../tester').createServiceTester())
 
diff --git a/services/github/github-issues.service.js b/services/github/github-issues.service.js
index 5e65dca3dc..a8bce133b5 100644
--- a/services/github/github-issues.service.js
+++ b/services/github/github-issues.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { metric } = require('../text-formatters')
 const { nonNegativeInteger } = require('../validators')
 const { GithubAuthService } = require('./github-auth-service')
diff --git a/services/github/github-issues.tester.js b/services/github/github-issues.tester.js
index fd9cb2e870..556eb10cfc 100644
--- a/services/github/github-issues.tester.js
+++ b/services/github/github-issues.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { isMetric, isMetricOpenIssues } = require('../test-validators')
 const t = (module.exports = require('../tester').createServiceTester())
 
diff --git a/services/github/github-language-count.tester.js b/services/github/github-language-count.tester.js
index 97120c5376..6de2a888f5 100644
--- a/services/github/github-language-count.tester.js
+++ b/services/github/github-language-count.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 t.create('language count')
diff --git a/services/github/github-languages-base.js b/services/github/github-languages-base.js
index eb1f4800d7..e6662f4e35 100644
--- a/services/github/github-languages-base.js
+++ b/services/github/github-languages-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { nonNegativeInteger } = require('../validators')
 const { GithubAuthService } = require('./github-auth-service')
 const { errorMessagesFor } = require('./github-helpers')
diff --git a/services/github/github-last-commit.service.js b/services/github/github-last-commit.service.js
index 0e277690fb..f8658ec53e 100644
--- a/services/github/github-last-commit.service.js
+++ b/services/github/github-last-commit.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { formatDate } = require('../text-formatters')
 const { age: ageColor } = require('../color-formatters')
 const { GithubAuthService } = require('./github-auth-service')
diff --git a/services/github/github-license.service.js b/services/github/github-license.service.js
index 479187742b..5970caa89b 100644
--- a/services/github/github-license.service.js
+++ b/services/github/github-license.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { renderLicenseBadge } = require('../licenses')
 const { GithubAuthService } = require('./github-auth-service')
 const { documentation, errorMessagesFor } = require('./github-helpers')
diff --git a/services/github/github-manifest.service.js b/services/github/github-manifest.service.js
index b9491c469c..d930a82d28 100644
--- a/services/github/github-manifest.service.js
+++ b/services/github/github-manifest.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { renderVersionBadge } = require('../version')
 const {
   individualValueSchema,
diff --git a/services/github/github-manifest.tester.js b/services/github/github-manifest.tester.js
index 0223d6dff0..3811c77f0e 100644
--- a/services/github/github-manifest.tester.js
+++ b/services/github/github-manifest.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { ServiceTester } = require('../tester')
 const { isVPlusDottedVersionAtLeastOne } = require('../test-validators')
 
diff --git a/services/github/github-package-json.service.js b/services/github/github-package-json.service.js
index aa23978613..df061452e5 100644
--- a/services/github/github-package-json.service.js
+++ b/services/github/github-package-json.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { renderVersionBadge } = require('../version')
 const {
   transformAndValidate,
diff --git a/services/github/github-package-json.tester.js b/services/github/github-package-json.tester.js
index 0fd455fe1f..e9548029c4 100644
--- a/services/github/github-package-json.tester.js
+++ b/services/github/github-package-json.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { ServiceTester } = require('../tester')
 const { isSemver } = require('../test-validators')
 const { semverRange } = require('../validators')
diff --git a/services/github/github-pull-request-check-state.service.js b/services/github/github-pull-request-check-state.service.js
index eed3b537a9..3c764dc2d4 100644
--- a/services/github/github-pull-request-check-state.service.js
+++ b/services/github/github-pull-request-check-state.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const countBy = require('lodash.countby')
 const { GithubAuthService } = require('./github-auth-service')
 const { fetchIssue } = require('./github-common-fetch')
diff --git a/services/github/github-release-date.service.js b/services/github/github-release-date.service.js
index a1dbe3db63..7bbd8585b9 100644
--- a/services/github/github-release-date.service.js
+++ b/services/github/github-release-date.service.js
@@ -1,7 +1,7 @@
 'use strict'
 
 const moment = require('moment')
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { age } = require('../color-formatters')
 const { formatDate } = require('../text-formatters')
 const { GithubAuthService } = require('./github-auth-service')
diff --git a/services/github/github-repo-size.service.js b/services/github/github-repo-size.service.js
index bab07e5863..c802028fad 100644
--- a/services/github/github-repo-size.service.js
+++ b/services/github/github-repo-size.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const prettyBytes = require('pretty-bytes')
 const { nonNegativeInteger } = require('../validators')
 const { GithubAuthService } = require('./github-auth-service')
diff --git a/services/github/github-search.service.js b/services/github/github-search.service.js
index 0e1d65b0af..c2433ecf94 100644
--- a/services/github/github-search.service.js
+++ b/services/github/github-search.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { metric } = require('../text-formatters')
 const { nonNegativeInteger } = require('../validators')
 const { GithubAuthService } = require('./github-auth-service')
diff --git a/services/github/github-size.service.js b/services/github/github-size.service.js
index c5c9531c23..46b9a6cd2c 100644
--- a/services/github/github-size.service.js
+++ b/services/github/github-size.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const prettyBytes = require('pretty-bytes')
 const { nonNegativeInteger } = require('../validators')
 const { GithubAuthService } = require('./github-auth-service')
diff --git a/services/github/github-stars.service.js b/services/github/github-stars.service.js
index d5c1f72cfa..832f635795 100644
--- a/services/github/github-stars.service.js
+++ b/services/github/github-stars.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { metric } = require('../text-formatters')
 const { nonNegativeInteger } = require('../validators')
 const { GithubAuthService } = require('./github-auth-service')
diff --git a/services/github/github-stars.tester.js b/services/github/github-stars.tester.js
index 1c1c55ca18..92ad07afef 100644
--- a/services/github/github-stars.tester.js
+++ b/services/github/github-stars.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 t.create('Stars')
diff --git a/services/github/github-tag.service.js b/services/github/github-tag.service.js
index f0408ec85d..b6963ab40b 100644
--- a/services/github/github-tag.service.js
+++ b/services/github/github-tag.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { NotFound } = require('..')
 const { addv } = require('../text-formatters')
 const { version: versionColor } = require('../color-formatters')
diff --git a/services/github/github-tag.tester.js b/services/github/github-tag.tester.js
index 69fb6d5e8e..b51d5123b9 100644
--- a/services/github/github-tag.tester.js
+++ b/services/github/github-tag.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 t.create('Tag')
diff --git a/services/github/github-top-language.tester.js b/services/github/github-top-language.tester.js
index 348d0dbf2c..f6d5c805db 100644
--- a/services/github/github-top-language.tester.js
+++ b/services/github/github-top-language.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 t.create('top language')
diff --git a/services/github/github-watchers.service.js b/services/github/github-watchers.service.js
index 905bb3efc7..35ea30f093 100644
--- a/services/github/github-watchers.service.js
+++ b/services/github/github-watchers.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { metric } = require('../text-formatters')
 const { nonNegativeInteger } = require('../validators')
 const { GithubAuthService } = require('./github-auth-service')
diff --git a/services/github/github-watchers.tester.js b/services/github/github-watchers.tester.js
index e31ddcbdc2..814c7d0698 100644
--- a/services/github/github-watchers.tester.js
+++ b/services/github/github-watchers.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 t.create('Watchers')
diff --git a/services/gitlab/gitlab-pipeline-status.service.js b/services/gitlab/gitlab-pipeline-status.service.js
index f9e12aacce..c1d47c6bcb 100644
--- a/services/gitlab/gitlab-pipeline-status.service.js
+++ b/services/gitlab/gitlab-pipeline-status.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { isBuildStatus, renderBuildStatusBadge } = require('../build-status')
 const { BaseSvgScrapingService, NotFound } = require('..')
 const { optionalUrl } = require('../validators')
diff --git a/services/hackage/hackage-deps.tester.js b/services/hackage/hackage-deps.tester.js
index caab395b12..3b60d7c6ea 100644
--- a/services/hackage/hackage-deps.tester.js
+++ b/services/hackage/hackage-deps.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 t.create('hackage deps (valid)')
diff --git a/services/hexpm/hexpm.service.js b/services/hexpm/hexpm.service.js
index 098ed7f503..457ee9ad9b 100644
--- a/services/hexpm/hexpm.service.js
+++ b/services/hexpm/hexpm.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { metric, addv, maybePluralize } = require('../text-formatters')
 const { downloadCount, version: versionColor } = require('../color-formatters')
 const { BaseJsonService } = require('..')
diff --git a/services/hexpm/hexpm.tester.js b/services/hexpm/hexpm.tester.js
index 12637e5560..0ef89e35f1 100644
--- a/services/hexpm/hexpm.tester.js
+++ b/services/hexpm/hexpm.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { ServiceTester } = require('../tester')
 const { isMetric, isMetricOverTimePeriod } = require('../test-validators')
 
diff --git a/services/homebrew/homebrew.service.js b/services/homebrew/homebrew.service.js
index 71f4b07a07..7e87c5d56b 100644
--- a/services/homebrew/homebrew.service.js
+++ b/services/homebrew/homebrew.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { renderVersionBadge } = require('../version')
 const { BaseJsonService } = require('..')
 
diff --git a/services/hsts/hsts.service.js b/services/hsts/hsts.service.js
index 3c07b0340d..42dbd1ea36 100644
--- a/services/hsts/hsts.service.js
+++ b/services/hsts/hsts.service.js
@@ -2,7 +2,7 @@
 
 const label = 'hsts preloaded'
 const { BaseJsonService } = require('..')
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const schema = Joi.object({
   status: Joi.string().required(),
 }).required()
diff --git a/services/itunes/itunes.service.js b/services/itunes/itunes.service.js
index c1324afb5f..2c531bd91f 100644
--- a/services/itunes/itunes.service.js
+++ b/services/itunes/itunes.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { renderVersionBadge } = require('../version')
 const { BaseJsonService, NotFound } = require('..')
 const { nonNegativeInteger } = require('../validators')
diff --git a/services/jenkins/jenkins-build.service.js b/services/jenkins/jenkins-build.service.js
index 4ce4412bde..b8db081ad5 100644
--- a/services/jenkins/jenkins-build.service.js
+++ b/services/jenkins/jenkins-build.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { renderBuildStatusBadge } = require('../build-status')
 const JenkinsBase = require('./jenkins-base')
 const {
diff --git a/services/jenkins/jenkins-build.tester.js b/services/jenkins/jenkins-build.tester.js
index f4d85132e6..c9e6d0f1dc 100644
--- a/services/jenkins/jenkins-build.tester.js
+++ b/services/jenkins/jenkins-build.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const sinon = require('sinon')
 const serverSecrets = require('../../lib/server-secrets')
 const { isBuildStatus } = require('../build-status')
diff --git a/services/jenkins/jenkins-common.js b/services/jenkins/jenkins-common.js
index 06e65097fa..bf71e8949b 100644
--- a/services/jenkins/jenkins-common.js
+++ b/services/jenkins/jenkins-common.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 
 const queryParamSchema = Joi.object({
   disableStrictSSL: Joi.equal(''),
diff --git a/services/jenkins/jenkins-coverage.service.js b/services/jenkins/jenkins-coverage.service.js
index f6b96613d0..9f30530f2b 100644
--- a/services/jenkins/jenkins-coverage.service.js
+++ b/services/jenkins/jenkins-coverage.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { coveragePercentage } = require('../color-formatters')
 const JenkinsBase = require('./jenkins-base')
 const {
diff --git a/services/jenkins/jenkins-plugin-installs.service.js b/services/jenkins/jenkins-plugin-installs.service.js
index 39543c20e6..c98d76febd 100644
--- a/services/jenkins/jenkins-plugin-installs.service.js
+++ b/services/jenkins/jenkins-plugin-installs.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { downloadCount: downloadCountColor } = require('../color-formatters')
 const { metric } = require('../text-formatters')
 const { BaseJsonService, NotFound } = require('..')
diff --git a/services/jenkins/jenkins-plugin-version.tester.js b/services/jenkins/jenkins-plugin-version.tester.js
index 9a64bcbae0..2681a9eb0e 100644
--- a/services/jenkins/jenkins-plugin-version.tester.js
+++ b/services/jenkins/jenkins-plugin-version.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { ServiceTester } = require('../tester')
 
 const t = new ServiceTester({
diff --git a/services/jenkins/jenkins-tests.service.js b/services/jenkins/jenkins-tests.service.js
index d1d22408e1..8d2f98f155 100644
--- a/services/jenkins/jenkins-tests.service.js
+++ b/services/jenkins/jenkins-tests.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { InvalidResponse } = require('..')
 const {
   documentation,
diff --git a/services/jetbrains/jetbrains-downloads.service.js b/services/jetbrains/jetbrains-downloads.service.js
index 68bd8a7607..0baff0afe6 100644
--- a/services/jetbrains/jetbrains-downloads.service.js
+++ b/services/jetbrains/jetbrains-downloads.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { metric } = require('../text-formatters')
 const { downloadCount: downloadCountColor } = require('../color-formatters')
 const { nonNegativeInteger } = require('../validators')
diff --git a/services/jetbrains/jetbrains-version.service.js b/services/jetbrains/jetbrains-version.service.js
index 34083cf35e..22d1cd9095 100644
--- a/services/jetbrains/jetbrains-version.service.js
+++ b/services/jetbrains/jetbrains-version.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { renderVersionBadge } = require('../version')
 const JetbrainsBase = require('./jetbrains-base')
 
diff --git a/services/jira/jira-issue.service.js b/services/jira/jira-issue.service.js
index c3d99b7a99..fe95067f41 100644
--- a/services/jira/jira-issue.service.js
+++ b/services/jira/jira-issue.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const JiraBase = require('./jira-base')
 
 const schema = Joi.object({
diff --git a/services/jira/jira-sprint.service.js b/services/jira/jira-sprint.service.js
index 004a3d2ded..7722477b44 100644
--- a/services/jira/jira-sprint.service.js
+++ b/services/jira/jira-sprint.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const JiraBase = require('./jira-base')
 
 const schema = Joi.object({
diff --git a/services/jitpack/jitpack-version.service.js b/services/jitpack/jitpack-version.service.js
index 250d6efb65..2449489329 100644
--- a/services/jitpack/jitpack-version.service.js
+++ b/services/jitpack/jitpack-version.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService } = require('..')
 const { renderVersionBadge } = require('../version')
 
diff --git a/services/jitpack/jitpack-version.tester.js b/services/jitpack/jitpack-version.tester.js
index 695a32d76e..1debcd801b 100644
--- a/services/jitpack/jitpack-version.tester.js
+++ b/services/jitpack/jitpack-version.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 // Github allows versions with chars, etc.
diff --git a/services/jsdelivr/jsdelivr-base.js b/services/jsdelivr/jsdelivr-base.js
index f40bac5b11..c8a78069ac 100644
--- a/services/jsdelivr/jsdelivr-base.js
+++ b/services/jsdelivr/jsdelivr-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { downloadCount } = require('../color-formatters')
 const { metric } = require('../text-formatters')
 const { BaseJsonService } = require('..')
diff --git a/services/keybase/keybase-btc.service.js b/services/keybase/keybase-btc.service.js
index 992886d9e5..fa8b8e4210 100644
--- a/services/keybase/keybase-btc.service.js
+++ b/services/keybase/keybase-btc.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { nonNegativeInteger } = require('../validators')
 const KeybaseProfile = require('./keybase-profile')
 
diff --git a/services/keybase/keybase-pgp.service.js b/services/keybase/keybase-pgp.service.js
index 6f8e6a6720..4cd402f532 100644
--- a/services/keybase/keybase-pgp.service.js
+++ b/services/keybase/keybase-pgp.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { nonNegativeInteger } = require('../validators')
 const KeybaseProfile = require('./keybase-profile')
 
diff --git a/services/keybase/keybase-pgp.tester.js b/services/keybase/keybase-pgp.tester.js
index ecc1388a76..40d90d0a35 100644
--- a/services/keybase/keybase-pgp.tester.js
+++ b/services/keybase/keybase-pgp.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 t.create('existing key fingerprint')
diff --git a/services/keybase/keybase-xlm.service.js b/services/keybase/keybase-xlm.service.js
index 148fc34277..f3051c4f0f 100644
--- a/services/keybase/keybase-xlm.service.js
+++ b/services/keybase/keybase-xlm.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { nonNegativeInteger } = require('../validators')
 const KeybaseProfile = require('./keybase-profile')
 
diff --git a/services/keybase/keybase-zec.service.js b/services/keybase/keybase-zec.service.js
index 31992da517..442ab51859 100644
--- a/services/keybase/keybase-zec.service.js
+++ b/services/keybase/keybase-zec.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { nonNegativeInteger } = require('../validators')
 const KeybaseProfile = require('./keybase-profile')
 
diff --git a/services/leanpub/leanpub-book-summary.service.js b/services/leanpub/leanpub-book-summary.service.js
index f90cdc2fb5..e175e1eba4 100644
--- a/services/leanpub/leanpub-book-summary.service.js
+++ b/services/leanpub/leanpub-book-summary.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService } = require('..')
 
 const bookSummarySchema = Joi.object({
diff --git a/services/leanpub/leanpub-book-summary.tester.js b/services/leanpub/leanpub-book-summary.tester.js
index 8c019fea97..f1631294b0 100644
--- a/services/leanpub/leanpub-book-summary.tester.js
+++ b/services/leanpub/leanpub-book-summary.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 const knownValidBook = 'juice-shop'
diff --git a/services/lgtm/lgtm-base.js b/services/lgtm/lgtm-base.js
index f85de912b3..916675d77a 100644
--- a/services/lgtm/lgtm-base.js
+++ b/services/lgtm/lgtm-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService } = require('..')
 
 const schema = Joi.object({
diff --git a/services/lgtm/lgtm.tester.js b/services/lgtm/lgtm.tester.js
index 874cd8bb9e..8e1b66b80f 100644
--- a/services/lgtm/lgtm.tester.js
+++ b/services/lgtm/lgtm.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { ServiceTester } = require('../tester')
 const t = new ServiceTester({ id: 'lgtm', title: 'LGTM' })
 module.exports = t
diff --git a/services/liberapay/liberapay-base.js b/services/liberapay/liberapay-base.js
index f4978f5cb4..c1d0daeb1c 100644
--- a/services/liberapay/liberapay-base.js
+++ b/services/liberapay/liberapay-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { metric } = require('../text-formatters')
 const { BaseJsonService } = require('..')
 const { colorScale } = require('../color-formatters')
diff --git a/services/librariesio/librariesio-common.js b/services/librariesio/librariesio-common.js
index 8407d06b65..a56014b92c 100644
--- a/services/librariesio/librariesio-common.js
+++ b/services/librariesio/librariesio-common.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { nonNegativeInteger, anyInteger } = require('../validators')
 
 // API doc: https://libraries.io/api#project
diff --git a/services/librariesio/librariesio-dependencies.service.js b/services/librariesio/librariesio-dependencies.service.js
index fd4e628009..1763369f9e 100644
--- a/services/librariesio/librariesio-dependencies.service.js
+++ b/services/librariesio/librariesio-dependencies.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService } = require('..')
 const {
   transform,
diff --git a/services/luarocks/luarocks.service.js b/services/luarocks/luarocks.service.js
index ed5507f9e2..0fde7c6452 100644
--- a/services/luarocks/luarocks.service.js
+++ b/services/luarocks/luarocks.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService, NotFound } = require('..')
 const { addv } = require('../text-formatters')
 const { latestVersion } = require('./luarocks-version-helpers')
diff --git a/services/luarocks/luarocks.tester.js b/services/luarocks/luarocks.tester.js
index 87074a360e..19910f08fe 100644
--- a/services/luarocks/luarocks.tester.js
+++ b/services/luarocks/luarocks.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 const isLuaVersion = Joi.string()
diff --git a/services/mastodon/mastodon-follow.service.js b/services/mastodon/mastodon-follow.service.js
index 481ccd2c31..9c53a1714e 100644
--- a/services/mastodon/mastodon-follow.service.js
+++ b/services/mastodon/mastodon-follow.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService, NotFound } = require('..')
 const { metric } = require('../text-formatters')
 const { optionalUrl, nonNegativeInteger } = require('../validators')
diff --git a/services/matrix/matrix.service.js b/services/matrix/matrix.service.js
index 1fab19414f..8d63d665a1 100644
--- a/services/matrix/matrix.service.js
+++ b/services/matrix/matrix.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService, InvalidParameter } = require('..')
 
 const queryParamSchema = Joi.object({
diff --git a/services/matrix/matrix.tester.js b/services/matrix/matrix.tester.js
index d6853010fd..43035127b6 100644
--- a/services/matrix/matrix.tester.js
+++ b/services/matrix/matrix.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 t.create('get room state as guest')
diff --git a/services/maven-central/maven-central.service.js b/services/maven-central/maven-central.service.js
index 6c108924d9..c9a204b67e 100644
--- a/services/maven-central/maven-central.service.js
+++ b/services/maven-central/maven-central.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseXmlService, NotFound } = require('..')
 const { renderVersionBadge } = require('../version')
 
diff --git a/services/maven-metadata/maven-metadata.service.js b/services/maven-metadata/maven-metadata.service.js
index 04740fcb31..cf98027b9b 100644
--- a/services/maven-metadata/maven-metadata.service.js
+++ b/services/maven-metadata/maven-metadata.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseXmlService } = require('..')
 const { renderVersionBadge } = require('../version')
 
diff --git a/services/microbadger/microbadger-base.js b/services/microbadger/microbadger-base.js
index 59a01c5dd5..571aa7af03 100644
--- a/services/microbadger/microbadger-base.js
+++ b/services/microbadger/microbadger-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService, NotFound } = require('..')
 const { nonNegativeInteger } = require('../validators')
 
diff --git a/services/microbadger/microbadger-layers.tester.js b/services/microbadger/microbadger-layers.tester.js
index ec9adfafb2..59bc15314b 100644
--- a/services/microbadger/microbadger-layers.tester.js
+++ b/services/microbadger/microbadger-layers.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 t.create('layers without a specified tag')
diff --git a/services/mozilla-observatory/mozilla-observatory.service.js b/services/mozilla-observatory/mozilla-observatory.service.js
index 832ee74c58..7190c27461 100644
--- a/services/mozilla-observatory/mozilla-observatory.service.js
+++ b/services/mozilla-observatory/mozilla-observatory.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService } = require('..')
 
 const schema = Joi.object({
diff --git a/services/mozilla-observatory/mozilla-observatory.tester.js b/services/mozilla-observatory/mozilla-observatory.tester.js
index 1c5921965a..0b5d3cc357 100644
--- a/services/mozilla-observatory/mozilla-observatory.tester.js
+++ b/services/mozilla-observatory/mozilla-observatory.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 const validColors = ['brightgreen', 'green', 'yellow', 'orange', 'red']
diff --git a/services/nexus/nexus.service.js b/services/nexus/nexus.service.js
index 4704db708f..d4042ce48a 100644
--- a/services/nexus/nexus.service.js
+++ b/services/nexus/nexus.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { version: versionColor } = require('../color-formatters')
 const { addv } = require('../text-formatters')
 const serverSecrets = require('../../lib/server-secrets')
diff --git a/services/nodeping/nodeping-status.service.js b/services/nodeping/nodeping-status.service.js
index ee4c9bf897..68a7e08958 100644
--- a/services/nodeping/nodeping-status.service.js
+++ b/services/nodeping/nodeping-status.service.js
@@ -1,7 +1,7 @@
 'use strict'
 
 const { BaseJsonService } = require('..')
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const {
   queryParamSchema,
   exampleQueryParams,
diff --git a/services/nodeping/nodeping-status.tester.js b/services/nodeping/nodeping-status.tester.js
index da4e5691a1..5a8b46815c 100644
--- a/services/nodeping/nodeping-status.tester.js
+++ b/services/nodeping/nodeping-status.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 t.create('NodePing status - live')
diff --git a/services/nodeping/nodeping-uptime.service.js b/services/nodeping/nodeping-uptime.service.js
index 8b59db4b0d..dadbd7f741 100644
--- a/services/nodeping/nodeping-uptime.service.js
+++ b/services/nodeping/nodeping-uptime.service.js
@@ -1,7 +1,7 @@
 'use strict'
 
 const { BaseJsonService } = require('..')
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { colorScale } = require('../color-formatters')
 
 const colorFormatter = colorScale([99, 99.5, 100])
diff --git a/services/npm/npm-base.js b/services/npm/npm-base.js
index 21b9547b40..023088a0c6 100644
--- a/services/npm/npm-base.js
+++ b/services/npm/npm-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const serverSecrets = require('../../lib/server-secrets')
 const { BaseJsonService, InvalidResponse, NotFound } = require('..')
 const { optionalUrl } = require('../validators')
diff --git a/services/npm/npm-downloads.service.js b/services/npm/npm-downloads.service.js
index f5f5f64c70..7bebf18cf6 100644
--- a/services/npm/npm-downloads.service.js
+++ b/services/npm/npm-downloads.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { metric } = require('../text-formatters')
 const { BaseJsonService } = require('..')
 const { nonNegativeInteger } = require('../validators')
diff --git a/services/npm/npm-type-definitions.tester.js b/services/npm/npm-type-definitions.tester.js
index 2f2ae0cc37..319d9a2707 100644
--- a/services/npm/npm-type-definitions.tester.js
+++ b/services/npm/npm-type-definitions.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 const isTypeDefinition = Joi.string().regex(
diff --git a/services/npm/npm-version.service.js b/services/npm/npm-version.service.js
index bf3fdef3ec..1c590305b9 100644
--- a/services/npm/npm-version.service.js
+++ b/services/npm/npm-version.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { renderVersionBadge } = require('../version')
 const { NotFound } = require('..')
 const NpmBase = require('./npm-base')
diff --git a/services/nuget/nuget-v2-service-family.js b/services/nuget/nuget-v2-service-family.js
index 4d02a3b6ab..8a59aaa8ca 100644
--- a/services/nuget/nuget-v2-service-family.js
+++ b/services/nuget/nuget-v2-service-family.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService, BaseXmlService, NotFound } = require('..')
 const { nonNegativeInteger } = require('../validators')
 const {
diff --git a/services/nuget/nuget-v3-service-family.js b/services/nuget/nuget-v3-service-family.js
index 93104a13f3..cc41653e63 100644
--- a/services/nuget/nuget-v3-service-family.js
+++ b/services/nuget/nuget-v3-service-family.js
@@ -1,7 +1,7 @@
 'use strict'
 
 const { promisify } = require('util')
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { regularUpdate } = require('../../core/legacy/regular-update')
 const RouteBuilder = require('../route-builder')
 const { BaseJsonService, NotFound } = require('..')
diff --git a/services/opencollective/opencollective-base.js b/services/opencollective/opencollective-base.js
index 41ba077f4e..f6bf42dc2c 100644
--- a/services/opencollective/opencollective-base.js
+++ b/services/opencollective/opencollective-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService } = require('..')
 const { nonNegativeInteger } = require('../validators')
 
diff --git a/services/package-json-helpers.js b/services/package-json-helpers.js
index 79f41e903c..2906132870 100644
--- a/services/package-json-helpers.js
+++ b/services/package-json-helpers.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { InvalidParameter } = require('.')
 
 const isDependencyMap = Joi.object()
diff --git a/services/packagecontrol/packagecontrol.service.js b/services/packagecontrol/packagecontrol.service.js
index 800950b85d..1ec817d5f1 100644
--- a/services/packagecontrol/packagecontrol.service.js
+++ b/services/packagecontrol/packagecontrol.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { metric } = require('../text-formatters')
 const { downloadCount } = require('../color-formatters')
 const { BaseJsonService } = require('..')
diff --git a/services/packagist/packagist-base.js b/services/packagist/packagist-base.js
index 5e1b065f2a..c4279cce64 100644
--- a/services/packagist/packagist-base.js
+++ b/services/packagist/packagist-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService } = require('..')
 
 const allVersionsSchema = Joi.object({
diff --git a/services/packagist/packagist-downloads.service.js b/services/packagist/packagist-downloads.service.js
index 319b86c4c3..8cb5ea929b 100644
--- a/services/packagist/packagist-downloads.service.js
+++ b/services/packagist/packagist-downloads.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { metric } = require('../text-formatters')
 const { downloadCount } = require('../color-formatters')
 const { keywords, BasePackagistService } = require('./packagist-base')
diff --git a/services/packagist/packagist-license.service.js b/services/packagist/packagist-license.service.js
index df14391a69..ad438b9266 100644
--- a/services/packagist/packagist-license.service.js
+++ b/services/packagist/packagist-license.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { renderLicenseBadge } = require('../licenses')
 const { keywords, BasePackagistService } = require('./packagist-base')
 
diff --git a/services/packagist/packagist-version.service.js b/services/packagist/packagist-version.service.js
index bea6e9aa4f..968fbfd4d3 100644
--- a/services/packagist/packagist-version.service.js
+++ b/services/packagist/packagist-version.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { renderVersionBadge } = require('../version')
 const { compare, isStable, latest } = require('../php-version')
 const {
diff --git a/services/packagist/packagist-version.tester.js b/services/packagist/packagist-version.tester.js
index 33f528010c..ab89e78fed 100644
--- a/services/packagist/packagist-version.tester.js
+++ b/services/packagist/packagist-version.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const {
   isVPlusDottedVersionNClausesWithOptionalSuffix,
 } = require('../test-validators')
diff --git a/services/powershellgallery/powershellgallery.tester.js b/services/powershellgallery/powershellgallery.tester.js
index abad1b6c74..776f8febd3 100644
--- a/services/powershellgallery/powershellgallery.tester.js
+++ b/services/powershellgallery/powershellgallery.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { ServiceTester } = require('../tester')
 const {
   isMetric,
diff --git a/services/pub/pub.service.js b/services/pub/pub.service.js
index 15c4524b28..c230cf644b 100644
--- a/services/pub/pub.service.js
+++ b/services/pub/pub.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService } = require('..')
 const { latest, renderVersionBadge } = require('../version')
 
diff --git a/services/puppetforge/puppetforge-base.js b/services/puppetforge/puppetforge-base.js
index e8b876a12d..f9af192354 100644
--- a/services/puppetforge/puppetforge-base.js
+++ b/services/puppetforge/puppetforge-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService } = require('..')
 const { nonNegativeInteger, semver } = require('../validators')
 
diff --git a/services/pypi/pypi-base.js b/services/pypi/pypi-base.js
index 4179f3eea1..f77b7cf5fc 100644
--- a/services/pypi/pypi-base.js
+++ b/services/pypi/pypi-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService } = require('..')
 
 const schema = Joi.object({
diff --git a/services/pypi/pypi-downloads.service.js b/services/pypi/pypi-downloads.service.js
index 617a62b6c1..09cec5098b 100644
--- a/services/pypi/pypi-downloads.service.js
+++ b/services/pypi/pypi-downloads.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { downloadCount } = require('../color-formatters')
 const { metric } = require('../text-formatters')
 const { BaseJsonService } = require('..')
diff --git a/services/pypi/pypi.tester.js b/services/pypi/pypi.tester.js
index 28d61829ae..a2ef616cf5 100644
--- a/services/pypi/pypi.tester.js
+++ b/services/pypi/pypi.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { ServiceTester } = require('../tester')
 const { isMetricOverTimePeriod, isSemver } = require('../test-validators')
 
diff --git a/services/readthedocs/readthedocs.service.js b/services/readthedocs/readthedocs.service.js
index a9537f108f..18ae244e64 100644
--- a/services/readthedocs/readthedocs.service.js
+++ b/services/readthedocs/readthedocs.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { isBuildStatus, renderBuildStatusBadge } = require('../build-status')
 const { BaseSvgScrapingService, NotFound } = require('..')
 
diff --git a/services/readthedocs/readthedocs.tester.js b/services/readthedocs/readthedocs.tester.js
index 2ed6c8bdb4..eab0e3e4b4 100644
--- a/services/readthedocs/readthedocs.tester.js
+++ b/services/readthedocs/readthedocs.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { isBuildStatus } = require('../build-status')
 const t = (module.exports = require('../tester').createServiceTester())
 
diff --git a/services/reddit/subreddit-subscribers.service.js b/services/reddit/subreddit-subscribers.service.js
index 26e35047ae..5c47593b66 100644
--- a/services/reddit/subreddit-subscribers.service.js
+++ b/services/reddit/subreddit-subscribers.service.js
@@ -1,7 +1,7 @@
 'use strict'
 
 const { BaseJsonService, NotFound } = require('..')
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { optionalNonNegativeInteger } = require('../validators')
 const { metric } = require('../text-formatters')
 
diff --git a/services/redmine/redmine.service.js b/services/redmine/redmine.service.js
index 0364574662..e05a3841c6 100644
--- a/services/redmine/redmine.service.js
+++ b/services/redmine/redmine.service.js
@@ -2,7 +2,7 @@
 
 const { starRating } = require('../text-formatters')
 const { floorCount: floorCountColor } = require('../color-formatters')
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseXmlService } = require('..')
 
 const schema = Joi.object({
diff --git a/services/redmine/redmine.tester.js b/services/redmine/redmine.tester.js
index 720d8a77e8..f83d51049c 100644
--- a/services/redmine/redmine.tester.js
+++ b/services/redmine/redmine.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { ServiceTester } = require('../tester')
 const { isStarRating } = require('../test-validators')
 
diff --git a/services/requires/requires.service.js b/services/requires/requires.service.js
index 5e8ea1a094..ec3a105a72 100644
--- a/services/requires/requires.service.js
+++ b/services/requires/requires.service.js
@@ -1,7 +1,7 @@
 'use strict'
 
 const { BaseJsonService } = require('..')
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 
 const statusSchema = Joi.object({
   status: Joi.string().required(),
diff --git a/services/requires/requires.tester.js b/services/requires/requires.tester.js
index 92545be604..46751adc24 100644
--- a/services/requires/requires.tester.js
+++ b/services/requires/requires.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 const isRequireStatus = Joi.string().regex(
diff --git a/services/scrutinizer/scrutinizer-build.service.js b/services/scrutinizer/scrutinizer-build.service.js
index 50e04e2832..1166fd1124 100644
--- a/services/scrutinizer/scrutinizer-build.service.js
+++ b/services/scrutinizer/scrutinizer-build.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { isBuildStatus, renderBuildStatusBadge } = require('../build-status')
 const ScrutinizerBase = require('./scrutinizer-base')
 
diff --git a/services/scrutinizer/scrutinizer-build.tester.js b/services/scrutinizer/scrutinizer-build.tester.js
index aaa3a5bd96..5547c9f477 100644
--- a/services/scrutinizer/scrutinizer-build.tester.js
+++ b/services/scrutinizer/scrutinizer-build.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { isBuildStatus } = require('../build-status')
 const { ServiceTester } = require('../tester')
 const t = (module.exports = new ServiceTester({
diff --git a/services/scrutinizer/scrutinizer-coverage.service.js b/services/scrutinizer/scrutinizer-coverage.service.js
index 1af74c7c9e..a5e74277f7 100644
--- a/services/scrutinizer/scrutinizer-coverage.service.js
+++ b/services/scrutinizer/scrutinizer-coverage.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { NotFound } = require('..')
 const { colorScale } = require('../color-formatters')
 const ScrutinizerBase = require('./scrutinizer-base')
diff --git a/services/scrutinizer/scrutinizer-quality.service.js b/services/scrutinizer/scrutinizer-quality.service.js
index 50b6e32751..74f7f4d227 100644
--- a/services/scrutinizer/scrutinizer-quality.service.js
+++ b/services/scrutinizer/scrutinizer-quality.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { colorScale } = require('../color-formatters')
 const ScrutinizerBase = require('./scrutinizer-base')
 
diff --git a/services/scrutinizer/scrutinizer-quality.tester.js b/services/scrutinizer/scrutinizer-quality.tester.js
index 48ce6d198c..fe7a0539df 100644
--- a/services/scrutinizer/scrutinizer-quality.tester.js
+++ b/services/scrutinizer/scrutinizer-quality.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { ServiceTester } = require('../tester')
 const t = (module.exports = new ServiceTester({
   id: 'ScrutinizerQuality',
diff --git a/services/shippable/shippable.service.js b/services/shippable/shippable.service.js
index d5ed18fa8c..23a06456c5 100644
--- a/services/shippable/shippable.service.js
+++ b/services/shippable/shippable.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { renderBuildStatusBadge } = require('../build-status')
 const { BaseJsonService, NotFound } = require('..')
 
diff --git a/services/snyk/snyk-vulnerability-base.js b/services/snyk/snyk-vulnerability-base.js
index 900f452b3b..98bc2944ff 100644
--- a/services/snyk/snyk-vulnerability-base.js
+++ b/services/snyk/snyk-vulnerability-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseSvgScrapingService } = require('..')
 
 const schema = Joi.object({
diff --git a/services/snyk/snyk-vulnerability-github.tester.js b/services/snyk/snyk-vulnerability-github.tester.js
index 6a73abcaae..e899f00173 100644
--- a/services/snyk/snyk-vulnerability-github.tester.js
+++ b/services/snyk/snyk-vulnerability-github.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const t = (module.exports = require('../tester').createServiceTester())
 const {
   twoVulnerabilitiesSvg,
diff --git a/services/snyk/snyk-vulnerability-npm.tester.js b/services/snyk/snyk-vulnerability-npm.tester.js
index 8dc8f62851..1b56542d7c 100644
--- a/services/snyk/snyk-vulnerability-npm.tester.js
+++ b/services/snyk/snyk-vulnerability-npm.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const t = (module.exports = require('../tester').createServiceTester())
 const {
   twoVulnerabilitiesSvg,
diff --git a/services/sonar/sonar-base.js b/services/sonar/sonar-base.js
index d7bf177d26..709a06f757 100644
--- a/services/sonar/sonar-base.js
+++ b/services/sonar/sonar-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const serverSecrets = require('../../lib/server-secrets')
 const { BaseJsonService } = require('..')
 const { isLegacyVersion } = require('./sonar-helpers')
diff --git a/services/sonar/sonar-helpers.js b/services/sonar/sonar-helpers.js
index aa1093a124..9167d0c43a 100644
--- a/services/sonar/sonar-helpers.js
+++ b/services/sonar/sonar-helpers.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { colorScale } = require('../color-formatters')
 
 const patternBase = ':protocol(http|https)/:host(.+)/:component(.+)'
diff --git a/services/sonar/sonar-quality-gate.tester.js b/services/sonar/sonar-quality-gate.tester.js
index eeed30dd3b..d03e29b641 100644
--- a/services/sonar/sonar-quality-gate.tester.js
+++ b/services/sonar/sonar-quality-gate.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 const isQualityGateStatus = Joi.allow('passed', 'failed')
diff --git a/services/sonar/sonar-violations.tester.js b/services/sonar/sonar-violations.tester.js
index 44929da52d..724a303d67 100644
--- a/services/sonar/sonar-violations.tester.js
+++ b/services/sonar/sonar-violations.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { isMetric, withRegex } = require('../test-validators')
 const t = (module.exports = require('../tester').createServiceTester())
 const isViolationsLongFormMetric = Joi.alternatives(
diff --git a/services/sourceforge/sourceforge.service.js b/services/sourceforge/sourceforge.service.js
index 122c4b0e86..f158cfabad 100644
--- a/services/sourceforge/sourceforge.service.js
+++ b/services/sourceforge/sourceforge.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const moment = require('moment')
 const { BaseJsonService } = require('..')
 const { metric } = require('../text-formatters')
diff --git a/services/sourcegraph/sourcegraph.service.js b/services/sourcegraph/sourcegraph.service.js
index 052bb06666..6222eec086 100644
--- a/services/sourcegraph/sourcegraph.service.js
+++ b/services/sourcegraph/sourcegraph.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService } = require('..')
 
 const projectsCountRegex = /^\s[0-9]*(\.[0-9]k)?\sprojects$/
diff --git a/services/spiget/spiget-base.js b/services/spiget/spiget-base.js
index 67643786fa..f8d6ed137a 100644
--- a/services/spiget/spiget-base.js
+++ b/services/spiget/spiget-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService } = require('..')
 
 const resourceSchema = Joi.object({
diff --git a/services/spiget/spiget-latest-version.service.js b/services/spiget/spiget-latest-version.service.js
index 4cc81404d2..da9717f576 100644
--- a/services/spiget/spiget-latest-version.service.js
+++ b/services/spiget/spiget-latest-version.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { renderVersionBadge } = require('../version')
 const { BaseSpigetService, documentation, keywords } = require('./spiget-base')
 
diff --git a/services/stackexchange/stackexchange-monthlyquestions.service.js b/services/stackexchange/stackexchange-monthlyquestions.service.js
index e2110a6213..a2b83b5c37 100644
--- a/services/stackexchange/stackexchange-monthlyquestions.service.js
+++ b/services/stackexchange/stackexchange-monthlyquestions.service.js
@@ -1,7 +1,7 @@
 'use strict'
 
 const moment = require('moment')
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService } = require('..')
 const { nonNegativeInteger } = require('../validators')
 const renderQuestionsBadge = require('./stackexchange-helpers')
diff --git a/services/stackexchange/stackexchange-reputation.service.js b/services/stackexchange/stackexchange-reputation.service.js
index fd7d6adf57..0d00d8c4bf 100644
--- a/services/stackexchange/stackexchange-reputation.service.js
+++ b/services/stackexchange/stackexchange-reputation.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { metric } = require('../text-formatters')
 const { floorCount: floorCountColor } = require('../color-formatters')
 const { BaseJsonService } = require('..')
diff --git a/services/stackexchange/stackexchange-taginfo.service.js b/services/stackexchange/stackexchange-taginfo.service.js
index 254591fab5..9736e85bff 100644
--- a/services/stackexchange/stackexchange-taginfo.service.js
+++ b/services/stackexchange/stackexchange-taginfo.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService } = require('..')
 const renderQuestionsBadge = require('./stackexchange-helpers')
 
diff --git a/services/static-badge/query-string-static.service.js b/services/static-badge/query-string-static.service.js
index a17eaf915d..185ed35878 100644
--- a/services/static-badge/query-string-static.service.js
+++ b/services/static-badge/query-string-static.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseStaticService } = require('..')
 
 const queryParamSchema = Joi.object({
diff --git a/services/steam/steam-workshop.service.js b/services/steam/steam-workshop.service.js
index 360aad3d68..d53598d276 100644
--- a/services/steam/steam-workshop.service.js
+++ b/services/steam/steam-workshop.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const prettyBytes = require('pretty-bytes')
 const { metric, formatDate } = require('../text-formatters')
 const { age: ageColor, downloadCount } = require('../color-formatters')
diff --git a/services/swagger/swagger.service.js b/services/swagger/swagger.service.js
index f084048dd4..cdeac3eb4d 100644
--- a/services/swagger/swagger.service.js
+++ b/services/swagger/swagger.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService } = require('..')
 
 const validatorSchema = Joi.object()
diff --git a/services/symfony/symfony-insight-base.js b/services/symfony/symfony-insight-base.js
index 3305fced6c..0150cd2e55 100644
--- a/services/symfony/symfony-insight-base.js
+++ b/services/symfony/symfony-insight-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const serverSecrets = require('../../lib/server-secrets')
 const { BaseXmlService, Inaccessible } = require('..')
 
diff --git a/services/symfony/symfony-insight-grade.tester.js b/services/symfony/symfony-insight-grade.tester.js
index 7e742e2817..647f6a63a4 100644
--- a/services/symfony/symfony-insight-grade.tester.js
+++ b/services/symfony/symfony-insight-grade.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const t = (module.exports = require('../tester').createServiceTester())
 const {
   createTest,
diff --git a/services/teamcity/teamcity-build.service.js b/services/teamcity/teamcity-build.service.js
index f3e7e8fb4a..c1dca1bb8f 100644
--- a/services/teamcity/teamcity-build.service.js
+++ b/services/teamcity/teamcity-build.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const TeamCityBase = require('./teamcity-base')
 
 // The statusText field will start with a summary, potentially including test details, followed by an optional suffix.
diff --git a/services/teamcity/teamcity-build.tester.js b/services/teamcity/teamcity-build.tester.js
index cab7a1765e..21e47fb7e0 100644
--- a/services/teamcity/teamcity-build.tester.js
+++ b/services/teamcity/teamcity-build.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { withRegex } = require('../test-validators')
 const t = (module.exports = require('../tester').createServiceTester())
 const {
diff --git a/services/teamcity/teamcity-coverage.service.js b/services/teamcity/teamcity-coverage.service.js
index dc41fea87b..41827d5fcf 100644
--- a/services/teamcity/teamcity-coverage.service.js
+++ b/services/teamcity/teamcity-coverage.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { coveragePercentage } = require('../color-formatters')
 const { InvalidResponse } = require('..')
 const TeamCityBase = require('./teamcity-base')
diff --git a/services/test-results.js b/services/test-results.js
index a46841939e..eaa139f11d 100644
--- a/services/test-results.js
+++ b/services/test-results.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 
 const testResultQueryParamSchema = Joi.object({
   compact_message: Joi.equal(''),
diff --git a/services/test-validators.js b/services/test-validators.js
index 61d9861419..ed6519a41c 100644
--- a/services/test-validators.js
+++ b/services/test-validators.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { semver: isSemver } = require('./validators')
 
 /*
diff --git a/services/travis/travis-build.service.js b/services/travis/travis-build.service.js
index f601031af0..a27eeee980 100644
--- a/services/travis/travis-build.service.js
+++ b/services/travis/travis-build.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { isBuildStatus, renderBuildStatusBadge } = require('../build-status')
 const { BaseSvgScrapingService } = require('..')
 
diff --git a/services/travis/travis-build.tester.js b/services/travis/travis-build.tester.js
index 80167d111d..0809ec9f0f 100644
--- a/services/travis/travis-build.tester.js
+++ b/services/travis/travis-build.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { isBuildStatus } = require('../build-status')
 const { ServiceTester } = require('../tester')
 
diff --git a/services/travis/travis-php-version.service.js b/services/travis/travis-php-version.service.js
index cb52821375..b2b4e573ca 100644
--- a/services/travis/travis-php-version.service.js
+++ b/services/travis/travis-php-version.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService } = require('..')
 const {
   minorVersion,
diff --git a/services/twitter/twitter.service.js b/services/twitter/twitter.service.js
index 4344036f31..84c63222b1 100644
--- a/services/twitter/twitter.service.js
+++ b/services/twitter/twitter.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseService, BaseJsonService, NotFound } = require('..')
 const { metric } = require('../text-formatters')
 
diff --git a/services/ubuntu/ubuntu.service.js b/services/ubuntu/ubuntu.service.js
index 0345ef7f9f..746b703558 100644
--- a/services/ubuntu/ubuntu.service.js
+++ b/services/ubuntu/ubuntu.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { renderVersionBadge } = require('../version')
 const { BaseJsonService, NotFound } = require('..')
 
diff --git a/services/uptimerobot/uptimerobot-base.js b/services/uptimerobot/uptimerobot-base.js
index 7920f9e22c..641237ac58 100644
--- a/services/uptimerobot/uptimerobot-base.js
+++ b/services/uptimerobot/uptimerobot-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService, InvalidParameter, InvalidResponse } = require('..')
 
 // https://uptimerobot.com/api
diff --git a/services/uptimerobot/uptimerobot-status.tester.js b/services/uptimerobot/uptimerobot-status.tester.js
index e6128498d7..da6d6d1847 100644
--- a/services/uptimerobot/uptimerobot-status.tester.js
+++ b/services/uptimerobot/uptimerobot-status.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { invalidJSON } = require('../response-fixtures')
 const t = (module.exports = require('../tester').createServiceTester())
 
diff --git a/services/vaadin-directory/vaadin-directory-base.js b/services/vaadin-directory/vaadin-directory-base.js
index c64ec77da9..9e82c86837 100644
--- a/services/vaadin-directory/vaadin-directory-base.js
+++ b/services/vaadin-directory/vaadin-directory-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService } = require('..')
 const { nonNegativeInteger } = require('../validators')
 
diff --git a/services/vaadin-directory/vaadin-directory-rating-count.tester.js b/services/vaadin-directory/vaadin-directory-rating-count.tester.js
index fe096f2d0e..f6b602e757 100644
--- a/services/vaadin-directory/vaadin-directory-rating-count.tester.js
+++ b/services/vaadin-directory/vaadin-directory-rating-count.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 t.create('rating count of component')
diff --git a/services/vaadin-directory/vaadin-directory-rating.tester.js b/services/vaadin-directory/vaadin-directory-rating.tester.js
index 87cb3db2cc..48d762dfac 100644
--- a/services/vaadin-directory/vaadin-directory-rating.tester.js
+++ b/services/vaadin-directory/vaadin-directory-rating.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { isStarRating } = require('../test-validators')
 const t = (module.exports = require('../tester').createServiceTester())
 
diff --git a/services/vaadin-directory/vaadin-directory-status.tester.js b/services/vaadin-directory/vaadin-directory-status.tester.js
index 51abd9b9e1..52f5773e1d 100644
--- a/services/vaadin-directory/vaadin-directory-status.tester.js
+++ b/services/vaadin-directory/vaadin-directory-status.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 t.create('publish status of the component')
diff --git a/services/validators.js b/services/validators.js
index 7620220586..1e8aadd03f 100644
--- a/services/validators.js
+++ b/services/validators.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi').extend(require('joi-extension-semver'))
+const Joi = require('@hapi/joi').extend(require('joi-extension-semver'))
 
 const optionalNonNegativeInteger = Joi.number()
   .integer()
diff --git a/services/visual-studio-marketplace/visual-studio-marketplace-base.js b/services/visual-studio-marketplace/visual-studio-marketplace-base.js
index c414dedb83..d370069bd6 100644
--- a/services/visual-studio-marketplace/visual-studio-marketplace-base.js
+++ b/services/visual-studio-marketplace/visual-studio-marketplace-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService, NotFound } = require('..')
 const validate = require('../../core/base-service/validate')
 
diff --git a/services/website-status.js b/services/website-status.js
index c22cf690bd..1f36662ca4 100644
--- a/services/website-status.js
+++ b/services/website-status.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 
 const queryParamSchema = Joi.object({
   up_message: Joi.string(),
diff --git a/services/wercker/wercker.service.js b/services/wercker/wercker.service.js
index 267887e92c..7a444c15f7 100644
--- a/services/wercker/wercker.service.js
+++ b/services/wercker/wercker.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { isBuildStatus, renderBuildStatusBadge } = require('../build-status')
 const { BaseJsonService } = require('..')
 
diff --git a/services/wheelmap/wheelmap.service.js b/services/wheelmap/wheelmap.service.js
index f6861b3ad9..1c16724a6d 100644
--- a/services/wheelmap/wheelmap.service.js
+++ b/services/wheelmap/wheelmap.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const serverSecrets = require('../../lib/server-secrets')
 const { BaseJsonService } = require('..')
 
diff --git a/services/wordpress/wordpress-base.js b/services/wordpress/wordpress-base.js
index 3a7c67588f..0e919283dc 100644
--- a/services/wordpress/wordpress-base.js
+++ b/services/wordpress/wordpress-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { BaseJsonService, NotFound } = require('..')
 const { nonNegativeInteger } = require('../validators')
 
diff --git a/services/wordpress/wordpress-downloads.service.js b/services/wordpress/wordpress-downloads.service.js
index c77baf1f68..6874ceb55d 100644
--- a/services/wordpress/wordpress-downloads.service.js
+++ b/services/wordpress/wordpress-downloads.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { metric } = require('../text-formatters')
 const { downloadCount } = require('../color-formatters')
 const { BaseJsonService, NotFound } = require('..')
diff --git a/services/wordpress/wordpress-downloads.tester.js b/services/wordpress/wordpress-downloads.tester.js
index 891d5512d7..45d5c62054 100644
--- a/services/wordpress/wordpress-downloads.tester.js
+++ b/services/wordpress/wordpress-downloads.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { ServiceTester } = require('../tester')
 const { isMetric, isMetricOverTimePeriod } = require('../test-validators')
 
diff --git a/services/wordpress/wordpress-platform.tester.js b/services/wordpress/wordpress-platform.tester.js
index a9ca45ea72..f0c9c9e232 100644
--- a/services/wordpress/wordpress-platform.tester.js
+++ b/services/wordpress/wordpress-platform.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('joi')
+const Joi = require('@hapi/joi')
 const { ServiceTester } = require('../tester')
 const { isVPlusDottedVersionAtLeastOne } = require('../test-validators')
 
-- 
GitLab