build.sbt (202 lines of code) (raw):
import play.sbt.routes.RoutesKeys
import com.typesafe.sbt.web.SbtWeb.autoImport._
import com.gu.Dependencies._
import com.gu.ProjectSettings._
/*
We need to set a wide width here because otherwise the output from
the `dependencyTree` command can get truncated, especially for nested projects.
The output from `dependencyTree` is used by Snyk to monitor our dependencies.
If the output is truncated, Snyk might report false positives.
See
https://support.snyk.io/hc/en-us/articles/9590215676189-Deeply-nested-Scala-projects-have-dependencies-truncated
*/
ThisBuild / asciiGraphWidth := 999999999
val common = library("common")
.settings(
Test / javaOptions += "-Dconfig.file=common/conf/test.conf",
libraryDependencies ++= Seq(
apacheCommonsLang,
awsCore,
awsCloudwatch,
awsDynamodb,
awsEc2,
awsKinesis,
awsS3,
awsSns,
awsSts, // AWS SDK v1 still used for CAPI-preview related code for now
awsV2Sts, // AWS SDK v2 used for Fronts API access
awsSqs,
awsSsm,
eTagCachingS3,
contentApiClient,
contentApiModelsJson,
enumeratumPlayJson,
filters,
commonsLang,
jodaConvert,
jodaTime,
jSoup,
json4s,
panDomainAuth,
editorialPermissions,
quartzScheduler,
redisClient,
rome,
romeModules,
scalaCheck,
scalaCollectionPlus,
nScalaTime,
ws,
faciaFapiScalaClient,
closureCompiler,
jerseyCore,
jerseyClient,
cssParser,
w3cSac,
logstash,
targetingClient,
scanamo,
scalaUri,
commercialShared,
playJson,
playJsonJoda,
jodaForms,
identityModel,
capiAws,
pekkoActor,
pekkoStream,
pekkoSlf4j,
pekkoSerializationJackson,
pekkoActorTyped,
janino,
) ++ jackson,
TestAssets / mappings ~= filterAssets,
)
val commonWithTests = withTests(common)
val facia = application("facia")
.dependsOn(commonWithTests)
.aggregate(common)
.settings(
libraryDependencies += scalaCheck,
)
val article = application("article").dependsOn(commonWithTests).aggregate(common)
val applications = application("applications")
.dependsOn(commonWithTests)
.aggregate(common)
val archive = application("archive")
.dependsOn(commonWithTests)
.aggregate(common)
val sport = application("sport")
.dependsOn(commonWithTests)
.aggregate(common)
.settings(
libraryDependencies ++= Seq(
paClient,
),
)
val discussion = application("discussion").dependsOn(commonWithTests).aggregate(common)
val admin = application("admin")
.dependsOn(commonWithTests)
.aggregate(common)
.settings(
libraryDependencies ++= Seq(
paClient,
dfpAxis,
bootstrap,
jquery,
jqueryui,
lodash,
react,
epoch,
d3,
awsElasticloadbalancing,
awsSes,
scalaUri,
),
RoutesKeys.routesImport += "bindables._",
RoutesKeys.routesImport += "org.joda.time.LocalDate",
)
val faciaPress = application("facia-press")
.dependsOn(commonWithTests)
.settings(
libraryDependencies ++= Seq(
awsKinesis,
),
)
val identity = application("identity")
.dependsOn(commonWithTests)
.aggregate(common)
.settings(
libraryDependencies ++= Seq(
filters,
identityAuthCore,
slf4jExt,
libPhoneNumber,
supportInternationalisation,
),
PlayKeys.playDefaultPort := 9009,
Test / testOptions += Tests.Argument("-oF"),
)
val commercial = application("commercial").dependsOn(commonWithTests).aggregate(common)
val onward = application("onward").dependsOn(commonWithTests).aggregate(common)
val dev = application("dev-build")
.dependsOn(
withTests(article),
)
.dependsOn(
facia,
applications,
archive,
sport,
discussion,
identity,
admin,
commercial,
onward,
)
.settings(
RoutesKeys.routesImport += "bindables._",
Runtime / javaOptions += "-Dconfig.file=dev-build/conf/dev-build.application.conf",
)
val preview = application("preview")
.dependsOn(
commonWithTests,
article,
facia,
applications,
sport,
commercial,
onward,
)
val rss = application("rss")
.dependsOn(commonWithTests)
.aggregate(common)
val main = root()
.aggregate(
common,
facia,
faciaPress,
article,
applications,
sport,
discussion,
admin,
identity,
commercial,
onward,
archive,
preview,
rss,
)
val badgeHash = inputKey[Unit]("Generate special badge salts and hashes")
badgeHash := {
import java.math.BigInteger
import java.security.MessageDigest
import complete.DefaultParsers._
import java.util.UUID
val result = spaceDelimited("<arg>").parsed.headOption
.map { tag =>
val salt = UUID.randomUUID.toString.replaceAll("-", "")
val saltedTag = salt + tag
val digest = MessageDigest.getInstance("MD5")
digest.update(saltedTag.getBytes(), 0, saltedTag.length)
val hash = new BigInteger(1, digest.digest()).toString(16)
s"salt=$salt\nhash=$hash"
}
.getOrElse {
"error: expected tag parameter"
}
println(result)
}