From 504015c0ba1510eb8205b829d33f6b92cc33bb59 Mon Sep 17 00:00:00 2001
From: chris48s <chris48s@users.noreply.github.com>
Date: Wed, 30 Sep 2020 18:51:02 +0100
Subject: [PATCH] migrate hapi/joi to joi (#5624)

* update joi + joi-extension-semver

* @hapi/joi --> joi

Co-authored-by: repo-ranger[bot] <39074581+repo-ranger[bot]@users.noreply.github.com>
---
 core/base-service/base-graphql.spec.js        |  2 +-
 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                             | 28 +++++++++----------
 package.json                                  |  4 +--
 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-build.service.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-downloads.service.js |  2 +-
 services/bintray/bintray-version.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.service.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 +-
 .../cii-best-practices.service.js             |  2 +-
 services/circleci/circleci.service.js         |  2 +-
 services/cirrus/cirrus.service.js             |  2 +-
 services/cirrus/cirrus.tester.js              |  2 +-
 services/clojars/clojars-base.js              |  2 +-
 services/clojars/clojars-version.service.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 +-
 .../codefactor/codefactor-grade.service.js    |  2 +-
 services/codefactor/codefactor-helpers.js     |  2 +-
 services/codeship/codeship.service.js         |  2 +-
 services/conda/conda-base.js                  |  2 +-
 services/conda/conda-license.service.js       |  2 +-
 services/conda/conda-platform.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/criterion/criterion.service.js       |  2 +-
 services/criterion/criterion.tester.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/docker/docker-size.service.js        |  2 +-
 services/docker/docker-version.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.tester.js       |  2 +-
 services/dynamic/json-path.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/ecologi/ecologi-carbon.service.js    |  2 +-
 services/ecologi/ecologi-trees.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/flathub/flathub.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/gerrit/gerrit.service.js             |  2 +-
 .../github/github-all-contributors.service.js |  2 +-
 services/github/github-api-provider.js        |  2 +-
 .../github/github-commit-activity.service.js  |  2 +-
 .../github/github-commit-activity.tester.js   |  2 +-
 .../github/github-commit-status.service.js    |  2 +-
 .../github/github-commits-since.service.js    |  2 +-
 services/github/github-common-fetch.js        |  2 +-
 services/github/github-common-release.js      |  2 +-
 .../github/github-contributors.service.js     |  2 +-
 services/github/github-deployments.service.js |  2 +-
 services/github/github-deployments.tester.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-forks.service.js       |  2 +-
 services/github/github-go-mod.service.js      |  2 +-
 .../github/github-hacktoberfest.service.js    |  2 +-
 .../github/github-hacktoberfest.tester.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 +-
 services/github/github-labels.service.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-lerna-json.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-milestone-detail.service.js |  2 +-
 services/github/github-milestone.service.js   |  2 +-
 .../github/github-package-json.service.js     |  2 +-
 services/github/github-package-json.tester.js |  2 +-
 services/github/github-pipenv.tester.js       |  2 +-
 ...github-pull-request-check-state.service.js |  2 +-
 .../github/github-release-date.service.js     |  2 +-
 services/github/github-release.tester.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-tag.service.js         |  2 +-
 services/github/github-tag.tester.js          |  2 +-
 services/github/github-top-language.tester.js |  2 +-
 services/github/github-total-star.service.js  |  2 +-
 services/github/github-watchers.service.js    |  2 +-
 services/github/github-watchers.tester.js     |  2 +-
 .../github/github-workflow-status.service.js  |  2 +-
 .../github/github-workflow-status.tester.js   |  2 +-
 services/gitlab/gitlab-coverage.service.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-cask.service.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-rating.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 +-
 .../jsdelivr/jsdelivr-hits-github.tester.js   |  2 +-
 services/jsdelivr/jsdelivr-hits-npm.tester.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 +-
 services/lgtm/lgtm-alerts.tester.js           |  2 +-
 services/lgtm/lgtm-base.js                    |  2 +-
 services/lgtm/lgtm-grade.tester.js            |  2 +-
 services/liberapay/liberapay-base.js          |  2 +-
 services/librariesio/librariesio-common.js    |  2 +-
 .../librariesio-dependencies.service.js       |  2 +-
 services/localizely/localizely.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 +-
 .../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 +-
 services/nycrc/nycrc.service.js               |  2 +-
 .../opencollective/opencollective-base.js     |  2 +-
 services/opm/opm-version.tester.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-php-version.service.js          |  2 +-
 services/packagist/packagist-stars.service.js |  2 +-
 .../packagist/packagist-version.service.js    |  2 +-
 .../packagist/packagist-version.tester.js     |  2 +-
 services/pipenv-helpers.js                    |  2 +-
 services/pkgreview/package-rating.service.js  |  2 +-
 services/poeditor/poeditor.service.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-django-versions.tester.js  |  2 +-
 services/pypi/pypi-downloads.service.js       |  2 +-
 services/pypi/pypi-python-versions.tester.js  |  2 +-
 services/pypi/pypi-version.tester.js          |  2 +-
 services/readthedocs/readthedocs.service.js   |  2 +-
 services/readthedocs/readthedocs.tester.js    |  2 +-
 .../reddit/subreddit-subscribers.service.js   |  2 +-
 services/reddit/user-karma.service.js         |  2 +-
 services/redmine/redmine.service.js           |  2 +-
 services/redmine/redmine.tester.js            |  2 +-
 .../repology/repology-repositories.service.js |  2 +-
 services/requires/requires.service.js         |  2 +-
 services/requires/requires.tester.js          |  2 +-
 services/scoop/scoop-version.service.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 +-
 .../security-headers.service.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-tests.tester.js          |  2 +-
 services/sonar/sonar-violations.tester.js     |  2 +-
 .../sourceforge-open-tickets.service.js       |  2 +-
 services/sourceforge/sourceforge.service.js   |  2 +-
 services/sourcegraph/sourcegraph.service.js   |  2 +-
 services/spack/spack.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/static-badge/static-badge.tester.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/tokei/tokei.service.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/treeware/treeware-trees.service.js   |  2 +-
 services/twitch/twitch-base.js                |  2 +-
 services/twitch/twitch.service.js             |  2 +-
 services/twitch/twitch.tester.js              |  2 +-
 services/twitter/twitter.service.js           |  2 +-
 services/ubuntu/ubuntu.service.js             |  2 +-
 services/ubuntu/ubuntu.tester.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-app-center-builds.service.js |  2 +-
 ...o-app-center-releases-osversion.service.js |  2 +-
 ...studio-app-center-releases-size.service.js |  2 +-
 ...dio-app-center-releases-version.service.js |  2 +-
 .../visual-studio-marketplace-base.js         |  2 +-
 services/w3c/w3c-validation.service.js        |  2 +-
 services/w3c/w3c-validation.tester.js         |  2 +-
 services/website-status.js                    |  2 +-
 services/website/website.service.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-platform.tester.js    |  2 +-
 services/youtube/youtube-base.js              |  2 +-
 services/youtube/youtube-likes.service.js     |  2 +-
 services/youtube/youtube-likes.tester.js      |  2 +-
 359 files changed, 373 insertions(+), 375 deletions(-)

diff --git a/core/base-service/base-graphql.spec.js b/core/base-service/base-graphql.spec.js
index ca06f22d0d..187063c88d 100644
--- a/core/base-service/base-graphql.spec.js
+++ b/core/base-service/base-graphql.spec.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { expect } = require('chai')
 const gql = require('graphql-tag')
 const sinon = require('sinon')
diff --git a/core/base-service/base-json.spec.js b/core/base-service/base-json.spec.js
index 02e0399f18..464b3800e6 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('@hapi/joi')
+const Joi = require('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 349aa2fb01..6378e81faf 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('@hapi/joi')
+const Joi = require('joi')
 const makeBadge = require('../../badge-maker/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 b9e59990f0..42ca1505fb 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('@hapi/joi')
+const Joi = require('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 c19965860a..781c76f130 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('@hapi/joi')
+const Joi = require('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 c72ecd050f..cd7ca9618c 100644
--- a/core/base-service/base.js
+++ b/core/base-service/base.js
@@ -5,7 +5,7 @@
 
 // See available emoji at http://emoji.muan.co/
 const emojic = require('emojic')
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const log = require('../server/log')
 const { AuthHelper } = require('./auth-helper')
 const { MetricHelper, MetricNames } = require('./metric-helper')
diff --git a/core/base-service/base.spec.js b/core/base-service/base.spec.js
index b060b4f990..96e72263e2 100644
--- a/core/base-service/base.spec.js
+++ b/core/base-service/base.spec.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const chai = require('chai')
 const { expect } = chai
 const sinon = require('sinon')
diff --git a/core/base-service/cache-headers.js b/core/base-service/cache-headers.js
index 4b869e716b..999867aa22 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('@hapi/joi')
+const Joi = require('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 cc91a808df..d1bb0028fa 100644
--- a/core/base-service/categories.js
+++ b/core/base-service/categories.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('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 1f6e98fea0..a2c4796a58 100644
--- a/core/base-service/deprecated-service.js
+++ b/core/base-service/deprecated-service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('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 b62fc96760..5219081510 100644
--- a/core/base-service/examples.js
+++ b/core/base-service/examples.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { pathToRegexp, compile } = require('path-to-regexp')
 const categories = require('../../services/categories')
 const coalesceBadge = require('./coalesce-badge')
diff --git a/core/base-service/redirector.js b/core/base-service/redirector.js
index a01d54a2e7..c733495589 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('@hapi/joi')
+const Joi = require('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 73c45e266f..9d60b495af 100644
--- a/core/base-service/route.js
+++ b/core/base-service/route.js
@@ -1,7 +1,7 @@
 'use strict'
 
 const escapeStringRegexp = require('escape-string-regexp')
-const Joi = require('@hapi/joi')
+const Joi = require('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 2c199939f7..612a0d5cc2 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('@hapi/joi')
+const Joi = require('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 1ad387cc76..3f93145827 100644
--- a/core/base-service/service-definitions.js
+++ b/core/base-service/service-definitions.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 
 // This should be kept in sync with the schema in
 // `frontend/lib/service-definitions/index.ts`.
diff --git a/core/base-service/validate.js b/core/base-service/validate.js
index 0bfc4a8773..a2da0e922d 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('@hapi/joi')
+const Joi = require('joi')
 const trace = require('./trace')
 
 function validate(
diff --git a/core/base-service/validate.spec.js b/core/base-service/validate.spec.js
index 1cdde0cec7..c51f771070 100644
--- a/core/base-service/validate.spec.js
+++ b/core/base-service/validate.spec.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('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 afce333b23..60988a40b2 100644
--- a/core/server/server.js
+++ b/core/server/server.js
@@ -8,7 +8,7 @@ const url = require('url')
 const { URL } = url
 const bytes = require('bytes')
 const Camp = require('@shields_io/camp')
-const originalJoi = require('@hapi/joi')
+const originalJoi = require('joi')
 const makeBadge = require('../../badge-maker/lib/make-badge')
 const GithubConstellation = require('../../services/github/github-constellation')
 const suggest = require('../../services/suggest')
diff --git a/core/service-test-runner/icedfrisby-shields.js b/core/service-test-runner/icedfrisby-shields.js
index a1ce0a8d85..f4a99b7b72 100644
--- a/core/service-test-runner/icedfrisby-shields.js
+++ b/core/service-test-runner/icedfrisby-shields.js
@@ -3,7 +3,7 @@
  * @module
  */
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { expect } = require('chai')
 
 /**
diff --git a/doc/TUTORIAL.md b/doc/TUTORIAL.md
index 55bfc39784..00a834ea04 100644
--- a/doc/TUTORIAL.md
+++ b/doc/TUTORIAL.md
@@ -179,7 +179,7 @@ const { renderVersionBadge } = require('..//version')
 const { BaseJsonService } = require('..')
 
 // (4)
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const schema = Joi.object({
   version: Joi.string().required(),
 }).required()
diff --git a/doc/rewriting-services.md b/doc/rewriting-services.md
index 91c2f729f0..ea5cce0119 100644
--- a/doc/rewriting-services.md
+++ b/doc/rewriting-services.md
@@ -145,7 +145,7 @@ Once the route is working, fill out `render()` and `handle()`.
 <details>
 
 ```js
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { errorMessagesFor } = require('./github-helpers')
 
 const issueSchema = Joi.object({
@@ -174,7 +174,7 @@ or create an abstract superclass like **PypiBase**:
 <details>
 
 ```js
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const BaseJsonService = require('../base-json')
 
 const schema = Joi.object({
diff --git a/lib/logos.js b/lib/logos.js
index cdfc0ce6ab..26000732e5 100644
--- a/lib/logos.js
+++ b/lib/logos.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const {
   toSvgColor,
   brightness,
diff --git a/package-lock.json b/package-lock.json
index 40d699af3f..62036686d2 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -6090,6 +6090,8 @@
       "version": "17.1.1",
       "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-17.1.1.tgz",
       "integrity": "sha512-p4DKeZAoeZW4g3u7ZeRo+vCDuSDgSvtsB/NpfjXEHTUjSeINAi/RrVOWiVQ1isaoLzMvFEhe8n5065mQq1AdQg==",
+      "dev": true,
+      "optional": true,
       "requires": {
         "@hapi/address": "^4.0.1",
         "@hapi/formula": "^2.0.0",
@@ -6102,6 +6104,8 @@
           "version": "4.0.1",
           "resolved": "https://registry.npmjs.org/@hapi/address/-/address-4.0.1.tgz",
           "integrity": "sha512-0oEP5UiyV4f3d6cBL8F3Z5S7iWSX39Knnl0lY8i+6gfmmIBj44JCBNtcMgwyS+5v7j3VYavNay0NFHDS+UGQcw==",
+          "dev": true,
+          "optional": true,
           "requires": {
             "@hapi/hoek": "^9.0.0"
           }
@@ -6109,12 +6113,16 @@
         "@hapi/hoek": {
           "version": "9.0.4",
           "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.0.4.tgz",
-          "integrity": "sha512-EwaJS7RjoXUZ2cXXKZZxZqieGtc7RbvQhUy8FwDoMQtxWVi14tFjeFCYPZAM1mBCpOpiBpyaZbb9NeHc7eGKgw=="
+          "integrity": "sha512-EwaJS7RjoXUZ2cXXKZZxZqieGtc7RbvQhUy8FwDoMQtxWVi14tFjeFCYPZAM1mBCpOpiBpyaZbb9NeHc7eGKgw==",
+          "dev": true,
+          "optional": true
         },
         "@hapi/topo": {
           "version": "5.0.0",
           "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.0.0.tgz",
           "integrity": "sha512-tFJlT47db0kMqVm3H4nQYgn6Pwg10GTZHb1pwmSiv1K4ks6drQOtfEF5ZnPjkvC+y4/bUPHK+bc87QvLcL+WMw==",
+          "dev": true,
+          "optional": true,
           "requires": {
             "@hapi/hoek": "^9.0.0"
           }
@@ -7493,11 +7501,6 @@
         "@types/node": "*"
       }
     },
-    "@types/hapi__joi": {
-      "version": "16.0.12",
-      "resolved": "https://registry.npmjs.org/@types/hapi__joi/-/hapi__joi-16.0.12.tgz",
-      "integrity": "sha512-xJYifuz59jXdWY5JMS15uvA3ycS3nQYOGqoIIE0+fwQ0qI3/4CxBc6RHsOTp6wk9M0NWEdpcTl02lOQOKMifbQ=="
-    },
     "@types/hast": {
       "version": "2.3.1",
       "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.1.tgz",
@@ -23047,7 +23050,6 @@
       "version": "17.2.1",
       "resolved": "https://registry.npmjs.org/joi/-/joi-17.2.1.tgz",
       "integrity": "sha512-YT3/4Ln+5YRpacdmfEfrrKh50/kkgX3LgBltjqnlMPIYiZ4hxXZuVJcxmsvxsdeHg9soZfE3qXxHC2tMpCCBOA==",
-      "dev": true,
       "requires": {
         "@hapi/address": "^4.1.0",
         "@hapi/formula": "^2.0.0",
@@ -23060,7 +23062,6 @@
           "version": "4.1.0",
           "resolved": "https://registry.npmjs.org/@hapi/address/-/address-4.1.0.tgz",
           "integrity": "sha512-SkszZf13HVgGmChdHo/PxchnSaCJ6cetVqLzyciudzZRT0jcOouIF/Q93mgjw8cce+D+4F4C1Z/WrfFN+O3VHQ==",
-          "dev": true,
           "requires": {
             "@hapi/hoek": "^9.0.0"
           }
@@ -23068,14 +23069,12 @@
         "@hapi/hoek": {
           "version": "9.1.0",
           "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.1.0.tgz",
-          "integrity": "sha512-i9YbZPN3QgfighY/1X1Pu118VUz2Fmmhd6b2n0/O8YVgGGfw0FbUYoA97k7FkpGJ+pLCFEDLUmAPPV4D1kpeFw==",
-          "dev": true
+          "integrity": "sha512-i9YbZPN3QgfighY/1X1Pu118VUz2Fmmhd6b2n0/O8YVgGGfw0FbUYoA97k7FkpGJ+pLCFEDLUmAPPV4D1kpeFw=="
         },
         "@hapi/topo": {
           "version": "5.0.0",
           "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.0.0.tgz",
           "integrity": "sha512-tFJlT47db0kMqVm3H4nQYgn6Pwg10GTZHb1pwmSiv1K4ks6drQOtfEF5ZnPjkvC+y4/bUPHK+bc87QvLcL+WMw==",
-          "dev": true,
           "requires": {
             "@hapi/hoek": "^9.0.0"
           }
@@ -23083,11 +23082,10 @@
       }
     },
     "joi-extension-semver": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/joi-extension-semver/-/joi-extension-semver-4.1.1.tgz",
-      "integrity": "sha512-mzDM+W0reD4kYrQmCcMCH9/pIM/1bMBOoLkAZ0Xel3xhcgiwKFv2Cn27syS0kNn6mPibIdLXIMHfuQDLteoqVQ==",
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/joi-extension-semver/-/joi-extension-semver-5.0.0.tgz",
+      "integrity": "sha512-g23Majx+TFtxRHAcQn48j+GYts2E0opkUieNxJ6PzLz1dKKZHrKYuEt3p/JY+RgJmyEG961E0dekTuilns8fVA==",
       "requires": {
-        "@types/hapi__joi": "^16.0.12",
         "semver": "^6.1.1"
       },
       "dependencies": {
diff --git a/package.json b/package.json
index 97831cce8d..bdf3856589 100644
--- a/package.json
+++ b/package.json
@@ -22,7 +22,7 @@
     "url": "https://github.com/badges/shields"
   },
   "dependencies": {
-    "@hapi/joi": "^17.1.1",
+    "joi": "17.2.1",
     "@sentry/node": "^5.24.2",
     "@shields_io/camp": "^18.0.0",
     "badge-maker": "file:badge-maker",
@@ -44,7 +44,7 @@
     "graphql": "^14.7.0",
     "graphql-tag": "^2.11.0",
     "ioredis": "4.17.3",
-    "joi-extension-semver": "4.1.1",
+    "joi-extension-semver": "5.0.0",
     "js-yaml": "^3.14.0",
     "jsonpath": "~1.0.2",
     "lodash.countby": "^4.6.0",
diff --git a/services/amo/amo-base.js b/services/amo/amo-base.js
index f8f6a839d1..090221348f 100644
--- a/services/amo/amo-base.js
+++ b/services/amo/amo-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { nonNegativeInteger } = require('../validators')
 const { BaseJsonService } = require('..')
 
diff --git a/services/amo/amo-rating.tester.js b/services/amo/amo-rating.tester.js
index 55d83c436e..f17a90656f 100644
--- a/services/amo/amo-rating.tester.js
+++ b/services/amo/amo-rating.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('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 d76848e4b2..75b27d92ab 100644
--- a/services/ansible/ansible-quality.service.js
+++ b/services/ansible/ansible-quality.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('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 54132ebdbc..c447859782 100644
--- a/services/ansible/ansible-role.service.js
+++ b/services/ansible/ansible-role.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { downloadCount } = require('../color-formatters')
 const { metric } = require('../text-formatters')
 const { nonNegativeInteger } = require('../validators')
diff --git a/services/apm/apm.service.js b/services/apm/apm.service.js
index ee2de5c985..9b52cfe7ed 100644
--- a/services/apm/apm.service.js
+++ b/services/apm/apm.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('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 02382c5cce..015612c43c 100644
--- a/services/appveyor/appveyor-base.js
+++ b/services/appveyor/appveyor-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { nonNegativeInteger } = require('../validators')
 const { isBuildStatus } = require('../build-status')
 const { BaseJsonService } = require('..')
diff --git a/services/appveyor/appveyor-tests.tester.js b/services/appveyor/appveyor-tests.tester.js
index a08bc2937a..df81a2de2e 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('@hapi/joi')
+const Joi = require('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 f219b161d1..f06a5003a8 100644
--- a/services/archlinux/archlinux.service.js
+++ b/services/archlinux/archlinux.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { renderVersionBadge } = require('../version')
 const { BaseJsonService } = require('..')
 
diff --git a/services/aur/aur.service.js b/services/aur/aur.service.js
index bd60b251a8..fa30c8fc37 100644
--- a/services/aur/aur.service.js
+++ b/services/aur/aur.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { floorCount: floorCountColor } = require('../color-formatters')
 const { addv, metric } = require('../text-formatters')
 const { nonNegativeInteger } = require('../validators')
diff --git a/services/azure-devops/azure-devops-base.js b/services/azure-devops/azure-devops-base.js
index 904db4c28b..f22f4c02c0 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('@hapi/joi')
+const Joi = require('joi')
 const { BaseJsonService, NotFound } = require('..')
 
 const latestBuildSchema = Joi.object({
diff --git a/services/azure-devops/azure-devops-build.service.js b/services/azure-devops/azure-devops-build.service.js
index a8632128d3..5159c86408 100644
--- a/services/azure-devops/azure-devops-build.service.js
+++ b/services/azure-devops/azure-devops-build.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { renderBuildStatusBadge } = require('../build-status')
 const { BaseSvgScrapingService, NotFound } = require('..')
 const { keywords, fetch } = require('./azure-devops-helpers')
diff --git a/services/azure-devops/azure-devops-coverage.service.js b/services/azure-devops/azure-devops-coverage.service.js
index 3d50c484ee..f2c28adeae 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('@hapi/joi')
+const Joi = require('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 82cb62d8ab..9b841bb077 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('@hapi/joi')
+const Joi = require('joi')
 const { isBuildStatus } = require('../build-status')
 
 const keywords = ['vso', 'vsts', 'azure-devops']
diff --git a/services/azure-devops/azure-devops-tests.service.js b/services/azure-devops/azure-devops-tests.service.js
index 6402c2a649..5b373a3fe7 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('@hapi/joi')
+const Joi = require('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 495e681a1d..eb3425b89c 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('@hapi/joi')
+const Joi = require('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 1fb657a2ed..9d2167647c 100644
--- a/services/beerpay/beerpay.service.js
+++ b/services/beerpay/beerpay.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { BaseJsonService } = require('..')
 
 const schema = Joi.object({
diff --git a/services/bintray/bintray-downloads.service.js b/services/bintray/bintray-downloads.service.js
index 314656353c..8f3ed7520a 100644
--- a/services/bintray/bintray-downloads.service.js
+++ b/services/bintray/bintray-downloads.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { metric } = require('../text-formatters')
 const { downloadCount } = require('../color-formatters')
 const { BaseJsonService } = require('..')
diff --git a/services/bintray/bintray-version.service.js b/services/bintray/bintray-version.service.js
index a44c6bcd37..3e66c5d4b5 100644
--- a/services/bintray/bintray-version.service.js
+++ b/services/bintray/bintray-version.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { renderVersionBadge } = require('../version')
 const { BaseJsonService } = require('..')
 
diff --git a/services/bit/bit-components.service.js b/services/bit/bit-components.service.js
index aa5a154f5b..3b852d46e6 100644
--- a/services/bit/bit-components.service.js
+++ b/services/bit/bit-components.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { metric } = require('../text-formatters')
 const { nonNegativeInteger } = require('../validators')
 const { downloadCount } = require('../color-formatters')
diff --git a/services/bitbucket/bitbucket-issues.service.js b/services/bitbucket/bitbucket-issues.service.js
index 1e742087b7..f2399d66cf 100644
--- a/services/bitbucket/bitbucket-issues.service.js
+++ b/services/bitbucket/bitbucket-issues.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { metric } = require('../text-formatters')
 const { nonNegativeInteger } = require('../validators')
 const { BaseJsonService } = require('..')
diff --git a/services/bitbucket/bitbucket-pipelines.service.js b/services/bitbucket/bitbucket-pipelines.service.js
index 9e38753fca..347e1d97cb 100644
--- a/services/bitbucket/bitbucket-pipelines.service.js
+++ b/services/bitbucket/bitbucket-pipelines.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { renderBuildStatusBadge } = require('../build-status')
 const { BaseJsonService, redirector } = require('..')
 
diff --git a/services/bitbucket/bitbucket-pull-request.service.js b/services/bitbucket/bitbucket-pull-request.service.js
index 47b9726f2d..3ecc002899 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('@hapi/joi')
+const Joi = require('joi')
 const { AuthHelper } = require('../../core/base-service/auth-helper')
 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 79d81e06ec..c3a27f6838 100644
--- a/services/bitrise/bitrise.service.js
+++ b/services/bitrise/bitrise.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('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 96b793630e..9834fdd8e6 100644
--- a/services/bountysource/bountysource.service.js
+++ b/services/bountysource/bountysource.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { nonNegativeInteger } = require('../validators')
 const { metric } = require('../text-formatters')
 const { BaseJsonService } = require('..')
diff --git a/services/bower/bower-base.js b/services/bower/bower-base.js
index 793102d70a..035844993a 100644
--- a/services/bower/bower-base.js
+++ b/services/bower/bower-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { BaseJsonService } = require('..')
 
 const schema = Joi.object()
diff --git a/services/bower/bower-version.service.js b/services/bower/bower-version.service.js
index d4c8672a4f..2ebb7ed7e9 100644
--- a/services/bower/bower-version.service.js
+++ b/services/bower/bower-version.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { renderVersionBadge } = require('../version')
 const { InvalidResponse, redirector } = require('..')
 const BaseBowerService = require('./bower-base')
diff --git a/services/bower/bower-version.tester.js b/services/bower/bower-version.tester.js
index 2e5ff2736d..2f7129b438 100644
--- a/services/bower/bower-version.tester.js
+++ b/services/bower/bower-version.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { isVPlusDottedVersionAtLeastOne } = require('../test-validators')
 const { ServiceTester } = require('../tester')
 const t = (module.exports = new ServiceTester({
diff --git a/services/bstats/bstats-players.service.js b/services/bstats/bstats-players.service.js
index 462159e4b3..855875c467 100644
--- a/services/bstats/bstats-players.service.js
+++ b/services/bstats/bstats-players.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('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 2ddbb794fe..156458798b 100644
--- a/services/bstats/bstats-servers.service.js
+++ b/services/bstats/bstats-servers.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { metric } = require('../text-formatters')
 const { BaseJsonService } = require('..')
 
diff --git a/services/bugzilla/bugzilla.service.js b/services/bugzilla/bugzilla.service.js
index dc8f3da11a..e0acfd608f 100644
--- a/services/bugzilla/bugzilla.service.js
+++ b/services/bugzilla/bugzilla.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { optionalUrl } = require('../validators')
 const { BaseJsonService } = require('..')
 
diff --git a/services/bugzilla/bugzilla.tester.js b/services/bugzilla/bugzilla.tester.js
index bcd666028e..3bdffa120a 100644
--- a/services/bugzilla/bugzilla.tester.js
+++ b/services/bugzilla/bugzilla.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('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 45a95c197f..4a088eee45 100644
--- a/services/build-status.js
+++ b/services/build-status.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 
 const greenStatuses = [
   'fixed',
diff --git a/services/buildkite/buildkite.service.js b/services/buildkite/buildkite.service.js
index d428b13a3f..16b298b0cf 100644
--- a/services/buildkite/buildkite.service.js
+++ b/services/buildkite/buildkite.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { isBuildStatus, renderBuildStatusBadge } = require('../build-status')
 const { BaseJsonService } = require('..')
 
diff --git a/services/buildkite/buildkite.tester.js b/services/buildkite/buildkite.tester.js
index fe15e3d088..bca5c506e7 100644
--- a/services/buildkite/buildkite.tester.js
+++ b/services/buildkite/buildkite.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('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 e95061a7ac..fbc4eb5e68 100644
--- a/services/bundlephobia/bundlephobia.service.js
+++ b/services/bundlephobia/bundlephobia.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const prettyBytes = require('pretty-bytes')
 const { nonNegativeInteger } = require('../validators')
 const { BaseJsonService } = require('..')
diff --git a/services/cdnjs/cdnjs.service.js b/services/cdnjs/cdnjs.service.js
index 8d0813ac7b..4e3503de27 100644
--- a/services/cdnjs/cdnjs.service.js
+++ b/services/cdnjs/cdnjs.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('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 4f0201aa71..cc2ffaa587 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('@hapi/joi')
+const Joi = require('joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 t.create('Price')
diff --git a/services/cii-best-practices/cii-best-practices.service.js b/services/cii-best-practices/cii-best-practices.service.js
index dfe52ff239..af45b4090c 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('@hapi/joi')
+const Joi = require('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 6e2bca6a60..84efe01135 100644
--- a/services/circleci/circleci.service.js
+++ b/services/circleci/circleci.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { isBuildStatus, renderBuildStatusBadge } = require('../build-status')
 const { BaseSvgScrapingService, redirector } = require('..')
 
diff --git a/services/cirrus/cirrus.service.js b/services/cirrus/cirrus.service.js
index 32d8da0e2d..7e4b9d07bb 100644
--- a/services/cirrus/cirrus.service.js
+++ b/services/cirrus/cirrus.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { isBuildStatus, renderBuildStatusBadge } = require('../build-status')
 const { BaseJsonService } = require('..')
 
diff --git a/services/cirrus/cirrus.tester.js b/services/cirrus/cirrus.tester.js
index b3f1cd8c90..a23d9cc8ce 100644
--- a/services/cirrus/cirrus.tester.js
+++ b/services/cirrus/cirrus.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { isBuildStatus } = require('../build-status')
 const t = (module.exports = require('../tester').createServiceTester())
 
diff --git a/services/clojars/clojars-base.js b/services/clojars/clojars-base.js
index 75d79b830b..9a89c9e6dd 100644
--- a/services/clojars/clojars-base.js
+++ b/services/clojars/clojars-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { nonNegativeInteger } = require('../validators')
 const { BaseJsonService } = require('..')
 
diff --git a/services/clojars/clojars-version.service.js b/services/clojars/clojars-version.service.js
index 3d19d0cb19..048161a8ff 100644
--- a/services/clojars/clojars-version.service.js
+++ b/services/clojars/clojars-version.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { version: versionColor } = require('../color-formatters')
 const { redirector } = require('..')
 const { BaseClojarsService } = require('./clojars-base')
diff --git a/services/cocoapods/cocoapods-base.js b/services/cocoapods/cocoapods-base.js
index a47f9c0693..e0ae168661 100644
--- a/services/cocoapods/cocoapods-base.js
+++ b/services/cocoapods/cocoapods-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('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 ba683be6ab..3f942a24ff 100644
--- a/services/cocoapods/cocoapods-docs.service.js
+++ b/services/cocoapods/cocoapods-docs.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const {
   coveragePercentage: coveragePercentageColor,
 } = require('../color-formatters')
diff --git a/services/cocoapods/cocoapods-platform.tester.js b/services/cocoapods/cocoapods-platform.tester.js
index 87a407e3d8..c05aa58bb5 100644
--- a/services/cocoapods/cocoapods-platform.tester.js
+++ b/services/cocoapods/cocoapods-platform.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('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 458e2c4cac..3c0b4b082e 100644
--- a/services/codacy/codacy-coverage.service.js
+++ b/services/codacy/codacy-coverage.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const {
   coveragePercentage: coveragePercentageColor,
 } = require('../color-formatters')
diff --git a/services/codacy/codacy-grade.service.js b/services/codacy/codacy-grade.service.js
index 193a67a5ce..7f417bd26e 100644
--- a/services/codacy/codacy-grade.service.js
+++ b/services/codacy/codacy-grade.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { BaseSvgScrapingService } = require('..')
 const { codacyGrade } = require('./codacy-helpers')
 
diff --git a/services/codacy/codacy-helpers.js b/services/codacy/codacy-helpers.js
index 308456981b..9c222194c3 100644
--- a/services/codacy/codacy-helpers.js
+++ b/services/codacy/codacy-helpers.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('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 3080fcc053..2de65a67a1 100644
--- a/services/codeclimate/codeclimate-analysis.service.js
+++ b/services/codeclimate/codeclimate-analysis.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { colorScale, letterScore } = require('../color-formatters')
 const { nonNegativeInteger } = require('../validators')
 const { BaseJsonService, NotFound } = require('..')
diff --git a/services/codeclimate/codeclimate-analysis.tester.js b/services/codeclimate/codeclimate-analysis.tester.js
index 6d2d00a9af..33ee8fd131 100644
--- a/services/codeclimate/codeclimate-analysis.tester.js
+++ b/services/codeclimate/codeclimate-analysis.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('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 fc5b09fca7..94c441a5ca 100644
--- a/services/codeclimate/codeclimate-common.js
+++ b/services/codeclimate/codeclimate-common.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { NotFound } = require('..')
 
 const keywords = ['codeclimate']
diff --git a/services/codeclimate/codeclimate-coverage.service.js b/services/codeclimate/codeclimate-coverage.service.js
index 174f124290..a58bce7b6d 100644
--- a/services/codeclimate/codeclimate-coverage.service.js
+++ b/services/codeclimate/codeclimate-coverage.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { coveragePercentage, letterScore } = require('../color-formatters')
 const { BaseJsonService, NotFound } = require('..')
 const { keywords, isLetterGrade, fetchRepo } = require('./codeclimate-common')
diff --git a/services/codeclimate/codeclimate-coverage.tester.js b/services/codeclimate/codeclimate-coverage.tester.js
index 16882263c0..de7c9acdc9 100644
--- a/services/codeclimate/codeclimate-coverage.tester.js
+++ b/services/codeclimate/codeclimate-coverage.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('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 6091d25d14..4a8f8ec890 100644
--- a/services/codecov/codecov.service.js
+++ b/services/codecov/codecov.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { coveragePercentage } = require('../color-formatters')
 const { BaseSvgScrapingService } = require('..')
 const { parseJson } = require('../../core/base-service/json')
diff --git a/services/codefactor/codefactor-grade.service.js b/services/codefactor/codefactor-grade.service.js
index d4d20a6c78..613efb1306 100644
--- a/services/codefactor/codefactor-grade.service.js
+++ b/services/codefactor/codefactor-grade.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { BaseSvgScrapingService } = require('..')
 const { isValidGrade, gradeColor } = require('./codefactor-helpers')
 
diff --git a/services/codefactor/codefactor-helpers.js b/services/codefactor/codefactor-helpers.js
index 6b2749eb76..1672c89c96 100644
--- a/services/codefactor/codefactor-helpers.js
+++ b/services/codefactor/codefactor-helpers.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 
 // https://support.codefactor.io/i14-glossary
 // https://github.com/badges/shields/issues/4269
diff --git a/services/codeship/codeship.service.js b/services/codeship/codeship.service.js
index 3dd4d2442a..1cac77ef25 100644
--- a/services/codeship/codeship.service.js
+++ b/services/codeship/codeship.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { isBuildStatus, renderBuildStatusBadge } = require('../build-status')
 const { BaseSvgScrapingService } = require('..')
 
diff --git a/services/conda/conda-base.js b/services/conda/conda-base.js
index 0967e1134f..939cee58de 100644
--- a/services/conda/conda-base.js
+++ b/services/conda/conda-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { nonNegativeInteger } = require('../validators')
 const { BaseJsonService } = require('..')
 
diff --git a/services/conda/conda-license.service.js b/services/conda/conda-license.service.js
index 41691f508b..d2ecf97870 100644
--- a/services/conda/conda-license.service.js
+++ b/services/conda/conda-license.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { renderLicenseBadge } = require('../licenses')
 const toArray = require('../../core/base-service/to-array')
 const BaseCondaService = require('./conda-base')
diff --git a/services/conda/conda-platform.tester.js b/services/conda/conda-platform.tester.js
index be82e86ba1..aa06463aaf 100644
--- a/services/conda/conda-platform.tester.js
+++ b/services/conda/conda-platform.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const isCondaPlatform = Joi.string().regex(/^\w+-[\w\d]+( \| \w+-[\w\d]+)*$/)
 const t = (module.exports = require('../tester').createServiceTester())
 
diff --git a/services/continuousphp/continuousphp.service.js b/services/continuousphp/continuousphp.service.js
index 212a4ae274..f080af0a64 100644
--- a/services/continuousphp/continuousphp.service.js
+++ b/services/continuousphp/continuousphp.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('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 7f597be6b5..6fa7f59fc5 100644
--- a/services/continuousphp/continuousphp.tester.js
+++ b/services/continuousphp/continuousphp.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('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 922b0fbd31..0e45f12abc 100644
--- a/services/cookbook/cookbook.service.js
+++ b/services/cookbook/cookbook.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { renderVersionBadge } = require('../version')
 const { BaseJsonService } = require('..')
 
diff --git a/services/coveralls/coveralls.service.js b/services/coveralls/coveralls.service.js
index cf5d542401..ee2683652a 100644
--- a/services/coveralls/coveralls.service.js
+++ b/services/coveralls/coveralls.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { coveragePercentage } = require('../color-formatters')
 const { BaseJsonService } = require('..')
 
diff --git a/services/coverity/coverity-scan.service.js b/services/coverity/coverity-scan.service.js
index 0104704af6..1643786e91 100644
--- a/services/coverity/coverity-scan.service.js
+++ b/services/coverity/coverity-scan.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('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 93247dc1d3..e8a997cacd 100644
--- a/services/coverity/coverity-scan.tester.js
+++ b/services/coverity/coverity-scan.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 t.create('known project id')
diff --git a/services/cpan/cpan.js b/services/cpan/cpan.js
index 39eef52cc0..56af778661 100644
--- a/services/cpan/cpan.js
+++ b/services/cpan/cpan.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { BaseJsonService } = require('..')
 
 const schema = Joi.object({
diff --git a/services/cran/cran.service.js b/services/cran/cran.service.js
index 927f299208..eb2ba3ce96 100644
--- a/services/cran/cran.service.js
+++ b/services/cran/cran.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { renderVersionBadge } = require('../version')
 const { BaseJsonService } = require('..')
 
diff --git a/services/crates/crates-base.js b/services/crates/crates-base.js
index 8efab2b81f..855072761c 100644
--- a/services/crates/crates-base.js
+++ b/services/crates/crates-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { nonNegativeInteger } = require('../validators')
 const { BaseJsonService } = require('..')
 
diff --git a/services/criterion/criterion.service.js b/services/criterion/criterion.service.js
index 457514bfd6..0fd70f95db 100644
--- a/services/criterion/criterion.service.js
+++ b/services/criterion/criterion.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { BaseJsonService } = require('..')
 const {
   IMPROVED_STATUS,
diff --git a/services/criterion/criterion.tester.js b/services/criterion/criterion.tester.js
index 0fe0bda2dc..f297d44d24 100644
--- a/services/criterion/criterion.tester.js
+++ b/services/criterion/criterion.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const t = (module.exports = require('../tester').createServiceTester())
 const {
   IMPROVED_STATUS,
diff --git a/services/ctan/ctan.service.js b/services/ctan/ctan.service.js
index 401a754f17..4e8d95c3ee 100644
--- a/services/ctan/ctan.service.js
+++ b/services/ctan/ctan.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('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 d78f95d858..e5b28f2b74 100644
--- a/services/david/david.service.js
+++ b/services/david/david.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { BaseJsonService } = require('..')
 
 const schema = Joi.object({
diff --git a/services/david/david.tester.js b/services/david/david.tester.js
index 72f50c5057..21400f45a8 100644
--- a/services/david/david.tester.js
+++ b/services/david/david.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('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 5b119ff017..c113ca13e0 100644
--- a/services/debian/debian.service.js
+++ b/services/debian/debian.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { latest, renderVersionBadge } = require('../version')
 const { BaseJsonService, NotFound, InvalidResponse } = require('..')
 
diff --git a/services/debug/debug.tester.js b/services/debug/debug.tester.js
index 745862ad3f..2885b9479d 100644
--- a/services/debug/debug.tester.js
+++ b/services/debug/debug.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('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 a0a422d267..25b7eb5e25 100644
--- a/services/dependabot/dependabot.service.js
+++ b/services/dependabot/dependabot.service.js
@@ -1,7 +1,7 @@
 'use strict'
 
 const url = require('url')
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { BaseJsonService } = require('..')
 
 const schema = Joi.object({
diff --git a/services/depfu/depfu.service.js b/services/depfu/depfu.service.js
index 832f3cb033..8be46d36a4 100644
--- a/services/depfu/depfu.service.js
+++ b/services/depfu/depfu.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { BaseJsonService } = require('..')
 
 const depfuSchema = Joi.object({
diff --git a/services/depfu/depfu.tester.js b/services/depfu/depfu.tester.js
index d8fea928d4..957704f3c4 100644
--- a/services/depfu/depfu.tester.js
+++ b/services/depfu/depfu.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('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 b3edfa88bd..ca58be83d9 100644
--- a/services/discord/discord.service.js
+++ b/services/discord/discord.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { nonNegativeInteger } = require('../validators')
 const { BaseJsonService } = require('..')
 
diff --git a/services/discord/discord.tester.js b/services/discord/discord.tester.js
index 1d4c660d58..694775133a 100644
--- a/services/discord/discord.tester.js
+++ b/services/discord/discord.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('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 1e899d2c24..7037fca298 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('@hapi/joi')
+const Joi = require('joi')
 const { metric } = require('../text-formatters')
 const { nonNegativeInteger, optionalUrl } = require('../validators')
 const { BaseJsonService } = require('..')
diff --git a/services/discourse/discourse.tester.js b/services/discourse/discourse.tester.js
index b357ddb286..a074fe85e8 100644
--- a/services/discourse/discourse.tester.js
+++ b/services/discourse/discourse.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('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 48a9057c8c..c48a57d63a 100644
--- a/services/docker/docker-automated.service.js
+++ b/services/docker/docker-automated.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { BaseJsonService } = require('..')
 const {
   dockerBlue,
diff --git a/services/docker/docker-automated.tester.js b/services/docker/docker-automated.tester.js
index f98d214428..4cc144d7ce 100644
--- a/services/docker/docker-automated.tester.js
+++ b/services/docker/docker-automated.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('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 2c228072f3..39d73d0143 100644
--- a/services/docker/docker-build.service.js
+++ b/services/docker/docker-build.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { anyInteger } = require('../validators')
 const { BaseJsonService } = require('..')
 const {
diff --git a/services/docker/docker-cloud-automated.tester.js b/services/docker/docker-cloud-automated.tester.js
index e3827f21b5..22d508dcc3 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('@hapi/joi')
+const Joi = require('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 2f10c52eeb..8ac3db1fa4 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('@hapi/joi')
+const Joi = require('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 e05c5064db..5749215cac 100644
--- a/services/docker/docker-pulls.service.js
+++ b/services/docker/docker-pulls.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { metric } = require('../text-formatters')
 const { nonNegativeInteger } = require('../validators')
 const { BaseJsonService } = require('..')
diff --git a/services/docker/docker-size.service.js b/services/docker/docker-size.service.js
index d99c62dc01..14ed46232f 100644
--- a/services/docker/docker-size.service.js
+++ b/services/docker/docker-size.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const prettyBytes = require('pretty-bytes')
 const { nonNegativeInteger } = require('../validators')
 const { latest } = require('../version')
diff --git a/services/docker/docker-version.service.js b/services/docker/docker-version.service.js
index 6443a6e426..0df6ba47ec 100644
--- a/services/docker/docker-version.service.js
+++ b/services/docker/docker-version.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { nonNegativeInteger } = require('../validators')
 const { latest, renderVersionBadge } = require('../version')
 const { BaseJsonService, NotFound, InvalidResponse } = require('..')
diff --git a/services/drone/drone-build.service.js b/services/drone/drone-build.service.js
index 4d52f6549a..13aaa0721d 100644
--- a/services/drone/drone-build.service.js
+++ b/services/drone/drone-build.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { isBuildStatus, renderBuildStatusBadge } = require('../build-status')
 const { optionalUrl } = require('../validators')
 const { BaseJsonService } = require('..')
diff --git a/services/drone/drone-build.tester.js b/services/drone/drone-build.tester.js
index d00f477c28..59882a0089 100644
--- a/services/drone/drone-build.tester.js
+++ b/services/drone/drone-build.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { isBuildStatus } = require('../build-status')
 const t = (module.exports = require('../tester').createServiceTester())
 
diff --git a/services/dub/dub-download.service.js b/services/dub/dub-download.service.js
index 218d6116bd..3c050bc5d9 100644
--- a/services/dub/dub-download.service.js
+++ b/services/dub/dub-download.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { metric } = require('../text-formatters')
 const { downloadCount: downloadCountColor } = require('../color-formatters')
 const { nonNegativeInteger } = require('../validators')
diff --git a/services/dub/dub-download.tester.js b/services/dub/dub-download.tester.js
index c2ce2779f2..423c091513 100644
--- a/services/dub/dub-download.tester.js
+++ b/services/dub/dub-download.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('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 6574f8f239..62f99a0cf2 100644
--- a/services/dub/dub-license.service.js
+++ b/services/dub/dub-license.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('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 83931f4ea5..8aeced3af4 100644
--- a/services/dub/dub-version.service.js
+++ b/services/dub/dub-version.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { renderVersionBadge } = require('../version')
 const { BaseJsonService } = require('..')
 
diff --git a/services/dub/dub-version.tester.js b/services/dub/dub-version.tester.js
index 26824bdee4..972c7256e3 100644
--- a/services/dub/dub-version.tester.js
+++ b/services/dub/dub-version.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const {
   isVPlusDottedVersionNClausesWithOptionalSuffix,
 } = require('../test-validators')
diff --git a/services/dynamic-common.js b/services/dynamic-common.js
index d291e611c9..292c84964e 100644
--- a/services/dynamic-common.js
+++ b/services/dynamic-common.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('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 ceddf69f74..6921857674 100644
--- a/services/dynamic/dynamic-helpers.js
+++ b/services/dynamic/dynamic-helpers.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { optionalUrl } = require('../validators')
 
 const queryParamSchema = Joi.object({
diff --git a/services/dynamic/dynamic-json.tester.js b/services/dynamic/dynamic-json.tester.js
index 42eed630f0..d36dda48a3 100644
--- a/services/dynamic/dynamic-json.tester.js
+++ b/services/dynamic/dynamic-json.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { expect } = require('chai')
 const t = (module.exports = require('../tester').createServiceTester())
 
diff --git a/services/dynamic/json-path.js b/services/dynamic/json-path.js
index 2ef0af988a..9797e81673 100644
--- a/services/dynamic/json-path.js
+++ b/services/dynamic/json-path.js
@@ -4,7 +4,7 @@
 
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const jp = require('jsonpath')
 const { renderDynamicBadge, errorMessages } = require('../dynamic-common')
 const { InvalidParameter, InvalidResponse } = require('..')
diff --git a/services/eclipse-marketplace/eclipse-marketplace-downloads.service.js b/services/eclipse-marketplace/eclipse-marketplace-downloads.service.js
index 44dab4edce..8ac996c5ba 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('@hapi/joi')
+const Joi = require('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 50643104ac..fe83995d8b 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('@hapi/joi')
+const Joi = require('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 79cf1e71cd..4322263077 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('@hapi/joi')
+const Joi = require('joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 t.create('favorites count').get('/notepad4e.json').expectBadge({
diff --git a/services/eclipse-marketplace/eclipse-marketplace-license.service.js b/services/eclipse-marketplace/eclipse-marketplace-license.service.js
index 0dd25fa0d6..adf94139b3 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('@hapi/joi')
+const Joi = require('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 ca32c4ae73..68361338e7 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('@hapi/joi')
+const Joi = require('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 12081dfe6f..9b44d62844 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('@hapi/joi')
+const Joi = require('joi')
 const { renderVersionBadge } = require('../version')
 const EclipseMarketplaceBase = require('./eclipse-marketplace-base')
 
diff --git a/services/ecologi/ecologi-carbon.service.js b/services/ecologi/ecologi-carbon.service.js
index d35e52f1ef..b2eb4040e0 100644
--- a/services/ecologi/ecologi-carbon.service.js
+++ b/services/ecologi/ecologi-carbon.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { metric } = require('../text-formatters')
 const { floorCount } = require('../color-formatters')
 const { BaseJsonService } = require('..')
diff --git a/services/ecologi/ecologi-trees.service.js b/services/ecologi/ecologi-trees.service.js
index e707d5d9bf..d2e0a98f48 100644
--- a/services/ecologi/ecologi-trees.service.js
+++ b/services/ecologi/ecologi-trees.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { metric } = require('../text-formatters')
 const { floorCount } = require('../color-formatters')
 const { nonNegativeInteger } = require('../validators')
diff --git a/services/elm-package/elm-package.service.js b/services/elm-package/elm-package.service.js
index 3dad7d3853..f2f7e45736 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('@hapi/joi')
+const Joi = require('joi')
 const { renderVersionBadge } = require('../version')
 const { semver } = require('../validators')
 const { BaseJsonService } = require('..')
diff --git a/services/endpoint-common.js b/services/endpoint-common.js
index 9c7bffb3c6..6fda5e3e1a 100644
--- a/services/endpoint-common.js
+++ b/services/endpoint-common.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('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 a6eaf0dbfd..0ebab00c26 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('@hapi/joi')
+const Joi = require('joi')
 const { errorMessages } = require('../dynamic-common')
 const { optionalUrl } = require('../validators')
 const { fetchEndpointData } = require('../endpoint-common')
diff --git a/services/f-droid/f-droid.service.js b/services/f-droid/f-droid.service.js
index 1e6bdcffa8..485edfc2e0 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('@hapi/joi')
+const Joi = require('joi')
 const {
   optionalNonNegativeInteger,
   nonNegativeInteger,
diff --git a/services/fedora/fedora.service.js b/services/fedora/fedora.service.js
index fae32be1c5..80e3953541 100644
--- a/services/fedora/fedora.service.js
+++ b/services/fedora/fedora.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { renderVersionBadge } = require('../version')
 const { BaseJsonService } = require('..')
 
diff --git a/services/flathub/flathub.service.js b/services/flathub/flathub.service.js
index 4b64f4096e..93f97df313 100644
--- a/services/flathub/flathub.service.js
+++ b/services/flathub/flathub.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { InvalidResponse, NotFound } = require('..')
 const { renderVersionBadge } = require('../version')
 const { BaseJsonService } = require('..')
diff --git a/services/gem/gem-downloads.service.js b/services/gem/gem-downloads.service.js
index 4fb1e03968..fd3f106386 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('@hapi/joi')
+const Joi = require('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 2fceac6f1c..1be79b5245 100644
--- a/services/gem/gem-owner.service.js
+++ b/services/gem/gem-owner.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { floorCount: floorCountColor } = require('../color-formatters')
 const { BaseJsonService } = require('..')
 
diff --git a/services/gem/gem-owner.tester.js b/services/gem/gem-owner.tester.js
index 4513dce246..80d1d9286c 100644
--- a/services/gem/gem-owner.tester.js
+++ b/services/gem/gem-owner.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('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 464cb4d7e3..1a78371e92 100644
--- a/services/gem/gem-rank.service.js
+++ b/services/gem/gem-rank.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('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 e0e80ae86b..4cc5d89fcd 100644
--- a/services/gem/gem-rank.tester.js
+++ b/services/gem/gem-rank.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('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 8663288fba..ba8c7bc62a 100644
--- a/services/gem/gem-version.service.js
+++ b/services/gem/gem-version.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { renderVersionBadge } = require('../version')
 const { BaseJsonService } = require('..')
 
diff --git a/services/gerrit/gerrit.service.js b/services/gerrit/gerrit.service.js
index 3810270610..4a3c4df77e 100644
--- a/services/gerrit/gerrit.service.js
+++ b/services/gerrit/gerrit.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { optionalUrl } = require('../validators')
 const { BaseJsonService } = require('..')
 
diff --git a/services/github/github-all-contributors.service.js b/services/github/github-all-contributors.service.js
index 4176bf71c1..af2dd85b44 100644
--- a/services/github/github-all-contributors.service.js
+++ b/services/github/github-all-contributors.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { renderContributorBadge } = require('../contributor-count')
 const { ConditionalGithubAuthV3Service } = require('./github-auth-service')
 const { fetchJsonFromRepo } = require('./github-common-fetch')
diff --git a/services/github/github-api-provider.js b/services/github/github-api-provider.js
index 632965bdda..ba3075a8f4 100644
--- a/services/github/github-api-provider.js
+++ b/services/github/github-api-provider.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const log = require('../../core/server/log')
 const { TokenPool } = require('../../core/token-pooling/token-pool')
 const { userAgent } = require('../../core/base-service/legacy-request-handler')
diff --git a/services/github/github-commit-activity.service.js b/services/github/github-commit-activity.service.js
index 8dd7011b84..d9190659c2 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('@hapi/joi')
+const Joi = require('joi')
 const { metric } = require('../text-formatters')
 const { nonNegativeInteger } = require('../validators')
 const { GithubAuthV3Service } = require('./github-auth-service')
diff --git a/services/github/github-commit-activity.tester.js b/services/github/github-commit-activity.tester.js
index 66d6d7cc60..3a401e9bc9 100644
--- a/services/github/github-commit-activity.tester.js
+++ b/services/github/github-commit-activity.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const {
   isMetricOverTimePeriod,
   isZeroOverTimePeriod,
diff --git a/services/github/github-commit-status.service.js b/services/github/github-commit-status.service.js
index 9ccfba7baa..613d1f90d8 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('@hapi/joi')
+const Joi = require('joi')
 const { NotFound, InvalidParameter } = require('..')
 const { GithubAuthV3Service } = 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 4ad8fd8540..bda397e809 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('@hapi/joi')
+const Joi = require('joi')
 const { metric } = require('../text-formatters')
 const { nonNegativeInteger } = require('../validators')
 const { GithubAuthV3Service } = require('./github-auth-service')
diff --git a/services/github/github-common-fetch.js b/services/github/github-common-fetch.js
index 7c216b274b..0ddd022a5e 100644
--- a/services/github/github-common-fetch.js
+++ b/services/github/github-common-fetch.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { InvalidResponse } = require('..')
 const { errorMessagesFor } = require('./github-helpers')
 
diff --git a/services/github/github-common-release.js b/services/github/github-common-release.js
index ca958deb52..e599876014 100644
--- a/services/github/github-common-release.js
+++ b/services/github/github-common-release.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { latest } = require('../version')
 const { NotFound } = require('..')
 const { errorMessagesFor } = require('./github-helpers')
diff --git a/services/github/github-contributors.service.js b/services/github/github-contributors.service.js
index 0c7b66d85c..0103295624 100644
--- a/services/github/github-contributors.service.js
+++ b/services/github/github-contributors.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const parseLinkHeader = require('parse-link-header')
 const { renderContributorBadge } = require('../contributor-count')
 const { GithubAuthV3Service } = require('./github-auth-service')
diff --git a/services/github/github-deployments.service.js b/services/github/github-deployments.service.js
index c14ea83361..098f2d9d14 100644
--- a/services/github/github-deployments.service.js
+++ b/services/github/github-deployments.service.js
@@ -1,7 +1,7 @@
 'use strict'
 
 const gql = require('graphql-tag')
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { NotFound } = require('..')
 const { GithubAuthV4Service } = require('./github-auth-service')
 const { documentation, transformErrors } = require('./github-helpers')
diff --git a/services/github/github-deployments.tester.js b/services/github/github-deployments.tester.js
index 309f3acde7..799141ecb2 100644
--- a/services/github/github-deployments.tester.js
+++ b/services/github/github-deployments.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 const validMessages = [
diff --git a/services/github/github-downloads.service.js b/services/github/github-downloads.service.js
index 94126f7e89..e2761c0aa6 100644
--- a/services/github/github-downloads.service.js
+++ b/services/github/github-downloads.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { metric } = require('../text-formatters')
 const { nonNegativeInteger } = require('../validators')
 const { downloadCount: downloadCountColor } = require('../color-formatters')
diff --git a/services/github/github-downloads.tester.js b/services/github/github-downloads.tester.js
index f527d40617..30babf3336 100644
--- a/services/github/github-downloads.tester.js
+++ b/services/github/github-downloads.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('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 6ac160d9d0..5489552dc3 100644
--- a/services/github/github-followers.service.js
+++ b/services/github/github-followers.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { metric } = require('../text-formatters')
 const { nonNegativeInteger } = require('../validators')
 const { GithubAuthV3Service } = require('./github-auth-service')
diff --git a/services/github/github-forks.service.js b/services/github/github-forks.service.js
index 23e8ec33a0..9f59b9766d 100644
--- a/services/github/github-forks.service.js
+++ b/services/github/github-forks.service.js
@@ -1,7 +1,7 @@
 'use strict'
 
 const gql = require('graphql-tag')
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { metric } = require('../text-formatters')
 const { nonNegativeInteger } = require('../validators')
 const { GithubAuthV4Service } = require('./github-auth-service')
diff --git a/services/github/github-go-mod.service.js b/services/github/github-go-mod.service.js
index b5c82a37b2..2351ec1e23 100644
--- a/services/github/github-go-mod.service.js
+++ b/services/github/github-go-mod.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { renderVersionBadge } = require('../version')
 const { InvalidResponse } = require('..')
 const { ConditionalGithubAuthV3Service } = require('./github-auth-service')
diff --git a/services/github/github-hacktoberfest.service.js b/services/github/github-hacktoberfest.service.js
index b0067e1d1a..7c6ad7eb84 100644
--- a/services/github/github-hacktoberfest.service.js
+++ b/services/github/github-hacktoberfest.service.js
@@ -1,7 +1,7 @@
 'use strict'
 
 const gql = require('graphql-tag')
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const moment = require('moment')
 const { metric, maybePluralize } = require('../text-formatters')
 const { nonNegativeInteger } = require('../validators')
diff --git a/services/github/github-hacktoberfest.tester.js b/services/github/github-hacktoberfest.tester.js
index 69138d33ed..b11b1526d0 100644
--- a/services/github/github-hacktoberfest.tester.js
+++ b/services/github/github-hacktoberfest.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 const isHacktoberfestNoIssuesStatus = Joi.string().regex(
diff --git a/services/github/github-issue-detail.service.js b/services/github/github-issue-detail.service.js
index 4c5a6c05fb..8fca29bee6 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('@hapi/joi')
+const Joi = require('joi')
 const { nonNegativeInteger } = require('../validators')
 const { formatDate, metric } = require('../text-formatters')
 const { age } = require('../color-formatters')
diff --git a/services/github/github-issue-detail.tester.js b/services/github/github-issue-detail.tester.js
index 8b5775d928..0a9de66414 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('@hapi/joi')
+const Joi = require('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 5c949f4135..bc906b4bc6 100644
--- a/services/github/github-issues.service.js
+++ b/services/github/github-issues.service.js
@@ -1,7 +1,7 @@
 'use strict'
 
 const gql = require('graphql-tag')
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { metric } = require('../text-formatters')
 const { nonNegativeInteger } = require('../validators')
 const { GithubAuthV4Service } = require('./github-auth-service')
diff --git a/services/github/github-issues.tester.js b/services/github/github-issues.tester.js
index c8e380734f..29773c0c21 100644
--- a/services/github/github-issues.tester.js
+++ b/services/github/github-issues.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { isMetric, isMetricOpenIssues } = require('../test-validators')
 const t = (module.exports = require('../tester').createServiceTester())
 
diff --git a/services/github/github-labels.service.js b/services/github/github-labels.service.js
index 91f75bb192..1bed157eaa 100644
--- a/services/github/github-labels.service.js
+++ b/services/github/github-labels.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { GithubAuthV3Service } = require('./github-auth-service')
 const { documentation, errorMessagesFor } = require('./github-helpers')
 
diff --git a/services/github/github-language-count.tester.js b/services/github/github-language-count.tester.js
index 1f9c7c2a7d..f7277d884b 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('@hapi/joi')
+const Joi = require('joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 t.create('language count').get('/badges/shields.json').expectBadge({
diff --git a/services/github/github-languages-base.js b/services/github/github-languages-base.js
index 61c9b4470c..aa6dc250a6 100644
--- a/services/github/github-languages-base.js
+++ b/services/github/github-languages-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { nonNegativeInteger } = require('../validators')
 const { GithubAuthV3Service } = 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 1dead7e892..76f92fe72a 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('@hapi/joi')
+const Joi = require('joi')
 const { formatDate } = require('../text-formatters')
 const { age: ageColor } = require('../color-formatters')
 const { GithubAuthV3Service } = require('./github-auth-service')
diff --git a/services/github/github-lerna-json.service.js b/services/github/github-lerna-json.service.js
index 54237f6b58..9fabd62df0 100644
--- a/services/github/github-lerna-json.service.js
+++ b/services/github/github-lerna-json.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { renderVersionBadge } = require('../version')
 const { semver } = require('../validators')
 const { ConditionalGithubAuthV3Service } = require('./github-auth-service')
diff --git a/services/github/github-license.service.js b/services/github/github-license.service.js
index ea5efbd286..0a628700f2 100644
--- a/services/github/github-license.service.js
+++ b/services/github/github-license.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { renderLicenseBadge } = require('../licenses')
 const { GithubAuthV3Service } = 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 33af19edad..248397a730 100644
--- a/services/github/github-manifest.service.js
+++ b/services/github/github-manifest.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { renderVersionBadge } = require('../version')
 const {
   individualValueSchema,
diff --git a/services/github/github-manifest.tester.js b/services/github/github-manifest.tester.js
index 34f4236cd0..77c1beb32d 100644
--- a/services/github/github-manifest.tester.js
+++ b/services/github/github-manifest.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { ServiceTester } = require('../tester')
 const { isVPlusDottedVersionAtLeastOne } = require('../test-validators')
 
diff --git a/services/github/github-milestone-detail.service.js b/services/github/github-milestone-detail.service.js
index 6c6a9cc119..1e89e9d6b1 100644
--- a/services/github/github-milestone-detail.service.js
+++ b/services/github/github-milestone-detail.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { metric } = require('../text-formatters')
 const { nonNegativeInteger } = require('../validators')
 const { GithubAuthV3Service } = require('./github-auth-service')
diff --git a/services/github/github-milestone.service.js b/services/github/github-milestone.service.js
index ff3c9403e2..9c70840b1c 100644
--- a/services/github/github-milestone.service.js
+++ b/services/github/github-milestone.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { metric } = require('../text-formatters')
 const { GithubAuthV3Service } = require('./github-auth-service')
 const { documentation, errorMessagesFor } = require('./github-helpers')
diff --git a/services/github/github-package-json.service.js b/services/github/github-package-json.service.js
index b09cc0d379..20cc13617e 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('@hapi/joi')
+const Joi = require('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 87e5137c9f..5a15ccd3be 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('@hapi/joi')
+const Joi = require('joi')
 const { ServiceTester } = require('../tester')
 const { isSemver } = require('../test-validators')
 const { semverRange } = require('../validators')
diff --git a/services/github/github-pipenv.tester.js b/services/github/github-pipenv.tester.js
index 88019391a8..9161c20625 100644
--- a/services/github/github-pipenv.tester.js
+++ b/services/github/github-pipenv.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { ServiceTester } = require('../tester')
 const {
   isVPlusDottedVersionAtLeastOne,
diff --git a/services/github/github-pull-request-check-state.service.js b/services/github/github-pull-request-check-state.service.js
index 9adb59b3bd..4e0d1c861b 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('@hapi/joi')
+const Joi = require('joi')
 const countBy = require('lodash.countby')
 const { GithubAuthV3Service } = 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 f74485b753..acca83b2c0 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('@hapi/joi')
+const Joi = require('joi')
 const { age } = require('../color-formatters')
 const { formatDate } = require('../text-formatters')
 const { GithubAuthV3Service } = require('./github-auth-service')
diff --git a/services/github/github-release.tester.js b/services/github/github-release.tester.js
index 8996a2b2ea..6fa28a5485 100644
--- a/services/github/github-release.tester.js
+++ b/services/github/github-release.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { isSemver } = require('../test-validators')
 const { ServiceTester } = require('../tester')
 
diff --git a/services/github/github-repo-size.service.js b/services/github/github-repo-size.service.js
index a1fa15bf47..f581076bf3 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('@hapi/joi')
+const Joi = require('joi')
 const prettyBytes = require('pretty-bytes')
 const { nonNegativeInteger } = require('../validators')
 const { GithubAuthV3Service } = require('./github-auth-service')
diff --git a/services/github/github-search.service.js b/services/github/github-search.service.js
index 4393feff17..12b6a89e83 100644
--- a/services/github/github-search.service.js
+++ b/services/github/github-search.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { metric } = require('../text-formatters')
 const { nonNegativeInteger } = require('../validators')
 const { GithubAuthV3Service } = require('./github-auth-service')
diff --git a/services/github/github-size.service.js b/services/github/github-size.service.js
index 76a6b59705..ecfb0326bd 100644
--- a/services/github/github-size.service.js
+++ b/services/github/github-size.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const prettyBytes = require('pretty-bytes')
 const { nonNegativeInteger } = require('../validators')
 const { NotFound } = require('..')
diff --git a/services/github/github-stars.service.js b/services/github/github-stars.service.js
index 873e438744..d6492603b3 100644
--- a/services/github/github-stars.service.js
+++ b/services/github/github-stars.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { metric } = require('../text-formatters')
 const { nonNegativeInteger } = require('../validators')
 const { GithubAuthV3Service } = require('./github-auth-service')
diff --git a/services/github/github-tag.service.js b/services/github/github-tag.service.js
index ebad4f1f78..3d6c655baa 100644
--- a/services/github/github-tag.service.js
+++ b/services/github/github-tag.service.js
@@ -1,7 +1,7 @@
 'use strict'
 
 const gql = require('graphql-tag')
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { addv } = require('../text-formatters')
 const { version: versionColor } = require('../color-formatters')
 const { latest } = require('../version')
diff --git a/services/github/github-tag.tester.js b/services/github/github-tag.tester.js
index 1bbff0eaf0..030eb3283e 100644
--- a/services/github/github-tag.tester.js
+++ b/services/github/github-tag.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { isSemver } = require('../test-validators')
 const { ServiceTester } = require('../tester')
 
diff --git a/services/github/github-top-language.tester.js b/services/github/github-top-language.tester.js
index f6d5c805db..348d0dbf2c 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('@hapi/joi')
+const Joi = require('joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 t.create('top language')
diff --git a/services/github/github-total-star.service.js b/services/github/github-total-star.service.js
index 6a0659a88a..705f512354 100644
--- a/services/github/github-total-star.service.js
+++ b/services/github/github-total-star.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const gql = require('graphql-tag')
 const { nonNegativeInteger } = require('../validators')
 const { metric } = require('../text-formatters')
diff --git a/services/github/github-watchers.service.js b/services/github/github-watchers.service.js
index 813f62e226..a3348c06a9 100644
--- a/services/github/github-watchers.service.js
+++ b/services/github/github-watchers.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { metric } = require('../text-formatters')
 const { nonNegativeInteger } = require('../validators')
 const { GithubAuthV3Service } = require('./github-auth-service')
diff --git a/services/github/github-watchers.tester.js b/services/github/github-watchers.tester.js
index 0713b50133..9409eadf3c 100644
--- a/services/github/github-watchers.tester.js
+++ b/services/github/github-watchers.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 t.create('Watchers')
diff --git a/services/github/github-workflow-status.service.js b/services/github/github-workflow-status.service.js
index 0caf2e8b4f..b0e35f0c5d 100644
--- a/services/github/github-workflow-status.service.js
+++ b/services/github/github-workflow-status.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { isBuildStatus, renderBuildStatusBadge } = require('../build-status')
 const { BaseSvgScrapingService } = require('..')
 const { documentation } = require('./github-helpers')
diff --git a/services/github/github-workflow-status.tester.js b/services/github/github-workflow-status.tester.js
index 920135b101..380823e4b5 100644
--- a/services/github/github-workflow-status.tester.js
+++ b/services/github/github-workflow-status.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { isBuildStatus } = require('../build-status')
 const t = (module.exports = require('../tester').createServiceTester())
 
diff --git a/services/gitlab/gitlab-coverage.service.js b/services/gitlab/gitlab-coverage.service.js
index bed38d151c..60122a26f4 100644
--- a/services/gitlab/gitlab-coverage.service.js
+++ b/services/gitlab/gitlab-coverage.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { coveragePercentage } = require('../color-formatters')
 const { optionalUrl } = require('../validators')
 const { BaseSvgScrapingService, NotFound } = require('..')
diff --git a/services/gitlab/gitlab-pipeline-status.service.js b/services/gitlab/gitlab-pipeline-status.service.js
index 4e179e6c73..084b1a9fbe 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('@hapi/joi')
+const Joi = require('joi')
 const { isBuildStatus, renderBuildStatusBadge } = require('../build-status')
 const { optionalUrl } = require('../validators')
 const { BaseSvgScrapingService, NotFound, redirector } = require('..')
diff --git a/services/hackage/hackage-deps.tester.js b/services/hackage/hackage-deps.tester.js
index 3b60d7c6ea..caab395b12 100644
--- a/services/hackage/hackage-deps.tester.js
+++ b/services/hackage/hackage-deps.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('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 e0093012e2..a0728e5cd3 100644
--- a/services/hexpm/hexpm.service.js
+++ b/services/hexpm/hexpm.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('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 8c1f1b4c26..e2b7da726d 100644
--- a/services/hexpm/hexpm.tester.js
+++ b/services/hexpm/hexpm.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { ServiceTester } = require('../tester')
 const { isMetric, isMetricOverTimePeriod } = require('../test-validators')
 
diff --git a/services/homebrew/homebrew-cask.service.js b/services/homebrew/homebrew-cask.service.js
index 4ca70f9b41..93310bd31c 100644
--- a/services/homebrew/homebrew-cask.service.js
+++ b/services/homebrew/homebrew-cask.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { renderVersionBadge } = require('../version')
 const { BaseJsonService } = require('..')
 
diff --git a/services/homebrew/homebrew.service.js b/services/homebrew/homebrew.service.js
index 2b89c460a2..2a6a5b4390 100644
--- a/services/homebrew/homebrew.service.js
+++ b/services/homebrew/homebrew.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { renderVersionBadge } = require('../version')
 const { BaseJsonService } = require('..')
 
diff --git a/services/hsts/hsts.service.js b/services/hsts/hsts.service.js
index 7e636fde88..9361eb7e67 100644
--- a/services/hsts/hsts.service.js
+++ b/services/hsts/hsts.service.js
@@ -1,7 +1,7 @@
 'use strict'
 
 const label = 'hsts preloaded'
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { BaseJsonService } = require('..')
 const schema = Joi.object({
   status: Joi.string().required(),
diff --git a/services/itunes/itunes.service.js b/services/itunes/itunes.service.js
index 975f65b88d..2f82a9580f 100644
--- a/services/itunes/itunes.service.js
+++ b/services/itunes/itunes.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { renderVersionBadge } = require('../version')
 const { nonNegativeInteger } = require('../validators')
 const { BaseJsonService, NotFound } = require('..')
diff --git a/services/jenkins/jenkins-build.service.js b/services/jenkins/jenkins-build.service.js
index ea2c1caf6d..b0051963ad 100644
--- a/services/jenkins/jenkins-build.service.js
+++ b/services/jenkins/jenkins-build.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('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 7de9c6cdb1..440e309c27 100644
--- a/services/jenkins/jenkins-build.tester.js
+++ b/services/jenkins/jenkins-build.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { isBuildStatus } = require('../build-status')
 const t = (module.exports = require('../tester').createServiceTester())
 
diff --git a/services/jenkins/jenkins-common.js b/services/jenkins/jenkins-common.js
index c555abd746..5656bdb12e 100644
--- a/services/jenkins/jenkins-common.js
+++ b/services/jenkins/jenkins-common.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { optionalUrl } = require('../validators')
 
 const queryParamSchema = Joi.object({
diff --git a/services/jenkins/jenkins-coverage.service.js b/services/jenkins/jenkins-coverage.service.js
index d31b215655..4e174ad82d 100644
--- a/services/jenkins/jenkins-coverage.service.js
+++ b/services/jenkins/jenkins-coverage.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('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 9141119c26..1c9620109a 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('@hapi/joi')
+const Joi = require('joi')
 const { downloadCount: downloadCountColor } = require('../color-formatters')
 const { metric } = require('../text-formatters')
 const { nonNegativeInteger } = require('../validators')
diff --git a/services/jenkins/jenkins-plugin-version.tester.js b/services/jenkins/jenkins-plugin-version.tester.js
index 2681a9eb0e..9a64bcbae0 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('@hapi/joi')
+const Joi = require('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 3148ca94ef..a438609dc1 100644
--- a/services/jenkins/jenkins-tests.service.js
+++ b/services/jenkins/jenkins-tests.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const {
   documentation,
   testResultQueryParamSchema,
diff --git a/services/jetbrains/jetbrains-downloads.service.js b/services/jetbrains/jetbrains-downloads.service.js
index b9b95ab923..3a5019072c 100644
--- a/services/jetbrains/jetbrains-downloads.service.js
+++ b/services/jetbrains/jetbrains-downloads.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { metric } = require('../text-formatters')
 const { downloadCount: downloadCountColor } = require('../color-formatters')
 const { nonNegativeInteger } = require('../validators')
diff --git a/services/jetbrains/jetbrains-rating.service.js b/services/jetbrains/jetbrains-rating.service.js
index 244e644657..e90fbcfcd5 100644
--- a/services/jetbrains/jetbrains-rating.service.js
+++ b/services/jetbrains/jetbrains-rating.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { starRating } = require('../text-formatters')
 const { colorScale } = require('../color-formatters')
 const JetbrainsBase = require('./jetbrains-base')
diff --git a/services/jetbrains/jetbrains-version.service.js b/services/jetbrains/jetbrains-version.service.js
index 4a6f699525..fa081664a8 100644
--- a/services/jetbrains/jetbrains-version.service.js
+++ b/services/jetbrains/jetbrains-version.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('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 c79bbbbca9..3d54657f54 100644
--- a/services/jira/jira-issue.service.js
+++ b/services/jira/jira-issue.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { optionalUrl } = require('../validators')
 const { BaseJsonService } = require('..')
 const { authConfig } = require('./jira-common')
diff --git a/services/jira/jira-sprint.service.js b/services/jira/jira-sprint.service.js
index b1ed4d241b..3180d42acb 100644
--- a/services/jira/jira-sprint.service.js
+++ b/services/jira/jira-sprint.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { optionalUrl } = require('../validators')
 const { BaseJsonService } = require('..')
 const { authConfig } = require('./jira-common')
diff --git a/services/jitpack/jitpack-version.service.js b/services/jitpack/jitpack-version.service.js
index f13598678e..3e5fdd2886 100644
--- a/services/jitpack/jitpack-version.service.js
+++ b/services/jitpack/jitpack-version.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { renderVersionBadge } = require('../version')
 const { BaseJsonService } = require('..')
 
diff --git a/services/jitpack/jitpack-version.tester.js b/services/jitpack/jitpack-version.tester.js
index 1debcd801b..695a32d76e 100644
--- a/services/jitpack/jitpack-version.tester.js
+++ b/services/jitpack/jitpack-version.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('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 c8a78069ac..f40bac5b11 100644
--- a/services/jsdelivr/jsdelivr-base.js
+++ b/services/jsdelivr/jsdelivr-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { downloadCount } = require('../color-formatters')
 const { metric } = require('../text-formatters')
 const { BaseJsonService } = require('..')
diff --git a/services/jsdelivr/jsdelivr-hits-github.tester.js b/services/jsdelivr/jsdelivr-hits-github.tester.js
index 18446a77d3..ea9a330a20 100644
--- a/services/jsdelivr/jsdelivr-hits-github.tester.js
+++ b/services/jsdelivr/jsdelivr-hits-github.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const {
   isMetricOverTimePeriod,
   isZeroOverTimePeriod,
diff --git a/services/jsdelivr/jsdelivr-hits-npm.tester.js b/services/jsdelivr/jsdelivr-hits-npm.tester.js
index 3d9f1f961c..18d53af0ef 100644
--- a/services/jsdelivr/jsdelivr-hits-npm.tester.js
+++ b/services/jsdelivr/jsdelivr-hits-npm.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const {
   isMetricOverTimePeriod,
   isZeroOverTimePeriod,
diff --git a/services/keybase/keybase-btc.service.js b/services/keybase/keybase-btc.service.js
index 6193a2b77d..c463b208b0 100644
--- a/services/keybase/keybase-btc.service.js
+++ b/services/keybase/keybase-btc.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('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 e884f066c3..0f73aa229b 100644
--- a/services/keybase/keybase-pgp.service.js
+++ b/services/keybase/keybase-pgp.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('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 070aa09dd2..db05abe97b 100644
--- a/services/keybase/keybase-pgp.tester.js
+++ b/services/keybase/keybase-pgp.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('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 4e0418c658..e5b0f2ee9b 100644
--- a/services/keybase/keybase-xlm.service.js
+++ b/services/keybase/keybase-xlm.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('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 42f31a7857..b22b6ffab7 100644
--- a/services/keybase/keybase-zec.service.js
+++ b/services/keybase/keybase-zec.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { nonNegativeInteger } = require('../validators')
 const KeybaseProfile = require('./keybase-profile')
 
diff --git a/services/lgtm/lgtm-alerts.tester.js b/services/lgtm/lgtm-alerts.tester.js
index f312e228e7..b8e86a13ef 100644
--- a/services/lgtm/lgtm-alerts.tester.js
+++ b/services/lgtm/lgtm-alerts.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const t = (module.exports = require('../tester').createServiceTester())
 const { data } = require('./lgtm-test-helpers')
 
diff --git a/services/lgtm/lgtm-base.js b/services/lgtm/lgtm-base.js
index 916675d77a..f85de912b3 100644
--- a/services/lgtm/lgtm-base.js
+++ b/services/lgtm/lgtm-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { BaseJsonService } = require('..')
 
 const schema = Joi.object({
diff --git a/services/lgtm/lgtm-grade.tester.js b/services/lgtm/lgtm-grade.tester.js
index 85b053fe35..a9d9971f50 100644
--- a/services/lgtm/lgtm-grade.tester.js
+++ b/services/lgtm/lgtm-grade.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const t = (module.exports = require('../tester').createServiceTester())
 const { data } = require('./lgtm-test-helpers')
 
diff --git a/services/liberapay/liberapay-base.js b/services/liberapay/liberapay-base.js
index 990818837e..15e3e96287 100644
--- a/services/liberapay/liberapay-base.js
+++ b/services/liberapay/liberapay-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { metric } = require('../text-formatters')
 const { colorScale } = require('../color-formatters')
 const { nonNegativeInteger } = require('../validators')
diff --git a/services/librariesio/librariesio-common.js b/services/librariesio/librariesio-common.js
index 59b56e346c..7421be27f0 100644
--- a/services/librariesio/librariesio-common.js
+++ b/services/librariesio/librariesio-common.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('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 22f37d7853..2b30e4453c 100644
--- a/services/librariesio/librariesio-dependencies.service.js
+++ b/services/librariesio/librariesio-dependencies.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { BaseJsonService } = require('..')
 const {
   transform,
diff --git a/services/localizely/localizely.service.js b/services/localizely/localizely.service.js
index d73d955155..d29d50d658 100644
--- a/services/localizely/localizely.service.js
+++ b/services/localizely/localizely.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { BaseJsonService, InvalidResponse } = require('..')
 const { coveragePercentage } = require('../color-formatters')
 
diff --git a/services/luarocks/luarocks.service.js b/services/luarocks/luarocks.service.js
index 6eef71d501..4ce526f27f 100644
--- a/services/luarocks/luarocks.service.js
+++ b/services/luarocks/luarocks.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { addv } = require('../text-formatters')
 const { BaseJsonService, NotFound } = require('..')
 const { latestVersion } = require('./luarocks-version-helpers')
diff --git a/services/luarocks/luarocks.tester.js b/services/luarocks/luarocks.tester.js
index f2f95d016f..0e60caf896 100644
--- a/services/luarocks/luarocks.tester.js
+++ b/services/luarocks/luarocks.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('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 d6842dec05..9e0881b5ad 100644
--- a/services/mastodon/mastodon-follow.service.js
+++ b/services/mastodon/mastodon-follow.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { metric } = require('../text-formatters')
 const { optionalUrl, nonNegativeInteger } = require('../validators')
 const { BaseJsonService, NotFound } = require('..')
diff --git a/services/matrix/matrix.service.js b/services/matrix/matrix.service.js
index a5eacfa401..55239edfa3 100644
--- a/services/matrix/matrix.service.js
+++ b/services/matrix/matrix.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { BaseJsonService, InvalidParameter } = require('..')
 
 const queryParamSchema = Joi.object({
diff --git a/services/matrix/matrix.tester.js b/services/matrix/matrix.tester.js
index b42a55c9f9..564df75ad8 100644
--- a/services/matrix/matrix.tester.js
+++ b/services/matrix/matrix.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('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 a38208d8d2..dfa9c1d251 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('@hapi/joi')
+const Joi = require('joi')
 const { renderVersionBadge } = require('../version')
 const { BaseXmlService, NotFound } = require('..')
 
diff --git a/services/maven-metadata/maven-metadata.service.js b/services/maven-metadata/maven-metadata.service.js
index 07af90e3b9..5ad0d5856e 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('@hapi/joi')
+const Joi = require('joi')
 const { optionalUrl } = require('../validators')
 const { renderVersionBadge } = require('../version')
 const { BaseXmlService } = require('..')
diff --git a/services/microbadger/microbadger-base.js b/services/microbadger/microbadger-base.js
index 17362ad391..81b98f4b9f 100644
--- a/services/microbadger/microbadger-base.js
+++ b/services/microbadger/microbadger-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { nonNegativeInteger } = require('../validators')
 const { BaseJsonService, NotFound } = require('..')
 
diff --git a/services/mozilla-observatory/mozilla-observatory.service.js b/services/mozilla-observatory/mozilla-observatory.service.js
index bc7a808b97..30e9ce43cb 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('@hapi/joi')
+const Joi = require('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 d9e6febbd0..a169bac2fc 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('@hapi/joi')
+const Joi = require('joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 const isMessage = Joi.alternatives()
diff --git a/services/nexus/nexus.service.js b/services/nexus/nexus.service.js
index 54b09e9410..349f81e081 100644
--- a/services/nexus/nexus.service.js
+++ b/services/nexus/nexus.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { version: versionColor } = require('../color-formatters')
 const { addv } = require('../text-formatters')
 const { optionalUrl } = require('../validators')
diff --git a/services/nodeping/nodeping-status.service.js b/services/nodeping/nodeping-status.service.js
index adac759a16..d16b9e6a17 100644
--- a/services/nodeping/nodeping-status.service.js
+++ b/services/nodeping/nodeping-status.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const {
   queryParamSchema,
   exampleQueryParams,
diff --git a/services/nodeping/nodeping-status.tester.js b/services/nodeping/nodeping-status.tester.js
index 464e4e70a8..10fb23fb9d 100644
--- a/services/nodeping/nodeping-status.tester.js
+++ b/services/nodeping/nodeping-status.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 t.create('NodePing status')
diff --git a/services/nodeping/nodeping-uptime.service.js b/services/nodeping/nodeping-uptime.service.js
index 4c22abbeea..9ce4084a62 100644
--- a/services/nodeping/nodeping-uptime.service.js
+++ b/services/nodeping/nodeping-uptime.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { colorScale } = require('../color-formatters')
 const { BaseJsonService } = require('..')
 
diff --git a/services/npm/npm-base.js b/services/npm/npm-base.js
index c16a9c19f9..ba93fa4706 100644
--- a/services/npm/npm-base.js
+++ b/services/npm/npm-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { optionalUrl } = require('../validators')
 const { isDependencyMap } = require('../package-json-helpers')
 const { BaseJsonService, InvalidResponse, NotFound } = require('..')
diff --git a/services/npm/npm-downloads.service.js b/services/npm/npm-downloads.service.js
index 56b693ab58..fa29d86b85 100644
--- a/services/npm/npm-downloads.service.js
+++ b/services/npm/npm-downloads.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { metric } = require('../text-formatters')
 const { nonNegativeInteger } = require('../validators')
 const { BaseJsonService } = require('..')
diff --git a/services/npm/npm-type-definitions.tester.js b/services/npm/npm-type-definitions.tester.js
index f49a5ba077..accd7292cb 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('@hapi/joi')
+const Joi = require('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 ae0a5ece1a..509cb5242f 100644
--- a/services/npm/npm-version.service.js
+++ b/services/npm/npm-version.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('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 1223245756..582771ddf2 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('@hapi/joi')
+const Joi = require('joi')
 const { nonNegativeInteger } = require('../validators')
 const { BaseJsonService, BaseXmlService, NotFound, redirector } = require('..')
 const {
diff --git a/services/nuget/nuget-v3-service-family.js b/services/nuget/nuget-v3-service-family.js
index b0f9781e78..2ac2577560 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('@hapi/joi')
+const Joi = require('joi')
 const semver = require('semver')
 const { regularUpdate } = require('../../core/legacy/regular-update')
 const RouteBuilder = require('../route-builder')
diff --git a/services/nycrc/nycrc.service.js b/services/nycrc/nycrc.service.js
index 25737b3310..016d45f93d 100644
--- a/services/nycrc/nycrc.service.js
+++ b/services/nycrc/nycrc.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { coveragePercentage } = require('../color-formatters')
 const {
   ConditionalGithubAuthV3Service,
diff --git a/services/opencollective/opencollective-base.js b/services/opencollective/opencollective-base.js
index 55704c5b39..ef4c0d7653 100644
--- a/services/opencollective/opencollective-base.js
+++ b/services/opencollective/opencollective-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { nonNegativeInteger } = require('../validators')
 const { BaseJsonService } = require('..')
 
diff --git a/services/opm/opm-version.tester.js b/services/opm/opm-version.tester.js
index d6b1f145c8..b6ae397047 100644
--- a/services/opm/opm-version.tester.js
+++ b/services/opm/opm-version.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 const isValidVersion = Joi.string()
diff --git a/services/package-json-helpers.js b/services/package-json-helpers.js
index 3fe7339de4..c41d3ca3fa 100644
--- a/services/package-json-helpers.js
+++ b/services/package-json-helpers.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { InvalidParameter } = require('.')
 
 const isDependencyMap = Joi.object()
diff --git a/services/packagecontrol/packagecontrol.service.js b/services/packagecontrol/packagecontrol.service.js
index 5203d363fb..93cf7bfbfd 100644
--- a/services/packagecontrol/packagecontrol.service.js
+++ b/services/packagecontrol/packagecontrol.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { metric } = require('../text-formatters')
 const { downloadCount } = require('../color-formatters')
 const { nonNegativeInteger } = require('../validators')
diff --git a/services/packagist/packagist-base.js b/services/packagist/packagist-base.js
index 4ae21b6b26..39e645be68 100644
--- a/services/packagist/packagist-base.js
+++ b/services/packagist/packagist-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { BaseJsonService } = require('..')
 
 const packageSchema = Joi.object()
diff --git a/services/packagist/packagist-downloads.service.js b/services/packagist/packagist-downloads.service.js
index 7f1090b00e..6b8fc0836a 100644
--- a/services/packagist/packagist-downloads.service.js
+++ b/services/packagist/packagist-downloads.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { metric } = require('../text-formatters')
 const { downloadCount } = require('../color-formatters')
 const { optionalUrl } = require('../validators')
diff --git a/services/packagist/packagist-license.service.js b/services/packagist/packagist-license.service.js
index 1184844736..7545b22583 100644
--- a/services/packagist/packagist-license.service.js
+++ b/services/packagist/packagist-license.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { renderLicenseBadge } = require('../licenses')
 const { optionalUrl } = require('../validators')
 const { NotFound } = require('..')
diff --git a/services/packagist/packagist-php-version.service.js b/services/packagist/packagist-php-version.service.js
index 96ff0d1c1d..9ab935ff1a 100644
--- a/services/packagist/packagist-php-version.service.js
+++ b/services/packagist/packagist-php-version.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { optionalUrl } = require('../validators')
 const { NotFound } = require('..')
 const {
diff --git a/services/packagist/packagist-stars.service.js b/services/packagist/packagist-stars.service.js
index 08d7aebb15..6487a714d5 100644
--- a/services/packagist/packagist-stars.service.js
+++ b/services/packagist/packagist-stars.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { metric } = require('../text-formatters')
 const { nonNegativeInteger } = require('../validators')
 const { optionalUrl } = require('../validators')
diff --git a/services/packagist/packagist-version.service.js b/services/packagist/packagist-version.service.js
index c22055f67e..87039f6c31 100644
--- a/services/packagist/packagist-version.service.js
+++ b/services/packagist/packagist-version.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { renderVersionBadge } = require('../version')
 const { compare, isStable, latest } = require('../php-version')
 const { optionalUrl } = require('../validators')
diff --git a/services/packagist/packagist-version.tester.js b/services/packagist/packagist-version.tester.js
index cb7115fa3a..aa85b5f087 100644
--- a/services/packagist/packagist-version.tester.js
+++ b/services/packagist/packagist-version.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const {
   isVPlusDottedVersionNClausesWithOptionalSuffix,
 } = require('../test-validators')
diff --git a/services/pipenv-helpers.js b/services/pipenv-helpers.js
index c77b7babf2..4f31f2eaed 100644
--- a/services/pipenv-helpers.js
+++ b/services/pipenv-helpers.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { InvalidParameter } = require('.')
 
 const isDependency = Joi.alternatives(
diff --git a/services/pkgreview/package-rating.service.js b/services/pkgreview/package-rating.service.js
index bcffe3f85e..8650890516 100644
--- a/services/pkgreview/package-rating.service.js
+++ b/services/pkgreview/package-rating.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { starRating, metric } = require('../text-formatters')
 const { colorScale } = require('../color-formatters')
 const { nonNegativeInteger } = require('../validators')
diff --git a/services/poeditor/poeditor.service.js b/services/poeditor/poeditor.service.js
index a0bcb72ee1..7d571cb30b 100644
--- a/services/poeditor/poeditor.service.js
+++ b/services/poeditor/poeditor.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { nonNegativeInteger } = require('../validators')
 const { coveragePercentage } = require('../color-formatters')
 const { BaseJsonService, InvalidResponse } = require('..')
diff --git a/services/powershellgallery/powershellgallery.tester.js b/services/powershellgallery/powershellgallery.tester.js
index 684c465c80..d9999b919a 100644
--- a/services/powershellgallery/powershellgallery.tester.js
+++ b/services/powershellgallery/powershellgallery.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { ServiceTester } = require('../tester')
 const {
   isMetric,
diff --git a/services/pub/pub.service.js b/services/pub/pub.service.js
index 3420b548a9..ddb1592acf 100644
--- a/services/pub/pub.service.js
+++ b/services/pub/pub.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { latest, renderVersionBadge } = require('../version')
 const { BaseJsonService, redirector } = require('..')
 
diff --git a/services/puppetforge/puppetforge-base.js b/services/puppetforge/puppetforge-base.js
index e3abd555f5..4e209ca918 100644
--- a/services/puppetforge/puppetforge-base.js
+++ b/services/puppetforge/puppetforge-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { nonNegativeInteger, semver } = require('../validators')
 const { BaseJsonService } = require('..')
 
diff --git a/services/pypi/pypi-base.js b/services/pypi/pypi-base.js
index faab58bae3..8ca4d87f77 100644
--- a/services/pypi/pypi-base.js
+++ b/services/pypi/pypi-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { BaseJsonService } = require('..')
 
 const schema = Joi.object({
diff --git a/services/pypi/pypi-django-versions.tester.js b/services/pypi/pypi-django-versions.tester.js
index 21d60d38b1..ce0ac70e32 100644
--- a/services/pypi/pypi-django-versions.tester.js
+++ b/services/pypi/pypi-django-versions.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 const isPipeSeparatedDjangoVersions = Joi.string().regex(
diff --git a/services/pypi/pypi-downloads.service.js b/services/pypi/pypi-downloads.service.js
index c592bca47c..a7911d3bda 100644
--- a/services/pypi/pypi-downloads.service.js
+++ b/services/pypi/pypi-downloads.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { downloadCount } = require('../color-formatters')
 const { metric } = require('../text-formatters')
 const { nonNegativeInteger } = require('../validators')
diff --git a/services/pypi/pypi-python-versions.tester.js b/services/pypi/pypi-python-versions.tester.js
index 25552ab4f2..1c5360321a 100644
--- a/services/pypi/pypi-python-versions.tester.js
+++ b/services/pypi/pypi-python-versions.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 const isPipeSeparatedPythonVersions = Joi.string().regex(
diff --git a/services/pypi/pypi-version.tester.js b/services/pypi/pypi-version.tester.js
index bbc2da7ef4..65f881456e 100644
--- a/services/pypi/pypi-version.tester.js
+++ b/services/pypi/pypi-version.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const t = (module.exports = require('../tester').createServiceTester())
 const { isSemver } = require('../test-validators')
 
diff --git a/services/readthedocs/readthedocs.service.js b/services/readthedocs/readthedocs.service.js
index 18ae244e64..a9537f108f 100644
--- a/services/readthedocs/readthedocs.service.js
+++ b/services/readthedocs/readthedocs.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('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 eab0e3e4b4..2ed6c8bdb4 100644
--- a/services/readthedocs/readthedocs.tester.js
+++ b/services/readthedocs/readthedocs.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('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 83a0f6a719..1576feaa84 100644
--- a/services/reddit/subreddit-subscribers.service.js
+++ b/services/reddit/subreddit-subscribers.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { optionalNonNegativeInteger } = require('../validators')
 const { metric } = require('../text-formatters')
 const { BaseJsonService, NotFound } = require('..')
diff --git a/services/reddit/user-karma.service.js b/services/reddit/user-karma.service.js
index d8e0d0fa7d..4537473e25 100644
--- a/services/reddit/user-karma.service.js
+++ b/services/reddit/user-karma.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { nonNegativeInteger } = require('../validators')
 const { metric } = require('../text-formatters')
 const { BaseJsonService } = require('..')
diff --git a/services/redmine/redmine.service.js b/services/redmine/redmine.service.js
index c406dc311e..5d78d07b7d 100644
--- a/services/redmine/redmine.service.js
+++ b/services/redmine/redmine.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { starRating } = require('../text-formatters')
 const { floorCount: floorCountColor } = require('../color-formatters')
 const { BaseXmlService } = require('..')
diff --git a/services/redmine/redmine.tester.js b/services/redmine/redmine.tester.js
index f83d51049c..720d8a77e8 100644
--- a/services/redmine/redmine.tester.js
+++ b/services/redmine/redmine.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { ServiceTester } = require('../tester')
 const { isStarRating } = require('../test-validators')
 
diff --git a/services/repology/repology-repositories.service.js b/services/repology/repology-repositories.service.js
index 5a1ceb6633..4f33a87fc0 100644
--- a/services/repology/repology-repositories.service.js
+++ b/services/repology/repology-repositories.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { metric } = require('../text-formatters')
 const { nonNegativeInteger } = require('../validators')
 const { BaseSvgScrapingService } = require('..')
diff --git a/services/requires/requires.service.js b/services/requires/requires.service.js
index 64f13c239d..abdee946d1 100644
--- a/services/requires/requires.service.js
+++ b/services/requires/requires.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { BaseJsonService } = require('..')
 
 const statusSchema = Joi.object({
diff --git a/services/requires/requires.tester.js b/services/requires/requires.tester.js
index 46751adc24..92545be604 100644
--- a/services/requires/requires.tester.js
+++ b/services/requires/requires.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 const isRequireStatus = Joi.string().regex(
diff --git a/services/scoop/scoop-version.service.js b/services/scoop/scoop-version.service.js
index fed239c639..3fe8249c2b 100644
--- a/services/scoop/scoop-version.service.js
+++ b/services/scoop/scoop-version.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { NotFound } = require('..')
 const {
   ConditionalGithubAuthV3Service,
diff --git a/services/scrutinizer/scrutinizer-build.service.js b/services/scrutinizer/scrutinizer-build.service.js
index 1166fd1124..50e04e2832 100644
--- a/services/scrutinizer/scrutinizer-build.service.js
+++ b/services/scrutinizer/scrutinizer-build.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('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 7730006c57..a14498e939 100644
--- a/services/scrutinizer/scrutinizer-build.tester.js
+++ b/services/scrutinizer/scrutinizer-build.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('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 4ded0fc03f..ccc3cf4314 100644
--- a/services/scrutinizer/scrutinizer-coverage.service.js
+++ b/services/scrutinizer/scrutinizer-coverage.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { colorScale } = require('../color-formatters')
 const { NotFound } = require('..')
 const ScrutinizerBase = require('./scrutinizer-base')
diff --git a/services/scrutinizer/scrutinizer-quality.service.js b/services/scrutinizer/scrutinizer-quality.service.js
index 514351e529..5dba4b9334 100644
--- a/services/scrutinizer/scrutinizer-quality.service.js
+++ b/services/scrutinizer/scrutinizer-quality.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('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 849da9e2bc..d4e14bd137 100644
--- a/services/scrutinizer/scrutinizer-quality.tester.js
+++ b/services/scrutinizer/scrutinizer-quality.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { ServiceTester } = require('../tester')
 const t = (module.exports = new ServiceTester({
   id: 'ScrutinizerQuality',
diff --git a/services/security-headers/security-headers.service.js b/services/security-headers/security-headers.service.js
index f3776bdf25..3216a93cbf 100644
--- a/services/security-headers/security-headers.service.js
+++ b/services/security-headers/security-headers.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { optionalUrl } = require('../validators')
 const { BaseService, NotFound } = require('..')
 
diff --git a/services/shippable/shippable.service.js b/services/shippable/shippable.service.js
index f912d03f27..ccf7c089f0 100644
--- a/services/shippable/shippable.service.js
+++ b/services/shippable/shippable.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { renderBuildStatusBadge } = require('../build-status')
 const { BaseJsonService, NotFound, redirector } = require('..')
 
diff --git a/services/snyk/snyk-vulnerability-base.js b/services/snyk/snyk-vulnerability-base.js
index f6e8e0e889..69a493e7e2 100644
--- a/services/snyk/snyk-vulnerability-base.js
+++ b/services/snyk/snyk-vulnerability-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('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 ab96aa5c56..32326e9d31 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('@hapi/joi')
+const Joi = require('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 3ab9e42c3b..859eaacfe8 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('@hapi/joi')
+const Joi = require('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 2f6dd27237..18f8a6e2b1 100644
--- a/services/sonar/sonar-base.js
+++ b/services/sonar/sonar-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { BaseJsonService, NotFound } = require('..')
 const { isLegacyVersion } = require('./sonar-helpers')
 
diff --git a/services/sonar/sonar-helpers.js b/services/sonar/sonar-helpers.js
index 605c92ae82..e5764304ea 100644
--- a/services/sonar/sonar-helpers.js
+++ b/services/sonar/sonar-helpers.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { colorScale } = require('../color-formatters')
 const { optionalUrl } = require('../validators')
 
diff --git a/services/sonar/sonar-quality-gate.tester.js b/services/sonar/sonar-quality-gate.tester.js
index f7c79b1d83..518ce9451b 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('@hapi/joi')
+const Joi = require('joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 const isQualityGateStatus = Joi.allow('passed', 'failed')
diff --git a/services/sonar/sonar-tests.tester.js b/services/sonar/sonar-tests.tester.js
index 1f5f413272..2b66bd9296 100644
--- a/services/sonar/sonar-tests.tester.js
+++ b/services/sonar/sonar-tests.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { ServiceTester } = require('../tester')
 const t = (module.exports = new ServiceTester({
   id: 'SonarTests',
diff --git a/services/sonar/sonar-violations.tester.js b/services/sonar/sonar-violations.tester.js
index dc3d7e9e95..f5c8095c2e 100644
--- a/services/sonar/sonar-violations.tester.js
+++ b/services/sonar/sonar-violations.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { isMetric, withRegex } = require('../test-validators')
 const t = (module.exports = require('../tester').createServiceTester())
 const isViolationsLongFormMetric = Joi.alternatives(
diff --git a/services/sourceforge/sourceforge-open-tickets.service.js b/services/sourceforge/sourceforge-open-tickets.service.js
index 971ed71d8e..4011cb29d3 100644
--- a/services/sourceforge/sourceforge-open-tickets.service.js
+++ b/services/sourceforge/sourceforge-open-tickets.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { metric } = require('../text-formatters')
 const { nonNegativeInteger } = require('../validators')
 const { BaseJsonService } = require('..')
diff --git a/services/sourceforge/sourceforge.service.js b/services/sourceforge/sourceforge.service.js
index 4eebed4b1a..527ab97040 100644
--- a/services/sourceforge/sourceforge.service.js
+++ b/services/sourceforge/sourceforge.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const moment = require('moment')
 const { metric } = require('../text-formatters')
 const { downloadCount } = require('../color-formatters')
diff --git a/services/sourcegraph/sourcegraph.service.js b/services/sourcegraph/sourcegraph.service.js
index 1b54d235a0..183207d9a9 100644
--- a/services/sourcegraph/sourcegraph.service.js
+++ b/services/sourcegraph/sourcegraph.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { BaseJsonService } = require('..')
 
 const projectsCountRegex = /^\s[0-9]*(\.[0-9]k)?\sprojects$/
diff --git a/services/spack/spack.service.js b/services/spack/spack.service.js
index ed5ad36f1c..9046e8f26c 100644
--- a/services/spack/spack.service.js
+++ b/services/spack/spack.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { renderVersionBadge } = require('..//version')
 const { BaseJsonService } = require('..')
 const schema = Joi.object({
diff --git a/services/spiget/spiget-base.js b/services/spiget/spiget-base.js
index ad4302d3d1..9a434fe40b 100644
--- a/services/spiget/spiget-base.js
+++ b/services/spiget/spiget-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('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 da9717f576..4cc81404d2 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('@hapi/joi')
+const Joi = require('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 c0d92c1de5..00b03eff19 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('@hapi/joi')
+const Joi = require('joi')
 const { nonNegativeInteger } = require('../validators')
 const { BaseJsonService } = require('..')
 const renderQuestionsBadge = require('./stackexchange-helpers')
diff --git a/services/stackexchange/stackexchange-reputation.service.js b/services/stackexchange/stackexchange-reputation.service.js
index 060b1f7577..9c2c43f502 100644
--- a/services/stackexchange/stackexchange-reputation.service.js
+++ b/services/stackexchange/stackexchange-reputation.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('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 1bc7f7a1e9..187d1a5c51 100644
--- a/services/stackexchange/stackexchange-taginfo.service.js
+++ b/services/stackexchange/stackexchange-taginfo.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('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 185ed35878..a17eaf915d 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('@hapi/joi')
+const Joi = require('joi')
 const { BaseStaticService } = require('..')
 
 const queryParamSchema = Joi.object({
diff --git a/services/static-badge/static-badge.tester.js b/services/static-badge/static-badge.tester.js
index 1d3b4e25c4..ccbeccc14f 100644
--- a/services/static-badge/static-badge.tester.js
+++ b/services/static-badge/static-badge.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 t.create('Shields colorscheme color')
diff --git a/services/steam/steam-workshop.service.js b/services/steam/steam-workshop.service.js
index eb53f0d86a..c6a0db1736 100644
--- a/services/steam/steam-workshop.service.js
+++ b/services/steam/steam-workshop.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('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 636ae1b80d..9c1a655cef 100644
--- a/services/swagger/swagger.service.js
+++ b/services/swagger/swagger.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { optionalUrl } = require('../validators')
 const { BaseJsonService, NotFound } = require('..')
 
diff --git a/services/symfony/symfony-insight-base.js b/services/symfony/symfony-insight-base.js
index 708acd0667..8b19160a34 100644
--- a/services/symfony/symfony-insight-base.js
+++ b/services/symfony/symfony-insight-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { BaseXmlService, NotFound } = require('..')
 
 const violationSchema = Joi.object({
diff --git a/services/symfony/symfony-insight-grade.tester.js b/services/symfony/symfony-insight-grade.tester.js
index 6b53c2d2a8..4c0a741b82 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('@hapi/joi')
+const Joi = require('joi')
 const t = (module.exports = require('../tester').createServiceTester())
 const { sampleProjectUuid, noSymfonyToken } = require('./symfony-test-helpers')
 
diff --git a/services/teamcity/teamcity-build.service.js b/services/teamcity/teamcity-build.service.js
index eba17ddd04..991a35339e 100644
--- a/services/teamcity/teamcity-build.service.js
+++ b/services/teamcity/teamcity-build.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { optionalUrl } = require('../validators')
 const TeamCityBase = require('./teamcity-base')
 
diff --git a/services/teamcity/teamcity-build.tester.js b/services/teamcity/teamcity-build.tester.js
index 8ca8f74d5f..eecebed332 100644
--- a/services/teamcity/teamcity-build.tester.js
+++ b/services/teamcity/teamcity-build.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { withRegex } = require('../test-validators')
 const t = (module.exports = require('../tester').createServiceTester())
 
diff --git a/services/teamcity/teamcity-coverage.service.js b/services/teamcity/teamcity-coverage.service.js
index 3d088b4a01..dad4779b7f 100644
--- a/services/teamcity/teamcity-coverage.service.js
+++ b/services/teamcity/teamcity-coverage.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { coveragePercentage } = require('../color-formatters')
 const { optionalUrl } = require('../validators')
 const { InvalidResponse } = require('..')
diff --git a/services/test-results.js b/services/test-results.js
index eaa139f11d..a46841939e 100644
--- a/services/test-results.js
+++ b/services/test-results.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 
 const testResultQueryParamSchema = Joi.object({
   compact_message: Joi.equal(''),
diff --git a/services/test-validators.js b/services/test-validators.js
index c88aa6c3f7..9a57d79eb5 100644
--- a/services/test-validators.js
+++ b/services/test-validators.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { semver: isSemver } = require('./validators')
 
 /*
diff --git a/services/tokei/tokei.service.js b/services/tokei/tokei.service.js
index 4de2b70af2..983791bbff 100644
--- a/services/tokei/tokei.service.js
+++ b/services/tokei/tokei.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { metric } = require('../text-formatters')
 const { nonNegativeInteger } = require('../validators')
 const { BaseJsonService } = require('..')
diff --git a/services/travis/travis-build.service.js b/services/travis/travis-build.service.js
index 324f4cf813..054e32cc46 100644
--- a/services/travis/travis-build.service.js
+++ b/services/travis/travis-build.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('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 a1a07f3b45..a7d6fcfef7 100644
--- a/services/travis/travis-build.tester.js
+++ b/services/travis/travis-build.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { isBuildStatus } = require('../build-status')
 const t = (module.exports = require('../tester').createServiceTester())
 
diff --git a/services/travis/travis-php-version.service.js b/services/travis/travis-php-version.service.js
index 238746fc2b..27881957a9 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('@hapi/joi')
+const Joi = require('joi')
 const {
   minorVersion,
   versionReduction,
diff --git a/services/treeware/treeware-trees.service.js b/services/treeware/treeware-trees.service.js
index 7b4cefa542..e8e5b799e9 100644
--- a/services/treeware/treeware-trees.service.js
+++ b/services/treeware/treeware-trees.service.js
@@ -1,7 +1,7 @@
 'use strict'
 
 const crypto = require('crypto')
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { metric } = require('../text-formatters')
 const { floorCount } = require('../color-formatters')
 const { BaseJsonService } = require('..')
diff --git a/services/twitch/twitch-base.js b/services/twitch/twitch-base.js
index 78664ce269..3dad730dca 100644
--- a/services/twitch/twitch-base.js
+++ b/services/twitch/twitch-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { BaseJsonService } = require('..')
 
 const tokenSchema = Joi.object({
diff --git a/services/twitch/twitch.service.js b/services/twitch/twitch.service.js
index 83ac000a5d..77499144d1 100644
--- a/services/twitch/twitch.service.js
+++ b/services/twitch/twitch.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const TwitchBase = require('./twitch-base')
 
 const helixSchema = Joi.object({
diff --git a/services/twitch/twitch.tester.js b/services/twitch/twitch.tester.js
index 54d8cadb45..53f3f68f59 100644
--- a/services/twitch/twitch.tester.js
+++ b/services/twitch/twitch.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { ServiceTester } = require('../tester')
 const { noToken } = require('../test-helpers')
 const noTwitchToken = noToken(require('./twitch.service'))
diff --git a/services/twitter/twitter.service.js b/services/twitter/twitter.service.js
index dd262729a3..e7cc857c75 100644
--- a/services/twitter/twitter.service.js
+++ b/services/twitter/twitter.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { metric } = require('../text-formatters')
 const { optionalUrl } = require('../validators')
 const { BaseService, BaseJsonService, NotFound } = require('..')
diff --git a/services/ubuntu/ubuntu.service.js b/services/ubuntu/ubuntu.service.js
index 746b703558..0345ef7f9f 100644
--- a/services/ubuntu/ubuntu.service.js
+++ b/services/ubuntu/ubuntu.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { renderVersionBadge } = require('../version')
 const { BaseJsonService, NotFound } = require('..')
 
diff --git a/services/ubuntu/ubuntu.tester.js b/services/ubuntu/ubuntu.tester.js
index 8b9371ec4c..a20217c741 100644
--- a/services/ubuntu/ubuntu.tester.js
+++ b/services/ubuntu/ubuntu.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 const isUbuntuVersion = Joi.string().regex(
diff --git a/services/uptimerobot/uptimerobot-base.js b/services/uptimerobot/uptimerobot-base.js
index 739e51c680..c414227cda 100644
--- a/services/uptimerobot/uptimerobot-base.js
+++ b/services/uptimerobot/uptimerobot-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('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 cd5b6a9146..319d4c0456 100644
--- a/services/uptimerobot/uptimerobot-status.tester.js
+++ b/services/uptimerobot/uptimerobot-status.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('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 d312afbc78..fe05d0f1dd 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('@hapi/joi')
+const Joi = require('joi')
 const { nonNegativeInteger } = require('../validators')
 const { BaseJsonService } = require('..')
 
diff --git a/services/vaadin-directory/vaadin-directory-rating-count.tester.js b/services/vaadin-directory/vaadin-directory-rating-count.tester.js
index 4ed7471a6d..75942ed786 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('@hapi/joi')
+const Joi = require('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 3cbbe9401c..ae2466116d 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('@hapi/joi')
+const Joi = require('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 7faf476ea4..770d35a97a 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('@hapi/joi')
+const Joi = require('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 ce64ea29df..1017a99884 100644
--- a/services/validators.js
+++ b/services/validators.js
@@ -1,7 +1,7 @@
 'use strict'
 
 const { semver, semverRange } = require('joi-extension-semver')
-const Joi = require('@hapi/joi').extend(semver).extend(semverRange)
+const Joi = require('joi').extend(semver).extend(semverRange)
 
 const optionalNonNegativeInteger = Joi.number().integer().min(0)
 
diff --git a/services/visual-studio-app-center/visual-studio-app-center-builds.service.js b/services/visual-studio-app-center/visual-studio-app-center-builds.service.js
index 0fd6a290b2..9aad75b838 100644
--- a/services/visual-studio-app-center/visual-studio-app-center-builds.service.js
+++ b/services/visual-studio-app-center/visual-studio-app-center-builds.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { isBuildStatus, renderBuildStatusBadge } = require('../build-status')
 const { NotFound } = require('..')
 const {
diff --git a/services/visual-studio-app-center/visual-studio-app-center-releases-osversion.service.js b/services/visual-studio-app-center/visual-studio-app-center-releases-osversion.service.js
index af1dd7c840..160b1ed17f 100644
--- a/services/visual-studio-app-center/visual-studio-app-center-releases-osversion.service.js
+++ b/services/visual-studio-app-center/visual-studio-app-center-releases-osversion.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const {
   BaseVisualStudioAppCenterService,
   keywords,
diff --git a/services/visual-studio-app-center/visual-studio-app-center-releases-size.service.js b/services/visual-studio-app-center/visual-studio-app-center-releases-size.service.js
index fde5401cbf..553bc90271 100644
--- a/services/visual-studio-app-center/visual-studio-app-center-releases-size.service.js
+++ b/services/visual-studio-app-center/visual-studio-app-center-releases-size.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const prettyBytes = require('pretty-bytes')
 const { nonNegativeInteger } = require('../validators')
 const {
diff --git a/services/visual-studio-app-center/visual-studio-app-center-releases-version.service.js b/services/visual-studio-app-center/visual-studio-app-center-releases-version.service.js
index 9f6f067864..27e211ad29 100644
--- a/services/visual-studio-app-center/visual-studio-app-center-releases-version.service.js
+++ b/services/visual-studio-app-center/visual-studio-app-center-releases-version.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { renderVersionBadge } = require('../version')
 const {
   BaseVisualStudioAppCenterService,
diff --git a/services/visual-studio-marketplace/visual-studio-marketplace-base.js b/services/visual-studio-marketplace/visual-studio-marketplace-base.js
index 416ad01b57..a40cf4ba46 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('@hapi/joi')
+const Joi = require('joi')
 const validate = require('../../core/base-service/validate')
 const { BaseJsonService, NotFound } = require('..')
 
diff --git a/services/w3c/w3c-validation.service.js b/services/w3c/w3c-validation.service.js
index 21a15d6517..692d732575 100644
--- a/services/w3c/w3c-validation.service.js
+++ b/services/w3c/w3c-validation.service.js
@@ -1,5 +1,5 @@
 'use strict'
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { optionalUrl } = require('../validators')
 const { BaseJsonService, NotFound } = require('..')
 const {
diff --git a/services/w3c/w3c-validation.tester.js b/services/w3c/w3c-validation.tester.js
index b2eff4457c..4dc93b6e0d 100644
--- a/services/w3c/w3c-validation.tester.js
+++ b/services/w3c/w3c-validation.tester.js
@@ -1,5 +1,5 @@
 'use strict'
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const t = (module.exports = require('../tester').createServiceTester())
 
 const isErrorOnly = Joi.string().regex(/^[0-9]+ errors?$/)
diff --git a/services/website-status.js b/services/website-status.js
index 1f36662ca4..c22cf690bd 100644
--- a/services/website-status.js
+++ b/services/website-status.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 
 const queryParamSchema = Joi.object({
   up_message: Joi.string(),
diff --git a/services/website/website.service.js b/services/website/website.service.js
index 4848d75312..6439ae0056 100644
--- a/services/website/website.service.js
+++ b/services/website/website.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const emojic = require('emojic')
 const { optionalUrl } = require('../validators')
 const {
diff --git a/services/wercker/wercker.service.js b/services/wercker/wercker.service.js
index cd25d2a94c..eabae01be2 100644
--- a/services/wercker/wercker.service.js
+++ b/services/wercker/wercker.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('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 e9158ad5d8..075e869ddd 100644
--- a/services/wheelmap/wheelmap.service.js
+++ b/services/wheelmap/wheelmap.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { BaseJsonService } = require('..')
 
 const schema = Joi.object({
diff --git a/services/wordpress/wordpress-base.js b/services/wordpress/wordpress-base.js
index 407e9c16d7..f35993d0f6 100644
--- a/services/wordpress/wordpress-base.js
+++ b/services/wordpress/wordpress-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { nonNegativeInteger } = require('../validators')
 const { BaseJsonService, NotFound } = require('..')
 
diff --git a/services/wordpress/wordpress-downloads.service.js b/services/wordpress/wordpress-downloads.service.js
index e1edfa0886..efb0892ba3 100644
--- a/services/wordpress/wordpress-downloads.service.js
+++ b/services/wordpress/wordpress-downloads.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { metric } = require('../text-formatters')
 const { downloadCount } = require('../color-formatters')
 const { NotFound } = require('..')
diff --git a/services/wordpress/wordpress-platform.tester.js b/services/wordpress/wordpress-platform.tester.js
index 940f6b8337..f50f87d32e 100644
--- a/services/wordpress/wordpress-platform.tester.js
+++ b/services/wordpress/wordpress-platform.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { ServiceTester } = require('../tester')
 const { isVPlusDottedVersionAtLeastOne } = require('../test-validators')
 
diff --git a/services/youtube/youtube-base.js b/services/youtube/youtube-base.js
index b6e29ca12a..298ef80389 100644
--- a/services/youtube/youtube-base.js
+++ b/services/youtube/youtube-base.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { BaseJsonService, NotFound } = require('..')
 const { metric } = require('../text-formatters')
 const { nonNegativeInteger } = require('../validators')
diff --git a/services/youtube/youtube-likes.service.js b/services/youtube/youtube-likes.service.js
index 0087d45a4a..09f35e9c3a 100644
--- a/services/youtube/youtube-likes.service.js
+++ b/services/youtube/youtube-likes.service.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const { metric } = require('../text-formatters')
 const YouTubeBase = require('./youtube-base')
 
diff --git a/services/youtube/youtube-likes.tester.js b/services/youtube/youtube-likes.tester.js
index 9c50d1a9b6..f123a30542 100644
--- a/services/youtube/youtube-likes.tester.js
+++ b/services/youtube/youtube-likes.tester.js
@@ -1,6 +1,6 @@
 'use strict'
 
-const Joi = require('@hapi/joi')
+const Joi = require('joi')
 const t = (module.exports = require('../tester').createServiceTester())
 const { noToken } = require('../test-helpers')
 const { isMetric } = require('../test-validators')
-- 
GitLab