>,
vararg modifiers: WatchEvent.Modifier?
): WatchKey = delegate.register(watcher, events, *modifiers)
- override fun register(watcher: WatchService?, vararg events: WatchEvent.Kind<*>?): WatchKey =
+ override fun register(watcher: WatchService, vararg events: WatchEvent.Kind<*>?): WatchKey =
delegate.register(watcher, *events)
override fun getFileSystem(): FileSystem = delegate.fileSystem
@@ -111,4 +104,6 @@ class LazyTempPath(private val prefix: String) : Path {
override fun toRealPath(vararg options: LinkOption?): Path = delegate.toRealPath(*options)
override fun toFile(): File = delegate.toFile()
+
+ override fun toString(): String = delegate.toString()
}
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/git/Branch.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/git/Branch.kt
new file mode 100644
index 000000000..63bae4e6d
--- /dev/null
+++ b/buildSrc/src/main/kotlin/io/spine/internal/gradle/git/Branch.kt
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2023, TeamDev. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Redistribution and use in source and/or binary forms, with or without
+ * modification, must retain the above copyright notice and the following
+ * disclaimer.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package io.spine.internal.gradle.git
+
+/**
+ * Branch names.
+ */
+object Branch {
+
+ /**
+ * The default branch.
+ */
+ const val master = "master"
+
+ /**
+ * The branch used for publishing documentation to GitHub Pages.
+ */
+ const val documentation = "gh-pages"
+}
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/git/Repository.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/git/Repository.kt
new file mode 100644
index 000000000..229973d8e
--- /dev/null
+++ b/buildSrc/src/main/kotlin/io/spine/internal/gradle/git/Repository.kt
@@ -0,0 +1,164 @@
+/*
+ * Copyright 2023, TeamDev. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Redistribution and use in source and/or binary forms, with or without
+ * modification, must retain the above copyright notice and the following
+ * disclaimer.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package io.spine.internal.gradle.git
+
+import io.spine.internal.gradle.Cli
+import io.spine.internal.gradle.fs.LazyTempPath
+
+/**
+ * Interacts with a real Git repository.
+ *
+ * Clones the repository with the provided SSH URL in a temporal folder. Provides
+ * functionality to configure a user, checkout branches, commit changes and push them
+ * to the remote repository.
+ *
+ * It is assumed that before using this class an appropriate SSH key that has
+ * sufficient rights to perform described above operations was registered
+ * in `ssh-agent`.
+ *
+ * NOTE: This class creates a temporal folder, so it holds resources. For the proper
+ * release of resources please use the provided functionality inside a `use` block or
+ * call the `close` method manually.
+ */
+class Repository private constructor(
+
+ /**
+ * The GitHub SSH URL to the underlying repository.
+ */
+ private val sshUrl: String,
+
+ /**
+ * Current user configuration.
+ *
+ * This configuration determines what ends up in author and committer fields of a commit.
+ */
+ private var user: UserInfo,
+
+ /**
+ * Currently checked out branch.
+ */
+ private var currentBranch: String
+
+) : AutoCloseable {
+
+ /**
+ * Path to the temporal folder for a clone of the underlying repository.
+ */
+ val location = LazyTempPath("repoTemp")
+
+ /**
+ * Clones the repository with [the SSH url][sshUrl] into the [temporal folder][location].
+ */
+ private fun clone() {
+ repoExecute("git", "clone", sshUrl, ".")
+ }
+
+ /**
+ * Executes a command in the [location].
+ */
+ private fun repoExecute(vararg command: String): String =
+ Cli(location.toFile()).execute(*command)
+
+ /**
+ * Checks out the branch by its name.
+ */
+ fun checkout(branch: String) {
+ repoExecute("git", "checkout", branch)
+
+ currentBranch = branch
+ }
+
+ /**
+ * Configures the username and the email of the user.
+ *
+ * Overwrites `user.name` and `user.email` settings locally in [location] with
+ * values from [user]. These settings determine what ends up in author and
+ * committer fields of a commit.
+ */
+ fun configureUser(user: UserInfo) {
+ repoExecute("git", "config", "user.name", user.name)
+ repoExecute("git", "config", "user.email", user.email)
+
+ this.user = user
+ }
+
+ /**
+ * Stages all changes and commits with the provided message.
+ */
+ fun commitAllChanges(message: String) {
+ stageAllChanges()
+ commit(message)
+ }
+
+ private fun stageAllChanges() {
+ repoExecute("git", "add", "--all")
+ }
+
+ private fun commit(message: String) {
+ repoExecute(
+ "git",
+ "commit",
+ "--allow-empty",
+ "--message=${message}"
+ )
+ }
+
+ /**
+ * Pushes local repository to the remote.
+ */
+ fun push() {
+ repoExecute("git", "push")
+ }
+
+ override fun close() {
+ location.toFile().deleteRecursively()
+ }
+
+ companion object Factory {
+ /**
+ * Clones the repository with the provided SSH URL in a temporal folder.
+ * Configures the username and the email of the Git user. See [configureUser]
+ * documentation for more information. Performs checkout of the branch in
+ * case it was passed. By default, [master][Branch.master] is checked out.
+ *
+ * @throws IllegalArgumentException if SSH URL is an empty string.
+ */
+ fun of(sshUrl: String, user: UserInfo, branch: String = Branch.master): Repository {
+ require(sshUrl.isNotBlank()) { "SSH URL cannot be an empty string." }
+
+ val repo = Repository(sshUrl, user, branch)
+ repo.clone()
+ repo.configureUser(user)
+
+ if (branch != Branch.master) {
+ repo.checkout(branch)
+ }
+
+ return repo
+ }
+ }
+}
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/publish/DokkaJar.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/git/UserInfo.kt
similarity index 69%
rename from buildSrc/src/main/kotlin/io/spine/internal/gradle/publish/DokkaJar.kt
rename to buildSrc/src/main/kotlin/io/spine/internal/gradle/git/UserInfo.kt
index 1ddd1fb93..898eb5b38 100644
--- a/buildSrc/src/main/kotlin/io/spine/internal/gradle/publish/DokkaJar.kt
+++ b/buildSrc/src/main/kotlin/io/spine/internal/gradle/git/UserInfo.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2022, TeamDev. All rights reserved.
+ * Copyright 2023, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -24,20 +24,19 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package io.spine.internal.gradle.publish
+package io.spine.internal.gradle.git
/**
- * A DSL element of [SpinePublishing] extension which configures publishing of [dokkaJar] artifact.
+ * Contains information about a Git user.
*
- * This artifact contains Dokka-generated documentation. By default, it is not published.
+ * Determines the author and committer fields of a commit.
*
- * Take a look at the [SpinePublishing.dokkaJar] for a usage example.
- *
- * @see [registerArtifacts]
+ * @constructor throws an [IllegalArgumentException] if the name or the email
+ * is an empty string.
*/
-class DokkaJar {
- /**
- * Enables publishing `JAR`s with Dokka-generated documentation for all published modules.
- */
- var enabled = false
+data class UserInfo(val name: String, val email: String) {
+ init {
+ require(name.isNotBlank()) { "Name cannot be an empty string." }
+ require(email.isNotBlank()) { "Email cannot be an empty string." }
+ }
}
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/github/pages/AuthorEmail.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/github/pages/AuthorEmail.kt
index cac6e41a5..0f48f0095 100644
--- a/buildSrc/src/main/kotlin/io/spine/internal/gradle/github/pages/AuthorEmail.kt
+++ b/buildSrc/src/main/kotlin/io/spine/internal/gradle/github/pages/AuthorEmail.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2022, TeamDev. All rights reserved.
+ * Copyright 2023, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -45,10 +45,8 @@ class AuthorEmail(val value: String) {
*/
fun fromVar() : AuthorEmail {
val envValue = System.getenv(environmentVariable)
- if (envValue.isNullOrEmpty()) {
- throw IllegalStateException(
- "Unable to obtain an author from `${environmentVariable}`."
- )
+ check(envValue != null && envValue.isNotBlank()) {
+ "Unable to obtain an author from `${environmentVariable}`."
}
return AuthorEmail(envValue)
}
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/github/pages/RepositoryExtensions.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/github/pages/RepositoryExtensions.kt
new file mode 100644
index 000000000..4dacb62ab
--- /dev/null
+++ b/buildSrc/src/main/kotlin/io/spine/internal/gradle/github/pages/RepositoryExtensions.kt
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2023, TeamDev. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Redistribution and use in source and/or binary forms, with or without
+ * modification, must retain the above copyright notice and the following
+ * disclaimer.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package io.spine.internal.gradle.github.pages
+
+import io.spine.internal.gradle.RepoSlug
+import io.spine.internal.gradle.git.Branch
+import io.spine.internal.gradle.git.Repository
+import io.spine.internal.gradle.git.UserInfo
+
+/**
+ * Clones the current project repository with the branch dedicated to publishing
+ * documentation to GitHub Pages checked out.
+ *
+ * The repository's GitHub SSH URL is derived from the `REPO_SLUG` environment
+ * variable. The [branch][Branch.documentation] dedicated to publishing documentation
+ * is automatically checked out in this repository. Also, the username and the email
+ * of the git user are automatically configured. The username is set
+ * to "UpdateGitHubPages Plugin", and the email is derived from
+ * the `FORMAL_GIT_HUB_PAGES_AUTHOR` environment variable.
+ *
+ * @throws org.gradle.api.GradleException if any of the environment variables described above
+ * is not set.
+ */
+internal fun Repository.Factory.forPublishingDocumentation(): Repository {
+ val host = RepoSlug.fromVar().gitHost()
+
+ val username = "UpdateGitHubPages Plugin"
+ val userEmail = AuthorEmail.fromVar().toString()
+ val user = UserInfo(username, userEmail)
+
+ val branch = Branch.documentation
+
+ return of(host, user, branch)
+}
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/github/pages/SshKey.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/github/pages/SshKey.kt
new file mode 100644
index 000000000..7b1746ae2
--- /dev/null
+++ b/buildSrc/src/main/kotlin/io/spine/internal/gradle/github/pages/SshKey.kt
@@ -0,0 +1,104 @@
+/*
+ * Copyright 2023, TeamDev. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Redistribution and use in source and/or binary forms, with or without
+ * modification, must retain the above copyright notice and the following
+ * disclaimer.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package io.spine.internal.gradle.github.pages
+
+import io.spine.internal.gradle.Cli
+import java.io.File
+import org.gradle.api.GradleException
+
+/**
+ * Registers SSH key for further operations with GitHub Pages.
+ */
+internal class SshKey(private val rootProjectFolder: File) {
+ /**
+ * Creates an SSH key with the credentials and registers it by invoking the
+ * `register-ssh-key.sh` script.
+ */
+ fun register() {
+ val gitHubAccessKey = gitHubKey()
+ val sshConfigFile = sshConfigFile()
+ sshConfigFile.appendPublisher(gitHubAccessKey)
+
+ execute(
+ "${rootProjectFolder.absolutePath}/config/scripts/register-ssh-key.sh",
+ gitHubAccessKey.absolutePath
+ )
+ }
+
+ /**
+ * Locates `deploy_key_rsa` in the [rootProjectFolder] and returns it as a [File].
+ *
+ * A CI instance comes with an RSA key. However, of course, the default key has
+ * no privileges in Spine repositories. Thus, we add our own RSA key —
+ * `deploy_rsa_key`. It must have `write` rights in the associated repository.
+ * Also, we don't want that key to be used for anything else but GitHub Pages
+ * publishing.
+ *
+ * Thus, we configure the SSH agent to use the `deploy_rsa_key` only for specific
+ * references, namely in `github.com-publish`.
+ *
+ * @throws GradleException if `deploy_key_rsa` is not found.
+ */
+ private fun gitHubKey(): File {
+ val gitHubAccessKey = File("${rootProjectFolder.absolutePath}/deploy_key_rsa")
+
+ if (!gitHubAccessKey.exists()) {
+ throw GradleException(
+ "File $gitHubAccessKey does not exist. It should be encrypted" +
+ " in the repository and decrypted on CI."
+ )
+ }
+ return gitHubAccessKey
+ }
+
+ private fun sshConfigFile(): File {
+ val sshConfigFile = File("${System.getProperty("user.home")}/.ssh/config")
+
+ if (!sshConfigFile.exists()) {
+ val parentDir = sshConfigFile.canonicalFile.parentFile
+ parentDir.mkdirs()
+ sshConfigFile.createNewFile()
+ }
+
+ return sshConfigFile
+ }
+
+ private fun File.appendPublisher(privateKey: File) {
+ val nl = System.lineSeparator()
+ this.appendText(
+ nl +
+ "Host github.com-publish" + nl +
+ "User git" + nl +
+ "IdentityFile ${privateKey.absolutePath}" + nl
+ )
+ }
+
+ /**
+ * Executes a command in the project [rootProjectFolder].
+ */
+ private fun execute(vararg command: String): String = Cli(rootProjectFolder).execute(*command)
+}
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/github/pages/TaskName.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/github/pages/TaskName.kt
index 2823416da..98e477226 100644
--- a/buildSrc/src/main/kotlin/io/spine/internal/gradle/github/pages/TaskName.kt
+++ b/buildSrc/src/main/kotlin/io/spine/internal/gradle/github/pages/TaskName.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2022, TeamDev. All rights reserved.
+ * Copyright 2023, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -34,7 +34,14 @@ object TaskName {
const val updateGitHubPages = "updateGitHubPages"
/**
- * The name of the helper task to gather the generated Javadoc before updating GitHub Pages.
+ * The name of the helper task to gather the generated Javadoc before updating
+ * GitHub Pages.
*/
const val copyJavadoc = "copyJavadoc"
+
+ /**
+ * The name of the helper task to gather Dokka-generated documentation before
+ * updating GitHub Pages.
+ */
+ const val copyDokka = "copyDokka"
}
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/github/pages/Update.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/github/pages/Update.kt
index 283405dd8..f27858fa1 100644
--- a/buildSrc/src/main/kotlin/io/spine/internal/gradle/github/pages/Update.kt
+++ b/buildSrc/src/main/kotlin/io/spine/internal/gradle/github/pages/Update.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2022, TeamDev. All rights reserved.
+ * Copyright 2023, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -26,11 +26,9 @@
package io.spine.internal.gradle.github.pages
-import io.spine.internal.gradle.Cli
-import io.spine.internal.gradle.RepoSlug
+import io.spine.internal.gradle.git.Repository
import java.io.File
import java.nio.file.Path
-import org.gradle.api.GradleException
import org.gradle.api.Project
import org.gradle.api.Task
import org.gradle.api.file.ConfigurableFileCollection
@@ -42,63 +40,86 @@ import org.gradle.api.logging.Logger
*/
fun Task.updateGhPages(project: Project) {
val plugin = project.plugins.getPlugin(UpdateGitHubPages::class.java)
- val op = with(plugin) {
- Operation(project, rootFolder, checkoutTempFolder, javadocOutputPath, logger)
+
+ with(plugin) {
+ SshKey(rootFolder).register()
+ }
+
+ val repository = Repository.forPublishingDocumentation()
+
+ val updateJavadoc = with(plugin) {
+ UpdateJavadoc(project, javadocOutputFolder, repository, logger)
+ }
+
+ val updateDokka = with(plugin) {
+ UpdateDokka(project, dokkaOutputFolder, repository, logger)
+ }
+
+ repository.use {
+ updateJavadoc.run()
+ updateDokka.run()
+ repository.push()
}
- op.run()
}
-private class Operation(
+private abstract class UpdateDocumentation(
private val project: Project,
- private val rootFolder: File,
- checkoutTempFolder: Path,
- private val javadocOutputPath: Path,
+ private val docsSourceFolder: Path,
+ private val repository: Repository,
private val logger: Logger
) {
- private val ghRepoFolder: File = File("${checkoutTempFolder}/${Branch.ghPages}")
- private val docDirPostfix = "reference/$project.name"
- private val mostRecentDocDir = File("$ghRepoFolder/$docDirPostfix")
+ /**
+ * The folder under the repository's root(`/`) for storing documentation.
+ *
+ * The value should not contain any leading or trailing file separators.
+ *
+ * The absolute path to the project's documentation is made by appending its
+ * name to the end, making `/docsDestinationFolder/project.name`.
+ */
+ protected abstract val docsDestinationFolder: String
- fun run() {
- SshKey(rootFolder).register()
- checkoutDocs()
- val generatedDocs = replaceMostRecentDocs()
- copyIntoVersionDir(generatedDocs)
- addCommitAndPush()
- logger.debug("The GitHub Pages contents were successfully updated.")
+ /**
+ * The name of the tool used to generate the documentation to update.
+ *
+ * This name will appear in logs as part of a message.
+ */
+ protected abstract val toolName: String
+
+ private val mostRecentFolder by lazy {
+ File("${repository.location}/${docsDestinationFolder}/${project.name}")
}
- /** Executes a command in the project [rootFolder]. */
- private fun execute(vararg command: String): String = Cli(rootFolder).execute(*command)
+ private fun logDebug(message: () -> String) {
+ if (logger.isDebugEnabled) {
+ logger.debug(message())
+ }
+ }
- /** Executes a command in the [ghRepoFolder] */
- private fun pagesExecute(vararg command: String): String = Cli(ghRepoFolder).execute(*command)
+ fun run() {
+ val module = project.name
+ logDebug {"Update of the $toolName documentation for module `$module` started." }
+
+ val documentation = replaceMostRecentDocs()
+ copyIntoVersionDir(documentation)
- private fun checkoutDocs() {
- val gitHost = RepoSlug.fromVar().gitHost()
+ val version = project.version
+ val updateMessage =
+ "Update `$toolName` documentation for module `$module` as for version $version"
+ repository.commitAllChanges(updateMessage)
- execute("git", "clone", gitHost, ghRepoFolder.absolutePath)
- pagesExecute("git", "checkout", Branch.ghPages)
+ logDebug { "Update of the `$toolName` documentation for `$module` successfully finished." }
}
private fun replaceMostRecentDocs(): ConfigurableFileCollection {
- logger.debug("Replacing the most recent docs in `$mostRecentDocDir`.")
- val generatedDocs = project.files(javadocOutputPath)
- copyDocs(generatedDocs, mostRecentDocDir)
- return generatedDocs
- }
+ val generatedDocs = project.files(docsSourceFolder)
- private fun copyIntoVersionDir(generatedDocs: ConfigurableFileCollection) {
- val versionedDocDir = File("$mostRecentDocDir/v/$project.version")
- logger.debug("Storing the new version of docs in the directory `$versionedDocDir`.")
- copyDocs(generatedDocs, versionedDocDir)
- }
+ logDebug {
+ "Replacing the most recent `$toolName` documentation in `${mostRecentFolder}`."
+ }
+ copyDocs(generatedDocs, mostRecentFolder)
- private fun addCommitAndPush() {
- pagesExecute("git", "add", docDirPostfix)
- configureCommitter()
- commitAndPush()
+ return generatedDocs
}
private fun copyDocs(source: FileCollection, destination: File) {
@@ -109,89 +130,38 @@ private class Operation(
}
}
- /**
- * Configures Git to publish the changes under "UpdateGitHubPages Plugin" Git user name
- * and email stored in "FORMAL_GIT_HUB_PAGES_AUTHOR" env variable.
- */
- private fun configureCommitter() {
- pagesExecute("git", "config", "user.name", "\"UpdateGitHubPages Plugin\"")
- val authorEmail = AuthorEmail.fromVar().toString()
- pagesExecute("git", "config", "user.email", authorEmail)
- }
-
- private fun commitAndPush() {
- pagesExecute(
- "git",
- "commit",
- "--allow-empty",
- "--message=\"Update Javadoc for module ${project.name}" +
- " as for version ${project.version}\""
- )
- pagesExecute("git", "push")
- }
-}
-
-/**
- * Registers SSH key for further operations with GitHub Pages.
- */
-private class SshKey(private val rootFolder: File) {
-
- /**
- * Creates an SSH key with the credentials and registers it
- * by invoking the `register-ssh-key.sh` script.
- */
- fun register() {
- val gitHubAccessKey = gitHubKey()
- val sshConfigFile = sshConfigFile()
- val nl = System.lineSeparator()
- sshConfigFile.appendText(
- nl +
- "Host github.com-publish" + nl +
- "User git" + nl +
- "IdentityFile ${gitHubAccessKey.absolutePath}" + nl
- )
-
- execute(
- "${rootFolder.absolutePath}/config/scripts/register-ssh-key.sh",
- gitHubAccessKey.absolutePath
- )
- }
+ private fun copyIntoVersionDir(generatedDocs: ConfigurableFileCollection) {
+ val versionedDocDir = File("$mostRecentFolder/v/${project.version}")
- /**
- * Locates `deploy_key_rsa` in the [rootFolder] and returns it as a [File].
- *
- * If it is not found, a [GradleException] is thrown.
- *
- * A CI instance comes with an RSA key. However, of course, the default key has no
- * privileges in Spine repositories. Thus, we add our own RSA key — `deploy_rsa_key`.
- * It must have `write` rights in the associated repository.
- * Also, we don't want that key to be used for anything else but GitHub Pages publishing.
- *
- * Thus, we configure the SSH agent to use the `deploy_rsa_key`
- * only for specific references, namely in `github.com-publish`.
- */
- private fun gitHubKey(): File {
- val gitHubAccessKey = File("${rootFolder.absolutePath}/deploy_key_rsa")
-
- if (!gitHubAccessKey.exists()) {
- throw GradleException(
- "File $gitHubAccessKey does not exist. It should be encrypted" +
- " in the repository and decrypted on CI."
- )
+ logDebug {
+ "Storing the new version of `$toolName` documentation in `${versionedDocDir}`."
}
- return gitHubAccessKey
+ copyDocs(generatedDocs, versionedDocDir)
}
+}
- private fun sshConfigFile(): File {
- val sshConfigFile = File("${System.getProperty("user.home")}/.ssh/config")
- if (!sshConfigFile.exists()) {
- val parentDir = sshConfigFile.canonicalFile.parentFile
- parentDir.mkdirs()
- sshConfigFile.createNewFile()
- }
- return sshConfigFile
- }
+private class UpdateJavadoc(
+ project: Project,
+ docsSourceFolder: Path,
+ repository: Repository,
+ logger: Logger
+) : UpdateDocumentation(project, docsSourceFolder, repository, logger) {
+
+ override val docsDestinationFolder: String
+ get() = "reference"
+ override val toolName: String
+ get() = "Javadoc"
+}
- /** Executes a command in the project [rootFolder]. */
- private fun execute(vararg command: String): String = Cli(rootFolder).execute(*command)
+private class UpdateDokka(
+ project: Project,
+ docsSourceFolder: Path,
+ repository: Repository,
+ logger: Logger
+) : UpdateDocumentation(project, docsSourceFolder, repository, logger) {
+
+ override val docsDestinationFolder: String
+ get() = "dokka-reference"
+ override val toolName: String
+ get() = "Dokka"
}
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/github/pages/UpdateGitHubPages.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/github/pages/UpdateGitHubPages.kt
index e3c1e6ce9..ba8c2900a 100644
--- a/buildSrc/src/main/kotlin/io/spine/internal/gradle/github/pages/UpdateGitHubPages.kt
+++ b/buildSrc/src/main/kotlin/io/spine/internal/gradle/github/pages/UpdateGitHubPages.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2022, TeamDev. All rights reserved.
+ * Copyright 2023, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -26,7 +26,9 @@
package io.spine.internal.gradle.github.pages
+import dokkaHtmlTask
import io.spine.internal.gradle.fs.LazyTempPath
+import io.spine.internal.gradle.github.pages.TaskName.copyDokka
import io.spine.internal.gradle.github.pages.TaskName.copyJavadoc
import io.spine.internal.gradle.github.pages.TaskName.updateGitHubPages
import io.spine.internal.gradle.isSnapshot
@@ -41,21 +43,24 @@ import org.gradle.api.tasks.TaskContainer
import org.gradle.api.tasks.TaskProvider
/**
- * Registers the `updateGitHubPages` task which performs the update of the GitHub Pages
- * with the Javadoc generated for a particular Gradle project. The generated documentation
- * is appended to the `spine.io` site via GitHub pages by pushing commits to the `gh-pages` branch.
+ * Registers the `updateGitHubPages` task which performs the update of the GitHub
+ * Pages with the documentation generated by Javadoc and Dokka for a particular
+ * Gradle project. The generated documentation is appended to the `spine.io` site
+ * via GitHub pages by pushing commits to the `gh-pages` branch.
*
- * Please note that the update is only performed for the projects which are NOT snapshots.
+ * Please note that the update is only performed for the projects which are
+ * NOT snapshots.
*
- * Users may supply [allowInternalJavadoc][UpdateGitHubPagesExtension.allowInternalJavadoc] option,
- * which if `true`, includes the documentation for types marked `@Internal`.
- * By default, this option is `false`.
+ * Users may supply [allowInternalJavadoc][UpdateGitHubPagesExtension.allowInternalJavadoc]
+ * to configure documentation generated by Javadoc. The documentation for the code
+ * marked `@Internal` is included when the option is set to `true`. By default, this
+ * option is `false`.
*
* Usage:
* ```
* updateGitHubPages {
*
- * // Include `@Internal`-annotated types.
+ * // Include `@Internal`-annotated code.
* allowInternalJavadoc.set(true)
*
* // Propagate the full path to the local folder of the repository root.
@@ -63,25 +68,26 @@ import org.gradle.api.tasks.TaskProvider
* }
* ```
*
- * In order to work, the script needs a `deploy_key_rsa` private RSA key file in the repository
- * root. It is recommended to decrypt it in the repository and then decrypt it on CI upon
- * publication. Also, the script uses the `FORMAL_GIT_HUB_PAGES_AUTHOR` environment variable to
- * set the author email for the commits. The `gh-pages` branch itself should exist before the plugin
- * is run.
+ * In order to work, the script needs a `deploy_key_rsa` private RSA key file in the
+ * repository root. It is recommended to encrypt it in the repository and then decrypt
+ * it on CI upon publication. Also, the script uses the `FORMAL_GIT_HUB_PAGES_AUTHOR`
+ * environment variable to set the author email for the commits. The `gh-pages`
+ * branch itself should exist before the plugin is run.
*
* NOTE: when changing the value of "FORMAL_GIT_HUB_PAGES_AUTHOR", one also must change
- * the SSH private (encrypted `deploy_key_rsa`) and the public ("GitHub Pages publisher (Travis CI)"
- * on GitHub) keys.
+ * the SSH private (encrypted `deploy_key_rsa`) and the public
+ * ("GitHub Pages publisher" on GitHub) keys.
*
- * Another requirement is an environment variable `REPO_SLUG`, which is set by the CI environment,
- * such as `Publish` GitHub Actions workflow. It points to the repository for which the update
- * is executed. E.g.:
+ * Another requirement is an environment variable `REPO_SLUG`, which is set by the CI
+ * environment, such as `Publish` GitHub Actions workflow. It points to the repository
+ * for which the update is executed. E.g.:
*
* ```
* REPO_SLUG: SpineEventEngine/base
* ```
*
- * @see UpdateGitHubPagesExtension for the extension which is used to configure this plugin
+ * @see UpdateGitHubPagesExtension for the extension which is used to configure
+ * this plugin
*/
class UpdateGitHubPages : Plugin {
@@ -98,24 +104,25 @@ class UpdateGitHubPages : Plugin {
private lateinit var includedInputs: Set
/**
- * Path to the temp folder used to gather the Javadoc output
- * before submitting it to the GitHub Pages update.
+ * Path to the temp folder used to gather the Javadoc output before submitting it
+ * to the GitHub Pages update.
*/
- internal val javadocOutputPath = LazyTempPath("javadoc")
+ internal val javadocOutputFolder = LazyTempPath("javadoc")
/**
- * Path to the temp folder used checkout the original GitHub Pages branch.
+ * Path to the temp folder used to gather the documentation generated by Dokka
+ * before submitting it to the GitHub Pages update.
*/
- internal val checkoutTempFolder = LazyTempPath("repoTemp")
+ internal val dokkaOutputFolder = LazyTempPath("dokka")
/**
* Applies the plugin to the specified [project].
*
* If the project version says it is a snapshot, the plugin registers a no-op task.
*
- * Even in such a case, the extension object is still created in the given project, to allow
- * customization of the parameters in its build script, for later usage when the project
- * version changes to non-snapshot.
+ * Even in such a case, the extension object is still created in the given project
+ * to allow customization of the parameters in its build script for later usage
+ * when the project version changes to non-snapshot.
*/
override fun apply(project: Project) {
val extension = UpdateGitHubPagesExtension.createIn(project)
@@ -129,32 +136,53 @@ class UpdateGitHubPages : Plugin {
}
}
+ /**
+ * Registers `updateGitHubPages` task which performs no actual update, but prints
+ * the message telling the update is skipped, since the project is in
+ * its `SNAPSHOT` version.
+ */
+ private fun Project.registerNoOpTask() {
+ tasks.register(updateGitHubPages) {
+ doLast {
+ val project = this@registerNoOpTask
+ println(
+ "GitHub Pages update will be skipped since this project is a snapshot: " +
+ "`${project.name}-${project.version}`."
+ )
+ }
+ }
+ }
+
private fun Project.registerTasks(extension: UpdateGitHubPagesExtension) {
val allowInternalJavadoc = extension.allowInternalJavadoc()
rootFolder = extension.rootFolder()
includedInputs = extension.includedInputs()
+
if (!allowInternalJavadoc) {
val doclet = ExcludeInternalDoclet(extension.excludeInternalDocletVersion)
doclet.registerTaskIn(this)
}
+
tasks.registerCopyJavadoc(allowInternalJavadoc)
+ tasks.registerCopyDokka()
+
val updatePagesTask = tasks.registerUpdateTask()
updatePagesTask.configure {
dependsOn(copyJavadoc)
+ dependsOn(copyDokka)
}
}
private fun TaskContainer.registerCopyJavadoc(allowInternalJavadoc: Boolean) {
- val inputs = composeInputs(allowInternalJavadoc)
+ val inputs = composeJavadocInputs(allowInternalJavadoc)
+
register(copyJavadoc, Copy::class.java) {
- doLast {
- from(*inputs.toTypedArray())
- into(javadocOutputPath)
- }
+ inputs.forEach { from(it) }
+ into(javadocOutputFolder)
}
}
- private fun TaskContainer.composeInputs(allowInternalJavadoc: Boolean): MutableList {
+ private fun TaskContainer.composeJavadocInputs(allowInternalJavadoc: Boolean): List {
val inputs = mutableListOf()
if (allowInternalJavadoc) {
inputs.add(javadocTask())
@@ -165,6 +193,26 @@ class UpdateGitHubPages : Plugin {
return inputs
}
+ private fun TaskContainer.registerCopyDokka() {
+ val inputs = composeDokkaInputs()
+
+ register(copyDokka, Copy::class.java) {
+ inputs.forEach { from(it) }
+ into(dokkaOutputFolder)
+ }
+ }
+
+ private fun TaskContainer.composeDokkaInputs(): List {
+ val inputs = mutableListOf()
+
+ dokkaHtmlTask()?.let {
+ inputs.add(it)
+ }
+ inputs.addAll(includedInputs)
+
+ return inputs
+ }
+
private fun TaskContainer.registerUpdateTask(): TaskProvider {
return register(updateGitHubPages) {
doLast {
@@ -178,25 +226,9 @@ class UpdateGitHubPages : Plugin {
}
private fun cleanup() {
- val folders = listOf(checkoutTempFolder, javadocOutputPath)
+ val folders = listOf(dokkaOutputFolder, javadocOutputFolder)
folders.forEach {
it.toFile().deleteRecursively()
}
}
}
-
-/**
- * Registers `updateGitHubPages` task which performs no actual update, but prints the message
- * telling the update is skipped, since the project is in its `SNAPSHOT` version.
- */
-private fun Project.registerNoOpTask() {
- tasks.register(updateGitHubPages) {
- doLast {
- val project = this@registerNoOpTask
- println(
- "GitHub Pages update will be skipped since this project is a snapshot: " +
- "`${project.name}-${project.version}`."
- )
- }
- }
-}
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/github/pages/UpdateGitHubPagesExtension.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/github/pages/UpdateGitHubPagesExtension.kt
index ec654fbf7..d523d5e9e 100644
--- a/buildSrc/src/main/kotlin/io/spine/internal/gradle/github/pages/UpdateGitHubPagesExtension.kt
+++ b/buildSrc/src/main/kotlin/io/spine/internal/gradle/github/pages/UpdateGitHubPagesExtension.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2022, TeamDev. All rights reserved.
+ * Copyright 2023, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -54,7 +54,8 @@ class UpdateGitHubPagesExtension
private constructor(
/**
- * Tells whether the types marked `@Internal` should be included into the doc generation.
+ * Tells whether the types marked `@Internal` should be included into
+ * the doc generation.
*/
val allowInternalJavadoc: Property,
@@ -64,10 +65,11 @@ private constructor(
var rootFolder: Property,
/**
- * The external inputs, which output should be included
- * into the GitHub Pages update.
+ * The external inputs, which output should be included into
+ * the GitHub Pages update.
*
- * The values are interpreted according to [org.gradle.api.tasks.Copy.from] specification.
+ * The values are interpreted according to
+ * [org.gradle.api.tasks.Copy.from] specification.
*
* This property is optional.
*/
@@ -80,8 +82,8 @@ private constructor(
* used when updating documentation at GitHub Pages.
*
* This value is used when adding dependency on the doclet when the plugin tasks
- * are registered. Since the doclet dependency is required, its value passed as a parameter for
- * the extension, rather than a property.
+ * are registered. Since the doclet dependency is required, its value passed as
+ * a parameter for the extension, rather than a property.
*/
internal lateinit var excludeInternalDocletVersion: String
@@ -104,23 +106,24 @@ private constructor(
}
/**
- * Returns `true` if the `@Internal`-annotated types should be included into the generated
- * documentation, `false` otherwise.
+ * Returns `true` if the `@Internal`-annotated code should be included into the
+ * generated documentation, `false` otherwise.
*/
fun allowInternalJavadoc(): Boolean {
return allowInternalJavadoc.get()
}
/**
- * Returns the local root folder of the repository, to which the handled Gradle Project belongs.
+ * Returns the local root folder of the repository, to which the handled Gradle
+ * Project belongs.
*/
fun rootFolder(): File {
return rootFolder.get()
}
/**
- * Returns the external inputs, which results should be included
- * into the GitHub Pages update.
+ * Returns the external inputs, which results should be included into the
+ * GitHub Pages update.
*/
fun includedInputs(): Set {
return includeInputs.get()
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/java/Tasks.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/java/Tasks.kt
index 8f2344feb..3e0aad9d0 100644
--- a/buildSrc/src/main/kotlin/io/spine/internal/gradle/java/Tasks.kt
+++ b/buildSrc/src/main/kotlin/io/spine/internal/gradle/java/Tasks.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2022, TeamDev. All rights reserved.
+ * Copyright 2023, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/javac/ErrorProne.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/javac/ErrorProne.kt
index df31e581a..1489c0895 100644
--- a/buildSrc/src/main/kotlin/io/spine/internal/gradle/javac/ErrorProne.kt
+++ b/buildSrc/src/main/kotlin/io/spine/internal/gradle/javac/ErrorProne.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2022, TeamDev. All rights reserved.
+ * Copyright 2023, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -82,6 +82,7 @@ private object ErrorProneConfig {
"-Xep:CheckReturnValue:OFF",
"-Xep:FloggerSplitLogStatement:OFF",
+ "-Xep:FloggerLogString:OFF"
)
}
}
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/javac/Javac.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/javac/Javac.kt
index 839252d63..de0268749 100644
--- a/buildSrc/src/main/kotlin/io/spine/internal/gradle/javac/Javac.kt
+++ b/buildSrc/src/main/kotlin/io/spine/internal/gradle/javac/Javac.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2022, TeamDev. All rights reserved.
+ * Copyright 2023, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/javadoc/Encoding.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/javadoc/Encoding.kt
index f71296834..bf8601b9a 100644
--- a/buildSrc/src/main/kotlin/io/spine/internal/gradle/javadoc/Encoding.kt
+++ b/buildSrc/src/main/kotlin/io/spine/internal/gradle/javadoc/Encoding.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2022, TeamDev. All rights reserved.
+ * Copyright 2023, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/javadoc/ExcludeInternalDoclet.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/javadoc/ExcludeInternalDoclet.kt
index 72d7f6a1b..4d5702bfe 100644
--- a/buildSrc/src/main/kotlin/io/spine/internal/gradle/javadoc/ExcludeInternalDoclet.kt
+++ b/buildSrc/src/main/kotlin/io/spine/internal/gradle/javadoc/ExcludeInternalDoclet.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2022, TeamDev. All rights reserved.
+ * Copyright 2023, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -26,6 +26,7 @@
package io.spine.internal.gradle.javadoc
+import io.spine.internal.dependency.Spine
import io.spine.internal.gradle.javadoc.ExcludeInternalDoclet.Companion.taskName
import io.spine.internal.gradle.sourceSets
import org.gradle.api.Project
@@ -36,9 +37,13 @@ import org.gradle.external.javadoc.StandardJavadocDocletOptions
/**
* The doclet which removes Javadoc for `@Internal` things in the Java code.
*/
-class ExcludeInternalDoclet(val version: String) {
+@Suppress("ConstPropertyName")
+class ExcludeInternalDoclet(
+ @Deprecated("`Spine.ArtifactVersion.javadocTools` is used instead.")
+ val version: String = Spine.ArtifactVersion.javadocTools
+) {
- private val dependency = "io.spine.tools:spine-javadoc-filter:${version}"
+ private val dependency = Spine.javadocFilter
companion object {
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/javadoc/JavadocConfig.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/javadoc/JavadocConfig.kt
index f6002cad5..debd78d3f 100644
--- a/buildSrc/src/main/kotlin/io/spine/internal/gradle/javadoc/JavadocConfig.kt
+++ b/buildSrc/src/main/kotlin/io/spine/internal/gradle/javadoc/JavadocConfig.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2022, TeamDev. All rights reserved.
+ * Copyright 2023, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -43,9 +43,9 @@ object JavadocConfig {
/**
* Link to the documentation for Java 11 Standard Library API.
*
- * OpenJDK SE 11 is used for the reference.
+ * Oracle JDK SE 11 is used for the reference.
*/
- private const val standardLibraryAPI = "https://cr.openjdk.java.net/~iris/se/11/latestSpec/api/"
+ private const val standardLibraryAPI = "https://docs.oracle.com/en/java/javase/11/docs/api/"
@Suppress("MemberVisibilityCanBePrivate") // opened to be visible from docs.
val tags = listOf(
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/javadoc/JavadocTag.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/javadoc/JavadocTag.kt
index 2a278bd92..8eb8b17c3 100644
--- a/buildSrc/src/main/kotlin/io/spine/internal/gradle/javadoc/JavadocTag.kt
+++ b/buildSrc/src/main/kotlin/io/spine/internal/gradle/javadoc/JavadocTag.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2022, TeamDev. All rights reserved.
+ * Copyright 2023, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/javadoc/TaskContainerExtensions.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/javadoc/TaskContainerExtensions.kt
index f80d53ee1..3897118c7 100644
--- a/buildSrc/src/main/kotlin/io/spine/internal/gradle/javadoc/TaskContainerExtensions.kt
+++ b/buildSrc/src/main/kotlin/io/spine/internal/gradle/javadoc/TaskContainerExtensions.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2022, TeamDev. All rights reserved.
+ * Copyright 2023, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/javascript/JsContext.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/javascript/JsContext.kt
index 8754173f5..75cd40114 100644
--- a/buildSrc/src/main/kotlin/io/spine/internal/gradle/javascript/JsContext.kt
+++ b/buildSrc/src/main/kotlin/io/spine/internal/gradle/javascript/JsContext.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2022, TeamDev. All rights reserved.
+ * Copyright 2023, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/javascript/JsEnvironment.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/javascript/JsEnvironment.kt
index f2d10aca0..bce4fa8f3 100644
--- a/buildSrc/src/main/kotlin/io/spine/internal/gradle/javascript/JsEnvironment.kt
+++ b/buildSrc/src/main/kotlin/io/spine/internal/gradle/javascript/JsEnvironment.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2022, TeamDev. All rights reserved.
+ * Copyright 2023, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/javascript/JsExtension.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/javascript/JsExtension.kt
index 4fe1d3ffa..22ebf5217 100644
--- a/buildSrc/src/main/kotlin/io/spine/internal/gradle/javascript/JsExtension.kt
+++ b/buildSrc/src/main/kotlin/io/spine/internal/gradle/javascript/JsExtension.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2022, TeamDev. All rights reserved.
+ * Copyright 2023, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/javascript/plugin/Idea.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/javascript/plugin/Idea.kt
index 51d312c84..5e51155ad 100644
--- a/buildSrc/src/main/kotlin/io/spine/internal/gradle/javascript/plugin/Idea.kt
+++ b/buildSrc/src/main/kotlin/io/spine/internal/gradle/javascript/plugin/Idea.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2022, TeamDev. All rights reserved.
+ * Copyright 2023, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -49,7 +49,7 @@ fun JsPlugins.idea() {
module {
sourceDirs.add(srcDir)
- testSourceDirs.add(testSrcDir)
+ testSources.from(testSrcDir)
excludeDirs.addAll(
listOf(
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/javascript/plugin/JsPlugins.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/javascript/plugin/JsPlugins.kt
index 6a17820da..60a088a98 100644
--- a/buildSrc/src/main/kotlin/io/spine/internal/gradle/javascript/plugin/JsPlugins.kt
+++ b/buildSrc/src/main/kotlin/io/spine/internal/gradle/javascript/plugin/JsPlugins.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2022, TeamDev. All rights reserved.
+ * Copyright 2023, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/javascript/plugin/McJs.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/javascript/plugin/McJs.kt
index 56b1263a9..2d0150c4d 100644
--- a/buildSrc/src/main/kotlin/io/spine/internal/gradle/javascript/plugin/McJs.kt
+++ b/buildSrc/src/main/kotlin/io/spine/internal/gradle/javascript/plugin/McJs.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2022, TeamDev. All rights reserved.
+ * Copyright 2023, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -46,12 +46,15 @@ fun JsPlugins.mcJs() {
// Currently, it is not possible to obtain `McJsPlugin` on the classpath of `buildSrc`.
// See issue: https://github.com/SpineEventEngine/config/issues/298
- project.withGroovyBuilder {
- "protoJs" {
- setProperty("generatedMainDir", genProtoMain)
- setProperty("generatedTestDir", genProtoTest)
- }
- }
+ // TODO: this piece does not work. Try a different approach.
+// project.withGroovyBuilder {
+// "modelCompiler" {
+// "js" {
+// setProperty("generatedMainDir", genProtoMain)
+// setProperty("generatedTestDir", genProtoTest)
+// }
+// }
+// }
}
/**
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/javascript/plugin/Protobuf.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/javascript/plugin/Protobuf.kt
index d99d2a288..9957b86de 100644
--- a/buildSrc/src/main/kotlin/io/spine/internal/gradle/javascript/plugin/Protobuf.kt
+++ b/buildSrc/src/main/kotlin/io/spine/internal/gradle/javascript/plugin/Protobuf.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2022, TeamDev. All rights reserved.
+ * Copyright 2023, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -26,11 +26,8 @@
package io.spine.internal.gradle.javascript.plugin
-import com.google.protobuf.gradle.builtins
-import com.google.protobuf.gradle.generateProtoTasks
+import com.google.protobuf.gradle.ProtobufExtension
import com.google.protobuf.gradle.id
-import com.google.protobuf.gradle.protobuf
-import com.google.protobuf.gradle.protoc
import com.google.protobuf.gradle.remove
import io.spine.internal.dependency.Protobuf
@@ -50,12 +47,13 @@ fun JsPlugins.protobuf() {
apply(Protobuf.GradlePlugin.id)
}
- project.protobuf {
+ val protobufExt = project.extensions.getByType(ProtobufExtension::class.java)
+ protobufExt.apply {
- generatedFilesBaseDir = projectDir.path
+ generatedFilesBaseDir = projectDir.resolve("generated").path
protoc {
- artifact = Protobuf.compiler
+ artifact = Protobuf.JsRenderingProtoc.compiler
}
generateProtoTasks {
@@ -63,8 +61,7 @@ fun JsPlugins.protobuf() {
task.builtins {
- // Do not use java builtin output in this project.
-
+ // Do not use `java` builtin in this project.
remove("java")
// For information on JavaScript code generation please see
@@ -72,10 +69,12 @@ fun JsPlugins.protobuf() {
id("js") {
option("import_style=commonjs")
- outputSubDir = genProtoDirName
+ outputSubDir = "js"
}
}
+ println(" -- Setting the JS output dir to ${task.outputBaseDir}/js --")
+
val sourceSet = task.sourceSet.name
val testClassifier = if (sourceSet == "test") "_test" else ""
val artifact = "${project.group}_${project.name}_${moduleVersion}"
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/javascript/task/Assemble.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/javascript/task/Assemble.kt
index dbc770dfd..473930768 100644
--- a/buildSrc/src/main/kotlin/io/spine/internal/gradle/javascript/task/Assemble.kt
+++ b/buildSrc/src/main/kotlin/io/spine/internal/gradle/javascript/task/Assemble.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2022, TeamDev. All rights reserved.
+ * Copyright 2023, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/javascript/task/Check.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/javascript/task/Check.kt
index 4fdd69f92..c15f3e238 100644
--- a/buildSrc/src/main/kotlin/io/spine/internal/gradle/javascript/task/Check.kt
+++ b/buildSrc/src/main/kotlin/io/spine/internal/gradle/javascript/task/Check.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2022, TeamDev. All rights reserved.
+ * Copyright 2023, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/javascript/task/Clean.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/javascript/task/Clean.kt
index 6658b830f..468059170 100644
--- a/buildSrc/src/main/kotlin/io/spine/internal/gradle/javascript/task/Clean.kt
+++ b/buildSrc/src/main/kotlin/io/spine/internal/gradle/javascript/task/Clean.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2022, TeamDev. All rights reserved.
+ * Copyright 2023, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/javascript/task/IntegrationTest.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/javascript/task/IntegrationTest.kt
index fadcc09cb..cf94995d7 100644
--- a/buildSrc/src/main/kotlin/io/spine/internal/gradle/javascript/task/IntegrationTest.kt
+++ b/buildSrc/src/main/kotlin/io/spine/internal/gradle/javascript/task/IntegrationTest.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2022, TeamDev. All rights reserved.
+ * Copyright 2023, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -26,10 +26,10 @@
package io.spine.internal.gradle.javascript.task
+import io.spine.internal.gradle.TaskName
import io.spine.internal.gradle.base.build
import io.spine.internal.gradle.named
import io.spine.internal.gradle.register
-import io.spine.internal.gradle.TaskName
import org.gradle.api.Task
import org.gradle.api.tasks.TaskContainer
import org.gradle.api.tasks.TaskProvider
@@ -74,6 +74,7 @@ val TaskContainer.integrationTest: TaskProvider
* }
* ```
*/
+@Suppress("unused")
fun JsTasks.integrationTest() {
linkSpineWebModule()
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/javascript/task/JsTasks.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/javascript/task/JsTasks.kt
index b384fd3a5..b13d996d0 100644
--- a/buildSrc/src/main/kotlin/io/spine/internal/gradle/javascript/task/JsTasks.kt
+++ b/buildSrc/src/main/kotlin/io/spine/internal/gradle/javascript/task/JsTasks.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2022, TeamDev. All rights reserved.
+ * Copyright 2023, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/javascript/task/LicenseReport.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/javascript/task/LicenseReport.kt
index 99935edd6..2a868d4ac 100644
--- a/buildSrc/src/main/kotlin/io/spine/internal/gradle/javascript/task/LicenseReport.kt
+++ b/buildSrc/src/main/kotlin/io/spine/internal/gradle/javascript/task/LicenseReport.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2022, TeamDev. All rights reserved.
+ * Copyright 2023, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -54,6 +54,7 @@ import org.gradle.api.tasks.TaskProvider
* }
* ```
*/
+@Suppress("unused")
fun JsTasks.licenseReport() {
npmLicenseReport().also {
generateLicenseReport.configure {
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/javascript/task/Publish.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/javascript/task/Publish.kt
index 486d831ce..01a67f5c0 100644
--- a/buildSrc/src/main/kotlin/io/spine/internal/gradle/javascript/task/Publish.kt
+++ b/buildSrc/src/main/kotlin/io/spine/internal/gradle/javascript/task/Publish.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2022, TeamDev. All rights reserved.
+ * Copyright 2023, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/javascript/task/Webpack.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/javascript/task/Webpack.kt
index cbf3aaefb..99da3f1d8 100644
--- a/buildSrc/src/main/kotlin/io/spine/internal/gradle/javascript/task/Webpack.kt
+++ b/buildSrc/src/main/kotlin/io/spine/internal/gradle/javascript/task/Webpack.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2022, TeamDev. All rights reserved.
+ * Copyright 2023, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -26,9 +26,9 @@
package io.spine.internal.gradle.javascript.task
+import io.spine.internal.gradle.TaskName
import io.spine.internal.gradle.named
import io.spine.internal.gradle.register
-import io.spine.internal.gradle.TaskName
import org.gradle.api.tasks.Copy
import org.gradle.api.tasks.TaskContainer
import org.gradle.api.tasks.TaskProvider
@@ -63,6 +63,7 @@ import org.gradle.api.tasks.TaskProvider
* }
* ```
*/
+@Suppress("unused")
fun JsTasks.webpack() {
assembleJs.configure {
@@ -92,6 +93,7 @@ private val copyBundledJsName = TaskName.of("copyBundledJs", Copy::class)
*
* The task copies bundled JavaScript sources to the publication directory.
*/
+@Suppress("unused")
val TaskContainer.copyBundledJs: TaskProvider
get() = named(copyBundledJsName)
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/kotlin/KotlinConfig.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/kotlin/KotlinConfig.kt
index 863ea4626..b2964cee2 100644
--- a/buildSrc/src/main/kotlin/io/spine/internal/gradle/kotlin/KotlinConfig.kt
+++ b/buildSrc/src/main/kotlin/io/spine/internal/gradle/kotlin/KotlinConfig.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2022, TeamDev. All rights reserved.
+ * Copyright 2023, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -27,7 +27,6 @@
package io.spine.internal.gradle.kotlin
import org.gradle.jvm.toolchain.JavaLanguageVersion
-import org.gradle.jvm.toolchain.JavaToolchainSpec
import org.jetbrains.kotlin.gradle.dsl.KotlinJvmProjectExtension
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
@@ -37,7 +36,7 @@ import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
*/
fun KotlinJvmProjectExtension.applyJvmToolchain(version: Int) {
jvmToolchain {
- (this as JavaToolchainSpec).languageVersion.set(JavaLanguageVersion.of(version))
+ languageVersion.set(JavaLanguageVersion.of(version))
}
}
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/protobuf/ProtoTaskExtensions.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/protobuf/ProtoTaskExtensions.kt
index 79c2a1640..0c4c8b419 100644
--- a/buildSrc/src/main/kotlin/io/spine/internal/gradle/protobuf/ProtoTaskExtensions.kt
+++ b/buildSrc/src/main/kotlin/io/spine/internal/gradle/protobuf/ProtoTaskExtensions.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2022, TeamDev. All rights reserved.
+ * Copyright 2023, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -27,93 +27,316 @@
package io.spine.internal.gradle.protobuf
import com.google.protobuf.gradle.GenerateProtoTask
+import io.spine.internal.gradle.sourceSets
import java.io.File
+import java.nio.file.Files
+import java.nio.file.StandardOpenOption.TRUNCATE_EXISTING
+import org.gradle.api.Project
+import org.gradle.api.file.SourceDirectorySet
+import org.gradle.api.tasks.SourceSet
import org.gradle.configurationcache.extensions.capitalized
import org.gradle.kotlin.dsl.get
+import org.gradle.plugins.ide.idea.GenerateIdeaModule
+import org.gradle.plugins.ide.idea.model.IdeaModel
+import org.gradle.plugins.ide.idea.model.IdeaModule
+import org.jetbrains.kotlin.gradle.dsl.KotlinCompile
/**
- * Configures protobuf code generation task.
+ * Obtains the name of the `generated` directory under the project root directory.
+ */
+private val Project.generatedDir: String
+ get() = "${projectDir}/generated"
+
+/**
+ * Obtains the `generated` directory for the source set of the task.
*
- * The task configuration consists of the following steps.
+ * If [language] is specified returns the subdirectory for this language.
+ */
+private fun GenerateProtoTask.generatedDir(language: String = ""): File {
+ val path = "${project.generatedDir}/${sourceSet.name}/$language"
+ return File(path)
+}
+
+/**
+ * Configures protobuf code generation task for the code which cannot use Spine Model Compiler
+ * (e.g. the `base` project).
+ *
+ * The task configuration consists of the following steps:
+ *
+ * 1. Adding `"kotlin"` to the list of involved `protoc` builtins.
*
- * 1. Generation of descriptor set file is turned op for each source set.
+ * 2. Generation of descriptor set file is turned on for each source set.
* These files are placed under the `build/descriptors` directory.
*
- * 2. At the final steps of the code generation, the code belonging to
- * the `com.google` package is removed.
+ * 3. Removing source code generated for `com.google` package for both Java and Kotlin.
+ * This is done at the final steps of the code generation.
*
- * 3. Make `processResource` tasks depend on corresponding `generateProto` tasks.
+ * 4. Making `processResource` tasks depend on corresponding `generateProto` tasks.
* If the source set of the configured task isn't `main`, appropriate infix for
* the task names is used.
*
* The usage of this extension in a module build file would be:
* ```
- * val generatedDir by extra("$projectDir/generated")
* protobuf {
* generateProtoTasks {
* for (task in all()) {
- * task.setup(generatedDir)
+ * task.setup()
* }
* }
* }
* ```
- * Using the same code under `subprojects` in a root build file does not seem work because
+ * Using the same code under `subprojects` in a root build file does not seem to work because
* test descriptor set files are not copied to resources. Performing this configuration from
- * subprojects solves the issue.
+ * a module build script solves the issue.
+ *
+ * IMPORTANT: In addition to calling `setup`, a submodule must contain a descriptor set reference
+ * file (`desc.ref`) files placed under `resources`. The descriptor reference file must contain
+ * a reference to the descriptor set file generated by the corresponding `GenerateProtoTask`.
+ *
+ * For example, for the `test` source set, the reference would be `known_types_test.desc`, and
+ * for the `main` source set, the reference would be `known_types_main.desc`.
+ *
+ * See `io.spine.code.proto.DescriptorReference` and `io.spine.code.proto.FileDescriptors` classes
+ * under the `base` project for more details.
*/
@Suppress("unused")
-fun GenerateProtoTask.setup(generatedDir: String) {
+fun GenerateProtoTask.setup() {
+ builtins.maybeCreate("kotlin")
+ setupDescriptorSetFileCreation()
+ doLast {
+ copyGeneratedFiles()
+ }
+ excludeProtocOutput()
+ setupKotlinCompile()
+ dependOnProcessResourcesTask()
+ configureIdeaDirs()
+}
- /**
- * Generate descriptor set files.
- */
+/**
+ * Tell `protoc` to generate descriptor set files under the project build dir.
+ *
+ * The name of the descriptor set file to be generated
+ * is made to be unique per project's Maven coordinates.
+ *
+ * As the last step of this task, writes a `desc.ref` file
+ * for the contextual source set, pointing to the generated descriptor set file.
+ * This is needed in order to allow other Spine libraries
+ * to locate and load the generated descriptor set files properly.
+ *
+ * Such a job is usually performed by Spine McJava plugin,
+ * however, it is not possible to use this plugin (or its code)
+ * in this repository due to cyclic dependencies.
+ */
+@Suppress(
+ "TooGenericExceptionCaught" /* Handling all file-writing failures in the same way.*/)
+private fun GenerateProtoTask.setupDescriptorSetFileCreation() {
+ // Tell `protoc` generate descriptor set file.
+ // The name of the generated file reflects project's Maven coordinates.
val ssn = sourceSet.name
generateDescriptorSet = true
+ val descriptorsDir = "${project.buildDir}/descriptors/${ssn}"
+ val descriptorName = project.descriptorSetName(sourceSet)
with(descriptorSetOptions) {
- path = "${project.buildDir}/descriptors/${ssn}/known_types_${ssn}.desc"
+ path = "$descriptorsDir/$descriptorName"
includeImports = true
includeSourceInfo = true
}
- /**
- * Remove the code generated for Google Protobuf library types.
- *
- * Java code for the `com.google` package was generated because we wanted
- * to have descriptors for all the types, including those from Google Protobuf library.
- * We want all the descriptors so that they are included into the resources used by
- * the `io.spine.type.KnownTypes` class.
- *
- * Now, as we have the descriptors _and_ excessive Java code, we delete it to avoid
- * classes that duplicate those coming from Protobuf library JARs.
- */
- doLast {
- val comPackage = File("${generatedDir}/${ssn}/java/com")
- val googlePackage = comPackage.resolve("google")
-
- project.delete(googlePackage)
+ // Make the descriptor set file included into the resources.
+ project.sourceSets.named(ssn) {
+ resources.srcDirs(descriptorsDir)
+ }
- // We don't need an empty `com` package.
- if (comPackage.exists() && comPackage.list()?.isEmpty() == true) {
- project.delete(comPackage)
+ // Create a `desc.ref` in the same resource folder,
+ // with the name of the descriptor set file created above.
+ this.doLast {
+ val descRefFile = File(descriptorsDir, "desc.ref")
+ descRefFile.createNewFile()
+ try {
+ Files.write(descRefFile.toPath(), setOf(descriptorName), TRUNCATE_EXISTING)
+ } catch (e: Exception) {
+ project.logger.error("Error writing `${descRefFile.absolutePath}`.", e)
+ throw e
}
}
+}
+
+/**
+ * Returns a name of the descriptor file for the given [sourceSet],
+ * reflecting the Maven coordinates of Gradle artifact, and the source set
+ * for which the descriptor set name is to be generated.
+ *
+ * The returned value is just a file name, and does not contain a file path.
+ */
+private fun Project.descriptorSetName(sourceSet: SourceSet) =
+ arrayOf(
+ group.toString(),
+ name,
+ sourceSet.name,
+ version.toString()
+ ).joinToString(separator = "_", postfix = ".desc")
+
+/**
+ * Copies files from the [outputBaseDir][GenerateProtoTask.outputBaseDir] into
+ * a subdirectory of [generatedDir][Project.generatedDir] for
+ * the current [sourceSet][GenerateProtoTask.sourceSet].
+ *
+ * Also removes sources belonging to the `com.google` package in the target directory.
+ */
+private fun GenerateProtoTask.copyGeneratedFiles() {
+ project.copy {
+ from(outputBaseDir)
+ into(generatedDir())
+ }
+ deleteComGoogle("java")
+ deleteComGoogle("kotlin")
+}
+
+/**
+ * Remove the code generated for Google Protobuf library types.
+ *
+ * Java code for the `com.google` package was generated because we wanted
+ * to have descriptors for all the types, including those from Google Protobuf library.
+ * We want all the descriptors so that they are included into the resources used by
+ * the `io.spine.type.KnownTypes` class.
+ *
+ * Now, as we have the descriptors _and_ excessive Java or Kotlin code, we delete it to avoid
+ * classes that duplicate those coming from Protobuf library JARs.
+ */
+private fun GenerateProtoTask.deleteComGoogle(language: String) {
+ val comDirectory = generatedDir(language).resolve("com")
+ val googlePackage = comDirectory.resolve("google")
+
+ project.delete(googlePackage)
+
+ // If the `com` directory becomes empty, delete it too.
+ if (comDirectory.exists() && comDirectory.isDirectory && comDirectory.list()!!.isEmpty()) {
+ project.delete(comDirectory)
+ }
+}
+
+/**
+ * Exclude [GenerateProtoTask.outputBaseDir] from Java source set directories to avoid
+ * duplicated source code files.
+ */
+private fun GenerateProtoTask.excludeProtocOutput() {
+ val protocOutputDir = File(outputBaseDir).parentFile
+ val java: SourceDirectorySet = sourceSet.java
+
+ // Filter out directories belonging to `build/generated/source/proto`.
+ val newSourceDirectories = java.sourceDirectories
+ .filter { !it.residesIn(protocOutputDir) }
+ .toSet()
+ java.setSrcDirs(listOf())
+ java.srcDirs(newSourceDirectories)
+
+ // Add copied files to the Java source set.
+ java.srcDir(generatedDir("java"))
+ java.srcDir(generatedDir("kotlin"))
+}
+
+/**
+ * Make sure Kotlin compilation explicitly depends on this `GenerateProtoTask` to avoid racing.
+ */
+private fun GenerateProtoTask.setupKotlinCompile() {
+ val kotlinCompile = project.kotlinCompileFor(sourceSet)
+ kotlinCompile?.dependsOn(this)
+}
- /**
- * Make the tasks `processResources` depend on `generateProto` tasks explicitly so that:
- * 1) descriptor set files get into resources, avoiding the racing conditions
- * during the build.
- * 2) we don't have the warning "Execution optimizations have been disabled..." issued
- * by Gradle during the build because Protobuf Gradle Plugin does not set
- * dependencies between `generateProto` and `processResources` tasks.
- */
- val processResources = processResourceTaskName(ssn)
+/**
+ * Make the tasks `processResources` depend on `generateProto` tasks explicitly so that:
+ * 1) Descriptor set files get into resources, avoiding the racing conditions
+ * during the build.
+ *
+ * 2) We don't have the warning "Execution optimizations have been disabled..." issued
+ * by Gradle during the build because Protobuf Gradle Plugin does not set
+ * dependencies between `generateProto` and `processResources` tasks.
+ */
+private fun GenerateProtoTask.dependOnProcessResourcesTask() {
+ val processResources = processResourceTaskName(sourceSet.name)
project.tasks[processResources].dependsOn(this)
}
/**
- * Obtains the name of the task `processResource` task for the given source set name.
+ * Obtains the name of the `processResource` task for the given source set name.
*/
-fun processResourceTaskName(sourceSetName: String): String {
+private fun processResourceTaskName(sourceSetName: String): String {
val infix = if (sourceSetName == "main") "" else sourceSetName.capitalized()
return "process${infix}Resources"
}
+
+/**
+ * Attempts to obtain the Kotlin compilation Gradle task for the given source set.
+ *
+ * Typically, the task is named by a pattern: `compileKotlin`, or just
+ * `compileKotlin` if the source set name is `"main"`. If the task does not fit this described
+ * pattern, this method will not find it.
+ */
+private fun Project.kotlinCompileFor(sourceSet: SourceSet): KotlinCompile<*>? {
+ val taskName = sourceSet.getCompileTaskName("Kotlin")
+ return tasks.findByName(taskName) as KotlinCompile<*>?
+}
+
+private fun File.residesIn(directory: File): Boolean =
+ canonicalFile.startsWith(directory.absolutePath)
+
+private fun GenerateProtoTask.configureIdeaDirs() = project.plugins.withId("idea") {
+ val module = project.extensions.findByType(IdeaModel::class.java)!!.module
+
+ // Make IDEA forget about sources under `outputBaseDir`.
+ val protocOutputDir = File(outputBaseDir).parentFile
+ module.generatedSourceDirs.removeIf { dir ->
+ dir.residesIn(protocOutputDir)
+ }
+
+ module.sourceDirs.removeIf { dir ->
+ dir.residesIn(protocOutputDir)
+ }
+
+ val javaDir = generatedDir("java")
+ val kotlinDir = generatedDir("kotlin")
+
+ // As advised by `Utils.groovy` from Protobuf Gradle plugin:
+ // This is required because the IntelliJ IDEA plugin does not allow adding source directories
+ // that do not exist. The IntelliJ IDEA config files should be valid from the start even if
+ // a user runs './gradlew idea' before running './gradlew generateProto'.
+ project.tasks.withType(GenerateIdeaModule::class.java).forEach {
+ it.doFirst {
+ javaDir.mkdirs()
+ kotlinDir.mkdirs()
+ }
+ }
+
+ if (isTest) {
+ module.testSources.run {
+ from(javaDir)
+ from(kotlinDir)
+ }
+ } else {
+ module.sourceDirs.run {
+ add(javaDir)
+ add(kotlinDir)
+ }
+ }
+
+ module.generatedSourceDirs.run {
+ add(javaDir)
+ add(kotlinDir)
+ }
+}
+
+/**
+ * Prints diagnostic output of `sourceDirs` and `generatedSourceDirs` of an [IdeaModule].
+ *
+ * The warning `"unused"` is suppressed because this function is not used in
+ * the production mode.
+ */
+@Suppress("unused")
+private fun IdeaModule.printSourceDirectories() {
+ println("**** [IDEA] Source directories:")
+ sourceDirs.forEach { println(it) }
+ println()
+ println("**** [IDEA] Generated source directories:")
+ generatedSourceDirs.forEach { println(it) }
+ println()
+}
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/publish/Artifacts.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/publish/Artifacts.kt
deleted file mode 100644
index e6860cdd8..000000000
--- a/buildSrc/src/main/kotlin/io/spine/internal/gradle/publish/Artifacts.kt
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- * Copyright 2022, TeamDev. All rights reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Redistribution and use in source and/or binary forms, with or without
- * modification, must retain the above copyright notice and the following
- * disclaimer.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-package io.spine.internal.gradle.publish
-
-import io.spine.internal.gradle.sourceSets
-import org.gradle.api.Project
-import org.gradle.api.file.FileTreeElement
-import org.gradle.api.tasks.TaskContainer
-import org.gradle.api.tasks.TaskProvider
-import org.gradle.api.tasks.bundling.Jar
-import org.gradle.kotlin.dsl.get
-import org.gradle.kotlin.dsl.named
-import org.gradle.kotlin.dsl.register
-import org.gradle.kotlin.dsl.withType
-
-/**
- * Excludes Google `.proto` sources from all artifacts.
- *
- * Goes through all registered `Jar` tasks and filters out Google's files.
- */
-@Suppress("unused")
-fun TaskContainer.excludeGoogleProtoFromArtifacts() {
- withType().configureEach {
- exclude { it.isGoogleProtoSource() }
- }
-}
-
-/**
- * Checks if the given file belongs to the Google `.proto` sources.
- */
-private fun FileTreeElement.isGoogleProtoSource(): Boolean {
- val pathSegments = relativePath.segments
- return pathSegments.isNotEmpty() && pathSegments[0].equals("google")
-}
-
-/**
- * Locates or creates `sourcesJar` task in this [Project].
- *
- * The output of this task is a `jar` archive. The archive contains sources from `main` source set.
- * The task makes sure that sources from the directories below will be included into
- * a resulted archive:
- *
- * - Kotlin
- * - Java
- * - Proto
- *
- * Java and Kotlin sources are default to `main` source set since it is created by `java` plugin.
- * For Proto sources to be included – [special treatment][protoSources] is needed.
- */
-internal fun Project.sourcesJar() = tasks.getOrCreate("sourcesJar") {
- archiveClassifier.set("sources")
- from(sourceSets["main"].allSource) // Puts Java and Kotlin sources.
- from(protoSources()) // Puts Proto sources.
-}
-
-/**
- * Locates or creates `protoJar` task in this [Project].
- *
- * The output of this task is a `jar` archive. The archive contains only
- * [Proto sources][protoSources] from `main` source set.
- */
-internal fun Project.protoJar() = tasks.getOrCreate("protoJar") {
- archiveClassifier.set("proto")
- from(protoSources())
-}
-
-/**
- * Locates or creates `testJar` task in this [Project].
- *
- * The output of this task is a `jar` archive. The archive contains compilation output
- * of `test` source set.
- */
-internal fun Project.testJar() = tasks.getOrCreate("testJar") {
- archiveClassifier.set("test")
- from(sourceSets["test"].output)
-}
-
-/**
- * Locates or creates `javadocJar` task in this [Project].
- *
- * The output of this task is a `jar` archive. The archive contains Javadoc,
- * generated upon Java sources from `main` source set. If javadoc for Kotlin is also needed,
- * apply Dokka plugin. It tunes `javadoc` task to generate docs upon Kotlin sources as well.
- */
-internal fun Project.javadocJar() = tasks.getOrCreate("javadocJar") {
- archiveClassifier.set("javadoc")
- from(files("$buildDir/docs/javadoc"))
- dependsOn("javadoc")
-}
-
-/**
- * Locates or creates `dokkaJar` task in this [Project].
- *
- * The output of this task is a `jar` archive. The archive contains the Dokka output, generated upon
- * Java sources from `main` source set. Requires Dokka to be configured in the target project by
- * applying `dokka-for-java` plugin.
- */
-internal fun Project.dokkaJar() = tasks.getOrCreate("dokkaJar") {
- archiveClassifier.set("dokka")
- from(files("$buildDir/docs/dokka"))
- dependsOn("dokkaHtml")
-}
-
-private fun TaskContainer.getOrCreate(name: String, init: Jar.() -> Unit): TaskProvider =
- if (names.contains(name)) {
- named(name)
- } else {
- register(name) {
- init()
- }
- }
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/publish/CheckVersionIncrement.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/publish/CheckVersionIncrement.kt
index aa4da982b..a81cbdcd8 100644
--- a/buildSrc/src/main/kotlin/io/spine/internal/gradle/publish/CheckVersionIncrement.kt
+++ b/buildSrc/src/main/kotlin/io/spine/internal/gradle/publish/CheckVersionIncrement.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2022, TeamDev. All rights reserved.
+ * Copyright 2023, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -56,7 +56,7 @@ open class CheckVersionIncrement : DefaultTask() {
val version: String = project.version as String
@TaskAction
- private fun fetchAndCheck() {
+ fun fetchAndCheck() {
val artifact = "${project.artifactPath()}/${MavenMetadata.FILE_NAME}"
checkInRepo(repository.snapshots, artifact)
@@ -119,7 +119,7 @@ private data class MavenMetadata(var versioning: Versioning = Versioning()) {
return try {
val metadata = mapper.readValue(url, MavenMetadata::class.java)
metadata
- } catch (e: FileNotFoundException) {
+ } catch (ignored: FileNotFoundException) {
null
}
}
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/publish/CloudArtifactRegistry.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/publish/CloudArtifactRegistry.kt
index 143ea25cc..4751d5608 100644
--- a/buildSrc/src/main/kotlin/io/spine/internal/gradle/publish/CloudArtifactRegistry.kt
+++ b/buildSrc/src/main/kotlin/io/spine/internal/gradle/publish/CloudArtifactRegistry.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2022, TeamDev. All rights reserved.
+ * Copyright 2023, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/publish/CloudRepo.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/publish/CloudRepo.kt
index 48cd85855..148ebce99 100644
--- a/buildSrc/src/main/kotlin/io/spine/internal/gradle/publish/CloudRepo.kt
+++ b/buildSrc/src/main/kotlin/io/spine/internal/gradle/publish/CloudRepo.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2022, TeamDev. All rights reserved.
+ * Copyright 2023, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/publish/GitHubPackages.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/publish/GitHubPackages.kt
index 3d5518d89..fef068219 100644
--- a/buildSrc/src/main/kotlin/io/spine/internal/gradle/publish/GitHubPackages.kt
+++ b/buildSrc/src/main/kotlin/io/spine/internal/gradle/publish/GitHubPackages.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2022, TeamDev. All rights reserved.
+ * Copyright 2023, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -28,6 +28,7 @@ package io.spine.internal.gradle.publish
import io.spine.internal.gradle.Credentials
import io.spine.internal.gradle.Repository
+import net.lingala.zip4j.ZipFile
import org.gradle.api.Project
/**
@@ -73,22 +74,31 @@ private fun Project.credentialsWithToken(githubActor: String) = Credentials(
private fun Project.readGitHubToken(): String {
val githubToken: String? = System.getenv("GITHUB_TOKEN")
return if (githubToken.isNullOrEmpty()) {
- // Use the personal access token for the `developers@spine.io` account.
- // Only has the permission to read public GitHub packages.
- val targetDir = "${buildDir}/token"
- file(targetDir).mkdirs()
- val fileToUnzip = "${rootDir}/buildSrc/aus.weis"
-
- logger.info("GitHub Packages: reading token " +
- "by unzipping `$fileToUnzip` into `$targetDir`.")
- exec {
- // Unzip with password "123", allow overriding, quietly,
- // into the target dir, the given archive.
- commandLine("unzip", "-P", "123", "-oq", "-d", targetDir, fileToUnzip)
- }
- val file = file("$targetDir/token.txt")
- file.readText()
+ readTokenFromArchive()
} else {
githubToken
}
}
+
+/**
+ * Read the personal access token for the `developers@spine.io` account which
+ * has only the permission to read public GitHub packages.
+ *
+ * The token is extracted from the archive called `aus.weis` stored under `buildSrc`.
+ * The archive has such an unusual name to avoid scanning for tokens placed in repositories
+ * which is performed by GitHub. Since we do not violate any security, it is OK to
+ * use such a workaround.
+ */
+private fun Project.readTokenFromArchive(): String {
+ val targetDir = "${buildDir}/token"
+ file(targetDir).mkdirs()
+ val fileToUnzip = "${rootDir}/buildSrc/aus.weis"
+
+ logger.info(
+ "GitHub Packages: reading token by unzipping `$fileToUnzip` into `$targetDir`."
+ )
+ ZipFile(fileToUnzip, "123".toCharArray()).extractAll(targetDir)
+ val file = file("$targetDir/token.txt")
+ val result = file.readText()
+ return result
+}
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/publish/IncrementGuard.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/publish/IncrementGuard.kt
index 0423ee088..b97a5ee50 100644
--- a/buildSrc/src/main/kotlin/io/spine/internal/gradle/publish/IncrementGuard.kt
+++ b/buildSrc/src/main/kotlin/io/spine/internal/gradle/publish/IncrementGuard.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2022, TeamDev. All rights reserved.
+ * Copyright 2023, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -73,20 +73,36 @@ class IncrementGuard : Plugin {
* to a feature branch.
*
* Returns `false` if the associated reference is not a branch (e.g. a tag) or if it has
- * the name which ends with `master`. So, on branches such as `master` and `2.x-jdk8-master`
- * this method would return `false`.
+ * the name which ends with `master` or `main`.
+ *
+ * For example, on the following branches the method would return `false`:
+ *
+ * 1. `master`.
+ * 2. `main`.
+ * 3. `2.x-jdk8-master`.
+ * 4. `2.x-jdk8-main`.
*
* @see
* List of default environment variables provided for GitHub Actions builds
*/
private fun shouldCheckVersion(): Boolean {
- val eventName = System.getenv("GITHUB_EVENT_NAME")
- if ("push" != eventName) {
+ val event = System.getenv("GITHUB_EVENT_NAME")
+ val reference = System.getenv("GITHUB_REF")
+ if (event != "push" || reference == null) {
return false
}
- val reference = System.getenv("GITHUB_REF") ?: return false
- val matches = Regex("refs/heads/(.+)").matchEntire(reference) ?: return false
- val branch = matches.groupValues[1]
- return !branch.endsWith("master")
+ val branch = branchName(reference)
+ return when {
+ branch == null -> false
+ branch.endsWith("master") -> false
+ branch.endsWith("main") -> false
+ else -> true
+ }
+ }
+
+ private fun branchName(gitHubRef: String): String? {
+ val matches = Regex("refs/heads/(.+)").matchEntire(gitHubRef)
+ val branch = matches?.let { it.groupValues[1] }
+ return branch
}
}
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/publish/JarDsl.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/publish/JarDsl.kt
new file mode 100644
index 000000000..2bc287033
--- /dev/null
+++ b/buildSrc/src/main/kotlin/io/spine/internal/gradle/publish/JarDsl.kt
@@ -0,0 +1,167 @@
+/*
+ * Copyright 2023, TeamDev. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Redistribution and use in source and/or binary forms, with or without
+ * modification, must retain the above copyright notice and the following
+ * disclaimer.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package io.spine.internal.gradle.publish
+
+/**
+ * A DSL element of [SpinePublishing] extension which configures publishing of
+ * [dokkaKotlinJar] artifact.
+ *
+ * This artifact contains Dokka-generated documentation. By default, it is not published.
+ *
+ * Take a look at the [SpinePublishing.dokkaJar] for a usage example.
+ *
+ * @see [artifacts]
+ */
+class DokkaJar {
+ /**
+ * Enables publishing `JAR`s with Dokka-generated documentation for all published modules.
+ */
+ @Suppress("unused")
+ @Deprecated("Please use `kotlin` and `java` flags instead.")
+ var enabled = false
+
+ /**
+ * Controls whether [dokkaKotlinJar] artifact should be published.
+ * The default value is `true`.
+ */
+ var kotlin = true
+
+ /**
+ * Controls whether [dokkaJavaJar] artifact should be published.
+ * The default value is `false`.
+ */
+ var java = false
+}
+
+/**
+ * A DSL element of [SpinePublishing] extension which allows enabling publishing
+ * of [testJar] artifact.
+ *
+ * This artifact contains compilation output of `test` source set. By default, it is not published.
+ *
+ * Take a look on [SpinePublishing.testJar] for a usage example.
+
+ * @see [artifacts]
+ */
+class TestJar {
+
+ /**
+ * Set of modules, for which a test JAR will be published.
+ */
+ var inclusions: Set = emptySet()
+
+ /**
+ * Enables test JAR publishing for all published modules.
+ */
+ var enabled = false
+}
+
+/**
+ * A DSL element of [SpinePublishing] extension which allows disabling publishing
+ * of [protoJar] artifact.
+ *
+ * This artifact contains all the `.proto` definitions from `sourceSets.main.proto`. By default,
+ * it is published.
+ *
+ * Take a look on [SpinePublishing.protoJar] for a usage example.
+ *
+ * @see [artifacts]
+ */
+class ProtoJar {
+
+ /**
+ * Set of modules, for which a proto JAR will not be published.
+ */
+ var exclusions: Set = emptySet()
+
+ /**
+ * Disables proto JAR publishing for all published modules.
+ */
+ var disabled = false
+}
+
+/**
+ * Flags for turning optional JAR artifacts in a project.
+ */
+internal data class JarFlags(
+
+ /**
+ * Tells whether [sourcesJar] artifact should be published.
+ *
+ * Default value is `true`.
+ */
+ val sourcesJar: Boolean = true,
+
+ /**
+ * Tells whether [javadocJar] artifact should be published.
+ *
+ * Default value is `true`.
+ */
+ val javadocJar: Boolean = true,
+
+ /**
+ * Tells whether [protoJar] artifact should be published.
+ */
+ val publishProtoJar: Boolean,
+
+ /**
+ * Tells whether [testJar] artifact should be published.
+ */
+ val publishTestJar: Boolean,
+
+ /**
+ * Tells whether [dokkaKotlinJar] artifact should be published.
+ */
+ val publishDokkaKotlinJar: Boolean,
+
+ /**
+ * Tells whether [dokkaJavaJar] artifact should be published.
+ */
+ val publishDokkaJavaJar: Boolean
+) {
+ internal companion object {
+ /**
+ * Creates an instance of [JarFlags] for the project with the given name,
+ * taking the setup parameters from JAR DSL elements.
+ */
+ fun create(
+ projectName: String,
+ protoJar: ProtoJar,
+ testJar: TestJar,
+ dokkaJar: DokkaJar
+ ): JarFlags {
+ val addProtoJar = (protoJar.exclusions.contains(projectName) || protoJar.disabled).not()
+ val addTestJar = testJar.inclusions.contains(projectName) || testJar.enabled
+ return JarFlags(
+ sourcesJar = true,
+ javadocJar = true,
+ addProtoJar, addTestJar,
+ dokkaJar.kotlin, dokkaJar.java
+ )
+ }
+ }
+}
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/publish/MavenJavaPublication.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/publish/MavenJavaPublication.kt
deleted file mode 100644
index cb5fa2f0d..000000000
--- a/buildSrc/src/main/kotlin/io/spine/internal/gradle/publish/MavenJavaPublication.kt
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * Copyright 2022, TeamDev. All rights reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Redistribution and use in source and/or binary forms, with or without
- * modification, must retain the above copyright notice and the following
- * disclaimer.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-package io.spine.internal.gradle.publish
-
-import io.spine.internal.gradle.Repository
-import io.spine.internal.gradle.isSnapshot
-import org.gradle.api.Project
-import org.gradle.api.artifacts.dsl.RepositoryHandler
-import org.gradle.api.publish.PublishingExtension
-import org.gradle.api.publish.maven.MavenPublication
-import org.gradle.api.tasks.TaskProvider
-import org.gradle.api.tasks.bundling.Jar
-import org.gradle.kotlin.dsl.create
-import org.gradle.kotlin.dsl.get
-import org.gradle.kotlin.dsl.getByType
-
-/**
- * A publication for a typical Java project.
- *
- * In Gradle, in order to publish something somewhere one should create a publication.
- * A publication has a name and consists of one or more artifacts plus information about
- * those artifacts – the metadata.
- *
- * An instance of this class represents [MavenPublication] named "mavenJava". It is generally
- * accepted that a publication with this name contains a Java project published to one or
- * more Maven repositories.
- *
- * By default, only a jar with the compilation output of `main` source set and its
- * metadata files are published. Other artifacts are specified through the
- * [constructor parameter][jars]. Please, take a look on [specifyArtifacts] for additional info.
- *
- * See: [Maven Publish Plugin | Publications](https://docs.gradle.org/current/userguide/publishing_maven.html#publishing_maven:publications)
- *
- * @param artifactId a name that a project is known by.
- * @param jars list of artifacts to be published along with the compilation output.
- * @param destinations Maven repositories to which the produced artifacts will be sent.
- */
-internal class MavenJavaPublication(
- private val artifactId: String,
- private val jars: Set>,
- private val destinations: Set,
-) {
-
- /**
- * Registers this publication in the given project.
- *
- * The only prerequisite for the project is to have `maven-publish` plugin applied.
- */
- fun registerIn(project: Project) {
- createPublication(project)
- registerDestinations(project)
- }
-
- /**
- * Creates a new "mavenJava" [MavenPublication] in the given project.
- */
- private fun createPublication(project: Project) {
- val gradlePublishing = project.extensions.getByType()
- val gradlePublications = gradlePublishing.publications
- gradlePublications.create("mavenJava") {
- specifyMavenCoordinates(project)
- specifyArtifacts(project)
- }
- }
-
- private fun MavenPublication.specifyMavenCoordinates(project: Project) {
- groupId = project.group.toString()
- artifactId = this@MavenJavaPublication.artifactId
- version = project.version.toString()
- }
-
- /**
- * Specifies which artifacts this [MavenPublication] will contain.
- *
- * A typical Maven publication contains:
- *
- * 1. Jar archives. For example: compilation output, sources, javadoc, etc.
- * 2. Maven metadata file that has ".pom" extension.
- * 3. Gradle metadata file that has ".module" extension.
- *
- * Metadata files contain information about a publication itself, its artifacts and their
- * dependencies. Presence of ".pom" file is mandatory for publication to be consumed by
- * `mvn` build tool itself or other build tools that understand Maven notation (Gradle, Ivy).
- * Presence of ".module" is optional, but useful when a publication is consumed by Gradle.
- *
- * See: [Maven – POM Reference](https://maven.apache.org/pom.html)
- * [Understanding Gradle Module Metadata](https://docs.gradle.org/current/userguide/publishing_gradle_module_metadata.html)
- */
- private fun MavenPublication.specifyArtifacts(project: Project) {
-
- // "java" component provides a jar with compilation output of "main" source set.
- // It is NOT defined as another `Jar` task intentionally. Doing that will leave the
- // publication without correct ".pom" and ".module" metadata files generated.
- from(project.components["java"])
-
- // Other artifacts are represented by `Jar` tasks. Those artifacts don't bring any other
- // metadata in comparison with `Component` (such as dependencies notation).
- jars.forEach {
- artifact(it)
- }
- }
-
- /**
- * Goes through the [destinations] and registers each as a repository for publishing
- * in the given Gradle project.
- */
- private fun registerDestinations(project: Project) {
- val gradlePublishing = project.extensions.getByType()
- val isSnapshot = project.version.toString().isSnapshot()
- val gradleRepositories = gradlePublishing.repositories
- destinations.forEach { destination ->
- gradleRepositories.register(destination, isSnapshot, project)
- }
- }
-
- private fun RepositoryHandler.register(
- repository: Repository,
- isSnapshot: Boolean,
- project: Project
- ) {
- val target = if (isSnapshot) repository.snapshots else repository.releases
- val credentials = repository.credentials(project.rootProject)
- maven {
- url = project.uri(target)
- credentials {
- username = credentials?.username
- password = credentials?.password
- }
- }
- }
-}
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/publish/ProtoExts.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/publish/ProtoExts.kt
new file mode 100644
index 000000000..97e33197f
--- /dev/null
+++ b/buildSrc/src/main/kotlin/io/spine/internal/gradle/publish/ProtoExts.kt
@@ -0,0 +1,89 @@
+/*
+ * Copyright 2023, TeamDev. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Redistribution and use in source and/or binary forms, with or without
+ * modification, must retain the above copyright notice and the following
+ * disclaimer.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package io.spine.internal.gradle.publish
+
+import io.spine.internal.gradle.sourceSets
+import java.io.File
+import org.gradle.api.Project
+import org.gradle.api.Task
+import org.gradle.api.file.FileTreeElement
+import org.gradle.api.file.SourceDirectorySet
+import org.gradle.api.tasks.bundling.Jar
+
+/**
+ * Tells whether there are any Proto sources in "main" source set.
+ */
+internal fun Project.hasProto(): Boolean {
+ val protoSources = protoSources()
+ val result = protoSources.any { it.exists() }
+ return result
+}
+
+/**
+ * Locates directories with proto sources under the "main" source sets.
+ *
+ * Special treatment for Proto sources is needed, because they are not Java-related, and,
+ * thus, not included in `sourceSets["main"].allSource`.
+ */
+internal fun Project.protoSources(): Set {
+ val mainSourceSets = sourceSets.filter {
+ ss -> ss.name.endsWith("main", ignoreCase = true)
+ }
+
+ val protoExtensions = mainSourceSets.mapNotNull {
+ it.extensions.findByName("proto") as SourceDirectorySet?
+ }
+
+ val protoDirs = mutableSetOf()
+ protoExtensions.forEach {
+ protoDirs.addAll(it.srcDirs)
+ }
+
+ return protoDirs
+}
+
+/**
+ * Checks if the given file belongs to the Google `.proto` sources.
+ */
+internal fun FileTreeElement.isGoogleProtoSource(): Boolean {
+ val pathSegments = relativePath.segments
+ return pathSegments.isNotEmpty() && pathSegments[0].equals("google")
+}
+
+/**
+ * The reference to the `generateProto` task of a `main` source set.
+ */
+internal fun Project.generateProto(): Task? = tasks.findByName("generateProto")
+
+/**
+ * Makes this [Jar] task depend on the [generateProto] task, if it exists in the same project.
+ */
+internal fun Jar.dependOnGenerateProto() {
+ project.generateProto()?.let {
+ this.dependsOn(it)
+ }
+}
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/publish/Publications.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/publish/Publications.kt
new file mode 100644
index 000000000..be3bc0efc
--- /dev/null
+++ b/buildSrc/src/main/kotlin/io/spine/internal/gradle/publish/Publications.kt
@@ -0,0 +1,212 @@
+/*
+ * Copyright 2023, TeamDev. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Redistribution and use in source and/or binary forms, with or without
+ * modification, must retain the above copyright notice and the following
+ * disclaimer.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package io.spine.internal.gradle.publish
+
+import io.spine.internal.gradle.Repository
+import io.spine.internal.gradle.isSnapshot
+import org.gradle.api.Project
+import org.gradle.api.artifacts.dsl.RepositoryHandler
+import org.gradle.api.publish.maven.MavenPublication
+import org.gradle.api.tasks.TaskProvider
+import org.gradle.api.tasks.bundling.Jar
+import org.gradle.kotlin.dsl.apply
+import org.gradle.kotlin.dsl.create
+
+/**
+ * The name of the Maven Publishing Gradle plugin.
+ */
+private const val MAVEN_PUBLISH = "maven-publish"
+
+/**
+ * Abstract base for handlers of publications in a project
+ * with [spinePublishing] settings declared.
+ */
+internal sealed class PublicationHandler(
+ protected val project: Project,
+ private val destinations: Set
+) {
+
+ fun apply() = with(project) {
+ if (!hasCustomPublishing) {
+ apply(plugin = MAVEN_PUBLISH)
+ }
+
+ pluginManager.withPlugin(MAVEN_PUBLISH) {
+ handlePublications()
+ registerDestinations()
+ configurePublishTask(destinations)
+ }
+ }
+
+ /**
+ * Either handles publications already declared in the given project,
+ * or creates new ones.
+ */
+ abstract fun handlePublications()
+
+ /**
+ * Goes through the [destinations] and registers each as a repository for publishing
+ * in the given Gradle project.
+ */
+ private fun registerDestinations() {
+ val repositories = project.publishingExtension.repositories
+ destinations.forEach { destination ->
+ repositories.register(project, destination)
+ }
+ }
+
+ /**
+ * Takes a group name and a version from the given [project] and assigns
+ * them to this publication.
+ */
+ protected fun MavenPublication.assignMavenCoordinates() {
+ groupId = project.group.toString()
+ artifactId = project.spinePublishing.artifactPrefix + artifactId
+ version = project.version.toString()
+ }
+}
+
+/**
+ * Adds a Maven repository to the project specifying credentials, if they are
+ * [available][Repository.credentials] from the root project.
+ */
+private fun RepositoryHandler.register(project: Project, repository: Repository) {
+ val isSnapshot = project.version.toString().isSnapshot()
+ val target = if (isSnapshot) repository.snapshots else repository.releases
+ val credentials = repository.credentials(project.rootProject)
+ maven {
+ url = project.uri(target)
+ credentials {
+ username = credentials?.username
+ password = credentials?.password
+ }
+ }
+}
+
+/**
+ * A publication for a typical Java project.
+ *
+ * In Gradle, in order to publish something somewhere one should create a publication.
+ * A publication has a name and consists of one or more artifacts plus information about
+ * those artifacts – the metadata.
+ *
+ * An instance of this class represents [MavenPublication] named "mavenJava". It is generally
+ * accepted that a publication with this name contains a Java project published to one or
+ * more Maven repositories.
+ *
+ * By default, only a jar with the compilation output of `main` source set and its
+ * metadata files are published. Other artifacts are specified through the
+ * [constructor parameter][jarFlags]. Please, take a look on [specifyArtifacts] for additional info.
+ *
+ * @param jarFlags
+ * flags for additional JARs published along with the compilation output.
+ * @param destinations
+ * Maven repositories to which the produced artifacts will be sent.
+ * @see
+ * Maven Publish Plugin | Publications
+ */
+internal class StandardJavaPublicationHandler(
+ project: Project,
+ private val jarFlags: JarFlags,
+ destinations: Set,
+) : PublicationHandler(project, destinations) {
+
+ /**
+ * Creates a new "mavenJava" [MavenPublication] in the given project.
+ */
+ override fun handlePublications() {
+ val jars = project.artifacts(jarFlags)
+ val publications = project.publications
+ publications.create("mavenJava") {
+ assignMavenCoordinates()
+ specifyArtifacts(jars)
+ }
+ }
+
+ /**
+ * Specifies which artifacts this [MavenPublication] will contain.
+ *
+ * A typical Maven publication contains:
+ *
+ * 1. Jar archives. For example: compilation output, sources, javadoc, etc.
+ * 2. Maven metadata file that has ".pom" extension.
+ * 3. Gradle's metadata file that has ".module" extension.
+ *
+ * Metadata files contain information about a publication itself, its artifacts and their
+ * dependencies. Presence of ".pom" file is mandatory for publication to be consumed by
+ * `mvn` build tool itself or other build tools that understand Maven notation (Gradle, Ivy).
+ * Presence of ".module" is optional, but useful when a publication is consumed by Gradle.
+ *
+ * @see Maven – POM Reference
+ * @see
+ * Understanding Gradle Module Metadata
+ */
+ private fun MavenPublication.specifyArtifacts(jars: Set>) {
+
+ /* "java" component provides a jar with compilation output of "main" source set.
+ It is NOT defined as another `Jar` task intentionally. Doing that will leave the
+ publication without correct ".pom" and ".module" metadata files generated.
+ */
+ val javaComponent = project.components.findByName("java")
+ javaComponent?.let {
+ from(it)
+ }
+
+ /* Other artifacts are represented by `Jar` tasks. Those artifacts don't bring any other
+ metadata in comparison with `Component` (such as dependencies notation).
+ */
+ jars.forEach {
+ artifact(it)
+ }
+ }
+}
+
+/**
+ * A handler for custom publications, which are declared under the [publications]
+ * section of a module.
+ *
+ * Such publications should be treated differently than [StandardJavaPublicationHandler],
+ * which is created for a module. Instead, since the publications are already declared,
+ * this class only [assigns maven coordinates][assignMavenCoordinates].
+ *
+ * A module which declares custom publications must be specified in
+ * the [SpinePublishing.modulesWithCustomPublishing] property.
+ *
+ * If a module with [publications] declared locally is not specified as one with custom publishing,
+ * it may cause a name clash between an artifact produced by the [standard][MavenPublication]
+ * publication, and custom ones. In order to have both standard and custom publications,
+ * please specify custom artifact IDs or classifiers for each custom publication.
+ */
+internal class CustomPublicationHandler(project: Project, destinations: Set) :
+ PublicationHandler(project, destinations) {
+
+ override fun handlePublications() {
+ project.publications.forEach {
+ (it as MavenPublication).assignMavenCoordinates()
+ }
+ }
+}
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/publish/PublishingConfig.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/publish/PublishingConfig.kt
deleted file mode 100644
index f2f252e0d..000000000
--- a/buildSrc/src/main/kotlin/io/spine/internal/gradle/publish/PublishingConfig.kt
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * Copyright 2022, TeamDev. All rights reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Redistribution and use in source and/or binary forms, with or without
- * modification, must retain the above copyright notice and the following
- * disclaimer.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-package io.spine.internal.gradle.publish
-
-import io.spine.internal.gradle.Repository
-import org.gradle.api.Project
-import org.gradle.api.tasks.TaskProvider
-import org.gradle.api.tasks.bundling.Jar
-import org.gradle.kotlin.dsl.apply
-
-/**
- * Information, required to set up publishing of a project using `maven-publish` plugin.
- *
- * @param artifactId a name that a project is known by.
- * @param destinations set of repositories, to which the resulting artifacts will be sent.
- * @param includeProtoJar tells whether [protoJar] artifact should be published.
- * @param includeTestJar tells whether [testJar] artifact should be published.
- * @param includeDokkaJar tells whether [dokkaJar] artifact should be published.
- */
-internal class PublishingConfig(
- val artifactId: String,
- val destinations: Set,
- val includeProtoJar: Boolean = true,
- val includeTestJar: Boolean = false,
- val includeDokkaJar: Boolean = false
-)
-
-/**
- * Applies this configuration to the given project.
- *
- * This method does the following:
- *
- * 1. Applies `maven-publish` plugin to the project.
- * 2. Registers [MavenJavaPublication] in Gradle's [PublicationContainer][org.gradle.api.publish.PublicationContainer].
- * 4. Configures "publish" task.
- *
- * The actual list of resulted artifacts is determined by [registerArtifacts].
- */
-internal fun PublishingConfig.apply(project: Project) = with(project) {
- apply(plugin = "maven-publish")
- createPublication(project)
- configurePublishTask(destinations)
-}
-
-private fun PublishingConfig.createPublication(project: Project) {
- val artifacts = project.registerArtifacts(includeProtoJar, includeTestJar, includeDokkaJar)
- val publication = MavenJavaPublication(
- artifactId = artifactId,
- jars = artifacts,
- destinations = destinations
- )
- publication.registerIn(project)
-}
-
-/**
- * Registers [Jar] tasks, output of which is used as Maven artifacts.
- *
- * By default, only a jar with java compilation output is included into publication. This method
- * registers tasks which produce additional artifacts.
- *
- * The list of additional artifacts to be registered:
- *
- * 1. [sourcesJar] – Java, Kotlin and Proto source files.
- * 2. [protoJar] – only Proto source files.
- * 3. [javadocJar] – documentation, generated upon Java files.
- * 4. [testJar] – compilation output of "test" source set.
- * 5. [dokkaJar] - documentation generated by Dokka.
- *
- * Registration of [protoJar], [testJar] and [dokkaJar] is optional. It can be controlled by the
- * method's parameters.
- *
- * @return the list of the registered tasks.
- */
-private fun Project.registerArtifacts(
- includeProtoJar: Boolean = true,
- includeTestJar: Boolean = false,
- includeDokkaJar: Boolean = false
-): Set> {
-
- val artifacts = mutableSetOf(
- sourcesJar(),
- javadocJar(),
- )
-
- // We don't want to have an empty "proto.jar" when a project doesn't have any Proto files.
- if (hasProto() && includeProtoJar) {
- artifacts.add(protoJar())
- }
-
- // Here, we don't have the corresponding `hasTests()` check, since this artifact is disabled
- // by default. And turning it on means "We have tests and need them to be published."
- if (includeTestJar) {
- artifacts.add(testJar())
- }
-
- if(includeDokkaJar) {
- artifacts.add(dokkaJar())
- }
-
- return artifacts
-}
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/publish/PublishingExts.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/publish/PublishingExts.kt
new file mode 100644
index 000000000..78e739544
--- /dev/null
+++ b/buildSrc/src/main/kotlin/io/spine/internal/gradle/publish/PublishingExts.kt
@@ -0,0 +1,264 @@
+/*
+ * Copyright 2023, TeamDev. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Redistribution and use in source and/or binary forms, with or without
+ * modification, must retain the above copyright notice and the following
+ * disclaimer.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package io.spine.internal.gradle.publish
+
+import dokkaKotlinJar
+import io.spine.internal.gradle.Repository
+import io.spine.internal.gradle.sourceSets
+import java.util.*
+import org.gradle.api.InvalidUserDataException
+import org.gradle.api.Project
+import org.gradle.api.Task
+import org.gradle.api.publish.PublicationContainer
+import org.gradle.api.publish.PublishingExtension
+import org.gradle.api.tasks.TaskContainer
+import org.gradle.api.tasks.TaskProvider
+import org.gradle.api.tasks.bundling.Jar
+import org.gradle.kotlin.dsl.get
+import org.gradle.kotlin.dsl.getByType
+import org.gradle.kotlin.dsl.named
+import org.gradle.kotlin.dsl.register
+import org.gradle.kotlin.dsl.the
+import org.gradle.kotlin.dsl.withType
+
+/**
+ * Obtains [PublishingExtension] of this project.
+ */
+internal val Project.publishingExtension: PublishingExtension
+ get() = extensions.getByType()
+
+/**
+ * Obtains [PublicationContainer] of this project.
+ */
+internal val Project.publications: PublicationContainer
+ get() = publishingExtension.publications
+
+/**
+ * Obtains [SpinePublishing] extension from the root project.
+ */
+internal val Project.spinePublishing: SpinePublishing
+ get() = this.rootProject.the()
+
+/**
+ * Tells if this project has custom publishing.
+ */
+internal val Project.hasCustomPublishing: Boolean
+ get() = spinePublishing.modulesWithCustomPublishing.contains(name)
+
+private const val PUBLISH_TASK = "publish"
+
+/**
+ * Locates `publish` task in this [TaskContainer].
+ *
+ * This task publishes all defined publications to all defined repositories. To achieve that,
+ * the task depends on all `publish`*PubName*`PublicationTo`*RepoName*`Repository` tasks.
+ *
+ * Please note, task execution would not copy publications to the local Maven cache.
+ *
+ * @see
+ * Tasks | Maven Publish Plugin
+ */
+internal val TaskContainer.publish: TaskProvider
+ get() = named(PUBLISH_TASK)
+
+/**
+ * Sets dependencies for `publish` task in this [Project].
+ *
+ * This method performs the following:
+ *
+ * 1. When this [Project] is not a root, makes `publish` task in a root project
+ * depend on a local `publish`.
+ * 2. Makes local `publish` task verify that credentials are present for each
+ * of destination repositories.
+ */
+internal fun Project.configurePublishTask(destinations: Set) {
+ attachCredentialsVerification(destinations)
+ bindToRootPublish()
+}
+
+private fun Project.attachCredentialsVerification(destinations: Set) {
+ val checkCredentials = tasks.registerCheckCredentialsTask(destinations)
+ val localPublish = tasks.publish
+ localPublish.configure { dependsOn(checkCredentials) }
+}
+
+private fun Project.bindToRootPublish() {
+ if (project == rootProject) {
+ return
+ }
+
+ val localPublish = tasks.publish
+ val rootPublish = rootProject.tasks.getOrCreatePublishTask()
+ rootPublish.configure { dependsOn(localPublish) }
+}
+
+/**
+ * Use this task accessor when it is not guaranteed that the task is present
+ * in this [TaskContainer].
+ */
+private fun TaskContainer.getOrCreatePublishTask(): TaskProvider =
+ if (names.contains(PUBLISH_TASK)) {
+ named(PUBLISH_TASK)
+ } else {
+ register(PUBLISH_TASK)
+ }
+
+private fun TaskContainer.registerCheckCredentialsTask(
+ destinations: Set
+): TaskProvider =
+ register("checkCredentials") {
+ doLast {
+ destinations.forEach { it.ensureCredentials(project) }
+ }
+ }
+
+private fun Repository.ensureCredentials(project: Project) {
+ val credentials = credentials(project)
+ if (Objects.isNull(credentials)) {
+ throw InvalidUserDataException(
+ "No valid credentials for repository `${this}`. Please make sure " +
+ "to pass username/password or a valid `.properties` file."
+ )
+ }
+}
+
+/**
+ * Excludes Google `.proto` sources from all artifacts.
+ *
+ * Goes through all registered `Jar` tasks and filters out Google's files.
+ */
+@Suppress("unused")
+fun TaskContainer.excludeGoogleProtoFromArtifacts() {
+ withType().configureEach {
+ exclude { it.isGoogleProtoSource() }
+ }
+}
+
+/**
+ * Locates or creates `sourcesJar` task in this [Project].
+ *
+ * The output of this task is a `jar` archive. The archive contains sources from `main` source set.
+ * The task makes sure that sources from the directories below will be included into
+ * a resulted archive:
+ *
+ * - Kotlin
+ * - Java
+ * - Proto
+ *
+ * Java and Kotlin sources are default to `main` source set since it is created by `java` plugin.
+ * For Proto sources to be included – [special treatment][protoSources] is needed.
+ */
+internal fun Project.sourcesJar(): TaskProvider = tasks.getOrCreate("sourcesJar") {
+ dependOnGenerateProto()
+ archiveClassifier.set("sources")
+ from(sourceSets["main"].allSource) // Puts Java and Kotlin sources.
+ from(protoSources()) // Puts Proto sources.
+ exclude("desc.ref", "*.desc") // Exclude descriptor files and the descriptor reference.
+}
+
+/**
+ * Locates or creates `protoJar` task in this [Project].
+ *
+ * The output of this task is a `jar` archive. The archive contains only
+ * [Proto sources][protoSources] from `main` source set.
+ */
+internal fun Project.protoJar(): TaskProvider = tasks.getOrCreate("protoJar") {
+ dependOnGenerateProto()
+ archiveClassifier.set("proto")
+ from(protoSources())
+}
+
+/**
+ * Locates or creates `testJar` task in this [Project].
+ *
+ * The output of this task is a `jar` archive. The archive contains compilation output
+ * of `test` source set.
+ */
+internal fun Project.testJar(): TaskProvider = tasks.getOrCreate("testJar") {
+ archiveClassifier.set("test")
+ from(sourceSets["test"].output)
+}
+
+/**
+ * Locates or creates `javadocJar` task in this [Project].
+ *
+ * The output of this task is a `jar` archive. The archive contains Javadoc,
+ * generated upon Java sources from `main` source set. If javadoc for Kotlin is also needed,
+ * apply Dokka plugin. It tunes `javadoc` task to generate docs upon Kotlin sources as well.
+ */
+fun Project.javadocJar(): TaskProvider = tasks.getOrCreate("javadocJar") {
+ archiveClassifier.set("javadoc")
+ from(files("$buildDir/docs/javadoc"))
+ dependsOn("javadoc")
+}
+
+internal fun TaskContainer.getOrCreate(name: String, init: Jar.() -> Unit): TaskProvider =
+ if (names.contains(name)) {
+ named(name)
+ } else {
+ register(name) {
+ init()
+ }
+ }
+
+/**
+ * Obtains as a set of [Jar] tasks, output of which is used as Maven artifacts.
+ *
+ * By default, only a jar with Java compilation output is included into publication. This method
+ * registers tasks which produce additional artifacts according to the values of [jarFlags].
+ *
+ * @return the list of the registered tasks.
+ */
+internal fun Project.artifacts(jarFlags: JarFlags): Set> {
+ val tasks = mutableSetOf>()
+
+ if (jarFlags.sourcesJar) {
+ tasks.add(sourcesJar())
+ }
+
+ if (jarFlags.javadocJar) {
+ tasks.add(javadocJar())
+ }
+
+ // We don't want to have an empty "proto.jar" when a project doesn't have any Proto files.
+ if (hasProto() && jarFlags.publishProtoJar) {
+ tasks.add(protoJar())
+ }
+
+ // Here, we don't have the corresponding `hasTests()` check, since this artifact is disabled
+ // by default. And turning it on means "We have tests and need them to be published."
+ if (jarFlags.publishTestJar) {
+ tasks.add(testJar())
+ }
+
+ if (jarFlags.publishDokkaKotlinJar) {
+ tasks.add(dokkaKotlinJar())
+ }
+
+ return tasks
+}
+
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/publish/PublishingRepos.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/publish/PublishingRepos.kt
index 5abdc10fa..36fcac4da 100644
--- a/buildSrc/src/main/kotlin/io/spine/internal/gradle/publish/PublishingRepos.kt
+++ b/buildSrc/src/main/kotlin/io/spine/internal/gradle/publish/PublishingRepos.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2022, TeamDev. All rights reserved.
+ * Copyright 2023, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -33,14 +33,6 @@ import io.spine.internal.gradle.Repository
*/
object PublishingRepos {
- @Suppress("HttpUrlsUsage") // HTTPS is not supported by this repository.
- val mavenTeamDev = Repository(
- name = "maven.teamdev.com",
- releases = "http://maven.teamdev.com/repository/spine",
- snapshots = "http://maven.teamdev.com/repository/spine-snapshots",
- credentialsFile = "credentials.properties"
- )
-
val cloudRepo = CloudRepo.destination
val cloudArtifactRegistry = CloudArtifactRegistry.repository
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/publish/SpinePublishing.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/publish/SpinePublishing.kt
index 1b10f71e7..09edecd75 100644
--- a/buildSrc/src/main/kotlin/io/spine/internal/gradle/publish/SpinePublishing.kt
+++ b/buildSrc/src/main/kotlin/io/spine/internal/gradle/publish/SpinePublishing.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2022, TeamDev. All rights reserved.
+ * Copyright 2023, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -26,8 +26,12 @@
package io.spine.internal.gradle.publish
+import dokkaJavaJar
+import dokkaKotlinJar
import io.spine.internal.gradle.Repository
import org.gradle.api.Project
+import org.gradle.api.publish.maven.plugins.MavenPublishPlugin
+import org.gradle.kotlin.dsl.apply
import org.gradle.kotlin.dsl.create
import org.gradle.kotlin.dsl.findByType
@@ -71,7 +75,7 @@ import org.gradle.kotlin.dsl.findByType
* `spinePublishing` extension within `subprojectA` itself would lead to an exception.
*
* In Gradle, in order to publish something somewhere one should create a publication. In each
- * of published modules, the extension will create a [publication][MavenJavaPublication]
+ * of published modules, the extension will create a [publication][StandardJavaPublicationHandler]
* named "mavenJava". All artifacts, published by this extension belong to this publication.
*
* By default, along with the compilation output of "main" source set, the extension publishes
@@ -98,17 +102,24 @@ import org.gradle.kotlin.dsl.findByType
* 3. [javadocJar] - javadoc, generated upon Java sources from "main" source set.
* If javadoc for Kotlin is also needed, apply Dokka plugin. It tunes `javadoc` task to generate
* docs upon Kotlin sources as well.
+ * 4. [dokkaKotlinJar] - documentation generated by Dokka for Kotlin and Java sources
+ * using the Kotlin API mode.
+ * 5. [dokkaJavaJar] - documentation generated by Dokka for Kotlin and Java sources
+ * * using the Java API mode.
*
* Additionally, [testJar] artifact can be published. This artifact contains compilation output
* of "test" source set. Use [SpinePublishing.testJar] to enable its publishing.
*
- * @see [registerArtifacts]
+ * @see [artifacts]
*/
-fun Project.spinePublishing(configuration: SpinePublishing.() -> Unit) {
+fun Project.spinePublishing(block: SpinePublishing.() -> Unit) {
+ apply()
val name = SpinePublishing::class.java.simpleName
- val extension = with(extensions) { findByType() ?: create(name, project) }
+ val extension = with(extensions) {
+ findByType() ?: create(name, project)
+ }
extension.run {
- configuration()
+ block()
configured()
}
}
@@ -116,8 +127,9 @@ fun Project.spinePublishing(configuration: SpinePublishing.() -> Unit) {
/**
* A Gradle extension for setting up publishing of spine modules using `maven-publish` plugin.
*
- * @param project a project in which the extension is opened. By default, this project will be
- * published as long as a [set][modules] of modules to publish is not specified explicitly.
+ * @param project
+ * a project in which the extension is opened. By default, this project will be
+ * published as long as a [set][modules] of modules to publish is not specified explicitly.
*
* @see spinePublishing
*/
@@ -140,6 +152,13 @@ open class SpinePublishing(private val project: Project) {
*/
var modules: Set = emptySet()
+ /**
+ * Set of modules that have custom publications and do not need standard ones.
+ *
+ * Empty by default.
+ */
+ var modulesWithCustomPublishing: Set = emptySet()
+
/**
* Set of repositories, to which the resulting artifacts will be sent.
*
@@ -202,7 +221,7 @@ open class SpinePublishing(private val project: Project) {
* implementation("io.spine:spine-client:$version@proto")
* ```
*/
- fun protoJar(configuration: ProtoJar.() -> Unit) = protoJar.run(configuration)
+ fun protoJar(block: ProtoJar.() -> Unit) = protoJar.run(block)
/**
* Allows enabling publishing of [testJar] artifact, containing compilation output
@@ -234,38 +253,42 @@ open class SpinePublishing(private val project: Project) {
* }
* ```
*
- * The resulting artifact is available under "test" classifier. I.e., in Gradle 7+, one could
- * depend on it like this:
+ * The resulting artifact is available under "test" classifier. For example,
+ * in Gradle 7+, one could depend on it like this:
*
* ```
* implementation("io.spine:spine-client:$version@test")
* ```
*/
- fun testJar(configuration: TestJar.() -> Unit) = testJar.run(configuration)
-
+ fun testJar(block: TestJar.() -> Unit) = testJar.run(block)
/**
- * Configures publishing of [dokkaJar] artifact, containing Dokka-generated documentation. By
- * default, publishing of the artifact is disabled.
+ * Configures publishing of [dokkaKotlinJar] and [dokkaJavaJar] artifacts,
+ * containing Dokka-generated documentation.
+ *
+ * By default, publishing of the [dokkaKotlinJar] artifact is enabled, and [dokkaJavaJar]
+ * is disabled.
*
* Remember that the Dokka Gradle plugin should be applied to publish this artifact as it is
* produced by the `dokkaHtml` task. It can be done by using the
* [io.spine.internal.dependency.Dokka] dependency object or by applying the
- * `buildSrc/src/main/kotlin/dokka-for-java` script plugin for Java projects.
+ * `buildSrc/src/main/kotlin/dokka-for-kotlin` or
+ * `buildSrc/src/main/kotlin/dokka-for-java` script plugins.
*
* Here's an example of how to use this option:
*
* ```
* spinePublishing {
* dokkaJar {
- * enabled = true
+ * kotlin = false
+ * java = true
* }
* }
* ```
*
* The resulting artifact is available under "dokka" classifier.
*/
- fun dokkaJar(configuration: DokkaJar.() -> Unit) = dokkaJar.run(configuration)
+ fun dokkaJar(block: DokkaJar.() -> Unit) = dokkaJar.run(block)
/**
* Called to notify the extension that its configuration is completed.
@@ -274,20 +297,14 @@ open class SpinePublishing(private val project: Project) {
* `maven-publish` plugin for each published module.
*/
internal fun configured() {
-
ensureProtoJarExclusionsArePublished()
ensureTestJarInclusionsArePublished()
ensuresModulesNotDuplicated()
- val protoJarExclusions = protoJar.exclusions
- val testJarInclusions = testJar.inclusions
- val publishedProjects = publishedProjects()
-
- publishedProjects.forEach { project ->
- val name = project.name
- val includeProtoJar = (protoJarExclusions.contains(name) || protoJar.disabled).not()
- val includeTestJar = (testJarInclusions.contains(name) || testJar.enabled)
- setUpPublishing(project, includeProtoJar, includeTestJar, dokkaJar.enabled)
+ val projectsToPublish = projectsToPublish()
+ projectsToPublish.forEach { project ->
+ val jarFlags = JarFlags.create(project.name, protoJar, testJar, dokkaJar)
+ project.setUpPublishing(jarFlags)
}
}
@@ -303,47 +320,46 @@ open class SpinePublishing(private val project: Project) {
*
* @see modules
*/
- private fun publishedProjects() = modules.map { name -> project.project(name) }
- .ifEmpty { setOf(project) }
+ private fun projectsToPublish(): Collection {
+ if (project.subprojects.isEmpty()) {
+ return setOf(project)
+ }
+ return modules.union(modulesWithCustomPublishing)
+ .map { name -> project.project(name) }
+ .ifEmpty { setOf(project) }
+ }
/**
* Sets up `maven-publish` plugin for the given project.
*
- * Firstly, an instance of [PublishingConfig] is assembled for the project. Then, this
- * config is applied.
+ * Firstly, an instance of [PublicationHandler] is created for the project depending
+ * on the nature of the publication process configured.
+ * Then, this the handler is scheduled to apply on [Project.afterEvaluate].
*
- * This method utilizes `project.afterEvaluate` closure. General rule of thumb is to avoid using
- * of this closure, as it configures a project when its configuration is considered completed.
+ * General rule of thumb is to avoid using [Project.afterEvaluate] of this closure,
+ * as it configures a project when its configuration is considered completed.
* Which is quite counter-intuitive.
*
- * The root cause why it is used here is a possibility to configure publishing of multiple
- * modules from a root project. When this possibility is employed, in fact, we configure
- * publishing for a module, build file of which has not been even evaluated by that time.
- * That leads to an unexpected behavior.
+ * We selected to use [Project.afterEvaluate] so that we can configure publishing of multiple
+ * modules from a root project. When we do this, we configure publishing for a module,
+ * build file of which has not been even evaluated yet.
*
* The simplest example here is specifying of `version` and `group` for Maven coordinates.
* Let's suppose, they are declared in a module's build file. It is a common practice.
* But publishing of the module is configured from a root project's build file. By the time,
* when we need to specify them, we just don't know them. As a result, we have to use
- * `project.afterEvaluate` in order to guarantee that a module will be configured by the time
+ * [Project.afterEvaluate] in order to guarantee that a module will be configured by the time
* we configure publishing for it.
*/
- private fun setUpPublishing(
- project: Project,
- includeProtoJar: Boolean,
- includeTestJar: Boolean,
- includeDokkaJar: Boolean
- ) {
- val artifactId = artifactId(project)
- val publishingConfig = PublishingConfig(
- artifactId,
- destinations,
- includeProtoJar,
- includeTestJar,
- includeDokkaJar
- )
- project.afterEvaluate {
- publishingConfig.apply(project)
+ private fun Project.setUpPublishing(jarFlags: JarFlags) {
+ val customPublishing = modulesWithCustomPublishing.contains(name)
+ val handler = if (customPublishing) {
+ CustomPublicationHandler(project, destinations)
+ } else {
+ StandardJavaPublicationHandler(project, jarFlags, destinations)
+ }
+ afterEvaluate {
+ handler.apply()
}
}
@@ -353,7 +369,7 @@ open class SpinePublishing(private val project: Project) {
* It consists of a project's name and [prefix][artifactPrefix]:
* ``.
*/
- internal fun artifactId(project: Project): String = "$artifactPrefix${project.name}"
+ fun artifactId(project: Project): String = "$artifactPrefix${project.name}"
/**
* Ensures that all modules, marked as excluded from [protoJar] publishing,
@@ -380,8 +396,10 @@ open class SpinePublishing(private val project: Project) {
private fun ensureTestJarInclusionsArePublished() {
val nonPublishedInclusions = testJar.inclusions.minus(modules)
if (nonPublishedInclusions.isNotEmpty()) {
- throw IllegalStateException("One or more modules are marked as `included into test " +
- "JAR publication`, but they are not even published: $nonPublishedInclusions")
+ error(
+ "One or more modules are marked as `included into test JAR publication`," +
+ " but they are not even published: $nonPublishedInclusions."
+ )
}
}
@@ -401,8 +419,9 @@ open class SpinePublishing(private val project: Project) {
rootExtension?.let { rootPublishing ->
val thisProject = setOf(project.name, project.path)
if (thisProject.minus(rootPublishing.modules).size != 2) {
- throw IllegalStateException("Publishing of `$thisProject` module is already " +
- "configured in a root project!")
+ error(
+ "Publishing of `$thisProject` module is already configured in a root project!"
+ )
}
}
}
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/publish/Tasks.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/publish/Tasks.kt
deleted file mode 100644
index b132638cd..000000000
--- a/buildSrc/src/main/kotlin/io/spine/internal/gradle/publish/Tasks.kt
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * Copyright 2022, TeamDev. All rights reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Redistribution and use in source and/or binary forms, with or without
- * modification, must retain the above copyright notice and the following
- * disclaimer.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-package io.spine.internal.gradle.publish
-
-import io.spine.internal.gradle.Repository
-import java.util.*
-import org.gradle.api.InvalidUserDataException
-import org.gradle.api.Project
-import org.gradle.api.Task
-import org.gradle.api.tasks.TaskContainer
-import org.gradle.api.tasks.TaskProvider
-
-private const val PUBLISH = "publish"
-
-/**
- * Locates `publish` task in this [TaskContainer].
- *
- * This task publishes all defined publications to all defined repositories. To achieve that,
- * the task depends on all `publish`*PubName*`PublicationTo`*RepoName*`Repository` tasks.
- *
- * Please note, task execution would not copy publications to the local Maven cache.
- *
- * @see
- * Tasks | Maven Publish Plugin
- */
-internal val TaskContainer.publish: TaskProvider
- get() = named(PUBLISH)
-
-/**
- * Sets dependencies for `publish` task in this [Project].
- *
- * This method performs the following:
- *
- * 1. When this [Project] is not a root, makes `publish` task in a root project
- * depend on a local `publish`.
- * 2. Makes local `publish` task verify that credentials are present for each
- * of destination repositories.
- */
-internal fun Project.configurePublishTask(destinations: Set) {
- attachCredentialsVerification(destinations)
- bindToRootPublish()
-}
-
-private fun Project.attachCredentialsVerification(destinations: Set) {
- val checkCredentials = tasks.registerCheckCredentialsTask(destinations)
- val localPublish = tasks.publish
- localPublish.configure { dependsOn(checkCredentials) }
-}
-
-private fun Project.bindToRootPublish() {
- if (project == rootProject) {
- return
- }
-
- val localPublish = tasks.publish
- val rootPublish = rootProject.tasks.getOrCreatePublishTask()
- rootPublish.configure { dependsOn(localPublish) }
-}
-
-/**
- * Use this task accessor when it is not guaranteed that the task is present
- * in this [TaskContainer].
- */
-private fun TaskContainer.getOrCreatePublishTask() =
- if (names.contains(PUBLISH)) {
- named(PUBLISH)
- } else {
- register(PUBLISH)
- }
-
-private fun TaskContainer.registerCheckCredentialsTask(destinations: Set) =
- register("checkCredentials") {
- doLast {
- destinations.forEach { it.ensureCredentials(project) }
- }
- }
-
-private fun Repository.ensureCredentials(project: Project) {
- val credentials = credentials(project)
- if (Objects.isNull(credentials)) {
- throw InvalidUserDataException(
- "No valid credentials for repository `${this}`. Please make sure " +
- "to pass username/password or a valid `.properties` file."
- )
- }
-}
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/coverage/CodebaseFilter.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/coverage/CodebaseFilter.kt
index 89e291292..4b0a9cc37 100644
--- a/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/coverage/CodebaseFilter.kt
+++ b/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/coverage/CodebaseFilter.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2022, TeamDev. All rights reserved.
+ * Copyright 2023, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/coverage/FileExtension.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/coverage/FileExtension.kt
index 97ab594e4..75763ddfb 100644
--- a/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/coverage/FileExtension.kt
+++ b/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/coverage/FileExtension.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2022, TeamDev. All rights reserved.
+ * Copyright 2023, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/coverage/FileExtensions.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/coverage/FileExtensions.kt
index 4a4279793..69193bae2 100644
--- a/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/coverage/FileExtensions.kt
+++ b/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/coverage/FileExtensions.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2022, TeamDev. All rights reserved.
+ * Copyright 2023, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/coverage/FileFilter.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/coverage/FileFilter.kt
index 1f4b38285..cc80ea181 100644
--- a/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/coverage/FileFilter.kt
+++ b/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/coverage/FileFilter.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2022, TeamDev. All rights reserved.
+ * Copyright 2023, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/coverage/JacocoConfig.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/coverage/JacocoConfig.kt
index 5e7fff476..4d789a596 100644
--- a/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/coverage/JacocoConfig.kt
+++ b/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/coverage/JacocoConfig.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2022, TeamDev. All rights reserved.
+ * Copyright 2023, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -89,12 +89,9 @@ class JacocoConfig(
*/
fun applyTo(project: Project) {
project.applyPlugin(BasePlugin::class.java)
- project.afterEvaluate {
- val javaProjects: Iterable = eligibleProjects(project)
- val reportsDir = project.rootProject.buildDir.resolve(reportsDirSuffix)
- JacocoConfig(project.rootProject, reportsDir, javaProjects)
- .configure()
- }
+ val javaProjects: Iterable = eligibleProjects(project)
+ val reportsDir = project.rootProject.buildDir.resolve(reportsDirSuffix)
+ JacocoConfig(project.rootProject, reportsDir, javaProjects).configure()
}
/**
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/coverage/PathMarker.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/coverage/PathMarker.kt
index 00fdf2434..06b0bc5d5 100644
--- a/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/coverage/PathMarker.kt
+++ b/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/coverage/PathMarker.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2022, TeamDev. All rights reserved.
+ * Copyright 2023, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/coverage/TaskName.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/coverage/TaskName.kt
index 76d345860..c81c24c9e 100644
--- a/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/coverage/TaskName.kt
+++ b/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/coverage/TaskName.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2022, TeamDev. All rights reserved.
+ * Copyright 2023, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/license/Configuration.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/license/Configuration.kt
index 65fd036c2..32b24b287 100644
--- a/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/license/Configuration.kt
+++ b/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/license/Configuration.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2022, TeamDev. All rights reserved.
+ * Copyright 2023, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/license/LicenseReporter.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/license/LicenseReporter.kt
index be3e250dc..f7f1a312c 100644
--- a/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/license/LicenseReporter.kt
+++ b/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/license/LicenseReporter.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2022, TeamDev. All rights reserved.
+ * Copyright 2023, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/license/MarkdownReportRenderer.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/license/MarkdownReportRenderer.kt
index ebd62d5bb..e1cd8afde 100644
--- a/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/license/MarkdownReportRenderer.kt
+++ b/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/license/MarkdownReportRenderer.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2022, TeamDev. All rights reserved.
+ * Copyright 2023, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/license/ModuleDataExtensions.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/license/ModuleDataExtensions.kt
index c219dec3f..9adbb3fb5 100644
--- a/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/license/ModuleDataExtensions.kt
+++ b/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/license/ModuleDataExtensions.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2022, TeamDev. All rights reserved.
+ * Copyright 2023, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -49,7 +49,7 @@ internal fun MarkdownDocument.printSection(
}
/**
- * Prints the metadata of the module to the specified [Markdown document][out].
+ * Prints the module metadata to this [MarkdownDocument].
*/
private fun MarkdownDocument.printModule(module: ModuleData) {
ol()
@@ -105,7 +105,7 @@ private fun MarkdownDocument.printProjectUrl(projectUrl: String?, indent: Int) {
}
/**
- * Prints the links to the the source code licenses.
+ * Prints the links to the source code licenses.
*/
@Suppress("SameParameterValue" /* Indentation is consistent across the list. */)
private fun MarkdownDocument.printLicenses(licenses: Set, indent: Int) {
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/license/Paths.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/license/Paths.kt
index cf1f46022..c352ffd42 100644
--- a/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/license/Paths.kt
+++ b/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/license/Paths.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2022, TeamDev. All rights reserved.
+ * Copyright 2023, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -40,7 +40,7 @@ internal object Paths {
* Its contents describe the licensing information for each of the Java dependencies
* which are referenced by Gradle projects in the repository.
*/
- internal const val outputFilename = "license-report.md"
+ internal const val outputFilename = "dependencies.md"
/**
* The path to a directory, to which a per-project report is generated.
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/license/ProjectDependencies.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/license/ProjectDependencies.kt
index 164df070a..fc90bb3b9 100644
--- a/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/license/ProjectDependencies.kt
+++ b/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/license/ProjectDependencies.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2022, TeamDev. All rights reserved.
+ * Copyright 2023, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/license/Tasks.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/license/Tasks.kt
index 4206f3d4a..6a57be5f3 100644
--- a/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/license/Tasks.kt
+++ b/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/license/Tasks.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2022, TeamDev. All rights reserved.
+ * Copyright 2023, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/license/Template.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/license/Template.kt
index f8f835eac..3eccbca90 100644
--- a/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/license/Template.kt
+++ b/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/license/Template.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2022, TeamDev. All rights reserved.
+ * Copyright 2023, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/pom/DependencyScope.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/pom/DependencyScope.kt
index 6a11b7c12..9c1f1ed66 100644
--- a/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/pom/DependencyScope.kt
+++ b/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/pom/DependencyScope.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2022, TeamDev. All rights reserved.
+ * Copyright 2023, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/pom/DependencyWriter.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/pom/DependencyWriter.kt
index 49326e95b..fb1920b43 100644
--- a/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/pom/DependencyWriter.kt
+++ b/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/pom/DependencyWriter.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2022, TeamDev. All rights reserved.
+ * Copyright 2023, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/pom/InceptionYear.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/pom/InceptionYear.kt
index a1e14666f..ab4bc1cc7 100644
--- a/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/pom/InceptionYear.kt
+++ b/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/pom/InceptionYear.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2022, TeamDev. All rights reserved.
+ * Copyright 2023, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/pom/MarkupExtensions.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/pom/MarkupExtensions.kt
index e34beb753..214931a4f 100644
--- a/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/pom/MarkupExtensions.kt
+++ b/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/pom/MarkupExtensions.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2022, TeamDev. All rights reserved.
+ * Copyright 2023, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/pom/ModuleDependency.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/pom/ModuleDependency.kt
index 5a0708370..0dbb11c06 100644
--- a/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/pom/ModuleDependency.kt
+++ b/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/pom/ModuleDependency.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2022, TeamDev. All rights reserved.
+ * Copyright 2023, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/pom/PomFormatting.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/pom/PomFormatting.kt
index 3fca911ce..d25ebd626 100644
--- a/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/pom/PomFormatting.kt
+++ b/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/pom/PomFormatting.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2022, TeamDev. All rights reserved.
+ * Copyright 2023, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -28,6 +28,7 @@ package io.spine.internal.gradle.report.pom
import java.io.StringWriter
import java.lang.System.lineSeparator
+import java.util.*
/**
* Helps to format the `pom.xml` file according to its expected XML structure.
@@ -74,6 +75,7 @@ internal object PomFormatting {
"structure per-subproject." +
NL
return String.format(
+ Locale.US,
"",
NL, description, NL
)
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/pom/PomGenerator.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/pom/PomGenerator.kt
index 8b9ab504e..3535922a7 100644
--- a/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/pom/PomGenerator.kt
+++ b/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/pom/PomGenerator.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2022, TeamDev. All rights reserved.
+ * Copyright 2023, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -28,7 +28,6 @@ package io.spine.internal.gradle.report.pom
import org.gradle.api.Project
import org.gradle.api.plugins.BasePlugin
-import org.gradle.kotlin.dsl.extra
/**
* Generates a `pom.xml` file that contains dependencies of the root project as
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/pom/PomXmlWriter.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/pom/PomXmlWriter.kt
index 3df34034f..c16fe767e 100644
--- a/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/pom/PomXmlWriter.kt
+++ b/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/pom/PomXmlWriter.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2022, TeamDev. All rights reserved.
+ * Copyright 2023, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/pom/ProjectMetadata.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/pom/ProjectMetadata.kt
index 40c84f291..ad1cbb745 100644
--- a/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/pom/ProjectMetadata.kt
+++ b/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/pom/ProjectMetadata.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2022, TeamDev. All rights reserved.
+ * Copyright 2023, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/pom/ScopedDependency.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/pom/ScopedDependency.kt
index 868d4332b..5e6bf13b8 100644
--- a/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/pom/ScopedDependency.kt
+++ b/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/pom/ScopedDependency.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2022, TeamDev. All rights reserved.
+ * Copyright 2023, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -94,17 +94,17 @@ private constructor(
*/
fun of(dependency: Dependency, configuration: Configuration): ScopedDependency {
val configurationName = configuration.name
-
- if (CONFIG_TO_SCOPE.containsKey(configurationName)) {
- val scope = CONFIG_TO_SCOPE[configurationName]
- return ScopedDependency(dependency, scope!!)
- }
- if (configurationName.toLowerCase().startsWith("test")) {
- return ScopedDependency(dependency, test)
+ val knownScope = CONFIG_TO_SCOPE[configurationName]
+ return when {
+ knownScope != null -> ScopedDependency(dependency, knownScope)
+ isTestsRelated(configurationName) -> ScopedDependency(dependency, test)
+ else -> ScopedDependency(dependency, undefined)
}
- return ScopedDependency(dependency, undefined)
}
+ private fun isTestsRelated(configurationName: String): Boolean =
+ configurationName.startsWith("test", ignoreCase = true)
+
/**
* Performs comparison of {@code DependencyWithScope} instances according to these rules:
*
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/pom/SpineLicense.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/pom/SpineLicense.kt
index 7c95db274..080de4c96 100644
--- a/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/pom/SpineLicense.kt
+++ b/buildSrc/src/main/kotlin/io/spine/internal/gradle/report/pom/SpineLicense.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2022, TeamDev. All rights reserved.
+ * Copyright 2023, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/testing/Logging.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/testing/Logging.kt
index 00143e60a..de74b08f9 100644
--- a/buildSrc/src/main/kotlin/io/spine/internal/gradle/testing/Logging.kt
+++ b/buildSrc/src/main/kotlin/io/spine/internal/gradle/testing/Logging.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2022, TeamDev. All rights reserved.
+ * Copyright 2023, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/testing/Multiproject.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/testing/Multiproject.kt
index 25ccac942..b9d9c2aac 100644
--- a/buildSrc/src/main/kotlin/io/spine/internal/gradle/testing/Multiproject.kt
+++ b/buildSrc/src/main/kotlin/io/spine/internal/gradle/testing/Multiproject.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2022, TeamDev. All rights reserved.
+ * Copyright 2023, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -62,10 +62,8 @@ import io.spine.internal.gradle.publish.testJar
@Suppress("unused")
fun Project.exposeTestConfiguration() {
- if (pluginManager.hasPlugin("java").not()) {
- throw IllegalStateException(
- "Can't expose the test configuration because `java` plugin has not been applied."
- )
+ check(pluginManager.hasPlugin("java")) {
+ "Can't expose the test configuration because `java` plugin has not been applied."
}
configurations.create("testArtifacts") {
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/testing/Tasks.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/testing/Tasks.kt
index 841d4c7e5..1d7a656e9 100644
--- a/buildSrc/src/main/kotlin/io/spine/internal/gradle/testing/Tasks.kt
+++ b/buildSrc/src/main/kotlin/io/spine/internal/gradle/testing/Tasks.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2022, TeamDev. All rights reserved.
+ * Copyright 2023, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -45,6 +45,15 @@ import org.gradle.kotlin.dsl.register
*/
@Suppress("unused")
fun TaskContainer.registerTestTasks() {
+ withType(Test::class.java).configureEach {
+ filter {
+ // There could be cases with no matching tests. E.g. tests could be based on Kotest,
+ // which has custom task types and names.
+ isFailOnNoMatchingTests = false
+ includeTestsMatching("*Test")
+ includeTestsMatching("*Spec")
+ }
+ }
register("fastTest").let {
register("slowTest") {
shouldRunAfter(it)
@@ -56,8 +65,10 @@ fun TaskContainer.registerTestTasks() {
* Name of a tag for annotating a test class or method that is known to be slow and
* should not normally be run together with the main test suite.
*
- * @see [SlowTest](https://spine.io/base/reference/testlib/io/spine/testing/SlowTest.html)
- * @see [Tag](https://junit.org/junit5/docs/5.0.2/api/org/junit/jupiter/api/Tag.html)
+ * @see
+ * SlowTest
+ * @see
+ * Tag
*/
private const val SLOW_TAG = "slow"
@@ -82,7 +93,8 @@ private open class SlowTest : Test() {
init {
description = "Executes JUnit tests tagged as `slow`."
group = "Verification"
-
+ // No slow tests -- no problem.
+ filter.isFailOnNoMatchingTests = false
this.useJUnitPlatform {
includeTags(SLOW_TAG)
}
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/publish/ProtoLocators.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/typescript/TsContext.kt
similarity index 57%
rename from buildSrc/src/main/kotlin/io/spine/internal/gradle/publish/ProtoLocators.kt
rename to buildSrc/src/main/kotlin/io/spine/internal/gradle/typescript/TsContext.kt
index ef048f2b2..66c17aaaf 100644
--- a/buildSrc/src/main/kotlin/io/spine/internal/gradle/publish/ProtoLocators.kt
+++ b/buildSrc/src/main/kotlin/io/spine/internal/gradle/typescript/TsContext.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2022, TeamDev. All rights reserved.
+ * Copyright 2024, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -24,32 +24,38 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package io.spine.internal.gradle.publish
+package io.spine.internal.gradle.typescript
-import io.spine.internal.gradle.sourceSets
import java.io.File
import org.gradle.api.Project
-import org.gradle.api.file.SourceDirectorySet
-import org.gradle.kotlin.dsl.get
-
/**
- * Tells whether there are any Proto sources in "main" source set.
+ * Provides access to the current [TsEnvironment] and shortcuts for running `npm` tool.
*/
-internal fun Project.hasProto(): Boolean {
- val protoSources = protoSources()
- val result = protoSources.any { it.exists() }
- return result
-}
+open class TsContext(tsEnv: TsEnvironment, internal val project: Project)
+ : TsEnvironment by tsEnv
+{
+ /**
+ * Executes `npm` command in a separate process.
+ *
+ * [TsEnvironment.projectDir] is used as a working directory.
+ */
+ fun npm(vararg args: String) = projectDir.npm(*args)
-/**
- * Locates Proto sources in "main" source set.
- *
- * "main" source set is added by `java` plugin. Special treatment for Proto sources is needed,
- * because they are not Java-related, and, thus, not included in `sourceSets["main"].allSource`.
- */
-internal fun Project.protoSources(): Set {
- val mainSourceSet = sourceSets["main"]
- val protoSourceDirs = mainSourceSet.extensions.findByName("proto") as SourceDirectorySet?
- return protoSourceDirs?.srcDirs ?: emptySet()
+ /**
+ * Executes `npm` command in a separate process.
+ *
+ * This [File] is used as a working directory.
+ */
+ fun File.npm(vararg args: String) = project.exec {
+
+ workingDir(this@npm)
+ commandLine(npmExecutable)
+ args(*args)
+
+ // Using private packages in a CI/CD workflow | npm Docs
+ // https://docs.npmjs.com/using-private-packages-in-a-ci-cd-workflow
+
+ environment["NPM_TOKEN"] = npmAuthToken
+ }
}
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/typescript/TsEnvironment.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/typescript/TsEnvironment.kt
new file mode 100644
index 000000000..2840de85c
--- /dev/null
+++ b/buildSrc/src/main/kotlin/io/spine/internal/gradle/typescript/TsEnvironment.kt
@@ -0,0 +1,258 @@
+/*
+ * Copyright 2024, TeamDev. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Redistribution and use in source and/or binary forms, with or without
+ * modification, must retain the above copyright notice and the following
+ * disclaimer.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package io.spine.internal.gradle.typescript
+
+import java.io.File
+import org.apache.tools.ant.taskdefs.condition.Os
+
+/**
+ * Describes the environment in which TypeScript code is assembled and processed during the build.
+ *
+ * Consists of three parts describing:
+ *
+ * 1. A module itself.
+ * 2. Tools and their input/output files.
+ * 3. Code generation.
+ */
+interface TsEnvironment {
+
+ /*
+ * A module itself
+ ******************/
+
+ /**
+ * Module's root catalog.
+ */
+ val projectDir: File
+
+ /**
+ * Module's version.
+ */
+ val moduleVersion: String
+
+ /**
+ * Module's production sources directory.
+ *
+ * Default value: "$projectDir/main".
+ */
+ val srcDir: File
+ get() = projectDir.resolve("main")
+
+ /**
+ * Module's test sources directory.
+ *
+ * Default value: "$projectDir/test".
+ */
+ val testSrcDir: File
+ get() = projectDir.resolve("test")
+
+ /**
+ * A directory which all artifacts are generated into.
+ *
+ * Default value: "$projectDir/build".
+ */
+ val buildDir: File
+ get() = projectDir.resolve("build")
+
+ /**
+ * A directory where artifacts for further publishing would be prepared.
+ *
+ * Default value: "$buildDir/npm-publication".
+ */
+ val publicationDir: File
+ get() = buildDir.resolve("npm-publication")
+
+ /*
+ * Tools and their input/output files
+ *************************************/
+
+ /**
+ * Name of an executable for running `npm`.
+ *
+ * Default value:
+ *
+ * 1. "nmp.cmd" for Windows.
+ * 2. "npm" for other OSs.
+ */
+ val npmExecutable: String
+ get() = if (isWindows()) "npm.cmd" else "npm"
+
+ /**
+ * An access token that allows installation and/or publishing modules.
+ *
+ * During installation a token is required only if dependencies from private
+ * repositories are used.
+ *
+ * Default value is read from the environmental variable - `NPM_TOKEN`.
+ * "PUBLISHING_FORBIDDEN" stub value would be assigned in case `NPM_TOKEN` variable is not set.
+ *
+ * See [Creating and viewing access tokens | npm Docs](https://docs.npmjs.com/creating-and-viewing-access-tokens).
+ */
+ val npmAuthToken: String
+ get() = System.getenv("NPM_TOKEN") ?: "PUBLISHING_FORBIDDEN"
+
+ /**
+ * A directory where `npm` puts downloaded module's dependencies.
+ *
+ * Default value: "$projectDir/node_modules".
+ */
+ val nodeModules: File
+ get() = projectDir.resolve("node_modules")
+
+ /**
+ * Module's descriptor used by `npm`.
+ *
+ * Default value: "$projectDir/package.json".
+ */
+ val packageJson: File
+ get() = projectDir.resolve("package.json")
+
+ /**
+ * `npm` gets its configuration settings from the command line, environment variables,
+ * and `npmrc` file.
+ *
+ * Default value: "$projectDir/.npmrc".
+ *
+ * See [npmrc | npm Docs](https://docs.npmjs.com/cli/v8/configuring-npm/npmrc).
+ */
+ val npmrc: File
+ get() = projectDir.resolve(".npmrc")
+
+ /**
+ * A cache directory in which `nyc` tool outputs raw coverage report.
+ *
+ * Default value: "$projectDir/.nyc_output".
+ *
+ * See [istanbuljs/nyc](https://github.com/istanbuljs/nyc).
+ */
+ val nycOutput: File
+ get() = projectDir.resolve(".nyc_output")
+
+ /**
+ * A directory in which `webpack` would put a ready-to-use bundle.
+ *
+ * Default value: "$projectDir/dist"
+ *
+ * See [webpack - npm](https://www.npmjs.com/package/webpack).
+ */
+ val webpackOutput: File
+ get() = projectDir.resolve("dist")
+
+ /**
+ * A directory where bundled artifacts for further publishing would be prepared.
+ *
+ * Default value: "$publicationDir/dist".
+ */
+ val webpackPublicationDir: File
+ get() = publicationDir.resolve("dist")
+
+ /*
+ * Code generation
+ ******************/
+
+ /**
+ * Name of a directory that contains EcmaScript and TypeScript code
+ * generated by `protoc-gen-es`, a generator provided by Buf.
+ *
+ * Default value: "es".
+ */
+ val genProtoDirName: String
+ get() = "es"
+
+ /**
+ * A directory with production Protobuf messages compiled into EcmaScript
+ * and TypeScript by `protoc-gen-es`, a generator provided by Buf.
+ *
+ * Default value: "$srcDir/$genProtoDirName".
+ */
+ val genProtoMain: File
+ get() = srcDir.resolve(genProtoDirName)
+
+ /**
+ * A directory with production Protobuf messages compiled into EcmaScript
+ * and TypeScript by `protoc-gen-es`, a generator provided by Buf.
+ *
+ * Default value: "$testSrcDir/$genProtoDirName".
+ */
+ val genProtoTest: File
+ get() = testSrcDir.resolve(genProtoDirName)
+}
+
+/**
+ * Allows overriding [TsEnvironment]'s defaults.
+ *
+ * All of declared properties can be split into two groups:
+ *
+ * 1. The ones that *define* something - can be overridden.
+ * 2. The ones that *describe* something - can NOT be overridden.
+ *
+ * Overriding a "defining" property affects the way `npm` tool works.
+ * In contrary, overriding a "describing" property does not affect the tool.
+ * Such properties just describe how the used tool works.
+ *
+ * Therefore, overriding of "describing" properties leads to inconsistency with expectations.
+ *
+ * The next properties could not be overridden:
+ *
+ * 1. [TsEnvironment.nodeModules].
+ * 2. [TsEnvironment.packageJson].
+ * 3. [TsEnvironment.npmrc].
+ * 4. [TsEnvironment.nycOutput].
+ */
+class ConfigurableTsEnvironment(initialEnvironment: TsEnvironment)
+ : TsEnvironment by initialEnvironment
+{
+ /*
+ * A module itself
+ ******************/
+
+ override var projectDir = initialEnvironment.projectDir
+ override var moduleVersion = initialEnvironment.moduleVersion
+ override var srcDir = initialEnvironment.srcDir
+ override var testSrcDir = initialEnvironment.testSrcDir
+ override var buildDir = initialEnvironment.buildDir
+ override var publicationDir = initialEnvironment.publicationDir
+
+ /*
+ * Tools and their input/output files
+ *************************************/
+
+ override var npmExecutable = initialEnvironment.npmExecutable
+ override var npmAuthToken = initialEnvironment.npmAuthToken
+ override var webpackOutput = initialEnvironment.webpackOutput
+ override var webpackPublicationDir = initialEnvironment.webpackPublicationDir
+
+ /*
+ * Code generation
+ ******************/
+
+ override var genProtoDirName = initialEnvironment.genProtoDirName
+ override var genProtoMain = initialEnvironment.genProtoMain
+ override var genProtoTest = initialEnvironment.genProtoTest
+}
+
+internal fun isWindows(): Boolean = Os.isFamily(Os.FAMILY_WINDOWS)
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/typescript/TsExtension.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/typescript/TsExtension.kt
new file mode 100644
index 000000000..777e6539c
--- /dev/null
+++ b/buildSrc/src/main/kotlin/io/spine/internal/gradle/typescript/TsExtension.kt
@@ -0,0 +1,194 @@
+/*
+ * Copyright 2024, TeamDev. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Redistribution and use in source and/or binary forms, with or without
+ * modification, must retain the above copyright notice and the following
+ * disclaimer.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package io.spine.internal.gradle.typescript
+
+import io.spine.internal.gradle.typescript.plugin.TsPlugins
+import io.spine.internal.gradle.typescript.task.TsTasks
+import org.gradle.api.Project
+import org.gradle.kotlin.dsl.create
+import org.gradle.kotlin.dsl.extra
+import org.gradle.kotlin.dsl.findByType
+
+/**
+ * Configures [TsExtension] that facilitates configuration of Gradle tasks and plugins
+ * to build TypeScript projects.
+ *
+ * The whole structure of the extension looks as follows:
+ *
+ * ```
+ * typescript {
+ * environment {
+ * // ...
+ * }
+ * tasks {
+ * // ...
+ * }
+ * plugins {
+ * // ...
+ * }
+ * }
+ * ```
+ *
+ * ### Environment
+ *
+ * One of the main features of this extension is [TsEnvironment]. Environment describes a module
+ * itself, used tools with their input/output files, code generation.
+ *
+ * The extension is shipped with a pre-configured environment. So, no pre-configuration is required.
+ * Most properties in [TsEnvironment] have calculated defaults right in the interface.
+ * Only two properties need explicit override.
+ *
+ * The extension defines them as follows:
+ *
+ * 1. [TsEnvironment.projectDir] –> `project.projectDir`.
+ * 2. [TsEnvironment.moduleVersion] —> `project.extra["versionToPublishTs"]`.
+ *
+ * There are two ways to modify the environment:
+ *
+ * 1. Update [TsEnvironment] directly. Go with this option when it is a global change
+ * that should affect all projects which use this extension.
+ * 2. Use [TsEnvironment.environment] scope — for temporary and custom overridings.
+ *
+ * An example of a property overriding:
+ *
+ * ```
+ * typescript {
+ * environment {
+ * moduleVersion = "$moduleVersion-SPECIAL_EDITION"
+ * }
+ * }
+ * ```
+ *
+ * Please note, environment should be set up firstly to have the effect on the parts
+ * of the extension that use it.
+ *
+ * ### Tasks and Plugins
+ *
+ * The spirit of tasks configuration in this extension is extracting the code that defines and
+ * registers tasks into extension functions upon `TsTasks` in `buildSrc`. Those extensions should be
+ * named after a task it registers or a task group if several tasks are registered at once.
+ * Then this extension is called in a project's `build.gradle.kts`.
+ *
+ * `TsTasks` and `TsPlugins` scopes extend [TsContext] which provides access
+ * to the current [TsEnvironment] and shortcuts for running `npm` tool.
+ *
+ * Below is the simplest example of how to create a primitive `printNpmVersion` task.
+ *
+ * Firstly, a corresponding extension function should be defined in `buildSrc`:
+ *
+ * ```
+ * fun TsTasks.printNpmVersion() =
+ * register("printNpmVersion") {
+ * doLast {
+ * npm("--version")
+ * }
+ * }
+ * ```
+ *
+ * Secondly, in a project's `build.gradle.kts` this extension is called:
+ *
+ * ```
+ * typescript {
+ * tasks {
+ * printNpmVersion()
+ * }
+ * }
+ * ```
+ *
+ * An extension function is not restricted to register exactly one task. If several tasks can
+ * be grouped into a logical bunch, they should be registered together:
+ *
+ * ```
+ * fun TsTasks.build() {
+ * assembleTs()
+ * testTs()
+ * generateCoverageReport()
+ * }
+ *
+ * private fun TsTasks.assembleTs() = ...
+ *
+ * private fun TsTasks.testTs() = ...
+ *
+ * private fun TsTasks.generateCoverageReport() = ...
+ * ```
+ *
+ * This section is mostly dedicated to tasks. But tasks and plugins are configured
+ * in a very similar way. So, everything above is also applicable to plugins. More detailed
+ * guides can be found in docs to `TsTasks` and `TsPlugins`.
+ *
+ * @see [ConfigurableTsEnvironment]
+ * @see [TsTasks]
+ * @see [TsPlugins]
+ */
+fun Project.typescript(configuration: TsExtension.() -> Unit) {
+ extensions.run {
+ configuration.invoke(
+ findByType() ?: create("tsExtension", project)
+ )
+ }
+}
+
+/**
+ * Scope for performing TypeScript-related configuration.
+ *
+ * @see [typescript]
+ */
+open class TsExtension(internal val project: Project) {
+
+ private val configurableEnvironment = ConfigurableTsEnvironment(
+ object : TsEnvironment {
+ override val projectDir = project.projectDir
+ override val moduleVersion = project.extra["versionToPublishTs"].toString()
+ }
+ )
+
+ val environment: TsEnvironment = configurableEnvironment
+ val tasks: TsTasks = TsTasks(environment, project)
+ val plugins: TsPlugins = TsPlugins(environment, project)
+
+ /**
+ * Overrides default values of [TsEnvironment].
+ *
+ * Please note, environment should be set up firstly to have the effect on the parts
+ * of the extension that use it.
+ */
+ fun environment(overridings: ConfigurableTsEnvironment.() -> Unit) =
+ configurableEnvironment.run(overridings)
+
+ /**
+ * Configures [TypeScript-related tasks][TsTasks].
+ */
+ fun tasks(configurations: TsTasks.() -> Unit) =
+ tasks.run(configurations)
+
+ /**
+ * Configures [TypeScript-related plugins][TsPlugins].
+ */
+ fun plugins(configurations: TsPlugins.() -> Unit) =
+ plugins.run(configurations)
+
+}
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/publish/ProtoJar.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/typescript/plugin/Idea.kt
similarity index 57%
rename from buildSrc/src/main/kotlin/io/spine/internal/gradle/publish/ProtoJar.kt
rename to buildSrc/src/main/kotlin/io/spine/internal/gradle/typescript/plugin/Idea.kt
index b9ffb5920..04a3238c8 100644
--- a/buildSrc/src/main/kotlin/io/spine/internal/gradle/publish/ProtoJar.kt
+++ b/buildSrc/src/main/kotlin/io/spine/internal/gradle/typescript/plugin/Idea.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2022, TeamDev. All rights reserved.
+ * Copyright 2024, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -24,28 +24,41 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package io.spine.internal.gradle.publish
+package io.spine.internal.gradle.typescript.plugin
+
+import org.gradle.kotlin.dsl.configure
+import org.gradle.plugins.ide.idea.model.IdeaModel
/**
- * A DSL element of [SpinePublishing] extension which allows disabling publishing
- * of [protoJar] artifact.
+ * Applies and configures `idea` plugin to work with a TypeScript module.
*
- * This artifact contains all the `.proto` definitions from `sourceSets.main.proto`. By default,
- * it is published.
+ * In particular, this method:
*
- * Take a look on [SpinePublishing.protoJar] for a usage example.
+ * 1. Specifies directories for production and test sources.
+ * 2. Excludes directories with generated code and build artifacts.
*
- * @see [registerArtifacts]
+ * @see TsPlugins
*/
-class ProtoJar {
+fun TsPlugins.idea() {
+
+ plugins {
+ apply("org.gradle.idea")
+ }
+
+ extensions.configure {
- /**
- * Set of modules, for which a proto JAR will not be published.
- */
- var exclusions: Set = emptySet()
+ module {
+ sourceDirs.add(srcDir)
+ testSources.from(testSrcDir)
- /**
- * Disables proto JAR publishing for all published modules.
- */
- var disabled = false
+ excludeDirs.addAll(
+ listOf(
+ nodeModules,
+ nycOutput,
+ genProtoMain,
+ genProtoTest
+ )
+ )
+ }
+ }
}
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/typescript/plugin/Protobuf.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/typescript/plugin/Protobuf.kt
new file mode 100644
index 000000000..81c3b67b4
--- /dev/null
+++ b/buildSrc/src/main/kotlin/io/spine/internal/gradle/typescript/plugin/Protobuf.kt
@@ -0,0 +1,91 @@
+/*
+ * Copyright 2024, TeamDev. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Redistribution and use in source and/or binary forms, with or without
+ * modification, must retain the above copyright notice and the following
+ * disclaimer.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package io.spine.internal.gradle.typescript.plugin
+
+import com.google.protobuf.gradle.ProtobufExtension
+import com.google.protobuf.gradle.id
+import com.google.protobuf.gradle.remove
+import io.spine.internal.dependency.Protobuf
+
+/**
+ * Applies and configures `protobuf` plugin to work with a TypeScript module.
+ *
+ * In particular, this method:
+ *
+ * 1. Specifies an executable for `protoc` compiler.
+ * 2. Configures `GenerateProtoTask`.
+ *
+ * @see TsPlugins
+ */
+fun TsPlugins.protobuf() {
+
+ plugins {
+ apply(Protobuf.GradlePlugin.id)
+ }
+
+ val protobufExt = project.extensions.getByType(ProtobufExtension::class.java)
+ protobufExt.apply {
+
+ generatedFilesBaseDir = projectDir.path
+
+ protoc {
+ artifact = Protobuf.JsRenderingProtoc.compiler
+ }
+
+ plugins {
+ // `buf-es` must match the plugin ID in `generateProtoTasks { ... plugins {} }`
+ create("buf-es") {
+ path = "${project.rootDir}/node_modules/.bin/protoc-gen-es"
+ }
+ }
+
+ generateProtoTasks {
+ all().forEach { task ->
+
+ task.builtins {
+
+ // Do not use `java` builtin in this project.
+ remove("java")
+ }
+
+ task.plugins {
+ id("buf-es") {
+ }
+ }
+
+ val sourceSet = task.sourceSet.name
+ val testClassifier = if (sourceSet == "test") "_test" else ""
+ val artifact = "${project.group}_${project.name}_${moduleVersion}"
+ val descriptor = "$artifact$testClassifier.desc"
+
+ task.generateDescriptorSet = true
+ task.descriptorSetOptions.path =
+ "${projectDir}/build/descriptors/${sourceSet}/${descriptor}"
+ }
+ }
+ }
+}
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/typescript/plugin/TsPlugins.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/typescript/plugin/TsPlugins.kt
new file mode 100644
index 000000000..7fea9e90b
--- /dev/null
+++ b/buildSrc/src/main/kotlin/io/spine/internal/gradle/typescript/plugin/TsPlugins.kt
@@ -0,0 +1,92 @@
+/*
+ * Copyright 2024, TeamDev. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Redistribution and use in source and/or binary forms, with or without
+ * modification, must retain the above copyright notice and the following
+ * disclaimer.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package io.spine.internal.gradle.typescript.plugin
+
+import io.spine.internal.gradle.typescript.TsContext
+import io.spine.internal.gradle.typescript.TsEnvironment
+import org.gradle.api.Project
+import org.gradle.api.plugins.ExtensionContainer
+import org.gradle.api.plugins.PluginContainer
+import org.gradle.api.tasks.TaskContainer
+
+/**
+ * A scope for applying and configuring TypeScript-related plugins.
+ *
+ * The scope extends [TsContext] and provides shortcuts for key project's containers:
+ *
+ * 1. [plugins].
+ * 2. [extensions].
+ * 3. [tasks].
+ *
+ * Let's imagine one wants to apply and configure `FooBar` plugin. To do that, several steps
+ * should be completed:
+ *
+ * 1. Declare the corresponding extension function upon [TsPlugins] named after the plugin.
+ * 2. Apply and configure the plugin inside that function.
+ * 3. Call the resulted extension in your `build.gradle.kts` file.
+ *
+ * Here's an example of `typescript/plugin/FooBar.kt`:
+ *
+ * ```
+ * fun TsPlugins.fooBar() {
+ * plugins.apply("com.fooBar")
+ * extensions.configure {
+ * // ...
+ * }
+ * }
+ * ```
+ *
+ * And here's how to apply it in `build.gradle.kts`:
+ *
+ * ```
+ * import io.spine.internal.gradle.typescript.typescript
+ * import io.spine.internal.gradle.typescript.plugins.fooBar
+ *
+ * // ...
+ *
+ * typescript {
+ * plugins {
+ * fooBar()
+ * }
+ * }
+ * ```
+ */
+class TsPlugins(tsEnv: TsEnvironment, project: Project) : TsContext(tsEnv, project) {
+
+ internal val plugins = project.plugins
+ internal val extensions = project.extensions
+ internal val tasks = project.tasks
+
+ internal fun plugins(configurations: PluginContainer.() -> Unit) =
+ plugins.run(configurations)
+
+ internal fun extensions(configurations: ExtensionContainer.() -> Unit) =
+ extensions.run(configurations)
+
+ internal fun tasks(configurations: TaskContainer.() -> Unit) =
+ tasks.run(configurations)
+}
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/typescript/task/Assemble.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/typescript/task/Assemble.kt
new file mode 100644
index 000000000..dbfead8e6
--- /dev/null
+++ b/buildSrc/src/main/kotlin/io/spine/internal/gradle/typescript/task/Assemble.kt
@@ -0,0 +1,206 @@
+/*
+ * Copyright 2024, TeamDev. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Redistribution and use in source and/or binary forms, with or without
+ * modification, must retain the above copyright notice and the following
+ * disclaimer.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package io.spine.internal.gradle.typescript.task
+
+import com.fasterxml.jackson.databind.ObjectMapper
+import com.fasterxml.jackson.databind.node.ObjectNode
+import com.google.protobuf.gradle.GenerateProtoTask
+import io.spine.internal.gradle.base.assemble
+import io.spine.internal.gradle.named
+import io.spine.internal.gradle.register
+import io.spine.internal.gradle.TaskName
+import org.gradle.api.Task
+import org.gradle.api.tasks.TaskContainer
+import org.gradle.api.tasks.TaskProvider
+import org.gradle.kotlin.dsl.withType
+
+/**
+ * Registers tasks for assembling TypeScript artifacts.
+ *
+ * Please note, this task group depends on
+ * [protobuf][io.spine.internal.gradle.typescript.plugin.protobuf]` plugin. Therefore,
+ * this plugin should be applied in the first place.
+ *
+ * List of tasks to be created:
+ *
+ * 1. [TaskContainer.assembleTs].
+ * 2. [TaskContainer.compileProtoToTs].
+ * 3. [TaskContainer.installNodePackages].
+ * 4. [TaskContainer.updatePackageVersion].
+ *
+ * Here's an example of how to apply it in `build.gradle.kts`:
+ *
+ * ```
+ * import io.spine.internal.gradle.typescript.typescript
+ * import io.spine.internal.gradle.typescript.task.assemble
+ *
+ * // ...
+ *
+ * typescript {
+ * tasks {
+ * assemble()
+ * }
+ * }
+ * ```
+ *
+ * @param configuration any additional configuration related to the module's assembling.
+ */
+fun TsTasks.assemble(configuration: TsTasks.() -> Unit = {}) {
+
+ installNodePackages()
+ compileProtoToTs()
+
+ // TODO: Do we need it at all?
+ //.also {
+// generateJsonParsers.configure {
+// dependsOn(it)
+// }
+// }
+
+ updatePackageVersion()
+
+ assembleTs().also {
+ assemble.configure {
+ dependsOn(it)
+ }
+ }
+
+ configuration()
+}
+
+private val assembleTsName = TaskName.of("assembleTs")
+
+/**
+ * Locates `assembleTs` task in this [TaskContainer].
+ *
+ * It is a lifecycle task that produces consumable JavaScript artifacts.
+ */
+val TaskContainer.assembleTs: TaskProvider
+ get() = named(assembleTsName)
+
+private fun TsTasks.assembleTs() =
+ register(assembleTsName) {
+
+ System.err.println("---- `assembleTs` registered. ----")
+ description = "Assembles TypeScript sources into consumable artifacts."
+ group = TsTasks.Group.assemble
+
+ dependsOn(
+ installNodePackages,
+ compileProtoToTs,
+ updatePackageVersion,
+ )
+ }
+
+private val compileProtoToTsName = TaskName.of("compileProtoToTs")
+
+/**
+ * Locates `compileProtoToTs` task in this [TaskContainer].
+ *
+ * The task is responsible for compiling Protobuf messages into JavaScript. It aggregates the tasks
+ * provided by `protobuf` plugin that perform actual compilation.
+ */
+val TaskContainer.compileProtoToTs: TaskProvider
+ get() = named(compileProtoToTsName)
+
+private fun TsTasks.compileProtoToTs() =
+ register(compileProtoToTsName) {
+
+ description = "Compiles Protobuf messages into TypeScript."
+ group = TsTasks.Group.assemble
+
+ withType()
+ .forEach { dependsOn(it) }
+ }
+
+private val installNodePackagesName = TaskName.of("installNodePackages")
+
+/**
+ * Locates `installNodePackages` task in this [TaskContainer].
+ *
+ * The task installs Node packages which this module depends on using `npm install` command.
+ *
+ * The `npm install` command is executed with the vulnerability check disabled since
+ * it cannot fail the task execution despite on vulnerabilities found.
+ *
+ * To check installed Node packages for vulnerabilities execute
+ * [TaskContainer.auditNodePackages] task.
+ *
+ * See [npm-install | npm Docs](https://docs.npmjs.com/cli/v8/commands/npm-install).
+ */
+val TaskContainer.installNodePackages: TaskProvider
+ get() = named(installNodePackagesName)
+
+private fun TsTasks.installNodePackages() =
+ register(installNodePackagesName) {
+
+ description = "Installs TypeScript module`s Node dependencies."
+ group = TsTasks.Group.assemble
+
+ inputs.file(packageJson)
+ outputs.dir(nodeModules)
+
+ doLast {
+ npm("set", "audit", "false")
+ npm("install")
+ }
+ }
+
+private val updatePackageVersionName = TaskName.of("updatePackageVersion")
+
+/**
+ * Locates `updatePackageVersion` task in this [TaskContainer].
+ *
+ * The task sets the module's version in `package.json` to the value of
+ * [moduleVersion][io.spine.internal.gradle.typescript.TsEnvironment.moduleVersion]
+ * specified in the current `TsEnvironment`.
+ */
+val TaskContainer.updatePackageVersion: TaskProvider
+ get() = named(updatePackageVersionName)
+
+private fun TsTasks.updatePackageVersion() =
+ register(updatePackageVersionName) {
+
+ description = "Sets a TypeScript module's version in `package.json`."
+ group = TsTasks.Group.assemble
+
+ doLast {
+ val objectNode = ObjectMapper()
+ .readValue(packageJson, ObjectNode::class.java)
+ .put("version", moduleVersion)
+
+ packageJson.writeText(
+
+ // We are going to stick to JSON formatting used by `npm` itself.
+ // So that modifying the line with the version would ONLY affect a single line
+ // when comparing two files i.e. in Git.
+
+ (objectNode.toPrettyString() + '\n')
+ .replace("\" : ", "\": ")
+ )
+ }
+ }
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/typescript/task/Check.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/typescript/task/Check.kt
new file mode 100644
index 000000000..62571f29f
--- /dev/null
+++ b/buildSrc/src/main/kotlin/io/spine/internal/gradle/typescript/task/Check.kt
@@ -0,0 +1,201 @@
+/*
+ * Copyright 2024, TeamDev. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Redistribution and use in source and/or binary forms, with or without
+ * modification, must retain the above copyright notice and the following
+ * disclaimer.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package io.spine.internal.gradle.typescript.task
+
+import io.spine.internal.gradle.TaskName
+import io.spine.internal.gradle.base.check
+import io.spine.internal.gradle.java.test
+import io.spine.internal.gradle.named
+import io.spine.internal.gradle.register
+import io.spine.internal.gradle.typescript.isWindows
+import org.gradle.api.Task
+import org.gradle.api.tasks.TaskContainer
+import org.gradle.api.tasks.TaskProvider
+
+/**
+ * Registers tasks for verifying a TypeScript module.
+ *
+ * Please note, this task group depends on [assemble] tasks. Therefore, assembling tasks should
+ * be applied in the first place.
+ *
+ * List of tasks to be created:
+ *
+ * 1. [TaskContainer.checkTs].
+ * 2. [TaskContainer.auditNodePackages].
+ * 3. [TaskContainer.testTs].
+ * 4. [TaskContainer.coverageTs].
+ *
+ * Here's an example of how to apply it in `build.gradle.kts`:
+ *
+ * ```
+ * import io.spine.internal.gradle.typescript.typescript
+ * import io.spine.internal.gradle.typescript.task.assemble
+ * import io.spine.internal.gradle.typescript.task.check
+ *
+ * // ...
+ *
+ * typescript {
+ * tasks {
+ * assemble()
+ * check()
+ * }
+ * }
+ * ```
+ *
+ * @param configuration any additional configuration related to the module's verification.
+ */
+fun TsTasks.check(configuration: TsTasks.() -> Unit = {}) {
+
+ auditNodePackages()
+ coverageTs()
+ testTs()
+
+ checkTs().also {
+ check.configure {
+ dependsOn(it)
+ }
+ }
+
+ configuration()
+}
+
+private val checkTsName = TaskName.of("checkTs")
+
+/**
+ * Locates `checkTs` task in this [TaskContainer].
+ *
+ * The task runs tests, audits NPM modules and creates a test-coverage report.
+ */
+val TaskContainer.checkTs: TaskProvider
+ get() = named(checkTsName)
+
+private fun TsTasks.checkTs() =
+ register(checkTsName) {
+
+ description =
+ "Runs tests against TypeScript sources," +
+ " audits NPM modules," +
+ " and creates a test-coverage report."
+
+ group = TsTasks.Group.check
+
+ dependsOn(
+ auditNodePackages,
+ coverageTs,
+ testTs,
+ )
+ }
+
+private val auditNodePackagesName = TaskName.of("auditTsNodePackages")
+
+/**
+ * Locates `auditNodePackages` task in this [TaskContainer].
+ *
+ * The task audits the module dependencies using the `npm audit` command.
+ *
+ * The `audit` command submits a description of the dependencies configured in the module
+ * to a public registry and asks for a report of known vulnerabilities. If any are found,
+ * then the impact and appropriate remediation will be calculated.
+ *
+ * @see npm-audit | npm Docs
+ */
+val TaskContainer.auditNodePackages: TaskProvider
+ get() = named(auditNodePackagesName)
+
+private fun TsTasks.auditNodePackages() =
+ register(auditNodePackagesName) {
+
+ description = "Audits the TypeScript module's Node dependencies."
+ group = TsTasks.Group.check
+
+ inputs.dir(nodeModules)
+
+ doLast {
+
+ // `critical` level is set as the minimum level of vulnerability for `npm audit`
+ // to exit with a non-zero code.
+
+ npm("set", "audit-level", "critical")
+
+ try {
+ npm("audit")
+ } catch (ignored: Exception) {
+ npm("audit", "--registry", "https://registry.npmjs.eu")
+ }
+ }
+
+ dependsOn(installNodePackages)
+ }
+
+private val coverageTsName = TaskName.of("coverageTs")
+
+/**
+ * Locates `coverageTs` task in this [TaskContainer].
+ *
+ * The task runs the TypeScript tests and collects the code coverage.
+ */
+val TaskContainer.coverageTs: TaskProvider
+ get() = named(coverageTsName)
+
+private fun TsTasks.coverageTs() =
+ register(coverageTsName) {
+
+ description = "Runs the TypeScript tests and collects the code coverage."
+ group = TsTasks.Group.check
+
+ outputs.dir(nycOutput)
+
+ doLast {
+ npm("run", if (isWindows()) "coverage:win" else "coverage:unix")
+ }
+
+ dependsOn(assembleTs)
+ }
+
+private val testTsName = TaskName.of("testTs")
+
+/**
+ * Locates `testTs` task in this [TaskContainer].
+ *
+ * The task runs TypeScript tests.
+ */
+val TaskContainer.testTs: TaskProvider
+ get() = named(testTsName)
+
+private fun TsTasks.testTs() =
+ register(testTsName) {
+
+ description = "Runs TypeScript tests."
+ group = TsTasks.Group.check
+
+ doLast {
+ npm("run", "test")
+ }
+
+ dependsOn(assembleTs)
+ mustRunAfter(test)
+ }
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/typescript/task/Clean.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/typescript/task/Clean.kt
new file mode 100644
index 000000000..75f529fe1
--- /dev/null
+++ b/buildSrc/src/main/kotlin/io/spine/internal/gradle/typescript/task/Clean.kt
@@ -0,0 +1,126 @@
+/*
+ * Copyright 2024, TeamDev. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Redistribution and use in source and/or binary forms, with or without
+ * modification, must retain the above copyright notice and the following
+ * disclaimer.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package io.spine.internal.gradle.typescript.task
+
+import io.spine.internal.gradle.TaskName
+import io.spine.internal.gradle.base.clean
+import io.spine.internal.gradle.named
+import io.spine.internal.gradle.register
+import org.gradle.api.tasks.Delete
+import org.gradle.api.tasks.TaskContainer
+import org.gradle.api.tasks.TaskProvider
+
+/**
+ * Registers tasks for deleting output of TypeScript builds.
+ *
+ * Please note, this task group depends on [assemble] tasks. Therefore, assembling tasks should
+ * be applied in the first place.
+ *
+ * List of tasks to be created:
+ *
+ * 1. [TaskContainer.cleanTs].
+ * 2. [TaskContainer.cleanGeneratedTs].
+ *
+ * Here's an example of how to apply it in `build.gradle.kts`:
+ *
+ * ```
+ * import io.spine.internal.gradle.typescript.typescript
+ * import io.spine.internal.gradle.typescript.task.assemble
+ * import io.spine.internal.gradle.typescript.task.clean
+ *
+ * // ...
+ *
+ * typescript {
+ * tasks {
+ * assemble()
+ * clean()
+ * }
+ * }
+ * ```
+ */
+fun TsTasks.clean() {
+
+ cleanGeneratedTs()
+
+ cleanTs().also {
+ clean.configure {
+ dependsOn(it)
+ }
+ }
+}
+
+private val cleanTsName = TaskName.of("cleanTs", Delete::class)
+
+/**
+ * Locates `cleanTs` task in this [TaskContainer].
+ *
+ * The task deletes output of `assembleTs` task and output of its dependants.
+ */
+val TaskContainer.cleanTs: TaskProvider
+ get() = named(cleanTsName)
+
+private fun TsTasks.cleanTs() =
+ register(cleanTsName) {
+
+ description = "Cleans output of `assembleTs` task and output of its dependants."
+ group = TsTasks.Group.clean
+
+ System.err.println("---- Registering `cleanTs`... ----")
+
+ delete(
+ assembleTs.map { it.outputs },
+ compileProtoToTs.map { it.outputs },
+ installNodePackages.map { it.outputs },
+ )
+
+ dependsOn(
+ cleanGeneratedTs
+ )
+ }
+
+private val cleanGeneratedTsName = TaskName.of("cleanGeneratedTs", Delete::class)
+
+/**
+ * Locates `cleanGeneratedTs` task in this [TaskContainer].
+ *
+ * The task deletes directories with the generated TypeScript code and reports.
+ */
+val TaskContainer.cleanGeneratedTs: TaskProvider
+ get() = named(cleanGeneratedTsName)
+
+private fun TsTasks.cleanGeneratedTs() =
+ register(cleanGeneratedTsName) {
+
+ description = "Cleans generated code and reports."
+ group = TsTasks.Group.clean
+
+ delete(
+ genProtoMain,
+ genProtoTest,
+ nycOutput,
+ )
+ }
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/typescript/task/Publish.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/typescript/task/Publish.kt
new file mode 100644
index 000000000..959a98c94
--- /dev/null
+++ b/buildSrc/src/main/kotlin/io/spine/internal/gradle/typescript/task/Publish.kt
@@ -0,0 +1,195 @@
+/*
+ * Copyright 2024, TeamDev. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Redistribution and use in source and/or binary forms, with or without
+ * modification, must retain the above copyright notice and the following
+ * disclaimer.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package io.spine.internal.gradle.typescript.task
+
+import io.spine.internal.gradle.publish.publish
+import io.spine.internal.gradle.named
+import io.spine.internal.gradle.register
+import io.spine.internal.gradle.TaskName
+import org.gradle.api.Task
+import org.gradle.api.tasks.TaskContainer
+import org.gradle.api.tasks.TaskProvider
+
+/**
+ * Registers tasks for publishing a TypeScript module.
+ *
+ * Please note, this task group depends on [assemble] tasks. Therefore, assembling tasks should
+ * be applied in the first place.
+ *
+ * List of tasks to be created:
+ *
+ * 1. [TaskContainer.publishTs].
+ * 2. [TaskContainer.publishTsLocally].
+ * 3. [TaskContainer.prepareTsPublication].
+ *
+ * Here's an example of how to apply it in `build.gradle.kts`:
+ *
+ * ```
+ * import io.spine.internal.gradle.typescript.typescript
+ * import io.spine.internal.gradle.typescript.task.assemble
+ * import io.spine.internal.gradle.typescript.task.publish
+ *
+ * // ...
+ *
+ * typescript {
+ * tasks {
+ * assemble()
+ * publish()
+ * }
+ * }
+ * ```
+ */
+fun TsTasks.publish() {
+
+ // TODO:2024-02-28:alex.tymchenko: do we need transpiling altogether?
+ transpileTsSources()
+ prepareTsPublication()
+ publishTsLocally()
+
+ publishTs().also {
+ publish.configure {
+ dependsOn(it)
+ }
+ }
+}
+
+private val transpileTsSourcesName = TaskName.of("transpileTsSources")
+
+/**
+ * Locates `transpileTsSources` task in this [TaskContainer].
+ *
+ * The task transpiles TypeScript sources using Babel before their publishing.
+ */
+val TaskContainer.transpileTsSources: TaskProvider
+ get() = named(transpileTsSourcesName)
+
+private fun TsTasks.transpileTsSources() =
+ register(transpileTsSourcesName) {
+
+ description = "Transpiles TypeScript sources using Babel before their publishing."
+ group = TsTasks.Group.publish
+
+ doLast {
+ npm("run", "transpile-before-publish")
+ }
+ }
+
+private val prepareTsPublicationName = TaskName.of("prepareTsPublication")
+
+/**
+ * Locates `prepareTsPublication` task in this [TaskContainer].
+ *
+ * This is a lifecycle task that prepares the NPM package in
+ * [publicationDirectory][io.spine.internal.gradle.typescript.TsEnvironment.publicationDir]
+ * of the current `TsEnvironment`.
+ */
+val TaskContainer.prepareTsPublication: TaskProvider
+ get() = named(prepareTsPublicationName)
+
+private fun TsTasks.prepareTsPublication() =
+ register(prepareTsPublicationName) {
+
+ description = "Prepares the NPM package for TypeScript publishing."
+ group = TsTasks.Group.publish
+
+ // We need to copy two files into a destination directory without overwriting its content.
+ // Default `Copy` task is not used since it overwrites the content of a destination
+ // when copying there.
+ // See issue: https://github.com/gradle/gradle/issues/1012
+
+ doLast {
+ project.copy {
+ from(
+ packageJson,
+ npmrc
+ )
+
+ into(publicationDir)
+ }
+ }
+
+ dependsOn(
+ assembleTs,
+ transpileTsSources
+ )
+ }
+
+private val publishTsLocallyName = TaskName.of("publishTsLocally")
+
+/**
+ * Locates `publishTsLocally` task in this [TaskContainer].
+ *
+ * The task publishes the prepared NPM package locally using `npm link`.
+ *
+ * @see npm-link | npm Docs
+ */
+val TaskContainer.publishTsLocally: TaskProvider
+ get() = named(publishTsLocallyName)
+
+private fun TsTasks.publishTsLocally() =
+ register(publishTsLocallyName) {
+
+ description = "Publishes the TypeScript-based NPM package locally with `npm link`."
+ group = TsTasks.Group.publish
+
+ doLast {
+ publicationDir.npm("link")
+ }
+
+ dependsOn(prepareTsPublication)
+ }
+
+private val publishTsName = TaskName.of("publishTs")
+
+/**
+ * Locates `publishTs` task in this [TaskContainer].
+ *
+ * The task publishes the prepared NPM package from
+ * [publicationDirectory][io.spine.internal.gradle.typescript.TsEnvironment.publicationDir]
+ * using `npm publish`.
+ *
+ * Please note, in order to publish an NMP package, a valid
+ * [npmAuthToken][io.spine.internal.gradle.typescript.TsEnvironment.npmAuthToken] should be
+ * set. If no token is set, a default dummy value is quite enough for the local development.
+ *
+ * @see npm-publish | npm Docs
+ */
+val TaskContainer.publishTs: TaskProvider
+ get() = named(publishTsName)
+
+private fun TsTasks.publishTs() =
+ register(publishTsName) {
+
+ description = "Publishes the TypeScript-based NPM package with `npm publish`."
+ group = TsTasks.Group.publish
+
+ doLast {
+ publicationDir.npm("publish")
+ }
+
+ dependsOn(prepareTsPublication)
+ }
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/typescript/task/TsTasks.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/typescript/task/TsTasks.kt
new file mode 100644
index 000000000..92839a5e8
--- /dev/null
+++ b/buildSrc/src/main/kotlin/io/spine/internal/gradle/typescript/task/TsTasks.kt
@@ -0,0 +1,117 @@
+/*
+ * Copyright 2024, TeamDev. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Redistribution and use in source and/or binary forms, with or without
+ * modification, must retain the above copyright notice and the following
+ * disclaimer.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package io.spine.internal.gradle.typescript.task
+
+import io.spine.internal.gradle.typescript.TsContext
+import io.spine.internal.gradle.typescript.TsEnvironment
+import org.gradle.api.Project
+import org.gradle.api.tasks.TaskContainer
+
+/**
+ * A scope for registering and configuring TypeScript-related tasks.
+ *
+ * The scope provides:
+ *
+ * 1. Access to the current [TsContext].
+ * 2. Project's [TaskContainer].
+ * 3. Default task groups.
+ *
+ * Supposing, one needs to create a new task that would participate in building. Let the task name
+ * be `bundleTs`. To do that, several steps should be completed:
+ *
+ * 1. Define the task name and type using [TaskName][io.spine.internal.gradle.TaskName].
+ * 2. Create a public typed reference for the task upon [TaskContainer]. It would facilitate
+ * referencing to the new task, so that external tasks could depend on it. This reference
+ * should be documented.
+ * 3. Implement an extension upon [TsTasks] to register the task.
+ * 4. Call the resulted extension from `build.gradle.kts`.
+ *
+ * Here's an example of `bundleTs()` extension:
+ *
+ * ```
+ * import io.spine.internal.gradle.named
+ * import io.spine.internal.gradle.register
+ * import io.spine.internal.gradle.TaskName
+ * import org.gradle.api.Task
+ * import org.gradle.api.tasks.TaskContainer
+ * import org.gradle.api.tasks.Exec
+ *
+ * // ...
+ *
+ * private val bundleTsName = TaskName.of("bundleTs", Exec::class)
+ *
+ * /**
+ * * Locates `bundleTs` task in this [TaskContainer].
+ * *
+ * * The task bundles TypeScript sources using `webpack` tool.
+ * */
+ * val TaskContainer.bundleTs: TaskProvider
+ * get() = named(bundleTsName)
+ *
+ * fun TsTasks.bundleTs() =
+ * register(bundleTsName) {
+ *
+ * description = "Bundles TypeScript sources using `webpack` tool."
+ * group = TsTasks.Group.build
+ *
+ * // ...
+ * }
+ * ```
+ *
+ * And here's how to apply it in `build.gradle.kts`:
+ *
+ * ```
+ * import io.spine.internal.gradle.typescript.typescript
+ * import io.spine.internal.gradle.typescript.task.bundleTs
+ *
+ * // ...
+ *
+ * typescript {
+ * tasks {
+ * bundleTs()
+ * }
+ * }
+ * ```
+ *
+ * Declaring typed references upon [TaskContainer] is optional. But it is highly encouraged
+ * to reference other tasks by such extensions instead of hard-typed string values.
+ */
+class TsTasks(tsEnv: TsEnvironment, project: Project) : TsContext(tsEnv, project),
+ TaskContainer by project.tasks {
+ /**
+ * Default task groups for tasks that participate in building a TypeScript module.
+ *
+ * @see [org.gradle.api.Task.getGroup]
+ */
+ internal object Group {
+ const val assemble = "TypeScript/Assemble"
+ const val check = "TypeScript/Check"
+ const val clean = "TypeScript/Clean"
+ const val build = "TypeScript/Build"
+ const val publish = "TypeScript/Publish"
+ }
+}
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/gradle/typescript/task/Webpack.kt b/buildSrc/src/main/kotlin/io/spine/internal/gradle/typescript/task/Webpack.kt
new file mode 100644
index 000000000..22163cf22
--- /dev/null
+++ b/buildSrc/src/main/kotlin/io/spine/internal/gradle/typescript/task/Webpack.kt
@@ -0,0 +1,108 @@
+/*
+ * Copyright 2024, TeamDev. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Redistribution and use in source and/or binary forms, with or without
+ * modification, must retain the above copyright notice and the following
+ * disclaimer.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package io.spine.internal.gradle.typescript.task
+
+import io.spine.internal.gradle.TaskName
+import io.spine.internal.gradle.named
+import io.spine.internal.gradle.register
+import org.gradle.api.tasks.Copy
+import org.gradle.api.tasks.TaskContainer
+import org.gradle.api.tasks.TaskProvider
+
+/**
+ * Configures `assembleTs` task and creates `copyBundledTs` task to work with `webpack` bundler.
+ *
+ * Please note, this task group depends on [assemble] and [publish] tasks. Therefore, those tasks
+ * should be applied in the first place.
+ *
+ * In particular, this method:
+ *
+ * 1. Extends `assembleTs` task to bundle sources during assembling.
+ * 2. Creates `copyBundledTs` task and binds it to `prepareTsPublication` task execution.
+ *
+ * Here's an example of how to apply it in `build.gradle.kts`:
+ *
+ * ```
+ * import io.spine.internal.gradle.typescript.typescript
+ * import io.spine.internal.gradle.typescript.task.assemble
+ * import io.spine.internal.gradle.typescript.task.publish
+ * import io.spine.internal.gradle.typescript.task.webpack
+ *
+ * // ...
+ *
+ * typescript {
+ * tasks {
+ * assemble()
+ * publish()
+ * webpack()
+ * }
+ * }
+ * ```
+ */
+@Suppress("unused")
+fun TsTasks.webpack() {
+
+ assembleTs.configure {
+
+ outputs.dir(webpackOutput)
+
+ doLast {
+ npm("run", "build")
+ npm("run", "build-dev")
+ }
+ }
+
+ // Temporarily don't publish a bundle.
+ // See: https://github.com/SpineEventEngine/web/issues/61
+
+ copyBundledTs()/*.also {
+ prepareJsPublication.configure {
+ dependsOn(it)
+ }
+ }*/
+}
+
+private val copyBundledTsName = TaskName.of("copyBundledTs", Copy::class)
+
+/**
+ * Locates `copyBundledTs` task in this [TaskContainer].
+ *
+ * The task copies bundled TypeScript sources to the publication directory.
+ */
+@Suppress("unused")
+val TaskContainer.copyBundledTs: TaskProvider
+ get() = named(copyBundledTsName)
+
+private fun TsTasks.copyBundledTs() =
+ register(copyBundledTsName) {
+
+ description = "Copies bundled TypeScript sources to the NPM publication directory."
+ group = TsTasks.Group.publish
+
+ from(assembleTs.map { it.outputs })
+ into(webpackPublicationDir)
+ }
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/markup/MarkdownDocument.kt b/buildSrc/src/main/kotlin/io/spine/internal/markup/MarkdownDocument.kt
index a70889677..af9154fa7 100644
--- a/buildSrc/src/main/kotlin/io/spine/internal/markup/MarkdownDocument.kt
+++ b/buildSrc/src/main/kotlin/io/spine/internal/markup/MarkdownDocument.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2022, TeamDev. All rights reserved.
+ * Copyright 2023, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -28,16 +28,12 @@ package io.spine.internal.markup
import java.io.File
-/**
- * Shortcuts for the Markdown syntax.
- */
-
/**
* A virtual document written in Markdown.
*
* After it's finished, end-users would typically write it to a [real file][writeToFile].
*/
-@SuppressWarnings("detekt.complexity.TooManyFunctions") /* By design. */
+@Suppress("TooManyFunctions")
class MarkdownDocument {
private val builder: StringBuilder = StringBuilder()
diff --git a/buildSrc/src/main/kotlin/jacoco-kotlin-jvm.gradle.kts b/buildSrc/src/main/kotlin/jacoco-kotlin-jvm.gradle.kts
new file mode 100644
index 000000000..b6b493269
--- /dev/null
+++ b/buildSrc/src/main/kotlin/jacoco-kotlin-jvm.gradle.kts
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2023, TeamDev. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Redistribution and use in source and/or binary forms, with or without
+ * modification, must retain the above copyright notice and the following
+ * disclaimer.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+import java.io.File
+import org.gradle.kotlin.dsl.getValue
+import org.gradle.kotlin.dsl.getting
+import org.gradle.kotlin.dsl.jacoco
+import org.gradle.testing.jacoco.tasks.JacocoReport
+
+plugins {
+ jacoco
+}
+
+/**
+ * Configures [JacocoReport] task to run in a Kotlin Multiplatform project for
+ * `commonMain` and `jvmMain` source sets.
+ *
+ * This script plugin must be applied using the following construct at the end of
+ * a `build.gradle.kts` file of a module:
+ *
+ * ```kotlin
+ * apply(plugin="jacoco-kotlin-jvm")
+ * ```
+ * Please do not apply this script plugin in the `plugins {}` block because `jacocoTestReport`
+ * task is not yet available at this stage.
+ */
+@Suppress("unused")
+private val about = ""
+
+/**
+ * Configure Jacoco task with custom input from this Kotlin Multiplatform project.
+ */
+val jacocoTestReport: JacocoReport by tasks.getting(JacocoReport::class) {
+
+ val classFiles = File("${buildDir}/classes/kotlin/jvm/")
+ .walkBottomUp()
+ .toSet()
+ classDirectories.setFrom(classFiles)
+
+ val coverageSourceDirs = arrayOf(
+ "src/commonMain",
+ "src/jvmMain"
+ )
+ sourceDirectories.setFrom(files(coverageSourceDirs))
+
+ executionData.setFrom(files("${buildDir}/jacoco/jvmTest.exec"))
+}
diff --git a/buildSrc/src/main/kotlin/jvm-module.gradle.kts b/buildSrc/src/main/kotlin/jvm-module.gradle.kts
new file mode 100644
index 000000000..4f7b9d093
--- /dev/null
+++ b/buildSrc/src/main/kotlin/jvm-module.gradle.kts
@@ -0,0 +1,216 @@
+/*
+ * Copyright 2023, TeamDev. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Redistribution and use in source and/or binary forms, with or without
+ * modification, must retain the above copyright notice and the following
+ * disclaimer.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+import BuildSettings.javaVersion
+import io.spine.internal.dependency.CheckerFramework
+import io.spine.internal.dependency.Dokka
+import io.spine.internal.dependency.ErrorProne
+import io.spine.internal.dependency.Guava
+import io.spine.internal.dependency.JUnit
+import io.spine.internal.dependency.JavaX
+import io.spine.internal.dependency.Kotest
+import io.spine.internal.dependency.Protobuf
+import io.spine.internal.dependency.Spine
+import io.spine.internal.gradle.checkstyle.CheckStyleConfig
+import io.spine.internal.gradle.github.pages.updateGitHubPages
+import io.spine.internal.gradle.javac.configureErrorProne
+import io.spine.internal.gradle.javac.configureJavac
+import io.spine.internal.gradle.javadoc.JavadocConfig
+import io.spine.internal.gradle.kotlin.applyJvmToolchain
+import io.spine.internal.gradle.kotlin.setFreeCompilerArgs
+import io.spine.internal.gradle.report.license.LicenseReporter
+import io.spine.internal.gradle.testing.configureLogging
+import io.spine.internal.gradle.testing.registerTestTasks
+import org.gradle.api.Project
+import org.gradle.api.tasks.Delete
+import org.gradle.api.tasks.compile.JavaCompile
+import org.gradle.jvm.toolchain.JavaLanguageVersion
+import org.gradle.kotlin.dsl.dependencies
+import org.gradle.kotlin.dsl.getValue
+import org.gradle.kotlin.dsl.idea
+import org.gradle.kotlin.dsl.invoke
+import org.gradle.kotlin.dsl.`java-library`
+import org.gradle.kotlin.dsl.kotlin
+import org.gradle.kotlin.dsl.provideDelegate
+import org.gradle.kotlin.dsl.registering
+import org.gradle.kotlin.dsl.withType
+import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
+
+plugins {
+ `java-library`
+ idea
+ id("net.ltgt.errorprone")
+ id("pmd-settings")
+ id("project-report")
+ id("dokka-for-java")
+ kotlin("jvm")
+ id("io.kotest")
+ id("org.jetbrains.kotlinx.kover")
+ id("detekt-code-analysis")
+ id("dokka-for-kotlin")
+}
+
+LicenseReporter.generateReportIn(project)
+JavadocConfig.applyTo(project)
+CheckStyleConfig.applyTo(project)
+
+project.run {
+ configureJava(javaVersion)
+ configureKotlin(javaVersion)
+ addDependencies()
+ forceConfigurations()
+
+ val generatedDir = "$projectDir/generated"
+ setTaskDependencies(generatedDir)
+ setupTests()
+
+ configureGitHubPages()
+}
+
+typealias Module = Project
+
+fun Module.configureJava(javaVersion: JavaLanguageVersion) {
+ java {
+ toolchain.languageVersion.set(javaVersion)
+ }
+
+ tasks {
+ withType().configureEach {
+ configureJavac()
+ configureErrorProne()
+ }
+ }
+}
+
+fun Module.configureKotlin(javaVersion: JavaLanguageVersion) {
+ kotlin {
+ applyJvmToolchain(javaVersion.asInt())
+ explicitApi()
+ }
+
+ tasks {
+ withType().configureEach {
+ kotlinOptions.jvmTarget = javaVersion.toString()
+ setFreeCompilerArgs()
+ }
+ }
+
+ kover {
+ useJacoco()
+ }
+
+ koverReport {
+ defaults {
+ xml {
+ onCheck = true
+ }
+ }
+ }
+}
+
+/**
+ * These dependencies are applied to all subprojects and do not have to
+ * be included explicitly.
+ *
+ * We expose production code dependencies as API because they are used
+ * by the framework parts that depend on `base`.
+ */
+fun Module.addDependencies() = dependencies {
+ errorprone(ErrorProne.core)
+
+ Protobuf.libs.forEach { api(it) }
+ api(Guava.lib)
+
+ compileOnlyApi(CheckerFramework.annotations)
+ compileOnlyApi(JavaX.annotations)
+ ErrorProne.annotations.forEach { compileOnlyApi(it) }
+
+ implementation(Spine.Logging.lib)
+
+ testImplementation(Guava.testLib)
+ testImplementation(JUnit.runner)
+ testImplementation(JUnit.pioneer)
+ JUnit.api.forEach { testImplementation(it) }
+
+ testImplementation(Spine.testlib)
+ testImplementation(Kotest.frameworkEngine)
+ testImplementation(Kotest.datatest)
+ testImplementation(Kotest.runnerJUnit5Jvm)
+ testImplementation(JUnit.runner)
+}
+
+fun Module.forceConfigurations() {
+ with(configurations) {
+ forceVersions()
+ excludeProtobufLite()
+ all {
+ resolutionStrategy {
+ force(
+ JUnit.bom,
+ JUnit.runner,
+ Dokka.BasePlugin.lib
+ )
+ }
+ }
+ }
+}
+
+fun Module.setupTests() {
+ tasks {
+ registerTestTasks()
+ test.configure {
+ useJUnitPlatform {
+ includeEngines("junit-jupiter")
+ }
+ configureLogging()
+ }
+ }
+}
+
+fun Module.setTaskDependencies(generatedDir: String) {
+ tasks {
+ val cleanGenerated by registering(Delete::class) {
+ delete(generatedDir)
+ }
+ clean.configure {
+ dependsOn(cleanGenerated)
+ }
+
+ project.afterEvaluate {
+ val publish = tasks.findByName("publish")
+ publish?.dependsOn("${project.path}:updateGitHubPages")
+ }
+ }
+ configureTaskDependencies()
+}
+
+fun Module.configureGitHubPages() {
+ val docletVersion = project.version.toString()
+ updateGitHubPages(docletVersion) {
+ allowInternalJavadoc.set(true)
+ rootFolder.set(rootDir)
+ }
+}
diff --git a/buildSrc/src/main/kotlin/pmd-settings.gradle.kts b/buildSrc/src/main/kotlin/pmd-settings.gradle.kts
index 03e69a67e..a718b1f6b 100644
--- a/buildSrc/src/main/kotlin/pmd-settings.gradle.kts
+++ b/buildSrc/src/main/kotlin/pmd-settings.gradle.kts
@@ -1,5 +1,5 @@
/*
- * Copyright 2022, TeamDev. All rights reserved.
+ * Copyright 2023, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/buildSrc/src/main/kotlin/write-manifest.gradle.kts b/buildSrc/src/main/kotlin/write-manifest.gradle.kts
new file mode 100644
index 000000000..aff16776a
--- /dev/null
+++ b/buildSrc/src/main/kotlin/write-manifest.gradle.kts
@@ -0,0 +1,164 @@
+/*
+ * Copyright 2023, TeamDev. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Redistribution and use in source and/or binary forms, with or without
+ * modification, must retain the above copyright notice and the following
+ * disclaimer.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+import io.spine.internal.gradle.publish.SpinePublishing
+import java.nio.file.Files.createDirectories
+import java.nio.file.Files.createFile
+import java.text.SimpleDateFormat
+import java.util.*
+import java.util.jar.Attributes.Name.IMPLEMENTATION_TITLE
+import java.util.jar.Attributes.Name.IMPLEMENTATION_VENDOR
+import java.util.jar.Attributes.Name.IMPLEMENTATION_VERSION
+import java.util.jar.Attributes.Name.MANIFEST_VERSION
+import java.util.jar.Manifest
+
+plugins {
+ java
+}
+
+/**
+ * Obtains a string value of a [System] property with the given key.
+ */
+fun prop(key: String): String = System.getProperties()[key].toString()
+
+/**
+ * Obtains the current time in UTC using ISO 8601 format.
+ */
+fun currentTime(): String = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ").format(Date())
+
+/**
+ * Obtains the information on the JDK used for the build.
+ */
+fun buildJdk(): String =
+ "${prop("java.version")} (${prop("java.vendor")} ${prop("java.vm.version")})"
+
+/**
+ * Obtains the information on the operating system used for the build.
+ */
+fun buildOs(): String =
+ "${prop("os.name")} ${prop("os.arch")} ${prop("os.version")}"
+
+/** The publishing settings from the root project. */
+val spinePublishing = rootProject.the()
+val artifactPrefix = spinePublishing.artifactPrefix
+
+/**
+ * Obtains the implementation title for the project using project group,
+ * artifact prefix from [SpinePublishing], and the name of the project to which
+ * this script plugin is applied.
+ */
+fun implementationTitle() = "${project.group}:$artifactPrefix${project.name}"
+
+/**
+ * The name of the manifest attribute holding the timestamp of the build.
+ */
+val buildTimestampAttr = "Build-Timestamp"
+
+/**
+ * The attributes we put into the JAR manifest.
+ *
+ * This map is shared between the [exposeManifestForTests] task and the action which
+ * customizes the [Jar] task below.
+ */
+val manifestAttributes = mapOf(
+ "Built-By" to prop("user.name"),
+ buildTimestampAttr to currentTime(),
+ "Created-By" to "Gradle ${gradle.gradleVersion}",
+ "Build-Jdk" to buildJdk(),
+ "Build-OS" to buildOs(),
+ IMPLEMENTATION_TITLE.toString() to implementationTitle(),
+ IMPLEMENTATION_VERSION.toString() to project.version,
+ IMPLEMENTATION_VENDOR.toString() to "TeamDev"
+)
+
+/**
+ * Creates a manifest file in `resources` so that it is available for the tests.
+ *
+ * This task does the same what does the block which configures the `tasks.jar` below.
+ * We cannot use the manifest file created by the `Jar` task because it's not visible
+ * when running tests. We cannot depend on the `Jar` from `resources` because it would
+ * form a circular dependency.
+ */
+val exposeManifestForTests by tasks.creating {
+
+ val outputFile = layout.buildDirectory.file("resources/main/META-INF/MANIFEST.MF")
+ outputs.file(outputFile).withPropertyName("manifestFile")
+
+ fun createManifest(): Manifest {
+ val manifest = Manifest()
+
+ // The manifest version attribute is crucial for writing.
+ // It it's absent nothing would be written.
+ manifest.mainAttributes[MANIFEST_VERSION] = "1.0"
+
+ manifestAttributes.forEach { entry ->
+ manifest.mainAttributes.putValue(entry.key, entry.value.toString())
+ }
+ return manifest
+ }
+
+ fun writeManifest(manifest: Manifest) {
+ val file = outputFile.get().getAsFile()
+ val path = file.toPath()
+ createDirectories(path.parent)
+ if (!file.exists()) {
+ createFile(path)
+ }
+ val stream = file.outputStream()
+ stream.use {
+ manifest.write(stream)
+ }
+ }
+
+ doLast {
+ val manifest = createManifest()
+ writeManifest(manifest)
+ }
+}
+
+tasks.processResources {
+ dependsOn(exposeManifestForTests)
+}
+
+tasks.jar {
+ manifest {
+ attributes(manifestAttributes)
+ }
+}
+
+/**
+ * Makes Gradle ignore the [buildTimestampAttr] attribute during normalization.
+ *
+ * See [Java META-INF normalization](https://docs.gradle.org/current/userguide/more_about_tasks.html#sec:meta_inf_normalization)
+ * section of the Gradle documentation for details.
+ */
+normalization {
+ runtimeClasspath {
+ metaInf {
+ ignoreAttribute(buildTimestampAttr)
+ }
+ }
+}
diff --git a/buildSrc/src/main/resources/dokka/styles/custom-styles.css b/buildSrc/src/main/resources/dokka/styles/custom-styles.css
index 0e4eb20e1..8c442fe4d 100644
--- a/buildSrc/src/main/resources/dokka/styles/custom-styles.css
+++ b/buildSrc/src/main/resources/dokka/styles/custom-styles.css
@@ -1,5 +1,5 @@
/*
- * Copyright 2022, TeamDev. All rights reserved.
+ * Copyright 2023, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -46,3 +46,7 @@
overflow: hidden;
text-overflow: ellipsis;
}
+
+.symbol.monospace.block {
+ margin: 10px;
+}
diff --git a/client-js/build.gradle.kts b/client-js/build.gradle.kts
index 119528b17..9e6a458c6 100644
--- a/client-js/build.gradle.kts
+++ b/client-js/build.gradle.kts
@@ -26,6 +26,8 @@
import com.google.protobuf.gradle.protobuf
import com.google.protobuf.gradle.testProtobuf
+import io.spine.internal.dependency.Protobuf
+import io.spine.internal.dependency.Spine
import io.spine.internal.gradle.base.check
import io.spine.internal.gradle.fs.LazyTempPath
import io.spine.internal.gradle.javascript.javascript
@@ -41,16 +43,21 @@ import io.spine.internal.gradle.javascript.task.webpack
dependencies {
- val spineCoreVersion: String by project.extra
+ val spineCoreVersion = Spine.CoreJava.version
protobuf(project(":web"))
+
protobuf(project(":firebase-web"))
+
protobuf(
group = "io.spine",
name = "spine-client",
version = spineCoreVersion,
classifier = "proto"
- )
+ ) {
+ exclude(Protobuf.protoSrcLib)
+ }
+
testProtobuf(
group = "io.spine",
name = "spine-client",
@@ -59,6 +66,10 @@ dependencies {
)
}
+configurations.all {
+ exclude(group = "com.google.protobuf", module = "protobuf-kotlin")
+}
+
sourceSets {
main {
java.exclude("**/*.*")
diff --git a/client-js/main/client/actor-request-factory.js b/client-js/main/client/actor-request-factory.js
index 9c9971794..fc26e5a19 100644
--- a/client-js/main/client/actor-request-factory.js
+++ b/client-js/main/client/actor-request-factory.js
@@ -29,21 +29,21 @@
import {v4 as newUuid} from 'uuid';
import {Message} from 'google-protobuf';
-import {FieldMask} from '../proto/google/protobuf/field_mask_pb';
-import {Timestamp} from '../proto/google/protobuf/timestamp_pb';
+import {FieldMask} from '../../generated/main/js/google/protobuf/field_mask_pb';
+import {Timestamp} from '../../generated/main/js/google/protobuf/timestamp_pb';
import {
CompositeFilter,
Filter,
IdFilter,
Target,
TargetFilters
-} from '../proto/spine/client/filters_pb';
-import {OrderBy, Query, QueryId, ResponseFormat} from '../proto/spine/client/query_pb';
-import {Topic, TopicId} from '../proto/spine/client/subscription_pb';
-import {ActorContext} from '../proto/spine/core/actor_context_pb';
-import {Command, CommandContext, CommandId} from '../proto/spine/core/command_pb';
-import {UserId} from '../proto/spine/core/user_id_pb';
-import {ZoneId, ZoneOffset} from '../proto/spine/time/time_pb';
+} from '../../generated/main/js/spine/client/filters_pb';
+import {OrderBy, Query, QueryId, ResponseFormat} from '../../generated/main/js/spine/client/query_pb';
+import {Topic, TopicId} from '../../generated/main/js/spine/client/subscription_pb';
+import {ActorContext} from '../../generated/main/js/spine/core/actor_context_pb';
+import {Command, CommandContext, CommandId} from '../../generated/main/js/spine/core/command_pb';
+import {UserId} from '../../generated/main/js/spine/core/user_id_pb';
+import {ZoneId, ZoneOffset} from '../../generated/main/js/spine/time/time_pb';
import {isProtobufMessage, Type, TypedMessage} from './typed-message';
import {AnyPacker} from './any-packer';
import {FieldPaths} from './field-paths';
diff --git a/client-js/main/client/any-packer.js b/client-js/main/client/any-packer.js
index acf5d4160..32acdbec7 100644
--- a/client-js/main/client/any-packer.js
+++ b/client-js/main/client/any-packer.js
@@ -28,7 +28,7 @@
import {Message} from 'google-protobuf';
import {isProtobufMessage, Type, TypedMessage} from './typed-message';
-import {Any} from '../proto/google/protobuf/any_pb';
+import {Any} from '../../generated/main/js/google/protobuf/any_pb';
/**
* An packer of string, number, boolean, and message values from Protobuf `Any`.
diff --git a/client-js/main/client/command-request.js b/client-js/main/client/command-request.js
index 08434432d..ca12e6a5b 100644
--- a/client-js/main/client/command-request.js
+++ b/client-js/main/client/command-request.js
@@ -24,8 +24,8 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-import {CommandId} from "../proto/spine/core/command_pb";
-import {MessageId, Origin} from "../proto/spine/core/diagnostics_pb";
+import {CommandId} from "../../generated/main/js/spine/core/command_pb";
+import {MessageId, Origin} from "../../generated/main/js/spine/core/diagnostics_pb";
import {Filters} from "./actor-request-factory";
import {AnyPacker} from "./any-packer";
import {ClientRequest} from "./client-request";
diff --git a/client-js/main/client/commanding-client.js b/client-js/main/client/commanding-client.js
index fdbafe392..2984dfcc6 100644
--- a/client-js/main/client/commanding-client.js
+++ b/client-js/main/client/commanding-client.js
@@ -24,7 +24,7 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-import {Status} from "../proto/spine/core/response_pb";
+import {Status} from "../../generated/main/js/spine/core/response_pb";
import {CommandRequest} from "./command-request";
import {CommandHandlingError, CommandValidationError, SpineError} from "./errors";
import ObjectToProto from "./object-to-proto";
diff --git a/client-js/main/client/errors.js b/client-js/main/client/errors.js
index 25b4b08d7..c11f7eef4 100644
--- a/client-js/main/client/errors.js
+++ b/client-js/main/client/errors.js
@@ -26,8 +26,8 @@
"use strict";
-import {Error as SpineBaseError} from '../proto/spine/base/error_pb';
-import {ValidationError} from '../proto/spine/validate/validation_error_pb';
+import {Error as SpineBaseError} from '../../generated/main/js/spine/base/error_pb';
+import {ValidationError} from '../../generated/main/js/spine/validate/validation_error_pb';
import {isProtobufMessage} from './typed-message';
/**
diff --git a/client-js/main/client/field-paths.js b/client-js/main/client/field-paths.js
index 6708a817a..20e011a01 100644
--- a/client-js/main/client/field-paths.js
+++ b/client-js/main/client/field-paths.js
@@ -26,7 +26,7 @@
"use strict";
-import {FieldPath} from "../proto/spine/base/field_path_pb";
+import {FieldPath} from "../../generated/main/js/spine/base/field_path_pb";
/**
* A utility for working with `FieldPath` instances.
diff --git a/client-js/main/client/firebase-client.js b/client-js/main/client/firebase-client.js
index 06de11438..9ca95506e 100644
--- a/client-js/main/client/firebase-client.js
+++ b/client-js/main/client/firebase-client.js
@@ -27,9 +27,9 @@
"use strict";
import {Observable, Subject, Subscription} from 'rxjs';
-import {Subscription as SubscriptionObject} from '../proto/spine/client/subscription_pb';
-import {NodePath} from '../proto/spine/web/firebase/client_pb';
-import {SubscriptionOrError} from "../proto/spine/web/subscriptions_pb"
+import {Subscription as SubscriptionObject} from '../../generated/main/js/spine/client/subscription_pb';
+import {NodePath} from '../../generated/main/js/spine/web/firebase/client_pb';
+import {SubscriptionOrError} from "../../generated/main/js/spine/web/subscriptions_pb"
import {AnyPacker} from './any-packer';
import {ActorRequestFactory} from './actor-request-factory';
import {AbstractClientFactory} from './client-factory';
diff --git a/client-js/main/client/firebase-subscription-service.js b/client-js/main/client/firebase-subscription-service.js
index 708574cb1..94315d9d2 100644
--- a/client-js/main/client/firebase-subscription-service.js
+++ b/client-js/main/client/firebase-subscription-service.js
@@ -28,7 +28,7 @@
import {Duration} from './time-utils';
import ObjectToProto from './object-to-proto';
-import {KeepUpOutcome} from '../proto/spine/web/subscriptions_pb';
+import {KeepUpOutcome} from '../../generated/main/js/spine/web/subscriptions_pb';
/**
* The default interval for sending subscription keep up requests.
diff --git a/client-js/main/client/http-endpoint.js b/client-js/main/client/http-endpoint.js
index c7cf124b5..44341eb44 100644
--- a/client-js/main/client/http-endpoint.js
+++ b/client-js/main/client/http-endpoint.js
@@ -28,8 +28,8 @@
import {TypedMessage} from './typed-message';
import {ClientError, ConnectionError, ServerError, SpineError} from './errors';
-import {Subscribe, KeepUp, Cancel} from "../proto/spine/web/subscriptions_pb";
-import {Duration} from "../proto/google/protobuf/duration_pb";
+import {Subscribe, KeepUp, Cancel} from "../../generated/main/js/spine/web/subscriptions_pb";
+import {Duration} from "../../generated/main/js/google/protobuf/duration_pb";
/**
* @typedef {Object} SubscriptionRouting
diff --git a/client-js/main/client/query-request.js b/client-js/main/client/query-request.js
index 8bec87c53..8d42c296a 100644
--- a/client-js/main/client/query-request.js
+++ b/client-js/main/client/query-request.js
@@ -24,7 +24,7 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-import {OrderBy} from "../proto/spine/client/query_pb";
+import {OrderBy} from "../../generated/main/js/spine/client/query_pb";
import {FilteringRequest} from "./filtering-request";
/**
diff --git a/client-js/main/client/tenant.js b/client-js/main/client/tenant.js
index c5e77eaa0..f63e8d1bd 100644
--- a/client-js/main/client/tenant.js
+++ b/client-js/main/client/tenant.js
@@ -24,9 +24,9 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-import {TenantId} from "../proto/spine/core/tenant_id_pb";
-import {EmailAddress} from "../proto/spine/net/email_address_pb";
-import {InternetDomain} from "../proto/spine/net/internet_domain_pb";
+import {TenantId} from "../../generated/main/js/spine/core/tenant_id_pb";
+import {EmailAddress} from "../../generated/main/js/spine/net/email_address_pb";
+import {InternetDomain} from "../../generated/main/js/spine/net/internet_domain_pb";
import {isProtobufMessage, Type} from "./typed-message";
/**
diff --git a/client-js/main/client/time-utils.js b/client-js/main/client/time-utils.js
index 8f2a33cc1..9251508c3 100644
--- a/client-js/main/client/time-utils.js
+++ b/client-js/main/client/time-utils.js
@@ -26,7 +26,7 @@
"use strict";
-import {Timestamp} from '../proto/google/protobuf/timestamp_pb';
+import {Timestamp} from '../../generated/main/js/google/protobuf/timestamp_pb';
/**
* @typedef {Object} DurationValue
diff --git a/client-js/main/client/typed-message.js b/client-js/main/client/typed-message.js
index c4f7575f7..ecd0dd59c 100644
--- a/client-js/main/client/typed-message.js
+++ b/client-js/main/client/typed-message.js
@@ -37,7 +37,7 @@ import {
StringValue,
UInt32Value,
UInt64Value,
-} from '../proto/google/protobuf/wrappers_pb';
+} from '../../generated/main/js/google/protobuf/wrappers_pb';
import {convertDateToTimestamp} from './time-utils';
import KnownTypes from './known-types';
diff --git a/client-js/package.json b/client-js/package.json
index d15a254ea..0f105043d 100644
--- a/client-js/package.json
+++ b/client-js/package.json
@@ -11,7 +11,7 @@
},
"bugs": {
"url": "https://github.com/SpineEventEngine/web/issues",
- "email": "spine-developers@teamdev.com"
+ "email": "developers@spine.io"
},
"directories": {
"test": "test"
@@ -33,30 +33,32 @@
"rxjs": "6.5.x"
},
"dependencies": {
+ "babel-cli": "^6.26.0",
"base64-js": "^1.5.1",
- "google-protobuf": "^3.13.0",
+ "google-protobuf": "3.13.0",
"isomorphic-fetch": "^3.0.0",
- "uuid": "^8.3.2"
+ "node-fetch": "^3.3.0",
+ "uuid": "^9.0.0"
},
"devDependencies": {
- "@babel/cli": "^7.12.10",
- "@babel/core": "^7.12.10",
- "@babel/preset-env": "^7.12.10",
- "@babel/register": "^7.12.10",
- "babel-loader": "^8.2.2",
- "babel-plugin-module-resolver": "^4.0.0",
+ "@babel/cli": "^7.20.7",
+ "@babel/core": "^7.20.12",
+ "@babel/preset-env": "^7.20.2",
+ "@babel/register": "^7.18.9",
+ "babel-loader": "^9.1.2",
+ "babel-plugin-module-resolver": "^5.0.0",
"babel-plugin-transform-builtin-extend": "^1.1.2",
- "codecov": "^3.8.1",
- "firebase": "^9.1.1",
- "jsdoc": "^3.6.6",
+ "firebase": "^9.23.0",
+ "jsdoc": "^4.0.0",
"license-checker": "^25.0.1",
- "mocha": "^8.2.1",
+ "minimist": "^1.2.7",
+ "mocha": "^10.2.0",
"nyc": "^15.1.0",
- "rxjs": "~6.5.5",
- "sinon": "^9.2.2",
- "webpack": "^5.56.0",
- "webpack-cli": "^4.2.0",
- "webpack-merge": "^4.2.2"
+ "rxjs": "^7.8.0",
+ "sinon": "^15.0.0",
+ "webpack": "^5.89.0",
+ "webpack-cli": "^5.1.4",
+ "webpack-merge": "^5.10.0"
},
"sideEffects": true,
"main": "index.js"
diff --git a/client-js/webpack-dev.config.js b/client-js/webpack-dev.config.js
index e9b3356e3..948c3dc25 100644
--- a/client-js/webpack-dev.config.js
+++ b/client-js/webpack-dev.config.js
@@ -1,5 +1,5 @@
/*
- * Copyright 2022, TeamDev. All rights reserved.
+ * Copyright 2023, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -24,7 +24,7 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-const merge = require('webpack-merge');
+const merge = require('webpack-merge').merge;
const common = require('./webpack-common.config');
module.exports = merge(common, {
@@ -32,4 +32,4 @@ module.exports = merge(common, {
output: {
filename: 'bundle.umd.js', // the filename template for entry chunks
},
-});
+});
\ No newline at end of file
diff --git a/client-js/webpack-prod.config.js b/client-js/webpack-prod.config.js
index ebe80325b..89cdc0766 100644
--- a/client-js/webpack-prod.config.js
+++ b/client-js/webpack-prod.config.js
@@ -1,5 +1,5 @@
/*
- * Copyright 2022, TeamDev. All rights reserved.
+ * Copyright 2023, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -24,7 +24,7 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-const merge = require('webpack-merge');
+const merge = require('webpack-merge').merge;
const common = require('./webpack-common.config');
module.exports = merge(common, {
@@ -32,4 +32,4 @@ module.exports = merge(common, {
output: {
filename: 'bundle.umd.min.js', // the filename template for entry chunks
},
-});
+});
\ No newline at end of file
diff --git a/client-ts/.babelrc b/client-ts/.babelrc
new file mode 100644
index 000000000..916a4713f
--- /dev/null
+++ b/client-ts/.babelrc
@@ -0,0 +1,15 @@
+{
+ "presets": [
+ "@babel/preset-env"
+ ],
+ "plugins": [
+ [
+ "babel-plugin-transform-builtin-extend",
+ {
+ "globals": [
+ "Error"
+ ]
+ }
+ ]
+ ]
+}
diff --git a/client-ts/.gitignore b/client-ts/.gitignore
new file mode 100644
index 000000000..574168398
--- /dev/null
+++ b/client-ts/.gitignore
@@ -0,0 +1,6 @@
+node_modules
+dist
+main/proto
+test/proto
+package-lock.json
+.nyc_output
diff --git a/client-ts/.npmrc b/client-ts/.npmrc
new file mode 100644
index 000000000..10cc6dde3
--- /dev/null
+++ b/client-ts/.npmrc
@@ -0,0 +1,2 @@
+//registry.npmjs.org/:_authToken=${NPM_TOKEN}
+package-lock=true
diff --git a/client-ts/.nvmrc b/client-ts/.nvmrc
new file mode 100644
index 000000000..260a0e20f
--- /dev/null
+++ b/client-ts/.nvmrc
@@ -0,0 +1 @@
+12.19.0
diff --git a/client-ts/README.md b/client-ts/README.md
new file mode 100644
index 000000000..c67c5f850
--- /dev/null
+++ b/client-ts/README.md
@@ -0,0 +1,85 @@
+# Spine Web TypeScript client library
+
+This module is a TypeScript library that communicates with Spine Web server.
+
+It’s a facade for sending
+domain commands, querying data, and subscribing to entity states. The latest published version can
+be found on [NPM][spine-web-npm].
+
+The NPM artifact provides the following:
+
+* `spine-web` files along with used Protobuf definitions.
+
+* Types from [google-protobuf][protobuf-npm] NPM package.
+ These types should be used since they are additionally processed
+ by Spine's Protobuf plugin for JS.
+
+
+[spine-web-npm]: https://www.npmjs.com/package/spine-web
+[protobuf-npm]: https://www.npmjs.com/package/google-protobuf
+
+## Environment installation
+
+First, make sure that Node.js `v12.19.0` is installed and the NPM version is `v6.14.7` or higher.
+See the [Downloading and installing Node.js and npm][install-npm-docs]
+section for detailed installation instructions.
+
+[install-npm-docs]: https://docs.npmjs.com/downloading-and-installing-node-js-and-npm
+
+## Usage
+
+To use the library, execute the command:
+
+```bash
+npm i spine-web --save
+```
+
+Also, the library has [peer dependencies][peer-dependencies] that you need to install:
+
+```bash
+npm i rxjs --save
+```
+
+For a full list of peer dependencies, see [package.json](./package.json).
+
+[peer-dependencies]: https://docs.npmjs.com/files/package.json#peerdependencies
+
+## Testing
+
+Run the tests using the following command:
+
+```bash
+npm run test
+```
+
+You can also run tests from IntelliJ IDEA. To do so:
+
+1. Install [NodeJs Plugin][idea-nodejs]. The plugin adds `Mocha` configuration.
+
+2. Use [`webpack-test.config.js`](./test/webpack-test.config.js) as IDEA Webpack configuration.
+
+ This allows IDEA resolve aliases the very same way Babel does for us in tests.
+
+3. Update `Mocha` configuration template:
+
+ * Add `--require @babel/register` to `Extra Mocha options`.
+
+ It is required to support all ES6 features in Node.js environment.
+
+ * Specify the path to `Mocha` package: `/client-ts/node_modules/mocha`.
+
+[idea-nodejs]: https://plugins.jetbrains.com/plugin/6098-nodejs
+
+## Publishing
+
+To publish a new version to NPM:
+
+1. Log in to NPM and generate a new access token.
+
+2. Set the generated token to your `NPM_TOKEN` environment variable.
+
+3. Execute Gradle `publishJs` task from a project root:
+
+ ```bash
+ ./gradlew publishTs
+ ```
diff --git a/client-ts/build.gradle.kts b/client-ts/build.gradle.kts
new file mode 100644
index 000000000..8012b2e2c
--- /dev/null
+++ b/client-ts/build.gradle.kts
@@ -0,0 +1,137 @@
+/*
+ * Copyright 2024, TeamDev. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Redistribution and use in source and/or binary forms, with or without
+ * modification, must retain the above copyright notice and the following
+ * disclaimer.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+import com.google.protobuf.gradle.protobuf
+import com.google.protobuf.gradle.testProtobuf
+import io.spine.internal.dependency.Protobuf
+import io.spine.internal.dependency.Spine
+import io.spine.internal.gradle.base.check
+import io.spine.internal.gradle.fs.LazyTempPath
+import io.spine.internal.gradle.typescript.plugin.idea
+import io.spine.internal.gradle.typescript.plugin.protobuf
+import io.spine.internal.gradle.typescript.task.assemble
+import io.spine.internal.gradle.typescript.task.clean
+import io.spine.internal.gradle.typescript.task.check
+import io.spine.internal.gradle.typescript.task.coverageTs
+import io.spine.internal.gradle.typescript.task.publish
+import io.spine.internal.gradle.typescript.task.webpack
+import io.spine.internal.gradle.typescript.typescript
+
+dependencies {
+
+ val spineCoreVersion = Spine.CoreJava.version
+
+ protobuf(project(":web"))
+
+ protobuf(project(":firebase-web"))
+
+ protobuf(
+ group = "io.spine",
+ name = "spine-client",
+ version = spineCoreVersion,
+ classifier = "proto"
+ ) {
+ exclude(Protobuf.protoSrcLib)
+ }
+
+ testProtobuf(
+ group = "io.spine",
+ name = "spine-client",
+ version = spineCoreVersion,
+ classifier = "proto"
+ )
+}
+
+configurations.all {
+ exclude(group = "com.google.protobuf", module = "protobuf-kotlin")
+}
+
+sourceSets {
+ main {
+ java.exclude("**/*.*")
+ resources.exclude("**/*.*")
+ }
+ test {
+ java.exclude("**/*.*")
+ resources.exclude("**/*.*")
+ }
+}
+
+typescript {
+ plugins {
+ protobuf()
+ idea()
+ }
+ tasks {
+ assemble {
+ webpack()
+ }
+
+ clean()
+ publish()
+
+ check {
+ rootProject.tasks.check.configure {
+ dependsOn(coverageTs)
+ }
+ }
+
+ // NPM dependencies are not included into license reports.
+ // See issue: https://github.com/SpineEventEngine/config/issues/301
+
+ // licenseReport()
+ }
+}
+
+tasks {
+
+ // Suppress building the JS project as a Java module.
+
+ compileJava {
+ enabled = false
+ }
+ compileTestJava {
+ enabled = false
+ }
+}
+
+val jsDocDir = LazyTempPath("jsDocs")
+val jsDoc by tasks.registering(type = Exec::class) {
+ commandLine(
+ "$projectDir/node_modules/.bin/jsdoc",
+ "-r",
+ "-d",
+ jsDocDir,
+ "$projectDir/main/"
+ )
+}
+
+afterEvaluate {
+ updateGitHubPages {
+ includeInputs.add(jsDocDir)
+ }
+ tasks.getByName("updateGitHubPages").dependsOn(jsDoc)
+}
diff --git a/buildSrc/src/main/kotlin/io/spine/internal/dependency/AutoCommon.kt b/client-ts/index.js
similarity index 86%
rename from buildSrc/src/main/kotlin/io/spine/internal/dependency/AutoCommon.kt
rename to client-ts/index.js
index 4053ef585..39d1e7cb1 100644
--- a/buildSrc/src/main/kotlin/io/spine/internal/dependency/AutoCommon.kt
+++ b/client-ts/index.js
@@ -23,11 +23,6 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
+'use strict';
-package io.spine.internal.dependency
-
-// https://github.com/google/auto
-object AutoCommon {
- private const val version = "1.2.1"
- const val lib = "com.google.auto:auto-common:${version}"
-}
+module.exports = require('./dist/bundle.umd.min');
diff --git a/client-ts/package.json b/client-ts/package.json
new file mode 100644
index 000000000..586d065c4
--- /dev/null
+++ b/client-ts/package.json
@@ -0,0 +1,65 @@
+{
+ "name": "spine-web",
+ "version": "2.0.0-SNAPSHOT.74",
+ "license": "Apache-2.0",
+ "description": "A JS client for interacting with Spine applications.",
+ "homepage": "https://spine.io",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/SpineEventEngine/web",
+ "directory": "client-js"
+ },
+ "bugs": {
+ "url": "https://github.com/SpineEventEngine/web/issues",
+ "email": "developers@spine.io"
+ },
+ "directories": {
+ "test": "test"
+ },
+ "scripts": {
+ "build": "npx webpack --config webpack-prod.config.js",
+ "build-dev": "npx webpack --config webpack-dev.config.js",
+ "transpile-before-publish": "npx babel main --out-dir build/npm-publication --source-maps",
+ "coverage:unix": "npx nyc --reporter=text-lcov npm run test >| build/coverage.lcov",
+ "coverage:win": "npx nyc --reporter=text-lcov npm run test > build/coverage.lcov",
+ "test": "npx mocha --require @babel/register --recursive --exit --full-trace ./test",
+ "license-report": "node ./license-report/generate-license-report-md.js"
+ },
+ "engines": {
+ "node": ">=12.19.0",
+ "npm": ">=6.14.7"
+ },
+ "peerDependencies": {
+ "rxjs": "6.5.x"
+ },
+ "dependencies": {
+ "babel-cli": "^6.26.0",
+ "base64-js": "^1.5.1",
+ "google-protobuf": "^3.20.1",
+ "isomorphic-fetch": "^3.0.0",
+ "node-fetch": "^3.3.0",
+ "uuid": "^9.0.0"
+ },
+ "devDependencies": {
+ "@babel/cli": "^7.20.7",
+ "@babel/core": "^7.20.12",
+ "@babel/preset-env": "^7.20.2",
+ "@babel/register": "^7.18.9",
+ "babel-loader": "^9.1.2",
+ "babel-plugin-module-resolver": "^5.0.0",
+ "babel-plugin-transform-builtin-extend": "^1.1.2",
+ "firebase": "^9.23.0",
+ "jsdoc": "^4.0.0",
+ "license-checker": "^25.0.1",
+ "minimist": "^1.2.7",
+ "mocha": "^10.2.0",
+ "nyc": "^15.1.0",
+ "rxjs": "^7.8.0",
+ "sinon": "^15.0.0",
+ "webpack": "^5.89.0",
+ "webpack-cli": "^5.1.4",
+ "webpack-merge": "^5.10.0"
+ },
+ "sideEffects": true,
+ "main": "index.js"
+}
diff --git a/client-ts/webpack-common.config.js b/client-ts/webpack-common.config.js
new file mode 100644
index 000000000..494dec563
--- /dev/null
+++ b/client-ts/webpack-common.config.js
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2022, TeamDev. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Redistribution and use in source and/or binary forms, with or without
+ * modification, must retain the above copyright notice and the following
+ * disclaimer.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+let glob = require("glob");
+
+let allProtoFiles = glob.sync('./main/proto/**/*.js');
+let entries = allProtoFiles.concat(['./main/index.js']);
+
+module.exports = {
+ entry: entries,
+ mode: 'none', // "production" | "development" | "none"
+ output: {
+ library: 'spine-web', // the name of the exported library
+ libraryTarget: 'umd', // the type of the exported library,
+ umdNamedDefine: true,
+ globalObject: "typeof window !== 'undefined' ? window : this" // https://github.com/webpack/webpack/issues/6522
+ },
+ devtool: 'source-map',
+ externals: [
+ {
+ "isomorphic-fetch": {
+ root: 'isomorphic-fetch',
+ commonjs2: 'isomorphic-fetch',
+ commonjs: 'isomorphic-fetch',
+ amd: 'isomorphic-fetch'
+ }
+ }
+ ],
+ module: {
+ rules: [{
+ test: /\.jsx?$/,
+ exclude: /(node_modules|bower_components)/,
+ loader: 'babel-loader'
+ }]
+ }
+};
diff --git a/client-ts/webpack-dev.config.js b/client-ts/webpack-dev.config.js
new file mode 100644
index 000000000..948c3dc25
--- /dev/null
+++ b/client-ts/webpack-dev.config.js
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2023, TeamDev. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Redistribution and use in source and/or binary forms, with or without
+ * modification, must retain the above copyright notice and the following
+ * disclaimer.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+const merge = require('webpack-merge').merge;
+const common = require('./webpack-common.config');
+
+module.exports = merge(common, {
+ mode: 'development', // "production" | "development" | "none"
+ output: {
+ filename: 'bundle.umd.js', // the filename template for entry chunks
+ },
+});
\ No newline at end of file
diff --git a/client-ts/webpack-prod.config.js b/client-ts/webpack-prod.config.js
new file mode 100644
index 000000000..89cdc0766
--- /dev/null
+++ b/client-ts/webpack-prod.config.js
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2023, TeamDev. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Redistribution and use in source and/or binary forms, with or without
+ * modification, must retain the above copyright notice and the following
+ * disclaimer.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+const merge = require('webpack-merge').merge;
+const common = require('./webpack-common.config');
+
+module.exports = merge(common, {
+ mode: 'production', // "production" | "development" | "none"
+ output: {
+ filename: 'bundle.umd.min.js', // the filename template for entry chunks
+ },
+});
\ No newline at end of file
diff --git a/config b/config
index cebfd51c9..e021e993b 160000
--- a/config
+++ b/config
@@ -1 +1 @@
-Subproject commit cebfd51c94121ff35699d17d7dc2e29dc87b7879
+Subproject commit e021e993b6b9d5d5ae414e48d5089fd51819653f
diff --git a/firebase-web/build.gradle.kts b/firebase-web/build.gradle.kts
index c54733c32..f3444a243 100644
--- a/firebase-web/build.gradle.kts
+++ b/firebase-web/build.gradle.kts
@@ -24,18 +24,20 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-import com.google.protobuf.gradle.builtins
-import com.google.protobuf.gradle.generateProtoTasks
-import com.google.protobuf.gradle.id
-import com.google.protobuf.gradle.protobuf
-import com.google.protobuf.gradle.protoc
+//import com.google.protobuf.gradle.builtins
+//import com.google.protobuf.gradle.generateProtoTasks
+//import com.google.protobuf.gradle.id
+//import com.google.protobuf.gradle.protobuf
+//import com.google.protobuf.gradle.protoc
+import com.google.protobuf.gradle.*
import io.spine.internal.dependency.Firebase
import io.spine.internal.dependency.HttpClient
import io.spine.internal.dependency.Jackson
import io.spine.internal.dependency.Protobuf
import io.spine.internal.dependency.Slf4J
+import io.spine.internal.dependency.Spine
import io.spine.internal.gradle.checkstyle.CheckStyleConfig
-import io.spine.internal.gradle.excludeProtobufLite
+//import io.spine.internal.gradle.excludeProtobufLite
plugins {
id("io.spine.mc-java")
@@ -48,7 +50,7 @@ configurations.excludeProtobufLite()
val spineBaseTypesVersion: String by extra
dependencies {
- api("io.spine:spine-base-types:$spineBaseTypesVersion")
+ api(Spine.baseTypes)
api(project(":web"))
api(Firebase.admin) {
exclude(group = "com.google.guava", module = "guava")
@@ -65,28 +67,28 @@ dependencies {
testImplementation(project(":testutil-web"))
}
-val compileProtoToJs by tasks.registering {
- description = "Compiles Protobuf sources into JavaScript."
-}
-
CheckStyleConfig.applyTo(project)
-protobuf {
- protoc {
- artifact = Protobuf.compiler
- }
- generateProtoTasks {
- all().forEach { task ->
- task.builtins {
- id("js") {
- // For information on JavaScript code generation please see
- // https://github.com/google/protobuf/blob/master/js/README.md
- option("import_style=commonjs")
- }
- }
- compileProtoToJs {
- dependsOn(task)
- }
- }
- }
-}
+//val compileProtoToJs by tasks.registering {
+// description = "Compiles Protobuf sources into JavaScript."
+//}
+//
+//protobuf {
+// protoc {
+// artifact = Protobuf.compiler
+// }
+// generateProtoTasks {
+// all().forEach { task ->
+// task.builtins {
+// id("js") {
+// // For information on JavaScript code generation please see
+// // https://github.com/google/protobuf/blob/master/js/README.md
+// option("import_style=commonjs")
+// }
+// }
+// compileProtoToJs {
+// dependsOn(task)
+// }
+// }
+// }
+//}
\ No newline at end of file
diff --git a/firebase-web/src/main/java/io/spine/web/firebase/DatabaseUrls.java b/firebase-web/src/main/java/io/spine/web/firebase/DatabaseUrls.java
index 35d1aa132..e58a8dcfd 100644
--- a/firebase-web/src/main/java/io/spine/web/firebase/DatabaseUrls.java
+++ b/firebase-web/src/main/java/io/spine/web/firebase/DatabaseUrls.java
@@ -63,6 +63,6 @@ public static DatabaseUrl from(String dbUrl) {
.newBuilder()
.setUrl(Urls.create(url))
.setNamespace(namespace)
- .vBuild();
+ .build();
}
}
diff --git a/firebase-web/src/main/java/io/spine/web/firebase/FirebaseClientFactory.java b/firebase-web/src/main/java/io/spine/web/firebase/FirebaseClientFactory.java
index e92132429..bdcdc33a3 100644
--- a/firebase-web/src/main/java/io/spine/web/firebase/FirebaseClientFactory.java
+++ b/firebase-web/src/main/java/io/spine/web/firebase/FirebaseClientFactory.java
@@ -28,7 +28,7 @@
import com.google.api.client.extensions.appengine.http.UrlFetchTransport;
import com.google.api.client.http.HttpTransport;
-import com.google.api.client.http.apache.ApacheHttpTransport;
+import com.google.api.client.http.apache.v2.ApacheHttpTransport;
import com.google.api.client.util.BackOff;
import com.google.api.client.util.ExponentialBackOff;
import com.google.firebase.database.FirebaseDatabase;
diff --git a/firebase-web/src/main/java/io/spine/web/firebase/NodePaths.java b/firebase-web/src/main/java/io/spine/web/firebase/NodePaths.java
index 0c21fd7ac..9dafb43c7 100644
--- a/firebase-web/src/main/java/io/spine/web/firebase/NodePaths.java
+++ b/firebase-web/src/main/java/io/spine/web/firebase/NodePaths.java
@@ -80,7 +80,7 @@ public static NodePath of(String path) {
return NodePath
.newBuilder()
.setValue(escaped(path))
- .vBuild();
+ .build();
}
private static String concatPath(String... elements) {
@@ -90,7 +90,7 @@ private static String concatPath(String... elements) {
pathElements.add(element);
}
}
- String path = pathJoiner.join(pathElements);
+ var path = pathJoiner.join(pathElements);
return path;
}
diff --git a/firebase-web/src/main/java/io/spine/web/firebase/NodeValue.java b/firebase-web/src/main/java/io/spine/web/firebase/NodeValue.java
index 374029f87..f61be1735 100644
--- a/firebase-web/src/main/java/io/spine/web/firebase/NodeValue.java
+++ b/firebase-web/src/main/java/io/spine/web/firebase/NodeValue.java
@@ -39,7 +39,7 @@
import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.net.MediaType.JSON_UTF_8;
import static com.google.firebase.database.utilities.PushIdGenerator.generatePushChildName;
-import static io.spine.json.Json.fromJson;
+import static io.spine.type.Json.fromJson;
/**
* The Firebase database node value.
@@ -100,11 +100,11 @@ public ByteArrayContent toByteArray() {
/**
* Parses this node value as a message of the given type.
*
- * @see io.spine.json.Json#fromJson(String, Class)
+ * @see io.spine.type.Json#fromJson(Class, String)
*/
public M as(Class cls) {
var jsonMessage = value.toString();
- return fromJson(jsonMessage, cls);
+ return fromJson(cls, jsonMessage);
}
/**
diff --git a/firebase-web/src/main/java/io/spine/web/firebase/StoredJson.java b/firebase-web/src/main/java/io/spine/web/firebase/StoredJson.java
index a7036323a..d8c782806 100644
--- a/firebase-web/src/main/java/io/spine/web/firebase/StoredJson.java
+++ b/firebase-web/src/main/java/io/spine/web/firebase/StoredJson.java
@@ -36,7 +36,7 @@
import io.spine.value.StringTypeValue;
import static com.google.common.base.Preconditions.checkNotNull;
-import static io.spine.json.Json.toCompactJson;
+import static io.spine.type.Json.toCompactJson;
/**
* A JSON representation of data stored in a node of a Firebase Realtime DB.
diff --git a/firebase-web/src/main/java/io/spine/web/firebase/query/FirebaseQueryBridge.java b/firebase-web/src/main/java/io/spine/web/firebase/query/FirebaseQueryBridge.java
index 4cf848464..4de7c4142 100644
--- a/firebase-web/src/main/java/io/spine/web/firebase/query/FirebaseQueryBridge.java
+++ b/firebase-web/src/main/java/io/spine/web/firebase/query/FirebaseQueryBridge.java
@@ -45,7 +45,7 @@
* More formally, for each encountered {@link Query}, the bridge performs a call to
* the {@code QueryService} and stores the resulting entity states into the given database. The data
* is stored as a list of strings. Each entry is
- * a {@linkplain io.spine.json.Json JSON representation} of an entity state. The path produced by
+ * a {@linkplain io.spine.type.Json JSON representation} of an entity state. The path produced by
* the bridge as a result is the path to the database node containing all those records.
* The absolute position of such a node is not specified, thus the result path is the only way
* to read the data from the database.
@@ -78,7 +78,7 @@ var record = new QueryRecord(query, queryResponse);
.newBuilder()
.setPath(record.path().getValue())
.setCount(queryResponse.getMessageCount())
- .vBuild();
+ .build();
}
/**
diff --git a/firebase-web/src/main/java/io/spine/web/firebase/rest/RestNodeUrls.java b/firebase-web/src/main/java/io/spine/web/firebase/rest/RestNodeUrls.java
index 61d031e31..0056fbc73 100644
--- a/firebase-web/src/main/java/io/spine/web/firebase/rest/RestNodeUrls.java
+++ b/firebase-web/src/main/java/io/spine/web/firebase/rest/RestNodeUrls.java
@@ -59,7 +59,7 @@ RestNodeUrl with(NodePath path) {
var url = withinDatabase(path);
var node = RestNodeUrl.newBuilder()
.setUrl(url)
- .vBuild();
+ .build();
return node;
}
diff --git a/firebase-web/src/main/java/io/spine/web/firebase/subscription/SubscriptionRepository.java b/firebase-web/src/main/java/io/spine/web/firebase/subscription/SubscriptionRepository.java
index 0812ba87d..fde889eda 100644
--- a/firebase-web/src/main/java/io/spine/web/firebase/subscription/SubscriptionRepository.java
+++ b/firebase-web/src/main/java/io/spine/web/firebase/subscription/SubscriptionRepository.java
@@ -35,7 +35,7 @@
import io.spine.client.Subscription;
import io.spine.client.SubscriptionId;
import io.spine.client.Topic;
-import io.spine.json.Json;
+import io.spine.type.Json;
import io.spine.web.SubscriptionOrError;
import io.spine.web.WebSubscription;
import io.spine.web.firebase.FirebaseClient;
@@ -225,7 +225,7 @@ private static String asJson(DataSnapshot snapshot) {
}
private TimedSubscription loadSubscription(String json) {
- var subscription = Json.fromJson(json, TimedSubscription.class);
+ var subscription = Json.fromJson(TimedSubscription.class, json);
repository.healthLog.put(subscription);
return subscription;
}
diff --git a/firebase-web/src/test/java/io/spine/web/firebase/NodePathsTest.java b/firebase-web/src/test/java/io/spine/web/firebase/NodePathsTest.java
index f0832d772..183c92f70 100644
--- a/firebase-web/src/test/java/io/spine/web/firebase/NodePathsTest.java
+++ b/firebase-web/src/test/java/io/spine/web/firebase/NodePathsTest.java
@@ -45,7 +45,7 @@ void createsNodePath() {
var testPath = "test-path";
var expected = NodePath.newBuilder()
.setValue(testPath)
- .vBuild();
+ .build();
assertEquals(expected, NodePaths.of(testPath));
}
}
diff --git a/firebase-web/src/test/java/io/spine/web/firebase/given/FirebaseSubscriptionBridgeTestEnv.java b/firebase-web/src/test/java/io/spine/web/firebase/given/FirebaseSubscriptionBridgeTestEnv.java
index 6bce1ebc0..ef2b9cdde 100644
--- a/firebase-web/src/test/java/io/spine/web/firebase/given/FirebaseSubscriptionBridgeTestEnv.java
+++ b/firebase-web/src/test/java/io/spine/web/firebase/given/FirebaseSubscriptionBridgeTestEnv.java
@@ -86,14 +86,14 @@ public static Subscription newSubscription(Topic topic) {
return Subscription.newBuilder()
.setId(subscriptionId())
.setTopic(topic)
- .vBuild();
+ .build();
}
public static Target newTarget() {
return Target.newBuilder()
.setType(TypeUrl.of(Nothing.getDefaultInstance()).value())
.setIncludeAll(true)
- .vBuild();
+ .build();
}
public static FirebaseSubscriptionBridge
@@ -108,13 +108,13 @@ public static Target newTarget() {
public static TopicFactory topicFactory() {
var userId = UserId.newBuilder()
.setValue("test-user")
- .vBuild();
+ .build();
return new TestActorRequestFactory(userId).topic();
}
private static SubscriptionId subscriptionId() {
return SubscriptionId.newBuilder()
.setValue("test-subscription")
- .vBuild();
+ .build();
}
}
diff --git a/firebase-web/src/test/java/io/spine/web/firebase/query/FirebaseQueryBridgeTest.java b/firebase-web/src/test/java/io/spine/web/firebase/query/FirebaseQueryBridgeTest.java
index 063413ccb..e5127c76f 100644
--- a/firebase-web/src/test/java/io/spine/web/firebase/query/FirebaseQueryBridgeTest.java
+++ b/firebase-web/src/test/java/io/spine/web/firebase/query/FirebaseQueryBridgeTest.java
@@ -30,7 +30,7 @@
import com.google.gson.JsonElement;
import com.google.protobuf.Message;
import io.spine.client.QueryFactory;
-import io.spine.json.Json;
+import io.spine.type.Json;
import io.spine.server.BoundedContextBuilder;
import io.spine.server.QueryService;
import io.spine.testing.client.TestActorRequestFactory;
@@ -133,13 +133,13 @@ void testWriteData() {
private static T firstFieldOf(NodeValue nodeValue, Class message) {
var json = nodeValue.underlyingJson();
var entries = json.entrySet();
- JsonElement value = Iterators
+ var value = Iterators
.getOnlyElement(entries.iterator())
.getValue();
var messageJson = StoredJson
.from(value.getAsString())
.asJsonObject()
.toString();
- return Json.fromJson(messageJson, message);
+ return Json.fromJson(message, messageJson);
}
}
diff --git a/firebase-web/src/test/java/io/spine/web/firebase/query/RequestNodePathTest.java b/firebase-web/src/test/java/io/spine/web/firebase/query/RequestNodePathTest.java
index 3457142f9..603b4a99c 100644
--- a/firebase-web/src/test/java/io/spine/web/firebase/query/RequestNodePathTest.java
+++ b/firebase-web/src/test/java/io/spine/web/firebase/query/RequestNodePathTest.java
@@ -74,21 +74,21 @@ void testConstruct() {
void testTenantAware() {
var domain = InternetDomain.newBuilder()
.setValue("spine.io")
- .vBuild();
+ .build();
var domainTenant = TenantId.newBuilder()
.setDomain(domain)
- .vBuild();
+ .build();
var email = EmailAddress.newBuilder()
.setValue("john@doe.org")
- .vBuild();
+ .build();
var emailTenant = TenantId.newBuilder().setEmail(email)
- .vBuild();
+ .build();
var firstValueTenant = TenantId.newBuilder()
.setValue("first tenant")
- .vBuild();
+ .build();
var secondValueTenant = TenantId.newBuilder()
.setValue("second tenant")
- .vBuild();
+ .build();
var paths = Stream.of(domainTenant,
emailTenant,
firstValueTenant,
diff --git a/firebase-web/src/test/java/io/spine/web/firebase/subscription/TestSubscriptionService.java b/firebase-web/src/test/java/io/spine/web/firebase/subscription/TestSubscriptionService.java
index 3c2d08d5b..e8004936d 100644
--- a/firebase-web/src/test/java/io/spine/web/firebase/subscription/TestSubscriptionService.java
+++ b/firebase-web/src/test/java/io/spine/web/firebase/subscription/TestSubscriptionService.java
@@ -43,7 +43,7 @@ public void subscribe(Topic request, StreamObserver observer) {
var subscription = Subscription.newBuilder()
.setId(SubscriptionId.newBuilder().setValue(newUuid()))
.setTopic(request)
- .vBuild();
+ .build();
observer.onNext(subscription);
observer.onCompleted();
}
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
index 7454180f2..afba10928 100644
Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index aa991fcea..b1624c473 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,5 +1,6 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.3-bin.zip
+networkTimeout=10000
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
diff --git a/gradlew b/gradlew
index 1b6c78733..65dcd68d6 100755
--- a/gradlew
+++ b/gradlew
@@ -55,7 +55,7 @@
# Darwin, MinGW, and NonStop.
#
# (3) This script is generated from the Groovy template
-# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
+# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# within the Gradle project.
#
# You can find Gradle at https://github.com/gradle/gradle/.
@@ -80,10 +80,10 @@ do
esac
done
-APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
-
-APP_NAME="Gradle"
+# This is normally unused
+# shellcheck disable=SC2034
APP_BASE_NAME=${0##*/}
+APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
@@ -143,12 +143,16 @@ fi
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
case $MAX_FD in #(
max*)
+ # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
+ # shellcheck disable=SC3045
MAX_FD=$( ulimit -H -n ) ||
warn "Could not query maximum file descriptor limit"
esac
case $MAX_FD in #(
'' | soft) :;; #(
*)
+ # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
+ # shellcheck disable=SC3045
ulimit -n "$MAX_FD" ||
warn "Could not set maximum file descriptor limit to $MAX_FD"
esac
@@ -205,6 +209,12 @@ set -- \
org.gradle.wrapper.GradleWrapperMain \
"$@"
+# Stop when "xargs" is not available.
+if ! command -v xargs >/dev/null 2>&1
+then
+ die "xargs is not available"
+fi
+
# Use "xargs" to parse quoted args.
#
# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
diff --git a/gradlew.bat b/gradlew.bat
index 107acd32c..93e3f59f1 100644
--- a/gradlew.bat
+++ b/gradlew.bat
@@ -14,7 +14,7 @@
@rem limitations under the License.
@rem
-@if "%DEBUG%" == "" @echo off
+@if "%DEBUG%"=="" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@@ -25,7 +25,8 @@
if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
-if "%DIRNAME%" == "" set DIRNAME=.
+if "%DIRNAME%"=="" set DIRNAME=.
+@rem This is normally unused
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@@ -40,7 +41,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
-if "%ERRORLEVEL%" == "0" goto execute
+if %ERRORLEVEL% equ 0 goto execute
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
@@ -75,13 +76,15 @@ set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
:end
@rem End local scope for the variables with windows NT shell
-if "%ERRORLEVEL%"=="0" goto mainEnd
+if %ERRORLEVEL% equ 0 goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
-if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
-exit /b 1
+set EXIT_CODE=%ERRORLEVEL%
+if %EXIT_CODE% equ 0 set EXIT_CODE=1
+if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
+exit /b %EXIT_CODE%
:mainEnd
if "%OS%"=="Windows_NT" endlocal
diff --git a/integration-tests/js-tests/build.gradle.kts b/integration-tests/js-tests/build.gradle.kts
index 5fda3df9c..580b4d99c 100644
--- a/integration-tests/js-tests/build.gradle.kts
+++ b/integration-tests/js-tests/build.gradle.kts
@@ -39,6 +39,10 @@ dependencies {
}
}
+configurations.all {
+ exclude(group = "com.google.protobuf", module = "protobuf-kotlin")
+}
+
javascript {
plugins {
mcJs()
diff --git a/integration-tests/test-app/build.gradle.kts b/integration-tests/test-app/build.gradle.kts
index a90c68b64..0b54df3b1 100644
--- a/integration-tests/test-app/build.gradle.kts
+++ b/integration-tests/test-app/build.gradle.kts
@@ -24,6 +24,7 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
+import io.spine.internal.dependency.Spine
import io.spine.internal.gradle.checkstyle.CheckStyleConfig
plugins {
@@ -32,11 +33,9 @@ plugins {
id("io.spine.mc-java")
}
-val spineCoreVersion: String by extra
-
dependencies {
implementation(project(":firebase-web"))
- implementation("io.spine:spine-server:$spineCoreVersion")
+ implementation(Spine.server)
}
CheckStyleConfig.applyTo(project)
diff --git a/integration-tests/test-app/src/main/java/io/spine/web/test/given/ProjectAggregate.java b/integration-tests/test-app/src/main/java/io/spine/web/test/given/ProjectAggregate.java
index eb40b1ce0..6bd364934 100644
--- a/integration-tests/test-app/src/main/java/io/spine/web/test/given/ProjectAggregate.java
+++ b/integration-tests/test-app/src/main/java/io/spine/web/test/given/ProjectAggregate.java
@@ -41,7 +41,7 @@ ProjectCreated handle(CreateProject command) {
return ProjectCreated
.newBuilder()
.setId(command.getId())
- .vBuild();
+ .build();
}
@Apply
diff --git a/integration-tests/test-app/src/main/java/io/spine/web/test/given/TaskAggregate.java b/integration-tests/test-app/src/main/java/io/spine/web/test/given/TaskAggregate.java
index 00a818994..8887d43c5 100644
--- a/integration-tests/test-app/src/main/java/io/spine/web/test/given/TaskAggregate.java
+++ b/integration-tests/test-app/src/main/java/io/spine/web/test/given/TaskAggregate.java
@@ -49,7 +49,7 @@ TaskCreated handle(CreateTask command) {
taskCreated.setAssignee(command.getAssignee());
}
- return taskCreated.vBuild();
+ return taskCreated.build();
}
@Assign
@@ -58,7 +58,7 @@ TaskRenamed handle(RenameTask command) {
.setId(command.getId())
.setName(command.getName())
.setWhen(currentTime())
- .vBuild();
+ .build();
}
@Assign
@@ -71,7 +71,7 @@ TaskReassigned handle(ReassignTask command) {
taskReassigned.setFrom(state().getAssignee());
}
- return taskReassigned.vBuild();
+ return taskReassigned.build();
}
@Apply
diff --git a/integration-tests/test-app/src/main/java/io/spine/web/test/given/UserInfoAggregate.java b/integration-tests/test-app/src/main/java/io/spine/web/test/given/UserInfoAggregate.java
index b1926aa4f..8cc8fc019 100644
--- a/integration-tests/test-app/src/main/java/io/spine/web/test/given/UserInfoAggregate.java
+++ b/integration-tests/test-app/src/main/java/io/spine/web/test/given/UserInfoAggregate.java
@@ -39,7 +39,7 @@ UserInfoAdded handle(AddUserInfo command) {
var event = UserInfoAdded.newBuilder()
.setId(command.getId())
.setFullName(command.getFullName())
- .vBuild();
+ .build();
return event;
}
diff --git a/license-report.md b/license-report.md
deleted file mode 100644
index 243df52a7..000000000
--- a/license-report.md
+++ /dev/null
@@ -1,5308 +0,0 @@
-
-
-# Dependencies of `io.spine:spine-client-js:2.0.0-SNAPSHOT.74`
-
-## Runtime
-1. **Group** : com.google.code.findbugs. **Name** : jsr305. **Version** : 3.0.2.
- * **Project URL:** [http://findbugs.sourceforge.net/](http://findbugs.sourceforge.net/)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.code.gson. **Name** : gson. **Version** : 2.9.0.
- * **Project URL:** [https://github.com/google/gson/gson](https://github.com/google/gson/gson)
- * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.errorprone. **Name** : error_prone_annotations. **Version** : 2.10.0.
- * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.errorprone. **Name** : error_prone_type_annotations. **Version** : 2.10.0.
- * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.flogger. **Name** : flogger. **Version** : 0.7.4.
- * **Project URL:** [https://github.com/google/flogger](https://github.com/google/flogger)
- * **License:** [Apache 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.guava. **Name** : failureaccess. **Version** : 1.0.1.
- * **Project URL:** [https://github.com/google/guava/](https://github.com/google/guava/)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.guava. **Name** : guava. **Version** : 31.1-jre.
- * **Project URL:** [https://github.com/google/guava](https://github.com/google/guava)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.guava. **Name** : listenablefuture. **Version** : 9999.0-empty-to-avoid-conflict-with-guava.
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.j2objc. **Name** : j2objc-annotations. **Version** : 1.3.
- * **Project URL:** [https://github.com/google/j2objc/](https://github.com/google/j2objc/)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.protobuf. **Name** : protobuf-java. **Version** : 3.19.4.
- * **Project URL:** [https://developers.google.com/protocol-buffers/](https://developers.google.com/protocol-buffers/)
- * **License:** [3-Clause BSD License](https://opensource.org/licenses/BSD-3-Clause)
-
-1. **Group** : com.google.protobuf. **Name** : protobuf-java-util. **Version** : 3.19.4.
- * **Project URL:** [https://developers.google.com/protocol-buffers/](https://developers.google.com/protocol-buffers/)
- * **License:** [3-Clause BSD License](https://opensource.org/licenses/BSD-3-Clause)
-
-1. **Group** : com.google.protobuf. **Name** : protobuf-kotlin. **Version** : 3.19.4.
- * **License:** [3-Clause BSD License](https://opensource.org/licenses/BSD-3-Clause)
-
-1. **Group** : javax.annotation. **Name** : javax.annotation-api. **Version** : 1.3.2.
- * **Project URL:** [http://jcp.org/en/jsr/detail?id=250](http://jcp.org/en/jsr/detail?id=250)
- * **License:** [CDDL + GPLv2 with classpath exception](https://github.com/javaee/javax.annotation/blob/master/LICENSE)
-
-1. **Group** : org.checkerframework. **Name** : checker-compat-qual. **Version** : 2.5.5.
- * **Project URL:** [https://checkerframework.org](https://checkerframework.org)
- * **License:** [GNU General Public License, version 2 (GPL2), with the classpath exception](http://www.gnu.org/software/classpath/license.html)
- * **License:** [The MIT License](http://opensource.org/licenses/MIT)
-
-1. **Group** : org.checkerframework. **Name** : checker-qual. **Version** : 3.21.3.
- * **Project URL:** [https://checkerframework.org](https://checkerframework.org)
- * **License:** [The MIT License](http://opensource.org/licenses/MIT)
-
-1. **Group** : org.jetbrains. **Name** : annotations. **Version** : 13.0.
- * **Project URL:** [http://www.jetbrains.org](http://www.jetbrains.org)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-common. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk7. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk8. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-## Compile, tests, and tooling
-1. **Group** : com.beust. **Name** : jcommander. **Version** : 1.48.
- * **Project URL:** [http://beust.com/jcommander](http://beust.com/jcommander)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.fasterxml.jackson. **Name** : jackson-bom. **Version** : 2.13.2.**No license information found**
-1. **Group** : com.fasterxml.jackson.core. **Name** : jackson-annotations. **Version** : 2.13.2.
- * **Project URL:** [http://github.com/FasterXML/jackson](http://github.com/FasterXML/jackson)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.fasterxml.jackson.core. **Name** : jackson-core. **Version** : 2.13.2.
- * **Project URL:** [https://github.com/FasterXML/jackson-core](https://github.com/FasterXML/jackson-core)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.fasterxml.jackson.core. **Name** : jackson-databind. **Version** : 2.13.2.2.
- * **Project URL:** [http://github.com/FasterXML/jackson](http://github.com/FasterXML/jackson)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.fasterxml.jackson.dataformat. **Name** : jackson-dataformat-xml. **Version** : 2.13.2.
- * **Project URL:** [https://github.com/FasterXML/jackson-dataformat-xml](https://github.com/FasterXML/jackson-dataformat-xml)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.fasterxml.jackson.module. **Name** : jackson-module-kotlin. **Version** : 2.13.2.
- * **Project URL:** [https://github.com/FasterXML/jackson-module-kotlin](https://github.com/FasterXML/jackson-module-kotlin)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.fasterxml.woodstox. **Name** : woodstox-core. **Version** : 6.2.7.
- * **Project URL:** [https://github.com/FasterXML/woodstox](https://github.com/FasterXML/woodstox)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.github.ben-manes.caffeine. **Name** : caffeine. **Version** : 2.8.8.
- * **Project URL:** [https://github.com/ben-manes/caffeine](https://github.com/ben-manes/caffeine)
- * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.github.kevinstern. **Name** : software-and-algorithms. **Version** : 1.0.
- * **Project URL:** [https://www.github.com/KevinStern/software-and-algorithms](https://www.github.com/KevinStern/software-and-algorithms)
- * **License:** [MIT License](http://www.opensource.org/licenses/mit-license.php)
-
-1. **Group** : com.google.android. **Name** : annotations. **Version** : 4.1.1.4.
- * **Project URL:** [http://source.android.com/](http://source.android.com/)
- * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0)
-
-1. **Group** : com.google.api. **Name** : api-common. **Version** : 2.1.1.
- * **Project URL:** [https://github.com/googleapis/api-common-java](https://github.com/googleapis/api-common-java)
- * **License:** [BSD](https://github.com/googleapis/api-common-java/blob/master/LICENSE)
-
-1. **Group** : com.google.api. **Name** : gax. **Version** : 2.7.1.
- * **Project URL:** [https://github.com/googleapis/gax-java](https://github.com/googleapis/gax-java)
- * **License:** [BSD](https://github.com/googleapis/gax-java/blob/master/LICENSE)
-
-1. **Group** : com.google.api. **Name** : gax-grpc. **Version** : 1.66.0.
- * **Project URL:** [https://github.com/googleapis/gax-java](https://github.com/googleapis/gax-java)
- * **License:** [BSD](https://github.com/googleapis/gax-java/blob/master/LICENSE)
-
-1. **Group** : com.google.api. **Name** : gax-httpjson. **Version** : 0.83.0.
- * **Project URL:** [https://github.com/googleapis/gax-java](https://github.com/googleapis/gax-java)
- * **License:** [BSD](https://github.com/googleapis/gax-java/blob/master/LICENSE)
-
-1. **Group** : com.google.api-client. **Name** : google-api-client. **Version** : 1.32.2.
- * **Project URL:** [https://developers.google.com/api-client-library/java/](https://developers.google.com/api-client-library/java/)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.api-client. **Name** : google-api-client-gson. **Version** : 1.32.1.
- * **Project URL:** [https://googleapis.dev/java/google-api-client/1.32.1/index.html](https://googleapis.dev/java/google-api-client/1.32.1/index.html)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.api.grpc. **Name** : proto-google-cloud-firestore-v1. **Version** : 2.6.1.
- * **Project URL:** [https://github.com/googleapis/java-firestore/proto-google-cloud-firestore-v1](https://github.com/googleapis/java-firestore/proto-google-cloud-firestore-v1)
- * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.api.grpc. **Name** : proto-google-common-protos. **Version** : 2.7.0.
- * **Project URL:** [https://github.com/googleapis/java-iam/proto-google-common-protos](https://github.com/googleapis/java-iam/proto-google-common-protos)
- * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.api.grpc. **Name** : proto-google-iam-v1. **Version** : 1.2.0.
- * **Project URL:** [https://github.com/googleapis/java-iam/proto-google-iam-v1](https://github.com/googleapis/java-iam/proto-google-iam-v1)
- * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.apis. **Name** : google-api-services-storage. **Version** : v1-rev20210127-1.32.1.
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.auth. **Name** : google-auth-library-credentials. **Version** : 1.3.0.
- * **License:** [BSD New license](http://opensource.org/licenses/BSD-3-Clause)
-
-1. **Group** : com.google.auth. **Name** : google-auth-library-oauth2-http. **Version** : 1.3.0.
- * **License:** [BSD New license](http://opensource.org/licenses/BSD-3-Clause)
-
-1. **Group** : com.google.auto. **Name** : auto-common. **Version** : 1.2.1.
- * **Project URL:** [https://github.com/google/auto/tree/master/common](https://github.com/google/auto/tree/master/common)
- * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.auto.service. **Name** : auto-service-annotations. **Version** : 1.0.1.
- * **Project URL:** [https://github.com/google/auto/tree/master/service](https://github.com/google/auto/tree/master/service)
- * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.auto.value. **Name** : auto-value-annotations. **Version** : 1.9.
- * **Project URL:** [https://github.com/google/auto/tree/master/value](https://github.com/google/auto/tree/master/value)
- * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.cloud. **Name** : google-cloud-core. **Version** : 2.3.3.
- * **Project URL:** [https://github.com/googleapis/java-core](https://github.com/googleapis/java-core)
- * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.cloud. **Name** : google-cloud-core-grpc. **Version** : 1.95.4.
- * **Project URL:** [https://github.com/googleapis/java-core](https://github.com/googleapis/java-core)
- * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.cloud. **Name** : google-cloud-core-http. **Version** : 1.95.4.
- * **Project URL:** [https://github.com/googleapis/java-core](https://github.com/googleapis/java-core)
- * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.cloud. **Name** : google-cloud-firestore. **Version** : 2.6.1.
- * **Project URL:** [https://github.com/googleapis/java-firestore](https://github.com/googleapis/java-firestore)
- * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.cloud. **Name** : google-cloud-storage. **Version** : 1.118.0.
- * **Project URL:** [https://github.com/googleapis/java-storage](https://github.com/googleapis/java-storage)
- * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.cloud. **Name** : proto-google-cloud-firestore-bundle-v1. **Version** : 2.6.1.
- * **Project URL:** [https://github.com/googleapis/java-firestore/proto-google-cloud-firestore-bundle-v1](https://github.com/googleapis/java-firestore/proto-google-cloud-firestore-bundle-v1)
- * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.code.findbugs. **Name** : jFormatString. **Version** : 3.0.0.
- * **Project URL:** [http://findbugs.sourceforge.net/](http://findbugs.sourceforge.net/)
- * **License:** [GNU Lesser Public License](http://www.gnu.org/licenses/lgpl.html)
-
-1. **Group** : com.google.code.findbugs. **Name** : jsr305. **Version** : 3.0.2.
- * **Project URL:** [http://findbugs.sourceforge.net/](http://findbugs.sourceforge.net/)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.code.gson. **Name** : gson. **Version** : 2.9.0.
- * **Project URL:** [https://github.com/google/gson/gson](https://github.com/google/gson/gson)
- * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.errorprone. **Name** : error_prone_annotation. **Version** : 2.10.0.
- * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.errorprone. **Name** : error_prone_annotations. **Version** : 2.10.0.
- * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.errorprone. **Name** : error_prone_check_api. **Version** : 2.10.0.
- * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.errorprone. **Name** : error_prone_core. **Version** : 2.10.0.
- * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.errorprone. **Name** : error_prone_type_annotations. **Version** : 2.10.0.
- * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.firebase. **Name** : firebase-admin. **Version** : 8.1.0.
- * **Project URL:** [https://firebase.google.com/](https://firebase.google.com/)
- * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.flogger. **Name** : flogger. **Version** : 0.7.4.
- * **Project URL:** [https://github.com/google/flogger](https://github.com/google/flogger)
- * **License:** [Apache 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.flogger. **Name** : flogger-system-backend. **Version** : 0.7.4.
- * **Project URL:** [https://github.com/google/flogger](https://github.com/google/flogger)
- * **License:** [Apache 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.guava. **Name** : failureaccess. **Version** : 1.0.1.
- * **Project URL:** [https://github.com/google/guava/](https://github.com/google/guava/)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.guava. **Name** : guava. **Version** : 31.1-jre.
- * **Project URL:** [https://github.com/google/guava](https://github.com/google/guava)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.guava. **Name** : guava-testlib. **Version** : 31.1-jre.
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.guava. **Name** : listenablefuture. **Version** : 9999.0-empty-to-avoid-conflict-with-guava.
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.http-client. **Name** : google-http-client. **Version** : 1.41.5.
- * **Project URL:** [https://www.google.com/](https://www.google.com/)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.http-client. **Name** : google-http-client-apache. **Version** : 2.1.2.
- * **Project URL:** [http://www.google.com/](http://www.google.com/)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.http-client. **Name** : google-http-client-apache-v2. **Version** : 1.41.5.
- * **Project URL:** [https://www.google.com/](https://www.google.com/)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.http-client. **Name** : google-http-client-appengine. **Version** : 1.39.2.
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.http-client. **Name** : google-http-client-gson. **Version** : 1.41.5.
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.http-client. **Name** : google-http-client-jackson2. **Version** : 1.41.5.
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.j2objc. **Name** : j2objc-annotations. **Version** : 1.3.
- * **Project URL:** [https://github.com/google/j2objc/](https://github.com/google/j2objc/)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.oauth-client. **Name** : google-oauth-client. **Version** : 1.32.1.
- * **Project URL:** [https://www.google.com/](https://www.google.com/)
- * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.protobuf. **Name** : protobuf-java. **Version** : 3.19.4.
- * **Project URL:** [https://developers.google.com/protocol-buffers/](https://developers.google.com/protocol-buffers/)
- * **License:** [3-Clause BSD License](https://opensource.org/licenses/BSD-3-Clause)
-
-1. **Group** : com.google.protobuf. **Name** : protobuf-java-util. **Version** : 3.19.4.
- * **Project URL:** [https://developers.google.com/protocol-buffers/](https://developers.google.com/protocol-buffers/)
- * **License:** [3-Clause BSD License](https://opensource.org/licenses/BSD-3-Clause)
-
-1. **Group** : com.google.protobuf. **Name** : protobuf-kotlin. **Version** : 3.19.4.
- * **License:** [3-Clause BSD License](https://opensource.org/licenses/BSD-3-Clause)
-
-1. **Group** : com.google.protobuf. **Name** : protoc. **Version** : 3.19.4.
- * **Project URL:** [https://developers.google.com/protocol-buffers/](https://developers.google.com/protocol-buffers/)
- * **License:** [3-Clause BSD License](https://opensource.org/licenses/BSD-3-Clause)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.truth. **Name** : truth. **Version** : 1.1.3.
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.truth.extensions. **Name** : truth-java8-extension. **Version** : 1.1.3.
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.truth.extensions. **Name** : truth-liteproto-extension. **Version** : 1.1.3.
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.truth.extensions. **Name** : truth-proto-extension. **Version** : 1.1.3.
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : commons-codec. **Name** : commons-codec. **Version** : 1.15.
- * **Project URL:** [https://commons.apache.org/proper/commons-codec/](https://commons.apache.org/proper/commons-codec/)
- * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : commons-io. **Name** : commons-io. **Version** : 2.6.
- * **Project URL:** [http://commons.apache.org/proper/commons-io/](http://commons.apache.org/proper/commons-io/)
- * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : commons-logging. **Name** : commons-logging. **Version** : 1.2.
- * **Project URL:** [http://commons.apache.org/proper/commons-logging/](http://commons.apache.org/proper/commons-logging/)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : io.github.java-diff-utils. **Name** : java-diff-utils. **Version** : 4.0.
- * **Project URL:** [https://github.com/java-diff-utils/java-diff-utils](https://github.com/java-diff-utils/java-diff-utils)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : io.grpc. **Name** : grpc-api. **Version** : 1.38.0.
- * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
- * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
-
-1. **Group** : io.grpc. **Name** : grpc-context. **Version** : 1.45.1.
- * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
- * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
-
-1. **Group** : io.grpc. **Name** : grpc-core. **Version** : 1.38.0.
- * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
- * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
-
-1. **Group** : io.grpc. **Name** : grpc-protobuf. **Version** : 1.38.0.
- * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
- * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
-
-1. **Group** : io.grpc. **Name** : grpc-protobuf-lite. **Version** : 1.38.0.
- * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
- * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
-
-1. **Group** : io.grpc. **Name** : grpc-stub. **Version** : 1.38.0.
- * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
- * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
-
-1. **Group** : io.netty. **Name** : netty-buffer. **Version** : 4.1.72.Final.
- * **Project URL:** [https://netty.io/](https://netty.io/)
- * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0)
-
-1. **Group** : io.netty. **Name** : netty-codec. **Version** : 4.1.72.Final.
- * **Project URL:** [https://netty.io/](https://netty.io/)
- * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0)
-
-1. **Group** : io.netty. **Name** : netty-codec-http. **Version** : 4.1.72.Final.
- * **Project URL:** [https://netty.io/](https://netty.io/)
- * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0)
-
-1. **Group** : io.netty. **Name** : netty-common. **Version** : 4.1.72.Final.
- * **Project URL:** [https://netty.io/](https://netty.io/)
- * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0)
-
-1. **Group** : io.netty. **Name** : netty-handler. **Version** : 4.1.72.Final.
- * **Project URL:** [https://netty.io/](https://netty.io/)
- * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0)
-
-1. **Group** : io.netty. **Name** : netty-resolver. **Version** : 4.1.72.Final.
- * **Project URL:** [https://netty.io/](https://netty.io/)
- * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0)
-
-1. **Group** : io.netty. **Name** : netty-tcnative-classes. **Version** : 2.0.46.Final.**No license information found**
-1. **Group** : io.netty. **Name** : netty-transport. **Version** : 4.1.72.Final.
- * **Project URL:** [https://netty.io/](https://netty.io/)
- * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0)
-
-1. **Group** : io.opencensus. **Name** : opencensus-api. **Version** : 0.21.0.
- * **Project URL:** [https://github.com/census-instrumentation/opencensus-java](https://github.com/census-instrumentation/opencensus-java)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : io.opencensus. **Name** : opencensus-contrib-grpc-util. **Version** : 0.28.0.
- * **Project URL:** [https://github.com/census-instrumentation/opencensus-java](https://github.com/census-instrumentation/opencensus-java)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : io.opencensus. **Name** : opencensus-contrib-http-util. **Version** : 0.18.0.
- * **Project URL:** [https://github.com/census-instrumentation/opencensus-java](https://github.com/census-instrumentation/opencensus-java)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : io.perfmark. **Name** : perfmark-api. **Version** : 0.23.0.
- * **Project URL:** [https://github.com/perfmark/perfmark](https://github.com/perfmark/perfmark)
- * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
-
-1. **Group** : javax.annotation. **Name** : javax.annotation-api. **Version** : 1.3.2.
- * **Project URL:** [http://jcp.org/en/jsr/detail?id=250](http://jcp.org/en/jsr/detail?id=250)
- * **License:** [CDDL + GPLv2 with classpath exception](https://github.com/javaee/javax.annotation/blob/master/LICENSE)
-
-1. **Group** : javax.servlet. **Name** : javax.servlet-api. **Version** : 3.1.0.
- * **Project URL:** [http://servlet-spec.java.net](http://servlet-spec.java.net)
- * **License:** [CDDL + GPLv2 with classpath exception](https://glassfish.dev.java.net/nonav/public/CDDL+GPL.html)
-
-1. **Group** : junit. **Name** : junit. **Version** : 4.13.1.
- * **Project URL:** [http://junit.org](http://junit.org)
- * **License:** [Eclipse Public License 1.0](http://www.eclipse.org/legal/epl-v10.html)
-
-1. **Group** : net.java.dev.jna. **Name** : jna. **Version** : 5.6.0.
- * **Project URL:** [https://github.com/java-native-access/jna](https://github.com/java-native-access/jna)
- * **License:** [Apache License v2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
- * **License:** [LGPL, version 2.1](http://www.gnu.org/licenses/licenses.html)
-
-1. **Group** : net.sourceforge.pmd. **Name** : pmd-core. **Version** : 6.44.0.
- * **License:** [BSD-style](http://pmd.sourceforge.net/license.html)
-
-1. **Group** : net.sourceforge.pmd. **Name** : pmd-java. **Version** : 6.44.0.
- * **License:** [BSD-style](http://pmd.sourceforge.net/license.html)
-
-1. **Group** : net.sourceforge.saxon. **Name** : saxon. **Version** : 9.1.0.8.
- * **Project URL:** [http://saxon.sourceforge.net/](http://saxon.sourceforge.net/)
- * **License:** [Mozilla Public License Version 1.0](http://www.mozilla.org/MPL/MPL-1.0.txt)
-
-1. **Group** : org.antlr. **Name** : antlr4-runtime. **Version** : 4.7.2.
- * **Project URL:** [http://www.antlr.org](http://www.antlr.org)
- * **License:** [The BSD License](http://www.antlr.org/license.html)
-
-1. **Group** : org.apache.commons. **Name** : commons-lang3. **Version** : 3.8.1.
- * **Project URL:** [http://commons.apache.org/proper/commons-lang/](http://commons.apache.org/proper/commons-lang/)
- * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.apache.httpcomponents. **Name** : httpclient. **Version** : 4.5.13.
- * **Project URL:** [http://hc.apache.org/httpcomponents-client](http://hc.apache.org/httpcomponents-client)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.apache.httpcomponents. **Name** : httpcore. **Version** : 4.4.14.
- * **Project URL:** [http://hc.apache.org/httpcomponents-core-ga](http://hc.apache.org/httpcomponents-core-ga)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.apiguardian. **Name** : apiguardian-api. **Version** : 1.1.2.
- * **Project URL:** [https://github.com/apiguardian-team/apiguardian](https://github.com/apiguardian-team/apiguardian)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.checkerframework. **Name** : checker-compat-qual. **Version** : 2.5.5.
- * **Project URL:** [https://checkerframework.org](https://checkerframework.org)
- * **License:** [GNU General Public License, version 2 (GPL2), with the classpath exception](http://www.gnu.org/software/classpath/license.html)
- * **License:** [The MIT License](http://opensource.org/licenses/MIT)
-
-1. **Group** : org.checkerframework. **Name** : checker-qual. **Version** : 3.21.3.
- * **Project URL:** [https://checkerframework.org](https://checkerframework.org)
- * **License:** [The MIT License](http://opensource.org/licenses/MIT)
-
-1. **Group** : org.checkerframework. **Name** : dataflow-errorprone. **Version** : 3.15.0.
- * **Project URL:** [https://checkerframework.org](https://checkerframework.org)
- * **License:** [GNU General Public License, version 2 (GPL2), with the classpath exception](http://www.gnu.org/software/classpath/license.html)
-
-1. **Group** : org.codehaus.mojo. **Name** : animal-sniffer-annotations. **Version** : 1.21.
- * **License:** [MIT license](http://www.opensource.org/licenses/mit-license.php)
- * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.codehaus.woodstox. **Name** : stax2-api. **Version** : 4.2.1.
- * **Project URL:** [http://github.com/FasterXML/stax2-api](http://github.com/FasterXML/stax2-api)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
- * **License:** [The BSD License](http://www.opensource.org/licenses/bsd-license.php)
-
-1. **Group** : org.conscrypt. **Name** : conscrypt-openjdk-uber. **Version** : 2.5.1.
- * **Project URL:** [https://conscrypt.org/](https://conscrypt.org/)
- * **License:** [Apache 2](https://www.apache.org/licenses/LICENSE-2.0)
-
-1. **Group** : org.eclipse.jgit. **Name** : org.eclipse.jgit. **Version** : 4.4.1.201607150455-r.
- * **License:** Eclipse Distribution License (New BSD License)
-
-1. **Group** : org.freemarker. **Name** : freemarker. **Version** : 2.3.31.
- * **Project URL:** [https://freemarker.apache.org/](https://freemarker.apache.org/)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.hamcrest. **Name** : hamcrest-core. **Version** : 1.3.
- * **License:** [New BSD License](http://www.opensource.org/licenses/bsd-license.php)
-
-1. **Group** : org.jacoco. **Name** : org.jacoco.agent. **Version** : 0.8.7.
- * **License:** [Eclipse Public License 2.0](https://www.eclipse.org/legal/epl-2.0/)
-
-1. **Group** : org.jacoco. **Name** : org.jacoco.ant. **Version** : 0.8.7.
- * **License:** [Eclipse Public License 2.0](https://www.eclipse.org/legal/epl-2.0/)
-
-1. **Group** : org.jacoco. **Name** : org.jacoco.core. **Version** : 0.8.7.
- * **License:** [Eclipse Public License 2.0](https://www.eclipse.org/legal/epl-2.0/)
-
-1. **Group** : org.jacoco. **Name** : org.jacoco.report. **Version** : 0.8.7.
- * **License:** [Eclipse Public License 2.0](https://www.eclipse.org/legal/epl-2.0/)
-
-1. **Group** : org.jetbrains. **Name** : annotations. **Version** : 13.0.
- * **Project URL:** [http://www.jetbrains.org](http://www.jetbrains.org)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains. **Name** : markdown. **Version** : 0.2.4.**No license information found**
-1. **Group** : org.jetbrains. **Name** : markdown-jvm. **Version** : 0.2.4.
- * **Project URL:** [https://github.com/JetBrains/markdown](https://github.com/JetBrains/markdown)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.dokka. **Name** : dokka-analysis. **Version** : 1.6.20.
- * **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.dokka. **Name** : dokka-base. **Version** : 1.6.20.
- * **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.dokka. **Name** : dokka-core. **Version** : 1.6.20.
- * **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.dokka. **Name** : kotlin-analysis-compiler. **Version** : 1.6.20.
- * **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.dokka. **Name** : kotlin-analysis-intellij. **Version** : 1.6.20.
- * **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.dokka. **Name** : kotlin-as-java-plugin. **Version** : 1.6.20.
- * **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.intellij.deps. **Name** : trove4j. **Version** : 1.0.20200330.
- * **Project URL:** [https://github.com/JetBrains/intellij-deps-trove4j](https://github.com/JetBrains/intellij-deps-trove4j)
- * **License:** [GNU LESSER GENERAL PUBLIC LICENSE 2.1](https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-compiler-embeddable. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-daemon-embeddable. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-klib-commonizer-embeddable. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-reflect. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-script-runtime. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-scripting-common. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-scripting-compiler-embeddable. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-scripting-compiler-impl-embeddable. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-scripting-jvm. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-common. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk7. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk8. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-bom. **Version** : 1.6.0.**No license information found**
-1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-core. **Version** : 1.6.0.**No license information found**
-1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-core-jvm. **Version** : 1.6.0.
- * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)
- * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-html-jvm. **Version** : 0.7.3.
- * **Project URL:** [https://github.com/Kotlin/kotlinx.html](https://github.com/Kotlin/kotlinx.html)
- * **License:** [The Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jsoup. **Name** : jsoup. **Version** : 1.13.1.
- * **Project URL:** [https://jsoup.org/](https://jsoup.org/)
- * **License:** [The MIT License](https://jsoup.org/license)
-
-1. **Group** : org.junit. **Name** : junit-bom. **Version** : 5.8.2.**No license information found**
-1. **Group** : org.junit.jupiter. **Name** : junit-jupiter-api. **Version** : 5.8.2.
- * **Project URL:** [https://junit.org/junit5/](https://junit.org/junit5/)
- * **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
-
-1. **Group** : org.junit.jupiter. **Name** : junit-jupiter-engine. **Version** : 5.8.2.
- * **Project URL:** [https://junit.org/junit5/](https://junit.org/junit5/)
- * **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
-
-1. **Group** : org.junit.jupiter. **Name** : junit-jupiter-params. **Version** : 5.8.2.
- * **Project URL:** [https://junit.org/junit5/](https://junit.org/junit5/)
- * **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
-
-1. **Group** : org.junit.platform. **Name** : junit-platform-commons. **Version** : 1.8.2.
- * **Project URL:** [https://junit.org/junit5/](https://junit.org/junit5/)
- * **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
-
-1. **Group** : org.junit.platform. **Name** : junit-platform-engine. **Version** : 1.8.2.
- * **Project URL:** [https://junit.org/junit5/](https://junit.org/junit5/)
- * **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
-
-1. **Group** : org.opentest4j. **Name** : opentest4j. **Version** : 1.2.0.
- * **Project URL:** [https://github.com/ota4j-team/opentest4j](https://github.com/ota4j-team/opentest4j)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.ow2.asm. **Name** : asm. **Version** : 9.1.
- * **Project URL:** [http://asm.ow2.io/](http://asm.ow2.io/)
- * **License:** [BSD-3-Clause](https://asm.ow2.io/license.html)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.ow2.asm. **Name** : asm. **Version** : 9.2.
- * **Project URL:** [http://asm.ow2.io/](http://asm.ow2.io/)
- * **License:** [BSD-3-Clause](https://asm.ow2.io/license.html)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.ow2.asm. **Name** : asm-analysis. **Version** : 9.1.
- * **Project URL:** [http://asm.ow2.io/](http://asm.ow2.io/)
- * **License:** [BSD-3-Clause](https://asm.ow2.io/license.html)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.ow2.asm. **Name** : asm-commons. **Version** : 9.1.
- * **Project URL:** [http://asm.ow2.io/](http://asm.ow2.io/)
- * **License:** [BSD-3-Clause](https://asm.ow2.io/license.html)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.ow2.asm. **Name** : asm-tree. **Version** : 9.1.
- * **Project URL:** [http://asm.ow2.io/](http://asm.ow2.io/)
- * **License:** [BSD-3-Clause](https://asm.ow2.io/license.html)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.pcollections. **Name** : pcollections. **Version** : 2.1.2.
- * **Project URL:** [http://pcollections.org](http://pcollections.org)
- * **License:** [The MIT License](http://www.opensource.org/licenses/mit-license.php)
-
-1. **Group** : org.slf4j. **Name** : slf4j-api. **Version** : 1.7.30.
- * **Project URL:** [http://www.slf4j.org](http://www.slf4j.org)
- * **License:** [MIT License](http://www.opensource.org/licenses/mit-license.php)
-
-1. **Group** : org.threeten. **Name** : threetenbp. **Version** : 1.5.1.
- * **Project URL:** [https://www.threeten.org/threetenbp](https://www.threeten.org/threetenbp)
- * **License:** [BSD 3-clause](https://raw.githubusercontent.com/ThreeTen/threetenbp/master/LICENSE.txt)
-
-
-The dependencies distributed under several licenses, are used according their commercial-use-friendly license.
-
-This report was generated on **Wed May 04 18:13:26 EEST 2022** using [Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under [Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE).
-
-
-
-
-# Dependencies of `io.spine.gcloud:spine-firebase-web:2.0.0-SNAPSHOT.74`
-
-## Runtime
-1. **Group** : com.fasterxml.jackson. **Name** : jackson-bom. **Version** : 2.13.2.**No license information found**
-1. **Group** : com.fasterxml.jackson.core. **Name** : jackson-annotations. **Version** : 2.13.2.
- * **Project URL:** [http://github.com/FasterXML/jackson](http://github.com/FasterXML/jackson)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.fasterxml.jackson.core. **Name** : jackson-core. **Version** : 2.13.2.
- * **Project URL:** [https://github.com/FasterXML/jackson-core](https://github.com/FasterXML/jackson-core)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.fasterxml.jackson.core. **Name** : jackson-databind. **Version** : 2.13.2.2.
- * **Project URL:** [http://github.com/FasterXML/jackson](http://github.com/FasterXML/jackson)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.android. **Name** : annotations. **Version** : 4.1.1.4.
- * **Project URL:** [http://source.android.com/](http://source.android.com/)
- * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0)
-
-1. **Group** : com.google.api. **Name** : api-common. **Version** : 2.1.1.
- * **Project URL:** [https://github.com/googleapis/api-common-java](https://github.com/googleapis/api-common-java)
- * **License:** [BSD](https://github.com/googleapis/api-common-java/blob/master/LICENSE)
-
-1. **Group** : com.google.api. **Name** : gax. **Version** : 2.7.1.
- * **Project URL:** [https://github.com/googleapis/gax-java](https://github.com/googleapis/gax-java)
- * **License:** [BSD](https://github.com/googleapis/gax-java/blob/master/LICENSE)
-
-1. **Group** : com.google.api. **Name** : gax-grpc. **Version** : 1.66.0.
- * **Project URL:** [https://github.com/googleapis/gax-java](https://github.com/googleapis/gax-java)
- * **License:** [BSD](https://github.com/googleapis/gax-java/blob/master/LICENSE)
-
-1. **Group** : com.google.api. **Name** : gax-httpjson. **Version** : 0.83.0.
- * **Project URL:** [https://github.com/googleapis/gax-java](https://github.com/googleapis/gax-java)
- * **License:** [BSD](https://github.com/googleapis/gax-java/blob/master/LICENSE)
-
-1. **Group** : com.google.api-client. **Name** : google-api-client. **Version** : 1.32.2.
- * **Project URL:** [https://developers.google.com/api-client-library/java/](https://developers.google.com/api-client-library/java/)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.api-client. **Name** : google-api-client-gson. **Version** : 1.32.1.
- * **Project URL:** [https://googleapis.dev/java/google-api-client/1.32.1/index.html](https://googleapis.dev/java/google-api-client/1.32.1/index.html)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.api.grpc. **Name** : proto-google-cloud-firestore-v1. **Version** : 2.6.1.
- * **Project URL:** [https://github.com/googleapis/java-firestore/proto-google-cloud-firestore-v1](https://github.com/googleapis/java-firestore/proto-google-cloud-firestore-v1)
- * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.api.grpc. **Name** : proto-google-common-protos. **Version** : 2.7.0.
- * **Project URL:** [https://github.com/googleapis/java-iam/proto-google-common-protos](https://github.com/googleapis/java-iam/proto-google-common-protos)
- * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.api.grpc. **Name** : proto-google-iam-v1. **Version** : 1.2.0.
- * **Project URL:** [https://github.com/googleapis/java-iam/proto-google-iam-v1](https://github.com/googleapis/java-iam/proto-google-iam-v1)
- * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.apis. **Name** : google-api-services-storage. **Version** : v1-rev20210127-1.32.1.
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.auth. **Name** : google-auth-library-credentials. **Version** : 1.3.0.
- * **License:** [BSD New license](http://opensource.org/licenses/BSD-3-Clause)
-
-1. **Group** : com.google.auth. **Name** : google-auth-library-oauth2-http. **Version** : 1.3.0.
- * **License:** [BSD New license](http://opensource.org/licenses/BSD-3-Clause)
-
-1. **Group** : com.google.auto.value. **Name** : auto-value-annotations. **Version** : 1.9.
- * **Project URL:** [https://github.com/google/auto/tree/master/value](https://github.com/google/auto/tree/master/value)
- * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.cloud. **Name** : google-cloud-core. **Version** : 2.3.3.
- * **Project URL:** [https://github.com/googleapis/java-core](https://github.com/googleapis/java-core)
- * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.cloud. **Name** : google-cloud-core-grpc. **Version** : 1.95.4.
- * **Project URL:** [https://github.com/googleapis/java-core](https://github.com/googleapis/java-core)
- * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.cloud. **Name** : google-cloud-core-http. **Version** : 1.95.4.
- * **Project URL:** [https://github.com/googleapis/java-core](https://github.com/googleapis/java-core)
- * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.cloud. **Name** : google-cloud-firestore. **Version** : 2.6.1.
- * **Project URL:** [https://github.com/googleapis/java-firestore](https://github.com/googleapis/java-firestore)
- * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.cloud. **Name** : google-cloud-storage. **Version** : 1.118.0.
- * **Project URL:** [https://github.com/googleapis/java-storage](https://github.com/googleapis/java-storage)
- * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.cloud. **Name** : proto-google-cloud-firestore-bundle-v1. **Version** : 2.6.1.
- * **Project URL:** [https://github.com/googleapis/java-firestore/proto-google-cloud-firestore-bundle-v1](https://github.com/googleapis/java-firestore/proto-google-cloud-firestore-bundle-v1)
- * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.code.findbugs. **Name** : jsr305. **Version** : 3.0.2.
- * **Project URL:** [http://findbugs.sourceforge.net/](http://findbugs.sourceforge.net/)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.code.gson. **Name** : gson. **Version** : 2.9.0.
- * **Project URL:** [https://github.com/google/gson/gson](https://github.com/google/gson/gson)
- * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.errorprone. **Name** : error_prone_annotations. **Version** : 2.10.0.
- * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.errorprone. **Name** : error_prone_type_annotations. **Version** : 2.10.0.
- * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.firebase. **Name** : firebase-admin. **Version** : 8.1.0.
- * **Project URL:** [https://firebase.google.com/](https://firebase.google.com/)
- * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.flogger. **Name** : flogger. **Version** : 0.7.4.
- * **Project URL:** [https://github.com/google/flogger](https://github.com/google/flogger)
- * **License:** [Apache 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.flogger. **Name** : flogger-system-backend. **Version** : 0.7.4.
- * **Project URL:** [https://github.com/google/flogger](https://github.com/google/flogger)
- * **License:** [Apache 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.guava. **Name** : failureaccess. **Version** : 1.0.1.
- * **Project URL:** [https://github.com/google/guava/](https://github.com/google/guava/)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.guava. **Name** : guava. **Version** : 31.1-jre.
- * **Project URL:** [https://github.com/google/guava](https://github.com/google/guava)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.guava. **Name** : listenablefuture. **Version** : 9999.0-empty-to-avoid-conflict-with-guava.
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.http-client. **Name** : google-http-client. **Version** : 1.41.5.
- * **Project URL:** [https://www.google.com/](https://www.google.com/)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.http-client. **Name** : google-http-client-apache. **Version** : 2.1.2.
- * **Project URL:** [http://www.google.com/](http://www.google.com/)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.http-client. **Name** : google-http-client-apache-v2. **Version** : 1.41.5.
- * **Project URL:** [https://www.google.com/](https://www.google.com/)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.http-client. **Name** : google-http-client-appengine. **Version** : 1.39.2.
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.http-client. **Name** : google-http-client-gson. **Version** : 1.41.5.
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.http-client. **Name** : google-http-client-jackson2. **Version** : 1.41.5.
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.j2objc. **Name** : j2objc-annotations. **Version** : 1.3.
- * **Project URL:** [https://github.com/google/j2objc/](https://github.com/google/j2objc/)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.oauth-client. **Name** : google-oauth-client. **Version** : 1.32.1.
- * **Project URL:** [https://www.google.com/](https://www.google.com/)
- * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.protobuf. **Name** : protobuf-java. **Version** : 3.19.4.
- * **Project URL:** [https://developers.google.com/protocol-buffers/](https://developers.google.com/protocol-buffers/)
- * **License:** [3-Clause BSD License](https://opensource.org/licenses/BSD-3-Clause)
-
-1. **Group** : com.google.protobuf. **Name** : protobuf-java-util. **Version** : 3.19.4.
- * **Project URL:** [https://developers.google.com/protocol-buffers/](https://developers.google.com/protocol-buffers/)
- * **License:** [3-Clause BSD License](https://opensource.org/licenses/BSD-3-Clause)
-
-1. **Group** : com.google.protobuf. **Name** : protobuf-kotlin. **Version** : 3.19.4.
- * **License:** [3-Clause BSD License](https://opensource.org/licenses/BSD-3-Clause)
-
-1. **Group** : commons-codec. **Name** : commons-codec. **Version** : 1.15.
- * **Project URL:** [https://commons.apache.org/proper/commons-codec/](https://commons.apache.org/proper/commons-codec/)
- * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : commons-logging. **Name** : commons-logging. **Version** : 1.2.
- * **Project URL:** [http://commons.apache.org/proper/commons-logging/](http://commons.apache.org/proper/commons-logging/)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : io.grpc. **Name** : grpc-api. **Version** : 1.38.0.
- * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
- * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
-
-1. **Group** : io.grpc. **Name** : grpc-context. **Version** : 1.45.1.
- * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
- * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
-
-1. **Group** : io.grpc. **Name** : grpc-core. **Version** : 1.38.0.
- * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
- * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
-
-1. **Group** : io.grpc. **Name** : grpc-protobuf. **Version** : 1.38.0.
- * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
- * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
-
-1. **Group** : io.grpc. **Name** : grpc-protobuf-lite. **Version** : 1.38.0.
- * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
- * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
-
-1. **Group** : io.grpc. **Name** : grpc-stub. **Version** : 1.38.0.
- * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
- * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
-
-1. **Group** : io.netty. **Name** : netty-buffer. **Version** : 4.1.72.Final.
- * **Project URL:** [https://netty.io/](https://netty.io/)
- * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0)
-
-1. **Group** : io.netty. **Name** : netty-codec. **Version** : 4.1.72.Final.
- * **Project URL:** [https://netty.io/](https://netty.io/)
- * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0)
-
-1. **Group** : io.netty. **Name** : netty-codec-http. **Version** : 4.1.72.Final.
- * **Project URL:** [https://netty.io/](https://netty.io/)
- * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0)
-
-1. **Group** : io.netty. **Name** : netty-common. **Version** : 4.1.72.Final.
- * **Project URL:** [https://netty.io/](https://netty.io/)
- * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0)
-
-1. **Group** : io.netty. **Name** : netty-handler. **Version** : 4.1.72.Final.
- * **Project URL:** [https://netty.io/](https://netty.io/)
- * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0)
-
-1. **Group** : io.netty. **Name** : netty-resolver. **Version** : 4.1.72.Final.
- * **Project URL:** [https://netty.io/](https://netty.io/)
- * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0)
-
-1. **Group** : io.netty. **Name** : netty-tcnative-classes. **Version** : 2.0.46.Final.**No license information found**
-1. **Group** : io.netty. **Name** : netty-transport. **Version** : 4.1.72.Final.
- * **Project URL:** [https://netty.io/](https://netty.io/)
- * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0)
-
-1. **Group** : io.opencensus. **Name** : opencensus-api. **Version** : 0.21.0.
- * **Project URL:** [https://github.com/census-instrumentation/opencensus-java](https://github.com/census-instrumentation/opencensus-java)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : io.opencensus. **Name** : opencensus-contrib-grpc-util. **Version** : 0.28.0.
- * **Project URL:** [https://github.com/census-instrumentation/opencensus-java](https://github.com/census-instrumentation/opencensus-java)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : io.opencensus. **Name** : opencensus-contrib-http-util. **Version** : 0.18.0.
- * **Project URL:** [https://github.com/census-instrumentation/opencensus-java](https://github.com/census-instrumentation/opencensus-java)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : io.perfmark. **Name** : perfmark-api. **Version** : 0.23.0.
- * **Project URL:** [https://github.com/perfmark/perfmark](https://github.com/perfmark/perfmark)
- * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
-
-1. **Group** : javax.annotation. **Name** : javax.annotation-api. **Version** : 1.3.2.
- * **Project URL:** [http://jcp.org/en/jsr/detail?id=250](http://jcp.org/en/jsr/detail?id=250)
- * **License:** [CDDL + GPLv2 with classpath exception](https://github.com/javaee/javax.annotation/blob/master/LICENSE)
-
-1. **Group** : javax.servlet. **Name** : javax.servlet-api. **Version** : 3.1.0.
- * **Project URL:** [http://servlet-spec.java.net](http://servlet-spec.java.net)
- * **License:** [CDDL + GPLv2 with classpath exception](https://glassfish.dev.java.net/nonav/public/CDDL+GPL.html)
-
-1. **Group** : org.apache.httpcomponents. **Name** : httpclient. **Version** : 4.5.13.
- * **Project URL:** [http://hc.apache.org/httpcomponents-client](http://hc.apache.org/httpcomponents-client)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.apache.httpcomponents. **Name** : httpcore. **Version** : 4.4.14.
- * **Project URL:** [http://hc.apache.org/httpcomponents-core-ga](http://hc.apache.org/httpcomponents-core-ga)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.checkerframework. **Name** : checker-compat-qual. **Version** : 2.5.5.
- * **Project URL:** [https://checkerframework.org](https://checkerframework.org)
- * **License:** [GNU General Public License, version 2 (GPL2), with the classpath exception](http://www.gnu.org/software/classpath/license.html)
- * **License:** [The MIT License](http://opensource.org/licenses/MIT)
-
-1. **Group** : org.checkerframework. **Name** : checker-qual. **Version** : 3.21.3.
- * **Project URL:** [https://checkerframework.org](https://checkerframework.org)
- * **License:** [The MIT License](http://opensource.org/licenses/MIT)
-
-1. **Group** : org.codehaus.mojo. **Name** : animal-sniffer-annotations. **Version** : 1.21.
- * **License:** [MIT license](http://www.opensource.org/licenses/mit-license.php)
- * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.conscrypt. **Name** : conscrypt-openjdk-uber. **Version** : 2.5.1.
- * **Project URL:** [https://conscrypt.org/](https://conscrypt.org/)
- * **License:** [Apache 2](https://www.apache.org/licenses/LICENSE-2.0)
-
-1. **Group** : org.jetbrains. **Name** : annotations. **Version** : 13.0.
- * **Project URL:** [http://www.jetbrains.org](http://www.jetbrains.org)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-reflect. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-common. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk7. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk8. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.slf4j. **Name** : slf4j-api. **Version** : 1.7.30.
- * **Project URL:** [http://www.slf4j.org](http://www.slf4j.org)
- * **License:** [MIT License](http://www.opensource.org/licenses/mit-license.php)
-
-1. **Group** : org.threeten. **Name** : threetenbp. **Version** : 1.5.1.
- * **Project URL:** [https://www.threeten.org/threetenbp](https://www.threeten.org/threetenbp)
- * **License:** [BSD 3-clause](https://raw.githubusercontent.com/ThreeTen/threetenbp/master/LICENSE.txt)
-
-## Compile, tests, and tooling
-1. **Group** : com.beust. **Name** : jcommander. **Version** : 1.48.
- * **Project URL:** [http://beust.com/jcommander](http://beust.com/jcommander)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.fasterxml.jackson. **Name** : jackson-bom. **Version** : 2.13.2.**No license information found**
-1. **Group** : com.fasterxml.jackson.core. **Name** : jackson-annotations. **Version** : 2.13.2.
- * **Project URL:** [http://github.com/FasterXML/jackson](http://github.com/FasterXML/jackson)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.fasterxml.jackson.core. **Name** : jackson-core. **Version** : 2.13.2.
- * **Project URL:** [https://github.com/FasterXML/jackson-core](https://github.com/FasterXML/jackson-core)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.fasterxml.jackson.core. **Name** : jackson-databind. **Version** : 2.13.2.2.
- * **Project URL:** [http://github.com/FasterXML/jackson](http://github.com/FasterXML/jackson)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.fasterxml.jackson.dataformat. **Name** : jackson-dataformat-xml. **Version** : 2.13.2.
- * **Project URL:** [https://github.com/FasterXML/jackson-dataformat-xml](https://github.com/FasterXML/jackson-dataformat-xml)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.fasterxml.jackson.module. **Name** : jackson-module-kotlin. **Version** : 2.13.2.
- * **Project URL:** [https://github.com/FasterXML/jackson-module-kotlin](https://github.com/FasterXML/jackson-module-kotlin)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.fasterxml.woodstox. **Name** : woodstox-core. **Version** : 6.2.7.
- * **Project URL:** [https://github.com/FasterXML/woodstox](https://github.com/FasterXML/woodstox)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.github.ben-manes.caffeine. **Name** : caffeine. **Version** : 2.8.8.
- * **Project URL:** [https://github.com/ben-manes/caffeine](https://github.com/ben-manes/caffeine)
- * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.github.kevinstern. **Name** : software-and-algorithms. **Version** : 1.0.
- * **Project URL:** [https://www.github.com/KevinStern/software-and-algorithms](https://www.github.com/KevinStern/software-and-algorithms)
- * **License:** [MIT License](http://www.opensource.org/licenses/mit-license.php)
-
-1. **Group** : com.google.android. **Name** : annotations. **Version** : 4.1.1.4.
- * **Project URL:** [http://source.android.com/](http://source.android.com/)
- * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0)
-
-1. **Group** : com.google.api. **Name** : api-common. **Version** : 2.1.1.
- * **Project URL:** [https://github.com/googleapis/api-common-java](https://github.com/googleapis/api-common-java)
- * **License:** [BSD](https://github.com/googleapis/api-common-java/blob/master/LICENSE)
-
-1. **Group** : com.google.api. **Name** : gax. **Version** : 2.7.1.
- * **Project URL:** [https://github.com/googleapis/gax-java](https://github.com/googleapis/gax-java)
- * **License:** [BSD](https://github.com/googleapis/gax-java/blob/master/LICENSE)
-
-1. **Group** : com.google.api. **Name** : gax-grpc. **Version** : 1.66.0.
- * **Project URL:** [https://github.com/googleapis/gax-java](https://github.com/googleapis/gax-java)
- * **License:** [BSD](https://github.com/googleapis/gax-java/blob/master/LICENSE)
-
-1. **Group** : com.google.api. **Name** : gax-httpjson. **Version** : 0.83.0.
- * **Project URL:** [https://github.com/googleapis/gax-java](https://github.com/googleapis/gax-java)
- * **License:** [BSD](https://github.com/googleapis/gax-java/blob/master/LICENSE)
-
-1. **Group** : com.google.api-client. **Name** : google-api-client. **Version** : 1.32.2.
- * **Project URL:** [https://developers.google.com/api-client-library/java/](https://developers.google.com/api-client-library/java/)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.api-client. **Name** : google-api-client-gson. **Version** : 1.32.1.
- * **Project URL:** [https://googleapis.dev/java/google-api-client/1.32.1/index.html](https://googleapis.dev/java/google-api-client/1.32.1/index.html)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.api.grpc. **Name** : proto-google-cloud-firestore-v1. **Version** : 2.6.1.
- * **Project URL:** [https://github.com/googleapis/java-firestore/proto-google-cloud-firestore-v1](https://github.com/googleapis/java-firestore/proto-google-cloud-firestore-v1)
- * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.api.grpc. **Name** : proto-google-common-protos. **Version** : 2.7.0.
- * **Project URL:** [https://github.com/googleapis/java-iam/proto-google-common-protos](https://github.com/googleapis/java-iam/proto-google-common-protos)
- * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.api.grpc. **Name** : proto-google-iam-v1. **Version** : 1.2.0.
- * **Project URL:** [https://github.com/googleapis/java-iam/proto-google-iam-v1](https://github.com/googleapis/java-iam/proto-google-iam-v1)
- * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.apis. **Name** : google-api-services-storage. **Version** : v1-rev20210127-1.32.1.
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.auth. **Name** : google-auth-library-credentials. **Version** : 1.3.0.
- * **License:** [BSD New license](http://opensource.org/licenses/BSD-3-Clause)
-
-1. **Group** : com.google.auth. **Name** : google-auth-library-oauth2-http. **Version** : 1.3.0.
- * **License:** [BSD New license](http://opensource.org/licenses/BSD-3-Clause)
-
-1. **Group** : com.google.auto. **Name** : auto-common. **Version** : 1.2.1.
- * **Project URL:** [https://github.com/google/auto/tree/master/common](https://github.com/google/auto/tree/master/common)
- * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.auto.service. **Name** : auto-service-annotations. **Version** : 1.0.1.
- * **Project URL:** [https://github.com/google/auto/tree/master/service](https://github.com/google/auto/tree/master/service)
- * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.auto.value. **Name** : auto-value-annotations. **Version** : 1.9.
- * **Project URL:** [https://github.com/google/auto/tree/master/value](https://github.com/google/auto/tree/master/value)
- * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.cloud. **Name** : google-cloud-core. **Version** : 2.3.3.
- * **Project URL:** [https://github.com/googleapis/java-core](https://github.com/googleapis/java-core)
- * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.cloud. **Name** : google-cloud-core-grpc. **Version** : 1.95.4.
- * **Project URL:** [https://github.com/googleapis/java-core](https://github.com/googleapis/java-core)
- * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.cloud. **Name** : google-cloud-core-http. **Version** : 1.95.4.
- * **Project URL:** [https://github.com/googleapis/java-core](https://github.com/googleapis/java-core)
- * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.cloud. **Name** : google-cloud-firestore. **Version** : 2.6.1.
- * **Project URL:** [https://github.com/googleapis/java-firestore](https://github.com/googleapis/java-firestore)
- * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.cloud. **Name** : google-cloud-storage. **Version** : 1.118.0.
- * **Project URL:** [https://github.com/googleapis/java-storage](https://github.com/googleapis/java-storage)
- * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.cloud. **Name** : proto-google-cloud-firestore-bundle-v1. **Version** : 2.6.1.
- * **Project URL:** [https://github.com/googleapis/java-firestore/proto-google-cloud-firestore-bundle-v1](https://github.com/googleapis/java-firestore/proto-google-cloud-firestore-bundle-v1)
- * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.code.findbugs. **Name** : jFormatString. **Version** : 3.0.0.
- * **Project URL:** [http://findbugs.sourceforge.net/](http://findbugs.sourceforge.net/)
- * **License:** [GNU Lesser Public License](http://www.gnu.org/licenses/lgpl.html)
-
-1. **Group** : com.google.code.findbugs. **Name** : jsr305. **Version** : 3.0.2.
- * **Project URL:** [http://findbugs.sourceforge.net/](http://findbugs.sourceforge.net/)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.code.gson. **Name** : gson. **Version** : 2.9.0.
- * **Project URL:** [https://github.com/google/gson/gson](https://github.com/google/gson/gson)
- * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.errorprone. **Name** : error_prone_annotation. **Version** : 2.10.0.
- * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.errorprone. **Name** : error_prone_annotations. **Version** : 2.10.0.
- * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.errorprone. **Name** : error_prone_check_api. **Version** : 2.10.0.
- * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.errorprone. **Name** : error_prone_core. **Version** : 2.10.0.
- * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.errorprone. **Name** : error_prone_type_annotations. **Version** : 2.10.0.
- * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.firebase. **Name** : firebase-admin. **Version** : 8.1.0.
- * **Project URL:** [https://firebase.google.com/](https://firebase.google.com/)
- * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.flogger. **Name** : flogger. **Version** : 0.7.4.
- * **Project URL:** [https://github.com/google/flogger](https://github.com/google/flogger)
- * **License:** [Apache 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.flogger. **Name** : flogger-system-backend. **Version** : 0.7.4.
- * **Project URL:** [https://github.com/google/flogger](https://github.com/google/flogger)
- * **License:** [Apache 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.gradle. **Name** : osdetector-gradle-plugin. **Version** : 1.7.0.
- * **Project URL:** [https://github.com/google/osdetector-gradle-plugin](https://github.com/google/osdetector-gradle-plugin)
- * **License:** [Apache License 2.0](http://opensource.org/licenses/Apache-2.0)
-
-1. **Group** : com.google.guava. **Name** : failureaccess. **Version** : 1.0.1.
- * **Project URL:** [https://github.com/google/guava/](https://github.com/google/guava/)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.guava. **Name** : guava. **Version** : 31.1-jre.
- * **Project URL:** [https://github.com/google/guava](https://github.com/google/guava)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.guava. **Name** : guava-testlib. **Version** : 31.1-jre.
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.guava. **Name** : listenablefuture. **Version** : 9999.0-empty-to-avoid-conflict-with-guava.
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.http-client. **Name** : google-http-client. **Version** : 1.41.5.
- * **Project URL:** [https://www.google.com/](https://www.google.com/)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.http-client. **Name** : google-http-client-apache. **Version** : 2.1.2.
- * **Project URL:** [http://www.google.com/](http://www.google.com/)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.http-client. **Name** : google-http-client-apache-v2. **Version** : 1.41.5.
- * **Project URL:** [https://www.google.com/](https://www.google.com/)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.http-client. **Name** : google-http-client-appengine. **Version** : 1.39.2.
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.http-client. **Name** : google-http-client-gson. **Version** : 1.41.5.
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.http-client. **Name** : google-http-client-jackson2. **Version** : 1.41.5.
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.j2objc. **Name** : j2objc-annotations. **Version** : 1.3.
- * **Project URL:** [https://github.com/google/j2objc/](https://github.com/google/j2objc/)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.oauth-client. **Name** : google-oauth-client. **Version** : 1.32.1.
- * **Project URL:** [https://www.google.com/](https://www.google.com/)
- * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.protobuf. **Name** : protobuf-gradle-plugin. **Version** : 0.8.18.
- * **Project URL:** [https://github.com/google/protobuf-gradle-plugin](https://github.com/google/protobuf-gradle-plugin)
- * **License:** [BSD 3-Clause](http://opensource.org/licenses/BSD-3-Clause)
-
-1. **Group** : com.google.protobuf. **Name** : protobuf-java. **Version** : 3.19.4.
- * **Project URL:** [https://developers.google.com/protocol-buffers/](https://developers.google.com/protocol-buffers/)
- * **License:** [3-Clause BSD License](https://opensource.org/licenses/BSD-3-Clause)
-
-1. **Group** : com.google.protobuf. **Name** : protobuf-java-util. **Version** : 3.19.4.
- * **Project URL:** [https://developers.google.com/protocol-buffers/](https://developers.google.com/protocol-buffers/)
- * **License:** [3-Clause BSD License](https://opensource.org/licenses/BSD-3-Clause)
-
-1. **Group** : com.google.protobuf. **Name** : protobuf-kotlin. **Version** : 3.19.4.
- * **License:** [3-Clause BSD License](https://opensource.org/licenses/BSD-3-Clause)
-
-1. **Group** : com.google.protobuf. **Name** : protoc. **Version** : 3.19.4.
- * **Project URL:** [https://developers.google.com/protocol-buffers/](https://developers.google.com/protocol-buffers/)
- * **License:** [3-Clause BSD License](https://opensource.org/licenses/BSD-3-Clause)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.truth. **Name** : truth. **Version** : 1.1.3.
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.truth.extensions. **Name** : truth-java8-extension. **Version** : 1.1.3.
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.truth.extensions. **Name** : truth-liteproto-extension. **Version** : 1.1.3.
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.truth.extensions. **Name** : truth-proto-extension. **Version** : 1.1.3.
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.puppycrawl.tools. **Name** : checkstyle. **Version** : 10.1.
- * **Project URL:** [https://checkstyle.org/](https://checkstyle.org/)
- * **License:** [LGPL-2.1+](http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt)
-
-1. **Group** : com.squareup. **Name** : javapoet. **Version** : 1.13.0.
- * **Project URL:** [http://github.com/square/javapoet/](http://github.com/square/javapoet/)
- * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : commons-beanutils. **Name** : commons-beanutils. **Version** : 1.9.4.
- * **Project URL:** [https://commons.apache.org/proper/commons-beanutils/](https://commons.apache.org/proper/commons-beanutils/)
- * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : commons-codec. **Name** : commons-codec. **Version** : 1.15.
- * **Project URL:** [https://commons.apache.org/proper/commons-codec/](https://commons.apache.org/proper/commons-codec/)
- * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : commons-collections. **Name** : commons-collections. **Version** : 3.2.2.
- * **Project URL:** [http://commons.apache.org/collections/](http://commons.apache.org/collections/)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : commons-io. **Name** : commons-io. **Version** : 2.6.
- * **Project URL:** [http://commons.apache.org/proper/commons-io/](http://commons.apache.org/proper/commons-io/)
- * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : commons-lang. **Name** : commons-lang. **Version** : 2.6.
- * **Project URL:** [http://commons.apache.org/lang/](http://commons.apache.org/lang/)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : commons-logging. **Name** : commons-logging. **Version** : 1.2.
- * **Project URL:** [http://commons.apache.org/proper/commons-logging/](http://commons.apache.org/proper/commons-logging/)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : info.picocli. **Name** : picocli. **Version** : 4.6.3.
- * **Project URL:** [http://picocli.info](http://picocli.info)
- * **License:** [The Apache Software License, version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : io.github.java-diff-utils. **Name** : java-diff-utils. **Version** : 4.0.
- * **Project URL:** [https://github.com/java-diff-utils/java-diff-utils](https://github.com/java-diff-utils/java-diff-utils)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : io.grpc. **Name** : grpc-api. **Version** : 1.38.0.
- * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
- * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
-
-1. **Group** : io.grpc. **Name** : grpc-context. **Version** : 1.45.1.
- * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
- * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
-
-1. **Group** : io.grpc. **Name** : grpc-core. **Version** : 1.38.0.
- * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
- * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
-
-1. **Group** : io.grpc. **Name** : grpc-protobuf. **Version** : 1.38.0.
- * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
- * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
-
-1. **Group** : io.grpc. **Name** : grpc-protobuf-lite. **Version** : 1.38.0.
- * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
- * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
-
-1. **Group** : io.grpc. **Name** : grpc-stub. **Version** : 1.38.0.
- * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
- * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
-
-1. **Group** : io.grpc. **Name** : protoc-gen-grpc-java. **Version** : 1.38.0.
- * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
- * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
-
-1. **Group** : io.netty. **Name** : netty-buffer. **Version** : 4.1.72.Final.
- * **Project URL:** [https://netty.io/](https://netty.io/)
- * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0)
-
-1. **Group** : io.netty. **Name** : netty-codec. **Version** : 4.1.72.Final.
- * **Project URL:** [https://netty.io/](https://netty.io/)
- * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0)
-
-1. **Group** : io.netty. **Name** : netty-codec-http. **Version** : 4.1.72.Final.
- * **Project URL:** [https://netty.io/](https://netty.io/)
- * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0)
-
-1. **Group** : io.netty. **Name** : netty-common. **Version** : 4.1.72.Final.
- * **Project URL:** [https://netty.io/](https://netty.io/)
- * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0)
-
-1. **Group** : io.netty. **Name** : netty-handler. **Version** : 4.1.72.Final.
- * **Project URL:** [https://netty.io/](https://netty.io/)
- * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0)
-
-1. **Group** : io.netty. **Name** : netty-resolver. **Version** : 4.1.72.Final.
- * **Project URL:** [https://netty.io/](https://netty.io/)
- * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0)
-
-1. **Group** : io.netty. **Name** : netty-tcnative-classes. **Version** : 2.0.46.Final.**No license information found**
-1. **Group** : io.netty. **Name** : netty-transport. **Version** : 4.1.72.Final.
- * **Project URL:** [https://netty.io/](https://netty.io/)
- * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0)
-
-1. **Group** : io.opencensus. **Name** : opencensus-api. **Version** : 0.21.0.
- * **Project URL:** [https://github.com/census-instrumentation/opencensus-java](https://github.com/census-instrumentation/opencensus-java)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : io.opencensus. **Name** : opencensus-contrib-grpc-util. **Version** : 0.28.0.
- * **Project URL:** [https://github.com/census-instrumentation/opencensus-java](https://github.com/census-instrumentation/opencensus-java)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : io.opencensus. **Name** : opencensus-contrib-http-util. **Version** : 0.18.0.
- * **Project URL:** [https://github.com/census-instrumentation/opencensus-java](https://github.com/census-instrumentation/opencensus-java)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : io.perfmark. **Name** : perfmark-api. **Version** : 0.23.0.
- * **Project URL:** [https://github.com/perfmark/perfmark](https://github.com/perfmark/perfmark)
- * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
-
-1. **Group** : javax.annotation. **Name** : javax.annotation-api. **Version** : 1.3.2.
- * **Project URL:** [http://jcp.org/en/jsr/detail?id=250](http://jcp.org/en/jsr/detail?id=250)
- * **License:** [CDDL + GPLv2 with classpath exception](https://github.com/javaee/javax.annotation/blob/master/LICENSE)
-
-1. **Group** : javax.servlet. **Name** : javax.servlet-api. **Version** : 3.1.0.
- * **Project URL:** [http://servlet-spec.java.net](http://servlet-spec.java.net)
- * **License:** [CDDL + GPLv2 with classpath exception](https://glassfish.dev.java.net/nonav/public/CDDL+GPL.html)
-
-1. **Group** : junit. **Name** : junit. **Version** : 4.13.1.
- * **Project URL:** [http://junit.org](http://junit.org)
- * **License:** [Eclipse Public License 1.0](http://www.eclipse.org/legal/epl-v10.html)
-
-1. **Group** : kr.motd.maven. **Name** : os-maven-plugin. **Version** : 1.7.0.
- * **Project URL:** [https://github.com/trustin/os-maven-plugin/](https://github.com/trustin/os-maven-plugin/)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
-
-1. **Group** : net.java.dev.jna. **Name** : jna. **Version** : 5.6.0.
- * **Project URL:** [https://github.com/java-native-access/jna](https://github.com/java-native-access/jna)
- * **License:** [Apache License v2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
- * **License:** [LGPL, version 2.1](http://www.gnu.org/licenses/licenses.html)
-
-1. **Group** : net.sf.saxon. **Name** : Saxon-HE. **Version** : 10.6.
- * **Project URL:** [http://www.saxonica.com/](http://www.saxonica.com/)
- * **License:** [Mozilla Public License Version 2.0](http://www.mozilla.org/MPL/2.0/)
-
-1. **Group** : net.sourceforge.pmd. **Name** : pmd-core. **Version** : 6.44.0.
- * **License:** [BSD-style](http://pmd.sourceforge.net/license.html)
-
-1. **Group** : net.sourceforge.pmd. **Name** : pmd-java. **Version** : 6.44.0.
- * **License:** [BSD-style](http://pmd.sourceforge.net/license.html)
-
-1. **Group** : net.sourceforge.saxon. **Name** : saxon. **Version** : 9.1.0.8.
- * **Project URL:** [http://saxon.sourceforge.net/](http://saxon.sourceforge.net/)
- * **License:** [Mozilla Public License Version 1.0](http://www.mozilla.org/MPL/MPL-1.0.txt)
-
-1. **Group** : org.antlr. **Name** : antlr4-runtime. **Version** : 4.7.2.
- * **Project URL:** [http://www.antlr.org](http://www.antlr.org)
- * **License:** [The BSD License](http://www.antlr.org/license.html)
-
-1. **Group** : org.antlr. **Name** : antlr4-runtime. **Version** : 4.9.3.
- * **Project URL:** [http://www.antlr.org](http://www.antlr.org)
- * **License:** [The BSD License](http://www.antlr.org/license.html)
-
-1. **Group** : org.apache.commons. **Name** : commons-lang3. **Version** : 3.8.1.
- * **Project URL:** [http://commons.apache.org/proper/commons-lang/](http://commons.apache.org/proper/commons-lang/)
- * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.apache.httpcomponents. **Name** : httpclient. **Version** : 4.5.13.
- * **Project URL:** [http://hc.apache.org/httpcomponents-client](http://hc.apache.org/httpcomponents-client)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.apache.httpcomponents. **Name** : httpcore. **Version** : 4.4.14.
- * **Project URL:** [http://hc.apache.org/httpcomponents-core-ga](http://hc.apache.org/httpcomponents-core-ga)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.apiguardian. **Name** : apiguardian-api. **Version** : 1.1.2.
- * **Project URL:** [https://github.com/apiguardian-team/apiguardian](https://github.com/apiguardian-team/apiguardian)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.checkerframework. **Name** : checker-compat-qual. **Version** : 2.5.5.
- * **Project URL:** [https://checkerframework.org](https://checkerframework.org)
- * **License:** [GNU General Public License, version 2 (GPL2), with the classpath exception](http://www.gnu.org/software/classpath/license.html)
- * **License:** [The MIT License](http://opensource.org/licenses/MIT)
-
-1. **Group** : org.checkerframework. **Name** : checker-qual. **Version** : 3.21.3.
- * **Project URL:** [https://checkerframework.org](https://checkerframework.org)
- * **License:** [The MIT License](http://opensource.org/licenses/MIT)
-
-1. **Group** : org.checkerframework. **Name** : dataflow-errorprone. **Version** : 3.15.0.
- * **Project URL:** [https://checkerframework.org](https://checkerframework.org)
- * **License:** [GNU General Public License, version 2 (GPL2), with the classpath exception](http://www.gnu.org/software/classpath/license.html)
-
-1. **Group** : org.codehaus.mojo. **Name** : animal-sniffer-annotations. **Version** : 1.21.
- * **License:** [MIT license](http://www.opensource.org/licenses/mit-license.php)
- * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.codehaus.woodstox. **Name** : stax2-api. **Version** : 4.2.1.
- * **Project URL:** [http://github.com/FasterXML/stax2-api](http://github.com/FasterXML/stax2-api)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
- * **License:** [The BSD License](http://www.opensource.org/licenses/bsd-license.php)
-
-1. **Group** : org.conscrypt. **Name** : conscrypt-openjdk-uber. **Version** : 2.5.1.
- * **Project URL:** [https://conscrypt.org/](https://conscrypt.org/)
- * **License:** [Apache 2](https://www.apache.org/licenses/LICENSE-2.0)
-
-1. **Group** : org.eclipse.jgit. **Name** : org.eclipse.jgit. **Version** : 4.4.1.201607150455-r.
- * **License:** Eclipse Distribution License (New BSD License)
-
-1. **Group** : org.freemarker. **Name** : freemarker. **Version** : 2.3.31.
- * **Project URL:** [https://freemarker.apache.org/](https://freemarker.apache.org/)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.hamcrest. **Name** : hamcrest-core. **Version** : 1.3.
- * **License:** [New BSD License](http://www.opensource.org/licenses/bsd-license.php)
-
-1. **Group** : org.jacoco. **Name** : org.jacoco.agent. **Version** : 0.8.7.
- * **License:** [Eclipse Public License 2.0](https://www.eclipse.org/legal/epl-2.0/)
-
-1. **Group** : org.jacoco. **Name** : org.jacoco.ant. **Version** : 0.8.7.
- * **License:** [Eclipse Public License 2.0](https://www.eclipse.org/legal/epl-2.0/)
-
-1. **Group** : org.jacoco. **Name** : org.jacoco.core. **Version** : 0.8.7.
- * **License:** [Eclipse Public License 2.0](https://www.eclipse.org/legal/epl-2.0/)
-
-1. **Group** : org.jacoco. **Name** : org.jacoco.report. **Version** : 0.8.7.
- * **License:** [Eclipse Public License 2.0](https://www.eclipse.org/legal/epl-2.0/)
-
-1. **Group** : org.javassist. **Name** : javassist. **Version** : 3.28.0-GA.
- * **Project URL:** [http://www.javassist.org/](http://www.javassist.org/)
- * **License:** [Apache License 2.0](http://www.apache.org/licenses/)
- * **License:** [LGPL 2.1](http://www.gnu.org/licenses/lgpl-2.1.html)
- * **License:** [MPL 1.1](http://www.mozilla.org/MPL/MPL-1.1.html)
-
-1. **Group** : org.jetbrains. **Name** : annotations. **Version** : 13.0.
- * **Project URL:** [http://www.jetbrains.org](http://www.jetbrains.org)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains. **Name** : markdown. **Version** : 0.2.4.**No license information found**
-1. **Group** : org.jetbrains. **Name** : markdown-jvm. **Version** : 0.2.4.
- * **Project URL:** [https://github.com/JetBrains/markdown](https://github.com/JetBrains/markdown)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.dokka. **Name** : dokka-analysis. **Version** : 1.6.20.
- * **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.dokka. **Name** : dokka-base. **Version** : 1.6.20.
- * **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.dokka. **Name** : dokka-core. **Version** : 1.6.20.
- * **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.dokka. **Name** : kotlin-analysis-compiler. **Version** : 1.6.20.
- * **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.dokka. **Name** : kotlin-analysis-intellij. **Version** : 1.6.20.
- * **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.dokka. **Name** : kotlin-as-java-plugin. **Version** : 1.6.20.
- * **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.intellij.deps. **Name** : trove4j. **Version** : 1.0.20200330.
- * **Project URL:** [https://github.com/JetBrains/intellij-deps-trove4j](https://github.com/JetBrains/intellij-deps-trove4j)
- * **License:** [GNU LESSER GENERAL PUBLIC LICENSE 2.1](https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-compiler-embeddable. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-daemon-embeddable. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-klib-commonizer-embeddable. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-reflect. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-script-runtime. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-scripting-common. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-scripting-compiler-embeddable. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-scripting-compiler-impl-embeddable. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-scripting-jvm. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-common. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk7. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk8. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-bom. **Version** : 1.6.0.**No license information found**
-1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-core. **Version** : 1.6.0.**No license information found**
-1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-core-jvm. **Version** : 1.6.0.
- * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)
- * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-html-jvm. **Version** : 0.7.3.
- * **Project URL:** [https://github.com/Kotlin/kotlinx.html](https://github.com/Kotlin/kotlinx.html)
- * **License:** [The Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jsoup. **Name** : jsoup. **Version** : 1.13.1.
- * **Project URL:** [https://jsoup.org/](https://jsoup.org/)
- * **License:** [The MIT License](https://jsoup.org/license)
-
-1. **Group** : org.junit. **Name** : junit-bom. **Version** : 5.8.2.**No license information found**
-1. **Group** : org.junit.jupiter. **Name** : junit-jupiter-api. **Version** : 5.8.2.
- * **Project URL:** [https://junit.org/junit5/](https://junit.org/junit5/)
- * **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
-
-1. **Group** : org.junit.jupiter. **Name** : junit-jupiter-engine. **Version** : 5.8.2.
- * **Project URL:** [https://junit.org/junit5/](https://junit.org/junit5/)
- * **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
-
-1. **Group** : org.junit.jupiter. **Name** : junit-jupiter-params. **Version** : 5.8.2.
- * **Project URL:** [https://junit.org/junit5/](https://junit.org/junit5/)
- * **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
-
-1. **Group** : org.junit.platform. **Name** : junit-platform-commons. **Version** : 1.8.2.
- * **Project URL:** [https://junit.org/junit5/](https://junit.org/junit5/)
- * **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
-
-1. **Group** : org.junit.platform. **Name** : junit-platform-engine. **Version** : 1.8.2.
- * **Project URL:** [https://junit.org/junit5/](https://junit.org/junit5/)
- * **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
-
-1. **Group** : org.opentest4j. **Name** : opentest4j. **Version** : 1.2.0.
- * **Project URL:** [https://github.com/ota4j-team/opentest4j](https://github.com/ota4j-team/opentest4j)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.ow2.asm. **Name** : asm. **Version** : 9.1.
- * **Project URL:** [http://asm.ow2.io/](http://asm.ow2.io/)
- * **License:** [BSD-3-Clause](https://asm.ow2.io/license.html)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.ow2.asm. **Name** : asm. **Version** : 9.2.
- * **Project URL:** [http://asm.ow2.io/](http://asm.ow2.io/)
- * **License:** [BSD-3-Clause](https://asm.ow2.io/license.html)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.ow2.asm. **Name** : asm-analysis. **Version** : 9.1.
- * **Project URL:** [http://asm.ow2.io/](http://asm.ow2.io/)
- * **License:** [BSD-3-Clause](https://asm.ow2.io/license.html)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.ow2.asm. **Name** : asm-commons. **Version** : 9.1.
- * **Project URL:** [http://asm.ow2.io/](http://asm.ow2.io/)
- * **License:** [BSD-3-Clause](https://asm.ow2.io/license.html)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.ow2.asm. **Name** : asm-tree. **Version** : 9.1.
- * **Project URL:** [http://asm.ow2.io/](http://asm.ow2.io/)
- * **License:** [BSD-3-Clause](https://asm.ow2.io/license.html)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.pcollections. **Name** : pcollections. **Version** : 2.1.2.
- * **Project URL:** [http://pcollections.org](http://pcollections.org)
- * **License:** [The MIT License](http://www.opensource.org/licenses/mit-license.php)
-
-1. **Group** : org.reflections. **Name** : reflections. **Version** : 0.10.2.
- * **Project URL:** [http://github.com/ronmamo/reflections](http://github.com/ronmamo/reflections)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
- * **License:** [WTFPL](http://www.wtfpl.net/)
-
-1. **Group** : org.slf4j. **Name** : slf4j-api. **Version** : 1.7.30.
- * **Project URL:** [http://www.slf4j.org](http://www.slf4j.org)
- * **License:** [MIT License](http://www.opensource.org/licenses/mit-license.php)
-
-1. **Group** : org.threeten. **Name** : threetenbp. **Version** : 1.5.1.
- * **Project URL:** [https://www.threeten.org/threetenbp](https://www.threeten.org/threetenbp)
- * **License:** [BSD 3-clause](https://raw.githubusercontent.com/ThreeTen/threetenbp/master/LICENSE.txt)
-
-
-The dependencies distributed under several licenses, are used according their commercial-use-friendly license.
-
-This report was generated on **Wed May 04 18:13:27 EEST 2022** using [Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under [Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE).
-
-
-
-
-# Dependencies of `io.spine:spine-js-tests:2.0.0-SNAPSHOT.74`
-
-## Runtime
-1. **Group** : com.google.code.findbugs. **Name** : jsr305. **Version** : 3.0.2.
- * **Project URL:** [http://findbugs.sourceforge.net/](http://findbugs.sourceforge.net/)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.code.gson. **Name** : gson. **Version** : 2.9.0.
- * **Project URL:** [https://github.com/google/gson/gson](https://github.com/google/gson/gson)
- * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.errorprone. **Name** : error_prone_annotations. **Version** : 2.10.0.
- * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.errorprone. **Name** : error_prone_type_annotations. **Version** : 2.10.0.
- * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.flogger. **Name** : flogger. **Version** : 0.7.4.
- * **Project URL:** [https://github.com/google/flogger](https://github.com/google/flogger)
- * **License:** [Apache 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.guava. **Name** : failureaccess. **Version** : 1.0.1.
- * **Project URL:** [https://github.com/google/guava/](https://github.com/google/guava/)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.guava. **Name** : guava. **Version** : 31.1-jre.
- * **Project URL:** [https://github.com/google/guava](https://github.com/google/guava)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.guava. **Name** : listenablefuture. **Version** : 9999.0-empty-to-avoid-conflict-with-guava.
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.j2objc. **Name** : j2objc-annotations. **Version** : 1.3.
- * **Project URL:** [https://github.com/google/j2objc/](https://github.com/google/j2objc/)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.protobuf. **Name** : protobuf-java. **Version** : 3.19.4.
- * **Project URL:** [https://developers.google.com/protocol-buffers/](https://developers.google.com/protocol-buffers/)
- * **License:** [3-Clause BSD License](https://opensource.org/licenses/BSD-3-Clause)
-
-1. **Group** : com.google.protobuf. **Name** : protobuf-java-util. **Version** : 3.19.4.
- * **Project URL:** [https://developers.google.com/protocol-buffers/](https://developers.google.com/protocol-buffers/)
- * **License:** [3-Clause BSD License](https://opensource.org/licenses/BSD-3-Clause)
-
-1. **Group** : com.google.protobuf. **Name** : protobuf-kotlin. **Version** : 3.19.4.
- * **License:** [3-Clause BSD License](https://opensource.org/licenses/BSD-3-Clause)
-
-1. **Group** : javax.annotation. **Name** : javax.annotation-api. **Version** : 1.3.2.
- * **Project URL:** [http://jcp.org/en/jsr/detail?id=250](http://jcp.org/en/jsr/detail?id=250)
- * **License:** [CDDL + GPLv2 with classpath exception](https://github.com/javaee/javax.annotation/blob/master/LICENSE)
-
-1. **Group** : org.checkerframework. **Name** : checker-compat-qual. **Version** : 2.5.5.
- * **Project URL:** [https://checkerframework.org](https://checkerframework.org)
- * **License:** [GNU General Public License, version 2 (GPL2), with the classpath exception](http://www.gnu.org/software/classpath/license.html)
- * **License:** [The MIT License](http://opensource.org/licenses/MIT)
-
-1. **Group** : org.checkerframework. **Name** : checker-qual. **Version** : 3.21.3.
- * **Project URL:** [https://checkerframework.org](https://checkerframework.org)
- * **License:** [The MIT License](http://opensource.org/licenses/MIT)
-
-1. **Group** : org.jetbrains. **Name** : annotations. **Version** : 13.0.
- * **Project URL:** [http://www.jetbrains.org](http://www.jetbrains.org)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-common. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk7. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk8. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-## Compile, tests, and tooling
-1. **Group** : com.beust. **Name** : jcommander. **Version** : 1.48.
- * **Project URL:** [http://beust.com/jcommander](http://beust.com/jcommander)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.fasterxml.jackson. **Name** : jackson-bom. **Version** : 2.13.2.**No license information found**
-1. **Group** : com.fasterxml.jackson.core. **Name** : jackson-annotations. **Version** : 2.13.2.
- * **Project URL:** [http://github.com/FasterXML/jackson](http://github.com/FasterXML/jackson)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.fasterxml.jackson.core. **Name** : jackson-core. **Version** : 2.13.2.
- * **Project URL:** [https://github.com/FasterXML/jackson-core](https://github.com/FasterXML/jackson-core)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.fasterxml.jackson.core. **Name** : jackson-databind. **Version** : 2.13.2.2.
- * **Project URL:** [http://github.com/FasterXML/jackson](http://github.com/FasterXML/jackson)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.fasterxml.jackson.dataformat. **Name** : jackson-dataformat-xml. **Version** : 2.13.2.
- * **Project URL:** [https://github.com/FasterXML/jackson-dataformat-xml](https://github.com/FasterXML/jackson-dataformat-xml)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.fasterxml.jackson.module. **Name** : jackson-module-kotlin. **Version** : 2.13.2.
- * **Project URL:** [https://github.com/FasterXML/jackson-module-kotlin](https://github.com/FasterXML/jackson-module-kotlin)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.fasterxml.woodstox. **Name** : woodstox-core. **Version** : 6.2.7.
- * **Project URL:** [https://github.com/FasterXML/woodstox](https://github.com/FasterXML/woodstox)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.github.ben-manes.caffeine. **Name** : caffeine. **Version** : 2.8.8.
- * **Project URL:** [https://github.com/ben-manes/caffeine](https://github.com/ben-manes/caffeine)
- * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.github.kevinstern. **Name** : software-and-algorithms. **Version** : 1.0.
- * **Project URL:** [https://www.github.com/KevinStern/software-and-algorithms](https://www.github.com/KevinStern/software-and-algorithms)
- * **License:** [MIT License](http://www.opensource.org/licenses/mit-license.php)
-
-1. **Group** : com.google.android. **Name** : annotations. **Version** : 4.1.1.4.
- * **Project URL:** [http://source.android.com/](http://source.android.com/)
- * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0)
-
-1. **Group** : com.google.api.grpc. **Name** : proto-google-common-protos. **Version** : 2.7.0.
- * **Project URL:** [https://github.com/googleapis/java-iam/proto-google-common-protos](https://github.com/googleapis/java-iam/proto-google-common-protos)
- * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.auto. **Name** : auto-common. **Version** : 1.2.1.
- * **Project URL:** [https://github.com/google/auto/tree/master/common](https://github.com/google/auto/tree/master/common)
- * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.auto.service. **Name** : auto-service-annotations. **Version** : 1.0.1.
- * **Project URL:** [https://github.com/google/auto/tree/master/service](https://github.com/google/auto/tree/master/service)
- * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.auto.value. **Name** : auto-value-annotations. **Version** : 1.9.
- * **Project URL:** [https://github.com/google/auto/tree/master/value](https://github.com/google/auto/tree/master/value)
- * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.code.findbugs. **Name** : jFormatString. **Version** : 3.0.0.
- * **Project URL:** [http://findbugs.sourceforge.net/](http://findbugs.sourceforge.net/)
- * **License:** [GNU Lesser Public License](http://www.gnu.org/licenses/lgpl.html)
-
-1. **Group** : com.google.code.findbugs. **Name** : jsr305. **Version** : 3.0.2.
- * **Project URL:** [http://findbugs.sourceforge.net/](http://findbugs.sourceforge.net/)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.code.gson. **Name** : gson. **Version** : 2.9.0.
- * **Project URL:** [https://github.com/google/gson/gson](https://github.com/google/gson/gson)
- * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.errorprone. **Name** : error_prone_annotation. **Version** : 2.10.0.
- * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.errorprone. **Name** : error_prone_annotations. **Version** : 2.10.0.
- * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.errorprone. **Name** : error_prone_check_api. **Version** : 2.10.0.
- * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.errorprone. **Name** : error_prone_core. **Version** : 2.10.0.
- * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.errorprone. **Name** : error_prone_type_annotations. **Version** : 2.10.0.
- * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.flogger. **Name** : flogger. **Version** : 0.7.4.
- * **Project URL:** [https://github.com/google/flogger](https://github.com/google/flogger)
- * **License:** [Apache 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.flogger. **Name** : flogger-system-backend. **Version** : 0.7.4.
- * **Project URL:** [https://github.com/google/flogger](https://github.com/google/flogger)
- * **License:** [Apache 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.guava. **Name** : failureaccess. **Version** : 1.0.1.
- * **Project URL:** [https://github.com/google/guava/](https://github.com/google/guava/)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.guava. **Name** : guava. **Version** : 31.1-jre.
- * **Project URL:** [https://github.com/google/guava](https://github.com/google/guava)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.guava. **Name** : guava-testlib. **Version** : 31.1-jre.
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.guava. **Name** : listenablefuture. **Version** : 9999.0-empty-to-avoid-conflict-with-guava.
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.http-client. **Name** : google-http-client. **Version** : 1.41.5.
- * **Project URL:** [https://www.google.com/](https://www.google.com/)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.http-client. **Name** : google-http-client-apache. **Version** : 2.1.2.
- * **Project URL:** [http://www.google.com/](http://www.google.com/)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.j2objc. **Name** : j2objc-annotations. **Version** : 1.3.
- * **Project URL:** [https://github.com/google/j2objc/](https://github.com/google/j2objc/)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.protobuf. **Name** : protobuf-java. **Version** : 3.19.4.
- * **Project URL:** [https://developers.google.com/protocol-buffers/](https://developers.google.com/protocol-buffers/)
- * **License:** [3-Clause BSD License](https://opensource.org/licenses/BSD-3-Clause)
-
-1. **Group** : com.google.protobuf. **Name** : protobuf-java-util. **Version** : 3.19.4.
- * **Project URL:** [https://developers.google.com/protocol-buffers/](https://developers.google.com/protocol-buffers/)
- * **License:** [3-Clause BSD License](https://opensource.org/licenses/BSD-3-Clause)
-
-1. **Group** : com.google.protobuf. **Name** : protobuf-kotlin. **Version** : 3.19.4.
- * **License:** [3-Clause BSD License](https://opensource.org/licenses/BSD-3-Clause)
-
-1. **Group** : com.google.protobuf. **Name** : protoc. **Version** : 3.19.4.
- * **Project URL:** [https://developers.google.com/protocol-buffers/](https://developers.google.com/protocol-buffers/)
- * **License:** [3-Clause BSD License](https://opensource.org/licenses/BSD-3-Clause)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.truth. **Name** : truth. **Version** : 1.1.3.
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.truth.extensions. **Name** : truth-java8-extension. **Version** : 1.1.3.
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.truth.extensions. **Name** : truth-liteproto-extension. **Version** : 1.1.3.
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.truth.extensions. **Name** : truth-proto-extension. **Version** : 1.1.3.
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : commons-codec. **Name** : commons-codec. **Version** : 1.15.
- * **Project URL:** [https://commons.apache.org/proper/commons-codec/](https://commons.apache.org/proper/commons-codec/)
- * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : commons-io. **Name** : commons-io. **Version** : 2.6.
- * **Project URL:** [http://commons.apache.org/proper/commons-io/](http://commons.apache.org/proper/commons-io/)
- * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : commons-logging. **Name** : commons-logging. **Version** : 1.2.
- * **Project URL:** [http://commons.apache.org/proper/commons-logging/](http://commons.apache.org/proper/commons-logging/)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : io.github.java-diff-utils. **Name** : java-diff-utils. **Version** : 4.0.
- * **Project URL:** [https://github.com/java-diff-utils/java-diff-utils](https://github.com/java-diff-utils/java-diff-utils)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : io.grpc. **Name** : grpc-api. **Version** : 1.38.0.
- * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
- * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
-
-1. **Group** : io.grpc. **Name** : grpc-context. **Version** : 1.45.1.
- * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
- * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
-
-1. **Group** : io.grpc. **Name** : grpc-core. **Version** : 1.38.0.
- * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
- * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
-
-1. **Group** : io.grpc. **Name** : grpc-protobuf. **Version** : 1.38.0.
- * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
- * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
-
-1. **Group** : io.grpc. **Name** : grpc-protobuf-lite. **Version** : 1.38.0.
- * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
- * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
-
-1. **Group** : io.grpc. **Name** : grpc-stub. **Version** : 1.38.0.
- * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
- * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
-
-1. **Group** : io.opencensus. **Name** : opencensus-api. **Version** : 0.21.0.
- * **Project URL:** [https://github.com/census-instrumentation/opencensus-java](https://github.com/census-instrumentation/opencensus-java)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : io.opencensus. **Name** : opencensus-contrib-http-util. **Version** : 0.18.0.
- * **Project URL:** [https://github.com/census-instrumentation/opencensus-java](https://github.com/census-instrumentation/opencensus-java)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : io.perfmark. **Name** : perfmark-api. **Version** : 0.23.0.
- * **Project URL:** [https://github.com/perfmark/perfmark](https://github.com/perfmark/perfmark)
- * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
-
-1. **Group** : javax.annotation. **Name** : javax.annotation-api. **Version** : 1.3.2.
- * **Project URL:** [http://jcp.org/en/jsr/detail?id=250](http://jcp.org/en/jsr/detail?id=250)
- * **License:** [CDDL + GPLv2 with classpath exception](https://github.com/javaee/javax.annotation/blob/master/LICENSE)
-
-1. **Group** : javax.servlet. **Name** : javax.servlet-api. **Version** : 3.1.0.
- * **Project URL:** [http://servlet-spec.java.net](http://servlet-spec.java.net)
- * **License:** [CDDL + GPLv2 with classpath exception](https://glassfish.dev.java.net/nonav/public/CDDL+GPL.html)
-
-1. **Group** : javax.websocket. **Name** : javax.websocket-api. **Version** : 1.0.
- * **Project URL:** [http://websocket-spec.java.net](http://websocket-spec.java.net)
- * **License:** [
- Dual license consisting of the CDDL v1.1 and GPL v2
- ](https://glassfish.java.net/public/CDDL+GPL_1_1.html)
-
-1. **Group** : junit. **Name** : junit. **Version** : 4.13.1.
- * **Project URL:** [http://junit.org](http://junit.org)
- * **License:** [Eclipse Public License 1.0](http://www.eclipse.org/legal/epl-v10.html)
-
-1. **Group** : net.java.dev.jna. **Name** : jna. **Version** : 5.6.0.
- * **Project URL:** [https://github.com/java-native-access/jna](https://github.com/java-native-access/jna)
- * **License:** [Apache License v2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
- * **License:** [LGPL, version 2.1](http://www.gnu.org/licenses/licenses.html)
-
-1. **Group** : net.sourceforge.pmd. **Name** : pmd-core. **Version** : 6.44.0.
- * **License:** [BSD-style](http://pmd.sourceforge.net/license.html)
-
-1. **Group** : net.sourceforge.pmd. **Name** : pmd-java. **Version** : 6.44.0.
- * **License:** [BSD-style](http://pmd.sourceforge.net/license.html)
-
-1. **Group** : net.sourceforge.saxon. **Name** : saxon. **Version** : 9.1.0.8.
- * **Project URL:** [http://saxon.sourceforge.net/](http://saxon.sourceforge.net/)
- * **License:** [Mozilla Public License Version 1.0](http://www.mozilla.org/MPL/MPL-1.0.txt)
-
-1. **Group** : org.antlr. **Name** : antlr4-runtime. **Version** : 4.7.2.
- * **Project URL:** [http://www.antlr.org](http://www.antlr.org)
- * **License:** [The BSD License](http://www.antlr.org/license.html)
-
-1. **Group** : org.apache.commons. **Name** : commons-lang3. **Version** : 3.8.1.
- * **Project URL:** [http://commons.apache.org/proper/commons-lang/](http://commons.apache.org/proper/commons-lang/)
- * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.apache.httpcomponents. **Name** : httpclient. **Version** : 4.5.13.
- * **Project URL:** [http://hc.apache.org/httpcomponents-client](http://hc.apache.org/httpcomponents-client)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.apache.httpcomponents. **Name** : httpcore. **Version** : 4.4.14.
- * **Project URL:** [http://hc.apache.org/httpcomponents-core-ga](http://hc.apache.org/httpcomponents-core-ga)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.apiguardian. **Name** : apiguardian-api. **Version** : 1.1.2.
- * **Project URL:** [https://github.com/apiguardian-team/apiguardian](https://github.com/apiguardian-team/apiguardian)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.checkerframework. **Name** : checker-compat-qual. **Version** : 2.5.5.
- * **Project URL:** [https://checkerframework.org](https://checkerframework.org)
- * **License:** [GNU General Public License, version 2 (GPL2), with the classpath exception](http://www.gnu.org/software/classpath/license.html)
- * **License:** [The MIT License](http://opensource.org/licenses/MIT)
-
-1. **Group** : org.checkerframework. **Name** : checker-qual. **Version** : 3.21.3.
- * **Project URL:** [https://checkerframework.org](https://checkerframework.org)
- * **License:** [The MIT License](http://opensource.org/licenses/MIT)
-
-1. **Group** : org.checkerframework. **Name** : dataflow-errorprone. **Version** : 3.15.0.
- * **Project URL:** [https://checkerframework.org](https://checkerframework.org)
- * **License:** [GNU General Public License, version 2 (GPL2), with the classpath exception](http://www.gnu.org/software/classpath/license.html)
-
-1. **Group** : org.codehaus.mojo. **Name** : animal-sniffer-annotations. **Version** : 1.21.
- * **License:** [MIT license](http://www.opensource.org/licenses/mit-license.php)
- * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.codehaus.woodstox. **Name** : stax2-api. **Version** : 4.2.1.
- * **Project URL:** [http://github.com/FasterXML/stax2-api](http://github.com/FasterXML/stax2-api)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
- * **License:** [The BSD License](http://www.opensource.org/licenses/bsd-license.php)
-
-1. **Group** : org.eclipse.jgit. **Name** : org.eclipse.jgit. **Version** : 4.4.1.201607150455-r.
- * **License:** Eclipse Distribution License (New BSD License)
-
-1. **Group** : org.freemarker. **Name** : freemarker. **Version** : 2.3.31.
- * **Project URL:** [https://freemarker.apache.org/](https://freemarker.apache.org/)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.hamcrest. **Name** : hamcrest-core. **Version** : 1.3.
- * **License:** [New BSD License](http://www.opensource.org/licenses/bsd-license.php)
-
-1. **Group** : org.jacoco. **Name** : org.jacoco.agent. **Version** : 0.8.7.
- * **License:** [Eclipse Public License 2.0](https://www.eclipse.org/legal/epl-2.0/)
-
-1. **Group** : org.jacoco. **Name** : org.jacoco.ant. **Version** : 0.8.7.
- * **License:** [Eclipse Public License 2.0](https://www.eclipse.org/legal/epl-2.0/)
-
-1. **Group** : org.jacoco. **Name** : org.jacoco.core. **Version** : 0.8.7.
- * **License:** [Eclipse Public License 2.0](https://www.eclipse.org/legal/epl-2.0/)
-
-1. **Group** : org.jacoco. **Name** : org.jacoco.report. **Version** : 0.8.7.
- * **License:** [Eclipse Public License 2.0](https://www.eclipse.org/legal/epl-2.0/)
-
-1. **Group** : org.jetbrains. **Name** : annotations. **Version** : 13.0.
- * **Project URL:** [http://www.jetbrains.org](http://www.jetbrains.org)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains. **Name** : markdown. **Version** : 0.2.4.**No license information found**
-1. **Group** : org.jetbrains. **Name** : markdown-jvm. **Version** : 0.2.4.
- * **Project URL:** [https://github.com/JetBrains/markdown](https://github.com/JetBrains/markdown)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.dokka. **Name** : dokka-analysis. **Version** : 1.6.20.
- * **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.dokka. **Name** : dokka-base. **Version** : 1.6.20.
- * **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.dokka. **Name** : dokka-core. **Version** : 1.6.20.
- * **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.dokka. **Name** : kotlin-analysis-compiler. **Version** : 1.6.20.
- * **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.dokka. **Name** : kotlin-analysis-intellij. **Version** : 1.6.20.
- * **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.dokka. **Name** : kotlin-as-java-plugin. **Version** : 1.6.20.
- * **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.intellij.deps. **Name** : trove4j. **Version** : 1.0.20200330.
- * **Project URL:** [https://github.com/JetBrains/intellij-deps-trove4j](https://github.com/JetBrains/intellij-deps-trove4j)
- * **License:** [GNU LESSER GENERAL PUBLIC LICENSE 2.1](https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-compiler-embeddable. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-daemon-embeddable. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-klib-commonizer-embeddable. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-reflect. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-script-runtime. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-scripting-common. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-scripting-compiler-embeddable. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-scripting-compiler-impl-embeddable. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-scripting-jvm. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-common. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk7. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk8. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-bom. **Version** : 1.6.0.**No license information found**
-1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-core. **Version** : 1.6.0.**No license information found**
-1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-core-jvm. **Version** : 1.6.0.
- * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)
- * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-html-jvm. **Version** : 0.7.3.
- * **Project URL:** [https://github.com/Kotlin/kotlinx.html](https://github.com/Kotlin/kotlinx.html)
- * **License:** [The Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jsoup. **Name** : jsoup. **Version** : 1.13.1.
- * **Project URL:** [https://jsoup.org/](https://jsoup.org/)
- * **License:** [The MIT License](https://jsoup.org/license)
-
-1. **Group** : org.junit. **Name** : junit-bom. **Version** : 5.8.2.**No license information found**
-1. **Group** : org.junit.jupiter. **Name** : junit-jupiter-api. **Version** : 5.8.2.
- * **Project URL:** [https://junit.org/junit5/](https://junit.org/junit5/)
- * **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
-
-1. **Group** : org.junit.jupiter. **Name** : junit-jupiter-engine. **Version** : 5.8.2.
- * **Project URL:** [https://junit.org/junit5/](https://junit.org/junit5/)
- * **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
-
-1. **Group** : org.junit.jupiter. **Name** : junit-jupiter-params. **Version** : 5.8.2.
- * **Project URL:** [https://junit.org/junit5/](https://junit.org/junit5/)
- * **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
-
-1. **Group** : org.junit.platform. **Name** : junit-platform-commons. **Version** : 1.8.2.
- * **Project URL:** [https://junit.org/junit5/](https://junit.org/junit5/)
- * **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
-
-1. **Group** : org.junit.platform. **Name** : junit-platform-engine. **Version** : 1.8.2.
- * **Project URL:** [https://junit.org/junit5/](https://junit.org/junit5/)
- * **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
-
-1. **Group** : org.opentest4j. **Name** : opentest4j. **Version** : 1.2.0.
- * **Project URL:** [https://github.com/ota4j-team/opentest4j](https://github.com/ota4j-team/opentest4j)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.ow2.asm. **Name** : asm. **Version** : 9.1.
- * **Project URL:** [http://asm.ow2.io/](http://asm.ow2.io/)
- * **License:** [BSD-3-Clause](https://asm.ow2.io/license.html)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.ow2.asm. **Name** : asm. **Version** : 9.2.
- * **Project URL:** [http://asm.ow2.io/](http://asm.ow2.io/)
- * **License:** [BSD-3-Clause](https://asm.ow2.io/license.html)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.ow2.asm. **Name** : asm-analysis. **Version** : 9.1.
- * **Project URL:** [http://asm.ow2.io/](http://asm.ow2.io/)
- * **License:** [BSD-3-Clause](https://asm.ow2.io/license.html)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.ow2.asm. **Name** : asm-commons. **Version** : 9.1.
- * **Project URL:** [http://asm.ow2.io/](http://asm.ow2.io/)
- * **License:** [BSD-3-Clause](https://asm.ow2.io/license.html)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.ow2.asm. **Name** : asm-tree. **Version** : 9.1.
- * **Project URL:** [http://asm.ow2.io/](http://asm.ow2.io/)
- * **License:** [BSD-3-Clause](https://asm.ow2.io/license.html)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.pcollections. **Name** : pcollections. **Version** : 2.1.2.
- * **Project URL:** [http://pcollections.org](http://pcollections.org)
- * **License:** [The MIT License](http://www.opensource.org/licenses/mit-license.php)
-
-1. **Group** : org.slf4j. **Name** : slf4j-api. **Version** : 1.7.30.
- * **Project URL:** [http://www.slf4j.org](http://www.slf4j.org)
- * **License:** [MIT License](http://www.opensource.org/licenses/mit-license.php)
-
-
-The dependencies distributed under several licenses, are used according their commercial-use-friendly license.
-
-This report was generated on **Wed May 04 18:13:28 EEST 2022** using [Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under [Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE).
-
-
-
-
-# Dependencies of `io.spine:spine-test-app:2.0.0-SNAPSHOT.74`
-
-## Runtime
-1. **Group** : com.fasterxml.jackson. **Name** : jackson-bom. **Version** : 2.13.2.**No license information found**
-1. **Group** : com.fasterxml.jackson.core. **Name** : jackson-annotations. **Version** : 2.13.2.
- * **Project URL:** [http://github.com/FasterXML/jackson](http://github.com/FasterXML/jackson)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.fasterxml.jackson.core. **Name** : jackson-core. **Version** : 2.13.2.
- * **Project URL:** [https://github.com/FasterXML/jackson-core](https://github.com/FasterXML/jackson-core)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.fasterxml.jackson.core. **Name** : jackson-databind. **Version** : 2.13.2.2.
- * **Project URL:** [http://github.com/FasterXML/jackson](http://github.com/FasterXML/jackson)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.android. **Name** : annotations. **Version** : 4.1.1.4.
- * **Project URL:** [http://source.android.com/](http://source.android.com/)
- * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0)
-
-1. **Group** : com.google.api. **Name** : api-common. **Version** : 2.1.1.
- * **Project URL:** [https://github.com/googleapis/api-common-java](https://github.com/googleapis/api-common-java)
- * **License:** [BSD](https://github.com/googleapis/api-common-java/blob/master/LICENSE)
-
-1. **Group** : com.google.api. **Name** : gax. **Version** : 2.7.1.
- * **Project URL:** [https://github.com/googleapis/gax-java](https://github.com/googleapis/gax-java)
- * **License:** [BSD](https://github.com/googleapis/gax-java/blob/master/LICENSE)
-
-1. **Group** : com.google.api. **Name** : gax-grpc. **Version** : 1.66.0.
- * **Project URL:** [https://github.com/googleapis/gax-java](https://github.com/googleapis/gax-java)
- * **License:** [BSD](https://github.com/googleapis/gax-java/blob/master/LICENSE)
-
-1. **Group** : com.google.api. **Name** : gax-httpjson. **Version** : 0.83.0.
- * **Project URL:** [https://github.com/googleapis/gax-java](https://github.com/googleapis/gax-java)
- * **License:** [BSD](https://github.com/googleapis/gax-java/blob/master/LICENSE)
-
-1. **Group** : com.google.api-client. **Name** : google-api-client. **Version** : 1.32.2.
- * **Project URL:** [https://developers.google.com/api-client-library/java/](https://developers.google.com/api-client-library/java/)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.api-client. **Name** : google-api-client-gson. **Version** : 1.32.1.
- * **Project URL:** [https://googleapis.dev/java/google-api-client/1.32.1/index.html](https://googleapis.dev/java/google-api-client/1.32.1/index.html)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.api.grpc. **Name** : proto-google-cloud-firestore-v1. **Version** : 2.6.1.
- * **Project URL:** [https://github.com/googleapis/java-firestore/proto-google-cloud-firestore-v1](https://github.com/googleapis/java-firestore/proto-google-cloud-firestore-v1)
- * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.api.grpc. **Name** : proto-google-common-protos. **Version** : 2.7.0.
- * **Project URL:** [https://github.com/googleapis/java-iam/proto-google-common-protos](https://github.com/googleapis/java-iam/proto-google-common-protos)
- * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.api.grpc. **Name** : proto-google-iam-v1. **Version** : 1.2.0.
- * **Project URL:** [https://github.com/googleapis/java-iam/proto-google-iam-v1](https://github.com/googleapis/java-iam/proto-google-iam-v1)
- * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.apis. **Name** : google-api-services-storage. **Version** : v1-rev20210127-1.32.1.
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.auth. **Name** : google-auth-library-credentials. **Version** : 1.3.0.
- * **License:** [BSD New license](http://opensource.org/licenses/BSD-3-Clause)
-
-1. **Group** : com.google.auth. **Name** : google-auth-library-oauth2-http. **Version** : 1.3.0.
- * **License:** [BSD New license](http://opensource.org/licenses/BSD-3-Clause)
-
-1. **Group** : com.google.auto.value. **Name** : auto-value-annotations. **Version** : 1.9.
- * **Project URL:** [https://github.com/google/auto/tree/master/value](https://github.com/google/auto/tree/master/value)
- * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.cloud. **Name** : google-cloud-core. **Version** : 2.3.3.
- * **Project URL:** [https://github.com/googleapis/java-core](https://github.com/googleapis/java-core)
- * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.cloud. **Name** : google-cloud-core-grpc. **Version** : 1.95.4.
- * **Project URL:** [https://github.com/googleapis/java-core](https://github.com/googleapis/java-core)
- * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.cloud. **Name** : google-cloud-core-http. **Version** : 1.95.4.
- * **Project URL:** [https://github.com/googleapis/java-core](https://github.com/googleapis/java-core)
- * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.cloud. **Name** : google-cloud-firestore. **Version** : 2.6.1.
- * **Project URL:** [https://github.com/googleapis/java-firestore](https://github.com/googleapis/java-firestore)
- * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.cloud. **Name** : google-cloud-storage. **Version** : 1.118.0.
- * **Project URL:** [https://github.com/googleapis/java-storage](https://github.com/googleapis/java-storage)
- * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.cloud. **Name** : proto-google-cloud-firestore-bundle-v1. **Version** : 2.6.1.
- * **Project URL:** [https://github.com/googleapis/java-firestore/proto-google-cloud-firestore-bundle-v1](https://github.com/googleapis/java-firestore/proto-google-cloud-firestore-bundle-v1)
- * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.code.findbugs. **Name** : jsr305. **Version** : 3.0.2.
- * **Project URL:** [http://findbugs.sourceforge.net/](http://findbugs.sourceforge.net/)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.code.gson. **Name** : gson. **Version** : 2.9.0.
- * **Project URL:** [https://github.com/google/gson/gson](https://github.com/google/gson/gson)
- * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.errorprone. **Name** : error_prone_annotations. **Version** : 2.10.0.
- * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.errorprone. **Name** : error_prone_type_annotations. **Version** : 2.10.0.
- * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.firebase. **Name** : firebase-admin. **Version** : 8.1.0.
- * **Project URL:** [https://firebase.google.com/](https://firebase.google.com/)
- * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.flogger. **Name** : flogger. **Version** : 0.7.4.
- * **Project URL:** [https://github.com/google/flogger](https://github.com/google/flogger)
- * **License:** [Apache 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.flogger. **Name** : flogger-system-backend. **Version** : 0.7.4.
- * **Project URL:** [https://github.com/google/flogger](https://github.com/google/flogger)
- * **License:** [Apache 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.guava. **Name** : failureaccess. **Version** : 1.0.1.
- * **Project URL:** [https://github.com/google/guava/](https://github.com/google/guava/)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.guava. **Name** : guava. **Version** : 31.1-jre.
- * **Project URL:** [https://github.com/google/guava](https://github.com/google/guava)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.guava. **Name** : listenablefuture. **Version** : 9999.0-empty-to-avoid-conflict-with-guava.
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.http-client. **Name** : google-http-client. **Version** : 1.41.5.
- * **Project URL:** [https://www.google.com/](https://www.google.com/)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.http-client. **Name** : google-http-client-apache. **Version** : 2.1.2.
- * **Project URL:** [http://www.google.com/](http://www.google.com/)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.http-client. **Name** : google-http-client-apache-v2. **Version** : 1.41.5.
- * **Project URL:** [https://www.google.com/](https://www.google.com/)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.http-client. **Name** : google-http-client-appengine. **Version** : 1.39.2.
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.http-client. **Name** : google-http-client-gson. **Version** : 1.41.5.
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.http-client. **Name** : google-http-client-jackson2. **Version** : 1.41.5.
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.j2objc. **Name** : j2objc-annotations. **Version** : 1.3.
- * **Project URL:** [https://github.com/google/j2objc/](https://github.com/google/j2objc/)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.oauth-client. **Name** : google-oauth-client. **Version** : 1.32.1.
- * **Project URL:** [https://www.google.com/](https://www.google.com/)
- * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.protobuf. **Name** : protobuf-java. **Version** : 3.19.4.
- * **Project URL:** [https://developers.google.com/protocol-buffers/](https://developers.google.com/protocol-buffers/)
- * **License:** [3-Clause BSD License](https://opensource.org/licenses/BSD-3-Clause)
-
-1. **Group** : com.google.protobuf. **Name** : protobuf-java-util. **Version** : 3.19.4.
- * **Project URL:** [https://developers.google.com/protocol-buffers/](https://developers.google.com/protocol-buffers/)
- * **License:** [3-Clause BSD License](https://opensource.org/licenses/BSD-3-Clause)
-
-1. **Group** : com.google.protobuf. **Name** : protobuf-kotlin. **Version** : 3.19.4.
- * **License:** [3-Clause BSD License](https://opensource.org/licenses/BSD-3-Clause)
-
-1. **Group** : commons-codec. **Name** : commons-codec. **Version** : 1.15.
- * **Project URL:** [https://commons.apache.org/proper/commons-codec/](https://commons.apache.org/proper/commons-codec/)
- * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : commons-logging. **Name** : commons-logging. **Version** : 1.2.
- * **Project URL:** [http://commons.apache.org/proper/commons-logging/](http://commons.apache.org/proper/commons-logging/)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : io.grpc. **Name** : grpc-api. **Version** : 1.38.0.
- * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
- * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
-
-1. **Group** : io.grpc. **Name** : grpc-context. **Version** : 1.45.1.
- * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
- * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
-
-1. **Group** : io.grpc. **Name** : grpc-core. **Version** : 1.38.0.
- * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
- * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
-
-1. **Group** : io.grpc. **Name** : grpc-protobuf. **Version** : 1.38.0.
- * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
- * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
-
-1. **Group** : io.grpc. **Name** : grpc-protobuf-lite. **Version** : 1.38.0.
- * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
- * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
-
-1. **Group** : io.grpc. **Name** : grpc-stub. **Version** : 1.38.0.
- * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
- * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
-
-1. **Group** : io.netty. **Name** : netty-buffer. **Version** : 4.1.72.Final.
- * **Project URL:** [https://netty.io/](https://netty.io/)
- * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0)
-
-1. **Group** : io.netty. **Name** : netty-codec. **Version** : 4.1.72.Final.
- * **Project URL:** [https://netty.io/](https://netty.io/)
- * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0)
-
-1. **Group** : io.netty. **Name** : netty-codec-http. **Version** : 4.1.72.Final.
- * **Project URL:** [https://netty.io/](https://netty.io/)
- * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0)
-
-1. **Group** : io.netty. **Name** : netty-common. **Version** : 4.1.72.Final.
- * **Project URL:** [https://netty.io/](https://netty.io/)
- * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0)
-
-1. **Group** : io.netty. **Name** : netty-handler. **Version** : 4.1.72.Final.
- * **Project URL:** [https://netty.io/](https://netty.io/)
- * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0)
-
-1. **Group** : io.netty. **Name** : netty-resolver. **Version** : 4.1.72.Final.
- * **Project URL:** [https://netty.io/](https://netty.io/)
- * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0)
-
-1. **Group** : io.netty. **Name** : netty-tcnative-classes. **Version** : 2.0.46.Final.**No license information found**
-1. **Group** : io.netty. **Name** : netty-transport. **Version** : 4.1.72.Final.
- * **Project URL:** [https://netty.io/](https://netty.io/)
- * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0)
-
-1. **Group** : io.opencensus. **Name** : opencensus-api. **Version** : 0.21.0.
- * **Project URL:** [https://github.com/census-instrumentation/opencensus-java](https://github.com/census-instrumentation/opencensus-java)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : io.opencensus. **Name** : opencensus-contrib-grpc-util. **Version** : 0.28.0.
- * **Project URL:** [https://github.com/census-instrumentation/opencensus-java](https://github.com/census-instrumentation/opencensus-java)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : io.opencensus. **Name** : opencensus-contrib-http-util. **Version** : 0.18.0.
- * **Project URL:** [https://github.com/census-instrumentation/opencensus-java](https://github.com/census-instrumentation/opencensus-java)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : io.perfmark. **Name** : perfmark-api. **Version** : 0.23.0.
- * **Project URL:** [https://github.com/perfmark/perfmark](https://github.com/perfmark/perfmark)
- * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
-
-1. **Group** : javax.annotation. **Name** : javax.annotation-api. **Version** : 1.3.2.
- * **Project URL:** [http://jcp.org/en/jsr/detail?id=250](http://jcp.org/en/jsr/detail?id=250)
- * **License:** [CDDL + GPLv2 with classpath exception](https://github.com/javaee/javax.annotation/blob/master/LICENSE)
-
-1. **Group** : javax.servlet. **Name** : javax.servlet-api. **Version** : 3.1.0.
- * **Project URL:** [http://servlet-spec.java.net](http://servlet-spec.java.net)
- * **License:** [CDDL + GPLv2 with classpath exception](https://glassfish.dev.java.net/nonav/public/CDDL+GPL.html)
-
-1. **Group** : javax.websocket. **Name** : javax.websocket-api. **Version** : 1.0.
- * **Project URL:** [http://websocket-spec.java.net](http://websocket-spec.java.net)
- * **License:** [
- Dual license consisting of the CDDL v1.1 and GPL v2
- ](https://glassfish.java.net/public/CDDL+GPL_1_1.html)
-
-1. **Group** : org.apache.httpcomponents. **Name** : httpclient. **Version** : 4.5.13.
- * **Project URL:** [http://hc.apache.org/httpcomponents-client](http://hc.apache.org/httpcomponents-client)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.apache.httpcomponents. **Name** : httpcore. **Version** : 4.4.14.
- * **Project URL:** [http://hc.apache.org/httpcomponents-core-ga](http://hc.apache.org/httpcomponents-core-ga)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.checkerframework. **Name** : checker-compat-qual. **Version** : 2.5.5.
- * **Project URL:** [https://checkerframework.org](https://checkerframework.org)
- * **License:** [GNU General Public License, version 2 (GPL2), with the classpath exception](http://www.gnu.org/software/classpath/license.html)
- * **License:** [The MIT License](http://opensource.org/licenses/MIT)
-
-1. **Group** : org.checkerframework. **Name** : checker-qual. **Version** : 3.21.3.
- * **Project URL:** [https://checkerframework.org](https://checkerframework.org)
- * **License:** [The MIT License](http://opensource.org/licenses/MIT)
-
-1. **Group** : org.codehaus.mojo. **Name** : animal-sniffer-annotations. **Version** : 1.21.
- * **License:** [MIT license](http://www.opensource.org/licenses/mit-license.php)
- * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.conscrypt. **Name** : conscrypt-openjdk-uber. **Version** : 2.5.1.
- * **Project URL:** [https://conscrypt.org/](https://conscrypt.org/)
- * **License:** [Apache 2](https://www.apache.org/licenses/LICENSE-2.0)
-
-1. **Group** : org.jetbrains. **Name** : annotations. **Version** : 13.0.
- * **Project URL:** [http://www.jetbrains.org](http://www.jetbrains.org)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-reflect. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-common. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk7. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk8. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.slf4j. **Name** : slf4j-api. **Version** : 1.7.30.
- * **Project URL:** [http://www.slf4j.org](http://www.slf4j.org)
- * **License:** [MIT License](http://www.opensource.org/licenses/mit-license.php)
-
-1. **Group** : org.threeten. **Name** : threetenbp. **Version** : 1.5.1.
- * **Project URL:** [https://www.threeten.org/threetenbp](https://www.threeten.org/threetenbp)
- * **License:** [BSD 3-clause](https://raw.githubusercontent.com/ThreeTen/threetenbp/master/LICENSE.txt)
-
-## Compile, tests, and tooling
-1. **Group** : ch.qos.logback. **Name** : logback-classic. **Version** : 1.1.3.
- * **Project URL:** [http://www.qos.ch](http://www.qos.ch)
- * **License:** [Eclipse Public License - v 1.0](http://www.eclipse.org/legal/epl-v10.html)
- * **License:** [GNU Lesser General Public License](http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html)
-
-1. **Group** : ch.qos.logback. **Name** : logback-core. **Version** : 1.1.3.
- * **Project URL:** [http://www.qos.ch](http://www.qos.ch)
- * **License:** [Eclipse Public License - v 1.0](http://www.eclipse.org/legal/epl-v10.html)
- * **License:** [GNU Lesser General Public License](http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html)
-
-1. **Group** : com.beust. **Name** : jcommander. **Version** : 1.48.
- * **Project URL:** [http://beust.com/jcommander](http://beust.com/jcommander)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.fasterxml.jackson. **Name** : jackson-bom. **Version** : 2.13.2.**No license information found**
-1. **Group** : com.fasterxml.jackson.core. **Name** : jackson-annotations. **Version** : 2.13.2.
- * **Project URL:** [http://github.com/FasterXML/jackson](http://github.com/FasterXML/jackson)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.fasterxml.jackson.core. **Name** : jackson-core. **Version** : 2.13.2.
- * **Project URL:** [https://github.com/FasterXML/jackson-core](https://github.com/FasterXML/jackson-core)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.fasterxml.jackson.core. **Name** : jackson-databind. **Version** : 2.13.2.2.
- * **Project URL:** [http://github.com/FasterXML/jackson](http://github.com/FasterXML/jackson)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.fasterxml.jackson.dataformat. **Name** : jackson-dataformat-xml. **Version** : 2.13.2.
- * **Project URL:** [https://github.com/FasterXML/jackson-dataformat-xml](https://github.com/FasterXML/jackson-dataformat-xml)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.fasterxml.jackson.module. **Name** : jackson-module-kotlin. **Version** : 2.13.2.
- * **Project URL:** [https://github.com/FasterXML/jackson-module-kotlin](https://github.com/FasterXML/jackson-module-kotlin)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.fasterxml.woodstox. **Name** : woodstox-core. **Version** : 6.2.7.
- * **Project URL:** [https://github.com/FasterXML/woodstox](https://github.com/FasterXML/woodstox)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.github.ben-manes.caffeine. **Name** : caffeine. **Version** : 2.8.8.
- * **Project URL:** [https://github.com/ben-manes/caffeine](https://github.com/ben-manes/caffeine)
- * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.github.kevinstern. **Name** : software-and-algorithms. **Version** : 1.0.
- * **Project URL:** [https://www.github.com/KevinStern/software-and-algorithms](https://www.github.com/KevinStern/software-and-algorithms)
- * **License:** [MIT License](http://www.opensource.org/licenses/mit-license.php)
-
-1. **Group** : com.google.android. **Name** : annotations. **Version** : 4.1.1.4.
- * **Project URL:** [http://source.android.com/](http://source.android.com/)
- * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0)
-
-1. **Group** : com.google.api. **Name** : api-common. **Version** : 2.1.1.
- * **Project URL:** [https://github.com/googleapis/api-common-java](https://github.com/googleapis/api-common-java)
- * **License:** [BSD](https://github.com/googleapis/api-common-java/blob/master/LICENSE)
-
-1. **Group** : com.google.api. **Name** : gax. **Version** : 2.7.1.
- * **Project URL:** [https://github.com/googleapis/gax-java](https://github.com/googleapis/gax-java)
- * **License:** [BSD](https://github.com/googleapis/gax-java/blob/master/LICENSE)
-
-1. **Group** : com.google.api. **Name** : gax-grpc. **Version** : 1.66.0.
- * **Project URL:** [https://github.com/googleapis/gax-java](https://github.com/googleapis/gax-java)
- * **License:** [BSD](https://github.com/googleapis/gax-java/blob/master/LICENSE)
-
-1. **Group** : com.google.api. **Name** : gax-httpjson. **Version** : 0.83.0.
- * **Project URL:** [https://github.com/googleapis/gax-java](https://github.com/googleapis/gax-java)
- * **License:** [BSD](https://github.com/googleapis/gax-java/blob/master/LICENSE)
-
-1. **Group** : com.google.api-client. **Name** : google-api-client. **Version** : 1.32.2.
- * **Project URL:** [https://developers.google.com/api-client-library/java/](https://developers.google.com/api-client-library/java/)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.api-client. **Name** : google-api-client-gson. **Version** : 1.32.1.
- * **Project URL:** [https://googleapis.dev/java/google-api-client/1.32.1/index.html](https://googleapis.dev/java/google-api-client/1.32.1/index.html)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.api.grpc. **Name** : proto-google-cloud-firestore-v1. **Version** : 2.6.1.
- * **Project URL:** [https://github.com/googleapis/java-firestore/proto-google-cloud-firestore-v1](https://github.com/googleapis/java-firestore/proto-google-cloud-firestore-v1)
- * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.api.grpc. **Name** : proto-google-common-protos. **Version** : 2.7.0.
- * **Project URL:** [https://github.com/googleapis/java-iam/proto-google-common-protos](https://github.com/googleapis/java-iam/proto-google-common-protos)
- * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.api.grpc. **Name** : proto-google-iam-v1. **Version** : 1.2.0.
- * **Project URL:** [https://github.com/googleapis/java-iam/proto-google-iam-v1](https://github.com/googleapis/java-iam/proto-google-iam-v1)
- * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.apis. **Name** : google-api-services-storage. **Version** : v1-rev20210127-1.32.1.
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.auth. **Name** : google-auth-library-credentials. **Version** : 1.3.0.
- * **License:** [BSD New license](http://opensource.org/licenses/BSD-3-Clause)
-
-1. **Group** : com.google.auth. **Name** : google-auth-library-oauth2-http. **Version** : 1.3.0.
- * **License:** [BSD New license](http://opensource.org/licenses/BSD-3-Clause)
-
-1. **Group** : com.google.auto. **Name** : auto-common. **Version** : 1.2.1.
- * **Project URL:** [https://github.com/google/auto/tree/master/common](https://github.com/google/auto/tree/master/common)
- * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.auto.service. **Name** : auto-service-annotations. **Version** : 1.0.1.
- * **Project URL:** [https://github.com/google/auto/tree/master/service](https://github.com/google/auto/tree/master/service)
- * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.auto.value. **Name** : auto-value-annotations. **Version** : 1.9.
- * **Project URL:** [https://github.com/google/auto/tree/master/value](https://github.com/google/auto/tree/master/value)
- * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.cloud. **Name** : google-cloud-core. **Version** : 2.3.3.
- * **Project URL:** [https://github.com/googleapis/java-core](https://github.com/googleapis/java-core)
- * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.cloud. **Name** : google-cloud-core-grpc. **Version** : 1.95.4.
- * **Project URL:** [https://github.com/googleapis/java-core](https://github.com/googleapis/java-core)
- * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.cloud. **Name** : google-cloud-core-http. **Version** : 1.95.4.
- * **Project URL:** [https://github.com/googleapis/java-core](https://github.com/googleapis/java-core)
- * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.cloud. **Name** : google-cloud-firestore. **Version** : 2.6.1.
- * **Project URL:** [https://github.com/googleapis/java-firestore](https://github.com/googleapis/java-firestore)
- * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.cloud. **Name** : google-cloud-storage. **Version** : 1.118.0.
- * **Project URL:** [https://github.com/googleapis/java-storage](https://github.com/googleapis/java-storage)
- * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.cloud. **Name** : proto-google-cloud-firestore-bundle-v1. **Version** : 2.6.1.
- * **Project URL:** [https://github.com/googleapis/java-firestore/proto-google-cloud-firestore-bundle-v1](https://github.com/googleapis/java-firestore/proto-google-cloud-firestore-bundle-v1)
- * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.code.findbugs. **Name** : jFormatString. **Version** : 3.0.0.
- * **Project URL:** [http://findbugs.sourceforge.net/](http://findbugs.sourceforge.net/)
- * **License:** [GNU Lesser Public License](http://www.gnu.org/licenses/lgpl.html)
-
-1. **Group** : com.google.code.findbugs. **Name** : jsr305. **Version** : 3.0.2.
- * **Project URL:** [http://findbugs.sourceforge.net/](http://findbugs.sourceforge.net/)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.code.gson. **Name** : gson. **Version** : 2.9.0.
- * **Project URL:** [https://github.com/google/gson/gson](https://github.com/google/gson/gson)
- * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.errorprone. **Name** : error_prone_annotation. **Version** : 2.10.0.
- * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.errorprone. **Name** : error_prone_annotations. **Version** : 2.10.0.
- * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.errorprone. **Name** : error_prone_check_api. **Version** : 2.10.0.
- * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.errorprone. **Name** : error_prone_core. **Version** : 2.10.0.
- * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.errorprone. **Name** : error_prone_type_annotations. **Version** : 2.10.0.
- * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.firebase. **Name** : firebase-admin. **Version** : 8.1.0.
- * **Project URL:** [https://firebase.google.com/](https://firebase.google.com/)
- * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.flogger. **Name** : flogger. **Version** : 0.7.4.
- * **Project URL:** [https://github.com/google/flogger](https://github.com/google/flogger)
- * **License:** [Apache 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.flogger. **Name** : flogger-system-backend. **Version** : 0.7.4.
- * **Project URL:** [https://github.com/google/flogger](https://github.com/google/flogger)
- * **License:** [Apache 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.gradle. **Name** : osdetector-gradle-plugin. **Version** : 1.7.0.
- * **Project URL:** [https://github.com/google/osdetector-gradle-plugin](https://github.com/google/osdetector-gradle-plugin)
- * **License:** [Apache License 2.0](http://opensource.org/licenses/Apache-2.0)
-
-1. **Group** : com.google.guava. **Name** : failureaccess. **Version** : 1.0.1.
- * **Project URL:** [https://github.com/google/guava/](https://github.com/google/guava/)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.guava. **Name** : guava. **Version** : 31.1-jre.
- * **Project URL:** [https://github.com/google/guava](https://github.com/google/guava)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.guava. **Name** : guava-testlib. **Version** : 31.1-jre.
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.guava. **Name** : listenablefuture. **Version** : 9999.0-empty-to-avoid-conflict-with-guava.
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.http-client. **Name** : google-http-client. **Version** : 1.41.5.
- * **Project URL:** [https://www.google.com/](https://www.google.com/)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.http-client. **Name** : google-http-client-apache. **Version** : 2.1.2.
- * **Project URL:** [http://www.google.com/](http://www.google.com/)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.http-client. **Name** : google-http-client-apache-v2. **Version** : 1.41.5.
- * **Project URL:** [https://www.google.com/](https://www.google.com/)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.http-client. **Name** : google-http-client-appengine. **Version** : 1.39.2.
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.http-client. **Name** : google-http-client-gson. **Version** : 1.41.5.
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.http-client. **Name** : google-http-client-jackson2. **Version** : 1.41.5.
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.j2objc. **Name** : j2objc-annotations. **Version** : 1.3.
- * **Project URL:** [https://github.com/google/j2objc/](https://github.com/google/j2objc/)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.oauth-client. **Name** : google-oauth-client. **Version** : 1.32.1.
- * **Project URL:** [https://www.google.com/](https://www.google.com/)
- * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.protobuf. **Name** : protobuf-gradle-plugin. **Version** : 0.8.18.
- * **Project URL:** [https://github.com/google/protobuf-gradle-plugin](https://github.com/google/protobuf-gradle-plugin)
- * **License:** [BSD 3-Clause](http://opensource.org/licenses/BSD-3-Clause)
-
-1. **Group** : com.google.protobuf. **Name** : protobuf-java. **Version** : 3.19.4.
- * **Project URL:** [https://developers.google.com/protocol-buffers/](https://developers.google.com/protocol-buffers/)
- * **License:** [3-Clause BSD License](https://opensource.org/licenses/BSD-3-Clause)
-
-1. **Group** : com.google.protobuf. **Name** : protobuf-java-util. **Version** : 3.19.4.
- * **Project URL:** [https://developers.google.com/protocol-buffers/](https://developers.google.com/protocol-buffers/)
- * **License:** [3-Clause BSD License](https://opensource.org/licenses/BSD-3-Clause)
-
-1. **Group** : com.google.protobuf. **Name** : protobuf-kotlin. **Version** : 3.19.4.
- * **License:** [3-Clause BSD License](https://opensource.org/licenses/BSD-3-Clause)
-
-1. **Group** : com.google.protobuf. **Name** : protoc. **Version** : 3.18.0.
- * **Project URL:** [https://developers.google.com/protocol-buffers/](https://developers.google.com/protocol-buffers/)
- * **License:** [3-Clause BSD License](https://opensource.org/licenses/BSD-3-Clause)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.truth. **Name** : truth. **Version** : 1.1.3.
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.truth.extensions. **Name** : truth-java8-extension. **Version** : 1.1.3.
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.truth.extensions. **Name** : truth-liteproto-extension. **Version** : 1.1.3.
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.truth.extensions. **Name** : truth-proto-extension. **Version** : 1.1.3.
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.puppycrawl.tools. **Name** : checkstyle. **Version** : 10.1.
- * **Project URL:** [https://checkstyle.org/](https://checkstyle.org/)
- * **License:** [LGPL-2.1+](http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt)
-
-1. **Group** : com.soywiz.korlibs.korte. **Name** : korte-jvm. **Version** : 2.4.6.
- * **Project URL:** [https://github.com/korlibs/korge-next](https://github.com/korlibs/korge-next)
- * **License:** [MIT](https://raw.githubusercontent.com/korlibs/korge-next/master/korge/LICENSE.txt)
-
-1. **Group** : com.squareup. **Name** : javapoet. **Version** : 1.13.0.
- * **Project URL:** [http://github.com/square/javapoet/](http://github.com/square/javapoet/)
- * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : commons-beanutils. **Name** : commons-beanutils. **Version** : 1.9.4.
- * **Project URL:** [https://commons.apache.org/proper/commons-beanutils/](https://commons.apache.org/proper/commons-beanutils/)
- * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : commons-cli. **Name** : commons-cli. **Version** : 1.4.
- * **Project URL:** [http://commons.apache.org/proper/commons-cli/](http://commons.apache.org/proper/commons-cli/)
- * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : commons-codec. **Name** : commons-codec. **Version** : 1.15.
- * **Project URL:** [https://commons.apache.org/proper/commons-codec/](https://commons.apache.org/proper/commons-codec/)
- * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : commons-collections. **Name** : commons-collections. **Version** : 3.2.2.
- * **Project URL:** [http://commons.apache.org/collections/](http://commons.apache.org/collections/)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : commons-configuration. **Name** : commons-configuration. **Version** : 1.10.
- * **Project URL:** [http://commons.apache.org/configuration/](http://commons.apache.org/configuration/)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : commons-io. **Name** : commons-io. **Version** : 2.4.
- * **Project URL:** [http://commons.apache.org/io/](http://commons.apache.org/io/)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : commons-io. **Name** : commons-io. **Version** : 2.6.
- * **Project URL:** [http://commons.apache.org/proper/commons-io/](http://commons.apache.org/proper/commons-io/)
- * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : commons-lang. **Name** : commons-lang. **Version** : 2.6.
- * **Project URL:** [http://commons.apache.org/lang/](http://commons.apache.org/lang/)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : commons-logging. **Name** : commons-logging. **Version** : 1.2.
- * **Project URL:** [http://commons.apache.org/proper/commons-logging/](http://commons.apache.org/proper/commons-logging/)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : info.picocli. **Name** : picocli. **Version** : 4.6.3.
- * **Project URL:** [http://picocli.info](http://picocli.info)
- * **License:** [The Apache Software License, version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : io.github.java-diff-utils. **Name** : java-diff-utils. **Version** : 4.0.
- * **Project URL:** [https://github.com/java-diff-utils/java-diff-utils](https://github.com/java-diff-utils/java-diff-utils)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : io.grpc. **Name** : grpc-api. **Version** : 1.38.0.
- * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
- * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
-
-1. **Group** : io.grpc. **Name** : grpc-context. **Version** : 1.45.1.
- * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
- * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
-
-1. **Group** : io.grpc. **Name** : grpc-core. **Version** : 1.38.0.
- * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
- * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
-
-1. **Group** : io.grpc. **Name** : grpc-protobuf. **Version** : 1.38.0.
- * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
- * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
-
-1. **Group** : io.grpc. **Name** : grpc-protobuf-lite. **Version** : 1.38.0.
- * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
- * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
-
-1. **Group** : io.grpc. **Name** : grpc-stub. **Version** : 1.38.0.
- * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
- * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
-
-1. **Group** : io.grpc. **Name** : protoc-gen-grpc-java. **Version** : 1.38.0.
- * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
- * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
-
-1. **Group** : io.netty. **Name** : netty-buffer. **Version** : 4.1.72.Final.
- * **Project URL:** [https://netty.io/](https://netty.io/)
- * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0)
-
-1. **Group** : io.netty. **Name** : netty-codec. **Version** : 4.1.72.Final.
- * **Project URL:** [https://netty.io/](https://netty.io/)
- * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0)
-
-1. **Group** : io.netty. **Name** : netty-codec-http. **Version** : 4.1.72.Final.
- * **Project URL:** [https://netty.io/](https://netty.io/)
- * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0)
-
-1. **Group** : io.netty. **Name** : netty-common. **Version** : 4.1.72.Final.
- * **Project URL:** [https://netty.io/](https://netty.io/)
- * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0)
-
-1. **Group** : io.netty. **Name** : netty-handler. **Version** : 4.1.72.Final.
- * **Project URL:** [https://netty.io/](https://netty.io/)
- * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0)
-
-1. **Group** : io.netty. **Name** : netty-resolver. **Version** : 4.1.72.Final.
- * **Project URL:** [https://netty.io/](https://netty.io/)
- * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0)
-
-1. **Group** : io.netty. **Name** : netty-tcnative-classes. **Version** : 2.0.46.Final.**No license information found**
-1. **Group** : io.netty. **Name** : netty-transport. **Version** : 4.1.72.Final.
- * **Project URL:** [https://netty.io/](https://netty.io/)
- * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0)
-
-1. **Group** : io.opencensus. **Name** : opencensus-api. **Version** : 0.21.0.
- * **Project URL:** [https://github.com/census-instrumentation/opencensus-java](https://github.com/census-instrumentation/opencensus-java)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : io.opencensus. **Name** : opencensus-contrib-grpc-util. **Version** : 0.28.0.
- * **Project URL:** [https://github.com/census-instrumentation/opencensus-java](https://github.com/census-instrumentation/opencensus-java)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : io.opencensus. **Name** : opencensus-contrib-http-util. **Version** : 0.18.0.
- * **Project URL:** [https://github.com/census-instrumentation/opencensus-java](https://github.com/census-instrumentation/opencensus-java)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : io.perfmark. **Name** : perfmark-api. **Version** : 0.23.0.
- * **Project URL:** [https://github.com/perfmark/perfmark](https://github.com/perfmark/perfmark)
- * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
-
-1. **Group** : javax.annotation. **Name** : javax.annotation-api. **Version** : 1.2.
- * **Project URL:** [http://jcp.org/en/jsr/detail?id=250](http://jcp.org/en/jsr/detail?id=250)
- * **License:** [CDDL + GPLv2 with classpath exception](https://glassfish.dev.java.net/nonav/public/CDDL+GPL.html)
-
-1. **Group** : javax.annotation. **Name** : javax.annotation-api. **Version** : 1.3.
- * **Project URL:** [http://jcp.org/en/jsr/detail?id=250](http://jcp.org/en/jsr/detail?id=250)
- * **License:** [CDDL + GPLv2 with classpath exception](https://glassfish.dev.java.net/nonav/public/CDDL+GPL.html)
-
-1. **Group** : javax.annotation. **Name** : javax.annotation-api. **Version** : 1.3.2.
- * **Project URL:** [http://jcp.org/en/jsr/detail?id=250](http://jcp.org/en/jsr/detail?id=250)
- * **License:** [CDDL + GPLv2 with classpath exception](https://github.com/javaee/javax.annotation/blob/master/LICENSE)
-
-1. **Group** : javax.servlet. **Name** : javax.servlet-api. **Version** : 3.0.1.
- * **Project URL:** [http://servlet-spec.java.net](http://servlet-spec.java.net)
- * **License:** [CDDL + GPLv2 with classpath exception](https://glassfish.dev.java.net/nonav/public/CDDL+GPL.html)
-
-1. **Group** : javax.servlet. **Name** : javax.servlet-api. **Version** : 3.1.0.
- * **Project URL:** [http://servlet-spec.java.net](http://servlet-spec.java.net)
- * **License:** [CDDL + GPLv2 with classpath exception](https://glassfish.dev.java.net/nonav/public/CDDL+GPL.html)
-
-1. **Group** : javax.servlet. **Name** : javax.servlet-api. **Version** : 4.0.1.
- * **Project URL:** [https://javaee.github.io/servlet-spec/](https://javaee.github.io/servlet-spec/)
- * **License:** [CDDL + GPLv2 with classpath exception](https://oss.oracle.com/licenses/CDDL+GPL-1.1)
-
-1. **Group** : javax.servlet. **Name** : servlet-api. **Version** : 2.5.**No license information found**
-1. **Group** : javax.servlet.jsp. **Name** : javax.servlet.jsp-api. **Version** : 2.3.1.
- * **Project URL:** [http://jsp.java.net](http://jsp.java.net)
- * **License:** [CDDL + GPLv2 with classpath exception](http://glassfish.dev.java.net/nonav/public/CDDL+GPL.html)
-
-1. **Group** : javax.websocket. **Name** : javax.websocket-api. **Version** : 1.0.
- * **Project URL:** [http://websocket-spec.java.net](http://websocket-spec.java.net)
- * **License:** [
- Dual license consisting of the CDDL v1.1 and GPL v2
- ](https://glassfish.java.net/public/CDDL+GPL_1_1.html)
-
-1. **Group** : javax.websocket. **Name** : javax.websocket-client-api. **Version** : 1.0.
- * **Project URL:** [http://websocket-spec.java.net](http://websocket-spec.java.net)
- * **License:** [
- Dual license consisting of the CDDL v1.1 and GPL v2
- ](https://glassfish.java.net/public/CDDL+GPL_1_1.html)
-
-1. **Group** : junit. **Name** : junit. **Version** : 4.13.1.
- * **Project URL:** [http://junit.org](http://junit.org)
- * **License:** [Eclipse Public License 1.0](http://www.eclipse.org/legal/epl-v10.html)
-
-1. **Group** : kr.motd.maven. **Name** : os-maven-plugin. **Version** : 1.7.0.
- * **Project URL:** [https://github.com/trustin/os-maven-plugin/](https://github.com/trustin/os-maven-plugin/)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
-
-1. **Group** : net.java.dev.jna. **Name** : jna. **Version** : 5.6.0.
- * **Project URL:** [https://github.com/java-native-access/jna](https://github.com/java-native-access/jna)
- * **License:** [Apache License v2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
- * **License:** [LGPL, version 2.1](http://www.gnu.org/licenses/licenses.html)
-
-1. **Group** : net.sf.saxon. **Name** : Saxon-HE. **Version** : 10.6.
- * **Project URL:** [http://www.saxonica.com/](http://www.saxonica.com/)
- * **License:** [Mozilla Public License Version 2.0](http://www.mozilla.org/MPL/2.0/)
-
-1. **Group** : net.sourceforge.pmd. **Name** : pmd-core. **Version** : 6.44.0.
- * **License:** [BSD-style](http://pmd.sourceforge.net/license.html)
-
-1. **Group** : net.sourceforge.pmd. **Name** : pmd-java. **Version** : 6.44.0.
- * **License:** [BSD-style](http://pmd.sourceforge.net/license.html)
-
-1. **Group** : net.sourceforge.saxon. **Name** : saxon. **Version** : 9.1.0.8.
- * **Project URL:** [http://saxon.sourceforge.net/](http://saxon.sourceforge.net/)
- * **License:** [Mozilla Public License Version 1.0](http://www.mozilla.org/MPL/MPL-1.0.txt)
-
-1. **Group** : org.antlr. **Name** : antlr4-runtime. **Version** : 4.7.2.
- * **Project URL:** [http://www.antlr.org](http://www.antlr.org)
- * **License:** [The BSD License](http://www.antlr.org/license.html)
-
-1. **Group** : org.antlr. **Name** : antlr4-runtime. **Version** : 4.9.3.
- * **Project URL:** [http://www.antlr.org](http://www.antlr.org)
- * **License:** [The BSD License](http://www.antlr.org/license.html)
-
-1. **Group** : org.apache.commons. **Name** : commons-lang3. **Version** : 3.3.2.
- * **Project URL:** [http://commons.apache.org/proper/commons-lang/](http://commons.apache.org/proper/commons-lang/)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.apache.commons. **Name** : commons-lang3. **Version** : 3.8.1.
- * **Project URL:** [http://commons.apache.org/proper/commons-lang/](http://commons.apache.org/proper/commons-lang/)
- * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.apache.httpcomponents. **Name** : httpclient. **Version** : 4.5.13.
- * **Project URL:** [http://hc.apache.org/httpcomponents-client](http://hc.apache.org/httpcomponents-client)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.apache.httpcomponents. **Name** : httpcore. **Version** : 4.4.14.
- * **Project URL:** [http://hc.apache.org/httpcomponents-core-ga](http://hc.apache.org/httpcomponents-core-ga)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.apache.tomcat. **Name** : tomcat-annotations-api. **Version** : 8.5.69.
- * **Project URL:** [https://tomcat.apache.org/](https://tomcat.apache.org/)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.apache.tomcat. **Name** : tomcat-annotations-api. **Version** : 9.0.50.
- * **Project URL:** [https://tomcat.apache.org/](https://tomcat.apache.org/)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.apache.tomcat.embed. **Name** : tomcat-embed-core. **Version** : 8.5.69.
- * **Project URL:** [https://tomcat.apache.org/](https://tomcat.apache.org/)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.apache.tomcat.embed. **Name** : tomcat-embed-core. **Version** : 9.0.50.
- * **Project URL:** [https://tomcat.apache.org/](https://tomcat.apache.org/)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.apache.tomcat.embed. **Name** : tomcat-embed-el. **Version** : 8.5.69.
- * **Project URL:** [https://tomcat.apache.org/](https://tomcat.apache.org/)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.apache.tomcat.embed. **Name** : tomcat-embed-el. **Version** : 9.0.50.
- * **Project URL:** [https://tomcat.apache.org/](https://tomcat.apache.org/)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.apache.tomcat.embed. **Name** : tomcat-embed-jasper. **Version** : 8.5.69.
- * **Project URL:** [https://tomcat.apache.org/](https://tomcat.apache.org/)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.apache.tomcat.embed. **Name** : tomcat-embed-jasper. **Version** : 9.0.50.
- * **Project URL:** [https://tomcat.apache.org/](https://tomcat.apache.org/)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.apache.tomcat.embed. **Name** : tomcat-embed-websocket. **Version** : 8.5.69.
- * **Project URL:** [https://tomcat.apache.org/](https://tomcat.apache.org/)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.apache.tomcat.embed. **Name** : tomcat-embed-websocket. **Version** : 9.0.50.
- * **Project URL:** [https://tomcat.apache.org/](https://tomcat.apache.org/)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.apiguardian. **Name** : apiguardian-api. **Version** : 1.1.2.
- * **Project URL:** [https://github.com/apiguardian-team/apiguardian](https://github.com/apiguardian-team/apiguardian)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.bouncycastle. **Name** : bcprov-jdk15on. **Version** : 1.60.
- * **Project URL:** [http://www.bouncycastle.org/java.html](http://www.bouncycastle.org/java.html)
- * **License:** [Bouncy Castle Licence](http://www.bouncycastle.org/licence.html)
-
-1. **Group** : org.checkerframework. **Name** : checker-compat-qual. **Version** : 2.5.5.
- * **Project URL:** [https://checkerframework.org](https://checkerframework.org)
- * **License:** [GNU General Public License, version 2 (GPL2), with the classpath exception](http://www.gnu.org/software/classpath/license.html)
- * **License:** [The MIT License](http://opensource.org/licenses/MIT)
-
-1. **Group** : org.checkerframework. **Name** : checker-qual. **Version** : 3.21.3.
- * **Project URL:** [https://checkerframework.org](https://checkerframework.org)
- * **License:** [The MIT License](http://opensource.org/licenses/MIT)
-
-1. **Group** : org.checkerframework. **Name** : dataflow-errorprone. **Version** : 3.15.0.
- * **Project URL:** [https://checkerframework.org](https://checkerframework.org)
- * **License:** [GNU General Public License, version 2 (GPL2), with the classpath exception](http://www.gnu.org/software/classpath/license.html)
-
-1. **Group** : org.codehaus.mojo. **Name** : animal-sniffer-annotations. **Version** : 1.21.
- * **License:** [MIT license](http://www.opensource.org/licenses/mit-license.php)
- * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.codehaus.woodstox. **Name** : stax2-api. **Version** : 4.2.1.
- * **Project URL:** [http://github.com/FasterXML/stax2-api](http://github.com/FasterXML/stax2-api)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
- * **License:** [The BSD License](http://www.opensource.org/licenses/bsd-license.php)
-
-1. **Group** : org.conscrypt. **Name** : conscrypt-openjdk-uber. **Version** : 2.5.1.
- * **Project URL:** [https://conscrypt.org/](https://conscrypt.org/)
- * **License:** [Apache 2](https://www.apache.org/licenses/LICENSE-2.0)
-
-1. **Group** : org.eclipse.jdt. **Name** : ecj. **Version** : 3.12.3.
- * **Project URL:** [http://www.eclipse.org/jdt](http://www.eclipse.org/jdt)
- * **License:** [Eclipse Public License](http://www.eclipse.org/legal/epl-v10.html)
-
-1. **Group** : org.eclipse.jdt. **Name** : ecj. **Version** : 3.17.0.
- * **Project URL:** [http://www.eclipse.org/jdt](http://www.eclipse.org/jdt)
- * **License:** [Eclipse Public License - v 2.0](https://www.eclipse.org/legal/epl-2.0/)
-
-1. **Group** : org.eclipse.jdt. **Name** : ecj. **Version** : 3.18.0.
- * **Project URL:** [http://www.eclipse.org/jdt](http://www.eclipse.org/jdt)
- * **License:** [Eclipse Public License - v 2.0](https://www.eclipse.org/legal/epl-2.0/)
-
-1. **Group** : org.eclipse.jdt.core.compiler. **Name** : ecj. **Version** : 4.4.2.
- * **Project URL:** [http://www.eclipse.org/jdt/](http://www.eclipse.org/jdt/)
- * **License:** [Eclipse Public License v1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty. **Name** : apache-jsp. **Version** : 9.3.28.v20191105.
- * **Project URL:** [http://www.eclipse.org/jetty](http://www.eclipse.org/jetty)
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty. **Name** : apache-jsp. **Version** : 9.4.24.v20191120.
- * **Project URL:** [http://www.eclipse.org/jetty](http://www.eclipse.org/jetty)
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty. **Name** : jetty-annotations. **Version** : 8.1.22.v20160922.
- * **Project URL:** [http://www.eclipse.org/jetty](http://www.eclipse.org/jetty)
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty. **Name** : jetty-annotations. **Version** : 9.2.26.v20180806.
- * **Project URL:** [http://www.eclipse.org/jetty](http://www.eclipse.org/jetty)
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty. **Name** : jetty-annotations. **Version** : 9.3.28.v20191105.
- * **Project URL:** [http://www.eclipse.org/jetty](http://www.eclipse.org/jetty)
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty. **Name** : jetty-annotations. **Version** : 9.4.24.v20191120.
- * **Project URL:** [http://www.eclipse.org/jetty](http://www.eclipse.org/jetty)
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty. **Name** : jetty-client. **Version** : 9.4.24.v20191120.
- * **Project URL:** [http://www.eclipse.org/jetty](http://www.eclipse.org/jetty)
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty. **Name** : jetty-continuation. **Version** : 7.6.21.v20160908.
- * **Project URL:** [http://www.eclipse.org/jetty](http://www.eclipse.org/jetty)
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty. **Name** : jetty-continuation. **Version** : 8.1.22.v20160922.
- * **Project URL:** [http://www.eclipse.org/jetty](http://www.eclipse.org/jetty)
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty. **Name** : jetty-http. **Version** : 7.6.21.v20160908.
- * **Project URL:** [http://www.eclipse.org/jetty](http://www.eclipse.org/jetty)
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty. **Name** : jetty-http. **Version** : 8.1.22.v20160922.
- * **Project URL:** [http://www.eclipse.org/jetty](http://www.eclipse.org/jetty)
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty. **Name** : jetty-http. **Version** : 9.2.26.v20180806.
- * **Project URL:** [http://www.eclipse.org/jetty](http://www.eclipse.org/jetty)
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty. **Name** : jetty-http. **Version** : 9.3.28.v20191105.
- * **Project URL:** [http://www.eclipse.org/jetty](http://www.eclipse.org/jetty)
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty. **Name** : jetty-http. **Version** : 9.4.24.v20191120.
- * **Project URL:** [http://www.eclipse.org/jetty](http://www.eclipse.org/jetty)
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty. **Name** : jetty-io. **Version** : 7.6.21.v20160908.
- * **Project URL:** [http://www.eclipse.org/jetty](http://www.eclipse.org/jetty)
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty. **Name** : jetty-io. **Version** : 8.1.22.v20160922.
- * **Project URL:** [http://www.eclipse.org/jetty](http://www.eclipse.org/jetty)
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty. **Name** : jetty-io. **Version** : 9.2.26.v20180806.
- * **Project URL:** [http://www.eclipse.org/jetty](http://www.eclipse.org/jetty)
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty. **Name** : jetty-io. **Version** : 9.3.28.v20191105.
- * **Project URL:** [http://www.eclipse.org/jetty](http://www.eclipse.org/jetty)
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty. **Name** : jetty-io. **Version** : 9.4.24.v20191120.
- * **Project URL:** [http://www.eclipse.org/jetty](http://www.eclipse.org/jetty)
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty. **Name** : jetty-jndi. **Version** : 7.6.21.v20160908.
- * **Project URL:** [http://www.eclipse.org/jetty](http://www.eclipse.org/jetty)
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty. **Name** : jetty-jndi. **Version** : 8.1.22.v20160922.
- * **Project URL:** [http://www.eclipse.org/jetty](http://www.eclipse.org/jetty)
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty. **Name** : jetty-jndi. **Version** : 9.2.26.v20180806.
- * **Project URL:** [http://www.eclipse.org/jetty](http://www.eclipse.org/jetty)
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty. **Name** : jetty-jndi. **Version** : 9.3.28.v20191105.
- * **Project URL:** [http://www.eclipse.org/jetty](http://www.eclipse.org/jetty)
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty. **Name** : jetty-jndi. **Version** : 9.4.24.v20191120.
- * **Project URL:** [http://www.eclipse.org/jetty](http://www.eclipse.org/jetty)
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty. **Name** : jetty-jsp. **Version** : 7.6.21.v20160908.
- * **Project URL:** [http://www.eclipse.org/jetty](http://www.eclipse.org/jetty)
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty. **Name** : jetty-jsp. **Version** : 8.1.22.v20160922.
- * **Project URL:** [http://www.eclipse.org/jetty](http://www.eclipse.org/jetty)
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty. **Name** : jetty-jsp. **Version** : 9.2.26.v20180806.
- * **Project URL:** [http://www.eclipse.org/jetty](http://www.eclipse.org/jetty)
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty. **Name** : jetty-plus. **Version** : 7.6.21.v20160908.
- * **Project URL:** [http://www.eclipse.org/jetty](http://www.eclipse.org/jetty)
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty. **Name** : jetty-plus. **Version** : 8.1.22.v20160922.
- * **Project URL:** [http://www.eclipse.org/jetty](http://www.eclipse.org/jetty)
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty. **Name** : jetty-plus. **Version** : 9.2.26.v20180806.
- * **Project URL:** [http://www.eclipse.org/jetty](http://www.eclipse.org/jetty)
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty. **Name** : jetty-plus. **Version** : 9.3.28.v20191105.
- * **Project URL:** [http://www.eclipse.org/jetty](http://www.eclipse.org/jetty)
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty. **Name** : jetty-plus. **Version** : 9.4.24.v20191120.
- * **Project URL:** [http://www.eclipse.org/jetty](http://www.eclipse.org/jetty)
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty. **Name** : jetty-security. **Version** : 7.6.21.v20160908.
- * **Project URL:** [http://www.eclipse.org/jetty](http://www.eclipse.org/jetty)
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty. **Name** : jetty-security. **Version** : 8.1.22.v20160922.
- * **Project URL:** [http://www.eclipse.org/jetty](http://www.eclipse.org/jetty)
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty. **Name** : jetty-security. **Version** : 9.2.26.v20180806.
- * **Project URL:** [http://www.eclipse.org/jetty](http://www.eclipse.org/jetty)
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty. **Name** : jetty-security. **Version** : 9.3.28.v20191105.
- * **Project URL:** [http://www.eclipse.org/jetty](http://www.eclipse.org/jetty)
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty. **Name** : jetty-security. **Version** : 9.4.24.v20191120.
- * **Project URL:** [http://www.eclipse.org/jetty](http://www.eclipse.org/jetty)
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty. **Name** : jetty-server. **Version** : 7.6.21.v20160908.
- * **Project URL:** [http://www.eclipse.org/jetty](http://www.eclipse.org/jetty)
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty. **Name** : jetty-server. **Version** : 8.1.22.v20160922.
- * **Project URL:** [http://www.eclipse.org/jetty](http://www.eclipse.org/jetty)
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty. **Name** : jetty-server. **Version** : 9.2.26.v20180806.
- * **Project URL:** [http://www.eclipse.org/jetty](http://www.eclipse.org/jetty)
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty. **Name** : jetty-server. **Version** : 9.3.28.v20191105.
- * **Project URL:** [http://www.eclipse.org/jetty](http://www.eclipse.org/jetty)
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty. **Name** : jetty-server. **Version** : 9.4.24.v20191120.
- * **Project URL:** [http://www.eclipse.org/jetty](http://www.eclipse.org/jetty)
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty. **Name** : jetty-servlet. **Version** : 7.6.21.v20160908.
- * **Project URL:** [http://www.eclipse.org/jetty](http://www.eclipse.org/jetty)
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty. **Name** : jetty-servlet. **Version** : 8.1.22.v20160922.
- * **Project URL:** [http://www.eclipse.org/jetty](http://www.eclipse.org/jetty)
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty. **Name** : jetty-servlet. **Version** : 9.2.26.v20180806.
- * **Project URL:** [http://www.eclipse.org/jetty](http://www.eclipse.org/jetty)
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty. **Name** : jetty-servlet. **Version** : 9.3.28.v20191105.
- * **Project URL:** [http://www.eclipse.org/jetty](http://www.eclipse.org/jetty)
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty. **Name** : jetty-servlet. **Version** : 9.4.24.v20191120.
- * **Project URL:** [http://www.eclipse.org/jetty](http://www.eclipse.org/jetty)
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty. **Name** : jetty-util. **Version** : 7.6.21.v20160908.
- * **Project URL:** [http://www.eclipse.org/jetty](http://www.eclipse.org/jetty)
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty. **Name** : jetty-util. **Version** : 8.1.22.v20160922.
- * **Project URL:** [http://www.eclipse.org/jetty](http://www.eclipse.org/jetty)
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty. **Name** : jetty-util. **Version** : 9.2.26.v20180806.
- * **Project URL:** [http://www.eclipse.org/jetty](http://www.eclipse.org/jetty)
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty. **Name** : jetty-util. **Version** : 9.3.28.v20191105.
- * **Project URL:** [http://www.eclipse.org/jetty](http://www.eclipse.org/jetty)
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty. **Name** : jetty-util. **Version** : 9.4.24.v20191120.
- * **Project URL:** [http://www.eclipse.org/jetty](http://www.eclipse.org/jetty)
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty. **Name** : jetty-webapp. **Version** : 7.6.21.v20160908.
- * **Project URL:** [http://www.eclipse.org/jetty](http://www.eclipse.org/jetty)
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty. **Name** : jetty-webapp. **Version** : 8.1.22.v20160922.
- * **Project URL:** [http://www.eclipse.org/jetty](http://www.eclipse.org/jetty)
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty. **Name** : jetty-webapp. **Version** : 9.2.26.v20180806.
- * **Project URL:** [http://www.eclipse.org/jetty](http://www.eclipse.org/jetty)
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty. **Name** : jetty-webapp. **Version** : 9.3.28.v20191105.
- * **Project URL:** [http://www.eclipse.org/jetty](http://www.eclipse.org/jetty)
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty. **Name** : jetty-webapp. **Version** : 9.4.24.v20191120.
- * **Project URL:** [http://www.eclipse.org/jetty](http://www.eclipse.org/jetty)
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty. **Name** : jetty-xml. **Version** : 7.6.21.v20160908.
- * **Project URL:** [http://www.eclipse.org/jetty](http://www.eclipse.org/jetty)
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty. **Name** : jetty-xml. **Version** : 8.1.22.v20160922.
- * **Project URL:** [http://www.eclipse.org/jetty](http://www.eclipse.org/jetty)
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty. **Name** : jetty-xml. **Version** : 9.2.26.v20180806.
- * **Project URL:** [http://www.eclipse.org/jetty](http://www.eclipse.org/jetty)
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty. **Name** : jetty-xml. **Version** : 9.3.28.v20191105.
- * **Project URL:** [http://www.eclipse.org/jetty](http://www.eclipse.org/jetty)
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty. **Name** : jetty-xml. **Version** : 9.4.24.v20191120.
- * **Project URL:** [http://www.eclipse.org/jetty](http://www.eclipse.org/jetty)
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty.orbit. **Name** : com.sun.el. **Version** : 1.0.0.v201105211818.
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty.orbit. **Name** : com.sun.el. **Version** : 2.2.0.v201108011116.
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty.orbit. **Name** : javax.activation. **Version** : 1.1.0.v201105071233.
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty.orbit. **Name** : javax.annotation. **Version** : 1.1.0.v201108011116.
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty.orbit. **Name** : javax.el. **Version** : 2.1.0.v201105211819.
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty.orbit. **Name** : javax.el. **Version** : 2.2.0.v201108011116.
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty.orbit. **Name** : javax.mail.glassfish. **Version** : 1.4.1.v201005082020.
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty.orbit. **Name** : javax.servlet.jsp. **Version** : 2.2.0.v201112011158.
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty.orbit. **Name** : javax.servlet.jsp.jstl. **Version** : 1.2.0.v201105211821.
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty.orbit. **Name** : javax.transaction. **Version** : 1.1.1.v201105210645.
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty.orbit. **Name** : org.apache.jasper.glassfish. **Version** : 2.1.0.v201110031002.
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty.orbit. **Name** : org.apache.jasper.glassfish. **Version** : 2.2.2.v201112011158.
- * **Project URL:** [http://jsp.java.net/](http://jsp.java.net/)
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty.orbit. **Name** : org.apache.taglibs.standard.glassfish. **Version** : 1.2.0.v201112081803.
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty.orbit. **Name** : org.eclipse.jdt.core. **Version** : 3.7.1.
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty.orbit. **Name** : org.eclipse.jdt.core. **Version** : 3.8.2.v20130121.
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty.orbit. **Name** : org.objectweb.asm. **Version** : 3.1.0.v200803061910.
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty.toolchain. **Name** : jetty-schemas. **Version** : 3.1.
- * **Project URL:** [http://www.mortbay.com](http://www.mortbay.com)
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty.websocket. **Name** : javax-websocket-client-impl. **Version** : 9.2.26.v20180806.
- * **Project URL:** [http://www.eclipse.org/jetty](http://www.eclipse.org/jetty)
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty.websocket. **Name** : javax-websocket-client-impl. **Version** : 9.3.28.v20191105.
- * **Project URL:** [http://www.eclipse.org/jetty](http://www.eclipse.org/jetty)
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty.websocket. **Name** : javax-websocket-client-impl. **Version** : 9.4.24.v20191120.
- * **Project URL:** [http://www.eclipse.org/jetty](http://www.eclipse.org/jetty)
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty.websocket. **Name** : javax-websocket-server-impl. **Version** : 9.2.26.v20180806.
- * **Project URL:** [http://www.eclipse.org/jetty](http://www.eclipse.org/jetty)
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty.websocket. **Name** : javax-websocket-server-impl. **Version** : 9.3.28.v20191105.
- * **Project URL:** [http://www.eclipse.org/jetty](http://www.eclipse.org/jetty)
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty.websocket. **Name** : javax-websocket-server-impl. **Version** : 9.4.24.v20191120.
- * **Project URL:** [http://www.eclipse.org/jetty](http://www.eclipse.org/jetty)
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty.websocket. **Name** : websocket-api. **Version** : 9.2.26.v20180806.
- * **Project URL:** [http://www.eclipse.org/jetty](http://www.eclipse.org/jetty)
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty.websocket. **Name** : websocket-api. **Version** : 9.3.28.v20191105.
- * **Project URL:** [http://www.eclipse.org/jetty](http://www.eclipse.org/jetty)
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty.websocket. **Name** : websocket-api. **Version** : 9.4.24.v20191120.
- * **Project URL:** [http://www.eclipse.org/jetty](http://www.eclipse.org/jetty)
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty.websocket. **Name** : websocket-client. **Version** : 9.2.26.v20180806.
- * **Project URL:** [http://www.eclipse.org/jetty](http://www.eclipse.org/jetty)
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty.websocket. **Name** : websocket-client. **Version** : 9.3.28.v20191105.
- * **Project URL:** [http://www.eclipse.org/jetty](http://www.eclipse.org/jetty)
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty.websocket. **Name** : websocket-client. **Version** : 9.4.24.v20191120.
- * **Project URL:** [http://www.eclipse.org/jetty](http://www.eclipse.org/jetty)
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty.websocket. **Name** : websocket-common. **Version** : 9.2.26.v20180806.
- * **Project URL:** [http://www.eclipse.org/jetty](http://www.eclipse.org/jetty)
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty.websocket. **Name** : websocket-common. **Version** : 9.3.28.v20191105.
- * **Project URL:** [http://www.eclipse.org/jetty](http://www.eclipse.org/jetty)
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty.websocket. **Name** : websocket-common. **Version** : 9.4.24.v20191120.
- * **Project URL:** [http://www.eclipse.org/jetty](http://www.eclipse.org/jetty)
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty.websocket. **Name** : websocket-server. **Version** : 9.2.26.v20180806.
- * **Project URL:** [http://www.eclipse.org/jetty](http://www.eclipse.org/jetty)
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty.websocket. **Name** : websocket-server. **Version** : 9.3.28.v20191105.
- * **Project URL:** [http://www.eclipse.org/jetty](http://www.eclipse.org/jetty)
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty.websocket. **Name** : websocket-server. **Version** : 9.4.24.v20191120.
- * **Project URL:** [http://www.eclipse.org/jetty](http://www.eclipse.org/jetty)
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty.websocket. **Name** : websocket-servlet. **Version** : 9.2.26.v20180806.
- * **Project URL:** [http://www.eclipse.org/jetty](http://www.eclipse.org/jetty)
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty.websocket. **Name** : websocket-servlet. **Version** : 9.3.28.v20191105.
- * **Project URL:** [http://www.eclipse.org/jetty](http://www.eclipse.org/jetty)
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jetty.websocket. **Name** : websocket-servlet. **Version** : 9.4.24.v20191120.
- * **Project URL:** [http://www.eclipse.org/jetty](http://www.eclipse.org/jetty)
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.eclipse.jgit. **Name** : org.eclipse.jgit. **Version** : 4.4.1.201607150455-r.
- * **License:** Eclipse Distribution License (New BSD License)
-
-1. **Group** : org.freemarker. **Name** : freemarker. **Version** : 2.3.31.
- * **Project URL:** [https://freemarker.apache.org/](https://freemarker.apache.org/)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.glassfish. **Name** : javax.el. **Version** : 3.0.0.
- * **Project URL:** [http://el-spec.java.net](http://el-spec.java.net)
- * **License:** [CDDL + GPLv2 with classpath exception](https://glassfish.dev.java.net/nonav/public/CDDL+GPL.html)
-
-1. **Group** : org.glassfish.web. **Name** : javax.servlet.jsp. **Version** : 2.3.2.
- * **Project URL:** [http://jsp.java.net](http://jsp.java.net)
- * **License:** [CDDL + GPLv2 with classpath exception](http://glassfish.dev.java.net/nonav/public/CDDL+GPL.html)
-
-1. **Group** : org.glassfish.web. **Name** : javax.servlet.jsp.jstl. **Version** : 1.2.2.
- * **Project URL:** [http://jstl.java.net](http://jstl.java.net)
- * **License:** [CDDL + GPLv2 with classpath exception](http://glassfish.dev.java.net/nonav/public/CDDL+GPL.html)
-
-1. **Group** : org.gretty. **Name** : gretty-common. **Version** : 3.0.6.
- * **Project URL:** [https://github.com/gretty-gradle-plugin/gretty](https://github.com/gretty-gradle-plugin/gretty)
- * **License:** [MIT](https://raw.github.com/gretty-gradle-plugin/gretty/master/LICENSE)
-
-1. **Group** : org.gretty. **Name** : gretty-core. **Version** : 3.0.6.
- * **Project URL:** [https://github.com/gretty-gradle-plugin/gretty](https://github.com/gretty-gradle-plugin/gretty)
- * **License:** [MIT](https://raw.github.com/gretty-gradle-plugin/gretty/master/LICENSE)
-
-1. **Group** : org.gretty. **Name** : gretty-runner. **Version** : 3.0.6.
- * **Project URL:** [https://github.com/gretty-gradle-plugin/gretty](https://github.com/gretty-gradle-plugin/gretty)
- * **License:** [MIT](https://raw.github.com/gretty-gradle-plugin/gretty/master/LICENSE)
-
-1. **Group** : org.gretty. **Name** : gretty-runner-jetty. **Version** : 3.0.6.
- * **Project URL:** [https://github.com/gretty-gradle-plugin/gretty](https://github.com/gretty-gradle-plugin/gretty)
- * **License:** [MIT](https://raw.github.com/gretty-gradle-plugin/gretty/master/LICENSE)
-
-1. **Group** : org.gretty. **Name** : gretty-runner-jetty7. **Version** : 3.0.6.
- * **Project URL:** [https://github.com/gretty-gradle-plugin/gretty](https://github.com/gretty-gradle-plugin/gretty)
- * **License:** [MIT](https://raw.github.com/gretty-gradle-plugin/gretty/master/LICENSE)
-
-1. **Group** : org.gretty. **Name** : gretty-runner-jetty8. **Version** : 3.0.6.
- * **Project URL:** [https://github.com/gretty-gradle-plugin/gretty](https://github.com/gretty-gradle-plugin/gretty)
- * **License:** [MIT](https://raw.github.com/gretty-gradle-plugin/gretty/master/LICENSE)
-
-1. **Group** : org.gretty. **Name** : gretty-runner-jetty9. **Version** : 3.0.6.
- * **Project URL:** [https://github.com/gretty-gradle-plugin/gretty](https://github.com/gretty-gradle-plugin/gretty)
- * **License:** [MIT](https://raw.github.com/gretty-gradle-plugin/gretty/master/LICENSE)
-
-1. **Group** : org.gretty. **Name** : gretty-runner-jetty93. **Version** : 3.0.6.
- * **Project URL:** [https://github.com/gretty-gradle-plugin/gretty](https://github.com/gretty-gradle-plugin/gretty)
- * **License:** [MIT](https://raw.github.com/gretty-gradle-plugin/gretty/master/LICENSE)
-
-1. **Group** : org.gretty. **Name** : gretty-runner-jetty94. **Version** : 3.0.6.
- * **Project URL:** [https://github.com/gretty-gradle-plugin/gretty](https://github.com/gretty-gradle-plugin/gretty)
- * **License:** [MIT](https://raw.github.com/gretty-gradle-plugin/gretty/master/LICENSE)
-
-1. **Group** : org.gretty. **Name** : gretty-runner-tomcat. **Version** : 3.0.6.
- * **Project URL:** [https://github.com/gretty-gradle-plugin/gretty](https://github.com/gretty-gradle-plugin/gretty)
- * **License:** [MIT](https://raw.github.com/gretty-gradle-plugin/gretty/master/LICENSE)
-
-1. **Group** : org.gretty. **Name** : gretty-runner-tomcat85. **Version** : 3.0.6.
- * **Project URL:** [https://github.com/gretty-gradle-plugin/gretty](https://github.com/gretty-gradle-plugin/gretty)
- * **License:** [MIT](https://raw.github.com/gretty-gradle-plugin/gretty/master/LICENSE)
-
-1. **Group** : org.gretty. **Name** : gretty-runner-tomcat8plus. **Version** : 3.0.6.
- * **Project URL:** [https://github.com/gretty-gradle-plugin/gretty](https://github.com/gretty-gradle-plugin/gretty)
- * **License:** [MIT](https://raw.github.com/gretty-gradle-plugin/gretty/master/LICENSE)
-
-1. **Group** : org.gretty. **Name** : gretty-runner-tomcat9. **Version** : 3.0.6.
- * **Project URL:** [https://github.com/gretty-gradle-plugin/gretty](https://github.com/gretty-gradle-plugin/gretty)
- * **License:** [MIT](https://raw.github.com/gretty-gradle-plugin/gretty/master/LICENSE)
-
-1. **Group** : org.gretty. **Name** : gretty-starter. **Version** : 3.0.6.
- * **Project URL:** [https://github.com/gretty-gradle-plugin/gretty](https://github.com/gretty-gradle-plugin/gretty)
- * **License:** [MIT](https://raw.github.com/gretty-gradle-plugin/gretty/master/LICENSE)
-
-1. **Group** : org.hamcrest. **Name** : hamcrest-core. **Version** : 1.3.
- * **License:** [New BSD License](http://www.opensource.org/licenses/bsd-license.php)
-
-1. **Group** : org.jacoco. **Name** : org.jacoco.agent. **Version** : 0.8.7.
- * **License:** [Eclipse Public License 2.0](https://www.eclipse.org/legal/epl-2.0/)
-
-1. **Group** : org.jacoco. **Name** : org.jacoco.ant. **Version** : 0.8.7.
- * **License:** [Eclipse Public License 2.0](https://www.eclipse.org/legal/epl-2.0/)
-
-1. **Group** : org.jacoco. **Name** : org.jacoco.core. **Version** : 0.8.7.
- * **License:** [Eclipse Public License 2.0](https://www.eclipse.org/legal/epl-2.0/)
-
-1. **Group** : org.jacoco. **Name** : org.jacoco.report. **Version** : 0.8.7.
- * **License:** [Eclipse Public License 2.0](https://www.eclipse.org/legal/epl-2.0/)
-
-1. **Group** : org.javassist. **Name** : javassist. **Version** : 3.28.0-GA.
- * **Project URL:** [http://www.javassist.org/](http://www.javassist.org/)
- * **License:** [Apache License 2.0](http://www.apache.org/licenses/)
- * **License:** [LGPL 2.1](http://www.gnu.org/licenses/lgpl-2.1.html)
- * **License:** [MPL 1.1](http://www.mozilla.org/MPL/MPL-1.1.html)
-
-1. **Group** : org.jetbrains. **Name** : annotations. **Version** : 13.0.
- * **Project URL:** [http://www.jetbrains.org](http://www.jetbrains.org)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains. **Name** : markdown. **Version** : 0.2.4.**No license information found**
-1. **Group** : org.jetbrains. **Name** : markdown-jvm. **Version** : 0.2.4.
- * **Project URL:** [https://github.com/JetBrains/markdown](https://github.com/JetBrains/markdown)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.dokka. **Name** : dokka-analysis. **Version** : 1.6.20.
- * **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.dokka. **Name** : dokka-base. **Version** : 1.6.20.
- * **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.dokka. **Name** : dokka-core. **Version** : 1.6.20.
- * **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.dokka. **Name** : gfm-plugin. **Version** : 1.6.20.
- * **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.dokka. **Name** : javadoc-plugin. **Version** : 1.6.20.
- * **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.dokka. **Name** : jekyll-plugin. **Version** : 1.6.20.
- * **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.dokka. **Name** : kotlin-analysis-compiler. **Version** : 1.6.20.
- * **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.dokka. **Name** : kotlin-analysis-intellij. **Version** : 1.6.20.
- * **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.dokka. **Name** : kotlin-as-java-plugin. **Version** : 1.6.20.
- * **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.intellij.deps. **Name** : trove4j. **Version** : 1.0.20200330.
- * **Project URL:** [https://github.com/JetBrains/intellij-deps-trove4j](https://github.com/JetBrains/intellij-deps-trove4j)
- * **License:** [GNU LESSER GENERAL PUBLIC LICENSE 2.1](https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-compiler-embeddable. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-daemon-embeddable. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-klib-commonizer-embeddable. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-reflect. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-script-runtime. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-scripting-common. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-scripting-compiler-embeddable. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-scripting-compiler-impl-embeddable. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-scripting-jvm. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-common. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk7. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk8. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-bom. **Version** : 1.6.0.**No license information found**
-1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-core. **Version** : 1.6.0.**No license information found**
-1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-core-jvm. **Version** : 1.6.0.
- * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)
- * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-html-jvm. **Version** : 0.7.3.
- * **Project URL:** [https://github.com/Kotlin/kotlinx.html](https://github.com/Kotlin/kotlinx.html)
- * **License:** [The Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jsoup. **Name** : jsoup. **Version** : 1.13.1.
- * **Project URL:** [https://jsoup.org/](https://jsoup.org/)
- * **License:** [The MIT License](https://jsoup.org/license)
-
-1. **Group** : org.junit. **Name** : junit-bom. **Version** : 5.8.2.**No license information found**
-1. **Group** : org.junit.jupiter. **Name** : junit-jupiter-api. **Version** : 5.8.2.
- * **Project URL:** [https://junit.org/junit5/](https://junit.org/junit5/)
- * **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
-
-1. **Group** : org.junit.jupiter. **Name** : junit-jupiter-engine. **Version** : 5.8.2.
- * **Project URL:** [https://junit.org/junit5/](https://junit.org/junit5/)
- * **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
-
-1. **Group** : org.junit.jupiter. **Name** : junit-jupiter-params. **Version** : 5.8.2.
- * **Project URL:** [https://junit.org/junit5/](https://junit.org/junit5/)
- * **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
-
-1. **Group** : org.junit.platform. **Name** : junit-platform-commons. **Version** : 1.8.2.
- * **Project URL:** [https://junit.org/junit5/](https://junit.org/junit5/)
- * **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
-
-1. **Group** : org.junit.platform. **Name** : junit-platform-engine. **Version** : 1.8.2.
- * **Project URL:** [https://junit.org/junit5/](https://junit.org/junit5/)
- * **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
-
-1. **Group** : org.mortbay.jasper. **Name** : apache-el. **Version** : 8.0.33.
- * **Project URL:** [http://webtide.com](http://webtide.com)
- * **License:** [Apache License Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.mortbay.jasper. **Name** : apache-el. **Version** : 8.5.40.
- * **License:** [Apache License Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
-
-1. **Group** : org.mortbay.jasper. **Name** : apache-jsp. **Version** : 8.0.33.
- * **Project URL:** [http://webtide.com](http://webtide.com)
- * **License:** [Apache License Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Apache Software License - Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
- * **License:** [Eclipse Public License - Version 1.0](http://www.eclipse.org/org/documents/epl-v10.php)
-
-1. **Group** : org.mortbay.jasper. **Name** : apache-jsp. **Version** : 8.5.40.
- * **License:** [Apache License Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
-
-1. **Group** : org.opentest4j. **Name** : opentest4j. **Version** : 1.2.0.
- * **Project URL:** [https://github.com/ota4j-team/opentest4j](https://github.com/ota4j-team/opentest4j)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.ow2.asm. **Name** : asm. **Version** : 9.1.
- * **Project URL:** [http://asm.ow2.io/](http://asm.ow2.io/)
- * **License:** [BSD-3-Clause](https://asm.ow2.io/license.html)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.ow2.asm. **Name** : asm. **Version** : 9.2.
- * **Project URL:** [http://asm.ow2.io/](http://asm.ow2.io/)
- * **License:** [BSD-3-Clause](https://asm.ow2.io/license.html)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.ow2.asm. **Name** : asm-analysis. **Version** : 9.1.
- * **Project URL:** [http://asm.ow2.io/](http://asm.ow2.io/)
- * **License:** [BSD-3-Clause](https://asm.ow2.io/license.html)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.ow2.asm. **Name** : asm-analysis. **Version** : 9.2.
- * **Project URL:** [http://asm.ow2.io/](http://asm.ow2.io/)
- * **License:** [BSD-3-Clause](https://asm.ow2.io/license.html)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.ow2.asm. **Name** : asm-commons. **Version** : 9.1.
- * **Project URL:** [http://asm.ow2.io/](http://asm.ow2.io/)
- * **License:** [BSD-3-Clause](https://asm.ow2.io/license.html)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.ow2.asm. **Name** : asm-commons. **Version** : 9.2.
- * **Project URL:** [http://asm.ow2.io/](http://asm.ow2.io/)
- * **License:** [BSD-3-Clause](https://asm.ow2.io/license.html)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.ow2.asm. **Name** : asm-tree. **Version** : 9.1.
- * **Project URL:** [http://asm.ow2.io/](http://asm.ow2.io/)
- * **License:** [BSD-3-Clause](https://asm.ow2.io/license.html)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.ow2.asm. **Name** : asm-tree. **Version** : 9.2.
- * **Project URL:** [http://asm.ow2.io/](http://asm.ow2.io/)
- * **License:** [BSD-3-Clause](https://asm.ow2.io/license.html)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.pcollections. **Name** : pcollections. **Version** : 2.1.2.
- * **Project URL:** [http://pcollections.org](http://pcollections.org)
- * **License:** [The MIT License](http://www.opensource.org/licenses/mit-license.php)
-
-1. **Group** : org.reflections. **Name** : reflections. **Version** : 0.10.2.
- * **Project URL:** [http://github.com/ronmamo/reflections](http://github.com/ronmamo/reflections)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
- * **License:** [WTFPL](http://www.wtfpl.net/)
-
-1. **Group** : org.slf4j. **Name** : log4j-over-slf4j. **Version** : 1.7.32.
- * **Project URL:** [http://www.slf4j.org](http://www.slf4j.org)
- * **License:** [Apache Software Licenses](http://www.apache.org/licenses/LICENSE-2.0.txt)
- * **License:** [MIT License](http://www.opensource.org/licenses/mit-license.php)
-
-1. **Group** : org.slf4j. **Name** : slf4j-api. **Version** : 1.7.30.
- * **Project URL:** [http://www.slf4j.org](http://www.slf4j.org)
- * **License:** [MIT License](http://www.opensource.org/licenses/mit-license.php)
-
-1. **Group** : org.springframework. **Name** : spring-aop. **Version** : 5.0.6.RELEASE.
- * **Project URL:** [https://github.com/spring-projects/spring-framework](https://github.com/spring-projects/spring-framework)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
-
-1. **Group** : org.springframework. **Name** : spring-beans. **Version** : 5.0.6.RELEASE.
- * **Project URL:** [https://github.com/spring-projects/spring-framework](https://github.com/spring-projects/spring-framework)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
-
-1. **Group** : org.springframework. **Name** : spring-context. **Version** : 5.0.6.RELEASE.
- * **Project URL:** [https://github.com/spring-projects/spring-framework](https://github.com/spring-projects/spring-framework)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
-
-1. **Group** : org.springframework. **Name** : spring-core. **Version** : 5.0.6.RELEASE.
- * **Project URL:** [https://github.com/spring-projects/spring-framework](https://github.com/spring-projects/spring-framework)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
-
-1. **Group** : org.springframework. **Name** : spring-expression. **Version** : 5.0.6.RELEASE.
- * **Project URL:** [https://github.com/spring-projects/spring-framework](https://github.com/spring-projects/spring-framework)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
-
-1. **Group** : org.springframework. **Name** : spring-jcl. **Version** : 5.0.6.RELEASE.
- * **Project URL:** [https://github.com/spring-projects/spring-framework](https://github.com/spring-projects/spring-framework)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
-
-1. **Group** : org.springframework. **Name** : springloaded. **Version** : 1.2.8.RELEASE.
- * **Project URL:** [https://github.com/spring-projects/spring-loaded](https://github.com/spring-projects/spring-loaded)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.springframework.boot. **Name** : spring-boot. **Version** : 2.0.2.RELEASE.
- * **Project URL:** [https://projects.spring.io/spring-boot/#/spring-boot-parent/spring-boot](https://projects.spring.io/spring-boot/#/spring-boot-parent/spring-boot)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
-
-1. **Group** : org.springframework.boot. **Name** : spring-boot-autoconfigure. **Version** : 2.0.2.RELEASE.
- * **Project URL:** [https://projects.spring.io/spring-boot/#/spring-boot-parent/spring-boot-autoconfigure](https://projects.spring.io/spring-boot/#/spring-boot-parent/spring-boot-autoconfigure)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
-
-1. **Group** : org.springframework.boot. **Name** : spring-boot-devtools. **Version** : 2.0.2.RELEASE.
- * **Project URL:** [https://projects.spring.io/spring-boot/#/spring-boot-parent/spring-boot-devtools](https://projects.spring.io/spring-boot/#/spring-boot-parent/spring-boot-devtools)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
-
-1. **Group** : org.threeten. **Name** : threetenbp. **Version** : 1.5.1.
- * **Project URL:** [https://www.threeten.org/threetenbp](https://www.threeten.org/threetenbp)
- * **License:** [BSD 3-clause](https://raw.githubusercontent.com/ThreeTen/threetenbp/master/LICENSE.txt)
-
-
-The dependencies distributed under several licenses, are used according their commercial-use-friendly license.
-
-This report was generated on **Wed May 04 18:13:30 EEST 2022** using [Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under [Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE).
-
-
-
-
-# Dependencies of `io.spine:spine-testutil-web:2.0.0-SNAPSHOT.74`
-
-## Runtime
-1. **Group** : com.google.android. **Name** : annotations. **Version** : 4.1.1.4.
- * **Project URL:** [http://source.android.com/](http://source.android.com/)
- * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0)
-
-1. **Group** : com.google.api.grpc. **Name** : proto-google-common-protos. **Version** : 2.7.0.
- * **Project URL:** [https://github.com/googleapis/java-iam/proto-google-common-protos](https://github.com/googleapis/java-iam/proto-google-common-protos)
- * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.auto.value. **Name** : auto-value-annotations. **Version** : 1.9.
- * **Project URL:** [https://github.com/google/auto/tree/master/value](https://github.com/google/auto/tree/master/value)
- * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.code.findbugs. **Name** : jsr305. **Version** : 3.0.2.
- * **Project URL:** [http://findbugs.sourceforge.net/](http://findbugs.sourceforge.net/)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.code.gson. **Name** : gson. **Version** : 2.9.0.
- * **Project URL:** [https://github.com/google/gson/gson](https://github.com/google/gson/gson)
- * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.errorprone. **Name** : error_prone_annotations. **Version** : 2.10.0.
- * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.errorprone. **Name** : error_prone_type_annotations. **Version** : 2.10.0.
- * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.flogger. **Name** : flogger. **Version** : 0.7.4.
- * **Project URL:** [https://github.com/google/flogger](https://github.com/google/flogger)
- * **License:** [Apache 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.flogger. **Name** : flogger-system-backend. **Version** : 0.7.4.
- * **Project URL:** [https://github.com/google/flogger](https://github.com/google/flogger)
- * **License:** [Apache 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.guava. **Name** : failureaccess. **Version** : 1.0.1.
- * **Project URL:** [https://github.com/google/guava/](https://github.com/google/guava/)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.guava. **Name** : guava. **Version** : 31.1-jre.
- * **Project URL:** [https://github.com/google/guava](https://github.com/google/guava)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.guava. **Name** : guava-testlib. **Version** : 31.1-jre.
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.guava. **Name** : listenablefuture. **Version** : 9999.0-empty-to-avoid-conflict-with-guava.
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.http-client. **Name** : google-http-client. **Version** : 1.41.5.
- * **Project URL:** [https://www.google.com/](https://www.google.com/)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.http-client. **Name** : google-http-client-apache. **Version** : 2.1.2.
- * **Project URL:** [http://www.google.com/](http://www.google.com/)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.j2objc. **Name** : j2objc-annotations. **Version** : 1.3.
- * **Project URL:** [https://github.com/google/j2objc/](https://github.com/google/j2objc/)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.protobuf. **Name** : protobuf-java. **Version** : 3.19.4.
- * **Project URL:** [https://developers.google.com/protocol-buffers/](https://developers.google.com/protocol-buffers/)
- * **License:** [3-Clause BSD License](https://opensource.org/licenses/BSD-3-Clause)
-
-1. **Group** : com.google.protobuf. **Name** : protobuf-java-util. **Version** : 3.19.4.
- * **Project URL:** [https://developers.google.com/protocol-buffers/](https://developers.google.com/protocol-buffers/)
- * **License:** [3-Clause BSD License](https://opensource.org/licenses/BSD-3-Clause)
-
-1. **Group** : com.google.protobuf. **Name** : protobuf-kotlin. **Version** : 3.19.4.
- * **License:** [3-Clause BSD License](https://opensource.org/licenses/BSD-3-Clause)
-
-1. **Group** : com.google.truth. **Name** : truth. **Version** : 1.1.3.
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.truth.extensions. **Name** : truth-java8-extension. **Version** : 1.1.3.
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.truth.extensions. **Name** : truth-liteproto-extension. **Version** : 1.1.3.
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.truth.extensions. **Name** : truth-proto-extension. **Version** : 1.1.3.
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : commons-codec. **Name** : commons-codec. **Version** : 1.15.
- * **Project URL:** [https://commons.apache.org/proper/commons-codec/](https://commons.apache.org/proper/commons-codec/)
- * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : commons-logging. **Name** : commons-logging. **Version** : 1.2.
- * **Project URL:** [http://commons.apache.org/proper/commons-logging/](http://commons.apache.org/proper/commons-logging/)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : io.grpc. **Name** : grpc-api. **Version** : 1.38.0.
- * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
- * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
-
-1. **Group** : io.grpc. **Name** : grpc-context. **Version** : 1.45.1.
- * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
- * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
-
-1. **Group** : io.grpc. **Name** : grpc-core. **Version** : 1.38.0.
- * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
- * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
-
-1. **Group** : io.grpc. **Name** : grpc-protobuf. **Version** : 1.38.0.
- * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
- * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
-
-1. **Group** : io.grpc. **Name** : grpc-protobuf-lite. **Version** : 1.38.0.
- * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
- * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
-
-1. **Group** : io.grpc. **Name** : grpc-stub. **Version** : 1.38.0.
- * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
- * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
-
-1. **Group** : io.opencensus. **Name** : opencensus-api. **Version** : 0.21.0.
- * **Project URL:** [https://github.com/census-instrumentation/opencensus-java](https://github.com/census-instrumentation/opencensus-java)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : io.opencensus. **Name** : opencensus-contrib-http-util. **Version** : 0.18.0.
- * **Project URL:** [https://github.com/census-instrumentation/opencensus-java](https://github.com/census-instrumentation/opencensus-java)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : io.perfmark. **Name** : perfmark-api. **Version** : 0.23.0.
- * **Project URL:** [https://github.com/perfmark/perfmark](https://github.com/perfmark/perfmark)
- * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
-
-1. **Group** : javax.annotation. **Name** : javax.annotation-api. **Version** : 1.3.2.
- * **Project URL:** [http://jcp.org/en/jsr/detail?id=250](http://jcp.org/en/jsr/detail?id=250)
- * **License:** [CDDL + GPLv2 with classpath exception](https://github.com/javaee/javax.annotation/blob/master/LICENSE)
-
-1. **Group** : javax.servlet. **Name** : javax.servlet-api. **Version** : 3.1.0.
- * **Project URL:** [http://servlet-spec.java.net](http://servlet-spec.java.net)
- * **License:** [CDDL + GPLv2 with classpath exception](https://glassfish.dev.java.net/nonav/public/CDDL+GPL.html)
-
-1. **Group** : junit. **Name** : junit. **Version** : 4.13.1.
- * **Project URL:** [http://junit.org](http://junit.org)
- * **License:** [Eclipse Public License 1.0](http://www.eclipse.org/legal/epl-v10.html)
-
-1. **Group** : org.apache.httpcomponents. **Name** : httpclient. **Version** : 4.5.13.
- * **Project URL:** [http://hc.apache.org/httpcomponents-client](http://hc.apache.org/httpcomponents-client)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.apache.httpcomponents. **Name** : httpcore. **Version** : 4.4.14.
- * **Project URL:** [http://hc.apache.org/httpcomponents-core-ga](http://hc.apache.org/httpcomponents-core-ga)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.apiguardian. **Name** : apiguardian-api. **Version** : 1.1.2.
- * **Project URL:** [https://github.com/apiguardian-team/apiguardian](https://github.com/apiguardian-team/apiguardian)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.checkerframework. **Name** : checker-compat-qual. **Version** : 2.5.5.
- * **Project URL:** [https://checkerframework.org](https://checkerframework.org)
- * **License:** [GNU General Public License, version 2 (GPL2), with the classpath exception](http://www.gnu.org/software/classpath/license.html)
- * **License:** [The MIT License](http://opensource.org/licenses/MIT)
-
-1. **Group** : org.checkerframework. **Name** : checker-qual. **Version** : 3.21.3.
- * **Project URL:** [https://checkerframework.org](https://checkerframework.org)
- * **License:** [The MIT License](http://opensource.org/licenses/MIT)
-
-1. **Group** : org.codehaus.mojo. **Name** : animal-sniffer-annotations. **Version** : 1.21.
- * **License:** [MIT license](http://www.opensource.org/licenses/mit-license.php)
- * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.hamcrest. **Name** : hamcrest-core. **Version** : 1.3.
- * **License:** [New BSD License](http://www.opensource.org/licenses/bsd-license.php)
-
-1. **Group** : org.jetbrains. **Name** : annotations. **Version** : 13.0.
- * **Project URL:** [http://www.jetbrains.org](http://www.jetbrains.org)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-reflect. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-common. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk7. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk8. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.junit. **Name** : junit-bom. **Version** : 5.8.2.**No license information found**
-1. **Group** : org.junit.jupiter. **Name** : junit-jupiter-api. **Version** : 5.8.2.
- * **Project URL:** [https://junit.org/junit5/](https://junit.org/junit5/)
- * **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
-
-1. **Group** : org.junit.jupiter. **Name** : junit-jupiter-params. **Version** : 5.8.2.
- * **Project URL:** [https://junit.org/junit5/](https://junit.org/junit5/)
- * **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
-
-1. **Group** : org.junit.platform. **Name** : junit-platform-commons. **Version** : 1.8.2.
- * **Project URL:** [https://junit.org/junit5/](https://junit.org/junit5/)
- * **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
-
-1. **Group** : org.opentest4j. **Name** : opentest4j. **Version** : 1.2.0.
- * **Project URL:** [https://github.com/ota4j-team/opentest4j](https://github.com/ota4j-team/opentest4j)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.ow2.asm. **Name** : asm. **Version** : 9.1.
- * **Project URL:** [http://asm.ow2.io/](http://asm.ow2.io/)
- * **License:** [BSD-3-Clause](https://asm.ow2.io/license.html)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-## Compile, tests, and tooling
-1. **Group** : com.beust. **Name** : jcommander. **Version** : 1.48.
- * **Project URL:** [http://beust.com/jcommander](http://beust.com/jcommander)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.fasterxml.jackson. **Name** : jackson-bom. **Version** : 2.13.2.**No license information found**
-1. **Group** : com.fasterxml.jackson.core. **Name** : jackson-annotations. **Version** : 2.13.2.
- * **Project URL:** [http://github.com/FasterXML/jackson](http://github.com/FasterXML/jackson)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.fasterxml.jackson.core. **Name** : jackson-core. **Version** : 2.13.2.
- * **Project URL:** [https://github.com/FasterXML/jackson-core](https://github.com/FasterXML/jackson-core)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.fasterxml.jackson.core. **Name** : jackson-databind. **Version** : 2.13.2.2.
- * **Project URL:** [http://github.com/FasterXML/jackson](http://github.com/FasterXML/jackson)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.fasterxml.jackson.dataformat. **Name** : jackson-dataformat-xml. **Version** : 2.13.2.
- * **Project URL:** [https://github.com/FasterXML/jackson-dataformat-xml](https://github.com/FasterXML/jackson-dataformat-xml)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.fasterxml.jackson.module. **Name** : jackson-module-kotlin. **Version** : 2.13.2.
- * **Project URL:** [https://github.com/FasterXML/jackson-module-kotlin](https://github.com/FasterXML/jackson-module-kotlin)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.fasterxml.woodstox. **Name** : woodstox-core. **Version** : 6.2.7.
- * **Project URL:** [https://github.com/FasterXML/woodstox](https://github.com/FasterXML/woodstox)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.github.ben-manes.caffeine. **Name** : caffeine. **Version** : 2.8.8.
- * **Project URL:** [https://github.com/ben-manes/caffeine](https://github.com/ben-manes/caffeine)
- * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.github.kevinstern. **Name** : software-and-algorithms. **Version** : 1.0.
- * **Project URL:** [https://www.github.com/KevinStern/software-and-algorithms](https://www.github.com/KevinStern/software-and-algorithms)
- * **License:** [MIT License](http://www.opensource.org/licenses/mit-license.php)
-
-1. **Group** : com.google.android. **Name** : annotations. **Version** : 4.1.1.4.
- * **Project URL:** [http://source.android.com/](http://source.android.com/)
- * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0)
-
-1. **Group** : com.google.api.grpc. **Name** : proto-google-common-protos. **Version** : 2.7.0.
- * **Project URL:** [https://github.com/googleapis/java-iam/proto-google-common-protos](https://github.com/googleapis/java-iam/proto-google-common-protos)
- * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.auto. **Name** : auto-common. **Version** : 1.2.1.
- * **Project URL:** [https://github.com/google/auto/tree/master/common](https://github.com/google/auto/tree/master/common)
- * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.auto.service. **Name** : auto-service-annotations. **Version** : 1.0.1.
- * **Project URL:** [https://github.com/google/auto/tree/master/service](https://github.com/google/auto/tree/master/service)
- * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.auto.value. **Name** : auto-value-annotations. **Version** : 1.9.
- * **Project URL:** [https://github.com/google/auto/tree/master/value](https://github.com/google/auto/tree/master/value)
- * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.code.findbugs. **Name** : jFormatString. **Version** : 3.0.0.
- * **Project URL:** [http://findbugs.sourceforge.net/](http://findbugs.sourceforge.net/)
- * **License:** [GNU Lesser Public License](http://www.gnu.org/licenses/lgpl.html)
-
-1. **Group** : com.google.code.findbugs. **Name** : jsr305. **Version** : 3.0.2.
- * **Project URL:** [http://findbugs.sourceforge.net/](http://findbugs.sourceforge.net/)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.code.gson. **Name** : gson. **Version** : 2.9.0.
- * **Project URL:** [https://github.com/google/gson/gson](https://github.com/google/gson/gson)
- * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.errorprone. **Name** : error_prone_annotation. **Version** : 2.10.0.
- * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.errorprone. **Name** : error_prone_annotations. **Version** : 2.10.0.
- * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.errorprone. **Name** : error_prone_check_api. **Version** : 2.10.0.
- * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.errorprone. **Name** : error_prone_core. **Version** : 2.10.0.
- * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.errorprone. **Name** : error_prone_type_annotations. **Version** : 2.10.0.
- * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.flogger. **Name** : flogger. **Version** : 0.7.4.
- * **Project URL:** [https://github.com/google/flogger](https://github.com/google/flogger)
- * **License:** [Apache 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.flogger. **Name** : flogger-system-backend. **Version** : 0.7.4.
- * **Project URL:** [https://github.com/google/flogger](https://github.com/google/flogger)
- * **License:** [Apache 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.guava. **Name** : failureaccess. **Version** : 1.0.1.
- * **Project URL:** [https://github.com/google/guava/](https://github.com/google/guava/)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.guava. **Name** : guava. **Version** : 31.1-jre.
- * **Project URL:** [https://github.com/google/guava](https://github.com/google/guava)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.guava. **Name** : guava-testlib. **Version** : 31.1-jre.
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.guava. **Name** : listenablefuture. **Version** : 9999.0-empty-to-avoid-conflict-with-guava.
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.http-client. **Name** : google-http-client. **Version** : 1.41.5.
- * **Project URL:** [https://www.google.com/](https://www.google.com/)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.http-client. **Name** : google-http-client-apache. **Version** : 2.1.2.
- * **Project URL:** [http://www.google.com/](http://www.google.com/)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.j2objc. **Name** : j2objc-annotations. **Version** : 1.3.
- * **Project URL:** [https://github.com/google/j2objc/](https://github.com/google/j2objc/)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.protobuf. **Name** : protobuf-java. **Version** : 3.19.4.
- * **Project URL:** [https://developers.google.com/protocol-buffers/](https://developers.google.com/protocol-buffers/)
- * **License:** [3-Clause BSD License](https://opensource.org/licenses/BSD-3-Clause)
-
-1. **Group** : com.google.protobuf. **Name** : protobuf-java-util. **Version** : 3.19.4.
- * **Project URL:** [https://developers.google.com/protocol-buffers/](https://developers.google.com/protocol-buffers/)
- * **License:** [3-Clause BSD License](https://opensource.org/licenses/BSD-3-Clause)
-
-1. **Group** : com.google.protobuf. **Name** : protobuf-kotlin. **Version** : 3.19.4.
- * **License:** [3-Clause BSD License](https://opensource.org/licenses/BSD-3-Clause)
-
-1. **Group** : com.google.truth. **Name** : truth. **Version** : 1.1.3.
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.truth.extensions. **Name** : truth-java8-extension. **Version** : 1.1.3.
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.truth.extensions. **Name** : truth-liteproto-extension. **Version** : 1.1.3.
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.truth.extensions. **Name** : truth-proto-extension. **Version** : 1.1.3.
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.puppycrawl.tools. **Name** : checkstyle. **Version** : 10.1.
- * **Project URL:** [https://checkstyle.org/](https://checkstyle.org/)
- * **License:** [LGPL-2.1+](http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt)
-
-1. **Group** : commons-beanutils. **Name** : commons-beanutils. **Version** : 1.9.4.
- * **Project URL:** [https://commons.apache.org/proper/commons-beanutils/](https://commons.apache.org/proper/commons-beanutils/)
- * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : commons-codec. **Name** : commons-codec. **Version** : 1.15.
- * **Project URL:** [https://commons.apache.org/proper/commons-codec/](https://commons.apache.org/proper/commons-codec/)
- * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : commons-collections. **Name** : commons-collections. **Version** : 3.2.2.
- * **Project URL:** [http://commons.apache.org/collections/](http://commons.apache.org/collections/)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : commons-io. **Name** : commons-io. **Version** : 2.6.
- * **Project URL:** [http://commons.apache.org/proper/commons-io/](http://commons.apache.org/proper/commons-io/)
- * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : commons-logging. **Name** : commons-logging. **Version** : 1.2.
- * **Project URL:** [http://commons.apache.org/proper/commons-logging/](http://commons.apache.org/proper/commons-logging/)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : info.picocli. **Name** : picocli. **Version** : 4.6.3.
- * **Project URL:** [http://picocli.info](http://picocli.info)
- * **License:** [The Apache Software License, version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : io.github.java-diff-utils. **Name** : java-diff-utils. **Version** : 4.0.
- * **Project URL:** [https://github.com/java-diff-utils/java-diff-utils](https://github.com/java-diff-utils/java-diff-utils)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : io.grpc. **Name** : grpc-api. **Version** : 1.38.0.
- * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
- * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
-
-1. **Group** : io.grpc. **Name** : grpc-context. **Version** : 1.45.1.
- * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
- * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
-
-1. **Group** : io.grpc. **Name** : grpc-core. **Version** : 1.38.0.
- * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
- * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
-
-1. **Group** : io.grpc. **Name** : grpc-protobuf. **Version** : 1.38.0.
- * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
- * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
-
-1. **Group** : io.grpc. **Name** : grpc-protobuf-lite. **Version** : 1.38.0.
- * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
- * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
-
-1. **Group** : io.grpc. **Name** : grpc-stub. **Version** : 1.38.0.
- * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
- * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
-
-1. **Group** : io.opencensus. **Name** : opencensus-api. **Version** : 0.21.0.
- * **Project URL:** [https://github.com/census-instrumentation/opencensus-java](https://github.com/census-instrumentation/opencensus-java)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : io.opencensus. **Name** : opencensus-contrib-http-util. **Version** : 0.18.0.
- * **Project URL:** [https://github.com/census-instrumentation/opencensus-java](https://github.com/census-instrumentation/opencensus-java)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : io.perfmark. **Name** : perfmark-api. **Version** : 0.23.0.
- * **Project URL:** [https://github.com/perfmark/perfmark](https://github.com/perfmark/perfmark)
- * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
-
-1. **Group** : javax.annotation. **Name** : javax.annotation-api. **Version** : 1.3.2.
- * **Project URL:** [http://jcp.org/en/jsr/detail?id=250](http://jcp.org/en/jsr/detail?id=250)
- * **License:** [CDDL + GPLv2 with classpath exception](https://github.com/javaee/javax.annotation/blob/master/LICENSE)
-
-1. **Group** : javax.servlet. **Name** : javax.servlet-api. **Version** : 3.1.0.
- * **Project URL:** [http://servlet-spec.java.net](http://servlet-spec.java.net)
- * **License:** [CDDL + GPLv2 with classpath exception](https://glassfish.dev.java.net/nonav/public/CDDL+GPL.html)
-
-1. **Group** : junit. **Name** : junit. **Version** : 4.13.1.
- * **Project URL:** [http://junit.org](http://junit.org)
- * **License:** [Eclipse Public License 1.0](http://www.eclipse.org/legal/epl-v10.html)
-
-1. **Group** : net.java.dev.jna. **Name** : jna. **Version** : 5.6.0.
- * **Project URL:** [https://github.com/java-native-access/jna](https://github.com/java-native-access/jna)
- * **License:** [Apache License v2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
- * **License:** [LGPL, version 2.1](http://www.gnu.org/licenses/licenses.html)
-
-1. **Group** : net.sf.saxon. **Name** : Saxon-HE. **Version** : 10.6.
- * **Project URL:** [http://www.saxonica.com/](http://www.saxonica.com/)
- * **License:** [Mozilla Public License Version 2.0](http://www.mozilla.org/MPL/2.0/)
-
-1. **Group** : net.sourceforge.pmd. **Name** : pmd-core. **Version** : 6.44.0.
- * **License:** [BSD-style](http://pmd.sourceforge.net/license.html)
-
-1. **Group** : net.sourceforge.pmd. **Name** : pmd-java. **Version** : 6.44.0.
- * **License:** [BSD-style](http://pmd.sourceforge.net/license.html)
-
-1. **Group** : net.sourceforge.saxon. **Name** : saxon. **Version** : 9.1.0.8.
- * **Project URL:** [http://saxon.sourceforge.net/](http://saxon.sourceforge.net/)
- * **License:** [Mozilla Public License Version 1.0](http://www.mozilla.org/MPL/MPL-1.0.txt)
-
-1. **Group** : org.antlr. **Name** : antlr4-runtime. **Version** : 4.7.2.
- * **Project URL:** [http://www.antlr.org](http://www.antlr.org)
- * **License:** [The BSD License](http://www.antlr.org/license.html)
-
-1. **Group** : org.antlr. **Name** : antlr4-runtime. **Version** : 4.9.3.
- * **Project URL:** [http://www.antlr.org](http://www.antlr.org)
- * **License:** [The BSD License](http://www.antlr.org/license.html)
-
-1. **Group** : org.apache.commons. **Name** : commons-lang3. **Version** : 3.8.1.
- * **Project URL:** [http://commons.apache.org/proper/commons-lang/](http://commons.apache.org/proper/commons-lang/)
- * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.apache.httpcomponents. **Name** : httpclient. **Version** : 4.5.13.
- * **Project URL:** [http://hc.apache.org/httpcomponents-client](http://hc.apache.org/httpcomponents-client)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.apache.httpcomponents. **Name** : httpcore. **Version** : 4.4.14.
- * **Project URL:** [http://hc.apache.org/httpcomponents-core-ga](http://hc.apache.org/httpcomponents-core-ga)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.apiguardian. **Name** : apiguardian-api. **Version** : 1.1.2.
- * **Project URL:** [https://github.com/apiguardian-team/apiguardian](https://github.com/apiguardian-team/apiguardian)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.checkerframework. **Name** : checker-compat-qual. **Version** : 2.5.5.
- * **Project URL:** [https://checkerframework.org](https://checkerframework.org)
- * **License:** [GNU General Public License, version 2 (GPL2), with the classpath exception](http://www.gnu.org/software/classpath/license.html)
- * **License:** [The MIT License](http://opensource.org/licenses/MIT)
-
-1. **Group** : org.checkerframework. **Name** : checker-qual. **Version** : 3.21.3.
- * **Project URL:** [https://checkerframework.org](https://checkerframework.org)
- * **License:** [The MIT License](http://opensource.org/licenses/MIT)
-
-1. **Group** : org.checkerframework. **Name** : dataflow-errorprone. **Version** : 3.15.0.
- * **Project URL:** [https://checkerframework.org](https://checkerframework.org)
- * **License:** [GNU General Public License, version 2 (GPL2), with the classpath exception](http://www.gnu.org/software/classpath/license.html)
-
-1. **Group** : org.codehaus.mojo. **Name** : animal-sniffer-annotations. **Version** : 1.21.
- * **License:** [MIT license](http://www.opensource.org/licenses/mit-license.php)
- * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.codehaus.woodstox. **Name** : stax2-api. **Version** : 4.2.1.
- * **Project URL:** [http://github.com/FasterXML/stax2-api](http://github.com/FasterXML/stax2-api)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
- * **License:** [The BSD License](http://www.opensource.org/licenses/bsd-license.php)
-
-1. **Group** : org.eclipse.jgit. **Name** : org.eclipse.jgit. **Version** : 4.4.1.201607150455-r.
- * **License:** Eclipse Distribution License (New BSD License)
-
-1. **Group** : org.freemarker. **Name** : freemarker. **Version** : 2.3.31.
- * **Project URL:** [https://freemarker.apache.org/](https://freemarker.apache.org/)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.hamcrest. **Name** : hamcrest-core. **Version** : 1.3.
- * **License:** [New BSD License](http://www.opensource.org/licenses/bsd-license.php)
-
-1. **Group** : org.jacoco. **Name** : org.jacoco.agent. **Version** : 0.8.7.
- * **License:** [Eclipse Public License 2.0](https://www.eclipse.org/legal/epl-2.0/)
-
-1. **Group** : org.jacoco. **Name** : org.jacoco.ant. **Version** : 0.8.7.
- * **License:** [Eclipse Public License 2.0](https://www.eclipse.org/legal/epl-2.0/)
-
-1. **Group** : org.jacoco. **Name** : org.jacoco.core. **Version** : 0.8.7.
- * **License:** [Eclipse Public License 2.0](https://www.eclipse.org/legal/epl-2.0/)
-
-1. **Group** : org.jacoco. **Name** : org.jacoco.report. **Version** : 0.8.7.
- * **License:** [Eclipse Public License 2.0](https://www.eclipse.org/legal/epl-2.0/)
-
-1. **Group** : org.javassist. **Name** : javassist. **Version** : 3.28.0-GA.
- * **Project URL:** [http://www.javassist.org/](http://www.javassist.org/)
- * **License:** [Apache License 2.0](http://www.apache.org/licenses/)
- * **License:** [LGPL 2.1](http://www.gnu.org/licenses/lgpl-2.1.html)
- * **License:** [MPL 1.1](http://www.mozilla.org/MPL/MPL-1.1.html)
-
-1. **Group** : org.jetbrains. **Name** : annotations. **Version** : 13.0.
- * **Project URL:** [http://www.jetbrains.org](http://www.jetbrains.org)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains. **Name** : markdown. **Version** : 0.2.4.**No license information found**
-1. **Group** : org.jetbrains. **Name** : markdown-jvm. **Version** : 0.2.4.
- * **Project URL:** [https://github.com/JetBrains/markdown](https://github.com/JetBrains/markdown)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.dokka. **Name** : dokka-analysis. **Version** : 1.6.20.
- * **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.dokka. **Name** : dokka-base. **Version** : 1.6.20.
- * **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.dokka. **Name** : dokka-core. **Version** : 1.6.20.
- * **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.dokka. **Name** : kotlin-analysis-compiler. **Version** : 1.6.20.
- * **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.dokka. **Name** : kotlin-analysis-intellij. **Version** : 1.6.20.
- * **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.dokka. **Name** : kotlin-as-java-plugin. **Version** : 1.6.20.
- * **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.intellij.deps. **Name** : trove4j. **Version** : 1.0.20200330.
- * **Project URL:** [https://github.com/JetBrains/intellij-deps-trove4j](https://github.com/JetBrains/intellij-deps-trove4j)
- * **License:** [GNU LESSER GENERAL PUBLIC LICENSE 2.1](https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-compiler-embeddable. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-daemon-embeddable. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-klib-commonizer-embeddable. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-reflect. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-script-runtime. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-scripting-common. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-scripting-compiler-embeddable. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-scripting-compiler-impl-embeddable. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-scripting-jvm. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-common. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk7. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk8. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-bom. **Version** : 1.6.0.**No license information found**
-1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-core. **Version** : 1.6.0.**No license information found**
-1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-core-jvm. **Version** : 1.6.0.
- * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)
- * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-html-jvm. **Version** : 0.7.3.
- * **Project URL:** [https://github.com/Kotlin/kotlinx.html](https://github.com/Kotlin/kotlinx.html)
- * **License:** [The Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jsoup. **Name** : jsoup. **Version** : 1.13.1.
- * **Project URL:** [https://jsoup.org/](https://jsoup.org/)
- * **License:** [The MIT License](https://jsoup.org/license)
-
-1. **Group** : org.junit. **Name** : junit-bom. **Version** : 5.8.2.**No license information found**
-1. **Group** : org.junit.jupiter. **Name** : junit-jupiter-api. **Version** : 5.8.2.
- * **Project URL:** [https://junit.org/junit5/](https://junit.org/junit5/)
- * **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
-
-1. **Group** : org.junit.jupiter. **Name** : junit-jupiter-engine. **Version** : 5.8.2.
- * **Project URL:** [https://junit.org/junit5/](https://junit.org/junit5/)
- * **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
-
-1. **Group** : org.junit.jupiter. **Name** : junit-jupiter-params. **Version** : 5.8.2.
- * **Project URL:** [https://junit.org/junit5/](https://junit.org/junit5/)
- * **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
-
-1. **Group** : org.junit.platform. **Name** : junit-platform-commons. **Version** : 1.8.2.
- * **Project URL:** [https://junit.org/junit5/](https://junit.org/junit5/)
- * **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
-
-1. **Group** : org.junit.platform. **Name** : junit-platform-engine. **Version** : 1.8.2.
- * **Project URL:** [https://junit.org/junit5/](https://junit.org/junit5/)
- * **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
-
-1. **Group** : org.opentest4j. **Name** : opentest4j. **Version** : 1.2.0.
- * **Project URL:** [https://github.com/ota4j-team/opentest4j](https://github.com/ota4j-team/opentest4j)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.ow2.asm. **Name** : asm. **Version** : 9.1.
- * **Project URL:** [http://asm.ow2.io/](http://asm.ow2.io/)
- * **License:** [BSD-3-Clause](https://asm.ow2.io/license.html)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.ow2.asm. **Name** : asm. **Version** : 9.2.
- * **Project URL:** [http://asm.ow2.io/](http://asm.ow2.io/)
- * **License:** [BSD-3-Clause](https://asm.ow2.io/license.html)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.ow2.asm. **Name** : asm-analysis. **Version** : 9.1.
- * **Project URL:** [http://asm.ow2.io/](http://asm.ow2.io/)
- * **License:** [BSD-3-Clause](https://asm.ow2.io/license.html)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.ow2.asm. **Name** : asm-commons. **Version** : 9.1.
- * **Project URL:** [http://asm.ow2.io/](http://asm.ow2.io/)
- * **License:** [BSD-3-Clause](https://asm.ow2.io/license.html)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.ow2.asm. **Name** : asm-tree. **Version** : 9.1.
- * **Project URL:** [http://asm.ow2.io/](http://asm.ow2.io/)
- * **License:** [BSD-3-Clause](https://asm.ow2.io/license.html)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.pcollections. **Name** : pcollections. **Version** : 2.1.2.
- * **Project URL:** [http://pcollections.org](http://pcollections.org)
- * **License:** [The MIT License](http://www.opensource.org/licenses/mit-license.php)
-
-1. **Group** : org.reflections. **Name** : reflections. **Version** : 0.10.2.
- * **Project URL:** [http://github.com/ronmamo/reflections](http://github.com/ronmamo/reflections)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
- * **License:** [WTFPL](http://www.wtfpl.net/)
-
-
-The dependencies distributed under several licenses, are used according their commercial-use-friendly license.
-
-This report was generated on **Wed May 04 18:13:31 EEST 2022** using [Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under [Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE).
-
-
-
-
-# Dependencies of `io.spine:spine-web:2.0.0-SNAPSHOT.74`
-
-## Runtime
-1. **Group** : com.google.android. **Name** : annotations. **Version** : 4.1.1.4.
- * **Project URL:** [http://source.android.com/](http://source.android.com/)
- * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0)
-
-1. **Group** : com.google.api.grpc. **Name** : proto-google-common-protos. **Version** : 2.7.0.
- * **Project URL:** [https://github.com/googleapis/java-iam/proto-google-common-protos](https://github.com/googleapis/java-iam/proto-google-common-protos)
- * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.code.findbugs. **Name** : jsr305. **Version** : 3.0.2.
- * **Project URL:** [http://findbugs.sourceforge.net/](http://findbugs.sourceforge.net/)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.code.gson. **Name** : gson. **Version** : 2.9.0.
- * **Project URL:** [https://github.com/google/gson/gson](https://github.com/google/gson/gson)
- * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.errorprone. **Name** : error_prone_annotations. **Version** : 2.10.0.
- * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.errorprone. **Name** : error_prone_type_annotations. **Version** : 2.10.0.
- * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.flogger. **Name** : flogger. **Version** : 0.7.4.
- * **Project URL:** [https://github.com/google/flogger](https://github.com/google/flogger)
- * **License:** [Apache 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.flogger. **Name** : flogger-system-backend. **Version** : 0.7.4.
- * **Project URL:** [https://github.com/google/flogger](https://github.com/google/flogger)
- * **License:** [Apache 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.guava. **Name** : failureaccess. **Version** : 1.0.1.
- * **Project URL:** [https://github.com/google/guava/](https://github.com/google/guava/)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.guava. **Name** : guava. **Version** : 31.1-jre.
- * **Project URL:** [https://github.com/google/guava](https://github.com/google/guava)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.guava. **Name** : listenablefuture. **Version** : 9999.0-empty-to-avoid-conflict-with-guava.
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.http-client. **Name** : google-http-client. **Version** : 1.41.5.
- * **Project URL:** [https://www.google.com/](https://www.google.com/)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.http-client. **Name** : google-http-client-apache. **Version** : 2.1.2.
- * **Project URL:** [http://www.google.com/](http://www.google.com/)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.j2objc. **Name** : j2objc-annotations. **Version** : 1.3.
- * **Project URL:** [https://github.com/google/j2objc/](https://github.com/google/j2objc/)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.protobuf. **Name** : protobuf-java. **Version** : 3.19.4.
- * **Project URL:** [https://developers.google.com/protocol-buffers/](https://developers.google.com/protocol-buffers/)
- * **License:** [3-Clause BSD License](https://opensource.org/licenses/BSD-3-Clause)
-
-1. **Group** : com.google.protobuf. **Name** : protobuf-java-util. **Version** : 3.19.4.
- * **Project URL:** [https://developers.google.com/protocol-buffers/](https://developers.google.com/protocol-buffers/)
- * **License:** [3-Clause BSD License](https://opensource.org/licenses/BSD-3-Clause)
-
-1. **Group** : com.google.protobuf. **Name** : protobuf-kotlin. **Version** : 3.19.4.
- * **License:** [3-Clause BSD License](https://opensource.org/licenses/BSD-3-Clause)
-
-1. **Group** : commons-codec. **Name** : commons-codec. **Version** : 1.15.
- * **Project URL:** [https://commons.apache.org/proper/commons-codec/](https://commons.apache.org/proper/commons-codec/)
- * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : commons-logging. **Name** : commons-logging. **Version** : 1.2.
- * **Project URL:** [http://commons.apache.org/proper/commons-logging/](http://commons.apache.org/proper/commons-logging/)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : io.grpc. **Name** : grpc-api. **Version** : 1.38.0.
- * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
- * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
-
-1. **Group** : io.grpc. **Name** : grpc-context. **Version** : 1.45.1.
- * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
- * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
-
-1. **Group** : io.grpc. **Name** : grpc-core. **Version** : 1.38.0.
- * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
- * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
-
-1. **Group** : io.grpc. **Name** : grpc-protobuf. **Version** : 1.38.0.
- * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
- * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
-
-1. **Group** : io.grpc. **Name** : grpc-protobuf-lite. **Version** : 1.38.0.
- * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
- * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
-
-1. **Group** : io.grpc. **Name** : grpc-stub. **Version** : 1.38.0.
- * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
- * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
-
-1. **Group** : io.opencensus. **Name** : opencensus-api. **Version** : 0.21.0.
- * **Project URL:** [https://github.com/census-instrumentation/opencensus-java](https://github.com/census-instrumentation/opencensus-java)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : io.opencensus. **Name** : opencensus-contrib-http-util. **Version** : 0.18.0.
- * **Project URL:** [https://github.com/census-instrumentation/opencensus-java](https://github.com/census-instrumentation/opencensus-java)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : io.perfmark. **Name** : perfmark-api. **Version** : 0.23.0.
- * **Project URL:** [https://github.com/perfmark/perfmark](https://github.com/perfmark/perfmark)
- * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
-
-1. **Group** : javax.annotation. **Name** : javax.annotation-api. **Version** : 1.3.2.
- * **Project URL:** [http://jcp.org/en/jsr/detail?id=250](http://jcp.org/en/jsr/detail?id=250)
- * **License:** [CDDL + GPLv2 with classpath exception](https://github.com/javaee/javax.annotation/blob/master/LICENSE)
-
-1. **Group** : javax.servlet. **Name** : javax.servlet-api. **Version** : 3.1.0.
- * **Project URL:** [http://servlet-spec.java.net](http://servlet-spec.java.net)
- * **License:** [CDDL + GPLv2 with classpath exception](https://glassfish.dev.java.net/nonav/public/CDDL+GPL.html)
-
-1. **Group** : org.apache.httpcomponents. **Name** : httpclient. **Version** : 4.5.13.
- * **Project URL:** [http://hc.apache.org/httpcomponents-client](http://hc.apache.org/httpcomponents-client)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.apache.httpcomponents. **Name** : httpcore. **Version** : 4.4.14.
- * **Project URL:** [http://hc.apache.org/httpcomponents-core-ga](http://hc.apache.org/httpcomponents-core-ga)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.checkerframework. **Name** : checker-compat-qual. **Version** : 2.5.5.
- * **Project URL:** [https://checkerframework.org](https://checkerframework.org)
- * **License:** [GNU General Public License, version 2 (GPL2), with the classpath exception](http://www.gnu.org/software/classpath/license.html)
- * **License:** [The MIT License](http://opensource.org/licenses/MIT)
-
-1. **Group** : org.checkerframework. **Name** : checker-qual. **Version** : 3.21.3.
- * **Project URL:** [https://checkerframework.org](https://checkerframework.org)
- * **License:** [The MIT License](http://opensource.org/licenses/MIT)
-
-1. **Group** : org.codehaus.mojo. **Name** : animal-sniffer-annotations. **Version** : 1.21.
- * **License:** [MIT license](http://www.opensource.org/licenses/mit-license.php)
- * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains. **Name** : annotations. **Version** : 13.0.
- * **Project URL:** [http://www.jetbrains.org](http://www.jetbrains.org)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-reflect. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-common. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk7. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk8. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-## Compile, tests, and tooling
-1. **Group** : com.beust. **Name** : jcommander. **Version** : 1.48.
- * **Project URL:** [http://beust.com/jcommander](http://beust.com/jcommander)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.fasterxml.jackson. **Name** : jackson-bom. **Version** : 2.13.2.**No license information found**
-1. **Group** : com.fasterxml.jackson.core. **Name** : jackson-annotations. **Version** : 2.13.2.
- * **Project URL:** [http://github.com/FasterXML/jackson](http://github.com/FasterXML/jackson)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.fasterxml.jackson.core. **Name** : jackson-core. **Version** : 2.13.2.
- * **Project URL:** [https://github.com/FasterXML/jackson-core](https://github.com/FasterXML/jackson-core)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.fasterxml.jackson.core. **Name** : jackson-databind. **Version** : 2.13.2.2.
- * **Project URL:** [http://github.com/FasterXML/jackson](http://github.com/FasterXML/jackson)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.fasterxml.jackson.dataformat. **Name** : jackson-dataformat-xml. **Version** : 2.13.2.
- * **Project URL:** [https://github.com/FasterXML/jackson-dataformat-xml](https://github.com/FasterXML/jackson-dataformat-xml)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.fasterxml.jackson.module. **Name** : jackson-module-kotlin. **Version** : 2.13.2.
- * **Project URL:** [https://github.com/FasterXML/jackson-module-kotlin](https://github.com/FasterXML/jackson-module-kotlin)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.fasterxml.woodstox. **Name** : woodstox-core. **Version** : 6.2.7.
- * **Project URL:** [https://github.com/FasterXML/woodstox](https://github.com/FasterXML/woodstox)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.github.ben-manes.caffeine. **Name** : caffeine. **Version** : 2.8.8.
- * **Project URL:** [https://github.com/ben-manes/caffeine](https://github.com/ben-manes/caffeine)
- * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.github.kevinstern. **Name** : software-and-algorithms. **Version** : 1.0.
- * **Project URL:** [https://www.github.com/KevinStern/software-and-algorithms](https://www.github.com/KevinStern/software-and-algorithms)
- * **License:** [MIT License](http://www.opensource.org/licenses/mit-license.php)
-
-1. **Group** : com.google.android. **Name** : annotations. **Version** : 4.1.1.4.
- * **Project URL:** [http://source.android.com/](http://source.android.com/)
- * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0)
-
-1. **Group** : com.google.api.grpc. **Name** : proto-google-common-protos. **Version** : 2.7.0.
- * **Project URL:** [https://github.com/googleapis/java-iam/proto-google-common-protos](https://github.com/googleapis/java-iam/proto-google-common-protos)
- * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.auto. **Name** : auto-common. **Version** : 1.2.1.
- * **Project URL:** [https://github.com/google/auto/tree/master/common](https://github.com/google/auto/tree/master/common)
- * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.auto.service. **Name** : auto-service-annotations. **Version** : 1.0.1.
- * **Project URL:** [https://github.com/google/auto/tree/master/service](https://github.com/google/auto/tree/master/service)
- * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.auto.value. **Name** : auto-value-annotations. **Version** : 1.9.
- * **Project URL:** [https://github.com/google/auto/tree/master/value](https://github.com/google/auto/tree/master/value)
- * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.code.findbugs. **Name** : jFormatString. **Version** : 3.0.0.
- * **Project URL:** [http://findbugs.sourceforge.net/](http://findbugs.sourceforge.net/)
- * **License:** [GNU Lesser Public License](http://www.gnu.org/licenses/lgpl.html)
-
-1. **Group** : com.google.code.findbugs. **Name** : jsr305. **Version** : 3.0.2.
- * **Project URL:** [http://findbugs.sourceforge.net/](http://findbugs.sourceforge.net/)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.code.gson. **Name** : gson. **Version** : 2.9.0.
- * **Project URL:** [https://github.com/google/gson/gson](https://github.com/google/gson/gson)
- * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.errorprone. **Name** : error_prone_annotation. **Version** : 2.10.0.
- * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.errorprone. **Name** : error_prone_annotations. **Version** : 2.10.0.
- * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.errorprone. **Name** : error_prone_check_api. **Version** : 2.10.0.
- * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.errorprone. **Name** : error_prone_core. **Version** : 2.10.0.
- * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.errorprone. **Name** : error_prone_type_annotations. **Version** : 2.10.0.
- * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.flogger. **Name** : flogger. **Version** : 0.7.4.
- * **Project URL:** [https://github.com/google/flogger](https://github.com/google/flogger)
- * **License:** [Apache 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.flogger. **Name** : flogger-system-backend. **Version** : 0.7.4.
- * **Project URL:** [https://github.com/google/flogger](https://github.com/google/flogger)
- * **License:** [Apache 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.gradle. **Name** : osdetector-gradle-plugin. **Version** : 1.7.0.
- * **Project URL:** [https://github.com/google/osdetector-gradle-plugin](https://github.com/google/osdetector-gradle-plugin)
- * **License:** [Apache License 2.0](http://opensource.org/licenses/Apache-2.0)
-
-1. **Group** : com.google.guava. **Name** : failureaccess. **Version** : 1.0.1.
- * **Project URL:** [https://github.com/google/guava/](https://github.com/google/guava/)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.guava. **Name** : guava. **Version** : 31.1-jre.
- * **Project URL:** [https://github.com/google/guava](https://github.com/google/guava)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.guava. **Name** : guava-testlib. **Version** : 31.1-jre.
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.guava. **Name** : listenablefuture. **Version** : 9999.0-empty-to-avoid-conflict-with-guava.
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.http-client. **Name** : google-http-client. **Version** : 1.41.5.
- * **Project URL:** [https://www.google.com/](https://www.google.com/)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.http-client. **Name** : google-http-client-apache. **Version** : 2.1.2.
- * **Project URL:** [http://www.google.com/](http://www.google.com/)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.j2objc. **Name** : j2objc-annotations. **Version** : 1.3.
- * **Project URL:** [https://github.com/google/j2objc/](https://github.com/google/j2objc/)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.protobuf. **Name** : protobuf-gradle-plugin. **Version** : 0.8.18.
- * **Project URL:** [https://github.com/google/protobuf-gradle-plugin](https://github.com/google/protobuf-gradle-plugin)
- * **License:** [BSD 3-Clause](http://opensource.org/licenses/BSD-3-Clause)
-
-1. **Group** : com.google.protobuf. **Name** : protobuf-java. **Version** : 3.19.4.
- * **Project URL:** [https://developers.google.com/protocol-buffers/](https://developers.google.com/protocol-buffers/)
- * **License:** [3-Clause BSD License](https://opensource.org/licenses/BSD-3-Clause)
-
-1. **Group** : com.google.protobuf. **Name** : protobuf-java-util. **Version** : 3.19.4.
- * **Project URL:** [https://developers.google.com/protocol-buffers/](https://developers.google.com/protocol-buffers/)
- * **License:** [3-Clause BSD License](https://opensource.org/licenses/BSD-3-Clause)
-
-1. **Group** : com.google.protobuf. **Name** : protobuf-kotlin. **Version** : 3.19.4.
- * **License:** [3-Clause BSD License](https://opensource.org/licenses/BSD-3-Clause)
-
-1. **Group** : com.google.protobuf. **Name** : protoc. **Version** : 3.19.4.
- * **Project URL:** [https://developers.google.com/protocol-buffers/](https://developers.google.com/protocol-buffers/)
- * **License:** [3-Clause BSD License](https://opensource.org/licenses/BSD-3-Clause)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.truth. **Name** : truth. **Version** : 1.1.3.
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.truth.extensions. **Name** : truth-java8-extension. **Version** : 1.1.3.
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.truth.extensions. **Name** : truth-liteproto-extension. **Version** : 1.1.3.
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.google.truth.extensions. **Name** : truth-proto-extension. **Version** : 1.1.3.
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : com.puppycrawl.tools. **Name** : checkstyle. **Version** : 10.1.
- * **Project URL:** [https://checkstyle.org/](https://checkstyle.org/)
- * **License:** [LGPL-2.1+](http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt)
-
-1. **Group** : com.squareup. **Name** : javapoet. **Version** : 1.13.0.
- * **Project URL:** [http://github.com/square/javapoet/](http://github.com/square/javapoet/)
- * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : commons-beanutils. **Name** : commons-beanutils. **Version** : 1.9.4.
- * **Project URL:** [https://commons.apache.org/proper/commons-beanutils/](https://commons.apache.org/proper/commons-beanutils/)
- * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : commons-codec. **Name** : commons-codec. **Version** : 1.15.
- * **Project URL:** [https://commons.apache.org/proper/commons-codec/](https://commons.apache.org/proper/commons-codec/)
- * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : commons-collections. **Name** : commons-collections. **Version** : 3.2.2.
- * **Project URL:** [http://commons.apache.org/collections/](http://commons.apache.org/collections/)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : commons-io. **Name** : commons-io. **Version** : 2.6.
- * **Project URL:** [http://commons.apache.org/proper/commons-io/](http://commons.apache.org/proper/commons-io/)
- * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : commons-lang. **Name** : commons-lang. **Version** : 2.6.
- * **Project URL:** [http://commons.apache.org/lang/](http://commons.apache.org/lang/)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : commons-logging. **Name** : commons-logging. **Version** : 1.2.
- * **Project URL:** [http://commons.apache.org/proper/commons-logging/](http://commons.apache.org/proper/commons-logging/)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : info.picocli. **Name** : picocli. **Version** : 4.6.3.
- * **Project URL:** [http://picocli.info](http://picocli.info)
- * **License:** [The Apache Software License, version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : io.github.java-diff-utils. **Name** : java-diff-utils. **Version** : 4.0.
- * **Project URL:** [https://github.com/java-diff-utils/java-diff-utils](https://github.com/java-diff-utils/java-diff-utils)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : io.grpc. **Name** : grpc-api. **Version** : 1.38.0.
- * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
- * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
-
-1. **Group** : io.grpc. **Name** : grpc-context. **Version** : 1.45.1.
- * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
- * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
-
-1. **Group** : io.grpc. **Name** : grpc-core. **Version** : 1.38.0.
- * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
- * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
-
-1. **Group** : io.grpc. **Name** : grpc-protobuf. **Version** : 1.38.0.
- * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
- * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
-
-1. **Group** : io.grpc. **Name** : grpc-protobuf-lite. **Version** : 1.38.0.
- * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
- * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
-
-1. **Group** : io.grpc. **Name** : grpc-stub. **Version** : 1.38.0.
- * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
- * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
-
-1. **Group** : io.grpc. **Name** : protoc-gen-grpc-java. **Version** : 1.38.0.
- * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
- * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
-
-1. **Group** : io.opencensus. **Name** : opencensus-api. **Version** : 0.21.0.
- * **Project URL:** [https://github.com/census-instrumentation/opencensus-java](https://github.com/census-instrumentation/opencensus-java)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : io.opencensus. **Name** : opencensus-contrib-http-util. **Version** : 0.18.0.
- * **Project URL:** [https://github.com/census-instrumentation/opencensus-java](https://github.com/census-instrumentation/opencensus-java)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : io.perfmark. **Name** : perfmark-api. **Version** : 0.23.0.
- * **Project URL:** [https://github.com/perfmark/perfmark](https://github.com/perfmark/perfmark)
- * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
-
-1. **Group** : javax.annotation. **Name** : javax.annotation-api. **Version** : 1.3.2.
- * **Project URL:** [http://jcp.org/en/jsr/detail?id=250](http://jcp.org/en/jsr/detail?id=250)
- * **License:** [CDDL + GPLv2 with classpath exception](https://github.com/javaee/javax.annotation/blob/master/LICENSE)
-
-1. **Group** : javax.servlet. **Name** : javax.servlet-api. **Version** : 3.1.0.
- * **Project URL:** [http://servlet-spec.java.net](http://servlet-spec.java.net)
- * **License:** [CDDL + GPLv2 with classpath exception](https://glassfish.dev.java.net/nonav/public/CDDL+GPL.html)
-
-1. **Group** : junit. **Name** : junit. **Version** : 4.13.1.
- * **Project URL:** [http://junit.org](http://junit.org)
- * **License:** [Eclipse Public License 1.0](http://www.eclipse.org/legal/epl-v10.html)
-
-1. **Group** : kr.motd.maven. **Name** : os-maven-plugin. **Version** : 1.7.0.
- * **Project URL:** [https://github.com/trustin/os-maven-plugin/](https://github.com/trustin/os-maven-plugin/)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
-
-1. **Group** : net.java.dev.jna. **Name** : jna. **Version** : 5.6.0.
- * **Project URL:** [https://github.com/java-native-access/jna](https://github.com/java-native-access/jna)
- * **License:** [Apache License v2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
- * **License:** [LGPL, version 2.1](http://www.gnu.org/licenses/licenses.html)
-
-1. **Group** : net.sf.saxon. **Name** : Saxon-HE. **Version** : 10.6.
- * **Project URL:** [http://www.saxonica.com/](http://www.saxonica.com/)
- * **License:** [Mozilla Public License Version 2.0](http://www.mozilla.org/MPL/2.0/)
-
-1. **Group** : net.sourceforge.pmd. **Name** : pmd-core. **Version** : 6.44.0.
- * **License:** [BSD-style](http://pmd.sourceforge.net/license.html)
-
-1. **Group** : net.sourceforge.pmd. **Name** : pmd-java. **Version** : 6.44.0.
- * **License:** [BSD-style](http://pmd.sourceforge.net/license.html)
-
-1. **Group** : net.sourceforge.saxon. **Name** : saxon. **Version** : 9.1.0.8.
- * **Project URL:** [http://saxon.sourceforge.net/](http://saxon.sourceforge.net/)
- * **License:** [Mozilla Public License Version 1.0](http://www.mozilla.org/MPL/MPL-1.0.txt)
-
-1. **Group** : org.antlr. **Name** : antlr4-runtime. **Version** : 4.7.2.
- * **Project URL:** [http://www.antlr.org](http://www.antlr.org)
- * **License:** [The BSD License](http://www.antlr.org/license.html)
-
-1. **Group** : org.antlr. **Name** : antlr4-runtime. **Version** : 4.9.3.
- * **Project URL:** [http://www.antlr.org](http://www.antlr.org)
- * **License:** [The BSD License](http://www.antlr.org/license.html)
-
-1. **Group** : org.apache.commons. **Name** : commons-lang3. **Version** : 3.8.1.
- * **Project URL:** [http://commons.apache.org/proper/commons-lang/](http://commons.apache.org/proper/commons-lang/)
- * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.apache.httpcomponents. **Name** : httpclient. **Version** : 4.5.13.
- * **Project URL:** [http://hc.apache.org/httpcomponents-client](http://hc.apache.org/httpcomponents-client)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.apache.httpcomponents. **Name** : httpcore. **Version** : 4.4.14.
- * **Project URL:** [http://hc.apache.org/httpcomponents-core-ga](http://hc.apache.org/httpcomponents-core-ga)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.apiguardian. **Name** : apiguardian-api. **Version** : 1.1.2.
- * **Project URL:** [https://github.com/apiguardian-team/apiguardian](https://github.com/apiguardian-team/apiguardian)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.checkerframework. **Name** : checker-compat-qual. **Version** : 2.5.5.
- * **Project URL:** [https://checkerframework.org](https://checkerframework.org)
- * **License:** [GNU General Public License, version 2 (GPL2), with the classpath exception](http://www.gnu.org/software/classpath/license.html)
- * **License:** [The MIT License](http://opensource.org/licenses/MIT)
-
-1. **Group** : org.checkerframework. **Name** : checker-qual. **Version** : 3.21.3.
- * **Project URL:** [https://checkerframework.org](https://checkerframework.org)
- * **License:** [The MIT License](http://opensource.org/licenses/MIT)
-
-1. **Group** : org.checkerframework. **Name** : dataflow-errorprone. **Version** : 3.15.0.
- * **Project URL:** [https://checkerframework.org](https://checkerframework.org)
- * **License:** [GNU General Public License, version 2 (GPL2), with the classpath exception](http://www.gnu.org/software/classpath/license.html)
-
-1. **Group** : org.codehaus.mojo. **Name** : animal-sniffer-annotations. **Version** : 1.21.
- * **License:** [MIT license](http://www.opensource.org/licenses/mit-license.php)
- * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.codehaus.woodstox. **Name** : stax2-api. **Version** : 4.2.1.
- * **Project URL:** [http://github.com/FasterXML/stax2-api](http://github.com/FasterXML/stax2-api)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
- * **License:** [The BSD License](http://www.opensource.org/licenses/bsd-license.php)
-
-1. **Group** : org.eclipse.jgit. **Name** : org.eclipse.jgit. **Version** : 4.4.1.201607150455-r.
- * **License:** Eclipse Distribution License (New BSD License)
-
-1. **Group** : org.freemarker. **Name** : freemarker. **Version** : 2.3.31.
- * **Project URL:** [https://freemarker.apache.org/](https://freemarker.apache.org/)
- * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.hamcrest. **Name** : hamcrest-core. **Version** : 1.3.
- * **License:** [New BSD License](http://www.opensource.org/licenses/bsd-license.php)
-
-1. **Group** : org.jacoco. **Name** : org.jacoco.agent. **Version** : 0.8.7.
- * **License:** [Eclipse Public License 2.0](https://www.eclipse.org/legal/epl-2.0/)
-
-1. **Group** : org.jacoco. **Name** : org.jacoco.ant. **Version** : 0.8.7.
- * **License:** [Eclipse Public License 2.0](https://www.eclipse.org/legal/epl-2.0/)
-
-1. **Group** : org.jacoco. **Name** : org.jacoco.core. **Version** : 0.8.7.
- * **License:** [Eclipse Public License 2.0](https://www.eclipse.org/legal/epl-2.0/)
-
-1. **Group** : org.jacoco. **Name** : org.jacoco.report. **Version** : 0.8.7.
- * **License:** [Eclipse Public License 2.0](https://www.eclipse.org/legal/epl-2.0/)
-
-1. **Group** : org.javassist. **Name** : javassist. **Version** : 3.28.0-GA.
- * **Project URL:** [http://www.javassist.org/](http://www.javassist.org/)
- * **License:** [Apache License 2.0](http://www.apache.org/licenses/)
- * **License:** [LGPL 2.1](http://www.gnu.org/licenses/lgpl-2.1.html)
- * **License:** [MPL 1.1](http://www.mozilla.org/MPL/MPL-1.1.html)
-
-1. **Group** : org.jetbrains. **Name** : annotations. **Version** : 13.0.
- * **Project URL:** [http://www.jetbrains.org](http://www.jetbrains.org)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains. **Name** : markdown. **Version** : 0.2.4.**No license information found**
-1. **Group** : org.jetbrains. **Name** : markdown-jvm. **Version** : 0.2.4.
- * **Project URL:** [https://github.com/JetBrains/markdown](https://github.com/JetBrains/markdown)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.dokka. **Name** : dokka-analysis. **Version** : 1.6.20.
- * **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.dokka. **Name** : dokka-base. **Version** : 1.6.20.
- * **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.dokka. **Name** : dokka-core. **Version** : 1.6.20.
- * **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.dokka. **Name** : kotlin-analysis-compiler. **Version** : 1.6.20.
- * **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.dokka. **Name** : kotlin-analysis-intellij. **Version** : 1.6.20.
- * **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.dokka. **Name** : kotlin-as-java-plugin. **Version** : 1.6.20.
- * **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.intellij.deps. **Name** : trove4j. **Version** : 1.0.20200330.
- * **Project URL:** [https://github.com/JetBrains/intellij-deps-trove4j](https://github.com/JetBrains/intellij-deps-trove4j)
- * **License:** [GNU LESSER GENERAL PUBLIC LICENSE 2.1](https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-compiler-embeddable. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-daemon-embeddable. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-klib-commonizer-embeddable. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-reflect. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-script-runtime. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-scripting-common. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-scripting-compiler-embeddable. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-scripting-compiler-impl-embeddable. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-scripting-jvm. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-common. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk7. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk8. **Version** : 1.6.21.
- * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-bom. **Version** : 1.6.0.**No license information found**
-1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-core. **Version** : 1.6.0.**No license information found**
-1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-core-jvm. **Version** : 1.6.0.
- * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)
- * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-html-jvm. **Version** : 0.7.3.
- * **Project URL:** [https://github.com/Kotlin/kotlinx.html](https://github.com/Kotlin/kotlinx.html)
- * **License:** [The Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jsoup. **Name** : jsoup. **Version** : 1.13.1.
- * **Project URL:** [https://jsoup.org/](https://jsoup.org/)
- * **License:** [The MIT License](https://jsoup.org/license)
-
-1. **Group** : org.junit. **Name** : junit-bom. **Version** : 5.8.2.**No license information found**
-1. **Group** : org.junit.jupiter. **Name** : junit-jupiter-api. **Version** : 5.8.2.
- * **Project URL:** [https://junit.org/junit5/](https://junit.org/junit5/)
- * **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
-
-1. **Group** : org.junit.jupiter. **Name** : junit-jupiter-engine. **Version** : 5.8.2.
- * **Project URL:** [https://junit.org/junit5/](https://junit.org/junit5/)
- * **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
-
-1. **Group** : org.junit.jupiter. **Name** : junit-jupiter-params. **Version** : 5.8.2.
- * **Project URL:** [https://junit.org/junit5/](https://junit.org/junit5/)
- * **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
-
-1. **Group** : org.junit.platform. **Name** : junit-platform-commons. **Version** : 1.8.2.
- * **Project URL:** [https://junit.org/junit5/](https://junit.org/junit5/)
- * **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
-
-1. **Group** : org.junit.platform. **Name** : junit-platform-engine. **Version** : 1.8.2.
- * **Project URL:** [https://junit.org/junit5/](https://junit.org/junit5/)
- * **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
-
-1. **Group** : org.opentest4j. **Name** : opentest4j. **Version** : 1.2.0.
- * **Project URL:** [https://github.com/ota4j-team/opentest4j](https://github.com/ota4j-team/opentest4j)
- * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.ow2.asm. **Name** : asm. **Version** : 9.1.
- * **Project URL:** [http://asm.ow2.io/](http://asm.ow2.io/)
- * **License:** [BSD-3-Clause](https://asm.ow2.io/license.html)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.ow2.asm. **Name** : asm. **Version** : 9.2.
- * **Project URL:** [http://asm.ow2.io/](http://asm.ow2.io/)
- * **License:** [BSD-3-Clause](https://asm.ow2.io/license.html)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.ow2.asm. **Name** : asm-analysis. **Version** : 9.1.
- * **Project URL:** [http://asm.ow2.io/](http://asm.ow2.io/)
- * **License:** [BSD-3-Clause](https://asm.ow2.io/license.html)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.ow2.asm. **Name** : asm-commons. **Version** : 9.1.
- * **Project URL:** [http://asm.ow2.io/](http://asm.ow2.io/)
- * **License:** [BSD-3-Clause](https://asm.ow2.io/license.html)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.ow2.asm. **Name** : asm-tree. **Version** : 9.1.
- * **Project URL:** [http://asm.ow2.io/](http://asm.ow2.io/)
- * **License:** [BSD-3-Clause](https://asm.ow2.io/license.html)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.pcollections. **Name** : pcollections. **Version** : 2.1.2.
- * **Project URL:** [http://pcollections.org](http://pcollections.org)
- * **License:** [The MIT License](http://www.opensource.org/licenses/mit-license.php)
-
-1. **Group** : org.reflections. **Name** : reflections. **Version** : 0.10.2.
- * **Project URL:** [http://github.com/ronmamo/reflections](http://github.com/ronmamo/reflections)
- * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
- * **License:** [WTFPL](http://www.wtfpl.net/)
-
-
-The dependencies distributed under several licenses, are used according their commercial-use-friendly license.
-
-This report was generated on **Wed May 04 18:13:32 EEST 2022** using [Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under [Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE).
\ No newline at end of file
diff --git a/settings.gradle.kts b/settings.gradle.kts
index 4969b6c7f..ccf79b61a 100644
--- a/settings.gradle.kts
+++ b/settings.gradle.kts
@@ -33,6 +33,7 @@ include(
"firebase-web",
"testutil-web",
"client-js",
+ "client-ts",
"js-tests",
"test-app",
)
diff --git a/testutil-web/build.gradle.kts b/testutil-web/build.gradle.kts
index 90565fade..2d8b005b3 100644
--- a/testutil-web/build.gradle.kts
+++ b/testutil-web/build.gradle.kts
@@ -1,5 +1,3 @@
-import io.spine.internal.gradle.checkstyle.CheckStyleConfig
-
/*
* Copyright 2022, TeamDev. All rights reserved.
*
@@ -26,11 +24,12 @@ import io.spine.internal.gradle.checkstyle.CheckStyleConfig
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-val spineBaseVersion: String by extra
+import io.spine.internal.dependency.Spine
+import io.spine.internal.gradle.checkstyle.CheckStyleConfig
dependencies {
api(project(":web"))
- api("io.spine.tools:spine-testlib:$spineBaseVersion")
+ api(Spine.testlib)
}
CheckStyleConfig.applyTo(project)
diff --git a/testutil-web/src/main/java/io/spine/web/given/TestQueryService.java b/testutil-web/src/main/java/io/spine/web/given/TestQueryService.java
index 07196d45f..9c11daa6b 100644
--- a/testutil-web/src/main/java/io/spine/web/given/TestQueryService.java
+++ b/testutil-web/src/main/java/io/spine/web/given/TestQueryService.java
@@ -59,7 +59,7 @@ public void read(Query request, StreamObserver responseObserver)
var queryResponse = QueryResponse.newBuilder()
.setResponse(ok())
.addAllMessage(response)
- .vBuild();
+ .build();
responseObserver.onNext(queryResponse);
responseObserver.onCompleted();
}
diff --git a/version.gradle.kts b/version.gradle.kts
index c6fc7d398..9bd2b4aca 100644
--- a/version.gradle.kts
+++ b/version.gradle.kts
@@ -1,5 +1,5 @@
/*
- * Copyright 2022, TeamDev. All rights reserved.
+ * Copyright 2024, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -24,11 +24,6 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-val spineBaseVersion: String by extra("2.0.0-SNAPSHOT.67")
-val spineBaseTypesVersion: String by extra("2.0.0-SNAPSHOT.64")
-val spineTimeVersion: String by extra("2.0.0-SNAPSHOT.64")
-val spineCoreVersion: String by extra("2.0.0-SNAPSHOT.68")
-val spineVersion: String by extra(spineCoreVersion)
-
val versionToPublish: String by extra("2.0.0-SNAPSHOT.74")
val versionToPublishJs: String by extra(versionToPublish)
+val versionToPublishTs: String by extra(versionToPublish)
diff --git a/web/build.gradle.kts b/web/build.gradle.kts
index 933061b73..3a103c4b6 100644
--- a/web/build.gradle.kts
+++ b/web/build.gradle.kts
@@ -24,17 +24,14 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-import com.google.protobuf.gradle.builtins
-import com.google.protobuf.gradle.generateProtoTasks
-import com.google.protobuf.gradle.id
-import com.google.protobuf.gradle.protobuf
-import com.google.protobuf.gradle.protoc
+import com.google.protobuf.gradle.*
import io.spine.internal.dependency.HttpClient
import io.spine.internal.dependency.JavaX
import io.spine.internal.dependency.Protobuf
+import io.spine.internal.dependency.Spine
import io.spine.internal.gradle.publish.IncrementGuard
import io.spine.internal.gradle.checkstyle.CheckStyleConfig
-import io.spine.internal.gradle.excludeProtobufLite
+import io.spine.tools.gradle.project.artifact
plugins {
id("io.spine.mc-java")
@@ -44,12 +41,9 @@ configurations.excludeProtobufLite()
apply()
-val spineBaseVersion: String by extra
-val spineCoreVersion: String by extra
-
dependencies {
api(JavaX.servletApi)
- api("io.spine:spine-server:$spineCoreVersion")
+ api(Spine.server)
api(HttpClient.google)
implementation(HttpClient.apache)
@@ -65,11 +59,12 @@ CheckStyleConfig.applyTo(project)
protobuf {
protoc {
- artifact = Protobuf.compiler
+ artifact =Protobuf.JsRenderingProtoc.compiler
}
generateProtoTasks {
all().forEach { task ->
task.builtins {
+ remove("kotlin")
id("js") {
// For information on JavaScript code generation please see
// https://github.com/google/protobuf/blob/master/js/README.md
diff --git a/web/src/main/java/io/spine/web/MessageServlet.java b/web/src/main/java/io/spine/web/MessageServlet.java
index 70526158a..4abd07479 100644
--- a/web/src/main/java/io/spine/web/MessageServlet.java
+++ b/web/src/main/java/io/spine/web/MessageServlet.java
@@ -28,7 +28,6 @@
import com.google.common.annotations.VisibleForTesting;
import com.google.protobuf.Message;
-import io.spine.json.Json;
import io.spine.reflect.GenericTypeIndex;
import io.spine.web.parser.MessageFormat;
@@ -39,6 +38,7 @@
import java.util.Optional;
import static com.google.common.net.MediaType.JSON_UTF_8;
+import static io.spine.type.Json.toCompactJson;
import static java.util.stream.Collectors.joining;
import static javax.servlet.http.HttpServletResponse.SC_BAD_REQUEST;
@@ -103,7 +103,7 @@ private static String body(ServletRequest request) throws IOException {
private void writeResponse(HttpServletResponse servletResponse, O response)
throws IOException {
- var json = Json.toCompactJson(response);
+ var json = toCompactJson(response);
servletResponse.getWriter()
.append(json);
servletResponse.setContentType(JSON_UTF_8.toString());
diff --git a/web/src/main/java/io/spine/web/future/Completion.java b/web/src/main/java/io/spine/web/future/Completion.java
index bc0a10c93..aeec06941 100644
--- a/web/src/main/java/io/spine/web/future/Completion.java
+++ b/web/src/main/java/io/spine/web/future/Completion.java
@@ -26,7 +26,8 @@
package io.spine.web.future;
-import com.google.common.flogger.FluentLogger;
+import io.spine.logging.Logger;
+import io.spine.logging.LoggingFactory;
import org.checkerframework.checker.nullness.qual.Nullable;
import java.util.concurrent.CompletionStage;
@@ -36,7 +37,7 @@
*/
public final class Completion {
- private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+ private static final Logger> logger = LoggingFactory.forEnclosingClass();
/**
* Prevents the utility class instantiation.
@@ -45,7 +46,7 @@ private Completion() {
}
/**
- * Logs the exception of the given stage if any.
+ * Logs the exception thrown at a given stage if any.
*
* Does nothing if the stage completes successfully.
*
@@ -61,9 +62,9 @@ public static void dispose(CompletionStage> completionStage) {
private static void logException(@Nullable Throwable exception) {
if (exception != null) {
- logger.atSevere()
+ logger.atError()
.withCause(exception)
- .log("Failed to complete task.");
+ .log(() -> "Failed to complete task.");
}
}
}
diff --git a/web/src/main/java/io/spine/web/parser/Base64MessageParser.java b/web/src/main/java/io/spine/web/parser/Base64MessageParser.java
index 7ba331ffd..9f0fc1ff9 100644
--- a/web/src/main/java/io/spine/web/parser/Base64MessageParser.java
+++ b/web/src/main/java/io/spine/web/parser/Base64MessageParser.java
@@ -28,12 +28,14 @@
import com.google.protobuf.InvalidProtocolBufferException;
import com.google.protobuf.Message;
-import io.spine.logging.Logging;
+import io.spine.logging.WithLogging;
import io.spine.protobuf.Messages;
import java.util.Base64;
import java.util.Optional;
+import static java.lang.String.format;
+
/**
* An implementation of {@link MessageParser} which parses messages from
* a {@code Base64}-encoded byte string.
@@ -43,7 +45,7 @@
* @param
* the type of messages to parse
*/
-final class Base64MessageParser implements MessageParser, Logging {
+final class Base64MessageParser implements MessageParser, WithLogging {
private final Class type;
@@ -60,9 +62,11 @@ public Optional parse(String raw) {
var message = (M) builder.mergeFrom(bytes).build();
return Optional.of(message);
} catch (InvalidProtocolBufferException | ClassCastException e) {
- _error().withCause(e)
- .log("Unable to parse message of type `%s` from the Base64 string: `%s`.",
- type.getName(), raw);
+ logger().atError()
+ .withCause(e)
+ .log(() -> format(
+ "Unable to parse message of type `%s` from the Base64 string: `%s`.",
+ type.getName(), raw));
return Optional.empty();
}
}
diff --git a/web/src/main/java/io/spine/web/parser/JsonMessageParser.java b/web/src/main/java/io/spine/web/parser/JsonMessageParser.java
index 911c5c8d7..de5b51f85 100644
--- a/web/src/main/java/io/spine/web/parser/JsonMessageParser.java
+++ b/web/src/main/java/io/spine/web/parser/JsonMessageParser.java
@@ -27,27 +27,27 @@
package io.spine.web.parser;
import com.google.protobuf.Message;
-import io.spine.json.Json;
-import io.spine.logging.Logging;
+import io.spine.logging.WithLogging;
import java.util.Optional;
import java.util.regex.Pattern;
-import static io.spine.json.Json.fromJson;
+import static io.spine.type.Json.fromJson;
+import static java.lang.String.format;
import static java.util.regex.Pattern.LITERAL;
import static java.util.regex.Pattern.compile;
/**
* An implementation of {@link MessageParser} which parses messages from their JSON representations.
*
- * See {@link Json} and the
+ *
See {@link io.spine.type.Json} and the
* Protobuf documentation
* for the detailed description of the message format.
*
* @param
* the type of messages to parse
*/
-final class JsonMessageParser implements MessageParser, Logging {
+final class JsonMessageParser implements MessageParser, WithLogging {
private final Class type;
@@ -59,12 +59,13 @@ final class JsonMessageParser implements MessageParser, Lo
public Optional parse(String raw) {
var json = cleanUp(raw);
try {
- var message = fromJson(json, type);
+ var message = fromJson(type, json);
return Optional.of(message);
} catch (IllegalArgumentException e) {
- _error().withCause(e)
- .log("Unable to parse message of type `%s` from JSON: `%s`.",
- type.getName(), json);
+ logger().atError()
+ .withCause(e)
+ .log(() -> format("Unable to parse message of type `%s` from JSON: `%s`.",
+ type.getName(), json));
return Optional.empty();
}
}
diff --git a/web/src/main/java/io/spine/web/parser/MessageFormat.java b/web/src/main/java/io/spine/web/parser/MessageFormat.java
index 8e5a3a600..0c1f01159 100644
--- a/web/src/main/java/io/spine/web/parser/MessageFormat.java
+++ b/web/src/main/java/io/spine/web/parser/MessageFormat.java
@@ -26,9 +26,10 @@
package io.spine.web.parser;
-import com.google.common.flogger.FluentLogger;
import com.google.common.net.MediaType;
import com.google.protobuf.Message;
+import io.spine.logging.Logger;
+import io.spine.logging.LoggingFactory;
import javax.servlet.http.HttpServletRequest;
import java.util.Optional;
@@ -36,6 +37,7 @@
import static com.google.common.base.Strings.isNullOrEmpty;
import static com.google.common.net.MediaType.JSON_UTF_8;
+import static java.lang.String.format;
import static java.util.Optional.empty;
/**
@@ -64,7 +66,8 @@ MessageParser parserFor(Class type) {
}
};
- private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+ private static final Logger> logger = LoggingFactory.forEnclosingClass();
+
private static final String CONTENT_TYPE = "Content-Type";
private final MediaType contentType;
@@ -96,15 +99,15 @@ public static Optional formatOf(HttpServletRequest request) {
var format = formatOf(type);
if (format.isEmpty()) {
logger.atWarning()
- .log("Cannot determine message format for request `%s %s`.%n" +
+ .log(() -> format("Cannot determine message format for request `%s %s`.%n" +
"Content-Type: `%s`.",
request.getMethod(),
request.getServletPath(),
- contentTypeHeader);
+ contentTypeHeader));
}
return format;
} catch (IllegalArgumentException e) {
- logger.atSevere()
+ logger.atError()
.withCause(e)
.log();
return empty();
diff --git a/web/src/main/java/io/spine/web/query/QueryServlet.java b/web/src/main/java/io/spine/web/query/QueryServlet.java
index a23cbe6c0..a19c472f1 100644
--- a/web/src/main/java/io/spine/web/query/QueryServlet.java
+++ b/web/src/main/java/io/spine/web/query/QueryServlet.java
@@ -41,7 +41,7 @@
* {@code DELETE}, {@code OPTIONS}, and {@code TRACE} methods are not supported by default.
*
* In order to perform a {@linkplain io.spine.client.Query query}, a client should send an HTTP
- * {@code POST} request to this servlet. The request body should be a {@linkplain io.spine.json.Json
+ * {@code POST} request to this servlet. The request body should be a {@linkplain io.spine.type.Json
* JSON} representation of a {@link Query io.spine.client.Query}.
*
*
If the request is valid (i.e. the request body contains a valid {@link io.spine.client.Query
diff --git a/web/src/test/java/io/spine/web/command/CommandServletTest.java b/web/src/test/java/io/spine/web/command/CommandServletTest.java
index 5b4334ccb..272d9ea6b 100644
--- a/web/src/test/java/io/spine/web/command/CommandServletTest.java
+++ b/web/src/test/java/io/spine/web/command/CommandServletTest.java
@@ -29,11 +29,11 @@
import io.spine.base.Time;
import io.spine.client.CommandFactory;
import io.spine.core.Ack;
-import io.spine.json.Json;
import io.spine.protobuf.AnyPacker;
import io.spine.testing.client.TestActorRequestFactory;
import io.spine.testing.client.command.TestCommandMessage;
import io.spine.testing.logging.mute.MuteLogging;
+import io.spine.type.Json;
import io.spine.web.command.given.DetachedCommandServlet;
import io.spine.web.given.MemoizingResponse;
import org.junit.jupiter.api.DisplayName;
@@ -75,10 +75,10 @@ void testHandle() throws IOException {
var response = new StringWriter();
var createTask = TestCommandMessage.newBuilder()
.setId(newUuid())
- .vBuild();
+ .build();
var command = commandFactory.create(createTask);
servlet.doPost(request(command), response(response));
- var ack = Json.fromJson(response.toString(), Ack.class);
+ var ack = Json.fromJson(Ack.class, response.toString());
assertThat(command.getId())
.isEqualTo(AnyPacker.unpack(ack.getMessageId()));
}
diff --git a/web/src/test/java/io/spine/web/future/CompletionTest.java b/web/src/test/java/io/spine/web/future/CompletionTest.java
index 015ec8fc7..9493fe5e3 100644
--- a/web/src/test/java/io/spine/web/future/CompletionTest.java
+++ b/web/src/test/java/io/spine/web/future/CompletionTest.java
@@ -26,7 +26,6 @@
package io.spine.web.future;
-import io.spine.logging.Logging;
import io.spine.testing.UtilityClassTest;
import io.spine.testing.logging.SimpleLoggingTest;
import org.junit.jupiter.api.DisplayName;
@@ -34,6 +33,7 @@
import org.junit.jupiter.api.Test;
import java.util.concurrent.CompletableFuture;
+import java.util.logging.Level;
@DisplayName("Completion should")
class CompletionTest extends UtilityClassTest {
@@ -46,7 +46,7 @@ class CompletionTest extends UtilityClassTest {
class LogOutputTest extends SimpleLoggingTest {
LogOutputTest() {
- super(Completion.class, Logging.errorLevel());
+ super(Completion.class, Level.SEVERE);
}
@Test
@@ -69,7 +69,7 @@ void logExceptions() {
var assertLogRecord = assertLog().record();
assertLogRecord.hasLevelThat()
- .isEqualTo(Logging.errorLevel());
+ .isEqualTo(Level.SEVERE);
assertLogRecord.hasThrowableThat()
.isInstanceOf(UnicornException.class);
}
diff --git a/web/src/test/java/io/spine/web/given/Servlets.java b/web/src/test/java/io/spine/web/given/Servlets.java
index 8bc9f2944..82cdd7745 100644
--- a/web/src/test/java/io/spine/web/given/Servlets.java
+++ b/web/src/test/java/io/spine/web/given/Servlets.java
@@ -28,7 +28,7 @@
import com.google.common.net.MediaType;
import com.google.protobuf.Message;
-import io.spine.json.Json;
+import io.spine.type.Json;
import javax.servlet.http.HttpServletResponse;
import java.io.StringWriter;
diff --git a/web/src/test/java/io/spine/web/query/QueryServletTest.java b/web/src/test/java/io/spine/web/query/QueryServletTest.java
index be73eec48..a8147a85e 100644
--- a/web/src/test/java/io/spine/web/query/QueryServletTest.java
+++ b/web/src/test/java/io/spine/web/query/QueryServletTest.java
@@ -28,7 +28,7 @@
import com.google.protobuf.Message;
import io.spine.client.QueryFactory;
-import io.spine.json.Json;
+import io.spine.type.Json;
import io.spine.testing.client.TestActorRequestFactory;
import io.spine.testing.logging.mute.MuteLogging;
import io.spine.web.given.MemoizingResponse;
@@ -79,7 +79,7 @@ void testHandle() throws IOException {
var query = queryFactory.all(Task.class);
HttpServletRequest request = request(query);
servlet.doPost(request, response(response));
- var actualData = Json.fromJson(response.toString(), Task.class);
+ var actualData = Json.fromJson(Task.class, response.toString());
assertThat(actualData).isEqualTo(task);
}