From c8e3565a2c1c783eaf51ca05f092985623ec342d Mon Sep 17 00:00:00 2001 From: Danilo Pianini Date: Mon, 30 Dec 2024 14:28:01 +0100 Subject: [PATCH] feat: enable Dokka v2 (#4056) * feat: enable Dokka v2 * build: enable the kotest runner on multiplatform projects * build: enforce consistency in the KMP subprojects * ci: fix new task name * ci: make sure to fail on broken links * docs: link the home page * ci: fix broken retry mechanism * docs: fix links to KDoc * docs: limit docs generation to subprojects until Kotlin/dokka#3979 is fixed * docs: include both multi-module and overall documentation * docs: only check the multimodule website * docs: fix typo * docs: revise replacements --- .github/workflows/build-and-deploy.yml | 7 +- .idea/copyright/Alchemist.xml | 1 + alchemist-api/build.gradle.kts | 5 + alchemist-cognitive-agents/build.gradle.kts | 11 +- alchemist-engine/build.gradle.kts | 11 +- alchemist-euclidean-geometry/build.gradle.kts | 10 +- alchemist-full/build.gradle.kts | 64 +- .../it/unibo/alchemist/TestLaunchViaMain.kt | 0 .../alchemist/model/actions/TestRemoveNode.kt | 0 .../model/environments/LoggingEnvironment.kt | 0 .../{jvmTest => test}/resources/logging.yml | 0 .../org/protelis/tutorial/distanceTo.pt | 0 .../{jvmTest => test}/resources/remove.yml | 0 .../resources/simulation.yml | 0 alchemist-graphql-surrogates/build.gradle.kts | 1 + alchemist-graphql/build.gradle.kts | 14 +- alchemist-grid/build.gradle.kts | 10 +- alchemist-implementationbase/build.gradle.kts | 12 +- .../build.gradle.kts | 39 +- .../model/biochemistry/CellProperty.kt | 2 +- .../build.gradle.kts | 14 +- alchemist-incarnation-sapere/build.gradle.kts | 10 +- alchemist-incarnation-scafi/build.gradle.kts | 8 +- alchemist-loading/build.gradle.kts | 5 + .../JaktaTimeDistribution.kt | 2 + .../build.gradle.kts | 14 + .../it/unibo/alchemist/util/BugReporting.kt | 5 +- alchemist-maps/build.gradle.kts | 10 +- alchemist-multivesta-adapter/build.gradle.kts | 13 + alchemist-physics/build.gradle.kts | 11 +- alchemist-sapere-mathexp/build.gradle.kts | 4 + alchemist-smartcam/build.gradle.kts | 4 + alchemist-swingui/build.gradle.kts | 16 +- alchemist-test/build.gradle.kts | 8 +- alchemist-ui-tooling/build.gradle.kts | 19 +- alchemist-web-renderer/build.gradle.kts | 9 +- build.gradle.kts | 299 +++----- buildSrc/build.gradle.kts | 3 + buildSrc/src/main/kotlin/Util.kt | 10 + .../main/kotlin/dokka-convention.gradle.kts | 76 +++ .../kotlin/kotlin-jvm-convention.gradle.kts | 50 ++ ...kotlin-multiplatform-convention.gradle.kts | 41 ++ gradle.properties | 3 + gradle/libs.versions.toml | 10 +- javadoc-io.json | 216 ++++++ kotlin-js-store/yarn.lock | 644 ++++++++++++------ site/content/reference/javadoc/_index.md | 7 - .../{plainkdoc => kdoc-modules}/_index.md | 4 +- site/content/reference/kdoc/_index.md | 2 +- site/layouts/shortcodes/api.html | 2 +- site/logo-styles.css | 9 + site/replacements | 4 +- 52 files changed, 1094 insertions(+), 625 deletions(-) rename alchemist-full/src/{jvmTest => test}/kotlin/it/unibo/alchemist/TestLaunchViaMain.kt (100%) rename alchemist-full/src/{jvmTest => test}/kotlin/it/unibo/alchemist/model/actions/TestRemoveNode.kt (100%) rename alchemist-full/src/{jvmTest => test}/kotlin/it/unibo/alchemist/model/environments/LoggingEnvironment.kt (100%) rename alchemist-full/src/{jvmTest => test}/resources/logging.yml (100%) rename alchemist-full/src/{jvmTest => test}/resources/org/protelis/tutorial/distanceTo.pt (100%) rename alchemist-full/src/{jvmTest => test}/resources/remove.yml (100%) rename alchemist-full/src/{jvmTest => test}/resources/simulation.yml (100%) rename alchemist-maintenance-tooling/src/{main => commonMain}/kotlin/it/unibo/alchemist/util/BugReporting.kt (92%) create mode 100644 buildSrc/src/main/kotlin/dokka-convention.gradle.kts create mode 100644 buildSrc/src/main/kotlin/kotlin-jvm-convention.gradle.kts create mode 100644 buildSrc/src/main/kotlin/kotlin-multiplatform-convention.gradle.kts delete mode 100644 site/content/reference/javadoc/_index.md rename site/content/reference/{plainkdoc => kdoc-modules}/_index.md (79%) create mode 100644 site/logo-styles.css diff --git a/.github/workflows/build-and-deploy.yml b/.github/workflows/build-and-deploy.yml index caef3fb3d1..d38a2118b6 100644 --- a/.github/workflows/build-and-deploy.yml +++ b/.github/workflows/build-and-deploy.yml @@ -120,8 +120,7 @@ jobs: # Once everything gets fixed, lychee could simply run on '/website/**/*.html' FILES="$( find build/website/ -name '*.html' | - grep -v /kdoc/ | - grep -v /javadoc/ | + grep -v /kdoc-modules/ | grep -v /tags/ | sed -e 's#^build##' )" @@ -132,7 +131,7 @@ jobs: for attempt in $(seq 1 5); do echo "Attempt $attempt/5" docker run --rm -v "$(pwd)/build/website:/website" -e GITHUB_TOKEN lycheeverse/lychee:0.10.3 $(echo "$FILES") --exclude-file /website/lycheeignore -m 100 --accept 403,429,500,502,503 && break - if [ "$attempt" = "${{ inputs.retries-on-failure}}" ]; then false; else sleep 120; fi + if [ "$attempt" = "5" ]; then exit 1; else sleep 120; fi done # Create a staging repository on Central @@ -214,7 +213,7 @@ jobs: ./gradlew\ ${{ needs.ci-preparation.outputs.force-version }}\ -PstagingRepositoryId=${{ needs.staging-repo.outputs.repo-id }}\ - uploadKotlinOSSRH uploadKotlinMultiplatform uploadJvm uploadJs close --parallel || \ + uploadOSSRH uploadKotlinMultiplatform uploadJvm uploadJs close --parallel || \ # # Drop the staging repository if the build is not a release # diff --git a/.idea/copyright/Alchemist.xml b/.idea/copyright/Alchemist.xml index 7ff7bbd1b6..52362ffef9 100644 --- a/.idea/copyright/Alchemist.xml +++ b/.idea/copyright/Alchemist.xml @@ -1,5 +1,6 @@ + diff --git a/alchemist-api/build.gradle.kts b/alchemist-api/build.gradle.kts index 7dbfd28776..ac4f012b42 100644 --- a/alchemist-api/build.gradle.kts +++ b/alchemist-api/build.gradle.kts @@ -6,11 +6,16 @@ * GNU General Public License, with a linking exception, * as described in the file LICENSE in the Alchemist distribution's top directory. */ +plugins { + id("dokka-convention") + id("kotlin-jvm-convention") +} dependencies { api(libs.apache.commons.math3) api(libs.jool) api(libs.listset) + implementation(libs.kotlin.reflect) } publishing.publications { diff --git a/alchemist-cognitive-agents/build.gradle.kts b/alchemist-cognitive-agents/build.gradle.kts index c18822fd31..c0e8717d71 100644 --- a/alchemist-cognitive-agents/build.gradle.kts +++ b/alchemist-cognitive-agents/build.gradle.kts @@ -10,13 +10,9 @@ import Libs.alchemist import Libs.incarnation -/* - * Copyright (C) 2010-2019, Danilo Pianini and contributors listed in the main project's alchemist/build.gradle file. - * - * This file is part of Alchemist, and is distributed under the terms of the - * GNU General Public License, with a linking exception, - * as described in the file LICENSE in the Alchemist distribution's top directory. - */ +plugins { + id("kotlin-jvm-convention") +} dependencies { api(alchemist("api")) @@ -26,6 +22,7 @@ dependencies { implementation(alchemist("physics")) implementation(libs.jgrapht.core) implementation(libs.konf) + implementation(libs.kotlin.reflect) testImplementation(alchemist("test")) testImplementation(incarnation("protelis")) diff --git a/alchemist-engine/build.gradle.kts b/alchemist-engine/build.gradle.kts index 26d34a2d6b..34fed3768f 100644 --- a/alchemist-engine/build.gradle.kts +++ b/alchemist-engine/build.gradle.kts @@ -6,17 +6,12 @@ * GNU General Public License, with a linking exception, * as described in the file LICENSE in the Alchemist distribution's top directory. */ - import Libs.alchemist import Libs.incarnation -/* - * Copyright (C) 2010-2019, Danilo Pianini and contributors listed in the main project"s alchemist/build.gradle file. - * - * This file is part of Alchemist, and is distributed under the terms of the - * GNU General Public License, with a linking exception, - * as described in the file LICENSE in the Alchemist distribution"s top directory. - */ +plugins { + id("kotlin-jvm-convention") +} dependencies { api(alchemist("api")) diff --git a/alchemist-euclidean-geometry/build.gradle.kts b/alchemist-euclidean-geometry/build.gradle.kts index 6fef135396..8fd5b458fb 100644 --- a/alchemist-euclidean-geometry/build.gradle.kts +++ b/alchemist-euclidean-geometry/build.gradle.kts @@ -10,13 +10,9 @@ import Libs.alchemist import Libs.incarnation -/* - * Copyright (C) 2010-2019) Danilo Pianini and contributors listed in the main project"s alchemist/build.gradle file. - * - * This file is part of Alchemist) and is distributed under the terms of the - * GNU General Public License) with a linking exception) - * as described in the file LICENSE in the Alchemist distribution"s top directory. - */ +plugins { + id("kotlin-jvm-convention") +} dependencies { api(alchemist("api")) diff --git a/alchemist-full/build.gradle.kts b/alchemist-full/build.gradle.kts index bdd2282fc2..7e25084f55 100644 --- a/alchemist-full/build.gradle.kts +++ b/alchemist-full/build.gradle.kts @@ -25,6 +25,7 @@ import java.nio.charset.StandardCharsets import java.security.MessageDigest plugins { + id("kotlin-jvm-convention") application alias(libs.plugins.jpackage) alias(libs.plugins.shadowJar) @@ -36,66 +37,22 @@ buildscript { } } -kotlin { - jvm { - withJava() - } - sourceSets { - val commonMain by getting { - dependencies { - runtimeOnly(rootProject) - rootProject.subprojects.filterNot { it == project }.forEach { - runtimeOnly(it) - } - } - } - val jvmMain by getting { - dependencies { - implementation(rootProject.libs.slf4j) - } - } - val commonTest by getting { - dependencies { - implementation(rootProject) - implementation(alchemist("loading")) - implementation(alchemist("physics")) - implementation(alchemist("test")) - implementation(rootProject.libs.kotest.assertions.core) - implementation(rootProject.libs.kotest.framework.engine) - } - } - val jvmTest by getting { - dependencies { - implementation(libs.kotest.runner) - } - } +dependencies { + runtimeOnly(rootProject) + rootProject.subprojects.filterNot { it == project }.forEach { + runtimeOnly(it) + dokka(it) } + testImplementation(rootProject.libs.slf4j) + testImplementation(rootProject) + testImplementation(alchemist("loading")) + testImplementation(alchemist("physics")) } -/** - * @return a [FileCollection] containing the classpath of the multiplatform JVM projects. - * If unspecified, the classpath is not correctly built when including common code from MP dependencies, - * resulting in runtime errors. - */ -private fun mpClasspath(): Provider = - tasks - .named("compileKotlinJvm") - .map { it.outputs.files } - .flatMap { compileKtOutputs -> - configurations.named("jvmRuntimeClasspath").map { compileKtOutputs + it } - } - application { mainClass.set("it.unibo.alchemist.Alchemist") } -/** - * Add the runtime classpath of the multiplatform JVM projects to the run task - */ -tasks.run.configure { - classpath += mpClasspath().get() -} - // Shadow Jar tasks.withType { manifest { @@ -119,7 +76,6 @@ tasks.withType { "gradlew.bat", "gradlew", ) - from(mpClasspath()) isZip64 = true mergeServiceFiles() destinationDirectory.set(rootProject.layout.buildDirectory.map { it.dir("shadow") }) diff --git a/alchemist-full/src/jvmTest/kotlin/it/unibo/alchemist/TestLaunchViaMain.kt b/alchemist-full/src/test/kotlin/it/unibo/alchemist/TestLaunchViaMain.kt similarity index 100% rename from alchemist-full/src/jvmTest/kotlin/it/unibo/alchemist/TestLaunchViaMain.kt rename to alchemist-full/src/test/kotlin/it/unibo/alchemist/TestLaunchViaMain.kt diff --git a/alchemist-full/src/jvmTest/kotlin/it/unibo/alchemist/model/actions/TestRemoveNode.kt b/alchemist-full/src/test/kotlin/it/unibo/alchemist/model/actions/TestRemoveNode.kt similarity index 100% rename from alchemist-full/src/jvmTest/kotlin/it/unibo/alchemist/model/actions/TestRemoveNode.kt rename to alchemist-full/src/test/kotlin/it/unibo/alchemist/model/actions/TestRemoveNode.kt diff --git a/alchemist-full/src/jvmTest/kotlin/it/unibo/alchemist/model/environments/LoggingEnvironment.kt b/alchemist-full/src/test/kotlin/it/unibo/alchemist/model/environments/LoggingEnvironment.kt similarity index 100% rename from alchemist-full/src/jvmTest/kotlin/it/unibo/alchemist/model/environments/LoggingEnvironment.kt rename to alchemist-full/src/test/kotlin/it/unibo/alchemist/model/environments/LoggingEnvironment.kt diff --git a/alchemist-full/src/jvmTest/resources/logging.yml b/alchemist-full/src/test/resources/logging.yml similarity index 100% rename from alchemist-full/src/jvmTest/resources/logging.yml rename to alchemist-full/src/test/resources/logging.yml diff --git a/alchemist-full/src/jvmTest/resources/org/protelis/tutorial/distanceTo.pt b/alchemist-full/src/test/resources/org/protelis/tutorial/distanceTo.pt similarity index 100% rename from alchemist-full/src/jvmTest/resources/org/protelis/tutorial/distanceTo.pt rename to alchemist-full/src/test/resources/org/protelis/tutorial/distanceTo.pt diff --git a/alchemist-full/src/jvmTest/resources/remove.yml b/alchemist-full/src/test/resources/remove.yml similarity index 100% rename from alchemist-full/src/jvmTest/resources/remove.yml rename to alchemist-full/src/test/resources/remove.yml diff --git a/alchemist-full/src/jvmTest/resources/simulation.yml b/alchemist-full/src/test/resources/simulation.yml similarity index 100% rename from alchemist-full/src/jvmTest/resources/simulation.yml rename to alchemist-full/src/test/resources/simulation.yml diff --git a/alchemist-graphql-surrogates/build.gradle.kts b/alchemist-graphql-surrogates/build.gradle.kts index ad33d853ef..825e6d1ce5 100644 --- a/alchemist-graphql-surrogates/build.gradle.kts +++ b/alchemist-graphql-surrogates/build.gradle.kts @@ -12,6 +12,7 @@ import com.expediagroup.graphql.plugin.gradle.tasks.AbstractGenerateClientTask import org.jetbrains.kotlin.gradle.tasks.KotlinCompile plugins { + id("kotlin-jvm-convention") alias(libs.plugins.graphql.server) } diff --git a/alchemist-graphql/build.gradle.kts b/alchemist-graphql/build.gradle.kts index 1190ccde68..732b6d9958 100644 --- a/alchemist-graphql/build.gradle.kts +++ b/alchemist-graphql/build.gradle.kts @@ -15,6 +15,7 @@ import com.expediagroup.graphql.plugin.gradle.tasks.AbstractGenerateClientTask import java.io.File.separator plugins { + id("kotlin-multiplatform-convention") alias(libs.plugins.kotest.multiplatform) alias(libs.plugins.kotlin.serialization) alias(libs.plugins.graphql.server) @@ -22,10 +23,14 @@ plugins { } kotlin { - jvm { withJava() } - js(IR) { - browser() - binaries.executable() + jvm() + js { + browser { + binaries.library() + } + nodejs { + binaries.library() + } } sourceSets { val commonMain by getting { @@ -104,6 +109,7 @@ val surrogates = project(":${project.name}-surrogates") apollo { service(name) { generateKotlinModels.set(true) + generateSourcesDuringGradleSync.set(true) packageName.set("it.unibo.alchemist.boundary.graphql.client") schemaFiles.from(surrogates.layout.buildDirectory.file("schema.graphql")) srcDir("src/commonMain/resources/graphql") diff --git a/alchemist-grid/build.gradle.kts b/alchemist-grid/build.gradle.kts index a05aac7639..ffa6979c64 100644 --- a/alchemist-grid/build.gradle.kts +++ b/alchemist-grid/build.gradle.kts @@ -10,13 +10,9 @@ import Libs.alchemist import Libs.incarnation -/* - * Copyright (C) 2010-2019, Danilo Pianini and contributors listed in the main project"s alchemist/build.gradle file. - * - * This file is part of Alchemist, and is distributed under the terms of the - * GNU General Public License, with a linking exception, - * as described in the file LICENSE in the Alchemist distribution"s top directory. - */ +plugins { + id("kotlin-jvm-convention") +} dependencies { api(libs.ignite.core) diff --git a/alchemist-implementationbase/build.gradle.kts b/alchemist-implementationbase/build.gradle.kts index f4d6088fc8..303eb74e14 100644 --- a/alchemist-implementationbase/build.gradle.kts +++ b/alchemist-implementationbase/build.gradle.kts @@ -6,16 +6,11 @@ * GNU General Public License, with a linking exception, * as described in the file LICENSE in the Alchemist distribution's top directory. */ - import Libs.alchemist -/* - * Copyright (C) 2010-2019) Danilo Pianini and contributors listed in the main project"s alchemist/build.gradle file. - * - * This file is part of Alchemist) and is distributed under the terms of the - * GNU General Public License) with a linking exception) - * as described in the file LICENSE in the Alchemist distribution"s top directory. - */ +plugins { + id("kotlin-jvm-convention") +} dependencies { api(alchemist("api")) @@ -24,6 +19,7 @@ dependencies { api(libs.apache.commons.lang3) api(libs.quadtree) + implementation(libs.kotlin.reflect) implementation(libs.boilerplate) implementation(libs.caffeine) implementation(libs.classgraph) diff --git a/alchemist-incarnation-biochemistry/build.gradle.kts b/alchemist-incarnation-biochemistry/build.gradle.kts index 505236751a..5bb285eee7 100644 --- a/alchemist-incarnation-biochemistry/build.gradle.kts +++ b/alchemist-incarnation-biochemistry/build.gradle.kts @@ -10,23 +10,16 @@ import Libs.alchemist import Util.allVerificationTasks import io.gitlab.arturbosch.detekt.Detekt -import org.jetbrains.dokka.gradle.DokkaCollectorTask -import org.jetbrains.dokka.gradle.DokkaTask -import org.jetbrains.dokka.gradle.DokkaTaskPartial +import org.gradle.jvm.tasks.Jar +import org.jetbrains.dokka.gradle.tasks.DokkaBaseTask +import org.jetbrains.kotlin.gradle.tasks.KotlinCompilationTask import org.jetbrains.kotlin.gradle.tasks.KotlinCompile import org.jlleitschuh.gradle.ktlint.tasks.KtLintCheckTask import org.jlleitschuh.gradle.ktlint.tasks.KtLintFormatTask -/* - * Copyright (C) 2010-2019, Danilo Pianini and contributors listed in the main project"s alchemist/build.gradle file. - * - * This file is part of Alchemist, and is distributed under the terms of the - * GNU General Public License, with a linking exception, - * as described in the file LICENSE in the Alchemist distribution"s top directory. - */ - plugins { antlr + id("kotlin-jvm-convention") } dependencies { @@ -65,24 +58,22 @@ tasks.generateGrammarSource.configure { arguments = arguments + listOf("-visitor", "-package", destination, "-long-messages") } -tasks.sourcesJar.configure { dependsOn(tasks.generateGrammarSource) } -tasks.withType().configureEach { dependsOn(tasks.generateGrammarSource) } tasks.generateTestGrammarSource { enabled = false } +// Ensure that the grammar is generated before any task that needs it tasks { - val needGrammarGeneration = - listOf( - rootProject.tasks.withType(), - withType(), - withType(), - withType(), - withType(), - withType(), - withType(), - ) - needGrammarGeneration.forEach { + listOf( + withType(), + withType(), + withType(), + withType(), + withType>(), + withType(), + withType(), + withType(), + ).forEach { it.configureEach { dependsOn(generateGrammarSource) } } } diff --git a/alchemist-incarnation-biochemistry/src/main/kotlin/it/unibo/alchemist/model/biochemistry/CellProperty.kt b/alchemist-incarnation-biochemistry/src/main/kotlin/it/unibo/alchemist/model/biochemistry/CellProperty.kt index 8f3fd42d20..77073137b7 100644 --- a/alchemist-incarnation-biochemistry/src/main/kotlin/it/unibo/alchemist/model/biochemistry/CellProperty.kt +++ b/alchemist-incarnation-biochemistry/src/main/kotlin/it/unibo/alchemist/model/biochemistry/CellProperty.kt @@ -97,7 +97,7 @@ interface CellProperty

> : NodeProperty { fun getAllNodesLinkWithJunction(): Set> = junctions.values.flatMap { it.keys }.toSet() /** - * The total number of junctions presents in this [node]. + * The total number of junctions in this [node]. */ val junctionsCount: Int get() = junctions.values.flatMap { it.values }.sum() diff --git a/alchemist-incarnation-protelis/build.gradle.kts b/alchemist-incarnation-protelis/build.gradle.kts index 3c078b8d75..3286a1e7c2 100644 --- a/alchemist-incarnation-protelis/build.gradle.kts +++ b/alchemist-incarnation-protelis/build.gradle.kts @@ -1,3 +1,5 @@ +import Libs.alchemist + /* * Copyright (C) 2010-2022, Danilo Pianini and contributors * listed, for each module, in the respective subproject's build.gradle.kts file. @@ -7,15 +9,9 @@ * as described in the file LICENSE in the Alchemist distribution's top directory. */ -import Libs.alchemist - -/* - * Copyright (C) 2010-2019, Danilo Pianini and contributors listed in the main(project"s alchemist/build.gradle file. - * - * This file is part of Alchemist, and is distributed under the terms of the - * GNU General Public License, with a linking exception, - * as described in the file LICENSE in the Alchemist distribution"s top directory. - */ +plugins { + id("kotlin-jvm-convention") +} dependencies { // API diff --git a/alchemist-incarnation-sapere/build.gradle.kts b/alchemist-incarnation-sapere/build.gradle.kts index 2a133a58a0..129508c494 100644 --- a/alchemist-incarnation-sapere/build.gradle.kts +++ b/alchemist-incarnation-sapere/build.gradle.kts @@ -9,13 +9,9 @@ import Libs.alchemist -/* - * Copyright (C) 2010-2019, Danilo Pianini and contributors listed in the main project"s alchemist/build.gradle file. - * - * This file is part of Alchemist, and is distributed under the terms of the - * GNU General Public License, with a linking exception, - * as described in the file LICENSE in the Alchemist distribution"s top directory. - */ +plugins { + id("kotlin-jvm-convention") +} dependencies { api(alchemist("api")) diff --git a/alchemist-incarnation-scafi/build.gradle.kts b/alchemist-incarnation-scafi/build.gradle.kts index 925db5cb34..86e5280661 100644 --- a/alchemist-incarnation-scafi/build.gradle.kts +++ b/alchemist-incarnation-scafi/build.gradle.kts @@ -23,14 +23,18 @@ plugins { } dependencies { - api(alchemist("api")) - api(libs.scafi.core) + compileOnly(libs.spotbugs.annotations) + implementation(alchemist("api")) + implementation(alchemist("euclidean-geometry")) implementation(alchemist("implementationbase")) implementation(alchemist("physics")) + implementation(libs.scafi.core) + implementation(libs.resourceloader) implementation(libs.bundles.scala) implementation(libs.bundles.scalacache) + testCompileOnly(libs.spotbugs.annotations) testImplementation(alchemist("engine")) testImplementation(alchemist("loading")) testImplementation(libs.bundles.scalatest) diff --git a/alchemist-loading/build.gradle.kts b/alchemist-loading/build.gradle.kts index d96f39e1fb..3f2c0269a9 100644 --- a/alchemist-loading/build.gradle.kts +++ b/alchemist-loading/build.gradle.kts @@ -17,6 +17,10 @@ import Libs.incarnation * GNU General Public License) with a linking exception) * as described in the file LICENSE in the Alchemist distribution"s top directory. */ +plugins { + id("kotlin-jvm-convention") +} + dependencies { api(alchemist("api")) api(alchemist("implementationbase")) @@ -32,6 +36,7 @@ dependencies { implementation(libs.guava) implementation(libs.jirf) implementation(libs.kasechange) + implementation(libs.kotlin.reflect) implementation(libs.kotlin.coroutines.core) implementation(libs.mongodb) implementation(libs.snakeyaml) diff --git a/alchemist-loading/src/test/kotlin/it/unibo/alchemist/jakta/timedistributions/JaktaTimeDistribution.kt b/alchemist-loading/src/test/kotlin/it/unibo/alchemist/jakta/timedistributions/JaktaTimeDistribution.kt index e4e56f94c8..ac8ac79b59 100644 --- a/alchemist-loading/src/test/kotlin/it/unibo/alchemist/jakta/timedistributions/JaktaTimeDistribution.kt +++ b/alchemist-loading/src/test/kotlin/it/unibo/alchemist/jakta/timedistributions/JaktaTimeDistribution.kt @@ -40,4 +40,6 @@ data class JaktaTimeDistribution( "${this::class.simpleName} is not meant to be used directly, but to host custom time distributions" + " for the sense, deliberate, and act phases of the JaKtA lifecycle.", ) + + override fun toString(): String = "JaktaTimeDistribution(sense=$sense, deliberate=$deliberate, act=$act)" } diff --git a/alchemist-maintenance-tooling/build.gradle.kts b/alchemist-maintenance-tooling/build.gradle.kts index 5ce0d5d6e2..3f4c8c4c13 100644 --- a/alchemist-maintenance-tooling/build.gradle.kts +++ b/alchemist-maintenance-tooling/build.gradle.kts @@ -6,3 +6,17 @@ * GNU General Public License, with a linking exception, * as described in the file LICENSE in the Alchemist distribution's top directory. */ +plugins { + id("kotlin-multiplatform-convention") +} + +kotlin { + js { + browser { + binaries.library() + } + nodejs { + binaries.library() + } + } +} diff --git a/alchemist-maintenance-tooling/src/main/kotlin/it/unibo/alchemist/util/BugReporting.kt b/alchemist-maintenance-tooling/src/commonMain/kotlin/it/unibo/alchemist/util/BugReporting.kt similarity index 92% rename from alchemist-maintenance-tooling/src/main/kotlin/it/unibo/alchemist/util/BugReporting.kt rename to alchemist-maintenance-tooling/src/commonMain/kotlin/it/unibo/alchemist/util/BugReporting.kt index 1a31044334..d89fbe4627 100644 --- a/alchemist-maintenance-tooling/src/main/kotlin/it/unibo/alchemist/util/BugReporting.kt +++ b/alchemist-maintenance-tooling/src/commonMain/kotlin/it/unibo/alchemist/util/BugReporting.kt @@ -9,6 +9,9 @@ package it.unibo.alchemist.util +import kotlin.jvm.JvmOverloads +import kotlin.jvm.JvmStatic + /** * Entrypoint for printing meaningful debug information in case of failed internal consistency checks. */ @@ -36,7 +39,7 @@ object BugReporting { private fun Map.debugReport(): String = asIterable() - .joinToString(System.lineSeparator()) { (name, value) -> + .joinToString("\n") { (name, value) -> "$name => ${value?.let { "$it --- type: ${it::class.simpleName}" } ?: "null" }" } } diff --git a/alchemist-maps/build.gradle.kts b/alchemist-maps/build.gradle.kts index fad7babf46..0b45f11e5f 100644 --- a/alchemist-maps/build.gradle.kts +++ b/alchemist-maps/build.gradle.kts @@ -10,13 +10,9 @@ import Libs.alchemist import Libs.incarnation -/* - * Copyright (C) 2010-2019) Danilo Pianini and contributors listed in the main project"s alchemist/build.gradle file. - * - * This file is part of Alchemist) and is distributed under the terms of the - * GNU General Public License) with a linking exception) - * as described in the file LICENSE in the Alchemist distribution"s top directory. - */ +plugins { + id("kotlin-jvm-convention") +} dependencies { api(alchemist("api")) diff --git a/alchemist-multivesta-adapter/build.gradle.kts b/alchemist-multivesta-adapter/build.gradle.kts index 2ac7e3edd9..9d91971a95 100644 --- a/alchemist-multivesta-adapter/build.gradle.kts +++ b/alchemist-multivesta-adapter/build.gradle.kts @@ -1,5 +1,18 @@ +/* + * Copyright (C) 2010-2024, Danilo Pianini and contributors + * listed, for each module, in the respective subproject's build.gradle.kts file. + * + * This file is part of Alchemist, and is distributed under the terms of the + * GNU General Public License, with a linking exception, + * as described in the file LICENSE in the Alchemist distribution's top directory. + */ + import Libs.alchemist +plugins { + id("kotlin-jvm-convention") +} + dependencies { implementation(rootProject) implementation(alchemist("loading")) diff --git a/alchemist-physics/build.gradle.kts b/alchemist-physics/build.gradle.kts index 812f363874..a2a01bad46 100644 --- a/alchemist-physics/build.gradle.kts +++ b/alchemist-physics/build.gradle.kts @@ -9,14 +9,9 @@ import Libs.alchemist -/* - * Copyright (C) 2010-2020, Danilo Pianini and contributors - * listed in the main project's alchemist/build.gradle.kts file. - * - * This file is part of Alchemist, and is distributed under the terms of the - * GNU General Public License, with a linking exception, - * as described in the file LICENSE in the Alchemist distribution's top directory. - */ +plugins { + id("kotlin-jvm-convention") +} dependencies { api(alchemist("api")) diff --git a/alchemist-sapere-mathexp/build.gradle.kts b/alchemist-sapere-mathexp/build.gradle.kts index 7dd1c509de..f693c39a64 100644 --- a/alchemist-sapere-mathexp/build.gradle.kts +++ b/alchemist-sapere-mathexp/build.gradle.kts @@ -10,6 +10,10 @@ import com.github.spotbugs.snom.SpotBugsTask import de.aaschmid.gradle.plugins.cpd.Cpd +plugins { + id("kotlin-jvm-convention") +} + dependencies { implementation(libs.boilerplate) } diff --git a/alchemist-smartcam/build.gradle.kts b/alchemist-smartcam/build.gradle.kts index ab72fe360c..0f432bbdb9 100644 --- a/alchemist-smartcam/build.gradle.kts +++ b/alchemist-smartcam/build.gradle.kts @@ -10,6 +10,10 @@ import Libs.alchemist import Libs.incarnation +plugins { + id("kotlin-jvm-convention") +} + dependencies { api(alchemist("api")) diff --git a/alchemist-swingui/build.gradle.kts b/alchemist-swingui/build.gradle.kts index 8fda0463ee..d445f7de91 100644 --- a/alchemist-swingui/build.gradle.kts +++ b/alchemist-swingui/build.gradle.kts @@ -10,13 +10,9 @@ import Libs.alchemist import Libs.incarnation -/* - * Copyright (C) 2010-2019) Danilo Pianini and contributors listed in the main project"s alchemist/build.gradle file. - * - * This file is part of Alchemist) and is distributed under the terms of the - * GNU General Public License) with a linking exception) - * as described in the file LICENSE in the Alchemist distribution"s top directory. - */ +plugins { + id("kotlin-jvm-convention") +} dependencies { api(alchemist("api")) @@ -59,9 +55,9 @@ configurations.all { } } -tasks.javadoc { - isFailOnError = true -} +// tasks.javadoc { +// isFailOnError = true +// } publishing.publications { withType { diff --git a/alchemist-test/build.gradle.kts b/alchemist-test/build.gradle.kts index 0882fb62b5..1fb653fa15 100644 --- a/alchemist-test/build.gradle.kts +++ b/alchemist-test/build.gradle.kts @@ -18,13 +18,19 @@ import Libs.alchemist * as described in the file LICENSE in the Alchemist distribution's top directory. */ +plugins { + id("kotlin-jvm-convention") +} + dependencies { api(alchemist("api")) api(alchemist("engine")) api(alchemist("loading")) + api(libs.bundles.testing.compile) + implementation(alchemist("euclidean-geometry")) implementation(alchemist("implementationbase")) implementation(alchemist("physics")) - testImplementation(alchemist("test")) + runtimeOnly(libs.bundles.testing.runtimeOnly) } publishing.publications { diff --git a/alchemist-ui-tooling/build.gradle.kts b/alchemist-ui-tooling/build.gradle.kts index 9cb4dd24c1..2a18b96da3 100644 --- a/alchemist-ui-tooling/build.gradle.kts +++ b/alchemist-ui-tooling/build.gradle.kts @@ -1,14 +1,19 @@ -import Libs.alchemist -import Libs.incarnation - /* - * Copyright (C) 2010-2019) Danilo Pianini and contributors listed in the main project"s alchemist/build.gradle file. + * Copyright (C) 2010-2024, Danilo Pianini and contributors + * listed, for each module, in the respective subproject's build.gradle.kts file. * - * This file is part of Alchemist) and is distributed under the terms of the - * GNU General Public License) with a linking exception) - * as described in the file LICENSE in the Alchemist distribution"s top directory. + * This file is part of Alchemist, and is distributed under the terms of the + * GNU General Public License, with a linking exception, + * as described in the file LICENSE in the Alchemist distribution's top directory. */ +import Libs.alchemist +import Libs.incarnation + +plugins { + id("kotlin-jvm-convention") +} + dependencies { api(alchemist("physics")) implementation(rootProject) diff --git a/alchemist-web-renderer/build.gradle.kts b/alchemist-web-renderer/build.gradle.kts index 1cfd9a71b1..5ce08153c2 100644 --- a/alchemist-web-renderer/build.gradle.kts +++ b/alchemist-web-renderer/build.gradle.kts @@ -11,18 +11,19 @@ import Libs.alchemist import Libs.incarnation plugins { + id("kotlin-multiplatform-convention") alias(libs.plugins.kotlin.serialization) alias(libs.plugins.kotest.multiplatform) } kotlin { - jvm { - withJava() - } - js(IR) { + js { browser { binaries.executable() } + nodejs { + binaries.executable() + } } sourceSets { val commonMain by getting { diff --git a/build.gradle.kts b/build.gradle.kts index d80936b70d..e5e002210c 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -10,29 +10,20 @@ import Libs.alchemist import Libs.incarnation import Util.allVerificationTasks -import Util.currentCommitHash -import Util.fetchJavadocIOForDependency import Util.id import Util.isInCI import Util.isMac -import Util.isMultiplatform import Util.isWindows import com.github.spotbugs.snom.SpotBugsTask -import org.danilopianini.gradle.mavencentral.JavadocJar import org.gradle.api.tasks.testing.logging.TestExceptionFormat -import org.jetbrains.dokka.gradle.AbstractDokkaLeafTask -import org.jetbrains.dokka.gradle.AbstractDokkaParentTask import org.jetbrains.dokka.gradle.AbstractDokkaTask -import org.jetbrains.dokka.gradle.DokkaCollectorTask -import org.jetbrains.kotlin.gradle.tasks.KotlinCompile -import java.time.Duration +import org.jetbrains.dokka.gradle.tasks.DokkaBaseTask +import java.io.FileFilter plugins { - alias(libs.plugins.dokka) + id("kotlin-jvm-convention") alias(libs.plugins.gitSemVer) alias(libs.plugins.java.qa) - alias(libs.plugins.kotlin.multiplatform) apply false - alias(libs.plugins.kotlin.jvm) alias(libs.plugins.kotlin.qa) alias(libs.plugins.multiJvmTesting) alias(libs.plugins.publishOnCentral) @@ -45,12 +36,6 @@ val minJavaVersion: String by properties allprojects { with(rootProject.libs.plugins) { - if (project.isMultiplatform) { - apply(plugin = kotlin.multiplatform.id) - } else { - apply(plugin = kotlin.jvm.id) - } - apply(plugin = dokka.id) apply(plugin = gitSemVer.id) apply(plugin = java.qa.id) apply(plugin = multiJvmTesting.id) @@ -73,126 +58,22 @@ allprojects { repositories { google() mavenCentral() - // for tornadofx 2.0.0 snapshot release - maven { - url = uri("https://oss.sonatype.org/content/repositories/snapshots") - content { - includeGroup("no.tornado") - } - } } - // JVM PROJECTS CONFIGURATIONS - - if (!project.isMultiplatform) { - dependencies { - with(rootProject.libs) { - compileOnly(spotbugs.annotations) - implementation(resourceloader) - implementation(slf4j) - implementation(kotlin("stdlib-jdk8")) - implementation(kotlin("reflect")) - testCompileOnly(spotbugs.annotations) - // Test implementation: JUnit 5 + Kotest + Mockito + Mockito-Kt + Alchemist testing tooling - testImplementation(bundles.testing.compile) - testImplementation(alchemist("test")) - // Test runtime: Junit engine - testRuntimeOnly(bundles.testing.runtimeOnly) - // executable jar packaging - } - if ("incarnation" in project.name) { - runtimeOnly(rootProject) - } + javaQA { + checkstyle { + additionalConfiguration.set(rootProject.file("checkstyle-additional-config.xml").readText()) + additionalSuppressions.set( + """ + + + """.trimIndent(), + ) } - - javaQA { - checkstyle { - additionalConfiguration.set(rootProject.file("checkstyle-additional-config.xml").readText()) - additionalSuppressions.set( - """ - - - """.trimIndent(), - ) - } - // TODO: enable PMD when this bug is fixed: https://github.com/pmd/pmd/issues/5096 - tasks.withType().configureEach { - enabled = false - } - } - - tasks.withType().configureEach { - timeout.set(Duration.ofMinutes(5)) - dokkaSourceSets.configureEach { - jdkVersion.set(multiJvm.jvmVersionForCompilation) - listOf("kotlin", "java") - .flatMap { listOf("main/$it", "commonMain/$it", "jsMain/$it", "jvmMain/$it") } - .map { "src/$it" } - .associateWith { File(projectDir, it) } - .filterValues { it.exists() } - .forEach { (path, file) -> - sourceLink { - localDirectory.set(file) - val project = if (project == rootProject) "" else project.name - val url = "https://github.com/AlchemistSimulator/Alchemist/${ - currentCommitHash?.let { "tree/$it" } ?: "blob/master" - }/$project/$path" - remoteUrl.set(uri(url).toURL()) - remoteLineSuffix.set("#L") - } - } - configurations - .run { sequenceOf(api, implementation) } - .flatMap { it.get().dependencies } - .forEach { dependency -> - val javadocIOURLs = fetchJavadocIOForDependency(dependency) - if (javadocIOURLs != null) { - val (javadoc, packageList) = javadocIOURLs - externalDocumentationLink { - url.set(javadoc.toURL()) - packageListUrl.set(packageList.toURL()) - } - } - } - } - failOnWarning.set(true) - } - } - - // MULTIPLATFORM PROJECTS CONFIGURATIONS - - if (project.isMultiplatform) { - tasks.dokkaJavadoc { + // TODO: enable PMD when this bug is fixed: https://github.com/pmd/pmd/issues/5096 + tasks.withType().configureEach { enabled = false } - tasks.withType().configureEach { - val dokka = tasks.dokkaHtml.get() - dependsOn(dokka) - from(dokka.outputDirectory) - } - /* - * This is a workaround for the following Gradle error, - * and should be removed as soon as possible. - * - * * What went wrong: - * Execution failed for task ':dokkaHtmlCollector'. - * > Could not determine the dependencies of null. - * > Current thread does not hold the state lock for project ':alchemist-web-renderer' - */ - val dokkaHtmlCollector by rootProject.tasks.named("dokkaHtmlCollector") - dokkaHtmlCollector.dependsOn(tasks.dokkaHtml) - } - - // COMPILE - - tasks.withType().configureEach { - options.encoding = "UTF-8" - } - - tasks.withType().configureEach { - compilerOptions { - freeCompilerArgs.add("-Xjvm-default=all") // Enable default methods in Kt interfaces - } } // TEST AND COVERAGE @@ -270,11 +151,6 @@ allprojects { } } } - - // Disable distribution tasks that just clutter the build -// listOf(tasks.distZip, tasks.distTar).forEach { -// it.configure { enabled = false } -// } } /* @@ -299,14 +175,41 @@ dependencies { testRuntimeOnly(alchemist("physics")) } -tasks.named("kotlinStoreYarnLock").configure { - dependsOn("kotlinUpgradeYarnLock") +tasks.matching { it.name == "kotlinStoreYarnLock" }.configureEach { + dependsOn(rootProject.tasks.named("kotlinUpgradeYarnLock")) +} + +dokka { + dokkaSourceSets.register("alldocs") { + val submodules = + checkNotNull( + project.rootDir.listFiles(FileFilter { it.name.startsWith("alchemist-") }), + ) + val allSourceDirs = + submodules + .asSequence() + .map { it.resolve("src") } + .onEach { check(it.isDirectory) } + .flatMap { sourceFolder -> + sourceFolder + .listFiles(FileFilter { it.name.contains("main", ignoreCase = true) }) + .orEmpty() + .asSequence() + }.onEach { check(it.isDirectory) } + .flatMap { sourceSetFolder -> + sourceSetFolder + .listFiles(FileFilter { it.name in listOf("java", "kotlin") }) + .orEmpty() + .asSequence() + }.toList() + sourceRoots.setFrom(allSourceDirs) + } } // WEBSITE val websiteDir = - project.layout.buildDirectory + rootProject.layout.buildDirectory .map { it.dir("website").asFile } .get() @@ -318,84 +221,56 @@ hugo { .value } -tasks { - hugoBuild { - outputDirectory = websiteDir - } - -// Exclude the UI and Multiplatform packages from the collector documentation. - withType().configureEach { - /* - * Although the method is deprecated, no valid alternative has been implemented yet. - * Disabling individual partial tasks has been proven ineffective. - */ - removeChildTasks( - allprojects.filter { it.isMultiplatform } + - listOf( - alchemist("swingui"), - ), +fun Project.dokkaCopyTask(destination: String): Copy.() -> Unit = + { + dependsOn(tasks.withType()) + dependsOn(rootProject.tasks.hugoBuild) + from( + dokka.dokkaPublications.html + .get() + .outputDirectory, ) + into(File(websiteDir, "reference/$destination")) } - /** - * Use the alchemist logo in the documentation. - */ - val alchemistLogo = file("site/static/images/logo.svg") - for (docTaskProvider in listOf>(dokkaHtmlCollector, dokkaHtmlMultiModule)) { - val docTask = docTaskProvider.get() - val copyLogo = - register("copyLogoFor${ docTask.name.replaceFirstChar { it.titlecase() } }") { - from(alchemistLogo) - into(docTask.outputDirectory.map { File(it.asFile, "images") }) - rename("logo.svg", "logo-icon.svg") - } - docTask.finalizedBy(copyLogo) - hugoBuild.configure { mustRunAfter(copyLogo) } - } +val copyGlobalDokkaInTheWebsite by tasks.registering(Copy::class, dokkaCopyTask("kdoc")) +val copyModuleDokkaInTheWebsite by tasks.registering(Copy::class, alchemist("full").dokkaCopyTask("kdoc-modules")) + +tasks.hugoBuild.configure { + outputDirectory = websiteDir + finalizedBy(copyGlobalDokkaInTheWebsite, copyModuleDokkaInTheWebsite) +} - val performWebsiteStringReplacements by registering { +val performWebsiteStringReplacements by tasks.registering { + dependsOn(copyGlobalDokkaInTheWebsite, copyModuleDokkaInTheWebsite) + doLast { val index = File(websiteDir, "index.html") - mustRunAfter(hugoBuild) - if (!index.exists()) { - logger.lifecycle("${index.absolutePath} does not exist") - dependsOn(hugoBuild) + require(index.exists()) { + "file ${index.absolutePath} has been deleted." } - doLast { - require(index.exists()) { - "file ${index.absolutePath} existed during configuration, but it has been deleted." - } - val websiteReplacements = - file("site/replacements") - .readLines() - .map { it.split("->") } - .map { it[0] to it[1] } - val replacements: List> = - websiteReplacements + ("!development preview!" to project.version.toString()) - index.parentFile - .walkTopDown() - .filter { it.isFile && it.extension.matches(Regex("html?", RegexOption.IGNORE_CASE)) } - .forEach { page -> - val initialContents = page.readText() - var text = initialContents - for ((toreplace, replacement) in replacements) { - text = text.replace(toreplace, replacement) - } - if (initialContents != text) { - page.writeText(text) - } + val websiteReplacements = + file("site/replacements") + .readLines() + .map { it.split("->") } + .map { it[0] to it[1] } + val replacements: List> = + websiteReplacements + ("!development preview!" to project.version.toString()) + index.parentFile + .walkTopDown() + .filter { it.isFile && it.extension.matches(Regex("html?", RegexOption.IGNORE_CASE)) } + .forEach { page -> + val initialContents = page.readText() + var text = initialContents + for ((toreplace, replacement) in replacements) { + text = text.replace(toreplace, replacement) } - } + if (initialContents != text) { + page.writeText(text) + } + } } +} - mapOf("javadoc" to dokkaJavadocCollector, "kdoc" to dokkaHtmlMultiModule, "plainkdoc" to dokkaHtmlCollector) - .forEach { (folder, taskContainer) -> - hugoBuild.configure { dependsOn(taskContainer) } - val copyTask = - register("copy${folder.replaceFirstChar { it.titlecase() }}IntoWebsite") { - from(taskContainer.map { it.outputDirectory }) - into(File(websiteDir, "reference/$folder")) - finalizedBy(performWebsiteStringReplacements) - } - hugoBuild.configure { finalizedBy(copyTask) } - } +tasks.hugoBuild.configure { + finalizedBy(performWebsiteStringReplacements) } diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index cdfb38f792..638cd4ac4f 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -9,7 +9,10 @@ repositories { with(extensions.getByType().named("libs")) { dependencies { + implementation(findLibrary("dokka-gradle-plugin").get()) implementation(findLibrary("gson").get()) implementation(findLibrary("jgit").get()) + implementation(findLibrary("kotlin-multiplatform-plugin").get()) + implementation(findLibrary("kotlin-jvm-plugin").get()) } } diff --git a/buildSrc/src/main/kotlin/Util.kt b/buildSrc/src/main/kotlin/Util.kt index 122447db86..89c20d3134 100644 --- a/buildSrc/src/main/kotlin/Util.kt +++ b/buildSrc/src/main/kotlin/Util.kt @@ -14,6 +14,8 @@ import org.eclipse.jgit.api.Git import org.gradle.api.Project import org.gradle.api.artifacts.Dependency import org.gradle.api.artifacts.ExternalDependency +import org.gradle.api.artifacts.MinimalExternalModuleDependency +import org.gradle.api.artifacts.VersionCatalogsExtension import org.gradle.api.file.RegularFile import org.gradle.api.provider.Provider import org.gradle.api.tasks.Exec @@ -21,12 +23,15 @@ import org.gradle.api.tasks.SourceTask import org.gradle.api.tasks.TaskCollection import org.gradle.api.tasks.TaskContainer import org.gradle.api.tasks.VerificationTask +import org.gradle.kotlin.dsl.getByType import org.gradle.kotlin.dsl.register import org.gradle.kotlin.dsl.withType import org.gradle.plugin.use.PluginDependency import java.io.ByteArrayOutputStream import java.io.File import java.net.URI +import kotlin.properties.ReadOnlyProperty +import kotlin.reflect.KProperty /** * Collector of imperative code. @@ -148,3 +153,8 @@ object Util { val TaskContainer.allVerificationTasks get(): TaskCollection = this.withType().matching { it is VerificationTask } } + +val Project.catalog get() = object : ReadOnlyProperty> { + override operator fun getValue(thisRef: Any?, property: KProperty<*>) = + extensions.getByType().named("libs").findLibrary(property.name).get() +} diff --git a/buildSrc/src/main/kotlin/dokka-convention.gradle.kts b/buildSrc/src/main/kotlin/dokka-convention.gradle.kts new file mode 100644 index 0000000000..f38b86aafe --- /dev/null +++ b/buildSrc/src/main/kotlin/dokka-convention.gradle.kts @@ -0,0 +1,76 @@ +import Util.currentCommitHash +import Util.fetchJavadocIOForDependency +import org.jetbrains.dokka.gradle.AbstractDokkaLeafTask +import org.jetbrains.dokka.gradle.tasks.DokkaBaseTask +import java.time.Duration + +/* + * Copyright (C) 2010-2024, Danilo Pianini and contributors + * listed, for each module, in the respective subproject's build.gradle.kts file. + * + * This file is part of Alchemist, and is distributed under the terms of the + * GNU General Public License, with a linking exception, + * as described in the file LICENSE in the Alchemist distribution's top directory. + */ +plugins { + id("org.jetbrains.dokka") +} + +val minJavaVersion: String by properties + +dokka { + dokkaSourceSets.configureEach { + enableKotlinStdLibDocumentationLink.set(true) + enableJdkDocumentationLink.set(true) + jdkVersion.set(minJavaVersion.toInt()) + skipDeprecated.set(false) + skipEmptyPackages.set(true) + /* + * Source links to GitHub + */ + listOf("kotlin", "java") + .flatMap { listOf("main/$it", "commonMain/$it", "jsMain/$it", "jvmMain/$it") } + .map { "src/$it" } + .associateWith { File(projectDir, it) } + .filterValues { it.exists() } + .forEach { (path, file) -> + sourceLink { + localDirectory.set(file) + val project = if (project == rootProject) "" else project.name + val url = "https://github.com/AlchemistSimulator/Alchemist/${ + currentCommitHash?.let { "tree/$it" } ?: "blob/master" + }/$project/$path" + remoteUrl.set(uri(url)) + remoteLineSuffix.set("#L") + } + } + /* + * Javadoc.io links for external dependencies + */ + val configured = mutableSetOf() + configurations.configureEach { + val newDependencies = dependencies.withType() - configured + configured += newDependencies + newDependencies.forEach { dependency -> + val javadocIOURLs = fetchJavadocIOForDependency(dependency) + if (javadocIOURLs != null) { + val (javadoc, packageList) = javadocIOURLs + externalDocumentationLinks.register(dependency.name) { + url.set(javadoc) + packageListUrl.set(packageList) + } + } + } + } + pluginsConfiguration.html { + customAssets.from(rootProject.file("site/static/images/logo.svg")) + customStyleSheets.from(rootProject.file("site/logo-styles.css")) + footerMessage.set("(c) Danilo Pianini and contributors listed in the Alchemist build files") + homepageLink = "https://alchemistsimulator.github.io/" + } + } +} + +tasks.withType().configureEach { + timeout.set(Duration.ofMinutes(5)) +} diff --git a/buildSrc/src/main/kotlin/kotlin-jvm-convention.gradle.kts b/buildSrc/src/main/kotlin/kotlin-jvm-convention.gradle.kts new file mode 100644 index 0000000000..764bdfadaa --- /dev/null +++ b/buildSrc/src/main/kotlin/kotlin-jvm-convention.gradle.kts @@ -0,0 +1,50 @@ +import Libs.alchemist +import kotlin.properties.ReadOnlyProperty +import kotlin.reflect.KProperty + +/* + * Copyright (C) 2010-2024, Danilo Pianini and contributors + * listed, for each module, in the respective subproject's build.gradle.kts file. + * + * This file is part of Alchemist, and is distributed under the terms of the + * GNU General Public License, with a linking exception, + * as described in the file LICENSE in the Alchemist distribution's top directory. + */ +plugins { + kotlin("jvm") + id("dokka-convention") +} + +dependencies { + val jsr305 by catalog + val slf4j by catalog + val `spotbugs-annotations` by catalog + val resourceloader by catalog + + val alchemistApi = alchemist("api") + if (project != alchemistApi) { + api(alchemistApi) + } + + compileOnly(jsr305) + compileOnly(`spotbugs-annotations`) + + implementation(slf4j) + implementation(resourceloader) + + testCompileOnly(jsr305) + testCompileOnly(`spotbugs-annotations`) + + testImplementation(alchemist("test")) +} + +java { + withJavadocJar() + withSourcesJar() +} + +kotlin { + compilerOptions { + freeCompilerArgs.add("-Xjvm-default=all") // Enable default methods in Kt interfaces + } +} diff --git a/buildSrc/src/main/kotlin/kotlin-multiplatform-convention.gradle.kts b/buildSrc/src/main/kotlin/kotlin-multiplatform-convention.gradle.kts new file mode 100644 index 0000000000..a7228ade57 --- /dev/null +++ b/buildSrc/src/main/kotlin/kotlin-multiplatform-convention.gradle.kts @@ -0,0 +1,41 @@ +import Libs.alchemist +import org.jetbrains.kotlin.gradle.targets.js.ir.DefaultIncrementalSyncTask +import org.jetbrains.kotlin.gradle.targets.js.webpack.KotlinWebpack + +plugins { + kotlin("multiplatform") + id("dokka-convention") +} + +kotlin { + jvm { + compilerOptions { + freeCompilerArgs.add("-Xjvm-default=all") // Enable default methods in Kt interfaces + } + } + js { + browser() + nodejs() + } + sourceSets { + val commonTest by getting { + dependencies { + val `kotest-assertions-core` by catalog + val `kotest-framework-engine` by catalog + implementation(`kotest-assertions-core`) + implementation(`kotest-framework-engine`) + } + } + val jvmMain by getting { + dependencies { + implementation(alchemist("api")) + } + } + val jvmTest by getting { + dependencies { + val `kotest-runner` by catalog + implementation(`kotest-runner`) + } + } + } +} diff --git a/gradle.properties b/gradle.properties index d76630f3e5..39a1b925a8 100644 --- a/gradle.properties +++ b/gradle.properties @@ -15,3 +15,6 @@ org.gradle.caching=true org.gradle.jvmargs=-XX:MaxMetaspaceSize=2g -Xmx4g systemProp.org.gradle.internal.http.connectionTimeout=500000 systemProp.org.gradle.internal.http.socketTimeout=500000 + +org.jetbrains.dokka.experimental.gradle.pluginMode=V2Enabled +org.jetbrains.dokka.experimental.gradle.pluginMode.noWarn=true diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index eb0da59c88..d6f012a084 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -35,6 +35,7 @@ boilerplate = "org.danilopianini:boilerplate:0.2.2" caffeine = "com.github.ben-manes.caffeine:caffeine:3.1.8" classgraph = "io.github.classgraph:classgraph:4.8.179" conrec = "org.danilopianini:conrec:0.1.0" +dokka-gradle-plugin = { module = "org.jetbrains.dokka:dokka-gradle-plugin", version.ref = "dokka" } dyn4j = "org.dyn4j:dyn4j:5.0.2" dsiutils = "it.unimi.dsi:dsiutils:2.7.3" embedmongo = "de.flapdoodle.embed:de.flapdoodle.embed.mongo:4.18.1" @@ -58,6 +59,7 @@ jgrapht-core = "org.jgrapht:jgrapht-core:1.5.2" jirf = "org.danilopianini:jirf:0.4.27" jool = "org.jooq:jool:0.9.15" jpx = "io.jenetics:jpx:3.2.0" +jsr305 = "com.google.code.findbugs:jsr305:3.0.2" junit-api = { module = "org.junit.jupiter:junit-jupiter-api", version.ref = "junit" } junit-engine = { module = "org.junit.jupiter:junit-jupiter-engine", version.ref = "junit" } kasechange = "net.pearx.kasechange:kasechange:1.4.1" @@ -68,10 +70,13 @@ kotest-framework-engine = { module = "io.kotest:kotest-framework-engine", versio kotest-runner = { module = "io.kotest:kotest-runner-junit5-jvm", version.ref = "kotest" } kotlin-cli = "org.jetbrains.kotlinx:kotlinx-cli:0.3.6" kotlin-coroutines-core = "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0" +kotlin-jvm-plugin = { module = "org.jetbrains.kotlin.jvm:org.jetbrains.kotlin.jvm.gradle.plugin", version.ref = "kotlin" } +kotlin-multiplatform-plugin = { module = "org.jetbrains.kotlin.multiplatform:org.jetbrains.kotlin.multiplatform.gradle.plugin", version.ref = "kotlin" } kotlin-test-common = { module = "org.jetbrains.kotlin:kotlin-test-common", version.ref = "kotlin" } kotlin-test-annotations = { module = "org.jetbrains.kotlin:kotlin-test-annotations-common", version.ref = "kotlin" } kotlin-react = { module = "org.jetbrains.kotlin-wrappers:kotlin-react", version.ref = "react" } kotlin-react-dom = { module = "org.jetbrains.kotlin-wrappers:kotlin-react-dom", version.ref = "react" } +kotlin-reflect = { module = "org.jetbrains.kotlin:kotlin-reflect", version.ref = "kotlin" } kotlinx-serialization-json = "org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3" kotlin-stdlib = { module = "org.jetbrains.kotlin:kotlin-stdlib", version.ref = "kotlin" } ktor-client-core = { module = "io.ktor:ktor-client-core", version.ref = "ktor" } @@ -144,20 +149,17 @@ testing-compile = [ testing-runtimeOnly = [ "junit-engine" ] [plugins] -dokka = { id = "org.jetbrains.dokka", version.ref = "dokka" } gitSemVer = "org.danilopianini.git-sensitive-semantic-versioning-gradle-plugin:3.1.7" graphql-client = { id = "com.apollographql.apollo3", version.ref = "apollo" } graphql-server = { id = "com.expediagroup.graphql", version.ref = "graphql" } hugo = "io.github.fstaudt.hugo:0.9.0" java-qa = "org.danilopianini.gradle-java-qa:1.82.0" kotest-multiplatform = { id = "io.kotest.multiplatform", version.ref = "kotest" } -kotlin-multiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" } -kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" } kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" } kotlin-qa = "org.danilopianini.gradle-kotlin-qa:0.78.0" ktor = { id = "io.ktor.plugin", version.ref = "ktor" } multiJvmTesting = "org.danilopianini.multi-jvm-test-plugin:3.1.2" -publishOnCentral = "org.danilopianini.publish-on-central:7.0.4" +publishOnCentral = "org.danilopianini.publish-on-central:7.0.5-dev0o-80b434a" scalafmt = "cz.alenkacz.gradle.scalafmt:1.16.2" scalatest = "com.github.maiflai.scalatest:0.32" shadowJar = "com.github.johnrengelman.shadow:8.1.1" diff --git a/javadoc-io.json b/javadoc-io.json index a18e7086e3..ff95bca131 100644 --- a/javadoc-io.json +++ b/javadoc-io.json @@ -2,12 +2,30 @@ "ch.qos.logback/logback-classic/1.5.15": { "first": "https://javadoc.io/doc/ch.qos.logback/logback-classic/1.5.15" }, + "com.apollographql.apollo3/apollo-compiler/4.0.0-beta.7": { + "first": "https://javadoc.io/doc/com.apollographql.apollo3/apollo-compiler/4.0.0-beta.7" + }, + "com.apollographql.apollo3/apollo-runtime/4.0.0-beta.7": { + "first": "https://javadoc.io/doc/com.apollographql.apollo3/apollo-runtime/4.0.0-beta.7" + }, + "com.expediagroup/graphql-kotlin-client-generator/8.2.1": { + "first": "https://javadoc.io/doc/com.expediagroup/graphql-kotlin-client-generator/8.2.1" + }, + "com.expediagroup/graphql-kotlin-client/8.2.1": { + "first": "https://javadoc.io/doc/com.expediagroup/graphql-kotlin-client/8.2.1" + }, + "com.expediagroup/graphql-kotlin-graalvm-metadata-generator/8.2.1": { + "first": "https://javadoc.io/doc/com.expediagroup/graphql-kotlin-graalvm-metadata-generator/8.2.1" + }, "com.expediagroup/graphql-kotlin-hooks-provider/8.2.1": { "first": "https://javadoc.io/doc/com.expediagroup/graphql-kotlin-hooks-provider/8.2.1" }, "com.expediagroup/graphql-kotlin-ktor-server/8.2.1": { "first": "https://javadoc.io/doc/com.expediagroup/graphql-kotlin-ktor-server/8.2.1" }, + "com.expediagroup/graphql-kotlin-sdl-generator/8.2.1": { + "first": "https://javadoc.io/doc/com.expediagroup/graphql-kotlin-sdl-generator/8.2.1" + }, "com.expediagroup/graphql-kotlin-server/8.2.1": { "first": "https://javadoc.io/doc/com.expediagroup/graphql-kotlin-server/8.2.1" }, @@ -25,6 +43,18 @@ "first": "https://javadoc.io/doc/com.github.davidmoten/rtree/0.12", "second": "https://javadoc.io/doc/com.github.davidmoten/rtree/0.12/package-list" }, + "com.github.spotbugs/spotbugs-annotations/4.8.6": { + "first": "https://javadoc.io/doc/com.github.spotbugs/spotbugs-annotations/4.8.6", + "second": "https://javadoc.io/doc/com.github.spotbugs/spotbugs-annotations/4.8.6/element-list" + }, + "com.github.spotbugs/spotbugs/4.8.6": { + "first": "https://javadoc.io/doc/com.github.spotbugs/spotbugs/4.8.6", + "second": "https://javadoc.io/doc/com.github.spotbugs/spotbugs/4.8.6/element-list" + }, + "com.google.code.findbugs/jsr305/3.0.2": { + "first": "https://javadoc.io/doc/com.google.code.findbugs/jsr305/3.0.2", + "second": "https://javadoc.io/doc/com.google.code.findbugs/jsr305/3.0.2/package-list" + }, "com.google.code.gson/gson/2.11.0": { "first": "https://javadoc.io/doc/com.google.code.gson/gson/2.11.0", "second": "https://javadoc.io/doc/com.google.code.gson/gson/2.11.0/element-list" @@ -41,6 +71,19 @@ "first": "https://javadoc.io/doc/com.javadocmd/simplelatlng/1.4.0", "second": "https://javadoc.io/doc/com.javadocmd/simplelatlng/1.4.0/package-list" }, + "com.miglayout/miglayout-swing/11.4.2": { + "first": "https://javadoc.io/doc/com.miglayout/miglayout-swing/11.4.2", + "second": "https://javadoc.io/doc/com.miglayout/miglayout-swing/11.4.2/element-list" + }, + "com.pinterest.ktlint/ktlint-cli/1.5.0": { + "first": "https://javadoc.io/doc/com.pinterest.ktlint/ktlint-cli/1.5.0" + }, + "com.pinterest.ktlint/ktlint-ruleset-standard/1.5.0": { + "first": "https://javadoc.io/doc/com.pinterest.ktlint/ktlint-ruleset-standard/1.5.0" + }, + "com.soywiz.korlibs.korim/korim/4.0.10": { + "first": "https://javadoc.io/doc/com.soywiz.korlibs.korim/korim/4.0.10" + }, "com.uchuhimo/konf/1.1.2": { "first": "https://javadoc.io/doc/com.uchuhimo/konf/1.1.2" }, @@ -56,16 +99,80 @@ "first": "https://javadoc.io/doc/commons-io/commons-io/2.18.0", "second": "https://javadoc.io/doc/commons-io/commons-io/2.18.0/element-list" }, + "de.flapdoodle.embed/de.flapdoodle.embed.mongo/4.18.1": { + "first": "https://javadoc.io/doc/de.flapdoodle.embed/de.flapdoodle.embed.mongo/4.18.1", + "second": "https://javadoc.io/doc/de.flapdoodle.embed/de.flapdoodle.embed.mongo/4.18.1/package-list" + }, + "guru.nidi.com.kitfox/svgSalamander/1.1.3": { + "first": "https://javadoc.io/doc/guru.nidi.com.kitfox/svgSalamander/1.1.3" + }, "io.arrow-kt/arrow-core/2.0.0": { "first": "https://javadoc.io/doc/io.arrow-kt/arrow-core/2.0.0" }, "io.github.classgraph/classgraph/4.8.179": { "first": "https://javadoc.io/doc/io.github.classgraph/classgraph/4.8.179" }, + "io.github.detekt.sarif4k/sarif4k/0.5.0": { + "first": "https://javadoc.io/doc/io.github.detekt.sarif4k/sarif4k/0.5.0" + }, + "io.github.oshai/kotlin-logging/5.1.0": { + "first": "https://javadoc.io/doc/io.github.oshai/kotlin-logging/5.1.0" + }, "io.jenetics/jpx/3.2.0": { "first": "https://javadoc.io/doc/io.jenetics/jpx/3.2.0", "second": "https://javadoc.io/doc/io.jenetics/jpx/3.2.0/element-list" }, + "io.kotest/kotest-assertions-core/6.0.0.M1": { + "first": "https://javadoc.io/doc/io.kotest/kotest-assertions-core/6.0.0.M1" + }, + "io.kotest/kotest-framework-engine/6.0.0.M1": { + "first": "https://javadoc.io/doc/io.kotest/kotest-framework-engine/6.0.0.M1" + }, + "io.kotest/kotest-framework-multiplatform-plugin-embeddable-compiler/6.0.0.M1": { + "first": "https://javadoc.io/doc/io.kotest/kotest-framework-multiplatform-plugin-embeddable-compiler/6.0.0.M1" + }, + "io.kotest/kotest-runner-junit5-jvm/6.0.0.M1": { + "first": "https://javadoc.io/doc/io.kotest/kotest-runner-junit5-jvm/6.0.0.M1" + }, + "io.ktor/ktor-client-content-negotiation/2.3.13": { + "first": "https://javadoc.io/doc/io.ktor/ktor-client-content-negotiation/2.3.13" + }, + "io.ktor/ktor-client-core/2.3.13": { + "first": "https://javadoc.io/doc/io.ktor/ktor-client-core/2.3.13" + }, + "io.ktor/ktor-client-js/2.3.13": { + "first": "https://javadoc.io/doc/io.ktor/ktor-client-js/2.3.13" + }, + "io.ktor/ktor-serialization-jackson/2.3.13": { + "first": "https://javadoc.io/doc/io.ktor/ktor-serialization-jackson/2.3.13" + }, + "io.ktor/ktor-serialization-kotlinx-json/2.3.13": { + "first": "https://javadoc.io/doc/io.ktor/ktor-serialization-kotlinx-json/2.3.13" + }, + "io.ktor/ktor-serialization/2.3.13": { + "first": "https://javadoc.io/doc/io.ktor/ktor-serialization/2.3.13" + }, + "io.ktor/ktor-server-compression/2.3.13": { + "first": "https://javadoc.io/doc/io.ktor/ktor-server-compression/2.3.13" + }, + "io.ktor/ktor-server-content-negotiation/2.3.13": { + "first": "https://javadoc.io/doc/io.ktor/ktor-server-content-negotiation/2.3.13" + }, + "io.ktor/ktor-server-core-jvm/2.3.13": { + "first": "https://javadoc.io/doc/io.ktor/ktor-server-core-jvm/2.3.13" + }, + "io.ktor/ktor-server-cors/2.3.13": { + "first": "https://javadoc.io/doc/io.ktor/ktor-server-cors/2.3.13" + }, + "io.ktor/ktor-server-netty/2.3.13": { + "first": "https://javadoc.io/doc/io.ktor/ktor-server-netty/2.3.13" + }, + "io.ktor/ktor-server-test-host/2.3.13": { + "first": "https://javadoc.io/doc/io.ktor/ktor-server-test-host/2.3.13" + }, + "io.ktor/ktor-server-websockets-jvm/2.3.13": { + "first": "https://javadoc.io/doc/io.ktor/ktor-server-websockets-jvm/2.3.13" + }, "it.unibo.scafi/scafi-core_2.13/1.6.0": { "first": "https://javadoc.io/doc/it.unibo.scafi/scafi-core_2.13/1.6.0" }, @@ -73,6 +180,9 @@ "first": "https://javadoc.io/doc/it.unimi.dsi/dsiutils/2.7.3", "second": "https://javadoc.io/doc/it.unimi.dsi/dsiutils/2.7.3/element-list" }, + "net.anwiba.commons.swing.icons/org.oxygen.oxygen-icons/4.13.0-1.2.50": { + "first": "https://javadoc.io/doc/net.anwiba.commons.swing.icons/org.oxygen.oxygen-icons/4.13.0-1.2.50" + }, "net.harawata/appdirs/1.2.2": { "first": "https://javadoc.io/doc/net.harawata/appdirs/1.2.2", "second": "https://javadoc.io/doc/net.harawata/appdirs/1.2.2/element-list" @@ -84,6 +194,21 @@ "first": "https://javadoc.io/doc/net.sf.trove4j/trove4j/3.0.3", "second": "https://javadoc.io/doc/net.sf.trove4j/trove4j/3.0.3/package-list" }, + "net.sourceforge.pmd/pmd-dist/7.8.0": { + "first": "https://javadoc.io/doc/net.sourceforge.pmd/pmd-dist/7.8.0" + }, + "org.antlr/antlr4-runtime/4.13.2": { + "first": "https://javadoc.io/doc/org.antlr/antlr4-runtime/4.13.2", + "second": "https://javadoc.io/doc/org.antlr/antlr4-runtime/4.13.2/element-list" + }, + "org.antlr/antlr4/4.13.2": { + "first": "https://javadoc.io/doc/org.antlr/antlr4/4.13.2", + "second": "https://javadoc.io/doc/org.antlr/antlr4/4.13.2/element-list" + }, + "org.apache.commons/commons-collections4/4.4": { + "first": "https://javadoc.io/doc/org.apache.commons/commons-collections4/4.4", + "second": "https://javadoc.io/doc/org.apache.commons/commons-collections4/4.4/package-list" + }, "org.apache.commons/commons-lang3/3.17.0": { "first": "https://javadoc.io/doc/org.apache.commons/commons-lang3/3.17.0", "second": "https://javadoc.io/doc/org.apache.commons/commons-lang3/3.17.0/element-list" @@ -104,13 +229,28 @@ "first": "https://javadoc.io/doc/org.apache.ignite/ignite-spring/2.16.0", "second": "https://javadoc.io/doc/org.apache.ignite/ignite-spring/2.16.0/package-list" }, + "org.codehaus.groovy/groovy-jsr223/3.0.23": { + "first": "https://javadoc.io/doc/org.codehaus.groovy/groovy-jsr223/3.0.23", + "second": "https://javadoc.io/doc/org.codehaus.groovy/groovy-jsr223/3.0.23/element-list" + }, "org.danilopianini/boilerplate/0.2.2": { "first": "https://javadoc.io/doc/org.danilopianini/boilerplate/0.2.2" }, + "org.danilopianini/conrec/0.1.0": { + "first": "https://javadoc.io/doc/org.danilopianini/conrec/0.1.0" + }, + "org.danilopianini/gson-extras/1.3.0": { + "first": "https://javadoc.io/doc/org.danilopianini/gson-extras/1.3.0", + "second": "https://javadoc.io/doc/org.danilopianini/gson-extras/1.3.0/package-list" + }, "org.danilopianini/java-quadtree/0.2.1": { "first": "https://javadoc.io/doc/org.danilopianini/java-quadtree/0.2.1", "second": "https://javadoc.io/doc/org.danilopianini/java-quadtree/0.2.1/package-list" }, + "org.danilopianini/javalib-java7/0.6.1": { + "first": "https://javadoc.io/doc/org.danilopianini/javalib-java7/0.6.1", + "second": "https://javadoc.io/doc/org.danilopianini/javalib-java7/0.6.1/package-list" + }, "org.danilopianini/jirf/0.4.27": { "first": "https://javadoc.io/doc/org.danilopianini/jirf/0.4.27" }, @@ -134,15 +274,69 @@ "first": "https://javadoc.io/doc/org.graphstream/gs-core/2.0", "second": "https://javadoc.io/doc/org.graphstream/gs-core/2.0/element-list" }, + "org.jetbrains.dokka/all-modules-page-plugin/2.0.0": { + "first": "https://javadoc.io/doc/org.jetbrains.dokka/all-modules-page-plugin/2.0.0" + }, + "org.jetbrains.dokka/analysis-kotlin-descriptors/2.0.0": { + "first": "https://javadoc.io/doc/org.jetbrains.dokka/analysis-kotlin-descriptors/2.0.0" + }, + "org.jetbrains.dokka/dokka-base/2.0.0": { + "first": "https://javadoc.io/doc/org.jetbrains.dokka/dokka-base/2.0.0" + }, + "org.jetbrains.dokka/dokka-core/2.0.0": { + "first": "https://javadoc.io/doc/org.jetbrains.dokka/dokka-core/2.0.0" + }, + "org.jetbrains.dokka/templating-plugin/2.0.0": { + "first": "https://javadoc.io/doc/org.jetbrains.dokka/templating-plugin/2.0.0" + }, + "org.jetbrains.kotlin-wrappers/kotlin-react-dom/19.0.0-pre.854": { + "first": "https://javadoc.io/doc/org.jetbrains.kotlin-wrappers/kotlin-react-dom/19.0.0-pre.854" + }, + "org.jetbrains.kotlin-wrappers/kotlin-react/19.0.0-pre.854": { + "first": "https://javadoc.io/doc/org.jetbrains.kotlin-wrappers/kotlin-react/19.0.0-pre.854" + }, + "org.jetbrains.kotlin/kotlin-build-tools-impl/null": { + "first": "https://javadoc.io/doc/org.jetbrains.kotlin/kotlin-build-tools-impl/null" + }, + "org.jetbrains.kotlin/kotlin-compiler-embeddable/2.1.0": { + "first": "https://javadoc.io/doc/org.jetbrains.kotlin/kotlin-compiler-embeddable/2.1.0" + }, + "org.jetbrains.kotlin/kotlin-dom-api-compat/2.1.0": { + "first": "https://javadoc.io/doc/org.jetbrains.kotlin/kotlin-dom-api-compat/2.1.0" + }, + "org.jetbrains.kotlin/kotlin-reflect/2.1.0": { + "first": "https://javadoc.io/doc/org.jetbrains.kotlin/kotlin-reflect/2.1.0" + }, "org.jetbrains.kotlin/kotlin-reflect/null": { "first": "https://javadoc.io/doc/org.jetbrains.kotlin/kotlin-reflect/null" }, + "org.jetbrains.kotlin/kotlin-scripting-compiler-embeddable/2.1.0": { + "first": "https://javadoc.io/doc/org.jetbrains.kotlin/kotlin-scripting-compiler-embeddable/2.1.0" + }, + "org.jetbrains.kotlin/kotlin-scripting-jsr223/null": { + "first": "https://javadoc.io/doc/org.jetbrains.kotlin/kotlin-scripting-jsr223/null" + }, + "org.jetbrains.kotlin/kotlin-serialization-compiler-plugin-embeddable/2.1.0": { + "first": "https://javadoc.io/doc/org.jetbrains.kotlin/kotlin-serialization-compiler-plugin-embeddable/2.1.0" + }, "org.jetbrains.kotlin/kotlin-stdlib-jdk8/null": { "first": "https://javadoc.io/doc/org.jetbrains.kotlin/kotlin-stdlib-jdk8/null" }, "org.jetbrains.kotlin/kotlin-stdlib/2.1.0": { "first": "https://javadoc.io/doc/org.jetbrains.kotlin/kotlin-stdlib/2.1.0" }, + "org.jetbrains.kotlin/kotlin-test-annotations-common/2.1.0": { + "first": "https://javadoc.io/doc/org.jetbrains.kotlin/kotlin-test-annotations-common/2.1.0" + }, + "org.jetbrains.kotlin/kotlin-test-common/2.1.0": { + "first": "https://javadoc.io/doc/org.jetbrains.kotlin/kotlin-test-common/2.1.0" + }, + "org.jetbrains.kotlin/kotlin-test/null": { + "first": "https://javadoc.io/doc/org.jetbrains.kotlin/kotlin-test/null" + }, + "org.jetbrains.kotlinx/kotlinx-cli/0.3.6": { + "first": "https://javadoc.io/doc/org.jetbrains.kotlinx/kotlinx-cli/0.3.6" + }, "org.jetbrains.kotlinx/kotlinx-coroutines-core/1.9.0": { "first": "https://javadoc.io/doc/org.jetbrains.kotlinx/kotlinx-coroutines-core/1.9.0" }, @@ -157,6 +351,21 @@ "first": "https://javadoc.io/doc/org.jooq/jool/0.9.15", "second": "https://javadoc.io/doc/org.jooq/jool/0.9.15/element-list" }, + "org.junit.jupiter/junit-jupiter-api/5.11.4": { + "first": "https://javadoc.io/doc/org.junit.jupiter/junit-jupiter-api/5.11.4", + "second": "https://javadoc.io/doc/org.junit.jupiter/junit-jupiter-api/5.11.4/package-list" + }, + "org.junit.jupiter/junit-jupiter-engine/5.11.4": { + "first": "https://javadoc.io/doc/org.junit.jupiter/junit-jupiter-engine/5.11.4" + }, + "org.mapsforge/mapsforge-map-awt/0.21.0": { + "first": "https://javadoc.io/doc/org.mapsforge/mapsforge-map-awt/0.21.0", + "second": "https://javadoc.io/doc/org.mapsforge/mapsforge-map-awt/0.21.0/element-list" + }, + "org.mockito/mockito-core/5.14.2": { + "first": "https://javadoc.io/doc/org.mockito/mockito-core/5.14.2", + "second": "https://javadoc.io/doc/org.mockito/mockito-core/5.14.2/element-list" + }, "org.mongodb/mongodb-driver-sync/5.2.1": { "first": "https://javadoc.io/doc/org.mongodb/mongodb-driver-sync/5.2.1" }, @@ -166,6 +375,9 @@ "org.protelis/protelis-lang/17.7.1": { "first": "https://javadoc.io/doc/org.protelis/protelis-lang/17.7.1" }, + "org.reduxkotlin/redux-kotlin-threadsafe/0.6.1": { + "first": "https://javadoc.io/doc/org.reduxkotlin/redux-kotlin-threadsafe/0.6.1" + }, "org.scala-lang/scala-compiler/2.13.15": { "first": "https://javadoc.io/doc/org.scala-lang/scala-compiler/2.13.15" }, @@ -176,6 +388,10 @@ "first": "https://javadoc.io/doc/org.slf4j/slf4j-api/2.0.16", "second": "https://javadoc.io/doc/org.slf4j/slf4j-api/2.0.16/element-list" }, + "org.slf4j/slf4j-simple/2.0.0": { + "first": "https://javadoc.io/doc/org.slf4j/slf4j-simple/2.0.0", + "second": "https://javadoc.io/doc/org.slf4j/slf4j-simple/2.0.0/element-list" + }, "org.yaml/snakeyaml/2.3": { "first": "https://javadoc.io/doc/org.yaml/snakeyaml/2.3", "second": "https://javadoc.io/doc/org.yaml/snakeyaml/2.3/element-list" diff --git a/kotlin-js-store/yarn.lock b/kotlin-js-store/yarn.lock index dd7161e1f9..fd401d6e34 100644 --- a/kotlin-js-store/yarn.lock +++ b/kotlin-js-store/yarn.lock @@ -2,12 +2,12 @@ # yarn lockfile v1 -"@babel/runtime@^7.17.2", "@babel/runtime@^7.18.3", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.2", "@babel/runtime@^7.6.3", "@babel/runtime@^7.8.7": - version "7.20.1" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.1.tgz#1148bb33ab252b165a06698fde7576092a78b4a9" - integrity sha512-mrzLkl6U9YLF8qpqI7TB82PESyEGjm/0Ly91jG575eVxMMlb8fYfOXFZIJ8XfLrJZQbm7dlKry2bJmXBUEkdFg== +"@babel/runtime@^7.17.2", "@babel/runtime@^7.26.0", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.8.7": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.26.0.tgz#8600c2f595f277c60815256418b85356a65173c1" + integrity sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw== dependencies: - regenerator-runtime "^0.13.10" + regenerator-runtime "^0.14.0" "@colors/colors@1.5.0": version "1.5.0" @@ -78,42 +78,49 @@ "@jridgewell/sourcemap-codec" "1.4.14" "@leichtgewicht/ip-codec@^2.0.1": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz#b2ac626d6cb9c8718ab459166d4bb405b8ffa78b" - integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A== + version "2.0.5" + resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz#4fc56c15c580b9adb7dc3c333a134e540b44bfb1" + integrity sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw== -"@popperjs/core@^2.11.5": - version "2.11.6" - resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.6.tgz#cee20bd55e68a1720bdab363ecf0c821ded4cd45" - integrity sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw== +"@popperjs/core@^2.11.8": + version "2.11.8" + resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.8.tgz#6b79032e760a0899cd4204710beede972a3a185f" + integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A== -"@react-aria/ssr@^3.2.0": - version "3.4.0" - resolved "https://registry.yarnpkg.com/@react-aria/ssr/-/ssr-3.4.0.tgz#a2b9a170214f56e41d3c4c933d0d8fcffa07a12a" - integrity sha512-qzuGk14/fUyUAoW/EBwgFcuMkVNXJVGlezTgZ1HovpCZ+p9844E7MUFHE7CuzFzPEIkVeqhBNIoIu+VJJ8YCOA== +"@react-aria/ssr@^3.5.0": + version "3.9.7" + resolved "https://registry.yarnpkg.com/@react-aria/ssr/-/ssr-3.9.7.tgz#d89d129f7bbc5148657e6c952ac31c9353183770" + integrity sha512-GQygZaGlmYjmYM+tiNBA5C6acmiDWF52Nqd40bBp0Znk4M4hP+LTmI0lpI1BuKMw45T8RIhrAsICIfKwZvi2Gg== dependencies: - "@babel/runtime" "^7.6.2" + "@swc/helpers" "^0.5.0" -"@restart/hooks@^0.4.6", "@restart/hooks@^0.4.7": - version "0.4.7" - resolved "https://registry.yarnpkg.com/@restart/hooks/-/hooks-0.4.7.tgz#d79ca6472c01ce04389fc73d4a79af1b5e33cd39" - integrity sha512-ZbjlEHcG+FQtpDPHd7i4FzNNvJf2enAwZfJbpM8CW7BhmOAbsHpZe3tsHwfQUrBuyrxWqPYp2x5UMnilWcY22A== +"@restart/hooks@^0.4.6": + version "0.4.16" + resolved "https://registry.yarnpkg.com/@restart/hooks/-/hooks-0.4.16.tgz#95ae8ac1cc7e2bd4fed5e39800ff85604c6d59fb" + integrity sha512-f7aCv7c+nU/3mF7NWLtVVr0Ra80RqsO89hO72r+Y/nvQr5+q0UFGkocElTH6MJApvReVh6JHUFYn2cw1WdHF3w== + dependencies: + dequal "^2.0.3" + +"@restart/hooks@^0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@restart/hooks/-/hooks-0.5.0.tgz#a594af7c3b64f5e65a7aca011551b0cdd93ec14e" + integrity sha512-wS+h6IusJCPjTkmOOrRZxIPICD/mtFA3PRZviutoM23/b7akyDGfZF/WS+nIFk27u7JDhPE2+0GBdZxjSqHZkg== dependencies: - dequal "^2.0.2" + dequal "^2.0.3" "@restart/ui@^1.3.1": - version "1.4.1" - resolved "https://registry.yarnpkg.com/@restart/ui/-/ui-1.4.1.tgz#c9057915f0708c411824eeb16c03d0108c0208d2" - integrity sha512-J7wFOx2DcmkBqCqiZgDsggLO7faiNh4Nv1/v80FmbRgP+MYpwaVDKKXLC69DA4+ejgNIsBP5ORtC74EZqO1j8A== - dependencies: - "@babel/runtime" "^7.18.3" - "@popperjs/core" "^2.11.5" - "@react-aria/ssr" "^3.2.0" - "@restart/hooks" "^0.4.7" - "@types/warning" "^3.0.0" - dequal "^2.0.2" + version "1.9.2" + resolved "https://registry.yarnpkg.com/@restart/ui/-/ui-1.9.2.tgz#dad8f084e6a56f87f9799dbc248af04168ffc03b" + integrity sha512-MWWqJqSyqUWWPBOOiRQrX57CBc/9CoYONg7sE+uag72GCAuYrHGU5c49vU5s4BUSBgiKNY6rL7TULqGDrouUaA== + dependencies: + "@babel/runtime" "^7.26.0" + "@popperjs/core" "^2.11.8" + "@react-aria/ssr" "^3.5.0" + "@restart/hooks" "^0.5.0" + "@types/warning" "^3.0.3" + dequal "^2.0.3" dom-helpers "^5.2.0" - uncontrollable "^7.2.1" + uncontrollable "^8.0.4" warning "^4.0.3" "@socket.io/component-emitter@~3.1.0": @@ -121,10 +128,17 @@ resolved "https://registry.yarnpkg.com/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz#96116f2a912e0c02817345b3c10751069920d553" integrity sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg== +"@swc/helpers@^0.5.0": + version "0.5.15" + resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.15.tgz#79efab344c5819ecf83a43f3f9f811fc84b516d7" + integrity sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g== + dependencies: + tslib "^2.8.0" + "@types/body-parser@*": - version "1.19.2" - resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.2.tgz#aea2059e28b7658639081347ac4fab3de166e6f0" - integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== + version "1.19.5" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.5.tgz#04ce9a3b677dc8bd681a17da1ab9835dc9d3ede4" + integrity sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg== dependencies: "@types/connect" "*" "@types/node" "*" @@ -145,9 +159,9 @@ "@types/node" "*" "@types/connect@*": - version "3.4.35" - resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" - integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== + version "3.4.38" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.38.tgz#5ba7f3bc4fbbdeaff8dded952e5ff2cc53f8d858" + integrity sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug== dependencies: "@types/node" "*" @@ -166,19 +180,20 @@ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== -"@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.18": - version "4.17.31" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.31.tgz#a1139efeab4e7323834bb0226e62ac019f474b2f" - integrity sha512-DxMhY+NAsTwMMFHBTtJFNp5qiHKJ7TeqOo23zVEM9alT1Ml27Q3xcTH0xwxn7Q0BbMcVEJOs/7aQtUWupUQN3Q== +"@types/express-serve-static-core@*", "@types/express-serve-static-core@^5.0.0": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-5.0.2.tgz#812d2871e5eea17fb0bd5214dda7a7b748c0e12a" + integrity sha512-vluaspfvWEtE4vcSDlKRNer52DvOGrB2xv6diXy6UKyKW0lqZiWHGNApSyxOv+8DE5Z27IzVvE7hNkxg7EXIcg== dependencies: "@types/node" "*" "@types/qs" "*" "@types/range-parser" "*" + "@types/send" "*" "@types/express-serve-static-core@^4.17.33": - version "4.19.2" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.19.2.tgz#ca09a37ffbdc66c584c305af0044b8ad3aa7b9ef" - integrity sha512-dPSEQElyVJ97BuGduAqQjpBocZWAs0GR94z+ptL7JXQJeJdHw2WBG3EWdFrK36b8Q6j8P4cXOMhgUoi0IIfIsg== + version "4.19.6" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz#e01324c2a024ff367d92c66f48553ced0ab50267" + integrity sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A== dependencies: "@types/node" "*" "@types/qs" "*" @@ -186,12 +201,12 @@ "@types/send" "*" "@types/express@*": - version "4.17.14" - resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.14.tgz#143ea0557249bc1b3b54f15db4c81c3d4eb3569c" - integrity sha512-TEbt+vaPFQ+xpxFLFssxUDXj5cWCxZJjIcB7Yg0k0GMHGtgtQgpvx/MUQUeAkNbA9AAGrwkAsoeItdTgS7FMyg== + version "5.0.0" + resolved "https://registry.yarnpkg.com/@types/express/-/express-5.0.0.tgz#13a7d1f75295e90d19ed6e74cab3678488eaa96c" + integrity sha512-DvZriSMehGHL1ZNLzi6MidnsDhUZM/x2pRdDIKdwbUNqqwHxMlRdkxtn6/EPKyqKpHqTl/4nRZsRNLpZxZRpPQ== dependencies: "@types/body-parser" "*" - "@types/express-serve-static-core" "^4.17.18" + "@types/express-serve-static-core" "^5.0.0" "@types/qs" "*" "@types/serve-static" "*" @@ -211,21 +226,21 @@ integrity sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA== "@types/http-proxy@^1.17.8": - version "1.17.9" - resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.9.tgz#7f0e7931343761efde1e2bf48c40f02f3f75705a" - integrity sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw== + version "1.17.15" + resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.15.tgz#12118141ce9775a6499ecb4c01d02f90fc839d36" + integrity sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ== dependencies: "@types/node" "*" -"@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": +"@types/json-schema@^7.0.8": version "7.0.11" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== -"@types/mime@*": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.1.tgz#5f8f2bca0a5863cb69bc0b0acd88c96cb1d4ae10" - integrity sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA== +"@types/json-schema@^7.0.9": + version "7.0.15" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== "@types/mime@^1": version "1.3.5" @@ -244,35 +259,26 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.9.tgz#02d013de7058cea16d36168ef2fc653464cfbad4" integrity sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg== -"@types/prop-types@*": - version "15.7.5" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" - integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== - "@types/qs@*": - version "6.9.7" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" - integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== + version "6.9.17" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.17.tgz#fc560f60946d0aeff2f914eb41679659d3310e1a" + integrity sha512-rX4/bPcfmvxHDv0XjfJELTTr+iB+tn032nPILqHm5wbthUUUuVtNGGqzhya9XUxjTP8Fpr0qYgSZZKxGY++svQ== "@types/range-parser@*": - version "1.2.4" - resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" - integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== + version "1.2.7" + resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.7.tgz#50ae4353eaaddc04044279812f52c8c65857dbcb" + integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ== "@types/react-transition-group@^4.4.4": - version "4.4.5" - resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.5.tgz#aae20dcf773c5aa275d5b9f7cdbca638abc5e416" - integrity sha512-juKD/eiSM3/xZYzjuzH6ZwpP+/lejltmiS3QEzV/vmb/Q8+HfDmxu+Baga8UEMGBqV88Nbg4l2hY/K2DkyaLLA== - dependencies: - "@types/react" "*" + version "4.4.12" + resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.12.tgz#b5d76568485b02a307238270bfe96cb51ee2a044" + integrity sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w== -"@types/react@*", "@types/react@>=16.9.11": - version "18.0.25" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.25.tgz#8b1dcd7e56fe7315535a4af25435e0bb55c8ae44" - integrity sha512-xD6c0KDT4m7n9uD4ZHi02lzskaiqcBxf4zi+tXZY98a04wvc0hi/TcCPC2FOESZi51Nd7tlUeOJY8RofL799/g== +"@types/react@>=16.9.11": + version "19.0.2" + resolved "https://registry.yarnpkg.com/@types/react/-/react-19.0.2.tgz#9363e6b3ef898c471cb182dd269decc4afc1b4f6" + integrity sha512-USU8ZI/xyKJwFTpjSVIrSeHBVAGagkHQKPNbxeWwql/vDmnTIBgx+TJnhFnj1NXgz8XfprU0egV2dROLGpsBEg== dependencies: - "@types/prop-types" "*" - "@types/scheduler" "*" csstype "^3.0.2" "@types/retry@0.12.0": @@ -280,11 +286,6 @@ resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== -"@types/scheduler@*": - version "0.16.2" - resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" - integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== - "@types/send@*": version "0.17.4" resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.4.tgz#6619cd24e7270793702e4e6a4b958a9010cfc57a" @@ -300,15 +301,7 @@ dependencies: "@types/express" "*" -"@types/serve-static@*": - version "1.15.0" - resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.0.tgz#c7930ff61afb334e121a9da780aac0d9b8f34155" - integrity sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg== - dependencies: - "@types/mime" "*" - "@types/node" "*" - -"@types/serve-static@^1.13.10": +"@types/serve-static@*", "@types/serve-static@^1.13.10": version "1.15.7" resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.7.tgz#22174bbd74fb97fe303109738e9b5c2f3064f714" integrity sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw== @@ -324,15 +317,15 @@ dependencies: "@types/node" "*" -"@types/warning@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/warning/-/warning-3.0.0.tgz#0d2501268ad8f9962b740d387c4654f5f8e23e52" - integrity sha512-t/Tvs5qR47OLOr+4E9ckN8AmP2Tf16gWq+/qA4iUGS/OOyHVO8wv2vjJuX8SNOUTJyWb+2t7wJm6cXILFnOROA== +"@types/warning@^3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/warning/-/warning-3.0.3.tgz#d1884c8cc4a426d1ac117ca2611bf333834c6798" + integrity sha512-D1XC7WK8K+zZEveUPY+cf4+kgauk8N4eHr/XIHXGlGYkHLud6hK9lYfZk1ry1TNh798cZUCgb6MqGEG8DkJt6Q== "@types/ws@^8.5.5": - version "8.5.12" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.12.tgz#619475fe98f35ccca2a2f6c137702d85ec247b7e" - integrity sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ== + version "8.5.13" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.13.tgz#6414c280875e2691d0d1e080b05addbf5cb91e20" + integrity sha512-osM/gWBTPKgHV8XkTunnegTRIsvF6owmf5w+JtAfOw472dptdm0dlGv4xCt6GwQRcC2XVOvvRE/0bAoQcL2QkA== dependencies: "@types/node" "*" @@ -489,7 +482,7 @@ abort-controller@3.0.0: dependencies: event-target-shim "^5.0.0" -accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: +accepts@~1.3.4, accepts@~1.3.8: version "1.3.8" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== @@ -524,7 +517,7 @@ ajv-keywords@^3.5.2: resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== -ajv-keywords@^5.0.0: +ajv-keywords@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz#69d4d385a4733cdbeab44964a1170a88f87f0e16" integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== @@ -541,15 +534,15 @@ ajv@^6.12.5: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^8.0.0, ajv@^8.8.0: - version "8.11.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.11.2.tgz#aecb20b50607acf2569b6382167b65a96008bb78" - integrity sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg== +ajv@^8.0.0, ajv@^8.9.0: + version "8.17.1" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.17.1.tgz#37d9a5c776af6bc92d7f4f9510eba4c0a60d11a6" + integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== dependencies: - fast-deep-equal "^3.1.1" + fast-deep-equal "^3.1.3" + fast-uri "^3.0.1" json-schema-traverse "^1.0.0" require-from-string "^2.0.2" - uri-js "^4.2.2" ansi-colors@^4.1.3: version "4.1.3" @@ -611,7 +604,25 @@ binary-extensions@^2.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== -body-parser@1.20.1, body-parser@^1.19.0: +body-parser@1.20.3: + version "1.20.3" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.3.tgz#1953431221c6fb5cd63c4b36d53fab0928e548c6" + integrity sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g== + dependencies: + bytes "3.1.2" + content-type "~1.0.5" + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" + iconv-lite "0.4.24" + on-finished "2.4.1" + qs "6.13.0" + raw-body "2.5.2" + type-is "~1.6.18" + unpipe "1.0.0" + +body-parser@^1.19.0: version "1.20.1" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== @@ -630,9 +641,9 @@ body-parser@1.20.1, body-parser@^1.19.0: unpipe "1.0.0" bonjour-service@^1.0.11: - version "1.2.1" - resolved "https://registry.yarnpkg.com/bonjour-service/-/bonjour-service-1.2.1.tgz#eb41b3085183df3321da1264719fbada12478d02" - integrity sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw== + version "1.3.0" + resolved "https://registry.yarnpkg.com/bonjour-service/-/bonjour-service-1.3.0.tgz#80d867430b5a0da64e82a8047fc1e355bdb71722" + integrity sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA== dependencies: fast-deep-equal "^3.1.3" multicast-dns "^7.2.5" @@ -659,6 +670,13 @@ braces@^3.0.2, braces@~3.0.2: dependencies: fill-range "^7.0.1" +braces@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== + dependencies: + fill-range "^7.1.1" + browser-stdout@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" @@ -679,16 +697,19 @@ buffer-from@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== -bytes@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" - integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== - bytes@3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== +call-bind-apply-helpers@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz#32e5892e6361b29b0b545ba6f7763378daca2840" + integrity sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + call-bind@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" @@ -697,6 +718,14 @@ call-bind@^1.0.0: function-bind "^1.1.1" get-intrinsic "^1.0.2" +call-bound@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.3.tgz#41cfd032b593e39176a71533ab4f384aa04fd681" + integrity sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA== + dependencies: + call-bind-apply-helpers "^1.0.1" + get-intrinsic "^1.2.6" + camelcase@^6.0.0: version "6.3.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" @@ -751,9 +780,9 @@ chrome-trace-event@^1.0.2: integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== classnames@^2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.2.tgz#351d813bf0137fcc6a76a16b88208d2560a0d924" - integrity sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw== + version "2.5.1" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.5.1.tgz#ba774c614be0f016da105c858e7159eae8e7687b" + integrity sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow== cliui@^7.0.2: version "7.0.4" @@ -785,7 +814,12 @@ color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -colorette@^2.0.10, colorette@^2.0.14: +colorette@^2.0.10: + version "2.0.20" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" + integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== + +colorette@^2.0.14: version "2.0.19" resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798" integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ== @@ -800,7 +834,7 @@ commander@^2.20.0: resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== -compressible@~2.0.16: +compressible@~2.0.18: version "2.0.18" resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== @@ -808,16 +842,16 @@ compressible@~2.0.16: mime-db ">= 1.43.0 < 2" compression@^1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" - integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== + version "1.7.5" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.5.tgz#fdd256c0a642e39e314c478f6c2cd654edd74c93" + integrity sha512-bQJ0YRck5ak3LgtnpKkiabX5pNF7tMUh1BSy2ZBOTh0Dim0BUu6aPPwByIns6/A5Prh8PufSPerMDUklpzes2Q== dependencies: - accepts "~1.3.5" - bytes "3.0.0" - compressible "~2.0.16" + bytes "3.1.2" + compressible "~2.0.18" debug "2.6.9" + negotiator "~0.6.4" on-headers "~1.0.2" - safe-buffer "5.1.2" + safe-buffer "5.2.1" vary "~1.1.2" concat-map@0.0.1: @@ -852,15 +886,20 @@ content-type@~1.0.4: resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== +content-type@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" + integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== + cookie-signature@1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== -cookie@0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" - integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== +cookie@0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.1.tgz#2f73c42142d5d5cf71310a74fc4ae61670e5dbc9" + integrity sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w== cookie@~0.4.1: version "0.4.2" @@ -890,9 +929,9 @@ cross-spawn@^7.0.3: which "^2.0.1" csstype@^3.0.2: - version "3.1.1" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.1.tgz#841b532c45c758ee546a11d5bd7b7b473c8c30b9" - integrity sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw== + version "3.1.3" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" + integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== custom-event@~1.0.0: version "1.0.1" @@ -911,7 +950,14 @@ debug@2.6.9: dependencies: ms "2.0.0" -debug@^4.1.0, debug@^4.3.4, debug@~4.3.1, debug@~4.3.2, debug@~4.3.4: +debug@^4.1.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a" + integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== + dependencies: + ms "^2.1.3" + +debug@^4.3.4, debug@~4.3.1, debug@~4.3.2, debug@~4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -952,7 +998,7 @@ depd@~1.1.2: resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== -dequal@^2.0.2: +dequal@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== @@ -978,9 +1024,9 @@ diff@^5.2.0: integrity sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A== dns-packet@^5.2.2: - version "5.4.0" - resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-5.4.0.tgz#1f88477cf9f27e78a213fb6d118ae38e759a879b" - integrity sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g== + version "5.6.1" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-5.6.1.tgz#ae888ad425a9d1478a0674256ab866de1012cf2f" + integrity sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw== dependencies: "@leichtgewicht/ip-codec" "^2.0.1" @@ -1002,6 +1048,15 @@ dom-serialize@^2.2.1: extend "^3.0.0" void-elements "^2.0.0" +dunder-proto@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" + integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== + dependencies: + call-bind-apply-helpers "^1.0.1" + es-errors "^1.3.0" + gopd "^1.2.0" + ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" @@ -1022,6 +1077,11 @@ encodeurl@~1.0.2: resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== +encodeurl@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58" + integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== + engine.io-parser@~5.2.1: version "5.2.2" resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.2.2.tgz#37b48e2d23116919a3453738c5720455e64e1c49" @@ -1061,11 +1121,28 @@ envinfo@^7.7.3: resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== +es-define-property@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" + integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== + +es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + es-module-lexer@^1.2.1: version "1.3.0" resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.3.0.tgz#6be9c9e0b4543a60cd166ff6f8b4e9dae0b0c16f" integrity sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA== +es-object-atoms@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz#ddb55cd47ac2e240701260bc2a8e31ecb643d941" + integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw== + dependencies: + es-errors "^1.3.0" + escalade@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" @@ -1147,36 +1224,36 @@ execa@^5.0.0: strip-final-newline "^2.0.0" express@^4.17.3: - version "4.18.2" - resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" - integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== + version "4.21.2" + resolved "https://registry.yarnpkg.com/express/-/express-4.21.2.tgz#cf250e48362174ead6cea4a566abef0162c1ec32" + integrity sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA== dependencies: accepts "~1.3.8" array-flatten "1.1.1" - body-parser "1.20.1" + body-parser "1.20.3" content-disposition "0.5.4" content-type "~1.0.4" - cookie "0.5.0" + cookie "0.7.1" cookie-signature "1.0.6" debug "2.6.9" depd "2.0.0" - encodeurl "~1.0.2" + encodeurl "~2.0.0" escape-html "~1.0.3" etag "~1.8.1" - finalhandler "1.2.0" + finalhandler "1.3.1" fresh "0.5.2" http-errors "2.0.0" - merge-descriptors "1.0.1" + merge-descriptors "1.0.3" methods "~1.1.2" on-finished "2.4.1" parseurl "~1.3.3" - path-to-regexp "0.1.7" + path-to-regexp "0.1.12" proxy-addr "~2.0.7" - qs "6.11.0" + qs "6.13.0" range-parser "~1.2.1" safe-buffer "5.2.1" - send "0.18.0" - serve-static "1.15.0" + send "0.19.0" + serve-static "1.16.2" setprototypeof "1.2.0" statuses "2.0.1" type-is "~1.6.18" @@ -1198,6 +1275,11 @@ fast-json-stable-stringify@^2.0.0: resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== +fast-uri@^3.0.1: + version "3.0.3" + resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.3.tgz#892a1c91802d5d7860de728f18608a0573142241" + integrity sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw== + fastest-levenshtein@^1.0.12: version "1.0.16" resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#210e61b6ff181de91ea9b3d1b84fdedd47e034e5" @@ -1217,6 +1299,13 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== + dependencies: + to-regex-range "^5.0.1" + finalhandler@1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" @@ -1230,13 +1319,13 @@ finalhandler@1.1.2: statuses "~1.5.0" unpipe "~1.0.0" -finalhandler@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" - integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== +finalhandler@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.3.1.tgz#0c575f1d1d324ddd1da35ad7ece3df7d19088019" + integrity sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ== dependencies: debug "2.6.9" - encodeurl "~1.0.2" + encodeurl "~2.0.0" escape-html "~1.0.3" on-finished "2.4.1" parseurl "~1.3.3" @@ -1318,6 +1407,11 @@ function-bind@^1.1.1: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" @@ -1332,6 +1426,22 @@ get-intrinsic@^1.0.2: has "^1.0.3" has-symbols "^1.0.3" +get-intrinsic@^1.2.5, get-intrinsic@^1.2.6: + version "1.2.6" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.6.tgz#43dd3dd0e7b49b82b2dfcad10dc824bf7fc265d5" + integrity sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA== + dependencies: + call-bind-apply-helpers "^1.0.1" + dunder-proto "^1.0.0" + es-define-property "^1.0.1" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + function-bind "^1.1.2" + gopd "^1.2.0" + has-symbols "^1.1.0" + hasown "^2.0.2" + math-intrinsics "^1.0.0" + get-stream@^6.0.0: version "6.0.1" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" @@ -1372,6 +1482,11 @@ glob@^8.1.0: minimatch "^5.0.1" once "^1.3.0" +gopd@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" + integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== + graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6: version "4.2.10" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" @@ -1397,6 +1512,11 @@ has-symbols@^1.0.3: resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== +has-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" + integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== + has@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" @@ -1404,6 +1524,13 @@ has@^1.0.3: dependencies: function-bind "^1.1.1" +hasown@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + dependencies: + function-bind "^1.1.2" + he@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" @@ -1456,9 +1583,9 @@ http-parser-js@>=0.5.1: integrity sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q== http-proxy-middleware@^2.0.3: - version "2.0.6" - resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz#e1a4dd6979572c7ab5a4e4b55095d1f32a74963f" - integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw== + version "2.0.7" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.7.tgz#915f236d92ae98ef48278a95dedf17e991936ec6" + integrity sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA== dependencies: "@types/http-proxy" "^1.17.8" http-proxy "^1.18.1" @@ -1753,9 +1880,9 @@ kotlin-web-helpers@2.0.0: format-util "^1.0.5" launch-editor@^2.6.0: - version "2.8.1" - resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.8.1.tgz#3bda72af213ec9b46b170e39661916ec66c2f463" - integrity sha512-elBx2l/tp9z99X5H/qev8uyDywVh0VXAwEbjk8kJhnc5grOFkGh7aW6q55me9xnYbss261XtnUrysZ+XvGbhQA== + version "2.9.1" + resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.9.1.tgz#253f173bd441e342d4344b4dae58291abb425047" + integrity sha512-Gcnl4Bd+hRO9P9icCP/RVVT2o8SFlPXofuCxvA2SaZuH45whSvf5p8x5oih5ftLiVhEI4sp5xDY+R+b3zJBh5w== dependencies: picocolors "^1.0.0" shell-quote "^1.8.1" @@ -1810,6 +1937,11 @@ loose-envify@^1.0.0, loose-envify@^1.4.0: dependencies: js-tokens "^3.0.0 || ^4.0.0" +math-intrinsics@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" + integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== + media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" @@ -1822,10 +1954,10 @@ memfs@^3.4.3: dependencies: fs-monkey "^1.0.4" -merge-descriptors@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" - integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== +merge-descriptors@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.3.tgz#d80319a65f3c7935351e5cfdac8f9318504dbed5" + integrity sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ== merge-stream@^2.0.0: version "2.0.0" @@ -1838,18 +1970,23 @@ methods@~1.1.2: integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== micromatch@^4.0.2: - version "4.0.5" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" - integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + version "4.0.8" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" + integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== dependencies: - braces "^3.0.2" + braces "^3.0.3" picomatch "^2.3.1" -mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": +mime-db@1.52.0: version "1.52.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== +"mime-db@>= 1.43.0 < 2": + version "1.53.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.53.0.tgz#3cb63cd820fc29896d9d4e8c32ab4fcd74ccb447" + integrity sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg== + mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.24, mime-types@~2.1.34: version "2.1.35" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" @@ -1964,6 +2101,11 @@ negotiator@0.6.3: resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== +negotiator@~0.6.4: + version "0.6.4" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.4.tgz#777948e2452651c570b712dd01c23e262713fff7" + integrity sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w== + neo-async@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" @@ -2003,6 +2145,11 @@ object-assign@^4, object-assign@^4.1.1: resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== +object-inspect@^1.13.3: + version "1.13.3" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.3.tgz#f14c183de51130243d6d18ae149375ff50ea488a" + integrity sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA== + object-inspect@^1.9.0: version "1.12.2" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" @@ -2121,15 +2268,15 @@ path-parse@^1.0.7: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== -path-to-regexp@0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" - integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== +path-to-regexp@0.1.12: + version "0.1.12" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.12.tgz#d5e1a12e478a976d432ef3c58d534b9923164bb7" + integrity sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ== picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + version "1.1.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== picocolors@^1.0.1: version "1.0.1" @@ -2195,6 +2342,13 @@ qs@6.11.0: dependencies: side-channel "^1.0.4" +qs@6.13.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.13.0.tgz#6ca3bd58439f7e245655798997787b0d88a51906" + integrity sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg== + dependencies: + side-channel "^1.0.6" + randombytes@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" @@ -2217,6 +2371,16 @@ raw-body@2.5.1: iconv-lite "0.4.24" unpipe "1.0.0" +raw-body@2.5.2: + version "2.5.2" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" + integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + react-bootstrap@2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/react-bootstrap/-/react-bootstrap-2.5.0.tgz#e25e649e37f080d38eeb92ad5b4ed562a1d7de62" @@ -2268,9 +2432,9 @@ react@^19.0.0: integrity sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ== readable-stream@^2.0.1: - version "2.3.7" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" - integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + version "2.3.8" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== dependencies: core-util-is "~1.0.0" inherits "~2.0.3" @@ -2281,9 +2445,9 @@ readable-stream@^2.0.1: util-deprecate "~1.0.1" readable-stream@^3.0.6: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" - integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== dependencies: inherits "^2.0.3" string_decoder "^1.1.1" @@ -2303,10 +2467,10 @@ rechoir@^0.8.0: dependencies: resolve "^1.20.0" -regenerator-runtime@^0.13.10: - version "0.13.11" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" - integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== +regenerator-runtime@^0.14.0: + version "0.14.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" + integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== require-directory@^2.1.1: version "2.1.1" @@ -2361,16 +2525,16 @@ rimraf@^3.0.0, rimraf@^3.0.2: dependencies: glob "^7.1.3" -safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.1.0, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + "safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" @@ -2400,14 +2564,14 @@ schema-utils@^3.2.0: ajv-keywords "^3.5.2" schema-utils@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.0.0.tgz#60331e9e3ae78ec5d16353c467c34b3a0a1d3df7" - integrity sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg== + version "4.3.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.3.0.tgz#3b669f04f71ff2dfb5aba7ce2d5a9d79b35622c0" + integrity sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g== dependencies: "@types/json-schema" "^7.0.9" - ajv "^8.8.0" + ajv "^8.9.0" ajv-formats "^2.1.1" - ajv-keywords "^5.0.0" + ajv-keywords "^5.1.0" select-hose@^2.0.0: version "2.0.0" @@ -2422,10 +2586,10 @@ selfsigned@^2.1.1: "@types/node-forge" "^1.3.0" node-forge "^1" -send@0.18.0: - version "0.18.0" - resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" - integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== +send@0.19.0: + version "0.19.0" + resolved "https://registry.yarnpkg.com/send/-/send-0.19.0.tgz#bbc5a388c8ea6c048967049dbeac0e4a3f09d7f8" + integrity sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw== dependencies: debug "2.6.9" depd "2.0.0" @@ -2468,15 +2632,15 @@ serve-index@^1.9.1: mime-types "~2.1.17" parseurl "~1.3.2" -serve-static@1.15.0: - version "1.15.0" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" - integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== +serve-static@1.16.2: + version "1.16.2" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.16.2.tgz#b6a5343da47f6bdd2673848bf45754941e803296" + integrity sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw== dependencies: - encodeurl "~1.0.2" + encodeurl "~2.0.0" escape-html "~1.0.3" parseurl "~1.3.3" - send "0.18.0" + send "0.19.0" setprototypeof@1.1.0: version "1.1.0" @@ -2508,9 +2672,38 @@ shebang-regex@^3.0.0: integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== shell-quote@^1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" - integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== + version "1.8.2" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.2.tgz#d2d83e057959d53ec261311e9e9b8f51dcb2934a" + integrity sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA== + +side-channel-list@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/side-channel-list/-/side-channel-list-1.0.0.tgz#10cb5984263115d3b7a0e336591e290a830af8ad" + integrity sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA== + dependencies: + es-errors "^1.3.0" + object-inspect "^1.13.3" + +side-channel-map@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/side-channel-map/-/side-channel-map-1.0.1.tgz#d6bb6b37902c6fef5174e5f533fab4c732a26f42" + integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + get-intrinsic "^1.2.5" + object-inspect "^1.13.3" + +side-channel-weakmap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz#11dda19d5368e40ce9ec2bdc1fb0ecbc0790ecea" + integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + get-intrinsic "^1.2.5" + object-inspect "^1.13.3" + side-channel-map "^1.0.1" side-channel@^1.0.4: version "1.0.4" @@ -2521,6 +2714,17 @@ side-channel@^1.0.4: get-intrinsic "^1.0.2" object-inspect "^1.9.0" +side-channel@^1.0.6: + version "1.1.0" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.1.0.tgz#c3fcff9c4da932784873335ec9765fa94ff66bc9" + integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw== + dependencies: + es-errors "^1.3.0" + object-inspect "^1.13.3" + side-channel-list "^1.0.0" + side-channel-map "^1.0.1" + side-channel-weakmap "^1.0.2" + signal-exit@^3.0.3: version "3.0.7" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" @@ -2577,7 +2781,7 @@ source-map-loader@5.0.0: iconv-lite "^0.6.3" source-map-js "^1.0.2" -source-map-support@~0.5.20: +source-map-support@0.5.21, source-map-support@~0.5.20: version "0.5.21" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== @@ -2746,6 +2950,11 @@ tr46@~0.0.3: resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== +tslib@^2.8.0: + version "2.8.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" + integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== + type-is@~1.6.18: version "1.6.18" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" @@ -2774,6 +2983,11 @@ uncontrollable@^7.2.1: invariant "^2.2.4" react-lifecycles-compat "^3.0.4" +uncontrollable@^8.0.4: + version "8.0.4" + resolved "https://registry.yarnpkg.com/uncontrollable/-/uncontrollable-8.0.4.tgz#a0a8307f638795162fafd0550f4a1efa0f8c5eb6" + integrity sha512-ulRWYWHvscPFc0QQXvyJjY6LIXU56f0h8pQFvhxiKk5V1fcI8gp9Ht9leVAhrVjzqMw0BgjspBINx9r6oyJUvQ== + universalify@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" diff --git a/site/content/reference/javadoc/_index.md b/site/content/reference/javadoc/_index.md deleted file mode 100644 index 50dd816b75..0000000000 --- a/site/content/reference/javadoc/_index.md +++ /dev/null @@ -1,7 +0,0 @@ -+++ -pre = "(legacy) " -title = "Javadoc API" -weight = 1000 -summary = "Javadoc API docs. Kotlin classes are not captured as well as in KDoc, so the KDoc could be a better pick for most tasks." -tags = ["javadoc", "api docs"] -+++ diff --git a/site/content/reference/plainkdoc/_index.md b/site/content/reference/kdoc-modules/_index.md similarity index 79% rename from site/content/reference/plainkdoc/_index.md rename to site/content/reference/kdoc-modules/_index.md index d9d84ed207..edda4bf020 100644 --- a/site/content/reference/plainkdoc/_index.md +++ b/site/content/reference/kdoc-modules/_index.md @@ -1,8 +1,8 @@ +++ pre = "" -title = "KDoc API" +title = "Per-module API Docs" post = "" -weight = 200 +weight = 2 summary = "KDoc API docs. Captures both Java and Kotlin API abstractions." tags = ["kdoc", "dokka", "api docs"] +++ diff --git a/site/content/reference/kdoc/_index.md b/site/content/reference/kdoc/_index.md index ba9fe7521a..0b94a8f7db 100644 --- a/site/content/reference/kdoc/_index.md +++ b/site/content/reference/kdoc/_index.md @@ -1,6 +1,6 @@ +++ pre = "" -title = "KDoc API (per-module)" +title = "API Docs" post = "" weight = 2 summary = "KDoc API docs. Captures both Java and Kotlin API abstractions." diff --git a/site/layouts/shortcodes/api.html b/site/layouts/shortcodes/api.html index 97b062f79d..d0e3fe1601 100644 --- a/site/layouts/shortcodes/api.html +++ b/site/layouts/shortcodes/api.html @@ -11,7 +11,7 @@ {{- if ne $method "" -}} .{{- $method -}} {{- end -}} -`](/reference/plainkdoc/alchemist/ +`](/reference/kdoc/alchemist/ {{- $packageRoot -}}.{{- $package -}}/ {{- if ne $class "" -}} {{- lower (replaceRE "([A-Z])" "-$1" $class) -}}/ diff --git a/site/logo-styles.css b/site/logo-styles.css new file mode 100644 index 0000000000..dcc9055c60 --- /dev/null +++ b/site/logo-styles.css @@ -0,0 +1,9 @@ +/* + * Copyright 2014-2024 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + */ + +:root { + --dokka-logo-image-url: url('../images/logo.svg'); + --dokka-logo-height: 28px; + --dokka-logo-width: 28px; +} diff --git a/site/replacements b/site/replacements index 755435dcbe..abae6783c3 100644 --- a/site/replacements +++ b/site/replacements @@ -1,3 +1 @@ -https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-nothing/index.html->https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-nothing.html -https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-function1/index.html->https://kotlinlang.org/docs/lambdas.html#function-types -https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.enums/-enum-entries/index.html->https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.enums/-enum-entries.html +https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-function1/index.html->https://kotlinlang.org/docs/lambdas.html#function-types