From 414de4056a60de043d112f788df5d4cc4c82acdc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 27 Nov 2021 19:03:08 +0000 Subject: [PATCH 1/6] Bump actions/cache from 2.1.6 to 2.1.7 (#15) --- .github/workflows/check.yml | 4 ++-- .github/workflows/release.yml | 10 +++++----- .github/workflows/sandbox.yml | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index 603c9f85..4f6a7d7f 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -45,7 +45,7 @@ jobs: - name: Restore native library cache id: cache-native - uses: actions/cache@v2.1.6 + uses: actions/cache@v2.1.7 with: path: | scripts/build @@ -61,7 +61,7 @@ jobs: - name: Restore Gradle cache id: cache-gradle - uses: actions/cache@v2.1.6 + uses: actions/cache@v2.1.7 with: path: | ~/.gradle/caches diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index ec486bc8..d28a6d29 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -65,7 +65,7 @@ jobs: - name: Restore native cache id: cache-native - uses: actions/cache@v2.1.6 + uses: actions/cache@v2.1.7 with: path: | scripts/build @@ -81,7 +81,7 @@ jobs: - name: Restore Gradle cache id: cache-gradle - uses: actions/cache@v2.1.6 + uses: actions/cache@v2.1.7 with: path: | ~/.gradle/caches @@ -180,7 +180,7 @@ jobs: - name: Restore native cache if: ${{ matrix.repository.enabled == true }} id: cache-native - uses: actions/cache@v2.1.6 + uses: actions/cache@v2.1.7 with: path: | scripts/build @@ -202,7 +202,7 @@ jobs: - name: Restore Gradle cache if: ${{ matrix.repository.enabled == true }} id: cache-gradle - uses: actions/cache@v2.1.6 + uses: actions/cache@v2.1.7 with: path: | ~/.gradle/caches @@ -242,7 +242,7 @@ jobs: - uses: actions/checkout@v2 - name: Restore Gradle cache - uses: actions/cache@v2 + uses: actions/cache@v2.1.7 with: path: | ~/.gradle/caches diff --git a/.github/workflows/sandbox.yml b/.github/workflows/sandbox.yml index d1e646c5..e0d0d27e 100644 --- a/.github/workflows/sandbox.yml +++ b/.github/workflows/sandbox.yml @@ -62,7 +62,7 @@ jobs: - name: Restore native library cache if: ${{ github.event.inputs.runAtEnd == 'true' && startsWith(matrix.os.runner, github.event.inputs.runner) }} id: cache-native - uses: actions/cache@v2.1.6 + uses: actions/cache@v2.1.7 with: path: | scripts/build @@ -81,7 +81,7 @@ jobs: - name: Restore Gradle cache if: ${{ github.event.inputs.runAtEnd == 'true' && startsWith(matrix.os.runner, github.event.inputs.runner) }} id: cache-gradle - uses: actions/cache@v2.1.6 + uses: actions/cache@v2.1.7 with: path: | ~/.gradle/caches From 163e6a81abcf241d9ec2cf7e6f6b92a331aaf67c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martynas=20Petu=C5=A1ka?= Date: Sat, 27 Nov 2021 20:01:26 +0000 Subject: [PATCH 2/6] macos-11 --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index d28a6d29..6abb6b73 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -156,7 +156,7 @@ jobs: tasks: publishToSonatype closeSonatypeStagingRepository enabled: ${{ github.event.inputs.skipMavenCentral != 'y' }} os: - - runner: macos-latest + - runner: macos-11 shell: bash - runner: windows-latest shell: msys2 {0} From d6988f3675fdce59519c45f8f201bdd488eba5fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martynas=20Petu=C5=A1ka?= Date: Fri, 17 Jun 2022 19:12:33 +0100 Subject: [PATCH 3/6] Server (#42) * server rework * granular sourceSets * root server * root server * root server * 0.4.0 * 0.4.0 * 0.4.0 * 0.4.0 * 0.4.0 * 0.4.0 * 0.4.0 * 0.4.0 * 0.4.0 * 0.4.0 * 0.4.0 * 0.4.0 * 0.4.0 * 0.4.0 * 0.4.0 * 0.4.0 * 0.4.0 * 0.4.0 * 0.4.0 * 0.4.0 * 0.4.0 * 0.4.0 * 0.4.0 * INIT * INIT * INIT * INIT * INIT --- .editorconfig | 3 +- .github/dependabot.yml | 4 +- .github/workflows/check.yml | 55 +- .github/workflows/detekt-analysis.yml | 103 - .github/workflows/release.yml | 115 +- .github/workflows/sandbox.yml | 14 +- .gitignore | 1 + CHANGELOG.md | 8 + README.md | 102 +- build-conventions/build.gradle.kts | 37 + {sandbox => build-conventions}/gradle | 0 build-conventions/gradle.properties | 2 + {sandbox => build-conventions}/gradlew | 0 {sandbox => build-conventions}/gradlew.bat | 0 build-conventions/settings.gradle.kts | 18 + .../kotlin/convention.app-compose.gradle.kts | 39 + .../main/kotlin/convention.app-mpp.gradle.kts | 68 + .../kotlin/convention.build-konfig.gradle.kts | 15 + .../main/kotlin/convention.common.gradle.kts | 55 + .../main/kotlin/convention.compose.gradle.kts | 3 + .../main/kotlin/convention.control.gradle.kts | 67 + .../main/kotlin/convention.detekt.gradle.kts | 44 + .../kotlin/convention.git-hooks.gradle.kts | 12 + .../convention.library-android.gradle.kts | 12 + .../kotlin/convention.library-mpp.gradle.kts | 33 + .../convention.local-properties.gradle.kts | 10 + .../src/main/kotlin/convention.mpp.gradle.kts | 94 + .../convention.publishing-jvm.gradle.kts | 15 +- .../convention.publishing-mpp.gradle.kts | 74 + .../convention.publishing-nexus.gradle.kts | 4 +- .../kotlin/convention.publishing.gradle.kts | 50 +- .../src/main/kotlin/ext/MppAppExtension.kt | 14 + .../src/main/kotlin/ext/ProjectExtension.kt | 8 + .../main/kotlin/util/KotlinTargetDetails.kt | 38 + .../src/main/kotlin/util/_global.kt | 35 + .../src/main/kotlin/util/gradle.kt | 15 + .../src/main/kotlin/util/targetGroup.kt | 60 + build-conventions/test/build.gradle.kts | 27 + .../dev/petuska/kamp/test/TestFactory.kt | 4 + .../dev/petuska/kamp/test/dynamicTest.kt | 16 + .../dev/petuska/kamp/test/TestFactory.kt | 5 + .../dev/petuska/kamp/test/dynamicTest.kt | 17 + .../dev/petuska/kamp/test/TestFactory.kt | 5 + .../dev/petuska/kamp/test/dynamicTest.kt | 13 + build.gradle.kts | 47 +- buildSrc/build.gradle.kts | 22 - buildSrc/gradle.properties | 5 - buildSrc/settings.gradle.kts | 13 - .../kotlin/plugin.build-config-jvm.gradle.kts | 40 - .../src/main/kotlin/plugin.common.gradle.kts | 45 - .../main/kotlin/plugin.git-hooks.gradle.kts | 3 - .../main/kotlin/plugin.library-mpp.gradle.kts | 146 -- .../kotlin/plugin.publishing-mpp.gradle.kts | 81 - .../main/kotlin/util/KotlinTargetDetails.kt | 67 - buildSrc/src/main/kotlin/util/gradle.kt | 42 - .../src/main/kotlin/util/nativeTargetGroup.kt | 28 - gradle.properties | 7 +- gradle/detekt.yml | 47 + gradle/libs.toml | 7 + .../versions.properties | 24 +- versions.rules => gradle/versions.rules | 0 gradle/webpack.config.d/files.js | 16 + gradle/webpack.config.d/scss.js | 23 + gradle/wrapper/gradle-wrapper.properties | 2 +- klip-sandbox/build.gradle.kts | 56 + klip-sandbox/gradle | 1 + {sandbox => klip-sandbox}/gradle.properties | 0 klip-sandbox/gradlew | 1 + klip-sandbox/gradlew.bat | 1 + klip-sandbox/js/build.gradle.kts | 35 + klip-sandbox/js/src/test/kotlin/JsTest.kt | 4 + klip-sandbox/js/src/test/kotlin/KlipTest.kt | 20 + .../test/kotlin/__klips__/KlipTest.kt.json | 22 + .../js/src/test/kotlin/subpackage/JsTest.kt | 5 + klip-sandbox/jvm/build.gradle.kts | 26 + klip-sandbox/jvm/src/test/kotlin/JvmTest.kt | 5 + klip-sandbox/jvm/src/test/kotlin/KlipTest.kt | 20 + .../test/kotlin/__klips__/KlipTest.kt.json | 22 + .../jvm/src/test/kotlin/subpackage/JvmTest.kt | 5 + klip-sandbox/kotlin-js-store/yarn.lock | 2032 +++++++++++++++++ klip-sandbox/settings.gradle.kts | 28 + .../src/blockingTest/kotlin/BlockingTest.kt | 19 + .../kotlin/__klips__/BlockingTest.kt.json | 22 + .../src/commonTest/kotlin/CommonTest.kt | 5 + .../src/commonTest/kotlin/KlipTest.kt | 20 + .../kotlin/__klips__/KlipTest.kt.json | 22 + .../kotlin/subpackage/CommonTest.kt | 5 + .../src/main/AndroidManifest.xml | 0 klip-sandbox/src/stubTest/kotlin/StubTest.kt | 7 + kotlin-js-store/yarn.lock | 2032 +++++++++++++++++ library/klip-api/build.gradle.kts | 11 +- .../src/commonMain/kotlin}/KlipContext.kt | 5 +- .../src/commonMain/kotlin/Klippable.kt | 20 + .../src/commonMain/kotlin/assertKlip.kt | 37 - library/klip-assertions/build.gradle.kts | 23 + .../blockingMain/kotlin/assertKlipBlocking.kt | 39 + .../src/commonMain/kotlin/assertKlip.kt | 38 + .../src/main/AndroidManifest.xml | 1 + library/klip-core/build.gradle.kts | 25 +- .../klip-core/src/androidMain/kotlin/File.kt | 21 - .../src/commonMain/kotlin/KlipCompilerAPI.kt | 10 + .../src/commonMain/kotlin/KlipManager.kt | 22 + .../src/commonMain/kotlin/Klippable.kt | 28 - .../src/commonMain/kotlin/domain/Klip.kt | 21 + .../commonMain/kotlin/domain/Serializable.kt | 11 + .../src/commonMain/kotlin/ext/File.kt | 63 - .../src/commonMain/kotlin/ext/cleanupPath.kt | 3 - .../src/commonMain/kotlin/int/KlipManager.kt | 146 -- .../src/commonMain/kotlin/int/KlipType.kt | 5 - .../src/commonTest/kotlin/ext/FileTest.kt | 60 - .../klip-core/src/fallbackMain/kotlin/File.kt | 67 - library/klip-core/src/jsMain/kotlin/File.kt | 87 - library/klip-core/src/jsMain/kotlin/util.kt | 3 - library/klip-core/src/jvmMain/kotlin/File.kt | 21 - .../klip-core/src/mingwMain/kotlin/File.kt | 20 - .../klip-core/src/nativeMain/kotlin/File.kt | 187 -- .../src/sharedMain/kotlin/KlipManager.kt | 86 + .../sharedMain/kotlin/domain/Serializable.kt | 9 + .../src/stubMain/kotlin/KlipManager.kt | 10 + .../stubMain/kotlin/domain/Serializable.kt | 11 + library/klip-core/src/stubMain/kotlin/stub.kt | 6 + library/klip-core/src/unixMain/kotlin/File.kt | 21 - library/klip-runner/build.gradle.kts | 26 + .../src/androidMain/kotlin/runTest.kt | 41 + .../src/commonMain/kotlin/runTest.kt | 32 + .../klip-runner/src/jsMain/kotlin/runTest.kt | 42 + .../klip-runner/src/jvmMain/kotlin/runTest.kt | 41 + .../klip-runner/src/main/AndroidManifest.xml | 1 + .../src/nativeMain/kotlin/runTest.kt | 41 + .../src/sharedMain/kotlin/TestScope.kt | 10 + .../src/stubMain/kotlin/runTest.kt | 31 + plugin/klip-gradle-plugin/build.gradle.kts | 22 +- .../src/main/kotlin/KlipExtension.kt | 54 +- .../src/main/kotlin/KlipPlugin.kt | 139 +- .../main/kotlin/delegate/ChainedProperty.kt | 17 - .../main/kotlin/delegate/FallbackDelegate.kt | 25 - .../main/kotlin/delegate/GradleProperty.kt | 29 - .../main/kotlin/delegate/PropertyDelegate.kt | 48 - .../src/main/kotlin/delegate/builders.kt | 37 - .../main/kotlin/server/KlipServerService.kt | 36 + .../src/main/kotlin/server/klipServer.kt | 77 + .../main/kotlin/task/KlipServerStartTask.kt | 21 + .../src/main/kotlin/task/KlipUpdateTask.kt | 14 - .../src/main/kotlin/util/KlipOption.kt | 90 +- .../src/main/kotlin/util/lazy.kt | 20 + .../test/kotlin/{klip => }/KlipPluginTest.kt | 6 +- .../build.gradle.kts | 23 +- plugin/klip-kotlin-plugin/build.gradle.kts | 12 +- .../main/kotlin/KlipCommandLineProcessor.kt | 102 +- .../src/main/kotlin/KlipComponentRegistrar.kt | 49 +- .../main/kotlin/KlipIrGenerationExtension.kt | 48 +- .../transformer/KlipContextIrTransformer.kt | 97 + .../transformer/KlippableFnIrTransformer.kt | 101 +- .../src/main/kotlin/util/Debugger.kt | 23 - .../src/main/kotlin/util/KlipLogger.kt | 41 + .../src/main/kotlin/util/KlipOption.kt | 75 +- .../src/main/kotlin/util/KlipSettings.kt | 11 +- .../src/main/kotlin/util/ir.kt | 24 + ...otlin.compiler.plugin.CommandLineProcessor | 1 + ....kotlin.compiler.plugin.ComponentRegistrar | 1 + .../src/test/kotlin/KlipPluginITest.kt | 20 +- .../src/test/kotlin/test/Compiler.kt | 53 +- sandbox/.editorconfig | 1 - sandbox/build.gradle.kts | 134 -- sandbox/js/.gitignore | 1 - sandbox/js/build.gradle.kts | 44 - sandbox/jvm/.gitignore | 1 - sandbox/jvm/build.gradle.kts | 48 - sandbox/settings.gradle.kts | 18 - .../kotlin/AndroidNativeArm32Test.kt | 18 - .../__klips__/AndroidNativeArm32Test.kt.klip | 8 - .../kotlin/AndroidNativeArm64Test.kt | 18 - .../__klips__/AndroidNativeArm64Test.kt.klip | 8 - sandbox/src/androidTest/kotlin/AndroidTest.kt | 18 - .../kotlin/__klips__/AndroidTest.kt.klip | 8 - sandbox/src/commonTest/kotlin/CommonTest.kt | 36 - .../kotlin/__klips__/CommonTest.kt.klip | 14 - .../kotlin/subpackage/CommonTest.kt | 18 - .../subpackage/__klips__/CommonTest.kt.klip | 8 - .../src/iosArm32Test/kotlin/IosArm32Test.kt | 18 - .../kotlin/__klips__/IosArm32Test.kt.klip | 8 - .../src/iosArm64Test/kotlin/IosArm64Test.kt | 18 - .../kotlin/__klips__/IosArm64Test.kt.klip | 8 - .../kotlin/IosSimulatorArm64Test.kt | 18 - .../__klips__/IosSimulatorArm64Test.kt.klip | 8 - sandbox/src/iosX64Test/kotlin/IosX64Test.kt | 18 - .../kotlin/__klips__/IosX64Test.kt.klip | 8 - sandbox/src/jsTest/kotlin/JsTest.kt | 18 - .../jsTest/kotlin/__klips__/JsTest.kt.klip | 8 - sandbox/src/jvmTest/kotlin/JvmTest.kt | 18 - .../jvmTest/kotlin/__klips__/JvmTest.kt.klip | 8 - .../kotlin/kotest/JvmAnnotationSpec.kt | 18 - .../jvmTest/kotlin/kotest/JvmBehaviourSpec.kt | 22 - .../jvmTest/kotlin/kotest/JvmDescribeSpec.kt | 18 - .../jvmTest/kotlin/kotest/JvmExpectSpec.kt | 17 - .../jvmTest/kotlin/kotest/JvmFeatureSpec.kt | 17 - .../src/jvmTest/kotlin/kotest/JvmFreeSpec.kt | 19 - .../src/jvmTest/kotlin/kotest/JvmFunSpec.kt | 16 - .../src/jvmTest/kotlin/kotest/JvmWordSpec.kt | 19 - .../__klips__/JvmAnnotationSpec.kt.klip | 8 - .../kotest/__klips__/JvmBehaviourSpec.kt.klip | 14 - .../kotest/__klips__/JvmDescribeSpec.kt.klip | 14 - .../kotest/__klips__/JvmExpectSpec.kt.klip | 14 - .../kotest/__klips__/JvmFeatureSpec.kt.klip | 14 - .../kotest/__klips__/JvmFreeSpec.kt.klip | 14 - .../kotest/__klips__/JvmFunSpec.kt.klip | 8 - .../kotest/__klips__/JvmWordSpec.kt.klip | 14 - .../kotlin/LinuxArm32HfpTest.kt | 18 - .../__klips__/LinuxArm32HfpTest.kt.klip | 8 - .../linuxArm64Test/kotlin/LinuxArm64Test.kt | 18 - .../kotlin/__klips__/LinuxArm64Test.kt.klip | 8 - .../linuxMips32Test/kotlin/LinuxMips32Test.kt | 18 - .../kotlin/__klips__/LinuxMips32Test.kt.klip | 8 - .../kotlin/LinuxMipsel32Test.kt | 18 - .../__klips__/LinuxMipsel32Test.kt.klip | 8 - .../src/linuxX64Test/kotlin/LinuxX64Test.kt | 18 - .../kotlin/__klips__/LinuxX64Test.kt.klip | 8 - .../macosArm64Test/kotlin/MacosArm64Test.kt | 18 - .../kotlin/__klips__/MacosArm64Test.kt.klip | 8 - .../src/macosX64Test/kotlin/MacosX64Test.kt | 18 - .../kotlin/__klips__/MacosX64Test.kt.klip | 8 - .../src/mingwX64Test/kotlin/MingwX64Test.kt | 18 - .../kotlin/__klips__/MingwX64Test.kt.klip | 8 - .../src/mingwX86Test/kotlin/MingwX86Test.kt | 18 - .../kotlin/__klips__/MingwX86Test.kt.klip | 8 - .../src/tvosArm64Test/kotlin/TvosArm64Test.kt | 18 - .../kotlin/__klips__/TvosArm64Test.kt.klip | 8 - .../kotlin/TvosSimulatorArm64Test.kt | 18 - .../__klips__/TvosSimulatorArm64Test.kt.klip | 8 - sandbox/src/tvosX64Test/kotlin/TvosX64Test.kt | 18 - .../kotlin/__klips__/TvosX64Test.kt.klip | 8 - .../kotlin/WatchosArm32Test.kt | 18 - .../kotlin/__klips__/WatchosArm32Test.kt.klip | 8 - .../kotlin/WatchosArm64Test.kt | 18 - .../kotlin/__klips__/WatchosArm64Test.kt.klip | 8 - .../kotlin/WatchosSimulatorArm64Test.kt | 18 - .../WatchosSimulatorArm64Test.kt.klip | 8 - .../watchosX64Test/kotlin/WatchosX64Test.kt | 18 - .../kotlin/__klips__/WatchosX64Test.kt.klip | 8 - .../watchosX86Test/kotlin/WatchosX86Test.kt | 18 - .../kotlin/__klips__/WatchosX86Test.kt.klip | 8 - sandbox/versions.properties | 1 - sandbox/versions.rules | 1 - scripts/setupMingw.sh | 3 +- scripts/setupOSX.sh | 2 +- scripts/setupUbuntu.sh | 4 +- settings.gradle.kts | 26 +- src/commonMain/kotlin/_.kt | 1 + 248 files changed, 6954 insertions(+), 3421 deletions(-) delete mode 100644 .github/workflows/detekt-analysis.yml create mode 100644 build-conventions/build.gradle.kts rename {sandbox => build-conventions}/gradle (100%) create mode 100644 build-conventions/gradle.properties rename {sandbox => build-conventions}/gradlew (100%) rename {sandbox => build-conventions}/gradlew.bat (100%) create mode 100644 build-conventions/settings.gradle.kts create mode 100644 build-conventions/src/main/kotlin/convention.app-compose.gradle.kts create mode 100644 build-conventions/src/main/kotlin/convention.app-mpp.gradle.kts create mode 100644 build-conventions/src/main/kotlin/convention.build-konfig.gradle.kts create mode 100644 build-conventions/src/main/kotlin/convention.common.gradle.kts create mode 100644 build-conventions/src/main/kotlin/convention.compose.gradle.kts create mode 100644 build-conventions/src/main/kotlin/convention.control.gradle.kts create mode 100644 build-conventions/src/main/kotlin/convention.detekt.gradle.kts create mode 100644 build-conventions/src/main/kotlin/convention.git-hooks.gradle.kts create mode 100644 build-conventions/src/main/kotlin/convention.library-android.gradle.kts create mode 100644 build-conventions/src/main/kotlin/convention.library-mpp.gradle.kts create mode 100644 build-conventions/src/main/kotlin/convention.local-properties.gradle.kts create mode 100644 build-conventions/src/main/kotlin/convention.mpp.gradle.kts rename buildSrc/src/main/kotlin/plugin.publishing-jvm.gradle.kts => build-conventions/src/main/kotlin/convention.publishing-jvm.gradle.kts (64%) create mode 100644 build-conventions/src/main/kotlin/convention.publishing-mpp.gradle.kts rename buildSrc/src/main/kotlin/plugin.publishing-nexus.gradle.kts => build-conventions/src/main/kotlin/convention.publishing-nexus.gradle.kts (88%) rename buildSrc/src/main/kotlin/plugin.publishing.gradle.kts => build-conventions/src/main/kotlin/convention.publishing.gradle.kts (60%) create mode 100644 build-conventions/src/main/kotlin/ext/MppAppExtension.kt create mode 100644 build-conventions/src/main/kotlin/ext/ProjectExtension.kt create mode 100644 build-conventions/src/main/kotlin/util/KotlinTargetDetails.kt create mode 100644 build-conventions/src/main/kotlin/util/_global.kt create mode 100644 build-conventions/src/main/kotlin/util/gradle.kt create mode 100644 build-conventions/src/main/kotlin/util/targetGroup.kt create mode 100644 build-conventions/test/build.gradle.kts create mode 100644 build-conventions/test/src/commonMain/kotlin/dev/petuska/kamp/test/TestFactory.kt create mode 100644 build-conventions/test/src/commonMain/kotlin/dev/petuska/kamp/test/dynamicTest.kt create mode 100644 build-conventions/test/src/jsMain/kotlin/dev/petuska/kamp/test/TestFactory.kt create mode 100644 build-conventions/test/src/jsMain/kotlin/dev/petuska/kamp/test/dynamicTest.kt create mode 100644 build-conventions/test/src/jvmMain/kotlin/dev/petuska/kamp/test/TestFactory.kt create mode 100644 build-conventions/test/src/jvmMain/kotlin/dev/petuska/kamp/test/dynamicTest.kt delete mode 100644 buildSrc/build.gradle.kts delete mode 100644 buildSrc/gradle.properties delete mode 100644 buildSrc/settings.gradle.kts delete mode 100644 buildSrc/src/main/kotlin/plugin.build-config-jvm.gradle.kts delete mode 100644 buildSrc/src/main/kotlin/plugin.common.gradle.kts delete mode 100644 buildSrc/src/main/kotlin/plugin.git-hooks.gradle.kts delete mode 100644 buildSrc/src/main/kotlin/plugin.library-mpp.gradle.kts delete mode 100644 buildSrc/src/main/kotlin/plugin.publishing-mpp.gradle.kts delete mode 100644 buildSrc/src/main/kotlin/util/KotlinTargetDetails.kt delete mode 100644 buildSrc/src/main/kotlin/util/gradle.kt delete mode 100644 buildSrc/src/main/kotlin/util/nativeTargetGroup.kt create mode 100644 gradle/detekt.yml create mode 100644 gradle/libs.toml rename versions.properties => gradle/versions.properties (50%) rename versions.rules => gradle/versions.rules (100%) create mode 100644 gradle/webpack.config.d/files.js create mode 100644 gradle/webpack.config.d/scss.js create mode 100644 klip-sandbox/build.gradle.kts create mode 120000 klip-sandbox/gradle rename {sandbox => klip-sandbox}/gradle.properties (100%) create mode 120000 klip-sandbox/gradlew create mode 120000 klip-sandbox/gradlew.bat create mode 100644 klip-sandbox/js/build.gradle.kts create mode 100644 klip-sandbox/js/src/test/kotlin/JsTest.kt create mode 100644 klip-sandbox/js/src/test/kotlin/KlipTest.kt create mode 100644 klip-sandbox/js/src/test/kotlin/__klips__/KlipTest.kt.json create mode 100644 klip-sandbox/js/src/test/kotlin/subpackage/JsTest.kt create mode 100644 klip-sandbox/jvm/build.gradle.kts create mode 100644 klip-sandbox/jvm/src/test/kotlin/JvmTest.kt create mode 100644 klip-sandbox/jvm/src/test/kotlin/KlipTest.kt create mode 100644 klip-sandbox/jvm/src/test/kotlin/__klips__/KlipTest.kt.json create mode 100644 klip-sandbox/jvm/src/test/kotlin/subpackage/JvmTest.kt create mode 100644 klip-sandbox/kotlin-js-store/yarn.lock create mode 100644 klip-sandbox/settings.gradle.kts create mode 100644 klip-sandbox/src/blockingTest/kotlin/BlockingTest.kt create mode 100644 klip-sandbox/src/blockingTest/kotlin/__klips__/BlockingTest.kt.json create mode 100644 klip-sandbox/src/commonTest/kotlin/CommonTest.kt create mode 100644 klip-sandbox/src/commonTest/kotlin/KlipTest.kt create mode 100644 klip-sandbox/src/commonTest/kotlin/__klips__/KlipTest.kt.json create mode 100644 klip-sandbox/src/commonTest/kotlin/subpackage/CommonTest.kt rename {sandbox => klip-sandbox}/src/main/AndroidManifest.xml (100%) create mode 100644 klip-sandbox/src/stubTest/kotlin/StubTest.kt create mode 100644 kotlin-js-store/yarn.lock rename library/{klip-core/src/commonMain/kotlin/int => klip-api/src/commonMain/kotlin}/KlipContext.kt (74%) create mode 100644 library/klip-api/src/commonMain/kotlin/Klippable.kt delete mode 100644 library/klip-api/src/commonMain/kotlin/assertKlip.kt create mode 100644 library/klip-assertions/build.gradle.kts create mode 100644 library/klip-assertions/src/blockingMain/kotlin/assertKlipBlocking.kt create mode 100644 library/klip-assertions/src/commonMain/kotlin/assertKlip.kt create mode 100644 library/klip-assertions/src/main/AndroidManifest.xml delete mode 100644 library/klip-core/src/androidMain/kotlin/File.kt create mode 100644 library/klip-core/src/commonMain/kotlin/KlipCompilerAPI.kt create mode 100644 library/klip-core/src/commonMain/kotlin/KlipManager.kt delete mode 100644 library/klip-core/src/commonMain/kotlin/Klippable.kt create mode 100644 library/klip-core/src/commonMain/kotlin/domain/Klip.kt create mode 100644 library/klip-core/src/commonMain/kotlin/domain/Serializable.kt delete mode 100644 library/klip-core/src/commonMain/kotlin/ext/File.kt delete mode 100644 library/klip-core/src/commonMain/kotlin/ext/cleanupPath.kt delete mode 100644 library/klip-core/src/commonMain/kotlin/int/KlipManager.kt delete mode 100644 library/klip-core/src/commonMain/kotlin/int/KlipType.kt delete mode 100644 library/klip-core/src/commonTest/kotlin/ext/FileTest.kt delete mode 100644 library/klip-core/src/fallbackMain/kotlin/File.kt delete mode 100644 library/klip-core/src/jsMain/kotlin/File.kt delete mode 100644 library/klip-core/src/jsMain/kotlin/util.kt delete mode 100644 library/klip-core/src/jvmMain/kotlin/File.kt delete mode 100644 library/klip-core/src/mingwMain/kotlin/File.kt delete mode 100644 library/klip-core/src/nativeMain/kotlin/File.kt create mode 100644 library/klip-core/src/sharedMain/kotlin/KlipManager.kt create mode 100644 library/klip-core/src/sharedMain/kotlin/domain/Serializable.kt create mode 100644 library/klip-core/src/stubMain/kotlin/KlipManager.kt create mode 100644 library/klip-core/src/stubMain/kotlin/domain/Serializable.kt create mode 100644 library/klip-core/src/stubMain/kotlin/stub.kt delete mode 100644 library/klip-core/src/unixMain/kotlin/File.kt create mode 100644 library/klip-runner/build.gradle.kts create mode 100644 library/klip-runner/src/androidMain/kotlin/runTest.kt create mode 100644 library/klip-runner/src/commonMain/kotlin/runTest.kt create mode 100644 library/klip-runner/src/jsMain/kotlin/runTest.kt create mode 100644 library/klip-runner/src/jvmMain/kotlin/runTest.kt create mode 100644 library/klip-runner/src/main/AndroidManifest.xml create mode 100644 library/klip-runner/src/nativeMain/kotlin/runTest.kt create mode 100644 library/klip-runner/src/sharedMain/kotlin/TestScope.kt create mode 100644 library/klip-runner/src/stubMain/kotlin/runTest.kt delete mode 100644 plugin/klip-gradle-plugin/src/main/kotlin/delegate/ChainedProperty.kt delete mode 100644 plugin/klip-gradle-plugin/src/main/kotlin/delegate/FallbackDelegate.kt delete mode 100644 plugin/klip-gradle-plugin/src/main/kotlin/delegate/GradleProperty.kt delete mode 100644 plugin/klip-gradle-plugin/src/main/kotlin/delegate/PropertyDelegate.kt delete mode 100644 plugin/klip-gradle-plugin/src/main/kotlin/delegate/builders.kt create mode 100644 plugin/klip-gradle-plugin/src/main/kotlin/server/KlipServerService.kt create mode 100644 plugin/klip-gradle-plugin/src/main/kotlin/server/klipServer.kt create mode 100644 plugin/klip-gradle-plugin/src/main/kotlin/task/KlipServerStartTask.kt delete mode 100644 plugin/klip-gradle-plugin/src/main/kotlin/task/KlipUpdateTask.kt create mode 100644 plugin/klip-gradle-plugin/src/main/kotlin/util/lazy.kt rename plugin/klip-gradle-plugin/src/test/kotlin/{klip => }/KlipPluginTest.kt (73%) create mode 100644 plugin/klip-kotlin-plugin/src/main/kotlin/transformer/KlipContextIrTransformer.kt delete mode 100644 plugin/klip-kotlin-plugin/src/main/kotlin/util/Debugger.kt create mode 100644 plugin/klip-kotlin-plugin/src/main/kotlin/util/KlipLogger.kt create mode 100644 plugin/klip-kotlin-plugin/src/main/kotlin/util/ir.kt create mode 100644 plugin/klip-kotlin-plugin/src/main/resources/META-INF/services/org.jetbrains.kotlin.compiler.plugin.CommandLineProcessor create mode 100644 plugin/klip-kotlin-plugin/src/main/resources/META-INF/services/org.jetbrains.kotlin.compiler.plugin.ComponentRegistrar delete mode 120000 sandbox/.editorconfig delete mode 100644 sandbox/build.gradle.kts delete mode 100644 sandbox/js/.gitignore delete mode 100644 sandbox/js/build.gradle.kts delete mode 100644 sandbox/jvm/.gitignore delete mode 100644 sandbox/jvm/build.gradle.kts delete mode 100644 sandbox/settings.gradle.kts delete mode 100644 sandbox/src/androidNativeArm32Test/kotlin/AndroidNativeArm32Test.kt delete mode 100644 sandbox/src/androidNativeArm32Test/kotlin/__klips__/AndroidNativeArm32Test.kt.klip delete mode 100644 sandbox/src/androidNativeArm64Test/kotlin/AndroidNativeArm64Test.kt delete mode 100644 sandbox/src/androidNativeArm64Test/kotlin/__klips__/AndroidNativeArm64Test.kt.klip delete mode 100644 sandbox/src/androidTest/kotlin/AndroidTest.kt delete mode 100644 sandbox/src/androidTest/kotlin/__klips__/AndroidTest.kt.klip delete mode 100644 sandbox/src/commonTest/kotlin/CommonTest.kt delete mode 100644 sandbox/src/commonTest/kotlin/__klips__/CommonTest.kt.klip delete mode 100644 sandbox/src/commonTest/kotlin/subpackage/CommonTest.kt delete mode 100644 sandbox/src/commonTest/kotlin/subpackage/__klips__/CommonTest.kt.klip delete mode 100644 sandbox/src/iosArm32Test/kotlin/IosArm32Test.kt delete mode 100644 sandbox/src/iosArm32Test/kotlin/__klips__/IosArm32Test.kt.klip delete mode 100644 sandbox/src/iosArm64Test/kotlin/IosArm64Test.kt delete mode 100644 sandbox/src/iosArm64Test/kotlin/__klips__/IosArm64Test.kt.klip delete mode 100644 sandbox/src/iosSimulatorArm64Test/kotlin/IosSimulatorArm64Test.kt delete mode 100644 sandbox/src/iosSimulatorArm64Test/kotlin/__klips__/IosSimulatorArm64Test.kt.klip delete mode 100644 sandbox/src/iosX64Test/kotlin/IosX64Test.kt delete mode 100644 sandbox/src/iosX64Test/kotlin/__klips__/IosX64Test.kt.klip delete mode 100644 sandbox/src/jsTest/kotlin/JsTest.kt delete mode 100644 sandbox/src/jsTest/kotlin/__klips__/JsTest.kt.klip delete mode 100644 sandbox/src/jvmTest/kotlin/JvmTest.kt delete mode 100644 sandbox/src/jvmTest/kotlin/__klips__/JvmTest.kt.klip delete mode 100644 sandbox/src/jvmTest/kotlin/kotest/JvmAnnotationSpec.kt delete mode 100644 sandbox/src/jvmTest/kotlin/kotest/JvmBehaviourSpec.kt delete mode 100644 sandbox/src/jvmTest/kotlin/kotest/JvmDescribeSpec.kt delete mode 100644 sandbox/src/jvmTest/kotlin/kotest/JvmExpectSpec.kt delete mode 100644 sandbox/src/jvmTest/kotlin/kotest/JvmFeatureSpec.kt delete mode 100644 sandbox/src/jvmTest/kotlin/kotest/JvmFreeSpec.kt delete mode 100644 sandbox/src/jvmTest/kotlin/kotest/JvmFunSpec.kt delete mode 100644 sandbox/src/jvmTest/kotlin/kotest/JvmWordSpec.kt delete mode 100644 sandbox/src/jvmTest/kotlin/kotest/__klips__/JvmAnnotationSpec.kt.klip delete mode 100644 sandbox/src/jvmTest/kotlin/kotest/__klips__/JvmBehaviourSpec.kt.klip delete mode 100644 sandbox/src/jvmTest/kotlin/kotest/__klips__/JvmDescribeSpec.kt.klip delete mode 100644 sandbox/src/jvmTest/kotlin/kotest/__klips__/JvmExpectSpec.kt.klip delete mode 100644 sandbox/src/jvmTest/kotlin/kotest/__klips__/JvmFeatureSpec.kt.klip delete mode 100644 sandbox/src/jvmTest/kotlin/kotest/__klips__/JvmFreeSpec.kt.klip delete mode 100644 sandbox/src/jvmTest/kotlin/kotest/__klips__/JvmFunSpec.kt.klip delete mode 100644 sandbox/src/jvmTest/kotlin/kotest/__klips__/JvmWordSpec.kt.klip delete mode 100644 sandbox/src/linuxArm32HfpTest/kotlin/LinuxArm32HfpTest.kt delete mode 100644 sandbox/src/linuxArm32HfpTest/kotlin/__klips__/LinuxArm32HfpTest.kt.klip delete mode 100644 sandbox/src/linuxArm64Test/kotlin/LinuxArm64Test.kt delete mode 100644 sandbox/src/linuxArm64Test/kotlin/__klips__/LinuxArm64Test.kt.klip delete mode 100644 sandbox/src/linuxMips32Test/kotlin/LinuxMips32Test.kt delete mode 100644 sandbox/src/linuxMips32Test/kotlin/__klips__/LinuxMips32Test.kt.klip delete mode 100644 sandbox/src/linuxMipsel32Test/kotlin/LinuxMipsel32Test.kt delete mode 100644 sandbox/src/linuxMipsel32Test/kotlin/__klips__/LinuxMipsel32Test.kt.klip delete mode 100644 sandbox/src/linuxX64Test/kotlin/LinuxX64Test.kt delete mode 100644 sandbox/src/linuxX64Test/kotlin/__klips__/LinuxX64Test.kt.klip delete mode 100644 sandbox/src/macosArm64Test/kotlin/MacosArm64Test.kt delete mode 100644 sandbox/src/macosArm64Test/kotlin/__klips__/MacosArm64Test.kt.klip delete mode 100644 sandbox/src/macosX64Test/kotlin/MacosX64Test.kt delete mode 100644 sandbox/src/macosX64Test/kotlin/__klips__/MacosX64Test.kt.klip delete mode 100644 sandbox/src/mingwX64Test/kotlin/MingwX64Test.kt delete mode 100644 sandbox/src/mingwX64Test/kotlin/__klips__/MingwX64Test.kt.klip delete mode 100644 sandbox/src/mingwX86Test/kotlin/MingwX86Test.kt delete mode 100644 sandbox/src/mingwX86Test/kotlin/__klips__/MingwX86Test.kt.klip delete mode 100644 sandbox/src/tvosArm64Test/kotlin/TvosArm64Test.kt delete mode 100644 sandbox/src/tvosArm64Test/kotlin/__klips__/TvosArm64Test.kt.klip delete mode 100644 sandbox/src/tvosSimulatorArm64Test/kotlin/TvosSimulatorArm64Test.kt delete mode 100644 sandbox/src/tvosSimulatorArm64Test/kotlin/__klips__/TvosSimulatorArm64Test.kt.klip delete mode 100644 sandbox/src/tvosX64Test/kotlin/TvosX64Test.kt delete mode 100644 sandbox/src/tvosX64Test/kotlin/__klips__/TvosX64Test.kt.klip delete mode 100644 sandbox/src/watchosArm32Test/kotlin/WatchosArm32Test.kt delete mode 100644 sandbox/src/watchosArm32Test/kotlin/__klips__/WatchosArm32Test.kt.klip delete mode 100644 sandbox/src/watchosArm64Test/kotlin/WatchosArm64Test.kt delete mode 100644 sandbox/src/watchosArm64Test/kotlin/__klips__/WatchosArm64Test.kt.klip delete mode 100644 sandbox/src/watchosSimulatorArm64Test/kotlin/WatchosSimulatorArm64Test.kt delete mode 100644 sandbox/src/watchosSimulatorArm64Test/kotlin/__klips__/WatchosSimulatorArm64Test.kt.klip delete mode 100644 sandbox/src/watchosX64Test/kotlin/WatchosX64Test.kt delete mode 100644 sandbox/src/watchosX64Test/kotlin/__klips__/WatchosX64Test.kt.klip delete mode 100644 sandbox/src/watchosX86Test/kotlin/WatchosX86Test.kt delete mode 100644 sandbox/src/watchosX86Test/kotlin/__klips__/WatchosX86Test.kt.klip delete mode 120000 sandbox/versions.properties delete mode 120000 sandbox/versions.rules diff --git a/.editorconfig b/.editorconfig index df2db675..286c9af6 100644 --- a/.editorconfig +++ b/.editorconfig @@ -2,6 +2,5 @@ root = true [*] indent_size = 2 -continuation_indent_size = 2 ij_continuation_indent_size = 2 -ij_kotlin_name_count_to_use_star_import = 9000 +ij_kotlin_name_count_to_use_star_import = 5 diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 9b54f912..f24e4164 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -3,8 +3,8 @@ updates: - package-ecosystem: "github-actions" directory: "/" schedule: - interval: "daily" + interval: "monthly" - package-ecosystem: "gradle" directory: "/" schedule: - interval: "daily" + interval: "monthly" diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index 4f6a7d7f..93194aaa 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -5,9 +5,14 @@ on: branches: - '**' workflow_dispatch: + workflow_call: + +concurrency: + cancel-in-progress: true + group: ${{ github.workflow }}-${{ github.head_ref || github.ref }} env: - GRADLE_OPTS: "-Dorg.gradle.daemon=false" + GRADLE_OPTS: "-Dorg.gradle.daemon=true" jobs: check: @@ -20,32 +25,32 @@ jobs: fail-fast: false matrix: os: - - runner: macos-11 + - runner: macos-latest shell: bash + separator: '/' - runner: ubuntu-latest shell: bash + separator: '/' - runner: windows-latest shell: msys2 {0} + separator: '\' steps: - uses: msys2/setup-msys2@v2 if: ${{ runner.os == 'Windows' }} with: + release: false msystem: MINGW64 path-type: inherit update: true install: >- - tar - make - mingw-w64-x86_64-gcc - mingw-w64-x86_64-cmake - mingw-w64-x86_64-extra-cmake-modules - mingw64/mingw-w64-x86_64-cyrus-sasl + curl + mingw-w64-x86_64-curl - - uses: actions/checkout@v2 + - uses: actions/checkout@v3.0.2 - name: Restore native library cache id: cache-native - uses: actions/cache@v2.1.7 + uses: actions/cache@v3.0.4 with: path: | scripts/build @@ -54,14 +59,14 @@ jobs: - name: Setup native libraries run: ./scripts/setup.sh - - uses: actions/setup-java@v2 + - uses: actions/setup-java@v3 with: distribution: 'adopt' java-version: 11 - name: Restore Gradle cache id: cache-gradle - uses: actions/cache@v2.1.7 + uses: actions/cache@v3.0.4 with: path: | ~/.gradle/caches @@ -78,15 +83,33 @@ jobs: - name: Gradle Check run: ./gradlew check --scan + - name: Make artifact location URIs relative + if: ${{ always() }} + continue-on-error: true + run: | + ls '${{ github.workspace }}${{ matrix.os.separator }}build${{ matrix.os.separator }}reports${{ matrix.os.separator }}detekt${{ matrix.os.separator }}' + cp '${{ github.workspace }}${{ matrix.os.separator }}build${{ matrix.os.separator }}reports${{ matrix.os.separator }}detekt${{ matrix.os.separator }}detekt.sarif' '${{ github.workspace }}${{ matrix.os.separator }}detekt.sarif.json' + echo "$( + jq --arg github_workspace ${{ github.workspace }} \ + '. | ( .runs[].results[].locations[].physicalLocation.artifactLocation.uri |= if test($github_workspace) then .[($github_workspace | length | . + 1):] else . end )' \ + '${{ github.workspace }}${{ matrix.os.separator }}detekt.sarif.json' + )" > '${{ github.workspace }}${{ matrix.os.separator }}detekt.sarif.json' + + - uses: github/codeql-action/upload-sarif@v2 + if: ${{ always() }} + with: + sarif_file: ${{ github.workspace }}${{ matrix.os.separator }}detekt.sarif.json + checkout_path: ${{ github.workspace }} + - name: Gradle Check Sandbox env: - SANDBOX: true - working-directory: sandbox + LIBRARY_PATH: "C:/msys64/mingw64/lib" + working-directory: klip-sandbox run: ./gradlew check --scan - - uses: actions/upload-artifact@v2 + - uses: actions/upload-artifact@v3 if: ${{ always() }} with: name: reports-${{ runner.os }} path: | - **/build/reports + **${{ matrix.os.separator }}build${{ matrix.os.separator }}reports diff --git a/.github/workflows/detekt-analysis.yml b/.github/workflows/detekt-analysis.yml deleted file mode 100644 index 1757f1c6..00000000 --- a/.github/workflows/detekt-analysis.yml +++ /dev/null @@ -1,103 +0,0 @@ -# This workflow performs a static analysis of your Kotlin source code using -# Detekt. -# -# Scans are triggered: -# 1. On every push to default and protected branches -# 2. On every Pull Request targeting the default branch -# 3. On a weekly schedule -# 4. Manually, on demand, via the "workflow_dispatch" event -# -# The workflow should work with no modifications, but you might like to use a -# later version of the Detekt CLI by modifing the $DETEKT_RELEASE_TAG -# environment variable. -name: Scan with Detekt - -on: - # Triggers the workflow on push or pull request events but only for default and protected branches - push: - branches: [ master ] - pull_request: - branches: [ master ] - schedule: - - cron: '37 7 * * 0' - - # Allows you to run this workflow manually from the Actions tab - workflow_dispatch: - -env: - # Release tag associated with version of Detekt to be installed - # SARIF support (required for this workflow) was introduced in Detekt v1.15.0 - DETEKT_RELEASE_TAG: v1.15.0 - -# A workflow run is made up of one or more jobs that can run sequentially or in parallel -jobs: - # This workflow contains a single job called "scan" - scan: - name: Scan - # The type of runner that the job will run on - runs-on: ubuntu-latest - - # Steps represent a sequence of tasks that will be executed as part of the job - steps: - # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it - - uses: actions/checkout@v2 - - # Gets the download URL associated with the $DETEKT_RELEASE_TAG - - name: Get Detekt download URL - id: detekt_info - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - DETEKT_DOWNLOAD_URL=$( gh api graphql --field tagName=$DETEKT_RELEASE_TAG --raw-field query=' - query getReleaseAssetDownloadUrl($tagName: String!) { - repository(name: "detekt", owner: "detekt") { - release(tagName: $tagName) { - releaseAssets(name: "detekt", first: 1) { - nodes { - downloadUrl - } - } - } - } - } - ' | \ - jq --raw-output '.data.repository.release.releaseAssets.nodes[0].downloadUrl' ) - echo "::set-output name=download_url::$DETEKT_DOWNLOAD_URL" - - # Sets up the detekt cli - - name: Setup Detekt - run: | - dest=$( mktemp -d ) - curl --request GET \ - --url ${{ steps.detekt_info.outputs.download_url }} \ - --silent \ - --location \ - --output $dest/detekt - chmod a+x $dest/detekt - echo $dest >> $GITHUB_PATH - - # Performs static analysis using Detekt - - name: Run Detekt - continue-on-error: true - run: | - detekt --input ${{ github.workspace }} --report sarif:${{ github.workspace }}/detekt.sarif.json - - # Modifies the SARIF output produced by Detekt so that absolute URIs are relative - # This is so we can easily map results onto their source files - # This can be removed once relative URI support lands in Detekt: https://git.io/JLBbA - - name: Make artifact location URIs relative - continue-on-error: true - run: | - echo "$( - jq \ - --arg github_workspace ${{ github.workspace }} \ - '. | ( .runs[].results[].locations[].physicalLocation.artifactLocation.uri |= if test($github_workspace) then .[($github_workspace | length | . + 1):] else . end )' \ - ${{ github.workspace }}/detekt.sarif.json - )" > ${{ github.workspace }}/detekt.sarif.json - - # Uploads results to GitHub repository using the upload-sarif action - - uses: github/codeql-action/upload-sarif@v1 - with: - # Path to SARIF file relative to the root of the repository - sarif_file: ${{ github.workspace }}/detekt.sarif.json - checkout_path: ${{ github.workspace }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 6abb6b73..fcaaf7b7 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -27,61 +27,27 @@ on: env: VERSION: ${{ github.event.release.tag_name }} - GRADLE_OPTS: "-Dorg.gradle.daemon=false" + GRADLE_OPTS: "-Dorg.gradle.daemon=true" jobs: + check: + uses: ./.github/workflows/check.yml + build: - name: Build on ${{ matrix.os.runner }} - runs-on: ${{ matrix.os.runner }} - defaults: - run: - shell: ${{ matrix.os.shell }} - strategy: - fail-fast: false - matrix: - os: - - runner: macos-11 - shell: bash - - runner: windows-latest - shell: msys2 {0} - - runner: ubuntu-latest - shell: bash + name: Build Dokka + needs: [ check ] + runs-on: ubuntu-latest steps: - - uses: msys2/setup-msys2@v2 - if: ${{ runner.os == 'Windows' }} - with: - msystem: MINGW64 - update: true - path-type: inherit - install: >- - tar - make - mingw-w64-x86_64-gcc - mingw-w64-x86_64-cmake - mingw-w64-x86_64-extra-cmake-modules - mingw64/mingw-w64-x86_64-cyrus-sasl - - - uses: actions/checkout@v2 + - uses: actions/checkout@v3.0.2 - - name: Restore native cache - id: cache-native - uses: actions/cache@v2.1.7 - with: - path: | - scripts/build - key: ${{ runner.os }}-native-${{ hashFiles('./scripts/*') }} - - - name: Setup native libraries - run: ./scripts/setup.sh - - - uses: actions/setup-java@v2 + - uses: actions/setup-java@v3 with: distribution: 'adopt' java-version: 11 - name: Restore Gradle cache id: cache-gradle - uses: actions/cache@v2.1.7 + uses: actions/cache@v3.0.4 with: path: | ~/.gradle/caches @@ -97,33 +63,10 @@ jobs: VERSION=${VERSION:=${{ github.event.inputs.version }}} echo "VERSION=${VERSION/v}" >> $GITHUB_ENV - - name: Gradle Assemble Publications - run: ./gradlew publishToMavenLocal --scan - - - name: Gradle Check - run: ./gradlew check --scan - - - name: Gradle Check Sandbox - env: - SANDBOX: true - working-directory: sandbox - run: ./gradlew check --scan - - - uses: actions/upload-artifact@v2 - if: ${{ always() }} - with: - name: publications-${{ runner.os }} - path: | - **/build/publications - **/build/libs - **/build/reports - - name: Gradle Assemble Dokka - if: ${{ runner.os == 'Linux' }} run: ./gradlew dokkaHtmlMultiModule -Pversion=${VERSION//v} --scan - - uses: actions/upload-artifact@v2 - if: ${{ runner.os == 'Linux' }} + - uses: actions/upload-artifact@v3 with: name: dokka path: | @@ -132,7 +75,7 @@ jobs: release-Artefacts: name: Release to ${{ matrix.repository.name }} on ${{ matrix.os.runner }} runs-on: ${{ matrix.os.runner }} - needs: [ build ] + needs: [ check ] defaults: run: shell: ${{ matrix.os.shell }} @@ -156,7 +99,7 @@ jobs: tasks: publishToSonatype closeSonatypeStagingRepository enabled: ${{ github.event.inputs.skipMavenCentral != 'y' }} os: - - runner: macos-11 + - runner: macos-latest shell: bash - runner: windows-latest shell: msys2 {0} @@ -169,31 +112,27 @@ jobs: msystem: MINGW64 update: true path-type: inherit - # install: >- - # tar - # make - # mingw-w64-x86_64-gcc - # mingw-w64-x86_64-cmake - # mingw-w64-x86_64-extra-cmake-modules - # mingw64/mingw-w64-x86_64-cyrus-sasl + install: >- + mingw-w64-curl + curl - name: Restore native cache if: ${{ matrix.repository.enabled == true }} id: cache-native - uses: actions/cache@v2.1.7 + uses: actions/cache@v3.0.4 with: path: | scripts/build key: ${{ runner.os }}-native-${{ hashFiles('./scripts/*') }} - - uses: actions/checkout@v2 + - uses: actions/checkout@v3.0.2 if: ${{ matrix.repository.enabled == true }} - name: Setup native libraries if: ${{ matrix.repository.enabled == true }} run: ./scripts/setup.sh - - uses: actions/setup-java@v2 + - uses: actions/setup-java@v3 if: ${{ matrix.repository.enabled == true }} with: distribution: 'adopt' @@ -202,7 +141,7 @@ jobs: - name: Restore Gradle cache if: ${{ matrix.repository.enabled == true }} id: cache-gradle - uses: actions/cache@v2.1.7 + uses: actions/cache@v3.0.4 with: path: | ~/.gradle/caches @@ -213,7 +152,7 @@ jobs: key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} restore-keys: ${{ runner.os }}-gradle- - - uses: actions/download-artifact@v2 + - uses: actions/download-artifact@v3 if: ${{ matrix.repository.enabled == true }} with: name: publications-${{ runner.os }} @@ -236,13 +175,13 @@ jobs: ORG_GRADLE_PROJECT_signingKeyId: ${{ secrets.SIGNING_KEY_ID }} ORG_GRADLE_PROJECT_signingPassword: ${{ secrets.SIGNING_PASSWORD }} runs-on: ubuntu-latest - needs: [ build, release-Artefacts ] + needs: [ check, release-Artefacts ] if: ${{ github.event.inputs.skipGradlePluginPortal != 'y' }} steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3.0.2 - name: Restore Gradle cache - uses: actions/cache@v2.1.7 + uses: actions/cache@v3.0.4 with: path: | ~/.gradle/caches @@ -251,7 +190,7 @@ jobs: restore-keys: | ${{ runner.os }}-gradle- - - uses: actions/setup-java@v2 + - uses: actions/setup-java@v3 with: distribution: 'adopt' java-version: 11 @@ -271,7 +210,7 @@ jobs: needs: [ build ] if: ${{ github.event.inputs.skipPages != 'y' }} steps: - - uses: actions/download-artifact@v2 + - uses: actions/download-artifact@v3 with: name: dokka @@ -289,7 +228,7 @@ jobs: echo "/${REPO_NAME} /${REPO_NAME}/${REPO_NAME}/index.html 301" > public/_redirects; echo "/${REPO_NAME}/index.html /${REPO_NAME}/${REPO_NAME}/index.html 301" >> public/_redirects; - - uses: crazy-max/ghaction-github-pages@v2.5.0 + - uses: crazy-max/ghaction-github-pages@v3.0.0 with: target_branch: gh-pages build_dir: public diff --git a/.github/workflows/sandbox.yml b/.github/workflows/sandbox.yml index e0d0d27e..5c73252d 100644 --- a/.github/workflows/sandbox.yml +++ b/.github/workflows/sandbox.yml @@ -21,7 +21,7 @@ on: default: "true" env: - GRADLE_OPTS: "-Dorg.gradle.daemon=false" + GRADLE_OPTS: "-Dorg.gradle.daemon=true" SANDBOX: true jobs: @@ -35,7 +35,7 @@ jobs: fail-fast: false matrix: os: - - runner: macos-11 + - runner: macos-latest shell: bash - runner: windows-latest shell: msys2 {0} @@ -56,13 +56,13 @@ jobs: mingw-w64-x86_64-extra-cmake-modules mingw64/mingw-w64-x86_64-cyrus-sasl - - uses: actions/checkout@v2 + - uses: actions/checkout@v3.0.2 if: ${{ startsWith(matrix.os.runner, github.event.inputs.runner) }} - name: Restore native library cache if: ${{ github.event.inputs.runAtEnd == 'true' && startsWith(matrix.os.runner, github.event.inputs.runner) }} id: cache-native - uses: actions/cache@v2.1.7 + uses: actions/cache@v3.0.4 with: path: | scripts/build @@ -72,7 +72,7 @@ jobs: if: ${{ github.event.inputs.runAtEnd == 'true' && startsWith(matrix.os.runner, github.event.inputs.runner) }} run: ./scripts/setup.sh - - uses: actions/setup-java@v2 + - uses: actions/setup-java@v3 if: ${{ startsWith(matrix.os.runner, github.event.inputs.runner) }} with: distribution: 'adopt' @@ -81,7 +81,7 @@ jobs: - name: Restore Gradle cache if: ${{ github.event.inputs.runAtEnd == 'true' && startsWith(matrix.os.runner, github.event.inputs.runner) }} id: cache-gradle - uses: actions/cache@v2.1.7 + uses: actions/cache@v3.0.4 with: path: | ~/.gradle/caches @@ -103,7 +103,7 @@ jobs: if: ${{ startsWith(matrix.os.runner, github.event.inputs.runner) }} run: ${{ github.event.inputs.command }} - - uses: actions/upload-artifact@v2 + - uses: actions/upload-artifact@v3 if: ${{ startsWith(matrix.os.runner, github.event.inputs.runner) && always() }} with: name: build-${{ runner.os }} diff --git a/.gitignore b/.gitignore index 963c45fc..dc08a182 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ .gradle/ .idea/ +.fleet/ .vscode/ build/ out/ diff --git a/CHANGELOG.md b/CHANGELOG.md index b4485e96..3040c6b2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,11 @@ +# 0.4.0 +## Versions +* Kotlin: `1.7.0` +* Gradle: `7.4.2` +* JDK: `11` +## Changes +* Reworked compiler plugin and core to support frontend js test. Based on HTTP client as instead of mock file API + # 0.3.0 ## Versions * Kotlin: `1.6.0` diff --git a/README.md b/README.md index 3e01884e..e238886a 100644 --- a/README.md +++ b/README.md @@ -5,24 +5,30 @@ [![Version maven-central](https://img.shields.io/maven-central/v/dev.petuska/klip?logo=apache-maven&style=flat-square)](https://mvnrepository.com/artifact/dev.petuska/klip/latest) # KLIP + Kotlin Multiplatform snapshot ((c|k)lip) manager for tests. Automatically generates and asserts against a -persistent `Any::toString()` representation of the object until you explicitly trigger an update. Powered by kotlin -compiler plugin to inject relevant keys and paths. +persistent `@kotlinx.serialization.Serializable` representation of the object until you explicitly trigger an update. +Powered by kotlin compiler plugin to inject relevant keys and paths. # Support + The plugin only works on targets using new IR kotlin compiler (which is pretty much all of them since kotlin 1.5 except JS which still defaults to legacy compiler). # Versions + The current version was built using the following tooling versions and is guaranteed to work with this setup. Given the experimental nature of kotlin compiler plugin API, the plugin powering this library is likely to stop working on projects using newer/older kotlin versions. -* Kotlin: `1.6.0` -* Gradle: `7.2.0` + +* Kotlin: `1.7.0` +* Gradle: `7.4.2` * JDK: `11` # Targets + Bellow is a list of currently supported targets and planned targets: + - [x] android - [x] js - [x] jvm @@ -45,10 +51,13 @@ Bellow is a list of currently supported targets and planned targets: There's also a subset of targets that you currently cannot run tests on (and as such making the library redundant). These targets will use a fallback implementation that throws an error on native api access (since those targets will not -execute tests) to enable the general library usage in `commonMain` source set. If you have a valid use-case of the -library for these targets, please raise an issue to discuss a real implementation. +execute tests) to enable the general library usage in commonMain source set. If you have a valid use-case of the library +for these targets, please raise an issue to discuss a real implementation. + - [x] androidNativeArm32 +- [x] androidNativeX86 - [x] androidNativeArm64 +- [x] androidNativeX64 - [x] linuxArm32Hfp - [x] linuxMips32 - [x] linuxMipsel32 @@ -56,7 +65,11 @@ library for these targets, please raise an issue to discuss a real implementatio - [x] mingwX86 # Usage + 1. Apply the plugin and add a runtime dependency. +2. If you're not using `dev.petuska:klip` marker dependency, you'll also need to add an appropriate ktor-client-engine + for each platform + ```kotlin plugins { kotlin("multiplatform") @@ -66,61 +79,69 @@ plugins { sourceSets { commonTest { dependencies { - implementation("dev.petuska:klip:<>") + implementation("dev.petuska:klip") } } } } } ``` + 2. (Optional) Configure the plugin extension (shown with default values). For property descriptions. see [Gradle Properties](#gradle-properties) + ```kotlin klip { - enabled = true // Turns the compiler plugin on/off - update = false // Whether to overwrite the existing klips while running tests - klipAnnotations = setOf("dev.petuska.klip.core.Klippable") // Takes full control of annotations + enabled.set(true) // Turns the compiler plugin on/off + update.set(false) // Whether to overwrite the existing klips while running tests + klipAnnotations.set(setOf("dev.petuska.klip.core.Klippable")) // Takes full control of annotations klipAnnotation("dev.petuska.klip.core.Klippable") // Appends the annotation to the default ones - scopeAnnotations = setOf( - // Takes full control of annotations - "kotlin.test.Test", - "org.junit.Test", - "org.junit.jupiter.api.Test", - "org.testng.annotations.Test", - "io.kotest.core.spec.style.AnnotationSpec.Test", + scopeAnnotations.set( + setOf( + // Takes full control of annotations + "kotlin.test.Test", + "org.junit.Test", + "org.junit.jupiter.api.Test", + "org.testng.annotations.Test", + "io.kotest.core.spec.style.AnnotationSpec.Test", + ) ) scopeAnnotation("kotlin.test.Test") // Appends the annotation to the default ones - scopeFunctions = setOf( - // Takes full control of functions - "io.kotest.core.spec.style.scopes.FunSpecRootScope.test", - "io.kotest.core.spec.style.scopes.DescribeSpecContainerScope.it", - "io.kotest.core.spec.style.scopes.BehaviorSpecWhenContainerScope.Then", - "io.kotest.core.spec.style.scopes.BehaviorSpecWhenContainerScope.then", - "io.kotest.core.spec.style.scopes.WordSpecShouldContainerScope.invoke", - "io.kotest.core.spec.style.scopes.FreeSpecContainerScope.invoke", - "io.kotest.core.spec.style.scopes.FeatureSpecContainerScope.scenario", - "io.kotest.core.spec.style.scopes.ExpectSpecContainerScope.expect", + scopeFunctions.set( + setOf( + // Takes full control of functions + "io.kotest.core.spec.style.scopes.FunSpecRootScope.test", + "io.kotest.core.spec.style.scopes.DescribeSpecContainerScope.it", + "io.kotest.core.spec.style.scopes.BehaviorSpecWhenContainerScope.Then", + "io.kotest.core.spec.style.scopes.BehaviorSpecWhenContainerScope.then", + "io.kotest.core.spec.style.scopes.WordSpecShouldContainerScope.invoke", + "io.kotest.core.spec.style.scopes.FreeSpecContainerScope.invoke", + "io.kotest.core.spec.style.scopes.FeatureSpecContainerScope.scenario", + "io.kotest.core.spec.style.scopes.ExpectSpecContainerScope.expect", + ) ) scopeFunction("io.kotest.core.spec.style.scopes.FunSpecRootContext.test") // Appends the function to the default ones } ``` + 3. Use provided klip assertions anywhere under one of the `scopeAnnotations` or `scopeFunctions`. + ```kotlin class MyTest { data class DomainObject(val name: String, val value: String?) @Test - fun test1() { + fun test1() = runTest { assertMatchesKlip(DomainObject("Dick", "Dickens")) DomainObject("John", "Doe").assertKlip() } @Test - fun test2() { + fun test2() = runTest { doAssertions() } - private fun doAssertions() { + private suspend fun doAssertions() { assertMatchesKlip(DomainObject("Joe", "Mama")) DomainObject("Ben", "Dover").assertKlip() } @@ -128,32 +149,33 @@ class MyTest { ``` ## Gradle Properties + Most of the DSL configuration options can also be set/overridden via gradle properties `./gradlew -Pprop.name=propValue`, `gradle.properties` or `~/.gradle/gradle.properties`. Environment variables are also supported, however gradle properties take precedence over them. Bellow is the full list of supported properties: + * `klip.enabled (KLIP_ENABLED)` - toggles the compiler processing on/off. * `klip.update (KLIP_UPDATE)` - if true, will override and update all previous klips during test run. -* `klip.klipAnnotations (KLIP_KLIPANNOTATIONS)` - comma separated list of fully qualified names of annotations to - process. Only useful when writing your own klippable functions. -* `klip.scopeAnnotations (KLIP_SCOPEANNOTATIONS` - comma separated list of fully qualified names of test annotations to - scope klip keys. -* `klip.scopeFunctions (KLIP_SCOPEFUNCTIONS` - comma separated list of fully qualified names of test functions to scope - klip keys. ## Basic Flow + 1. Run tests as normal and use generated klip assertions such as `assertMatchesKlip(myObject)` or `myObject.assertKlip()`. New klips will always be written to file, whereas existing ones (identified by test class scope and given id) will be read and used for assertions. 2. When the actual value changes, tests will fail since they do not match previous klip. In such cases inspect the differences and if everything is as expected, re-run test(s) with klip updates enabled. This is done by either passing a gradle prop `./gradlew test -Pklip.update`, - setting an environment variable `KLIP_UPDATE=true ./gradlew test` or running update task `./gradlew klipUpdate`. + setting an environment variable `KLIP_UPDATE=true ./gradlew test`. # Modules + * `:library:klip-core` - main runtime library -* `:library:klip-api` - assertion api and utility DSLs +* `:library:klip-api` - shared api and utility DSLs +* `:library:klip-assertions` - assertion api +* `:library:klip-runner` - abstraction over `kotlinx-coroutines-test` to provide truly multiplatform way to run + suspending tests * `:plugin:klip-gradle-plugin` - gradle plugin to manage kotlin compiler plugins * `:plugin:klip-kotlin-plugin` - kotlin compiler plugin for jvm & js that does the actual work -* `:plugin:klip-kotlin-plugin:klip-kotlin-plugin-native` - kotlin compiler plugin for native that does the actual work -* `sandbox` - a playground to test local changes from consumer end +* `:plugin:klip-kotlin-plugin-native` - kotlin compiler plugin for native that does the actual work +* `klip-sandbox` - a playground to test local changes from consumer end diff --git a/build-conventions/build.gradle.kts b/build-conventions/build.gradle.kts new file mode 100644 index 00000000..27c17115 --- /dev/null +++ b/build-conventions/build.gradle.kts @@ -0,0 +1,37 @@ +@file:Suppress("OPT_IN_IS_NOT_ENABLED") + +import de.fayard.refreshVersions.core.RefreshVersionsCorePlugin +import de.fayard.refreshVersions.core.internal.InternalRefreshVersionsApi + +plugins { + `kotlin-dsl` +} + +repositories { + gradlePluginPortal() + mavenCentral() + maven("https://maven.pkg.jetbrains.space/public/p/compose/dev") + google() +} + +dependencies { + implementation("com.android.tools.build:gradle:_") + implementation("org.jetbrains.kotlin:kotlin-gradle-plugin:_") +// implementation("org.jetbrains.kotlin:kotlin-serialization:_") + implementation("org.jetbrains.compose:compose-gradle-plugin:_") + implementation("com.github.jakemarsden:git-hooks-gradle-plugin:_") + implementation("io.gitlab.arturbosch.detekt:detekt-gradle-plugin:_") + implementation("gradle.plugin.com.github.jengelman.gradle.plugins:shadow:_") + implementation("io.github.gradle-nexus:publish-plugin:_") + implementation("org.jetbrains.dokka:dokka-gradle-plugin:_") + implementation("com.github.gmazzo:gradle-buildconfig-plugin:_") + @OptIn(InternalRefreshVersionsApi::class) + implementation("de.fayard.refreshVersions:refreshVersions-core:${RefreshVersionsCorePlugin.currentVersion}") +} + +gradleEnterprise { + buildScan { + termsOfServiceUrl = "https://gradle.com/terms-of-service" + termsOfServiceAgree = "yes" + } +} diff --git a/sandbox/gradle b/build-conventions/gradle similarity index 100% rename from sandbox/gradle rename to build-conventions/gradle diff --git a/build-conventions/gradle.properties b/build-conventions/gradle.properties new file mode 100644 index 00000000..77cd50be --- /dev/null +++ b/build-conventions/gradle.properties @@ -0,0 +1,2 @@ +kotlin.theme=official +kotlin.mpp.stability.nowarn=true diff --git a/sandbox/gradlew b/build-conventions/gradlew similarity index 100% rename from sandbox/gradlew rename to build-conventions/gradlew diff --git a/sandbox/gradlew.bat b/build-conventions/gradlew.bat similarity index 100% rename from sandbox/gradlew.bat rename to build-conventions/gradlew.bat diff --git a/build-conventions/settings.gradle.kts b/build-conventions/settings.gradle.kts new file mode 100644 index 00000000..c22f1f5d --- /dev/null +++ b/build-conventions/settings.gradle.kts @@ -0,0 +1,18 @@ +pluginManagement { + repositories { + gradlePluginPortal() + mavenCentral() + google() + maven("https://maven.pkg.jetbrains.space/public/p/compose/dev") + } +} + +plugins { + id("de.fayard.refreshVersions") version "0.40.2" + id("com.gradle.enterprise") version "3.10.2" +} + +refreshVersions { + versionsPropertiesFile = rootDir.resolve("gradle/versions.properties") + extraArtifactVersionKeyRules(rootDir.resolve("gradle/versions.rules")) +} diff --git a/build-conventions/src/main/kotlin/convention.app-compose.gradle.kts b/build-conventions/src/main/kotlin/convention.app-compose.gradle.kts new file mode 100644 index 00000000..04ac752c --- /dev/null +++ b/build-conventions/src/main/kotlin/convention.app-compose.gradle.kts @@ -0,0 +1,39 @@ +import ext.MppAppExtension + +plugins { + id("convention.app-mpp") + id("convention.compose") +} + +extensions.configure { + fatJar by false +} + +kotlin { + sourceSets { + commonMain { + dependencies { + implementation(compose.runtime) + } + } + jvmMain { + dependencies { + implementation(compose.desktop.currentOs) + } + } + jsMain { + dependencies { + implementation(compose.web.core) + implementation(compose.web.svg) + } + } + jsTest { + dependencies { + implementation(compose.web.testUtils) + } + languageSettings { + optIn("org.jetbrains.compose.web.testutils.ComposeWebExperimentalTestsApi") + } + } + } +} diff --git a/build-conventions/src/main/kotlin/convention.app-mpp.gradle.kts b/build-conventions/src/main/kotlin/convention.app-mpp.gradle.kts new file mode 100644 index 00000000..1cbead7e --- /dev/null +++ b/build-conventions/src/main/kotlin/convention.app-mpp.gradle.kts @@ -0,0 +1,68 @@ +import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar +import ext.MppAppExtension +import util.Git + +plugins { + id("convention.mpp") + id("com.github.johnrengelman.shadow") +} + +val mppApp = extensions.create("mppApp", MppAppExtension::class, project) + +kotlin { + jvm() + js(IR) { + binaries.executable() + } +} + +tasks { + val jvmRuntimeClasspath = configurations.named("jvmRuntimeClasspath") + val compileKotlinJvm = named("compileKotlinJvm") + val jvmProcessResources = named("jvmProcessResources") + val fatJar = register("jvmFatJar") { + onlyIf { mppApp.fatJar.get() } + group = "build" + manifest { + attributes( + mapOf( + "Built-By" to System.getProperty("user.name"), + "Build-Jdk" to System.getProperty("java.version"), + "Implementation-Version" to project.version, + "Created-By" to "${GradleVersion.current()}", + "Created-From" to Git.headCommitHash + ) + (mppApp.jvmMainClass.orNull?.let { mapOf("Main-Class" to it) } ?: mapOf()) + ) + } + mergeServiceFiles() + archiveAppendix.set("jvm") + archiveClassifier.set("fat") + from(compileKotlinJvm, jvmProcessResources) + configurations.add(jvmRuntimeClasspath.get()) + inputs.property("mainClassName", mppApp.jvmMainClass) + } + assemble { + dependsOn(fatJar) + } + register("jvmRun") { + onlyIf { mppApp.jvmMainClass.isPresent } + classpath(compileKotlinJvm, jvmProcessResources, jvmRuntimeClasspath) + mppApp.jvmMainClass.orNull?.let { + mainClass.set(it) + inputs.property("mainClassName", it) + } + } +} + +afterEvaluate { + tasks { + withType { + group = "run" + } + names.filter { it.startsWith("js") && it.endsWith("Run") }.forEach { + named(it) { + group = "run" + } + } + } +} diff --git a/build-conventions/src/main/kotlin/convention.build-konfig.gradle.kts b/build-conventions/src/main/kotlin/convention.build-konfig.gradle.kts new file mode 100644 index 00000000..fb511013 --- /dev/null +++ b/build-conventions/src/main/kotlin/convention.build-konfig.gradle.kts @@ -0,0 +1,15 @@ +plugins { + id("convention.common") + id("com.github.gmazzo.buildconfig") +} + +buildConfig { + useKotlinOutput { + internalVisibility = true + topLevelConstants = true + } + packageName("dev.petuska.klip.plugin.config") + buildConfigField("String", "GROUP", "\"${rootProject.group}\"") + buildConfigField("String", "NAME", "\"${rootProject.name}\"") + buildConfigField("String", "VERSION", "\"${rootProject.version}\"") +} diff --git a/build-conventions/src/main/kotlin/convention.common.gradle.kts b/build-conventions/src/main/kotlin/convention.common.gradle.kts new file mode 100644 index 00000000..6255b64b --- /dev/null +++ b/build-conventions/src/main/kotlin/convention.common.gradle.kts @@ -0,0 +1,55 @@ +import org.jetbrains.kotlin.konan.target.HostManager + +plugins { + id("io.gitlab.arturbosch.detekt") + id("convention.local-properties") + id("convention.detekt") + idea +} + +repositories { + mavenCentral() + maven("https://maven.pkg.jetbrains.space/public/p/compose/dev") + google() + gradlePluginPortal() +} + +printlnCI( + """ + CI: $CI + SANDBOX: $SANDBOX + isMainHost: $isMainHost + --- + hostIsLinux: ${HostManager.hostIsLinux} + hostIsMac: ${HostManager.hostIsMac} + hostIsMingw: ${HostManager.hostIsMingw} + """.trimIndent() +) + +idea { + module { + isDownloadSources = true + isDownloadJavadoc = true + } +} + +tasks { + withType { useJUnitPlatform() } +} + +afterEvaluate { + tasks { + if (findByName("compile") == null) { + register("compile") { + dependsOn(withType(AbstractCompile::class)) + group = "build" + } + } + if (findByName("allTests") == null) { + register("allTests") { + dependsOn(withType(AbstractTestTask::class)) + group = "verification" + } + } + } +} diff --git a/build-conventions/src/main/kotlin/convention.compose.gradle.kts b/build-conventions/src/main/kotlin/convention.compose.gradle.kts new file mode 100644 index 00000000..8aceafba --- /dev/null +++ b/build-conventions/src/main/kotlin/convention.compose.gradle.kts @@ -0,0 +1,3 @@ +plugins { + id("org.jetbrains.compose") +} diff --git a/build-conventions/src/main/kotlin/convention.control.gradle.kts b/build-conventions/src/main/kotlin/convention.control.gradle.kts new file mode 100644 index 00000000..48431421 --- /dev/null +++ b/build-conventions/src/main/kotlin/convention.control.gradle.kts @@ -0,0 +1,67 @@ +import org.jetbrains.kotlin.gradle.dsl.KotlinJsProjectExtension +import org.jetbrains.kotlin.gradle.dsl.KotlinJvmProjectExtension +import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension +import org.jetbrains.kotlin.gradle.plugin.KotlinTarget +import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget +import org.jetbrains.kotlin.konan.target.Family +import org.jetbrains.kotlin.konan.target.HostManager +import util.buildHost + +plugins { + id("convention.common") +} + +pluginManager.withPlugin("org.jetbrains.kotlin.multiplatform") { + extensions.getByType(KotlinMultiplatformExtension::class.java).targets.let(::control) +} +pluginManager.withPlugin("org.jetbrains.kotlin.jvm") { + objects.namedDomainObjectList(KotlinTarget::class.java).apply { + add(extensions.getByType(KotlinJvmProjectExtension::class.java).target) + }.let(::control) +} +pluginManager.withPlugin("org.jetbrains.kotlin.js") { + objects.namedDomainObjectList(KotlinTarget::class.java).apply { + add(extensions.getByType(KotlinJsProjectExtension::class.java).js()) + }.let(::control) +} + +fun control(targets: NamedDomainObjectCollection) { + fun NamedDomainObjectCollection.onlyBuildIf(enabled: Spec) { + all { + if (this is KotlinNativeTarget) { + binaries.all { + linkTask.onlyIf(enabled) + } + } + compilations.all { + compileKotlinTask.onlyIf(enabled) + } + } + } + + val nativeTargets = targets.withType() + val windowsHostTargets = nativeTargets.matching { it.konanTarget.buildHost == Family.MINGW } + val linuxHostTargets = nativeTargets.matching { it.konanTarget.buildHost == Family.LINUX } + val osxHostTargets = nativeTargets.matching { it.konanTarget.buildHost == Family.OSX } + val mainHostTargets = targets.matching { it !in nativeTargets } + linuxHostTargets.onlyBuildIf { + val enabled = !CI || SANDBOX || HostManager.hostIsLinux + printlnCI("[${it.name}] ${!CI} || $SANDBOX || ${HostManager.hostIsLinux} = $enabled") + enabled + } + osxHostTargets.onlyBuildIf { + val enabled = !CI || SANDBOX || HostManager.hostIsMac + printlnCI("[${it.name}] ${!CI} || $SANDBOX || ${HostManager.hostIsMac} = $enabled") + enabled + } + windowsHostTargets.onlyBuildIf { + val enabled = !CI || SANDBOX || HostManager.hostIsMingw + printlnCI("[${it.name}] ${!CI} || $SANDBOX || ${HostManager.hostIsMingw} = $enabled") + enabled + } + mainHostTargets.onlyBuildIf { + val enabled = !CI || SANDBOX || isMainHost + printlnCI("[${it.name}] ${!CI} || $SANDBOX || $isMainHost = $enabled") + enabled + } +} diff --git a/build-conventions/src/main/kotlin/convention.detekt.gradle.kts b/build-conventions/src/main/kotlin/convention.detekt.gradle.kts new file mode 100644 index 00000000..7e9149cd --- /dev/null +++ b/build-conventions/src/main/kotlin/convention.detekt.gradle.kts @@ -0,0 +1,44 @@ +import io.gitlab.arturbosch.detekt.Detekt + +plugins { + id("io.gitlab.arturbosch.detekt") +} + +dependencies { + detektPlugins("io.gitlab.arturbosch.detekt:detekt-formatting:_") +} + +detekt { + config.from(rootDir.resolve("gradle/detekt.yml")) + buildUponDefaultConfig = true + source = files("src/", "*.kts") +} + +tasks { + if (project == rootProject) { + register("detektAll", Detekt::class) { + description = "Run Detekt for all modules" + config.from(project.detekt.config) + buildUponDefaultConfig = project.detekt.buildUponDefaultConfig + setSource(files(projectDir)) + exclude("**/klip-kotlin-plugin-native/src") + } + } + afterEvaluate { + withType { + parallel = true + reports { + // observe findings in your browser with structure and code snippets + html.required.set(true) + // checkstyle like format mainly for integrations like Jenkins + xml.required.set(true) + // similar to the console output, contains issue signature to manually edit baseline files + txt.required.set(true) + // standardized SARIF format (https://sarifweb.azurewebsites.net/) to support integrations with Github Code Scanning + sarif.required.set(true) + } + include("**/*.kt", "**/*.kts") + exclude("**/build", "scripts/") + } + } +} diff --git a/build-conventions/src/main/kotlin/convention.git-hooks.gradle.kts b/build-conventions/src/main/kotlin/convention.git-hooks.gradle.kts new file mode 100644 index 00000000..e86f3ca5 --- /dev/null +++ b/build-conventions/src/main/kotlin/convention.git-hooks.gradle.kts @@ -0,0 +1,12 @@ +plugins { + id("com.github.jakemarsden.git-hooks") +} + +gitHooks { + setHooks( + mapOf( + "pre-commit" to "detektAll --auto-correct", + "pre-push" to "detektAll" + ) + ) +} diff --git a/build-conventions/src/main/kotlin/convention.library-android.gradle.kts b/build-conventions/src/main/kotlin/convention.library-android.gradle.kts new file mode 100644 index 00000000..894443db --- /dev/null +++ b/build-conventions/src/main/kotlin/convention.library-android.gradle.kts @@ -0,0 +1,12 @@ +plugins { + id("convention.common") + id("com.android.library") +} + +android { + compileSdk = 31 + defaultConfig { + minSdk = 7 + targetSdk = 31 + } +} diff --git a/build-conventions/src/main/kotlin/convention.library-mpp.gradle.kts b/build-conventions/src/main/kotlin/convention.library-mpp.gradle.kts new file mode 100644 index 00000000..6ad11262 --- /dev/null +++ b/build-conventions/src/main/kotlin/convention.library-mpp.gradle.kts @@ -0,0 +1,33 @@ +import util.withName + +plugins { + id("convention.mpp") + id("convention.library-android") + id("convention.control") +} + +kotlin { + explicitApi() + android { + if (!CI || SANDBOX || isMainHost) { + publishLibraryVariants("release", "debug") + } + } + sourceSets { + withName("androidMain") { + kotlin.srcDir("src/sharedMain/kotlin") + kotlin.srcDir("src/blockingMain/kotlin") + resources.srcDir("src/sharedMain/resources") + resources.srcDir("src/blockingMain/resources") + } + withName("androidTest") { + kotlin.srcDir("src/sharedTest/kotlin") + kotlin.srcDir("src/blockingTest/kotlin") + resources.srcDir("src/sharedTest/resources") + resources.srcDir("src/blockingTest/resources") + dependencies { + implementation(kotlin("test-junit5")) + } + } + } +} diff --git a/build-conventions/src/main/kotlin/convention.local-properties.gradle.kts b/build-conventions/src/main/kotlin/convention.local-properties.gradle.kts new file mode 100644 index 00000000..30ef2b9f --- /dev/null +++ b/build-conventions/src/main/kotlin/convention.local-properties.gradle.kts @@ -0,0 +1,10 @@ + +import java.util.Properties + +rootDir.resolve("local.properties").takeIf(File::exists)?.let { + Properties().apply { + it.inputStream().use(::load) + }.mapKeys { (k, _) -> k.toString() } +}?.toList()?.forEach { (k, v) -> + project.extra[k] = v +} diff --git a/build-conventions/src/main/kotlin/convention.mpp.gradle.kts b/build-conventions/src/main/kotlin/convention.mpp.gradle.kts new file mode 100644 index 00000000..641b5d0f --- /dev/null +++ b/build-conventions/src/main/kotlin/convention.mpp.gradle.kts @@ -0,0 +1,94 @@ +import util.sharedTestDependencies +import util.targetGroup + +plugins { + id("convention.common") + kotlin("multiplatform") +} + +kotlin { + targetGroup( + "stub", + "commonMain", + "commonTest", + mingwX86(), + linuxArm32Hfp(), + linuxArm64(), + linuxMips32(), + linuxMipsel32(), + androidNativeArm32(), + androidNativeArm64(), + androidNativeX64(), + androidNativeX86(), + ) + val (sharedMain, sharedTest) = targetGroup( + "shared", + "commonMain", + "commonTest", + js(IR) { + browser() + nodejs() + } + ) + val (blockingMain, blockingTest) = targetGroup( + "blocking", + sharedMain, + sharedTest, + jvm(), + ) + val (nativeMain, nativeTest) = targetGroup( + "native", + blockingMain, + blockingTest, + mingwX64(), + linuxX64(), + ) + targetGroup( + "apple", + nativeMain, + nativeTest, + iosArm32(), + iosArm64(), + iosSimulatorArm64(), + iosX64(), + macosArm64(), + macosX64(), + tvosArm64(), + tvosSimulatorArm64(), + tvosX64(), + watchosArm32(), + watchosArm64(), + watchosSimulatorArm64(), + watchosX86(), + watchosX64(), + ) + + sourceSets { + named("commonTest") { + dependencies { + implementation(kotlin("test-common")) + implementation(kotlin("test-annotations-common")) + } + } + sharedTestDependencies { +// implementation("io.kotest:kotest-assertions-core:_") +// implementation("io.kotest:kotest-property:_") + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-test:_") + } + named("jsTest") { + dependencies { + implementation(kotlin("test-js")) + } + } + named("jvmTest") { + dependencies { + implementation(kotlin("test-junit5")) + } + } + configureEach { + languageSettings { + optIn("kotlin.RequiresOptIn") + } + } + } +} diff --git a/buildSrc/src/main/kotlin/plugin.publishing-jvm.gradle.kts b/build-conventions/src/main/kotlin/convention.publishing-jvm.gradle.kts similarity index 64% rename from buildSrc/src/main/kotlin/plugin.publishing-jvm.gradle.kts rename to build-conventions/src/main/kotlin/convention.publishing-jvm.gradle.kts index e388e7ff..15fe786a 100644 --- a/buildSrc/src/main/kotlin/plugin.publishing-jvm.gradle.kts +++ b/build-conventions/src/main/kotlin/convention.publishing-jvm.gradle.kts @@ -1,23 +1,10 @@ -import org.jetbrains.kotlin.gradle.tasks.KotlinCompile -import util.CI -import util.SANDBOX -import util.isMainHost - plugins { kotlin("jvm") - id("plugin.publishing") - id("com.github.gmazzo.buildconfig") + id("convention.publishing") } val mainHostSpec: Spec = Spec { !CI || SANDBOX || isMainHost } -tasks { - withType { - onlyIf(mainHostSpec) - inputs.property("project.mainOS", project.property("project.mainOS")) - } -} - afterEvaluate { publishing { publications { diff --git a/build-conventions/src/main/kotlin/convention.publishing-mpp.gradle.kts b/build-conventions/src/main/kotlin/convention.publishing-mpp.gradle.kts new file mode 100644 index 00000000..b5811205 --- /dev/null +++ b/build-conventions/src/main/kotlin/convention.publishing-mpp.gradle.kts @@ -0,0 +1,74 @@ +import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinAndroidTarget +import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget +import org.jetbrains.kotlin.konan.target.Family +import org.jetbrains.kotlin.konan.target.HostManager +import util.buildHost + +plugins { + kotlin("multiplatform") + id("convention.publishing") +} + +kotlin { + fun NamedDomainObjectCollection.onlyPublishIf(enabled: Spec) { + publishing { + publications { + matching { it.name in this@onlyPublishIf.names }.all { + val targetPublication = this@all + tasks.withType() + .matching { it.publication == targetPublication } + .all { onlyIf(enabled) } + tasks.withType() + .matching { it.publication.orNull == targetPublication } + .all { onlyIf(enabled) } + } + } + } + } + + val nativeTargets = targets.withType() + val windowsHostTargets = nativeTargets.matching { it.konanTarget.buildHost == Family.MINGW } + val linuxHostTargets = nativeTargets.matching { it.konanTarget.buildHost == Family.LINUX } + val osxHostTargets = nativeTargets.matching { it.konanTarget.buildHost == Family.OSX } + val mainHostTargets = targets.matching { it !in nativeTargets } + val androidTargets = targets.withType() + logger.info("Linux host targets: $linuxHostTargets") + logger.info("OSX host targets: $osxHostTargets") + logger.info("Windows host targets: $windowsHostTargets") + logger.info("Main host targets: $mainHostTargets") + logger.info("Android targets: $androidTargets") + val mpp = objects.domainObjectContainer(Named::class.java) + mpp.add(Named { "kotlinMultiplatform" }) + + androidTargets.all { + if (!CI || SANDBOX || isMainHost) { + publishLibraryVariants("release", "debug") + } + } + + linuxHostTargets.onlyPublishIf { + val enabled = !CI || SANDBOX || HostManager.hostIsLinux + printlnCI("[${it.name}] ${!CI} || $SANDBOX || ${HostManager.hostIsLinux} = $enabled") + enabled + } + osxHostTargets.onlyPublishIf { + val enabled = !CI || SANDBOX || HostManager.hostIsMac + printlnCI("[${it.name}] ${!CI} || $SANDBOX || ${HostManager.hostIsMac} = $enabled") + enabled + } + windowsHostTargets.onlyPublishIf { + val enabled = !CI || SANDBOX || HostManager.hostIsMingw + printlnCI("[${it.name}] ${!CI} || $SANDBOX || ${HostManager.hostIsMingw} = $enabled") + enabled + } + mainHostTargets.onlyPublishIf { + val enabled = !CI || SANDBOX || isMainHost + printlnCI("[${it.name}] ${!CI} || $SANDBOX || $isMainHost = $enabled") + enabled + } + mpp.onlyPublishIf { + val enabled = !CI || SANDBOX || isMainHost + println("[${it.name}] ${!CI} || $SANDBOX || $isMainHost = $enabled") + enabled + } +} diff --git a/buildSrc/src/main/kotlin/plugin.publishing-nexus.gradle.kts b/build-conventions/src/main/kotlin/convention.publishing-nexus.gradle.kts similarity index 88% rename from buildSrc/src/main/kotlin/plugin.publishing-nexus.gradle.kts rename to build-conventions/src/main/kotlin/convention.publishing-nexus.gradle.kts index ae8b341c..e6e90199 100644 --- a/buildSrc/src/main/kotlin/plugin.publishing-nexus.gradle.kts +++ b/build-conventions/src/main/kotlin/convention.publishing-nexus.gradle.kts @@ -1,7 +1,5 @@ -import util.by - plugins { - id("plugin.common") + id("convention.common") id("io.github.gradle-nexus.publish-plugin") } diff --git a/buildSrc/src/main/kotlin/plugin.publishing.gradle.kts b/build-conventions/src/main/kotlin/convention.publishing.gradle.kts similarity index 60% rename from buildSrc/src/main/kotlin/plugin.publishing.gradle.kts rename to build-conventions/src/main/kotlin/convention.publishing.gradle.kts index 270bb1ea..eb2eead7 100644 --- a/buildSrc/src/main/kotlin/plugin.publishing.gradle.kts +++ b/build-conventions/src/main/kotlin/convention.publishing.gradle.kts @@ -1,11 +1,9 @@ -import org.jetbrains.kotlin.gradle.plugin.KotlinTarget import org.jetbrains.kotlin.gradle.tasks.KotlinCompile import org.jetbrains.kotlin.konan.target.HostManager import util.Git -import util.by plugins { - id("plugin.common") + id("convention.common") id("org.jetbrains.dokka") `maven-publish` signing @@ -19,27 +17,27 @@ tasks { } withType { manifest { - attributes += - sortedMapOf( - "Built-By" to System.getProperty("user.name"), - "Build-Jdk" to System.getProperty("java.version"), - "Implementation-Version" to project.version, - "Created-By" to "${GradleVersion.current()}", - "Created-From" to "${Git.headCommitHash}") + attributes += sortedMapOf( + "Built-By" to System.getProperty("user.name"), + "Build-Jdk" to System.getProperty("java.version"), + "Implementation-Version" to project.version, + "Created-By" to "${GradleVersion.current()}", + "Created-From" to "${Git.headCommitHash}" + ) } } val cleanMavenLocal by registering { group = "build" doLast { - val groupRepo = - file( - "${System.getProperty("user.home")}/.m2/repository/${project.group.toString().replace(".", "/")}") + val m2Repo = file("${System.getProperty("user.home")}/.m2/repository") + val groupRepo = file("$m2Repo/${project.group.toString().replace(".", "/")}") publishing.publications.filterIsInstance().forEach { groupRepo.resolve(it.artifactId).deleteRecursively() } } } named("clean") { dependsOn(cleanMavenLocal) } + withType { onlyIf } } signing { @@ -53,33 +51,7 @@ signing { val isMainHost = HostManager.simpleOsName().equals("${project.properties["project.mainOS"]}", true) -tasks { withType { onlyIf } } - publishing { - fun Collection.onlyBuildIf(enabled: Spec) { - forEach { it.compilations.all { compileKotlinTask.onlyIf(enabled) } } - } - - fun Collection.onlyPublishIf(enabled: Spec) { - val publications: Collection = map { it.name } - afterEvaluate { - publishing { - publications { - matching { it.name in publications }.all { - val targetPublication = this@all - tasks - .withType() - .matching { it.publication == targetPublication } - .configureEach { onlyIf(enabled) } - tasks - .withType() - .matching { it.publication.get() == targetPublication } - .configureEach { onlyIf(enabled) } - } - } - } - } - } publications { val ghOwnerId: String = project.properties["gh.owner.id"]!!.toString() val ghOwnerName: String = project.properties["gh.owner.name"]!!.toString() diff --git a/build-conventions/src/main/kotlin/ext/MppAppExtension.kt b/build-conventions/src/main/kotlin/ext/MppAppExtension.kt new file mode 100644 index 00000000..e1967c5b --- /dev/null +++ b/build-conventions/src/main/kotlin/ext/MppAppExtension.kt @@ -0,0 +1,14 @@ +package ext + +import org.gradle.api.Project +import org.gradle.api.provider.Property + +@Suppress("LeakingThis") +abstract class MppAppExtension(override val project: Project) : ProjectExtension() { + abstract val jvmMainClass: Property + abstract val fatJar: Property + + init { + fatJar.convention(true) + } +} diff --git a/build-conventions/src/main/kotlin/ext/ProjectExtension.kt b/build-conventions/src/main/kotlin/ext/ProjectExtension.kt new file mode 100644 index 00000000..8ce2c53d --- /dev/null +++ b/build-conventions/src/main/kotlin/ext/ProjectExtension.kt @@ -0,0 +1,8 @@ +package ext + +import org.gradle.api.Project + +@Suppress("LeakingThis") +abstract class ProjectExtension { + protected abstract val project: Project +} diff --git a/build-conventions/src/main/kotlin/util/KotlinTargetDetails.kt b/build-conventions/src/main/kotlin/util/KotlinTargetDetails.kt new file mode 100644 index 00000000..3f10a9d3 --- /dev/null +++ b/build-conventions/src/main/kotlin/util/KotlinTargetDetails.kt @@ -0,0 +1,38 @@ +package util + +import org.jetbrains.kotlin.konan.target.Family +import org.jetbrains.kotlin.konan.target.KonanTarget + +val KonanTarget.buildHost: Family + get() = when (this) { + KonanTarget.WASM32, + KonanTarget.ANDROID_X64, + KonanTarget.ANDROID_X86, + KonanTarget.ANDROID_ARM32, + KonanTarget.ANDROID_ARM64, + KonanTarget.LINUX_ARM64, + KonanTarget.LINUX_ARM32_HFP, + KonanTarget.LINUX_MIPS32, + KonanTarget.LINUX_MIPSEL32, + KonanTarget.LINUX_X64 -> Family.LINUX + + KonanTarget.MINGW_X86, + KonanTarget.MINGW_X64 -> Family.MINGW + + KonanTarget.IOS_ARM32, + KonanTarget.IOS_ARM64, + KonanTarget.IOS_X64, + KonanTarget.IOS_SIMULATOR_ARM64, + KonanTarget.WATCHOS_ARM32, + KonanTarget.WATCHOS_ARM64, + KonanTarget.WATCHOS_X86, + KonanTarget.WATCHOS_X64, + KonanTarget.WATCHOS_SIMULATOR_ARM64, + KonanTarget.TVOS_ARM64, + KonanTarget.TVOS_X64, + KonanTarget.TVOS_SIMULATOR_ARM64, + KonanTarget.MACOS_X64, + KonanTarget.MACOS_ARM64 -> Family.OSX + + is KonanTarget.ZEPHYR -> throw IllegalStateException("Target $this not supported") + } diff --git a/build-conventions/src/main/kotlin/util/_global.kt b/build-conventions/src/main/kotlin/util/_global.kt new file mode 100644 index 00000000..9682bc92 --- /dev/null +++ b/build-conventions/src/main/kotlin/util/_global.kt @@ -0,0 +1,35 @@ +@file:Suppress("PackageDirectoryMismatch") + +import org.gradle.api.NamedDomainObjectContainer +import org.gradle.api.NamedDomainObjectProvider +import org.gradle.api.Project +import org.gradle.api.provider.Property +import org.gradle.api.provider.Provider +import org.gradle.kotlin.dsl.named +import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet +import org.jetbrains.kotlin.konan.target.HostManager + +val NamedDomainObjectContainer.jsMain: NamedDomainObjectProvider + get() = named("jsMain") + +val NamedDomainObjectContainer.jsTest: NamedDomainObjectProvider + get() = named("jsTest") + +val NamedDomainObjectContainer.jvmMain: NamedDomainObjectProvider + get() = named("jvmMain") + +val NamedDomainObjectContainer.jvmTest: NamedDomainObjectProvider + get() = named("jvmTest") + +infix fun Property.by(value: T) = set(value) +infix fun Property.by(value: Provider) = set(value) + +val CI = System.getenv("CI") != null +val SANDBOX = System.getenv("SANDBOX") != null + +val Project.isMainHost: Boolean + get() = HostManager.simpleOsName().equals("${properties["project.mainOS"]}", true) + +fun printlnCI(text: Any?) { + if (CI) println(text) +} diff --git a/build-conventions/src/main/kotlin/util/gradle.kt b/build-conventions/src/main/kotlin/util/gradle.kt new file mode 100644 index 00000000..ebe22285 --- /dev/null +++ b/build-conventions/src/main/kotlin/util/gradle.kt @@ -0,0 +1,15 @@ +package util + +import java.nio.charset.* + +object Git { + val headCommitHash by lazy { execAndCapture("git rev-parse --verify HEAD") } +} + +fun execAndCapture(cmd: String): String? { + val child = Runtime.getRuntime().exec(cmd) + child.waitFor() + return if (child.exitValue() == 0) { + child.inputStream.readAllBytes().toString(Charset.defaultCharset()).trim() + } else null +} diff --git a/build-conventions/src/main/kotlin/util/targetGroup.kt b/build-conventions/src/main/kotlin/util/targetGroup.kt new file mode 100644 index 00000000..a23dea6e --- /dev/null +++ b/build-conventions/src/main/kotlin/util/targetGroup.kt @@ -0,0 +1,60 @@ +package util + +import org.gradle.api.Action +import org.gradle.api.NamedDomainObjectContainer +import org.gradle.kotlin.dsl.get +import org.gradle.kotlin.dsl.invoke +import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension +import org.jetbrains.kotlin.gradle.plugin.KotlinDependencyHandler +import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet +import org.jetbrains.kotlin.gradle.plugin.KotlinTarget + +fun KotlinMultiplatformExtension.targetGroup( + name: String, + mainSourceSetTarget: String, + testSourceSetTarget: String, + vararg targets: T +): Pair { + val mainName = "${name}Main" + val testName = "${name}Test" + sourceSets { + val main = create(mainName) { dependsOn(getByName(mainSourceSetTarget)) } + val test = create(testName) { dependsOn(getByName(testSourceSetTarget)) } + targets.forEach { target -> + target.compilations["main"].defaultSourceSet { dependsOn(main) } + target.compilations["test"].defaultSourceSet { dependsOn(test) } + } + } + return mainName to testName +} + +fun NamedDomainObjectContainer.withName(name: String, action: Action) { + matching { it.name == name }.all(action) +} + +private fun NamedDomainObjectContainer.sharedDependencies( + sourceSets: List, + action: Action, +) { + sourceSets.forEach { + withName(it) { + dependencies { action.execute(this) } + } + } +} + +fun NamedDomainObjectContainer.sharedMainDependencies(action: Action) { + sharedDependencies(listOf("sharedMain", "androidMain"), action) +} + +fun NamedDomainObjectContainer.sharedTestDependencies(action: Action) { + sharedDependencies(listOf("sharedTest", "androidTest"), action) +} + +fun NamedDomainObjectContainer.blockingMainDependencies(action: Action) { + sharedDependencies(listOf("blockingMain", "androidMain"), action) +} + +fun NamedDomainObjectContainer.blockingTestDependencies(action: Action) { + sharedDependencies(listOf("blockingTest", "androidTest"), action) +} diff --git a/build-conventions/test/build.gradle.kts b/build-conventions/test/build.gradle.kts new file mode 100644 index 00000000..e92d1d30 --- /dev/null +++ b/build-conventions/test/build.gradle.kts @@ -0,0 +1,27 @@ +plugins { + id("convention.mpp") +} + +kotlin { + sourceSets { + commonMain { + dependencies { + api(kotlin("test-common")) + api(kotlin("test-annotations-common")) + api("io.kotest:kotest-assertions-core:_") + api("io.kotest:kotest-property:_") + api("org.jetbrains.kotlinx:kotlinx-coroutines-test:_") + } + } + jsMain { + dependencies { + api(kotlin("test-js")) + } + } + jvmMain { + dependencies { + api(kotlin("test-junit5")) + } + } + } +} diff --git a/build-conventions/test/src/commonMain/kotlin/dev/petuska/kamp/test/TestFactory.kt b/build-conventions/test/src/commonMain/kotlin/dev/petuska/kamp/test/TestFactory.kt new file mode 100644 index 00000000..be49ca1d --- /dev/null +++ b/build-conventions/test/src/commonMain/kotlin/dev/petuska/kamp/test/TestFactory.kt @@ -0,0 +1,4 @@ +package dev.petuska.kamp.test + +@Target(AnnotationTarget.FUNCTION) +expect annotation class TestFactory() diff --git a/build-conventions/test/src/commonMain/kotlin/dev/petuska/kamp/test/dynamicTest.kt b/build-conventions/test/src/commonMain/kotlin/dev/petuska/kamp/test/dynamicTest.kt new file mode 100644 index 00000000..4f8ca79b --- /dev/null +++ b/build-conventions/test/src/commonMain/kotlin/dev/petuska/kamp/test/dynamicTest.kt @@ -0,0 +1,16 @@ +package dev.petuska.kamp.test + +@Suppress("NO_ACTUAL_FOR_EXPECT") +expect class DynamicTests + +expect fun dynamicTests(builder: DynamicTestBuilder.() -> Unit): DynamicTests + +class DynamicTestBuilder { + internal val tests = mutableMapOf Unit>() + + fun dynamicTest(name: String, test: () -> Unit) { + tests[name] = test + } + + operator fun String.invoke(test: () -> Unit) = dynamicTest(this, test) +} diff --git a/build-conventions/test/src/jsMain/kotlin/dev/petuska/kamp/test/TestFactory.kt b/build-conventions/test/src/jsMain/kotlin/dev/petuska/kamp/test/TestFactory.kt new file mode 100644 index 00000000..4411be60 --- /dev/null +++ b/build-conventions/test/src/jsMain/kotlin/dev/petuska/kamp/test/TestFactory.kt @@ -0,0 +1,5 @@ +package dev.petuska.kamp.test + +import kotlin.test.Test + +actual typealias TestFactory = Test diff --git a/build-conventions/test/src/jsMain/kotlin/dev/petuska/kamp/test/dynamicTest.kt b/build-conventions/test/src/jsMain/kotlin/dev/petuska/kamp/test/dynamicTest.kt new file mode 100644 index 00000000..39fb2228 --- /dev/null +++ b/build-conventions/test/src/jsMain/kotlin/dev/petuska/kamp/test/dynamicTest.kt @@ -0,0 +1,17 @@ +package dev.petuska.kamp.test + +import io.kotest.matchers.shouldBe + +@Suppress("ACTUAL_WITHOUT_EXPECT") +actual typealias DynamicTests = Unit + +actual fun dynamicTests(builder: DynamicTestBuilder.() -> Unit) { + val tests = DynamicTestBuilder().apply(builder).tests + val results = tests.map { (name, test) -> + println("[TEST] $name") + runCatching { + test() + }.onFailure { it.printStackTrace() } + } + results.none { it.isFailure } shouldBe true +} diff --git a/build-conventions/test/src/jvmMain/kotlin/dev/petuska/kamp/test/TestFactory.kt b/build-conventions/test/src/jvmMain/kotlin/dev/petuska/kamp/test/TestFactory.kt new file mode 100644 index 00000000..aad47499 --- /dev/null +++ b/build-conventions/test/src/jvmMain/kotlin/dev/petuska/kamp/test/TestFactory.kt @@ -0,0 +1,5 @@ +package dev.petuska.kamp.test + +import org.junit.jupiter.api.TestFactory + +actual typealias TestFactory = TestFactory diff --git a/build-conventions/test/src/jvmMain/kotlin/dev/petuska/kamp/test/dynamicTest.kt b/build-conventions/test/src/jvmMain/kotlin/dev/petuska/kamp/test/dynamicTest.kt new file mode 100644 index 00000000..e87a7f96 --- /dev/null +++ b/build-conventions/test/src/jvmMain/kotlin/dev/petuska/kamp/test/dynamicTest.kt @@ -0,0 +1,13 @@ +package dev.petuska.kamp.test + +import org.junit.jupiter.api.DynamicTest + +@Suppress("ACTUAL_WITHOUT_EXPECT", "ACTUAL_TYPE_ALIAS_TO_CLASS_WITH_DECLARATION_SITE_VARIANCE") +actual typealias DynamicTests = Collection + +actual fun dynamicTests(builder: DynamicTestBuilder.() -> Unit): DynamicTests { + val tests = DynamicTestBuilder().apply(builder).tests + return tests.map { (name, test) -> + DynamicTest.dynamicTest(name, test) + } +} diff --git a/build.gradle.kts b/build.gradle.kts index 7808a023..2f34209f 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,10 +1,12 @@ +import util.withName + plugins { if (System.getenv("CI") == null) { - id("plugin.git-hooks") + id("convention.git-hooks") } - id("plugin.library-mpp") - id("plugin.publishing-nexus") - id("plugin.publishing-mpp") + id("convention.library-mpp") + id("convention.publishing-nexus") + id("convention.publishing-mpp") } gradleEnterprise { @@ -17,7 +19,42 @@ gradleEnterprise { kotlin { sourceSets { commonMain { - dependencies { subprojects.filter { it.path.startsWith(":library:") }.forEach { api(it) } } + dependencies { + api(project(":library:klip-api")) + api(project(":library:klip-runner")) + api(project(":library:klip-assertions")) + } + } + + withName("androidMain") { + dependencies { + implementation("io.ktor:ktor-client-android:_") + } + } + withName("jsMain") { + dependencies { + implementation("io.ktor:ktor-client-js:_") + } + } + withName("jvmMain") { + dependencies { + implementation("io.ktor:ktor-client-java:_") + } + } + withName("linuxX64Main") { + dependencies { + implementation("io.ktor:ktor-client-curl:_") + } + } + withName("mingwX64Main") { + dependencies { + implementation("io.ktor:ktor-client-curl:_") + } + } + withName("appleMain") { + dependencies { + implementation("io.ktor:ktor-client-darwin:_") + } } } } diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts deleted file mode 100644 index 17498b8f..00000000 --- a/buildSrc/build.gradle.kts +++ /dev/null @@ -1,22 +0,0 @@ -import org.jetbrains.kotlin.gradle.tasks.KotlinCompile - -plugins { `kotlin-dsl` } - -repositories { - mavenCentral() - google() -} - -dependencies { - implementation("io.kotest:kotest-framework-multiplatform-plugin-gradle:_") - implementation("com.android.tools.build:gradle:_") - implementation("org.jetbrains.kotlin:kotlin-gradle-plugin:_") - implementation("org.jetbrains.dokka:dokka-gradle-plugin:_") - implementation("org.jetbrains.kotlin:kotlin-serialization:_") - implementation("com.diffplug.spotless:spotless-plugin-gradle:_") - implementation("io.github.gradle-nexus:publish-plugin:_") - implementation("com.github.gmazzo:gradle-buildconfig-plugin:_") - implementation("com.github.jakemarsden:git-hooks-gradle-plugin:_") -} - -tasks { withType { kotlinOptions.jvmTarget = "11" } } diff --git a/buildSrc/gradle.properties b/buildSrc/gradle.properties deleted file mode 100644 index c01c9dba..00000000 --- a/buildSrc/gradle.properties +++ /dev/null @@ -1,5 +0,0 @@ -org.gradle.project.targetCompatibility=11 -org.gradle.vfs.watch=true -kotlin.style=official -gradle.cache=true -gradle.parallel=true diff --git a/buildSrc/settings.gradle.kts b/buildSrc/settings.gradle.kts deleted file mode 100644 index d61f7fc0..00000000 --- a/buildSrc/settings.gradle.kts +++ /dev/null @@ -1,13 +0,0 @@ -pluginManagement { - repositories { - gradlePluginPortal() - mavenCentral() - } - plugins { - id("de.fayard.refreshVersions") version "0.23.0" - } -} - -plugins { - id("de.fayard.refreshVersions") -} diff --git a/buildSrc/src/main/kotlin/plugin.build-config-jvm.gradle.kts b/buildSrc/src/main/kotlin/plugin.build-config-jvm.gradle.kts deleted file mode 100644 index f423c8b7..00000000 --- a/buildSrc/src/main/kotlin/plugin.build-config-jvm.gradle.kts +++ /dev/null @@ -1,40 +0,0 @@ -import org.jetbrains.kotlin.gradle.tasks.KotlinCompile - -plugins { - kotlin("jvm") - id("plugin.common") - id("com.github.gmazzo.buildconfig") -} - -buildConfig { - useKotlinOutput { - internalVisibility = true - topLevelConstants = true - } - packageName("dev.petuska.klip.plugin.config") - buildConfigField("String", "GROUP", "\"${rootProject.group}\"") - buildConfigField("String", "NAME", "\"${rootProject.name}\"") - buildConfigField("String", "VERSION", "\"${rootProject.version}\"") - buildConfigField( - "String", - "GRADLE_PLUGIN_ARTEFACT_ID", - "\"${project(":plugin:klip-gradle-plugin").name}\"" - ) - buildConfigField( - "String", - "KOTLIN_PLUGIN_ARTEFACT_ID", - "\"${project(":plugin:klip-kotlin-plugin").name}\"" - ) - buildConfigField( - "String", - "KOTLIN_NATIVE_PLUGIN_ARTEFACT_ID", - "\"\$KOTLIN_PLUGIN_ARTEFACT_ID-native\"" - ) - buildConfigField( - "String", - "KOTLIN_PLUGIN_ID", - "\"\$GROUP.\$KOTLIN_PLUGIN_ARTEFACT_ID\"" - ) -} - -tasks { withType { kotlinOptions.jvmTarget = "11" } } diff --git a/buildSrc/src/main/kotlin/plugin.common.gradle.kts b/buildSrc/src/main/kotlin/plugin.common.gradle.kts deleted file mode 100644 index 594116e6..00000000 --- a/buildSrc/src/main/kotlin/plugin.common.gradle.kts +++ /dev/null @@ -1,45 +0,0 @@ -import org.jetbrains.kotlin.gradle.tasks.AbstractKotlinCompile -import org.jetbrains.kotlin.gradle.tasks.KotlinCompile -import org.jetbrains.kotlin.gradle.tasks.KotlinTest - -plugins { - id("com.diffplug.spotless") - idea -} - -repositories { - mavenCentral() - google() -} - -idea { - module { - isDownloadSources = true - isDownloadJavadoc = true - } -} - -spotless { - kotlin { ktfmt() } - kotlinGradle { ktfmt() } -} - -tasks { - project.properties["org.gradle.project.targetCompatibility"]?.toString()?.let { - withType { kotlinOptions { jvmTarget = it } } - } - afterEvaluate { - if (tasks.findByName("compile") == null) { - register("compile") { - dependsOn(withType(AbstractKotlinCompile::class)) - group = "build" - } - } - if (tasks.findByName("allTests") == null) { - register("allTests") { - dependsOn(withType(KotlinTest::class)) - group = "verification" - } - } - } -} diff --git a/buildSrc/src/main/kotlin/plugin.git-hooks.gradle.kts b/buildSrc/src/main/kotlin/plugin.git-hooks.gradle.kts deleted file mode 100644 index e392ce8a..00000000 --- a/buildSrc/src/main/kotlin/plugin.git-hooks.gradle.kts +++ /dev/null @@ -1,3 +0,0 @@ -plugins { id("com.github.jakemarsden.git-hooks") } - -gitHooks { setHooks(mapOf("pre-commit" to "spotlessApply", "pre-push" to "spotlessCheck")) } diff --git a/buildSrc/src/main/kotlin/plugin.library-mpp.gradle.kts b/buildSrc/src/main/kotlin/plugin.library-mpp.gradle.kts deleted file mode 100644 index 1c2812d9..00000000 --- a/buildSrc/src/main/kotlin/plugin.library-mpp.gradle.kts +++ /dev/null @@ -1,146 +0,0 @@ -import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget -import org.jetbrains.kotlin.gradle.tasks.AbstractKotlinNativeCompile -import org.jetbrains.kotlin.gradle.tasks.CInteropProcess -import org.jetbrains.kotlin.gradle.tasks.KotlinCompile -import org.jetbrains.kotlin.konan.target.Family -import org.jetbrains.kotlin.konan.target.HostManager -import util.CI -import util.SANDBOX -import util.buildHost - -plugins { - kotlin("multiplatform") - kotlin("plugin.serialization") - id("com.android.library") - id("plugin.common") -} - -android { - compileSdkVersion(31) - defaultConfig { - minSdkVersion(1) - targetSdkVersion(31) - } -} - -kotlin { - explicitApi() - - android() - jvm() - js { - useCommonJs() - nodejs() - } - macosX64() - macosArm64() - linuxX64() - mingwX64() - iosArm32() - iosArm64() - iosX64() - iosSimulatorArm64() - watchosX86() - watchosX64() - watchosArm64() - watchosArm32() - watchosSimulatorArm64() - tvosArm64() - tvosX64() - tvosSimulatorArm64() - - // Fallback Targets - val fallbackTargets = setOf( - androidNativeArm32(), - androidNativeArm64(), - mingwX86(), - linuxArm32Hfp(), - linuxMips32(), - linuxMipsel32(), - linuxArm64(), - ) - - sourceSets { - val commonMain by getting - val commonTest by getting { - dependencies { - implementation(kotlin("test")) - implementation(kotlin("test-annotations-common")) - } - } - val fallbackMain by creating { - dependsOn(commonMain) - } - val nativeMain by creating { - dependsOn(commonMain) - } - val mingwMain by creating { - dependsOn(nativeMain) - } - val unixMain by creating { - dependsOn(nativeMain) - } - val linuxMain by creating { - dependsOn(unixMain) - } - val appleMain by creating { - dependsOn(unixMain) - } - - val fallbackTest by creating { - dependsOn(commonTest) - } - val nativeTest by creating { - dependsOn(commonTest) - } - val mingwTest by creating { - dependsOn(nativeTest) - } - val unixTest by creating { - dependsOn(nativeTest) - } - val linuxTest by creating { - dependsOn(unixTest) - } - val appleTest by creating { - dependsOn(unixTest) - } - - targets.withType { - val main = compilations["main"].defaultSourceSet - val test = compilations["test"].defaultSourceSet - when { - this in fallbackTargets -> { - main.dependsOn(fallbackMain) - test.dependsOn(fallbackTest) - } - konanTarget.family == Family.MINGW -> { - main.dependsOn(mingwMain) - test.dependsOn(mingwTest) - } - konanTarget.family.isAppleFamily -> { - main.dependsOn(appleMain) - test.dependsOn(appleTest) - } - else -> { - main.dependsOn(linuxMain) - test.dependsOn(linuxTest) - } - } - } - } -} - -tasks { - withType { - onlyIf { - !CI || SANDBOX || konanTarget.buildHost == HostManager.host.family - } - } - withType> { - onlyIf { - !CI || SANDBOX || compilation.konanTarget.buildHost == HostManager.host.family - } - } - withType { kotlinOptions.jvmTarget = "11" } -} diff --git a/buildSrc/src/main/kotlin/plugin.publishing-mpp.gradle.kts b/buildSrc/src/main/kotlin/plugin.publishing-mpp.gradle.kts deleted file mode 100644 index 4c2f41b2..00000000 --- a/buildSrc/src/main/kotlin/plugin.publishing-mpp.gradle.kts +++ /dev/null @@ -1,81 +0,0 @@ -import org.jetbrains.kotlin.gradle.plugin.KotlinTarget -import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinAndroidTarget -import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget -import org.jetbrains.kotlin.konan.target.Family -import org.jetbrains.kotlin.konan.target.HostManager -import util.CI -import util.SANDBOX -import util.buildHost -import util.isMainHost - -plugins { - kotlin("multiplatform") - id("plugin.publishing") -} - -kotlin { - fun Collection.onlyBuildIf(enabled: Spec) { - forEach { - it.compilations.all { - compileKotlinTask.onlyIf(enabled) - } - } - } - - fun Collection.onlyPublishIf(enabled: Spec) { - val publications: Collection = map { it.name } - afterEvaluate { - publishing { - publications { - matching { it.name in publications }.all { - val targetPublication = this@all - tasks.withType() - .matching { it.publication == targetPublication } - .configureEach { - onlyIf(enabled) - } - tasks.withType() - .matching { it.publication.get() == targetPublication } - .configureEach { - onlyIf(enabled) - } - } - } - } - } - } - - val nativeTargets = targets.withType() - val windowsHostTargets = nativeTargets.filter { it.konanTarget.buildHost == Family.MINGW } - val linuxHostTargets = nativeTargets.filter { it.konanTarget.buildHost == Family.LINUX } - val osxHostTargets = nativeTargets.filter { it.konanTarget.buildHost == Family.OSX } - val mainHostTargets = targets.filter { it !in nativeTargets } - val androidTargets = targets.withType() - logger.info("Linux host targets: $linuxHostTargets") - logger.info("OSX host targets: $osxHostTargets") - logger.info("Windows host targets: $windowsHostTargets") - logger.info("Main host targets: $mainHostTargets") - logger.info("Android targets: $androidTargets") - - androidTargets.forEach { - if (!CI || SANDBOX || isMainHost) { - it.publishLibraryVariants("release", "debug") - } - } - - linuxHostTargets.onlyBuildIf { !CI || SANDBOX || HostManager.hostIsLinux } - linuxHostTargets.onlyPublishIf { !CI || SANDBOX || HostManager.hostIsLinux } - - osxHostTargets.onlyBuildIf { !CI || SANDBOX || HostManager.hostIsMac } - osxHostTargets.onlyPublishIf { !CI || SANDBOX || HostManager.hostIsMac } - - windowsHostTargets.onlyBuildIf { !CI || SANDBOX || HostManager.hostIsMingw } - windowsHostTargets.onlyPublishIf { !CI || SANDBOX || HostManager.hostIsMingw } - - mainHostTargets.onlyBuildIf { - !CI || SANDBOX || isMainHost - } - (mainHostTargets + Named { "kotlinMultiplatform" }).onlyPublishIf { - !CI || SANDBOX || isMainHost - } -} diff --git a/buildSrc/src/main/kotlin/util/KotlinTargetDetails.kt b/buildSrc/src/main/kotlin/util/KotlinTargetDetails.kt deleted file mode 100644 index a80e731b..00000000 --- a/buildSrc/src/main/kotlin/util/KotlinTargetDetails.kt +++ /dev/null @@ -1,67 +0,0 @@ -package util - -import org.jetbrains.kotlin.konan.target.Family -import org.jetbrains.kotlin.konan.target.KonanTarget - -enum class KotlinTargetDetails( - val presetName: String, - val hasCoroutines: Boolean, -) { - JVM("jvm", true), - ANDROID("android", true), - JS("jsIr", true), - ANDROID_NDK_ARM32("androidNativeArm32", false), - ANDROID_NDK_ARM64("androidNativeArm64", false), - IOS_X64("iosX64", true), - IOS_ARM32("iosArm32", true), - IOS_ARM64("iosArm64", true), - IOS_SIMULATOR_ARM64("iosSimulatorArm64", true), - WATCHOS_X86("watchosX86", true), - WATCHOS_X64("watchosX64", true), - WATCHOS_ARM32("watchosArm32", true), - WATCHOS_ARM64("watchosArm64", true), - WATCHOS_SIMULATOR_ARM64("watchosSimulatorArm64", true), - TVOS_X64("tvosX64", true), - TVOS_ARM64("tvosArm64", true), - TVOS_SIMULATOR_ARM64("tvosSimulatorArm64", true), - MACOS_X64("macosX64", true), - MACOS_ARM64("macosArm64", true), - LINUX_ARM32_HFP("linuxArm32Hfp", false), - LINUX_MIPS32("linuxMips32", false), - LINUX_MIPSEL32("linuxMipsel32", false), - LINUX_X64("linuxX64", true), - LINUX_ARM64("linuxArm64", false), - MINGW_X64("mingwX64", true), - MINGW_X32("mingwX86", false), -} - -val KonanTarget.buildHost: Family - get() = - when (this) { - KonanTarget.ANDROID_X64, - KonanTarget.ANDROID_X86, - KonanTarget.ANDROID_ARM32, - KonanTarget.ANDROID_ARM64, - KonanTarget.LINUX_ARM64, - KonanTarget.LINUX_ARM32_HFP, - KonanTarget.LINUX_MIPS32, - KonanTarget.LINUX_MIPSEL32, - KonanTarget.LINUX_X64 -> Family.LINUX - KonanTarget.MINGW_X86, KonanTarget.MINGW_X64 -> Family.MINGW - KonanTarget.IOS_ARM32, - KonanTarget.IOS_ARM64, - KonanTarget.IOS_X64, - KonanTarget.IOS_SIMULATOR_ARM64, - KonanTarget.WATCHOS_ARM32, - KonanTarget.WATCHOS_ARM64, - KonanTarget.WATCHOS_X86, - KonanTarget.WATCHOS_X64, - KonanTarget.WATCHOS_SIMULATOR_ARM64, - KonanTarget.TVOS_ARM64, - KonanTarget.TVOS_X64, - KonanTarget.TVOS_SIMULATOR_ARM64, - KonanTarget.MACOS_X64, - KonanTarget.MACOS_ARM64 -> Family.OSX - KonanTarget.WASM32 -> throw IllegalStateException("Target $this not supported") - is KonanTarget.ZEPHYR -> throw IllegalStateException("Target $this not supported") - } diff --git a/buildSrc/src/main/kotlin/util/gradle.kt b/buildSrc/src/main/kotlin/util/gradle.kt deleted file mode 100644 index 777340a1..00000000 --- a/buildSrc/src/main/kotlin/util/gradle.kt +++ /dev/null @@ -1,42 +0,0 @@ -package util - -import groovy.lang.Closure -import java.nio.charset.Charset -import org.gradle.api.Project -import org.gradle.api.provider.Property -import org.jetbrains.kotlin.konan.target.HostManager - -typealias Lambda = R.() -> V - -val CI by lazy { "true".equals(System.getenv("CI"), true) } -val SANDBOX by lazy { "true".equals(System.getenv("SANDBOX"), true) } - -fun Lambda.toClosure(owner: Any? = null, thisObj: Any? = null) = - object : Closure(owner, thisObj) { - @Suppress("UNCHECKED_CAST") - fun doCall() { - with(delegate as R) { this@toClosure() } - } - } - -fun closureOf(owner: Any? = null, thisObj: Any? = null, func: R.() -> V) = - func.toClosure(owner, thisObj) - -infix fun Property.by(value: T) { - set(value) -} - -object Git { - val headCommitHash by lazy { execAndCapture("git rev-parse --verify HEAD") } -} - -fun execAndCapture(cmd: String): String? { - val child = Runtime.getRuntime().exec(cmd) - child.waitFor() - return if (child.exitValue() == 0) { - child.inputStream.readAllBytes().toString(Charset.defaultCharset()).trim() - } else null -} - -val Project.isMainHost: Boolean - get() = HostManager.simpleOsName().equals("${properties["project.mainOS"]}", true) diff --git a/buildSrc/src/main/kotlin/util/nativeTargetGroup.kt b/buildSrc/src/main/kotlin/util/nativeTargetGroup.kt deleted file mode 100644 index 7aba6559..00000000 --- a/buildSrc/src/main/kotlin/util/nativeTargetGroup.kt +++ /dev/null @@ -1,28 +0,0 @@ -package util - -import org.gradle.kotlin.dsl.get -import org.gradle.kotlin.dsl.invoke -import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension -import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget - -fun KotlinMultiplatformExtension.nativeTargetGroup( - name: String, - vararg targets: KotlinNativeTarget -): Array { - sourceSets { - val (main, test) = - if (targets.size > 1) { - val commonMain = getByName("commonMain") - val commonTest = getByName("commonTest") - val main = create("${name}Main") { dependsOn(commonMain) } - val test = create("${name}Test") { dependsOn(commonTest) } - main to test - } else (null to null) - - targets.forEach { target -> - main?.let { target.compilations["main"].defaultSourceSet { dependsOn(main) } } - test?.let { target.compilations["test"].defaultSourceSet { dependsOn(test) } } - } - } - return targets -} diff --git a/gradle.properties b/gradle.properties index 82824164..85065b7e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -11,10 +11,10 @@ kotlin.js.generate.externals=false kotlin.js.compiler=ir kotlin.incremental.js=true kotlin.mpp.stability.nowarn=true -kotlin.mpp.enableGranularSourceSetsMetadata=true -#kotlin.native.enableDependencyPropagation=false kotlin.native.ignoreDisabledTargets=true -kapt.includeCompileClasspath=false +kotlin.native.binary.memoryModel=experimental +kotlin.native.binary.freezing=disabled +android.disableAutomaticComponentCreation=true #======================================== GitHub ======================================== gh.owner.id=mpetuska gh.owner.name=Martynas Petuska @@ -24,5 +24,6 @@ group=dev.petuska description=Kotlin Multiplatform test snapshots (klips) manager version=0.0.0 #======================================== Build ========================================= +kotlin.js.test.browser=firefox-headless # linux | macos | windows project.mainOS=linux diff --git a/gradle/detekt.yml b/gradle/detekt.yml new file mode 100644 index 00000000..465f2a85 --- /dev/null +++ b/gradle/detekt.yml @@ -0,0 +1,47 @@ +config: + warningsAsErrors: true + +complexity: + active: true + +comments: + active: true + CommentOverPrivateFunction: + active: false + CommentOverPrivateProperty: + active: false + DeprecatedBlockTag: + active: true + OutdatedDocumentation: + active: true + allowParamOnConstructorProperties: false +# UndocumentedPublicClass: +# active: true +# UndocumentedPublicFunction: +# active: true +# UndocumentedPublicProperty: +# active: true + +naming: + MatchingDeclarationName: + active: false + TopLevelPropertyNaming: + constantPattern: '[A-Z][_a-zA-Z0-9]*' + +style: + WildcardImport: + active: false + UnnecessaryAbstractClass: + active: false + MaxLineLength: + active: false + MagicNumber: + active: false + +formatting: + Filename: + active: false + NoWildcardImports: + active: false + Indentation: + indentSize: 2 diff --git a/gradle/libs.toml b/gradle/libs.toml new file mode 100644 index 00000000..20eba569 --- /dev/null +++ b/gradle/libs.toml @@ -0,0 +1,7 @@ +[libraries] +#guava = "com.google.guava:guava:30.0-jre" +#junit-jupiter = "org.junit.jupiter:junit-jupiter-api:5.7.1" +#junit-engine = { module="org.junit.jupiter:junit-jupiter-engine" } + +[bundles] +#testDependencies = ["junit-jupiter", "junit-engine"] \ No newline at end of file diff --git a/versions.properties b/gradle/versions.properties similarity index 50% rename from versions.properties rename to gradle/versions.properties index 99e08447..6a797e58 100644 --- a/versions.properties +++ b/gradle/versions.properties @@ -1,5 +1,5 @@ #### Dependencies and Plugin versions with their available updates. -#### Generated by `./gradlew refreshVersions` version 0.23.0 +#### Generated by `./gradlew refreshVersions` version 0.40.2 #### #### Don't manually edit or split the comments that start with four hashtags (####), #### they will be overwritten by refreshVersions. @@ -7,15 +7,21 @@ #### suppress inspection "SpellCheckingInspection" for whole file #### suppress inspection "UnusedProperty" for whole file #======================================= Plugins ======================================== -plugin.android=4.2.2 -plugin.com.gradle.plugin-publish=0.18.0 -version.com.diffplug.spotless..spotless-plugin-gradle=6.0.0 +plugin.android=7.2.1 +plugin.com.gradle.plugin-publish=0.21.0 version.com.github.jakemarsden..git-hooks-gradle-plugin=0.0.2 -version.org.jetbrains.dokka..dokka-gradle-plugin=1.6.0 +version.gradle.plugin.com.github.jengelman.gradle.plugins..shadow=7.0.0 +version.io.gitlab.arturbosch.detekt..detekt-formatting=1.20.0 +version.io.gitlab.arturbosch.detekt..detekt-gradle-plugin=1.20.0 +version.kotlinx.serialization=1.3.3 +version.org.jetbrains.compose..compose-gradle-plugin=1.1.1 +version.org.jetbrains.dokka..dokka-gradle-plugin=1.6.21 version.com.github.gmazzo..gradle-buildconfig-plugin=3.0.3 version.io.github.gradle-nexus..publish-plugin=1.1.0 #====================================== Libraries ======================================= -version.com.github.tschuchortdev..kotlin-compile-testing=1.4.6 -version.google.auto.service=1.0.1 -version.kotlin=1.6.0 -version.kotest=5.0.0 +version.dev.petuska..container-tasks-gradle-plugin=0.0.4 +version.com.github.tschuchortdev..kotlin-compile-testing=1.4.8 +version.kotlin=1.7.0 +version.kotest=5.3.0 +version.ktor=2.0.2 +version.kotlinx.coroutines=1.6.1 diff --git a/versions.rules b/gradle/versions.rules similarity index 100% rename from versions.rules rename to gradle/versions.rules diff --git a/gradle/webpack.config.d/files.js b/gradle/webpack.config.d/files.js new file mode 100644 index 00000000..ee9db833 --- /dev/null +++ b/gradle/webpack.config.d/files.js @@ -0,0 +1,16 @@ +config.module.rules.push( + { + test: /\.(jpe?g|png|gif|svg)$/i, + type: 'asset/resource', + generator: { + filename: "images/[hash][ext][query]", + } + }, + { + test: /\.(woff|woff2|eot|ttf|otf)$/, + type: 'asset/resource', + generator: { + filename: "webfonts/[hash][ext][query]", + } + } +); diff --git a/gradle/webpack.config.d/scss.js b/gradle/webpack.config.d/scss.js new file mode 100644 index 00000000..2674b9c0 --- /dev/null +++ b/gradle/webpack.config.d/scss.js @@ -0,0 +1,23 @@ +config.module.rules.push({ + test: /\.(scss|sass)$/, + use: [ + /** + * fallback to style-loader in development + * "style-loader" creates style nodes from JS strings + */ + "style-loader", // translates CSS into CommonJS + "css-loader", // translates CSS into CommonJS + "sass-loader" // compiles Sass to CSS, using Node Sass by default + ] +}); +config.module.rules.push({ + test: /\.css$/, + use: [ + /** + * fallback to style-loader in development + * "style-loader" creates style nodes from JS strings + */ + "style-loader", // translates CSS into CommonJS + "css-loader", // translates CSS into CommonJS + ] +}); diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index e750102e..aa991fce 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/klip-sandbox/build.gradle.kts b/klip-sandbox/build.gradle.kts new file mode 100644 index 00000000..e99d7463 --- /dev/null +++ b/klip-sandbox/build.gradle.kts @@ -0,0 +1,56 @@ +import util.withName + +plugins { + id("convention.library-mpp") + id("dev.petuska.klip") version "0.0.4" +} + +gradleEnterprise { + buildScan { + termsOfServiceUrl = "https://gradle.com/terms-of-service" + termsOfServiceAgree = "yes" + } +} + +repositories { + mavenLocal() +} + +klip { + debug.set(true) + update.set(false) +} + +kotlin { + sourceSets { + commonTest { + dependencies { + implementation("dev.petuska:klip") + implementation(kotlin("test-common")) + implementation(kotlin("test-annotations-common")) + } + } + withName("androidTest") { + dependencies { + implementation("io.kotest:kotest-framework-engine:_") + implementation("io.kotest:kotest-runner-junit5:_") + } + } + withName("jvmTest") { + dependencies { + implementation("io.kotest:kotest-framework-engine:_") + runtimeOnly("io.kotest:kotest-runner-junit5:_") + } + } + withName("jsTest") { + dependencies { + implementation(kotlin("test-js")) + } + } + all { + languageSettings { + optIn("kotlinx.coroutines.ExperimentalCoroutinesApi") + } + } + } +} diff --git a/klip-sandbox/gradle b/klip-sandbox/gradle new file mode 120000 index 00000000..3337596a --- /dev/null +++ b/klip-sandbox/gradle @@ -0,0 +1 @@ +../gradle \ No newline at end of file diff --git a/sandbox/gradle.properties b/klip-sandbox/gradle.properties similarity index 100% rename from sandbox/gradle.properties rename to klip-sandbox/gradle.properties diff --git a/klip-sandbox/gradlew b/klip-sandbox/gradlew new file mode 120000 index 00000000..502f5a2d --- /dev/null +++ b/klip-sandbox/gradlew @@ -0,0 +1 @@ +../gradlew \ No newline at end of file diff --git a/klip-sandbox/gradlew.bat b/klip-sandbox/gradlew.bat new file mode 120000 index 00000000..28401328 --- /dev/null +++ b/klip-sandbox/gradlew.bat @@ -0,0 +1 @@ +../gradlew.bat \ No newline at end of file diff --git a/klip-sandbox/js/build.gradle.kts b/klip-sandbox/js/build.gradle.kts new file mode 100644 index 00000000..af881256 --- /dev/null +++ b/klip-sandbox/js/build.gradle.kts @@ -0,0 +1,35 @@ +plugins { + id("convention.common") + id("dev.petuska.klip") + kotlin("js") + id("convention.control") +} + +repositories { + mavenLocal() +} + +klip { + debug.set(rootProject.klip.debug) + update.set(rootProject.klip.update) +} + +kotlin { + js(IR) { + useCommonJs() + nodejs() + browser() + } + sourceSets { + test { + dependencies { + implementation("dev.petuska:klip") + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-test:_") + implementation(kotlin("test-js")) + } + languageSettings { + optIn("kotlinx.coroutines.ExperimentalCoroutinesApi") + } + } + } +} diff --git a/klip-sandbox/js/src/test/kotlin/JsTest.kt b/klip-sandbox/js/src/test/kotlin/JsTest.kt new file mode 100644 index 00000000..01046261 --- /dev/null +++ b/klip-sandbox/js/src/test/kotlin/JsTest.kt @@ -0,0 +1,4 @@ +package sandbox.test + +class JsTest : KlipTest() +class AnotherJsTest : KlipTest() diff --git a/klip-sandbox/js/src/test/kotlin/KlipTest.kt b/klip-sandbox/js/src/test/kotlin/KlipTest.kt new file mode 100644 index 00000000..5529aad4 --- /dev/null +++ b/klip-sandbox/js/src/test/kotlin/KlipTest.kt @@ -0,0 +1,20 @@ +package sandbox.test + +import dev.petuska.klip.assertions.assertKlip +import dev.petuska.klip.assertions.assertMatchesKlip +import kotlinx.coroutines.test.runTest +import kotlin.test.Test + +abstract class KlipTest { + @Test + fun withoutReceiver() = runTest { + assertMatchesKlip("zero") + assertMatchesKlip("one") + } + + @Test + fun withReceiver() = runTest { + 0.assertKlip() + 1.assertKlip() + } +} diff --git a/klip-sandbox/js/src/test/kotlin/__klips__/KlipTest.kt.json b/klip-sandbox/js/src/test/kotlin/__klips__/KlipTest.kt.json new file mode 100644 index 00000000..34ea5b04 --- /dev/null +++ b/klip-sandbox/js/src/test/kotlin/__klips__/KlipTest.kt.json @@ -0,0 +1,22 @@ +{ + "sandbox.test.KlipTest.withoutReceiver#0": { + "data": "zero", + "attributes": { + } + }, + "sandbox.test.KlipTest.withoutReceiver#1": { + "data": "one", + "attributes": { + } + }, + "sandbox.test.KlipTest.withReceiver#0": { + "data": 0, + "attributes": { + } + }, + "sandbox.test.KlipTest.withReceiver#1": { + "data": 1, + "attributes": { + } + } +} \ No newline at end of file diff --git a/klip-sandbox/js/src/test/kotlin/subpackage/JsTest.kt b/klip-sandbox/js/src/test/kotlin/subpackage/JsTest.kt new file mode 100644 index 00000000..c6c4c1aa --- /dev/null +++ b/klip-sandbox/js/src/test/kotlin/subpackage/JsTest.kt @@ -0,0 +1,5 @@ +package sandbox.test.subpackage + +import sandbox.test.KlipTest + +class JsTest : KlipTest() diff --git a/klip-sandbox/jvm/build.gradle.kts b/klip-sandbox/jvm/build.gradle.kts new file mode 100644 index 00000000..2c689be0 --- /dev/null +++ b/klip-sandbox/jvm/build.gradle.kts @@ -0,0 +1,26 @@ +plugins { + id("convention.common") + id("dev.petuska.klip") + kotlin("jvm") + id("convention.control") +} + +repositories { + mavenLocal() +} + +klip { + debug.set(rootProject.klip.debug) + update.set(rootProject.klip.update) +} + +kotlin { + sourceSets { + test { + dependencies { + implementation("dev.petuska:klip") + implementation(kotlin("test-junit5")) + } + } + } +} diff --git a/klip-sandbox/jvm/src/test/kotlin/JvmTest.kt b/klip-sandbox/jvm/src/test/kotlin/JvmTest.kt new file mode 100644 index 00000000..66f138b3 --- /dev/null +++ b/klip-sandbox/jvm/src/test/kotlin/JvmTest.kt @@ -0,0 +1,5 @@ +package sandbox.test + +class JvmTest : KlipTest() + +class AnotherJvmTest : KlipTest() diff --git a/klip-sandbox/jvm/src/test/kotlin/KlipTest.kt b/klip-sandbox/jvm/src/test/kotlin/KlipTest.kt new file mode 100644 index 00000000..5529aad4 --- /dev/null +++ b/klip-sandbox/jvm/src/test/kotlin/KlipTest.kt @@ -0,0 +1,20 @@ +package sandbox.test + +import dev.petuska.klip.assertions.assertKlip +import dev.petuska.klip.assertions.assertMatchesKlip +import kotlinx.coroutines.test.runTest +import kotlin.test.Test + +abstract class KlipTest { + @Test + fun withoutReceiver() = runTest { + assertMatchesKlip("zero") + assertMatchesKlip("one") + } + + @Test + fun withReceiver() = runTest { + 0.assertKlip() + 1.assertKlip() + } +} diff --git a/klip-sandbox/jvm/src/test/kotlin/__klips__/KlipTest.kt.json b/klip-sandbox/jvm/src/test/kotlin/__klips__/KlipTest.kt.json new file mode 100644 index 00000000..34ea5b04 --- /dev/null +++ b/klip-sandbox/jvm/src/test/kotlin/__klips__/KlipTest.kt.json @@ -0,0 +1,22 @@ +{ + "sandbox.test.KlipTest.withoutReceiver#0": { + "data": "zero", + "attributes": { + } + }, + "sandbox.test.KlipTest.withoutReceiver#1": { + "data": "one", + "attributes": { + } + }, + "sandbox.test.KlipTest.withReceiver#0": { + "data": 0, + "attributes": { + } + }, + "sandbox.test.KlipTest.withReceiver#1": { + "data": 1, + "attributes": { + } + } +} \ No newline at end of file diff --git a/klip-sandbox/jvm/src/test/kotlin/subpackage/JvmTest.kt b/klip-sandbox/jvm/src/test/kotlin/subpackage/JvmTest.kt new file mode 100644 index 00000000..b6e4dc25 --- /dev/null +++ b/klip-sandbox/jvm/src/test/kotlin/subpackage/JvmTest.kt @@ -0,0 +1,5 @@ +package sandbox.test.subpackage + +import sandbox.test.KlipTest + +class JvmTest : KlipTest() diff --git a/klip-sandbox/kotlin-js-store/yarn.lock b/klip-sandbox/kotlin-js-store/yarn.lock new file mode 100644 index 00000000..73072718 --- /dev/null +++ b/klip-sandbox/kotlin-js-store/yarn.lock @@ -0,0 +1,2032 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@discoveryjs/json-ext@^0.5.0": + version "0.5.7" + resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" + integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== + +"@jridgewell/gen-mapping@^0.3.0": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.1.tgz#cf92a983c83466b8c0ce9124fadeaf09f7c66ea9" + integrity sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg== + dependencies: + "@jridgewell/set-array" "^1.0.0" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/resolve-uri@^3.0.3": + version "3.0.7" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.0.7.tgz#30cd49820a962aff48c8fffc5cd760151fca61fe" + integrity sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA== + +"@jridgewell/set-array@^1.0.0": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.1.tgz#36a6acc93987adcf0ba50c66908bd0b70de8afea" + integrity sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ== + +"@jridgewell/source-map@^0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.2.tgz#f45351aaed4527a298512ec72f81040c998580fb" + integrity sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.13" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz#b6461fb0c2964356c469e115f504c95ad97ab88c" + integrity sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w== + +"@jridgewell/trace-mapping@^0.3.7", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.13" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz#dcfe3e95f224c8fe97a87a5235defec999aa92ea" + integrity sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@types/component-emitter@^1.2.10": + version "1.2.11" + resolved "https://registry.yarnpkg.com/@types/component-emitter/-/component-emitter-1.2.11.tgz#50d47d42b347253817a39709fef03ce66a108506" + integrity sha512-SRXjM+tfsSlA9VuG8hGO2nft2p8zjXCK1VcC6N4NXbBbYbSia9kzCChYQajIjzIqOOOuh5Ock6MmV2oux4jDZQ== + +"@types/cookie@^0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.4.1.tgz#bfd02c1f2224567676c1545199f87c3a861d878d" + integrity sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q== + +"@types/cors@^2.8.12": + version "2.8.12" + resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.12.tgz#6b2c510a7ad7039e98e7b8d3d6598f4359e5c080" + integrity sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw== + +"@types/eslint-scope@^3.7.3": + version "3.7.3" + resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.3.tgz#125b88504b61e3c8bc6f870882003253005c3224" + integrity sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g== + dependencies: + "@types/eslint" "*" + "@types/estree" "*" + +"@types/eslint@*": + version "8.4.3" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.4.3.tgz#5c92815a3838b1985c90034cd85f26f59d9d0ece" + integrity sha512-YP1S7YJRMPs+7KZKDb9G63n8YejIwW9BALq7a5j2+H4yl6iOv9CB29edho+cuFRrvmJbbaH2yiVChKLJVysDGw== + dependencies: + "@types/estree" "*" + "@types/json-schema" "*" + +"@types/estree@*", "@types/estree@^0.0.51": + version "0.0.51" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.51.tgz#cfd70924a25a3fd32b218e5e420e6897e1ac4f40" + integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ== + +"@types/json-schema@*", "@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/node@*", "@types/node@>=10.0.0": + version "17.0.42" + resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.42.tgz#d7e8f22700efc94d125103075c074396b5f41f9b" + integrity sha512-Q5BPGyGKcvQgAMbsr7qEGN/kIPN6zZecYYABeTDBizOsau+2NMdSVTar9UQw21A2+JyA2KRNDYaYrPB0Rpk2oQ== + +"@ungap/promise-all-settled@1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" + integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== + +"@webassemblyjs/ast@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7" + integrity sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw== + dependencies: + "@webassemblyjs/helper-numbers" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + +"@webassemblyjs/floating-point-hex-parser@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz#f6c61a705f0fd7a6aecaa4e8198f23d9dc179e4f" + integrity sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ== + +"@webassemblyjs/helper-api-error@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz#1a63192d8788e5c012800ba6a7a46c705288fd16" + integrity sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg== + +"@webassemblyjs/helper-buffer@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz#832a900eb444884cde9a7cad467f81500f5e5ab5" + integrity sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA== + +"@webassemblyjs/helper-numbers@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz#64d81da219fbbba1e3bd1bfc74f6e8c4e10a62ae" + integrity sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ== + dependencies: + "@webassemblyjs/floating-point-hex-parser" "1.11.1" + "@webassemblyjs/helper-api-error" "1.11.1" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/helper-wasm-bytecode@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz#f328241e41e7b199d0b20c18e88429c4433295e1" + integrity sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q== + +"@webassemblyjs/helper-wasm-section@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz#21ee065a7b635f319e738f0dd73bfbda281c097a" + integrity sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + +"@webassemblyjs/ieee754@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz#963929e9bbd05709e7e12243a099180812992614" + integrity sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.1.tgz#ce814b45574e93d76bae1fb2644ab9cdd9527aa5" + integrity sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.1.tgz#d1f8b764369e7c6e6bae350e854dec9a59f0a3ff" + integrity sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ== + +"@webassemblyjs/wasm-edit@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz#ad206ebf4bf95a058ce9880a8c092c5dec8193d6" + integrity sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/helper-wasm-section" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + "@webassemblyjs/wasm-opt" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + "@webassemblyjs/wast-printer" "1.11.1" + +"@webassemblyjs/wasm-gen@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz#86c5ea304849759b7d88c47a32f4f039ae3c8f76" + integrity sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/ieee754" "1.11.1" + "@webassemblyjs/leb128" "1.11.1" + "@webassemblyjs/utf8" "1.11.1" + +"@webassemblyjs/wasm-opt@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz#657b4c2202f4cf3b345f8a4c6461c8c2418985f2" + integrity sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + +"@webassemblyjs/wasm-parser@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz#86ca734534f417e9bd3c67c7a1c75d8be41fb199" + integrity sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-api-error" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/ieee754" "1.11.1" + "@webassemblyjs/leb128" "1.11.1" + "@webassemblyjs/utf8" "1.11.1" + +"@webassemblyjs/wast-printer@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz#d0c73beda8eec5426f10ae8ef55cee5e7084c2f0" + integrity sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@xtuc/long" "4.2.2" + +"@webpack-cli/configtest@^1.1.1": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-1.2.0.tgz#7b20ce1c12533912c3b217ea68262365fa29a6f5" + integrity sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg== + +"@webpack-cli/info@^1.4.1": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-1.5.0.tgz#6c78c13c5874852d6e2dd17f08a41f3fe4c261b1" + integrity sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ== + dependencies: + envinfo "^7.7.3" + +"@webpack-cli/serve@^1.6.1": + version "1.7.0" + resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.7.0.tgz#e1993689ac42d2b16e9194376cfb6753f6254db1" + integrity sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q== + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + +abab@^2.0.5: + version "2.0.6" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" + integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== + +abort-controller@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" + integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== + dependencies: + event-target-shim "^5.0.0" + +accepts@~1.3.4: + 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== + dependencies: + mime-types "~2.1.34" + negotiator "0.6.3" + +acorn-import-assertions@^1.7.6: + version "1.8.0" + resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9" + integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw== + +acorn@^8.4.1, acorn@^8.5.0: + version "8.7.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.1.tgz#0197122c843d1bf6d0a5e83220a788f278f63c30" + integrity sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A== + +ajv-keywords@^3.5.2: + version "3.5.2" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" + integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== + +ajv@^6.12.5: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ansi-colors@4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" + integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +anymatch@~3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" + integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base64id@2.0.0, base64id@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/base64id/-/base64id-2.0.0.tgz#2770ac6bc47d312af97a8bf9a634342e0cd25cb6" + integrity sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog== + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +body-parser@^1.19.0: + version "1.20.0" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.0.tgz#3de69bd89011c11573d7bfee6a64f11b6bd27cc5" + integrity sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg== + dependencies: + bytes "3.1.2" + content-type "~1.0.4" + 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.10.3" + raw-body "2.5.1" + type-is "~1.6.18" + unpipe "1.0.0" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^3.0.2, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +browser-stdout@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" + integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== + +browserslist@^4.14.5: + version "4.20.4" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.20.4.tgz#98096c9042af689ee1e0271333dbc564b8ce4477" + integrity sha512-ok1d+1WpnU24XYN7oC3QWgTyMhY/avPJ/r9T00xxvUOIparA/gc+UPUMaod3i+G6s+nI2nUb9xZ5k794uIwShw== + dependencies: + caniuse-lite "^1.0.30001349" + electron-to-chromium "^1.4.147" + escalade "^3.1.1" + node-releases "^2.0.5" + picocolors "^1.0.0" + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +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@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +camelcase@^6.0.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +caniuse-lite@^1.0.30001349: + version "1.0.30001352" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001352.tgz#cc6f5da3f983979ad1e2cdbae0505dccaa7c6a12" + integrity sha512-GUgH8w6YergqPQDGWhJGt8GDRnY0L/iJVQcU3eJ46GYf52R8tk0Wxp0PymuFVZboJYXGiCqwozAYZNRjVj6IcA== + +chalk@^4.1.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chokidar@3.5.3, chokidar@^3.5.1: + version "3.5.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +chrome-trace-event@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" + integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== + +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + +clone-deep@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" + integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== + dependencies: + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@~1.1.4: + version "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.14: + version "2.0.18" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.18.tgz#4c260bcf86437ce94fa58e2e49a83b623f3c4d66" + integrity sha512-rHDY1i4V4JBCXHnHwaVyA202CKSj2kUrjI5cSJQbTdnFeI4ShV3e19Fe7EQfzL2tjSrvYyWugdGAtEc1lLvGDg== + +colors@1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" + integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== + +commander@^2.20.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commander@^7.0.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + +component-emitter@~1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +connect@^3.7.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/connect/-/connect-3.7.0.tgz#5d49348910caa5e07a01800b030d0c35f20484f8" + integrity sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ== + dependencies: + debug "2.6.9" + finalhandler "1.1.2" + parseurl "~1.3.3" + utils-merge "1.0.1" + +content-type@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + +cookie@~0.4.1: + version "0.4.2" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" + integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== + +cors@~2.8.5: + version "2.8.5" + resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" + integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== + dependencies: + object-assign "^4" + vary "^1" + +cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +custom-event@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/custom-event/-/custom-event-1.0.1.tgz#5d02a46850adf1b4a317946a3928fccb5bfd0425" + integrity sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg== + +date-format@^4.0.10: + version "4.0.11" + resolved "https://registry.yarnpkg.com/date-format/-/date-format-4.0.11.tgz#ae0d1e069d7f0687938fd06f98c12f3a6276e526" + integrity sha512-VS20KRyorrbMCQmpdl2hg5KaOUsda1RbnsJg461FfrcyCUg+pkd0b40BSW4niQyTheww4DBXQnS7HwSrKkipLw== + +debug@2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@4.3.3: + version "4.3.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" + integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== + dependencies: + ms "2.1.2" + +debug@^4.3.4, debug@~4.3.1, debug@~4.3.2: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +decamelize@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" + integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== + +depd@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + +di@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/di/-/di-0.0.1.tgz#806649326ceaa7caa3306d75d985ea2748ba913c" + integrity sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA== + +diff@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" + integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== + +dom-serialize@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/dom-serialize/-/dom-serialize-2.2.1.tgz#562ae8999f44be5ea3076f5419dcd59eb43ac95b" + integrity sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ== + dependencies: + custom-event "~1.0.0" + ent "~2.2.0" + extend "^3.0.0" + void-elements "^2.0.0" + +dukat@0.5.8-rc.4: + version "0.5.8-rc.4" + resolved "https://registry.yarnpkg.com/dukat/-/dukat-0.5.8-rc.4.tgz#90384dcb50b14c26f0e99dae92b2dea44f5fce21" + integrity sha512-ZnMt6DGBjlVgK2uQamXfd7uP/AxH7RqI0BL9GLrrJb2gKdDxvJChWy+M9AQEaL+7/6TmxzJxFOsRiInY9oGWTA== + dependencies: + google-protobuf "3.12.2" + typescript "3.9.5" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== + +electron-to-chromium@^1.4.147: + version "1.4.154" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.154.tgz#d69c60499fc467a6c59591d29183e520afbc78a1" + integrity sha512-GbV9djOkrnj6xmW+YYVVEI3VCQnJ0pnSTu7TW2JyjKd5cakoiSaG5R4RbEtfaD92GsY10DzbU3GYRe+IOA9kqA== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== + +engine.io-parser@~5.0.3: + version "5.0.4" + resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.0.4.tgz#0b13f704fa9271b3ec4f33112410d8f3f41d0fc0" + integrity sha512-+nVFp+5z1E3HcToEnO7ZIj3g+3k9389DvWtvJZz0T6/eOCPIyyxehFcedoYrZQrp0LgQbD9pPXhpMBKMd5QURg== + +engine.io@~6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-6.2.0.tgz#003bec48f6815926f2b1b17873e576acd54f41d0" + integrity sha512-4KzwW3F3bk+KlzSOY57fj/Jx6LyRQ1nbcyIadehl+AnXjKT7gDO0ORdRi/84ixvMKTym6ZKuxvbzN62HDDU1Lg== + dependencies: + "@types/cookie" "^0.4.1" + "@types/cors" "^2.8.12" + "@types/node" ">=10.0.0" + accepts "~1.3.4" + base64id "2.0.0" + cookie "~0.4.1" + cors "~2.8.5" + debug "~4.3.1" + engine.io-parser "~5.0.3" + ws "~8.2.3" + +enhanced-resolve@^5.8.3: + version "5.9.3" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz#44a342c012cbc473254af5cc6ae20ebd0aae5d88" + integrity sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + +ent@~2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/ent/-/ent-2.2.0.tgz#e964219325a21d05f44466a2f686ed6ce5f5dd1d" + integrity sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA== + +envinfo@^7.7.3: + version "7.8.1" + resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" + integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== + +es-module-lexer@^0.9.0: + version "0.9.3" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19" + integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ== + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + +escape-string-regexp@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eslint-scope@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +event-target-shim@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" + integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== + +eventemitter3@^4.0.0: + version "4.0.7" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + +events@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + +extend@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +fast-deep-equal@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fastest-levenshtein@^1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz#9990f7d3a88cc5a9ffd1f1745745251700d497e2" + integrity sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow== + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + 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" + integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.3" + statuses "~1.5.0" + unpipe "~1.0.0" + +find-up@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +find-up@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== + +flatted@^3.2.5: + version "3.2.5" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.5.tgz#76c8584f4fc843db64702a6bd04ab7a8bd666da3" + integrity sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg== + +follow-redirects@^1.0.0: + version "1.15.1" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.1.tgz#0ca6a452306c9b276e4d3127483e29575e207ad5" + integrity sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA== + +format-util@1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/format-util/-/format-util-1.0.5.tgz#1ffb450c8a03e7bccffe40643180918cc297d271" + integrity sha512-varLbTj0e0yVyRpqQhuWV+8hlePAgaoFRhNFj50BNjEIrw1/DphHSObtqwskVCPWNgzwPoQrZAbfa/SBiicNeg== + +fs-extra@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" + integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +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" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-intrinsic@^1.0.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.2.tgz#336975123e05ad0b7ba41f152ee4aadbea6cf598" + integrity sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.3" + +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-to-regexp@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" + integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== + +glob@7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" + integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^7.1.3, glob@^7.1.7: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +google-protobuf@3.12.2: + version "3.12.2" + resolved "https://registry.yarnpkg.com/google-protobuf/-/google-protobuf-3.12.2.tgz#50ce9f9b6281235724eb243d6a83e969a2176e53" + integrity sha512-4CZhpuRr1d6HjlyrxoXoocoGFnRYgKULgMtikMddA9ztRyYR59Aondv2FioyxWVamRo0rF2XpYawkTCBEQOSkA== + +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, graceful-fs@^4.2.9: + version "4.2.10" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" + integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== + +growl@1.10.5: + version "1.10.5" + resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" + integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +he@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + dependencies: + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" + +http-proxy@^1.18.1: + version "1.18.1" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" + integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== + dependencies: + eventemitter3 "^4.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +iconv-lite@^0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +import-local@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" + integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== + dependencies: + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +interpret@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" + integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw== + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-core-module@^2.8.1: + version "2.9.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.9.0.tgz#e1c34429cd51c6dd9e09e0799e396e27b19a9c69" + integrity sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A== + dependencies: + has "^1.0.3" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-plain-obj@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + +is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + +isbinaryfile@^4.0.8: + version "4.0.10" + resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-4.0.10.tgz#0c5b5e30c2557a2f06febd37b7322946aaee42b3" + integrity sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== + +jest-worker@^27.4.5: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" + integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +js-yaml@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +json-parse-better-errors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +karma-chrome-launcher@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/karma-chrome-launcher/-/karma-chrome-launcher-3.1.0.tgz#805a586799a4d05f4e54f72a204979f3f3066738" + integrity sha512-3dPs/n7vgz1rxxtynpzZTvb9y/GIaW8xjAwcIGttLbycqoFtI7yo1NGnQi6oFTherRE+GIhCAHZC4vEqWGhNvg== + dependencies: + which "^1.2.1" + +karma-mocha@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/karma-mocha/-/karma-mocha-2.0.1.tgz#4b0254a18dfee71bdbe6188d9a6861bf86b0cd7d" + integrity sha512-Tzd5HBjm8his2OA4bouAsATYEpZrp9vC7z5E5j4C5Of5Rrs1jY67RAwXNcVmd/Bnk1wgvQRou0zGVLey44G4tQ== + dependencies: + minimist "^1.2.3" + +karma-sourcemap-loader@0.3.8: + version "0.3.8" + resolved "https://registry.yarnpkg.com/karma-sourcemap-loader/-/karma-sourcemap-loader-0.3.8.tgz#d4bae72fb7a8397328a62b75013d2df937bdcf9c" + integrity sha512-zorxyAakYZuBcHRJE+vbrK2o2JXLFWK8VVjiT/6P+ltLBUGUvqTEkUiQ119MGdOrK7mrmxXHZF1/pfT6GgIZ6g== + dependencies: + graceful-fs "^4.1.2" + +karma-webpack@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/karma-webpack/-/karma-webpack-5.0.0.tgz#2a2c7b80163fe7ffd1010f83f5507f95ef39f840" + integrity sha512-+54i/cd3/piZuP3dr54+NcFeKOPnys5QeM1IY+0SPASwrtHsliXUiCL50iW+K9WWA7RvamC4macvvQ86l3KtaA== + dependencies: + glob "^7.1.3" + minimatch "^3.0.4" + webpack-merge "^4.1.5" + +karma@6.3.16: + version "6.3.16" + resolved "https://registry.yarnpkg.com/karma/-/karma-6.3.16.tgz#76d1a705fd1cf864ee5ed85270b572641e0958ef" + integrity sha512-nEU50jLvDe5yvXqkEJRf8IuvddUkOY2x5Xc4WXHz6dxINgGDrgD2uqQWeVrJs4hbfNaotn+HQ1LZJ4yOXrL7xQ== + dependencies: + body-parser "^1.19.0" + braces "^3.0.2" + chokidar "^3.5.1" + colors "1.4.0" + connect "^3.7.0" + di "^0.0.1" + dom-serialize "^2.2.1" + glob "^7.1.7" + graceful-fs "^4.2.6" + http-proxy "^1.18.1" + isbinaryfile "^4.0.8" + lodash "^4.17.21" + log4js "^6.4.1" + mime "^2.5.2" + minimatch "^3.0.4" + mkdirp "^0.5.5" + qjobs "^1.2.0" + range-parser "^1.2.1" + rimraf "^3.0.2" + socket.io "^4.2.0" + source-map "^0.6.1" + tmp "^0.2.1" + ua-parser-js "^0.7.30" + yargs "^16.1.1" + +kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +loader-runner@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" + integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash@^4.17.15, lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +log-symbols@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + +log4js@^6.4.1: + version "6.5.2" + resolved "https://registry.yarnpkg.com/log4js/-/log4js-6.5.2.tgz#9ae371e5b3cb3a3a209c24686e5547f8670834e5" + integrity sha512-DXtpNtt+KDOMT7RHUDIur/WsSA3rntlUh9Zg4XCdV42wUuMmbFkl38+LZ92Z5QvQA7mD5kAVkLiBSEH/tvUB8A== + dependencies: + date-format "^4.0.10" + debug "^4.3.4" + flatted "^3.2.5" + rfdc "^1.3.0" + streamroller "^3.1.1" + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +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-types@^2.1.27, 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" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime@^2.5.2: + version "2.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" + integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +minimatch@3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^3.0.4, minimatch@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.2.3, minimist@^1.2.6: + version "1.2.6" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" + integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== + +mkdirp@^0.5.5: + version "0.5.6" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== + dependencies: + minimist "^1.2.6" + +mocha@9.2.1: + version "9.2.1" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-9.2.1.tgz#a1abb675aa9a8490798503af57e8782a78f1338e" + integrity sha512-T7uscqjJVS46Pq1XDXyo9Uvey9gd3huT/DD9cYBb4K2Xc/vbKRPUWK067bxDQRK0yIz6Jxk73IrnimvASzBNAQ== + dependencies: + "@ungap/promise-all-settled" "1.1.2" + ansi-colors "4.1.1" + browser-stdout "1.3.1" + chokidar "3.5.3" + debug "4.3.3" + diff "5.0.0" + escape-string-regexp "4.0.0" + find-up "5.0.0" + glob "7.2.0" + growl "1.10.5" + he "1.2.0" + js-yaml "4.1.0" + log-symbols "4.1.0" + minimatch "3.0.4" + ms "2.1.3" + nanoid "3.2.0" + serialize-javascript "6.0.0" + strip-json-comments "3.1.1" + supports-color "8.1.1" + which "2.0.2" + workerpool "6.2.0" + yargs "16.2.0" + yargs-parser "20.2.4" + yargs-unparser "2.0.0" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +nanoid@3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.2.0.tgz#62667522da6673971cca916a6d3eff3f415ff80c" + integrity sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA== + +negotiator@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + +neo-async@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +node-fetch@2.6.7: + version "2.6.7" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" + integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== + dependencies: + whatwg-url "^5.0.0" + +node-releases@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.5.tgz#280ed5bc3eba0d96ce44897d8aee478bfb3d9666" + integrity sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q== + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +object-assign@^4: + version "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.9.0: + version "1.12.2" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" + integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== + +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww== + dependencies: + ee-first "1.1.1" + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +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== + +picomatch@^2.0.4, picomatch@^2.2.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +punycode@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +qjobs@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/qjobs/-/qjobs-1.2.0.tgz#c45e9c61800bd087ef88d7e256423bdd49e5d071" + integrity sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg== + +qs@6.10.3: + version "6.10.3" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.3.tgz#d6cde1b2ffca87b5aa57889816c5f81535e22e8e" + integrity sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ== + dependencies: + side-channel "^1.0.4" + +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +range-parser@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" + integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +rechoir@^0.7.0: + version "0.7.1" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.7.1.tgz#9478a96a1ca135b5e88fc027f03ee92d6c645686" + integrity sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg== + dependencies: + resolve "^1.9.0" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== + +resolve-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" + integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== + dependencies: + resolve-from "^5.0.0" + +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve@^1.9.0: + version "1.22.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198" + integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw== + dependencies: + is-core-module "^2.8.1" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +rfdc@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" + integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== + +rimraf@^3.0.0, rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +safe-buffer@^5.1.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== + +"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" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +schema-utils@^3.1.0, schema-utils@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281" + integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +serialize-javascript@6.0.0, serialize-javascript@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" + integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== + dependencies: + randombytes "^2.1.0" + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +shallow-clone@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" + integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== + dependencies: + kind-of "^6.0.2" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +signal-exit@^3.0.3: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +socket.io-adapter@~2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-2.4.0.tgz#b50a4a9ecdd00c34d4c8c808224daa1a786152a6" + integrity sha512-W4N+o69rkMEGVuk2D/cvca3uYsvGlMwsySWV447y99gUPghxq42BxqLNMndb+a1mm/5/7NeXVQS7RLa2XyXvYg== + +socket.io-parser@~4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.0.4.tgz#9ea21b0d61508d18196ef04a2c6b9ab630f4c2b0" + integrity sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g== + dependencies: + "@types/component-emitter" "^1.2.10" + component-emitter "~1.3.0" + debug "~4.3.1" + +socket.io@^4.2.0: + version "4.5.1" + resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-4.5.1.tgz#aa7e73f8a6ce20ee3c54b2446d321bbb6b1a9029" + integrity sha512-0y9pnIso5a9i+lJmsCdtmTTgJFFSvNQKDnPQRz28mGNnxbmqYg2QPtJTLFxhymFZhAIn50eHAKzJeiNaKr+yUQ== + dependencies: + accepts "~1.3.4" + base64id "~2.0.0" + debug "~4.3.2" + engine.io "~6.2.0" + socket.io-adapter "~2.4.0" + socket.io-parser "~4.0.4" + +source-map-js@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" + integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== + +source-map-loader@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/source-map-loader/-/source-map-loader-3.0.1.tgz#9ae5edc7c2d42570934be4c95d1ccc6352eba52d" + integrity sha512-Vp1UsfyPvgujKQzi4pyDiTOnE3E4H+yHvkVRN3c/9PJmQS4CQJExvcDvaX/D+RV+xQben9HJ56jMJS3CgUeWyA== + dependencies: + abab "^2.0.5" + iconv-lite "^0.6.3" + source-map-js "^1.0.1" + +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== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.6.0, source-map@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +statuses@~1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== + +streamroller@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/streamroller/-/streamroller-3.1.1.tgz#679aae10a4703acdf2740755307df0a05ad752e6" + integrity sha512-iPhtd9unZ6zKdWgMeYGfSBuqCngyJy1B/GPi/lTpwGpa3bajuX30GjUVd0/Tn/Xhg0mr4DOSENozz9Y06qyonQ== + dependencies: + date-format "^4.0.10" + debug "^4.3.4" + fs-extra "^10.1.0" + +string-width@^4.1.0, string-width@^4.2.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-json-comments@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +supports-color@8.1.1, supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +tapable@^2.1.1, tapable@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== + +terser-webpack-plugin@^5.1.3: + version "5.3.3" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.3.tgz#8033db876dd5875487213e87c627bca323e5ed90" + integrity sha512-Fx60G5HNYknNTNQnzQ1VePRuu89ZVYWfjRAeT5rITuCY/1b08s49e5kSQwHDirKZWuoKOBRFS98EUUoZ9kLEwQ== + dependencies: + "@jridgewell/trace-mapping" "^0.3.7" + jest-worker "^27.4.5" + schema-utils "^3.1.1" + serialize-javascript "^6.0.0" + terser "^5.7.2" + +terser@^5.7.2: + version "5.14.1" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.14.1.tgz#7c95eec36436cb11cf1902cc79ac564741d19eca" + integrity sha512-+ahUAE+iheqBTDxXhTisdA8hgvbEG1hHOQ9xmNjeUJSoi6DU/gMrKNcfZjHkyY6Alnuyc+ikYJaxxfHkT3+WuQ== + dependencies: + "@jridgewell/source-map" "^0.3.2" + acorn "^8.5.0" + commander "^2.20.0" + source-map-support "~0.5.20" + +tmp@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" + integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== + dependencies: + rimraf "^3.0.0" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + +type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +typescript@3.9.5: + version "3.9.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.5.tgz#586f0dba300cde8be52dd1ac4f7e1009c1b13f36" + integrity sha512-hSAifV3k+i6lEoCJ2k6R2Z/rp/H3+8sdmcn5NrS3/3kE7+RyZXm9aqvxWqjEXHAd8b0pShatpcdMTvEdvAJltQ== + +ua-parser-js@^0.7.30: + version "0.7.31" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.31.tgz#649a656b191dffab4f21d5e053e27ca17cbff5c6" + integrity sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ== + +universalify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" + integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== + +vary@^1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== + +void-elements@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec" + integrity sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung== + +watchpack@^2.3.1: + version "2.4.0" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" + integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== + dependencies: + glob-to-regexp "^0.4.1" + graceful-fs "^4.1.2" + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + +webpack-cli@4.9.2: + version "4.9.2" + resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-4.9.2.tgz#77c1adaea020c3f9e2db8aad8ea78d235c83659d" + integrity sha512-m3/AACnBBzK/kMTcxWHcZFPrw/eQuY4Df1TxvIWfWM2x7mRqBQCqKEd96oCUa9jkapLBaFfRce33eGDb4Pr7YQ== + dependencies: + "@discoveryjs/json-ext" "^0.5.0" + "@webpack-cli/configtest" "^1.1.1" + "@webpack-cli/info" "^1.4.1" + "@webpack-cli/serve" "^1.6.1" + colorette "^2.0.14" + commander "^7.0.0" + execa "^5.0.0" + fastest-levenshtein "^1.0.12" + import-local "^3.0.2" + interpret "^2.2.0" + rechoir "^0.7.0" + webpack-merge "^5.7.3" + +webpack-merge@^4.1.5: + version "4.2.2" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-4.2.2.tgz#a27c52ea783d1398afd2087f547d7b9d2f43634d" + integrity sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g== + dependencies: + lodash "^4.17.15" + +webpack-merge@^5.7.3: + version "5.8.0" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.8.0.tgz#2b39dbf22af87776ad744c390223731d30a68f61" + integrity sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q== + dependencies: + clone-deep "^4.0.1" + wildcard "^2.0.0" + +webpack-sources@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" + integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== + +webpack@5.69.1: + version "5.69.1" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.69.1.tgz#8cfd92c192c6a52c99ab00529b5a0d33aa848dc5" + integrity sha512-+VyvOSJXZMT2V5vLzOnDuMz5GxEqLk7hKWQ56YxPW/PQRUuKimPqmEIJOx8jHYeyo65pKbapbW464mvsKbaj4A== + dependencies: + "@types/eslint-scope" "^3.7.3" + "@types/estree" "^0.0.51" + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/wasm-edit" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + acorn "^8.4.1" + acorn-import-assertions "^1.7.6" + browserslist "^4.14.5" + chrome-trace-event "^1.0.2" + enhanced-resolve "^5.8.3" + es-module-lexer "^0.9.0" + eslint-scope "5.1.1" + events "^3.2.0" + glob-to-regexp "^0.4.1" + graceful-fs "^4.2.9" + json-parse-better-errors "^1.0.2" + loader-runner "^4.2.0" + mime-types "^2.1.27" + neo-async "^2.6.2" + schema-utils "^3.1.0" + tapable "^2.1.1" + terser-webpack-plugin "^5.1.3" + watchpack "^2.3.1" + webpack-sources "^3.2.3" + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +which@2.0.2, which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +which@^1.2.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +wildcard@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec" + integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw== + +workerpool@6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.0.tgz#827d93c9ba23ee2019c3ffaff5c27fccea289e8b" + integrity sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A== + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +ws@8.5.0: + version "8.5.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.5.0.tgz#bfb4be96600757fe5382de12c670dab984a1ed4f" + integrity sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg== + +ws@~8.2.3: + version "8.2.3" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.2.3.tgz#63a56456db1b04367d0b721a0b80cae6d8becbba" + integrity sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yargs-parser@20.2.4: + version "20.2.4" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" + integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== + +yargs-parser@^20.2.2: + version "20.2.9" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + +yargs-unparser@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" + integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== + dependencies: + camelcase "^6.0.0" + decamelize "^4.0.0" + flat "^5.0.2" + is-plain-obj "^2.1.0" + +yargs@16.2.0, yargs@^16.1.1: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== diff --git a/klip-sandbox/settings.gradle.kts b/klip-sandbox/settings.gradle.kts new file mode 100644 index 00000000..99616203 --- /dev/null +++ b/klip-sandbox/settings.gradle.kts @@ -0,0 +1,28 @@ +pluginManagement { + repositories { + gradlePluginPortal() + mavenCentral() + google() + maven("https://maven.pkg.jetbrains.space/public/p/compose/dev") + mavenLocal() + } +} + +plugins { + id("de.fayard.refreshVersions") version "0.40.2" + id("com.gradle.enterprise") version "3.10.2" +} + +refreshVersions { + versionsPropertiesFile = rootDir.resolve("gradle/versions.properties") + extraArtifactVersionKeyRules(rootDir.resolve("gradle/versions.rules")) +} + +includeBuild("../build-conventions") +includeBuild("..") + +rootProject.name = "klip-sandbox" +include( + ":jvm", + ":js", +) diff --git a/klip-sandbox/src/blockingTest/kotlin/BlockingTest.kt b/klip-sandbox/src/blockingTest/kotlin/BlockingTest.kt new file mode 100644 index 00000000..b51ac5ee --- /dev/null +++ b/klip-sandbox/src/blockingTest/kotlin/BlockingTest.kt @@ -0,0 +1,19 @@ +package sandbox + +import dev.petuska.klip.assertions.assertKlipBlocking +import dev.petuska.klip.assertions.assertMatchesKlipBlocking +import kotlin.test.Test + +class BlockingTest { + @Test + fun withoutReceiver() { + assertMatchesKlipBlocking("zero") + assertMatchesKlipBlocking("one") + } + + @Test + fun withReceiver() { + 0.assertKlipBlocking() + 1.assertKlipBlocking() + } +} diff --git a/klip-sandbox/src/blockingTest/kotlin/__klips__/BlockingTest.kt.json b/klip-sandbox/src/blockingTest/kotlin/__klips__/BlockingTest.kt.json new file mode 100644 index 00000000..35b703f8 --- /dev/null +++ b/klip-sandbox/src/blockingTest/kotlin/__klips__/BlockingTest.kt.json @@ -0,0 +1,22 @@ +{ + "sandbox.BlockingTest.withoutReceiver#0": { + "data": "zero", + "attributes": { + } + }, + "sandbox.BlockingTest.withoutReceiver#1": { + "data": "one", + "attributes": { + } + }, + "sandbox.BlockingTest.withReceiver#0": { + "data": 0, + "attributes": { + } + }, + "sandbox.BlockingTest.withReceiver#1": { + "data": 1, + "attributes": { + } + } +} \ No newline at end of file diff --git a/klip-sandbox/src/commonTest/kotlin/CommonTest.kt b/klip-sandbox/src/commonTest/kotlin/CommonTest.kt new file mode 100644 index 00000000..8d0fa177 --- /dev/null +++ b/klip-sandbox/src/commonTest/kotlin/CommonTest.kt @@ -0,0 +1,5 @@ +package sandbox.test + +class CommonTest : KlipTest() + +class AnotherCommonTest : KlipTest() diff --git a/klip-sandbox/src/commonTest/kotlin/KlipTest.kt b/klip-sandbox/src/commonTest/kotlin/KlipTest.kt new file mode 100644 index 00000000..be162c3b --- /dev/null +++ b/klip-sandbox/src/commonTest/kotlin/KlipTest.kt @@ -0,0 +1,20 @@ +package sandbox.test + +import dev.petuska.klip.assertions.assertKlip +import dev.petuska.klip.assertions.assertMatchesKlip +import dev.petuska.klip.runner.runTest +import kotlin.test.Test + +abstract class KlipTest { + @Test + fun withoutReceiver() = runTest { + assertMatchesKlip("zero") + assertMatchesKlip("one") + } + + @Test + fun withReceiver() = runTest { + 0.assertKlip() + 1.assertKlip() + } +} diff --git a/klip-sandbox/src/commonTest/kotlin/__klips__/KlipTest.kt.json b/klip-sandbox/src/commonTest/kotlin/__klips__/KlipTest.kt.json new file mode 100644 index 00000000..34ea5b04 --- /dev/null +++ b/klip-sandbox/src/commonTest/kotlin/__klips__/KlipTest.kt.json @@ -0,0 +1,22 @@ +{ + "sandbox.test.KlipTest.withoutReceiver#0": { + "data": "zero", + "attributes": { + } + }, + "sandbox.test.KlipTest.withoutReceiver#1": { + "data": "one", + "attributes": { + } + }, + "sandbox.test.KlipTest.withReceiver#0": { + "data": 0, + "attributes": { + } + }, + "sandbox.test.KlipTest.withReceiver#1": { + "data": 1, + "attributes": { + } + } +} \ No newline at end of file diff --git a/klip-sandbox/src/commonTest/kotlin/subpackage/CommonTest.kt b/klip-sandbox/src/commonTest/kotlin/subpackage/CommonTest.kt new file mode 100644 index 00000000..e186d795 --- /dev/null +++ b/klip-sandbox/src/commonTest/kotlin/subpackage/CommonTest.kt @@ -0,0 +1,5 @@ +package sandbox.test.subpackage + +import sandbox.test.KlipTest + +class CommonTest : KlipTest() diff --git a/sandbox/src/main/AndroidManifest.xml b/klip-sandbox/src/main/AndroidManifest.xml similarity index 100% rename from sandbox/src/main/AndroidManifest.xml rename to klip-sandbox/src/main/AndroidManifest.xml diff --git a/klip-sandbox/src/stubTest/kotlin/StubTest.kt b/klip-sandbox/src/stubTest/kotlin/StubTest.kt new file mode 100644 index 00000000..4454c92d --- /dev/null +++ b/klip-sandbox/src/stubTest/kotlin/StubTest.kt @@ -0,0 +1,7 @@ +import kotlin.test.Test + +class StubTest { + @Test + fun shouldNeverRun(): Unit = + error("New testable kotlin target appeared! ${Platform.osFamily} ${Platform.cpuArchitecture}") +} diff --git a/kotlin-js-store/yarn.lock b/kotlin-js-store/yarn.lock new file mode 100644 index 00000000..b937b33e --- /dev/null +++ b/kotlin-js-store/yarn.lock @@ -0,0 +1,2032 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@discoveryjs/json-ext@^0.5.0": + version "0.5.7" + resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" + integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== + +"@jridgewell/gen-mapping@^0.3.0": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.1.tgz#cf92a983c83466b8c0ce9124fadeaf09f7c66ea9" + integrity sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg== + dependencies: + "@jridgewell/set-array" "^1.0.0" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/resolve-uri@^3.0.3": + version "3.0.7" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.0.7.tgz#30cd49820a962aff48c8fffc5cd760151fca61fe" + integrity sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA== + +"@jridgewell/set-array@^1.0.0": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.1.tgz#36a6acc93987adcf0ba50c66908bd0b70de8afea" + integrity sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ== + +"@jridgewell/source-map@^0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.2.tgz#f45351aaed4527a298512ec72f81040c998580fb" + integrity sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.13" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz#b6461fb0c2964356c469e115f504c95ad97ab88c" + integrity sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w== + +"@jridgewell/trace-mapping@^0.3.7", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.13" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz#dcfe3e95f224c8fe97a87a5235defec999aa92ea" + integrity sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@types/component-emitter@^1.2.10": + version "1.2.11" + resolved "https://registry.yarnpkg.com/@types/component-emitter/-/component-emitter-1.2.11.tgz#50d47d42b347253817a39709fef03ce66a108506" + integrity sha512-SRXjM+tfsSlA9VuG8hGO2nft2p8zjXCK1VcC6N4NXbBbYbSia9kzCChYQajIjzIqOOOuh5Ock6MmV2oux4jDZQ== + +"@types/cookie@^0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.4.1.tgz#bfd02c1f2224567676c1545199f87c3a861d878d" + integrity sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q== + +"@types/cors@^2.8.12": + version "2.8.12" + resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.12.tgz#6b2c510a7ad7039e98e7b8d3d6598f4359e5c080" + integrity sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw== + +"@types/eslint-scope@^3.7.3": + version "3.7.3" + resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.3.tgz#125b88504b61e3c8bc6f870882003253005c3224" + integrity sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g== + dependencies: + "@types/eslint" "*" + "@types/estree" "*" + +"@types/eslint@*": + version "8.4.3" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.4.3.tgz#5c92815a3838b1985c90034cd85f26f59d9d0ece" + integrity sha512-YP1S7YJRMPs+7KZKDb9G63n8YejIwW9BALq7a5j2+H4yl6iOv9CB29edho+cuFRrvmJbbaH2yiVChKLJVysDGw== + dependencies: + "@types/estree" "*" + "@types/json-schema" "*" + +"@types/estree@*", "@types/estree@^0.0.51": + version "0.0.51" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.51.tgz#cfd70924a25a3fd32b218e5e420e6897e1ac4f40" + integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ== + +"@types/json-schema@*", "@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/node@*", "@types/node@>=10.0.0": + version "17.0.42" + resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.42.tgz#d7e8f22700efc94d125103075c074396b5f41f9b" + integrity sha512-Q5BPGyGKcvQgAMbsr7qEGN/kIPN6zZecYYABeTDBizOsau+2NMdSVTar9UQw21A2+JyA2KRNDYaYrPB0Rpk2oQ== + +"@ungap/promise-all-settled@1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" + integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== + +"@webassemblyjs/ast@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7" + integrity sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw== + dependencies: + "@webassemblyjs/helper-numbers" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + +"@webassemblyjs/floating-point-hex-parser@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz#f6c61a705f0fd7a6aecaa4e8198f23d9dc179e4f" + integrity sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ== + +"@webassemblyjs/helper-api-error@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz#1a63192d8788e5c012800ba6a7a46c705288fd16" + integrity sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg== + +"@webassemblyjs/helper-buffer@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz#832a900eb444884cde9a7cad467f81500f5e5ab5" + integrity sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA== + +"@webassemblyjs/helper-numbers@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz#64d81da219fbbba1e3bd1bfc74f6e8c4e10a62ae" + integrity sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ== + dependencies: + "@webassemblyjs/floating-point-hex-parser" "1.11.1" + "@webassemblyjs/helper-api-error" "1.11.1" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/helper-wasm-bytecode@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz#f328241e41e7b199d0b20c18e88429c4433295e1" + integrity sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q== + +"@webassemblyjs/helper-wasm-section@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz#21ee065a7b635f319e738f0dd73bfbda281c097a" + integrity sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + +"@webassemblyjs/ieee754@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz#963929e9bbd05709e7e12243a099180812992614" + integrity sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.1.tgz#ce814b45574e93d76bae1fb2644ab9cdd9527aa5" + integrity sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.1.tgz#d1f8b764369e7c6e6bae350e854dec9a59f0a3ff" + integrity sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ== + +"@webassemblyjs/wasm-edit@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz#ad206ebf4bf95a058ce9880a8c092c5dec8193d6" + integrity sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/helper-wasm-section" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + "@webassemblyjs/wasm-opt" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + "@webassemblyjs/wast-printer" "1.11.1" + +"@webassemblyjs/wasm-gen@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz#86c5ea304849759b7d88c47a32f4f039ae3c8f76" + integrity sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/ieee754" "1.11.1" + "@webassemblyjs/leb128" "1.11.1" + "@webassemblyjs/utf8" "1.11.1" + +"@webassemblyjs/wasm-opt@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz#657b4c2202f4cf3b345f8a4c6461c8c2418985f2" + integrity sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + +"@webassemblyjs/wasm-parser@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz#86ca734534f417e9bd3c67c7a1c75d8be41fb199" + integrity sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-api-error" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/ieee754" "1.11.1" + "@webassemblyjs/leb128" "1.11.1" + "@webassemblyjs/utf8" "1.11.1" + +"@webassemblyjs/wast-printer@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz#d0c73beda8eec5426f10ae8ef55cee5e7084c2f0" + integrity sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@xtuc/long" "4.2.2" + +"@webpack-cli/configtest@^1.1.1": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-1.2.0.tgz#7b20ce1c12533912c3b217ea68262365fa29a6f5" + integrity sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg== + +"@webpack-cli/info@^1.4.1": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-1.5.0.tgz#6c78c13c5874852d6e2dd17f08a41f3fe4c261b1" + integrity sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ== + dependencies: + envinfo "^7.7.3" + +"@webpack-cli/serve@^1.6.1": + version "1.7.0" + resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.7.0.tgz#e1993689ac42d2b16e9194376cfb6753f6254db1" + integrity sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q== + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + +abab@^2.0.5: + version "2.0.6" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" + integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== + +abort-controller@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" + integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== + dependencies: + event-target-shim "^5.0.0" + +accepts@~1.3.4: + 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== + dependencies: + mime-types "~2.1.34" + negotiator "0.6.3" + +acorn-import-assertions@^1.7.6: + version "1.8.0" + resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9" + integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw== + +acorn@^8.4.1, acorn@^8.5.0: + version "8.7.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.1.tgz#0197122c843d1bf6d0a5e83220a788f278f63c30" + integrity sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A== + +ajv-keywords@^3.5.2: + version "3.5.2" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" + integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== + +ajv@^6.12.5: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ansi-colors@4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" + integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +anymatch@~3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" + integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base64id@2.0.0, base64id@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/base64id/-/base64id-2.0.0.tgz#2770ac6bc47d312af97a8bf9a634342e0cd25cb6" + integrity sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog== + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +body-parser@^1.19.0: + version "1.20.0" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.0.tgz#3de69bd89011c11573d7bfee6a64f11b6bd27cc5" + integrity sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg== + dependencies: + bytes "3.1.2" + content-type "~1.0.4" + 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.10.3" + raw-body "2.5.1" + type-is "~1.6.18" + unpipe "1.0.0" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^3.0.2, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +browser-stdout@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" + integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== + +browserslist@^4.14.5: + version "4.20.4" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.20.4.tgz#98096c9042af689ee1e0271333dbc564b8ce4477" + integrity sha512-ok1d+1WpnU24XYN7oC3QWgTyMhY/avPJ/r9T00xxvUOIparA/gc+UPUMaod3i+G6s+nI2nUb9xZ5k794uIwShw== + dependencies: + caniuse-lite "^1.0.30001349" + electron-to-chromium "^1.4.147" + escalade "^3.1.1" + node-releases "^2.0.5" + picocolors "^1.0.0" + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +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@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +camelcase@^6.0.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +caniuse-lite@^1.0.30001349: + version "1.0.30001352" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001352.tgz#cc6f5da3f983979ad1e2cdbae0505dccaa7c6a12" + integrity sha512-GUgH8w6YergqPQDGWhJGt8GDRnY0L/iJVQcU3eJ46GYf52R8tk0Wxp0PymuFVZboJYXGiCqwozAYZNRjVj6IcA== + +chalk@^4.1.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chokidar@3.5.3, chokidar@^3.5.1: + version "3.5.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +chrome-trace-event@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" + integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== + +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + +clone-deep@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" + integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== + dependencies: + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@~1.1.4: + version "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.14: + version "2.0.17" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.17.tgz#5dd4c0d15e2984b7433cb4a9f2ead45063b80c47" + integrity sha512-hJo+3Bkn0NCHybn9Tu35fIeoOKGOk5OCC32y4Hz2It+qlCO2Q3DeQ1hRn/tDDMQKRYUEzqsl7jbF6dYKjlE60g== + +colors@1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" + integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== + +commander@^2.20.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commander@^7.0.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + +component-emitter@~1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +connect@^3.7.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/connect/-/connect-3.7.0.tgz#5d49348910caa5e07a01800b030d0c35f20484f8" + integrity sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ== + dependencies: + debug "2.6.9" + finalhandler "1.1.2" + parseurl "~1.3.3" + utils-merge "1.0.1" + +content-type@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + +cookie@~0.4.1: + version "0.4.2" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" + integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== + +cors@~2.8.5: + version "2.8.5" + resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" + integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== + dependencies: + object-assign "^4" + vary "^1" + +cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +custom-event@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/custom-event/-/custom-event-1.0.1.tgz#5d02a46850adf1b4a317946a3928fccb5bfd0425" + integrity sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg== + +date-format@^4.0.10: + version "4.0.11" + resolved "https://registry.yarnpkg.com/date-format/-/date-format-4.0.11.tgz#ae0d1e069d7f0687938fd06f98c12f3a6276e526" + integrity sha512-VS20KRyorrbMCQmpdl2hg5KaOUsda1RbnsJg461FfrcyCUg+pkd0b40BSW4niQyTheww4DBXQnS7HwSrKkipLw== + +debug@2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@4.3.3: + version "4.3.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" + integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== + dependencies: + ms "2.1.2" + +debug@^4.3.4, debug@~4.3.1, debug@~4.3.2: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +decamelize@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" + integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== + +depd@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + +di@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/di/-/di-0.0.1.tgz#806649326ceaa7caa3306d75d985ea2748ba913c" + integrity sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA== + +diff@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" + integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== + +dom-serialize@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/dom-serialize/-/dom-serialize-2.2.1.tgz#562ae8999f44be5ea3076f5419dcd59eb43ac95b" + integrity sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ== + dependencies: + custom-event "~1.0.0" + ent "~2.2.0" + extend "^3.0.0" + void-elements "^2.0.0" + +dukat@0.5.8-rc.4: + version "0.5.8-rc.4" + resolved "https://registry.yarnpkg.com/dukat/-/dukat-0.5.8-rc.4.tgz#90384dcb50b14c26f0e99dae92b2dea44f5fce21" + integrity sha512-ZnMt6DGBjlVgK2uQamXfd7uP/AxH7RqI0BL9GLrrJb2gKdDxvJChWy+M9AQEaL+7/6TmxzJxFOsRiInY9oGWTA== + dependencies: + google-protobuf "3.12.2" + typescript "3.9.5" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== + +electron-to-chromium@^1.4.147: + version "1.4.152" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.152.tgz#7dedbe8f3dc1c597088982a203f392e60f7ee90a" + integrity sha512-jk4Ju5SGZAQQJ1iI4Rgru7dDlvkQPLpNPWH9gIZmwCD4YteA5Bbk1xPcPDUf5jUYs3e1e80RXdi8XgKQZaigeg== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== + +engine.io-parser@~5.0.3: + version "5.0.4" + resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.0.4.tgz#0b13f704fa9271b3ec4f33112410d8f3f41d0fc0" + integrity sha512-+nVFp+5z1E3HcToEnO7ZIj3g+3k9389DvWtvJZz0T6/eOCPIyyxehFcedoYrZQrp0LgQbD9pPXhpMBKMd5QURg== + +engine.io@~6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-6.2.0.tgz#003bec48f6815926f2b1b17873e576acd54f41d0" + integrity sha512-4KzwW3F3bk+KlzSOY57fj/Jx6LyRQ1nbcyIadehl+AnXjKT7gDO0ORdRi/84ixvMKTym6ZKuxvbzN62HDDU1Lg== + dependencies: + "@types/cookie" "^0.4.1" + "@types/cors" "^2.8.12" + "@types/node" ">=10.0.0" + accepts "~1.3.4" + base64id "2.0.0" + cookie "~0.4.1" + cors "~2.8.5" + debug "~4.3.1" + engine.io-parser "~5.0.3" + ws "~8.2.3" + +enhanced-resolve@^5.8.3: + version "5.9.3" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz#44a342c012cbc473254af5cc6ae20ebd0aae5d88" + integrity sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + +ent@~2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/ent/-/ent-2.2.0.tgz#e964219325a21d05f44466a2f686ed6ce5f5dd1d" + integrity sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA== + +envinfo@^7.7.3: + version "7.8.1" + resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" + integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== + +es-module-lexer@^0.9.0: + version "0.9.3" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19" + integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ== + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + +escape-string-regexp@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eslint-scope@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +event-target-shim@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" + integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== + +eventemitter3@^4.0.0: + version "4.0.7" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + +events@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + +extend@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +fast-deep-equal@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fastest-levenshtein@^1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz#9990f7d3a88cc5a9ffd1f1745745251700d497e2" + integrity sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow== + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + 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" + integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.3" + statuses "~1.5.0" + unpipe "~1.0.0" + +find-up@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +find-up@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== + +flatted@^3.2.5: + version "3.2.5" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.5.tgz#76c8584f4fc843db64702a6bd04ab7a8bd666da3" + integrity sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg== + +follow-redirects@^1.0.0: + version "1.15.1" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.1.tgz#0ca6a452306c9b276e4d3127483e29575e207ad5" + integrity sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA== + +format-util@1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/format-util/-/format-util-1.0.5.tgz#1ffb450c8a03e7bccffe40643180918cc297d271" + integrity sha512-varLbTj0e0yVyRpqQhuWV+8hlePAgaoFRhNFj50BNjEIrw1/DphHSObtqwskVCPWNgzwPoQrZAbfa/SBiicNeg== + +fs-extra@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" + integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +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" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-intrinsic@^1.0.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.2.tgz#336975123e05ad0b7ba41f152ee4aadbea6cf598" + integrity sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.3" + +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-to-regexp@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" + integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== + +glob@7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" + integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^7.1.3, glob@^7.1.7: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +google-protobuf@3.12.2: + version "3.12.2" + resolved "https://registry.yarnpkg.com/google-protobuf/-/google-protobuf-3.12.2.tgz#50ce9f9b6281235724eb243d6a83e969a2176e53" + integrity sha512-4CZhpuRr1d6HjlyrxoXoocoGFnRYgKULgMtikMddA9ztRyYR59Aondv2FioyxWVamRo0rF2XpYawkTCBEQOSkA== + +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, graceful-fs@^4.2.9: + version "4.2.10" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" + integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== + +growl@1.10.5: + version "1.10.5" + resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" + integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +he@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + dependencies: + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" + +http-proxy@^1.18.1: + version "1.18.1" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" + integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== + dependencies: + eventemitter3 "^4.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +iconv-lite@^0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +import-local@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" + integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== + dependencies: + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +interpret@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" + integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw== + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-core-module@^2.8.1: + version "2.9.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.9.0.tgz#e1c34429cd51c6dd9e09e0799e396e27b19a9c69" + integrity sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A== + dependencies: + has "^1.0.3" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-plain-obj@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + +is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + +isbinaryfile@^4.0.8: + version "4.0.10" + resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-4.0.10.tgz#0c5b5e30c2557a2f06febd37b7322946aaee42b3" + integrity sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== + +jest-worker@^27.4.5: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" + integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +js-yaml@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +json-parse-better-errors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +karma-chrome-launcher@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/karma-chrome-launcher/-/karma-chrome-launcher-3.1.0.tgz#805a586799a4d05f4e54f72a204979f3f3066738" + integrity sha512-3dPs/n7vgz1rxxtynpzZTvb9y/GIaW8xjAwcIGttLbycqoFtI7yo1NGnQi6oFTherRE+GIhCAHZC4vEqWGhNvg== + dependencies: + which "^1.2.1" + +karma-mocha@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/karma-mocha/-/karma-mocha-2.0.1.tgz#4b0254a18dfee71bdbe6188d9a6861bf86b0cd7d" + integrity sha512-Tzd5HBjm8his2OA4bouAsATYEpZrp9vC7z5E5j4C5Of5Rrs1jY67RAwXNcVmd/Bnk1wgvQRou0zGVLey44G4tQ== + dependencies: + minimist "^1.2.3" + +karma-sourcemap-loader@0.3.8: + version "0.3.8" + resolved "https://registry.yarnpkg.com/karma-sourcemap-loader/-/karma-sourcemap-loader-0.3.8.tgz#d4bae72fb7a8397328a62b75013d2df937bdcf9c" + integrity sha512-zorxyAakYZuBcHRJE+vbrK2o2JXLFWK8VVjiT/6P+ltLBUGUvqTEkUiQ119MGdOrK7mrmxXHZF1/pfT6GgIZ6g== + dependencies: + graceful-fs "^4.1.2" + +karma-webpack@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/karma-webpack/-/karma-webpack-5.0.0.tgz#2a2c7b80163fe7ffd1010f83f5507f95ef39f840" + integrity sha512-+54i/cd3/piZuP3dr54+NcFeKOPnys5QeM1IY+0SPASwrtHsliXUiCL50iW+K9WWA7RvamC4macvvQ86l3KtaA== + dependencies: + glob "^7.1.3" + minimatch "^3.0.4" + webpack-merge "^4.1.5" + +karma@6.3.16: + version "6.3.16" + resolved "https://registry.yarnpkg.com/karma/-/karma-6.3.16.tgz#76d1a705fd1cf864ee5ed85270b572641e0958ef" + integrity sha512-nEU50jLvDe5yvXqkEJRf8IuvddUkOY2x5Xc4WXHz6dxINgGDrgD2uqQWeVrJs4hbfNaotn+HQ1LZJ4yOXrL7xQ== + dependencies: + body-parser "^1.19.0" + braces "^3.0.2" + chokidar "^3.5.1" + colors "1.4.0" + connect "^3.7.0" + di "^0.0.1" + dom-serialize "^2.2.1" + glob "^7.1.7" + graceful-fs "^4.2.6" + http-proxy "^1.18.1" + isbinaryfile "^4.0.8" + lodash "^4.17.21" + log4js "^6.4.1" + mime "^2.5.2" + minimatch "^3.0.4" + mkdirp "^0.5.5" + qjobs "^1.2.0" + range-parser "^1.2.1" + rimraf "^3.0.2" + socket.io "^4.2.0" + source-map "^0.6.1" + tmp "^0.2.1" + ua-parser-js "^0.7.30" + yargs "^16.1.1" + +kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +loader-runner@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" + integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash@^4.17.15, lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +log-symbols@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + +log4js@^6.4.1: + version "6.5.2" + resolved "https://registry.yarnpkg.com/log4js/-/log4js-6.5.2.tgz#9ae371e5b3cb3a3a209c24686e5547f8670834e5" + integrity sha512-DXtpNtt+KDOMT7RHUDIur/WsSA3rntlUh9Zg4XCdV42wUuMmbFkl38+LZ92Z5QvQA7mD5kAVkLiBSEH/tvUB8A== + dependencies: + date-format "^4.0.10" + debug "^4.3.4" + flatted "^3.2.5" + rfdc "^1.3.0" + streamroller "^3.1.1" + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +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-types@^2.1.27, 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" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime@^2.5.2: + version "2.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" + integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +minimatch@3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^3.0.4, minimatch@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.2.3, minimist@^1.2.6: + version "1.2.6" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" + integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== + +mkdirp@^0.5.5: + version "0.5.6" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== + dependencies: + minimist "^1.2.6" + +mocha@9.2.1: + version "9.2.1" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-9.2.1.tgz#a1abb675aa9a8490798503af57e8782a78f1338e" + integrity sha512-T7uscqjJVS46Pq1XDXyo9Uvey9gd3huT/DD9cYBb4K2Xc/vbKRPUWK067bxDQRK0yIz6Jxk73IrnimvASzBNAQ== + dependencies: + "@ungap/promise-all-settled" "1.1.2" + ansi-colors "4.1.1" + browser-stdout "1.3.1" + chokidar "3.5.3" + debug "4.3.3" + diff "5.0.0" + escape-string-regexp "4.0.0" + find-up "5.0.0" + glob "7.2.0" + growl "1.10.5" + he "1.2.0" + js-yaml "4.1.0" + log-symbols "4.1.0" + minimatch "3.0.4" + ms "2.1.3" + nanoid "3.2.0" + serialize-javascript "6.0.0" + strip-json-comments "3.1.1" + supports-color "8.1.1" + which "2.0.2" + workerpool "6.2.0" + yargs "16.2.0" + yargs-parser "20.2.4" + yargs-unparser "2.0.0" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +nanoid@3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.2.0.tgz#62667522da6673971cca916a6d3eff3f415ff80c" + integrity sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA== + +negotiator@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + +neo-async@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +node-fetch@2.6.7: + version "2.6.7" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" + integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== + dependencies: + whatwg-url "^5.0.0" + +node-releases@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.5.tgz#280ed5bc3eba0d96ce44897d8aee478bfb3d9666" + integrity sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q== + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +object-assign@^4: + version "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.9.0: + version "1.12.2" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" + integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== + +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww== + dependencies: + ee-first "1.1.1" + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +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== + +picomatch@^2.0.4, picomatch@^2.2.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +punycode@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +qjobs@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/qjobs/-/qjobs-1.2.0.tgz#c45e9c61800bd087ef88d7e256423bdd49e5d071" + integrity sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg== + +qs@6.10.3: + version "6.10.3" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.3.tgz#d6cde1b2ffca87b5aa57889816c5f81535e22e8e" + integrity sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ== + dependencies: + side-channel "^1.0.4" + +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +range-parser@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" + integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +rechoir@^0.7.0: + version "0.7.1" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.7.1.tgz#9478a96a1ca135b5e88fc027f03ee92d6c645686" + integrity sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg== + dependencies: + resolve "^1.9.0" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== + +resolve-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" + integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== + dependencies: + resolve-from "^5.0.0" + +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve@^1.9.0: + version "1.22.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198" + integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw== + dependencies: + is-core-module "^2.8.1" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +rfdc@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" + integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== + +rimraf@^3.0.0, rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +safe-buffer@^5.1.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== + +"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" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +schema-utils@^3.1.0, schema-utils@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281" + integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +serialize-javascript@6.0.0, serialize-javascript@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" + integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== + dependencies: + randombytes "^2.1.0" + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +shallow-clone@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" + integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== + dependencies: + kind-of "^6.0.2" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +signal-exit@^3.0.3: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +socket.io-adapter@~2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-2.4.0.tgz#b50a4a9ecdd00c34d4c8c808224daa1a786152a6" + integrity sha512-W4N+o69rkMEGVuk2D/cvca3uYsvGlMwsySWV447y99gUPghxq42BxqLNMndb+a1mm/5/7NeXVQS7RLa2XyXvYg== + +socket.io-parser@~4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.0.4.tgz#9ea21b0d61508d18196ef04a2c6b9ab630f4c2b0" + integrity sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g== + dependencies: + "@types/component-emitter" "^1.2.10" + component-emitter "~1.3.0" + debug "~4.3.1" + +socket.io@^4.2.0: + version "4.5.1" + resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-4.5.1.tgz#aa7e73f8a6ce20ee3c54b2446d321bbb6b1a9029" + integrity sha512-0y9pnIso5a9i+lJmsCdtmTTgJFFSvNQKDnPQRz28mGNnxbmqYg2QPtJTLFxhymFZhAIn50eHAKzJeiNaKr+yUQ== + dependencies: + accepts "~1.3.4" + base64id "~2.0.0" + debug "~4.3.2" + engine.io "~6.2.0" + socket.io-adapter "~2.4.0" + socket.io-parser "~4.0.4" + +source-map-js@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" + integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== + +source-map-loader@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/source-map-loader/-/source-map-loader-3.0.1.tgz#9ae5edc7c2d42570934be4c95d1ccc6352eba52d" + integrity sha512-Vp1UsfyPvgujKQzi4pyDiTOnE3E4H+yHvkVRN3c/9PJmQS4CQJExvcDvaX/D+RV+xQben9HJ56jMJS3CgUeWyA== + dependencies: + abab "^2.0.5" + iconv-lite "^0.6.3" + source-map-js "^1.0.1" + +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== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.6.0, source-map@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +statuses@~1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== + +streamroller@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/streamroller/-/streamroller-3.1.1.tgz#679aae10a4703acdf2740755307df0a05ad752e6" + integrity sha512-iPhtd9unZ6zKdWgMeYGfSBuqCngyJy1B/GPi/lTpwGpa3bajuX30GjUVd0/Tn/Xhg0mr4DOSENozz9Y06qyonQ== + dependencies: + date-format "^4.0.10" + debug "^4.3.4" + fs-extra "^10.1.0" + +string-width@^4.1.0, string-width@^4.2.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-json-comments@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +supports-color@8.1.1, supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +tapable@^2.1.1, tapable@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== + +terser-webpack-plugin@^5.1.3: + version "5.3.3" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.3.tgz#8033db876dd5875487213e87c627bca323e5ed90" + integrity sha512-Fx60G5HNYknNTNQnzQ1VePRuu89ZVYWfjRAeT5rITuCY/1b08s49e5kSQwHDirKZWuoKOBRFS98EUUoZ9kLEwQ== + dependencies: + "@jridgewell/trace-mapping" "^0.3.7" + jest-worker "^27.4.5" + schema-utils "^3.1.1" + serialize-javascript "^6.0.0" + terser "^5.7.2" + +terser@^5.7.2: + version "5.14.1" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.14.1.tgz#7c95eec36436cb11cf1902cc79ac564741d19eca" + integrity sha512-+ahUAE+iheqBTDxXhTisdA8hgvbEG1hHOQ9xmNjeUJSoi6DU/gMrKNcfZjHkyY6Alnuyc+ikYJaxxfHkT3+WuQ== + dependencies: + "@jridgewell/source-map" "^0.3.2" + acorn "^8.5.0" + commander "^2.20.0" + source-map-support "~0.5.20" + +tmp@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" + integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== + dependencies: + rimraf "^3.0.0" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + +type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +typescript@3.9.5: + version "3.9.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.5.tgz#586f0dba300cde8be52dd1ac4f7e1009c1b13f36" + integrity sha512-hSAifV3k+i6lEoCJ2k6R2Z/rp/H3+8sdmcn5NrS3/3kE7+RyZXm9aqvxWqjEXHAd8b0pShatpcdMTvEdvAJltQ== + +ua-parser-js@^0.7.30: + version "0.7.31" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.31.tgz#649a656b191dffab4f21d5e053e27ca17cbff5c6" + integrity sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ== + +universalify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" + integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== + +vary@^1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== + +void-elements@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec" + integrity sha1-wGavtYK7HLQSjWDqkjkulNXp2+w= + +watchpack@^2.3.1: + version "2.4.0" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" + integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== + dependencies: + glob-to-regexp "^0.4.1" + graceful-fs "^4.1.2" + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= + +webpack-cli@4.9.2: + version "4.9.2" + resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-4.9.2.tgz#77c1adaea020c3f9e2db8aad8ea78d235c83659d" + integrity sha512-m3/AACnBBzK/kMTcxWHcZFPrw/eQuY4Df1TxvIWfWM2x7mRqBQCqKEd96oCUa9jkapLBaFfRce33eGDb4Pr7YQ== + dependencies: + "@discoveryjs/json-ext" "^0.5.0" + "@webpack-cli/configtest" "^1.1.1" + "@webpack-cli/info" "^1.4.1" + "@webpack-cli/serve" "^1.6.1" + colorette "^2.0.14" + commander "^7.0.0" + execa "^5.0.0" + fastest-levenshtein "^1.0.12" + import-local "^3.0.2" + interpret "^2.2.0" + rechoir "^0.7.0" + webpack-merge "^5.7.3" + +webpack-merge@^4.1.5: + version "4.2.2" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-4.2.2.tgz#a27c52ea783d1398afd2087f547d7b9d2f43634d" + integrity sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g== + dependencies: + lodash "^4.17.15" + +webpack-merge@^5.7.3: + version "5.8.0" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.8.0.tgz#2b39dbf22af87776ad744c390223731d30a68f61" + integrity sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q== + dependencies: + clone-deep "^4.0.1" + wildcard "^2.0.0" + +webpack-sources@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" + integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== + +webpack@5.69.1: + version "5.69.1" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.69.1.tgz#8cfd92c192c6a52c99ab00529b5a0d33aa848dc5" + integrity sha512-+VyvOSJXZMT2V5vLzOnDuMz5GxEqLk7hKWQ56YxPW/PQRUuKimPqmEIJOx8jHYeyo65pKbapbW464mvsKbaj4A== + dependencies: + "@types/eslint-scope" "^3.7.3" + "@types/estree" "^0.0.51" + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/wasm-edit" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + acorn "^8.4.1" + acorn-import-assertions "^1.7.6" + browserslist "^4.14.5" + chrome-trace-event "^1.0.2" + enhanced-resolve "^5.8.3" + es-module-lexer "^0.9.0" + eslint-scope "5.1.1" + events "^3.2.0" + glob-to-regexp "^0.4.1" + graceful-fs "^4.2.9" + json-parse-better-errors "^1.0.2" + loader-runner "^4.2.0" + mime-types "^2.1.27" + neo-async "^2.6.2" + schema-utils "^3.1.0" + tapable "^2.1.1" + terser-webpack-plugin "^5.1.3" + watchpack "^2.3.1" + webpack-sources "^3.2.3" + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0= + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +which@2.0.2, which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +which@^1.2.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +wildcard@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec" + integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw== + +workerpool@6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.0.tgz#827d93c9ba23ee2019c3ffaff5c27fccea289e8b" + integrity sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A== + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +ws@8.5.0: + version "8.5.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.5.0.tgz#bfb4be96600757fe5382de12c670dab984a1ed4f" + integrity sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg== + +ws@~8.2.3: + version "8.2.3" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.2.3.tgz#63a56456db1b04367d0b721a0b80cae6d8becbba" + integrity sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yargs-parser@20.2.4: + version "20.2.4" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" + integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== + +yargs-parser@^20.2.2: + version "20.2.9" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + +yargs-unparser@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" + integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== + dependencies: + camelcase "^6.0.0" + decamelize "^4.0.0" + flat "^5.0.2" + is-plain-obj "^2.1.0" + +yargs@16.2.0, yargs@^16.1.1: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== diff --git a/library/klip-api/build.gradle.kts b/library/klip-api/build.gradle.kts index 5ed345d8..541de478 100644 --- a/library/klip-api/build.gradle.kts +++ b/library/klip-api/build.gradle.kts @@ -1,13 +1,6 @@ plugins { - id("plugin.library-mpp") - id("plugin.publishing-mpp") + id("convention.library-mpp") + id("convention.publishing-mpp") } description = "Kotlin multiplatform snapshot (klip) testing. API dependency." - -kotlin { - sourceSets { - val commonMain by getting { dependencies { api(project(":library:klip-core")) } } - all { languageSettings { optIn("kotlin.contracts.ExperimentalContracts") } } - } -} diff --git a/library/klip-core/src/commonMain/kotlin/int/KlipContext.kt b/library/klip-api/src/commonMain/kotlin/KlipContext.kt similarity index 74% rename from library/klip-core/src/commonMain/kotlin/int/KlipContext.kt rename to library/klip-api/src/commonMain/kotlin/KlipContext.kt index 9e94670c..b034f4a0 100644 --- a/library/klip-core/src/commonMain/kotlin/int/KlipContext.kt +++ b/library/klip-api/src/commonMain/kotlin/KlipContext.kt @@ -1,4 +1,4 @@ -package dev.petuska.klip.core.int +package dev.petuska.klip.api /** * A container to pass in compiler-plugin data @@ -6,9 +6,12 @@ package dev.petuska.klip.core.int * @param path file path to retrieve and save klip for the given context * @param key key to write the klip under in the file at [path] * @param update whether the klip should be overridden instead of asserted + * @param serverUrl to query for klips */ +@Suppress("OutdatedDocumentation") public data class KlipContext( val path: String, val key: String, val update: Boolean, + val serverUrl: String, ) diff --git a/library/klip-api/src/commonMain/kotlin/Klippable.kt b/library/klip-api/src/commonMain/kotlin/Klippable.kt new file mode 100644 index 00000000..59e4b7f5 --- /dev/null +++ b/library/klip-api/src/commonMain/kotlin/Klippable.kt @@ -0,0 +1,20 @@ +package dev.petuska.klip.api + +/** + * Annotation to mark functions to be picked up by the compiler plugin. + * If marked function contains optionally nullable [KlipContext] type argument, it will be injected by the compiler. + * Otherwise, an additional [KlipContext] parameter will be prepended at the very start of the call arguments list. + * + * ``` + * @Klippable + * fun klippable(..., _context: KlipContext? = null) + * ``` + * @see [KlipContext.validate] + * @see [KlipContext] + */ +@Retention(AnnotationRetention.BINARY) +@Target(AnnotationTarget.FUNCTION) +public annotation class Klippable + +public inline val KlippableStub: Nothing + get() = throw NotImplementedError("Invoked stubbed klip API. Did the compiler plugin run?") diff --git a/library/klip-api/src/commonMain/kotlin/assertKlip.kt b/library/klip-api/src/commonMain/kotlin/assertKlip.kt deleted file mode 100644 index 31d0658b..00000000 --- a/library/klip-api/src/commonMain/kotlin/assertKlip.kt +++ /dev/null @@ -1,37 +0,0 @@ -package dev.petuska.klip.api - -import dev.petuska.klip.core.Klippable -import dev.petuska.klip.core.int.KlipContext -import dev.petuska.klip.core.int.KlipManager -import dev.petuska.klip.core.int.KlipType -import dev.petuska.klip.core.validate -import kotlin.test.assertEquals - -@DslMarker -@Retention(AnnotationRetention.SOURCE) -internal annotation class KlipDsl - -/** - * Asserts that the given object matches its respective klip - * @param actual value to assert - * @param _context [KlipContext] injected by the compiler with details about the klip file - * @return [actual] - */ -@Klippable -@KlipDsl -public fun assertMatchesKlip(actual: T, _context: KlipContext? = null): T = actual.also { - _context.validate() - val actualStr = actual.toString() - val (klip) = KlipManager.klip(_context, mapOf("type" to "${KlipType.TEXT}")) { actualStr } - assertEquals(klip, actualStr, message = "Value does not match its klip") -} - -/** - * Asserts that the given object matches its respective klip - * @receiver actual value to assert - * @param _context [KlipContext] injected by the compiler with details about the klip file - * @return [this] - */ -@Klippable -@KlipDsl -public fun T.assertKlip(_context: KlipContext? = null): T = assertMatchesKlip(this, _context) diff --git a/library/klip-assertions/build.gradle.kts b/library/klip-assertions/build.gradle.kts new file mode 100644 index 00000000..c1e37987 --- /dev/null +++ b/library/klip-assertions/build.gradle.kts @@ -0,0 +1,23 @@ +import util.blockingMainDependencies + +plugins { + id("convention.library-mpp") + id("convention.publishing-mpp") +} + +description = "Kotlin multiplatform snapshot (klip) testing. Assertions dependency." + +kotlin { + sourceSets { + named("commonMain") { + dependencies { + api(project(":library:klip-api")) + implementation(kotlin("test")) + implementation(project(":library:klip-core")) + } + } + blockingMainDependencies { + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:_") + } + } +} diff --git a/library/klip-assertions/src/blockingMain/kotlin/assertKlipBlocking.kt b/library/klip-assertions/src/blockingMain/kotlin/assertKlipBlocking.kt new file mode 100644 index 00000000..4b8723d5 --- /dev/null +++ b/library/klip-assertions/src/blockingMain/kotlin/assertKlipBlocking.kt @@ -0,0 +1,39 @@ +package dev.petuska.klip.assertions + +import dev.petuska.klip.api.KlipContext +import dev.petuska.klip.api.Klippable +import dev.petuska.klip.api.KlippableStub +import dev.petuska.klip.core.KlipCompilerAPI +import kotlinx.coroutines.runBlocking + +/** + * Asserts that the given object matches its respective klip + * @param T + * @param actual value to assert + * @return [actual] + */ +@Klippable +@Suppress("UNUSED_PARAMETER") +public inline fun assertMatchesKlipBlocking(actual: T): T = KlippableStub + +@Klippable +@KlipCompilerAPI +public inline fun assertMatchesKlipBlocking(context: KlipContext, actual: T): T = actual.also { + runBlocking { + assertMatchesKlip(context, actual) + } +} + +/** + * Asserts that the given object matches its respective klip + * @param T + * @receiver actual value to assert + * @return [this] for chaining + */ +@Klippable +@Suppress("UnusedReceiverParameter") +public inline fun T.assertKlipBlocking(): T = KlippableStub + +@KlipCompilerAPI +public inline fun T.assertKlipBlocking(context: KlipContext): T = + assertMatchesKlipBlocking(context, this) diff --git a/library/klip-assertions/src/commonMain/kotlin/assertKlip.kt b/library/klip-assertions/src/commonMain/kotlin/assertKlip.kt new file mode 100644 index 00000000..b0b6bce8 --- /dev/null +++ b/library/klip-assertions/src/commonMain/kotlin/assertKlip.kt @@ -0,0 +1,38 @@ +package dev.petuska.klip.assertions + +import dev.petuska.klip.api.KlipContext +import dev.petuska.klip.api.Klippable +import dev.petuska.klip.api.KlippableStub +import dev.petuska.klip.core.KlipCompilerAPI +import dev.petuska.klip.core.domain.Klip +import dev.petuska.klip.core.syncKlip +import kotlin.test.assertEquals + +/** + * Asserts that the given object matches its respective klip + * @param T + * @param actual value to assert + * @return [actual] + */ +@Klippable +@Suppress("UNUSED_PARAMETER", "RedundantSuspendModifier") +public suspend inline fun assertMatchesKlip(actual: T): T = KlippableStub + +@KlipCompilerAPI +public suspend inline fun assertMatchesKlip(context: KlipContext, actual: T): T = actual.also { + val klip = context.syncKlip(Klip(data = actual)) + assertEquals(klip.data, actual, message = "Value does not match its klip") +} + +/** + * Asserts that the given object matches its respective klip + * @param T + * @receiver actual value to assert + * @return [this] for chaining + */ +@Klippable +@Suppress("UnusedReceiverParameter", "RedundantSuspendModifier") +public suspend inline fun T.assertKlip(): T = KlippableStub + +@KlipCompilerAPI +public suspend inline fun T.assertKlip(context: KlipContext): T = assertMatchesKlip(context, this) diff --git a/library/klip-assertions/src/main/AndroidManifest.xml b/library/klip-assertions/src/main/AndroidManifest.xml new file mode 100644 index 00000000..3a416ed1 --- /dev/null +++ b/library/klip-assertions/src/main/AndroidManifest.xml @@ -0,0 +1 @@ + diff --git a/library/klip-core/build.gradle.kts b/library/klip-core/build.gradle.kts index b9bddef6..2681622d 100644 --- a/library/klip-core/build.gradle.kts +++ b/library/klip-core/build.gradle.kts @@ -1,13 +1,30 @@ +import util.sharedMainDependencies + plugins { - id("plugin.library-mpp") - id("plugin.publishing-mpp") + kotlin("plugin.serialization") + id("convention.library-mpp") + id("convention.publishing-mpp") } description = "Kotlin multiplatform snapshot (klip) testing. Runtime dependency." kotlin { sourceSets { - val commonMain by getting { dependencies { api(kotlin("test")) } } - all { languageSettings { optIn("kotlin.contracts.ExperimentalContracts") } } + named("commonMain") { + dependencies { + api(project(":library:klip-api")) + } + } + sharedMainDependencies { + implementation("io.ktor:ktor-client-core:_") + implementation("io.ktor:ktor-serialization-kotlinx-json:_") + implementation("io.ktor:ktor-client-content-negotiation:_") + } + + configureEach { + languageSettings { + optIn("kotlin.contracts.ExperimentalContracts") + } + } } } diff --git a/library/klip-core/src/androidMain/kotlin/File.kt b/library/klip-core/src/androidMain/kotlin/File.kt deleted file mode 100644 index 6e26bf3b..00000000 --- a/library/klip-core/src/androidMain/kotlin/File.kt +++ /dev/null @@ -1,21 +0,0 @@ -package dev.petuska.klip.core.ext - -import kotlin.io.deleteRecursively as kDeleteRecursively -import kotlin.io.readText as kReadText -import kotlin.io.writeText as kWriteText - -actual typealias File = java.io.File - -actual fun File.writeText(text: String): Unit = kWriteText(text) -actual fun File.readText(): String = kReadText() -actual fun File.deleteRecursively(): Boolean = kDeleteRecursively() - -/** - * Native file separator for the platform (thanks a bunch, windows...) - */ -actual val File.separator: String get() = File.separator - -/** - * Native newline separator for the platform (thanks a bunch, windows...) - */ -actual val File.newline: String get() = System.lineSeparator() diff --git a/library/klip-core/src/commonMain/kotlin/KlipCompilerAPI.kt b/library/klip-core/src/commonMain/kotlin/KlipCompilerAPI.kt new file mode 100644 index 00000000..c2501c2e --- /dev/null +++ b/library/klip-core/src/commonMain/kotlin/KlipCompilerAPI.kt @@ -0,0 +1,10 @@ +package dev.petuska.klip.core + +@KlipCompilerAPI +@Retention(AnnotationRetention.BINARY) +@RequiresOptIn( + message = "This API is reserved for internal use by the compiler plugin. " + + "Look for a similar API without KlipContext parameter.", + level = RequiresOptIn.Level.ERROR +) +public annotation class KlipCompilerAPI diff --git a/library/klip-core/src/commonMain/kotlin/KlipManager.kt b/library/klip-core/src/commonMain/kotlin/KlipManager.kt new file mode 100644 index 00000000..1ae1dcc4 --- /dev/null +++ b/library/klip-core/src/commonMain/kotlin/KlipManager.kt @@ -0,0 +1,22 @@ +package dev.petuska.klip.core + +import dev.petuska.klip.api.KlipContext +import dev.petuska.klip.core.domain.Klip +import kotlin.reflect.KType + +internal expect object KlipManager { + suspend fun writeKlip(context: KlipContext, klip: Klip) + suspend fun readKlip(context: KlipContext, type: KType): Klip? +} + +public suspend fun KlipContext.syncKlip(actual: Klip): Klip { + return if (update) { + actual.also { + KlipManager.writeKlip(this, it) + } + } else { + KlipManager.readKlip(this, actual.type) ?: actual.also { + KlipManager.writeKlip(this, it) + } + } +} diff --git a/library/klip-core/src/commonMain/kotlin/Klippable.kt b/library/klip-core/src/commonMain/kotlin/Klippable.kt deleted file mode 100644 index 37bbfd40..00000000 --- a/library/klip-core/src/commonMain/kotlin/Klippable.kt +++ /dev/null @@ -1,28 +0,0 @@ -package dev.petuska.klip.core - -import dev.petuska.klip.core.int.KlipContext -import kotlin.contracts.contract - -/** - * Annotation to mark functions to be picked up by the compiler plugin. - * Function signature must contain optional nullable [KlipContext] argument as shown bellow: - * - * ``` - * @Klippable - * fun klippable(..., _context: KlipContext? = null) - * ``` - * @param _context [KlipContext] injected by the compiler with details about the klip file - * @see [KlipContext.validate] - */ -public annotation class Klippable - -/** - * Utility function to verify compiler-injected arguments - * @throws IllegalArgumentException if the validation fails - */ -public fun KlipContext?.validate() { - contract { - returns() implies (this@validate != null) - } - requireNotNull(this) { "KlipContext should not be null and set by the compiler plugin. Did compiler plugin run?" } -} diff --git a/library/klip-core/src/commonMain/kotlin/domain/Klip.kt b/library/klip-core/src/commonMain/kotlin/domain/Klip.kt new file mode 100644 index 00000000..e762a8e8 --- /dev/null +++ b/library/klip-core/src/commonMain/kotlin/domain/Klip.kt @@ -0,0 +1,21 @@ +package dev.petuska.klip.core.domain + +import kotlin.jvm.Transient +import kotlin.reflect.KType +import kotlin.reflect.typeOf + +public typealias Klips = Map> +public typealias MutableKlips = MutableMap> + +public data class Klip( + @Transient + val type: KType, + val data: @Serializable T, + val attributes: Map, +) + +@Suppress("FunctionNaming") +public inline fun Klip( + data: T, + attributes: Map = mapOf(), +): Klip = Klip(data = data, attributes = attributes, type = typeOf()) diff --git a/library/klip-core/src/commonMain/kotlin/domain/Serializable.kt b/library/klip-core/src/commonMain/kotlin/domain/Serializable.kt new file mode 100644 index 00000000..d2ac3ffb --- /dev/null +++ b/library/klip-core/src/commonMain/kotlin/domain/Serializable.kt @@ -0,0 +1,11 @@ +package dev.petuska.klip.core.domain + +@Target(AnnotationTarget.PROPERTY, AnnotationTarget.CLASS, AnnotationTarget.TYPE) +public expect annotation class Serializable() + +@Target(AnnotationTarget.PROPERTY, AnnotationTarget.TYPE) +@Retention(AnnotationRetention.BINARY) +public expect annotation class Contextual() + +@Target(AnnotationTarget.PROPERTY) +public expect annotation class Transient() diff --git a/library/klip-core/src/commonMain/kotlin/ext/File.kt b/library/klip-core/src/commonMain/kotlin/ext/File.kt deleted file mode 100644 index b607ad91..00000000 --- a/library/klip-core/src/commonMain/kotlin/ext/File.kt +++ /dev/null @@ -1,63 +0,0 @@ -package dev.petuska.klip.core.ext - -/** - * Multiplatform wrapper over java.io.File API - */ -public expect class File(path: String) { - /** - * Retrieves parent file - */ - public fun getParentFile(): File? - - /** - * Returns local path to this file - */ - public fun getPath(): String - - /** - * Returns absolute path to this file - */ - public fun getAbsolutePath(): String - - /** - * Recursively makes all directories up to this directory file - */ - public fun mkdirs(): Boolean - - /** - * Checks if the file exists - */ - public fun exists(): Boolean - - /** - * Checks if the file is directory - */ - public fun isDirectory(): Boolean - - override fun toString(): String -} - -/** - * Native file separator for the platform (thanks a bunch, windows...) - */ -public expect val File.separator: String - -/** - * Native newline separator for the platform (thanks a bunch, windows...) - */ -public expect val File.newline: String - -/** - * Writes text to file creating it if needed and fully overwriting any previous content - */ -public expect fun File.writeText(text: String) - -/** - * Reads this file as text - */ -public expect fun File.readText(): String - -/** - * Deletes this file and any subdirectories recursively - */ -public expect fun File.deleteRecursively(): Boolean diff --git a/library/klip-core/src/commonMain/kotlin/ext/cleanupPath.kt b/library/klip-core/src/commonMain/kotlin/ext/cleanupPath.kt deleted file mode 100644 index d5c32038..00000000 --- a/library/klip-core/src/commonMain/kotlin/ext/cleanupPath.kt +++ /dev/null @@ -1,3 +0,0 @@ -package dev.petuska.klip.core.ext - -internal fun File.cleanupPath(path: String): String = path.replace("/", separator).replace("\\", separator) diff --git a/library/klip-core/src/commonMain/kotlin/int/KlipManager.kt b/library/klip-core/src/commonMain/kotlin/int/KlipManager.kt deleted file mode 100644 index b9db84ad..00000000 --- a/library/klip-core/src/commonMain/kotlin/int/KlipManager.kt +++ /dev/null @@ -1,146 +0,0 @@ -package dev.petuska.klip.core.int - -import dev.petuska.klip.core.ext.File -import dev.petuska.klip.core.ext.readText -import dev.petuska.klip.core.ext.writeText -import kotlin.native.concurrent.ThreadLocal - -public typealias Klips = MutableMap - -public data class Klip( - val value: String, - val attributes: Map, -) - -/** - * A helper class to assist in reading and writing persisted klips - */ -@ThreadLocal -public object KlipManager { - private const val SEPARATOR = ":::::>>" - private const val SEPARATOR_ATTR = "=" - private const val SEPARATOR_ATTRS = ";" - private const val SEPARATOR_KEY = "$SEPARATOR\n" - private const val SEPARATOR_KLIPS = "\n$SEPARATOR" - private const val SEPARATOR_SOF = "$SEPARATOR KLIPS $SEPARATOR" - private const val SEPARATOR_EOF = "\n$SEPARATOR$SEPARATOR$SEPARATOR\n" - private val klipMatrix = mutableMapOf() - - private fun loadKlips(path: String): Klips = klipMatrix[path] ?: run { - val klips = read(path) - ?.replace("\r\n", "\n") - ?.removePrefix(SEPARATOR_SOF) - ?.removeSuffix(SEPARATOR_EOF) - ?.split(SEPARATOR_KLIPS) - ?.filter(String::isNotEmpty) - ?.associate { kl -> - val split = kl.split(SEPARATOR_KEY) - require(split.size == 2 && !split[0].startsWith("\n")) { - "Corrupted klip at $path:${split.getOrNull(0)?.substringBefore(SEPARATOR)}" - } - val (k, v) = split - val (attr, key) = k.split(SEPARATOR).let { if (it.size > 1) it[0] to it[1] else "" to it[0] } - val attributes = attr.takeIf(String::isNotBlank) - ?.split(SEPARATOR_ATTRS) - ?.associate { it.split(SEPARATOR_ATTR).let { (k, v) -> k to v } } - ?: mapOf() - key to Klip(v, attributes) - }?.toMutableMap() ?: mutableMapOf() - klips.also { - klipMatrix[path] = it - } - } - - private fun saveKlips(path: String, klips: Klips) { - klipMatrix[path]?.putAll(klips) ?: run { klipMatrix[path] = klips } - write(path) { - (klipMatrix[path] ?: mutableMapOf()).entries.joinToString( - separator = "", - prefix = SEPARATOR_SOF, - postfix = SEPARATOR_EOF - ) { (k, v) -> - stringifyKlip(k, v.attributes) { v.value } - } - } - } - - private fun write(path: String, source: () -> String): String { - return File(path).run { - getParentFile()?.mkdirs() - source().also { writeText(it) } - } - } - - private fun read(path: String): String? { - val file = File(path) - return if (file.exists()) { - file.readText() - } else { - null - } - } - - /** - * Converts a [key] and a klip provided by [source] to a writable form that's safe to append to klip file. - * @param key a key to identify the klip within the file - * @param attributes klip attributes - * @return klip-writable form of the value provided by [source] that's safe to append to klip file - */ - public fun stringifyKlip(key: String, attributes: Map, source: () -> String): String { - return SEPARATOR_KLIPS + - attributes.entries.joinToString { (k, v) -> "$k=$v" } + - SEPARATOR + - key + - SEPARATOR_KEY + - source() - } - - /** - * Writes and returns a klip provided by [source] to a klip file specified by [path] under given [key]. - * - * @param path file path to retrieve and save klip for the given context - * @param key key to write the klip under in the file at [path] - * @param attributes klip attributes - * @param source a provider for a string representation to persist - * @return value provided by [source] - */ - public fun writeKlip(path: String, key: String, attributes: Map, source: () -> String): Klip { - val klips = loadKlips(path) - return Klip(source(), attributes).also { saveKlips(path, (klips + mutableMapOf(key to it)).toMutableMap()) } - } - - /** - * Reads a klip from a klip file specified by [path] under given [key]. - * If such klip is not found, a value provided by [source] is persisted and returned instead. - * - * @param path file path to retrieve and save klip for the given context - * @param key key to read or write the klip under in the file at [path] - * @param attributes klip attributes - * @param source a provider for a string representation to persist - * @return read klip if it exists or persisted value that was provided by [source] otherwise - */ - public fun readKlip(path: String, key: String, attributes: Map, source: () -> String): Klip { - val klips = loadKlips(path) - val klip = klips[key] - return when { - klip != null -> klip - else -> writeKlip(path, key, attributes, source) - } - } - - /** - * Writes or returns klip depending on the working mode. - * @param context [KlipContext] containing metadata about the klip - * @param source a provider for a string representation to persist - * @param attributes klip attributes - * @return read klip if it exists and [KlipContext.update]` == false` - * or persisted value that was provided by [source] otherwise - */ - public fun klip(context: KlipContext, attributes: Map, source: () -> String): Klip = with(context) { - return if (update) { - writeKlip(path, key, attributes, source) - } else { - readKlip(path, key, attributes, source) - } - } -} diff --git a/library/klip-core/src/commonMain/kotlin/int/KlipType.kt b/library/klip-core/src/commonMain/kotlin/int/KlipType.kt deleted file mode 100644 index 3cfee149..00000000 --- a/library/klip-core/src/commonMain/kotlin/int/KlipType.kt +++ /dev/null @@ -1,5 +0,0 @@ -package dev.petuska.klip.core.int - -public enum class KlipType { - TEXT, JSON -} diff --git a/library/klip-core/src/commonTest/kotlin/ext/FileTest.kt b/library/klip-core/src/commonTest/kotlin/ext/FileTest.kt deleted file mode 100644 index 22073799..00000000 --- a/library/klip-core/src/commonTest/kotlin/ext/FileTest.kt +++ /dev/null @@ -1,60 +0,0 @@ -package dev.petuska.klip.core.ext - -import kotlin.test.BeforeTest -import kotlin.test.Test -import kotlin.test.assertEquals -import kotlin.test.assertFalse -import kotlin.test.assertTrue - -class FileTest { - private val testDir = File("build/test-dir/FileTest") - - @BeforeTest - fun cleanUp() { - testDir.deleteRecursively() - } - - @Test - fun deleteRecursively() { - val file = File(testDir.getPath()) - assertFalse(file.exists()) - file.mkdirs() - assertTrue(file.exists()) - require(file.deleteRecursively()) { "Error during recursive deletion" } - assertFalse(file.exists()) - } - - @Test - fun getParentFile() { - val file = File("$testDir/ok.kt") - assertEquals(testDir.getPath(), file.getParentFile()?.getPath()) - } - - @Test - fun getPath() { - val file = File("$testDir/ok.kt") - assertEquals("$testDir${testDir.separator}ok.kt", file.getPath()) - } - - @Test - fun getAbsolutePath() { - val file = File("$testDir/ok.kt") - file.mkdirs() - assertEquals("${file.getParentFile()?.getAbsolutePath()}${testDir.separator}ok.kt", file.getAbsolutePath()) - } - - @Test - fun mkdirs() { - val file = File("$testDir/subdir") - assertTrue(file.mkdirs()) - assertTrue(file.exists()) - } - - @Test - fun exists() { - val file = File(testDir.getPath()) - assertFalse(file.exists()) - file.mkdirs() - assertTrue(file.exists()) - } -} diff --git a/library/klip-core/src/fallbackMain/kotlin/File.kt b/library/klip-core/src/fallbackMain/kotlin/File.kt deleted file mode 100644 index 6697430a..00000000 --- a/library/klip-core/src/fallbackMain/kotlin/File.kt +++ /dev/null @@ -1,67 +0,0 @@ -package dev.petuska.klip.core.ext - -/** - * Multiplatform wrapper over java.io.File - */ -public actual class File actual constructor(private val path: String) { - init { - require(path.isNotEmpty()) { "Path cannot be empty" } - } - - /** - * Retrieves parent file - */ - public actual fun getParentFile(): File? = TODO() - - /** - * Returns local path to this file - */ - public actual fun getPath(): String = TODO() - - /** - * Returns absolute path to this file - */ - public actual fun getAbsolutePath(): String = TODO() - - /** - * Recursively makes all directories up to this directory file - */ - public actual fun mkdirs(): Boolean = TODO() - - /** - * Checks if the file exsists - */ - public actual fun exists(): Boolean = TODO() - - /** - * checks if the file is directory - */ - public actual fun isDirectory(): Boolean = TODO() - - actual override fun toString(): String = TODO() -} - -/** - * Writes text to file creating it if needed and fully overwriting any previous content - */ -public actual fun File.writeText(text: String): Unit = TODO() - -/** - * Reads this file as text - */ -public actual fun File.readText(): String = TODO() - -/** - * Deletes this file and any subdirectories recursively - */ -public actual fun File.deleteRecursively(): Boolean = TODO() - -/** - * Native file separator for the platform (thanks a bunch, windows...) - */ -public actual val File.separator: String get() = "/" - -/** - * Native newline separator for the platform (thanks a bunch, windows...) - */ -public actual val File.newline: String get() = "\n" diff --git a/library/klip-core/src/jsMain/kotlin/File.kt b/library/klip-core/src/jsMain/kotlin/File.kt deleted file mode 100644 index fb883ff2..00000000 --- a/library/klip-core/src/jsMain/kotlin/File.kt +++ /dev/null @@ -1,87 +0,0 @@ -package dev.petuska.klip.core.ext - -internal external fun require(module: String): dynamic - -private val jsPath = require("path") -private val fs = require("fs") - -/** - * Multiplatform wrapper over java.io.File API - */ -public actual class File actual constructor(path: String) { - private val path: String - - init { - this.path = cleanupPath(path) - } - - /** - * Returns absolute path to this file - */ - public actual fun getAbsolutePath(): String = jsPath.normalize(path) - - /** - * Returns local path to this file - */ - public actual fun getPath(): String = path - - /** - * Recursively makes all directories up to this directory file - */ - public actual fun mkdirs(): Boolean = kotlin.runCatching { - fs.mkdirSync(path, jsObject { recursive = true }) - }.isSuccess - - /** - * Retrieves parent file - */ - public actual fun getParentFile(): File? { - val p = jsPath.dirname(path) - return if (p != null && p != undefined) { - File(p) - } else null - } - - /** - * Checks if the file exsists - */ - public actual fun exists(): Boolean = fs.existsSync(path) - - /** - * checks if the file is directory - */ - public actual fun isDirectory(): Boolean = fs.lstatSync(path).isDirectory() - - actual override fun toString(): String = getPath() -} - -/** - * Writes text to file creating it if needed and fully overwriting any previous content - */ -public actual fun File.writeText(text: String): Unit = fs.writeFileSync(getAbsolutePath(), text, "utf8") - -/** - * Reads this file as text - */ -public actual fun File.readText(): String = fs.readFileSync(getAbsolutePath(), "utf8") - -/** - * Deletes this file and any subdirectories recursively - */ -public actual fun File.deleteRecursively(): Boolean = runCatching { - if (isDirectory()) { - fs.rmdirSync(getPath(), jsObject { recursive = true }) - } else { - fs.unlinkSync(getPath()) - } -}.isSuccess - -/** - * Native file separator for the platform (thanks a bunch, windows...) - */ -public actual val File.separator: String get() = jsPath.sep - -/** - * Native newline separator for the platform (thanks a bunch, windows...) - */ -public actual val File.newline: String get() = require("os").EOL diff --git a/library/klip-core/src/jsMain/kotlin/util.kt b/library/klip-core/src/jsMain/kotlin/util.kt deleted file mode 100644 index fb74f39d..00000000 --- a/library/klip-core/src/jsMain/kotlin/util.kt +++ /dev/null @@ -1,3 +0,0 @@ -package dev.petuska.klip.core.ext - -internal fun jsObject(builder: T.() -> Unit) = js("{}").unsafeCast().apply(builder) diff --git a/library/klip-core/src/jvmMain/kotlin/File.kt b/library/klip-core/src/jvmMain/kotlin/File.kt deleted file mode 100644 index 89c34942..00000000 --- a/library/klip-core/src/jvmMain/kotlin/File.kt +++ /dev/null @@ -1,21 +0,0 @@ -package dev.petuska.klip.core.ext - -import kotlin.io.deleteRecursively as kDeleteRecursively -import kotlin.io.readText as kReadText -import kotlin.io.writeText as kWriteText - -public actual typealias File = java.io.File - -public actual fun File.writeText(text: String): Unit = kWriteText(text) -public actual fun File.readText(): String = kReadText() -public actual fun File.deleteRecursively(): Boolean = kDeleteRecursively() - -/** - * Native file separator for the platform (thanks a bunch, windows...) - */ -public actual val File.separator: String get() = File.separator - -/** - * Native newline separator for the platform (thanks a bunch, windows...) - */ -public actual val File.newline: String get() = System.lineSeparator() diff --git a/library/klip-core/src/mingwMain/kotlin/File.kt b/library/klip-core/src/mingwMain/kotlin/File.kt deleted file mode 100644 index dec4e506..00000000 --- a/library/klip-core/src/mingwMain/kotlin/File.kt +++ /dev/null @@ -1,20 +0,0 @@ -package dev.petuska.klip.core.ext - -import platform.posix.mkdir - -/** - * Native file separator for the platform (thanks a bunch, windows...) - */ -public actual val File.separator: String get() = "\\" - -/** - * Native newline separator for the platform (thanks a bunch, windows...) - */ -public actual val File.newline: String get() = "\r\n" - -internal actual fun mppMkdir(path: String, permissions: Int): Int = mkdir(path) - -/** - * Checks if file path is starting from root (thanks a bunch, windows...) - */ -internal actual val File.isRooted: Boolean get() = getPath().matches("^[A-z]:\\$separator".toRegex()) diff --git a/library/klip-core/src/nativeMain/kotlin/File.kt b/library/klip-core/src/nativeMain/kotlin/File.kt deleted file mode 100644 index 3b9c6db1..00000000 --- a/library/klip-core/src/nativeMain/kotlin/File.kt +++ /dev/null @@ -1,187 +0,0 @@ -package dev.petuska.klip.core.ext - -import kotlinx.cinterop.ByteVar -import kotlinx.cinterop.alloc -import kotlinx.cinterop.allocArray -import kotlinx.cinterop.convert -import kotlinx.cinterop.memScoped -import kotlinx.cinterop.ptr -import kotlinx.cinterop.staticCFunction -import kotlinx.cinterop.toKString -import platform.posix.EOF -import platform.posix.FTW_DEPTH -import platform.posix.F_OK -import platform.posix.S_IFDIR -import platform.posix.S_IFMT -import platform.posix.S_IRWXU -import platform.posix.access -import platform.posix.fclose -import platform.posix.fgets -import platform.posix.fopen -import platform.posix.fputs -import platform.posix.getcwd -import platform.posix.nftw -import platform.posix.perror -import platform.posix.remove -import platform.posix.rmdir -import platform.posix.stat - -/** - * Multiplatform wrapper over java.io.File - */ -public actual class File actual constructor(path: String) { - private val _path: String - - init { - require(path.isNotEmpty()) { "Path cannot be empty" } - this._path = cleanupPath(path) - } - - /** - * Retrieves parent file - */ - public actual fun getParentFile(): File? { - val pPath = _path.removeSuffix(separator) - .let { it.removeSuffix(it.substringAfterLast(separator)) } - .removeSuffix(separator) - return if (pPath.isEmpty()) { - null - } else { - File(pPath) - } - } - - /** - * Returns local path to this file - */ - public actual fun getPath(): String = _path - - /** - * Returns absolute path to this file - */ - public actual fun getAbsolutePath(): String { - return if (isRooted) { - _path - } else { - memScoped { - "${getcwd(null, 0)!!.toKString()}$separator$_path" - } - } - } - - /** - * Recursively makes all directories up to this directory file - */ - public actual fun mkdirs(): Boolean { - val parent = getParentFile() - if (parent != null && !parent.exists() && parent._path != separator && parent._path.isNotEmpty()) { - parent.mkdirs() - } - - return mppMkdir(_path, S_IRWXU) == 0 - } - - /** - * Checks if the file exists - */ - public actual fun exists(): Boolean = access(_path, F_OK) == 0 - - /** - * checks if the file is directory - */ - public actual fun isDirectory(): Boolean = memScoped { - val stat = alloc() - if (stat(_path, stat.ptr) != 0) { - false - } else { - S_IFDIR == (stat.st_mode and S_IFMT.convert()).convert() - } - } - - actual override fun toString(): String = getPath() -} - -/** - * Writes text to file creating it if needed and fully overwriting any previous content - */ -public actual fun File.writeText(text: String) { - val file = fopen(getPath(), "w") ?: error("Cannot open output file ${getPath()}") - try { - memScoped { - if (fputs(text, file) == EOF) { - error("File write error") - } - } - } finally { - fclose(file) - } -} - -/** - * Reads this file as text - */ -public actual fun File.readText(): String { - val returnBuffer = StringBuilder() - val file = fopen(getPath(), "r") ?: error("Cannot open input file ${getPath()}") - - try { - memScoped { - val readBufferLength = 64 * 1024 - val buffer = allocArray(readBufferLength) - var line = fgets(buffer, readBufferLength, file)?.toKString() - while (line != null) { - returnBuffer.append(line) - line = fgets(buffer, readBufferLength, file)?.toKString() - } - } - } finally { - fclose(file) - } - - return returnBuffer.toString() -} - -/** - * Deletes this file and any subdirectories recursively - */ -public actual fun File.deleteRecursively(): Boolean { - return if (isDirectory()) { - nftw( - getPath(), - staticCFunction { fpath, _, _, _ -> - val spath = fpath?.toKString() - val isDir = memScoped { - val stat = alloc() - if (stat(spath, stat.ptr) != 0) { - false - } else { - S_IFDIR == (stat.st_mode and S_IFMT.convert()).convert() - } - } - if (isDir) { - rmdir(spath).also { - if (it != 0) { - perror("Directory removal error[$it]: $spath") - } - } - } else { - remove(spath).also { - if (it != 0) { - perror("File removal error[$it]: $spath") - } - } - } - }, - 64, FTW_DEPTH - ) - } else { - remove(getPath()) - } == 0 -} - -internal expect fun mppMkdir(path: String, permissions: Int): Int - -/** - * Checks if file path is starting from root (thanks a bunch, windows...) - */ -internal expect val File.isRooted: Boolean diff --git a/library/klip-core/src/sharedMain/kotlin/KlipManager.kt b/library/klip-core/src/sharedMain/kotlin/KlipManager.kt new file mode 100644 index 00000000..8aa93127 --- /dev/null +++ b/library/klip-core/src/sharedMain/kotlin/KlipManager.kt @@ -0,0 +1,86 @@ +package dev.petuska.klip.core + +import dev.petuska.klip.api.KlipContext +import dev.petuska.klip.core.domain.Klip +import io.ktor.client.HttpClient +import io.ktor.client.call.body +import io.ktor.client.plugins.contentnegotiation.ContentNegotiation +import io.ktor.client.plugins.expectSuccess +import io.ktor.client.request.get +import io.ktor.client.request.parameter +import io.ktor.client.request.post +import io.ktor.client.request.setBody +import io.ktor.http.ContentType +import io.ktor.http.HttpStatusCode +import io.ktor.http.contentType +import io.ktor.serialization.kotlinx.json.json +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.withContext +import kotlinx.serialization.json.Json +import kotlinx.serialization.json.JsonObject +import kotlinx.serialization.json.decodeFromJsonElement +import kotlinx.serialization.json.encodeToJsonElement +import kotlinx.serialization.serializer +import kotlin.reflect.KType + +internal actual object KlipManager { + private val client by lazy { + HttpClient { + install(ContentNegotiation) { + json() + } + } + } + + @OptIn(ExperimentalCoroutinesApi::class) + private val KlipDispatcher = Dispatchers.Default.limitedParallelism(1) + + actual suspend fun writeKlip( + context: KlipContext, + klip: Klip, + ) { + withContext(KlipDispatcher) { + val data = Json.encodeToJsonElement(Json.serializersModule.serializer(klip.type), klip.data) + val attributes = Json.encodeToJsonElement(klip.attributes) + client.post(context.serverUrl) { + expectSuccess = true + parameter("path", context.path) + parameter("key", context.key) + contentType(ContentType.Application.Json) + setBody( + JsonObject( + mapOf( + "data" to data, + "attributes" to attributes, + ) + ) + ) + } + } + } + + actual suspend fun readKlip( + context: KlipContext, + type: KType, + ): Klip? = withContext(KlipDispatcher) { + val response = client.get(context.serverUrl) { + parameter("path", context.path) + parameter("key", context.key) + } + + val kJson = when (response.status) { + HttpStatusCode.NotFound -> null + HttpStatusCode.OK -> response.body() + else -> error("Klip server error ${response.status}") + } + kJson?.let { + @Suppress("UNCHECKED_CAST") + Klip( + type = type, + data = Json.decodeFromJsonElement(Json.serializersModule.serializer(type), kJson["data"]!!), + attributes = Json.decodeFromJsonElement(kJson["attributes"]!!), + ) as Klip + } + } +} diff --git a/library/klip-core/src/sharedMain/kotlin/domain/Serializable.kt b/library/klip-core/src/sharedMain/kotlin/domain/Serializable.kt new file mode 100644 index 00000000..0b647838 --- /dev/null +++ b/library/klip-core/src/sharedMain/kotlin/domain/Serializable.kt @@ -0,0 +1,9 @@ +package dev.petuska.klip.core.domain + +import kotlinx.serialization.Contextual +import kotlinx.serialization.Serializable +import kotlinx.serialization.Transient + +public actual typealias Serializable = Serializable +public actual typealias Contextual = Contextual +public actual typealias Transient = Transient diff --git a/library/klip-core/src/stubMain/kotlin/KlipManager.kt b/library/klip-core/src/stubMain/kotlin/KlipManager.kt new file mode 100644 index 00000000..4fe30a79 --- /dev/null +++ b/library/klip-core/src/stubMain/kotlin/KlipManager.kt @@ -0,0 +1,10 @@ +package dev.petuska.klip.core + +import dev.petuska.klip.api.KlipContext +import dev.petuska.klip.core.domain.Klip +import kotlin.reflect.KType + +internal actual object KlipManager { + actual suspend fun writeKlip(context: KlipContext, klip: Klip): Unit = stub + actual suspend fun readKlip(context: KlipContext, type: KType): Klip? = stub +} diff --git a/library/klip-core/src/stubMain/kotlin/domain/Serializable.kt b/library/klip-core/src/stubMain/kotlin/domain/Serializable.kt new file mode 100644 index 00000000..586aa05b --- /dev/null +++ b/library/klip-core/src/stubMain/kotlin/domain/Serializable.kt @@ -0,0 +1,11 @@ +package dev.petuska.klip.core.domain + +@Target(AnnotationTarget.PROPERTY, AnnotationTarget.CLASS, AnnotationTarget.TYPE) +public actual annotation class Serializable + +@Target(AnnotationTarget.PROPERTY, AnnotationTarget.TYPE) +@Retention(AnnotationRetention.BINARY) +public actual annotation class Contextual + +@Target(AnnotationTarget.PROPERTY) +public actual annotation class Transient diff --git a/library/klip-core/src/stubMain/kotlin/stub.kt b/library/klip-core/src/stubMain/kotlin/stub.kt new file mode 100644 index 00000000..3477df6b --- /dev/null +++ b/library/klip-core/src/stubMain/kotlin/stub.kt @@ -0,0 +1,6 @@ +package dev.petuska.klip.core + +public inline val stub: Nothing + get() = throw NotImplementedError( + "This API is stubbed on the current target and should never be reachable from tests" + ) diff --git a/library/klip-core/src/unixMain/kotlin/File.kt b/library/klip-core/src/unixMain/kotlin/File.kt deleted file mode 100644 index b4ba03b0..00000000 --- a/library/klip-core/src/unixMain/kotlin/File.kt +++ /dev/null @@ -1,21 +0,0 @@ -package dev.petuska.klip.core.ext - -import kotlinx.cinterop.convert -import platform.posix.mkdir - -/** - * Native file separator for the platform (thanks a bunch, windows...) - */ -public actual val File.separator: String get() = "/" - -/** - * Native newline separator for the platform (thanks a bunch, windows...) - */ -public actual val File.newline: String get() = "\n" - -/** - * Checks if file path is starting from root (thanks a bunch, windows...) - */ -internal actual val File.isRooted: Boolean get() = getPath().startsWith("/") - -internal actual fun mppMkdir(path: String, permissions: Int): Int = mkdir(path, permissions.convert()) diff --git a/library/klip-runner/build.gradle.kts b/library/klip-runner/build.gradle.kts new file mode 100644 index 00000000..7ad299bf --- /dev/null +++ b/library/klip-runner/build.gradle.kts @@ -0,0 +1,26 @@ +import util.sharedMainDependencies + +plugins { + id("convention.library-mpp") + id("convention.publishing-mpp") +} + +description = "Kotlin multiplatform snapshot (klip) testing. Common test runner." + +kotlin { + sourceSets { + sharedMainDependencies { + api("org.jetbrains.kotlinx:kotlinx-coroutines-test:_") + } + named("stubMain") { + dependencies { + implementation(project(":library:klip-core")) + } + } + all { + languageSettings { + optIn("kotlinx.coroutines.ExperimentalCoroutinesApi") + } + } + } +} diff --git a/library/klip-runner/src/androidMain/kotlin/runTest.kt b/library/klip-runner/src/androidMain/kotlin/runTest.kt new file mode 100644 index 00000000..6b9f14cd --- /dev/null +++ b/library/klip-runner/src/androidMain/kotlin/runTest.kt @@ -0,0 +1,41 @@ +@file:Suppress("NOTHING_TO_INLINE") + +package dev.petuska.klip.runner + +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.test.TestScope +import kotlinx.coroutines.test.runTest +import kotlin.coroutines.CoroutineContext + +/** + * @see [kotlinx.coroutines.test.TestResult] + */ +@ExperimentalCoroutinesApi +@Suppress("ACTUAL_WITHOUT_EXPECT") +public actual typealias TestResult = Unit + +/** + * @see [kotlinx.coroutines.test.runTest] + */ +@ExperimentalCoroutinesApi +public actual inline fun runTest( + context: CoroutineContext, + dispatchTimeoutMs: Long, + noinline testBody: suspend TestScope.() -> Unit +): TestResult = runTest( + context = context, + dispatchTimeoutMs = dispatchTimeoutMs, + testBody = testBody +) + +/** + * @see [kotlinx.coroutines.test.runTest] + */ +@ExperimentalCoroutinesApi +public actual inline fun TestScope.runTest( + dispatchTimeoutMs: Long, + noinline testBody: suspend TestScope.() -> Unit +): TestResult = runTest( + dispatchTimeoutMs = dispatchTimeoutMs, + testBody = testBody +) diff --git a/library/klip-runner/src/commonMain/kotlin/runTest.kt b/library/klip-runner/src/commonMain/kotlin/runTest.kt new file mode 100644 index 00000000..6401cbb3 --- /dev/null +++ b/library/klip-runner/src/commonMain/kotlin/runTest.kt @@ -0,0 +1,32 @@ +package dev.petuska.klip.runner + +import kotlin.coroutines.CoroutineContext +import kotlin.coroutines.EmptyCoroutineContext + +/** + * @see [kotlinx.coroutines.test.TestScope] + */ +public expect sealed interface TestScope + +/** + * @see [kotlinx.coroutines.test.TestResult] + */ +@Suppress("NO_ACTUAL_FOR_EXPECT") +public expect class TestResult + +/** + * @see [kotlinx.coroutines.test.runTest] + */ +public expect inline fun runTest( + context: CoroutineContext = EmptyCoroutineContext, + dispatchTimeoutMs: Long = 60_000L, + noinline testBody: suspend TestScope.() -> Unit +): TestResult + +/** + * @see [kotlinx.coroutines.test.runTest] + */ +public expect inline fun TestScope.runTest( + dispatchTimeoutMs: Long = 60_000L, + noinline testBody: suspend TestScope.() -> Unit +): TestResult diff --git a/library/klip-runner/src/jsMain/kotlin/runTest.kt b/library/klip-runner/src/jsMain/kotlin/runTest.kt new file mode 100644 index 00000000..52ce3032 --- /dev/null +++ b/library/klip-runner/src/jsMain/kotlin/runTest.kt @@ -0,0 +1,42 @@ +@file:Suppress("NOTHING_TO_INLINE") + +package dev.petuska.klip.runner + +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.test.TestScope +import kotlinx.coroutines.test.runTest +import kotlin.coroutines.CoroutineContext +import kotlin.js.Promise + +/** + * @see [kotlinx.coroutines.test.TestResult] + */ +@ExperimentalCoroutinesApi +@Suppress("ACTUAL_WITHOUT_EXPECT", "ACTUAL_TYPE_ALIAS_TO_CLASS_WITH_DECLARATION_SITE_VARIANCE") +public actual typealias TestResult = Promise + +/** + * @see [kotlinx.coroutines.test.runTest] + */ +@ExperimentalCoroutinesApi +public actual inline fun runTest( + context: CoroutineContext, + dispatchTimeoutMs: Long, + noinline testBody: suspend TestScope.() -> Unit +): TestResult = runTest( + context = context, + dispatchTimeoutMs = dispatchTimeoutMs, + testBody = testBody +) + +/** + * @see [kotlinx.coroutines.test.runTest] + */ +@ExperimentalCoroutinesApi +public actual inline fun TestScope.runTest( + dispatchTimeoutMs: Long, + noinline testBody: suspend TestScope.() -> Unit +): TestResult = runTest( + dispatchTimeoutMs = dispatchTimeoutMs, + testBody = testBody +) diff --git a/library/klip-runner/src/jvmMain/kotlin/runTest.kt b/library/klip-runner/src/jvmMain/kotlin/runTest.kt new file mode 100644 index 00000000..6b9f14cd --- /dev/null +++ b/library/klip-runner/src/jvmMain/kotlin/runTest.kt @@ -0,0 +1,41 @@ +@file:Suppress("NOTHING_TO_INLINE") + +package dev.petuska.klip.runner + +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.test.TestScope +import kotlinx.coroutines.test.runTest +import kotlin.coroutines.CoroutineContext + +/** + * @see [kotlinx.coroutines.test.TestResult] + */ +@ExperimentalCoroutinesApi +@Suppress("ACTUAL_WITHOUT_EXPECT") +public actual typealias TestResult = Unit + +/** + * @see [kotlinx.coroutines.test.runTest] + */ +@ExperimentalCoroutinesApi +public actual inline fun runTest( + context: CoroutineContext, + dispatchTimeoutMs: Long, + noinline testBody: suspend TestScope.() -> Unit +): TestResult = runTest( + context = context, + dispatchTimeoutMs = dispatchTimeoutMs, + testBody = testBody +) + +/** + * @see [kotlinx.coroutines.test.runTest] + */ +@ExperimentalCoroutinesApi +public actual inline fun TestScope.runTest( + dispatchTimeoutMs: Long, + noinline testBody: suspend TestScope.() -> Unit +): TestResult = runTest( + dispatchTimeoutMs = dispatchTimeoutMs, + testBody = testBody +) diff --git a/library/klip-runner/src/main/AndroidManifest.xml b/library/klip-runner/src/main/AndroidManifest.xml new file mode 100644 index 00000000..20c827a9 --- /dev/null +++ b/library/klip-runner/src/main/AndroidManifest.xml @@ -0,0 +1 @@ + diff --git a/library/klip-runner/src/nativeMain/kotlin/runTest.kt b/library/klip-runner/src/nativeMain/kotlin/runTest.kt new file mode 100644 index 00000000..6b9f14cd --- /dev/null +++ b/library/klip-runner/src/nativeMain/kotlin/runTest.kt @@ -0,0 +1,41 @@ +@file:Suppress("NOTHING_TO_INLINE") + +package dev.petuska.klip.runner + +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.test.TestScope +import kotlinx.coroutines.test.runTest +import kotlin.coroutines.CoroutineContext + +/** + * @see [kotlinx.coroutines.test.TestResult] + */ +@ExperimentalCoroutinesApi +@Suppress("ACTUAL_WITHOUT_EXPECT") +public actual typealias TestResult = Unit + +/** + * @see [kotlinx.coroutines.test.runTest] + */ +@ExperimentalCoroutinesApi +public actual inline fun runTest( + context: CoroutineContext, + dispatchTimeoutMs: Long, + noinline testBody: suspend TestScope.() -> Unit +): TestResult = runTest( + context = context, + dispatchTimeoutMs = dispatchTimeoutMs, + testBody = testBody +) + +/** + * @see [kotlinx.coroutines.test.runTest] + */ +@ExperimentalCoroutinesApi +public actual inline fun TestScope.runTest( + dispatchTimeoutMs: Long, + noinline testBody: suspend TestScope.() -> Unit +): TestResult = runTest( + dispatchTimeoutMs = dispatchTimeoutMs, + testBody = testBody +) diff --git a/library/klip-runner/src/sharedMain/kotlin/TestScope.kt b/library/klip-runner/src/sharedMain/kotlin/TestScope.kt new file mode 100644 index 00000000..ec6942ae --- /dev/null +++ b/library/klip-runner/src/sharedMain/kotlin/TestScope.kt @@ -0,0 +1,10 @@ +package dev.petuska.klip.runner + +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.test.TestScope + +/** + * @see [kotlinx.coroutines.test.TestScope] + */ +@ExperimentalCoroutinesApi +public actual typealias TestScope = TestScope diff --git a/library/klip-runner/src/stubMain/kotlin/runTest.kt b/library/klip-runner/src/stubMain/kotlin/runTest.kt new file mode 100644 index 00000000..512efb0e --- /dev/null +++ b/library/klip-runner/src/stubMain/kotlin/runTest.kt @@ -0,0 +1,31 @@ +package dev.petuska.klip.runner + +import dev.petuska.klip.core.stub +import kotlin.coroutines.CoroutineContext + +/** + * @see [kotlinx.coroutines.test.TestScope] + */ +public actual sealed interface TestScope + +/** + * @see [kotlinx.coroutines.test.TestResult] + */ +public actual class TestResult private constructor() + +/** + * @see [kotlinx.coroutines.test.runTest] + */ +public actual inline fun runTest( + context: CoroutineContext, + dispatchTimeoutMs: Long, + noinline testBody: suspend TestScope.() -> Unit +): TestResult = stub + +/** + * @see [kotlinx.coroutines.test.runTest] + */ +public actual inline fun TestScope.runTest( + dispatchTimeoutMs: Long, + noinline testBody: suspend TestScope.() -> Unit +): TestResult = stub diff --git a/plugin/klip-gradle-plugin/build.gradle.kts b/plugin/klip-gradle-plugin/build.gradle.kts index 702c782e..93286ed1 100644 --- a/plugin/klip-gradle-plugin/build.gradle.kts +++ b/plugin/klip-gradle-plugin/build.gradle.kts @@ -1,15 +1,12 @@ plugins { id("com.gradle.plugin-publish") `java-gradle-plugin` - id("plugin.publishing-jvm") - id("plugin.build-config-jvm") - kotlin("kapt") + id("convention.publishing-jvm") + id("convention.build-konfig") } description = """Gradle plugin to manage KLIP snapshots, processors and dependencies""" -java { withSourcesJar() } - gradlePlugin { plugins { create(name) { @@ -29,7 +26,16 @@ pluginBundle { kotlin { sourceSets { - main { dependencies { compileOnly(kotlin("gradle-plugin-api")) } } + main { + dependencies { + compileOnly(kotlin("gradle-plugin-api")) + api("dev.petuska:container-tasks-gradle-plugin:_") + implementation("io.ktor:ktor-server-cio:_") + implementation("io.ktor:ktor-server-cors:_") + implementation("io.ktor:ktor-server-content-negotiation:_") + implementation("io.ktor:ktor-serialization-kotlinx-json:_") + } + } test { dependencies { @@ -39,3 +45,7 @@ kotlin { } } } + +java { + withSourcesJar() +} diff --git a/plugin/klip-gradle-plugin/src/main/kotlin/KlipExtension.kt b/plugin/klip-gradle-plugin/src/main/kotlin/KlipExtension.kt index f34e4736..1958e491 100644 --- a/plugin/klip-gradle-plugin/src/main/kotlin/KlipExtension.kt +++ b/plugin/klip-gradle-plugin/src/main/kotlin/KlipExtension.kt @@ -1,35 +1,33 @@ package dev.petuska.klip.plugin -import dev.petuska.klip.plugin.delegate.propertyDelegate -import dev.petuska.klip.plugin.util.KlipOption import org.gradle.api.Project +import org.gradle.api.provider.Property +import org.gradle.api.provider.SetProperty /** Gradle extension to manage klip plugin properties */ -open class KlipExtension(project: Project) { +@Suppress("unused") +abstract class KlipExtension { + abstract val debug: Property + /** Whether plugin is enabled */ - var enabled: Boolean by - project.propertyDelegate(default = KlipOption.Enabled.default) { it.toBoolean() } + abstract val enabled: Property /** Whether the klips should be updated */ - var update: Boolean by - project.propertyDelegate(default = KlipOption.Update.default) { it.toBoolean() } + abstract val update: Property /** * Fully qualified annotation names to register for compiler processing and path injection. * Setting this property gives you full control over the annotations and overrides the default * ones. */ - var klipAnnotations: Collection by - project.propertyDelegate(default = KlipOption.KlipAnnotation.default) { - it.split(",").toSet() - } + abstract val klipAnnotations: SetProperty /** * Register an annotation for compiler processing and path injection * @param fqName fully qualified annotation name to register */ fun klipAnnotation(fqName: String) { - klipAnnotations += fqName + klipAnnotations.add(fqName) } /** @@ -37,17 +35,14 @@ open class KlipExtension(project: Project) { * processing Setting this property gives you full control over the annotations and overrides the * default ones. */ - var scopeAnnotations: Collection by - project.propertyDelegate(default = KlipOption.ScopeAnnotation.default) { - it.split(",").toSet() - } + abstract val scopeAnnotations: SetProperty /** * Register an annotation for function scopes for compiler klip detection and processing * @param fqName fully qualified annotation name to register */ fun scopeAnnotation(fqName: String) { - scopeAnnotations += fqName + scopeAnnotations.add(fqName) } /** @@ -55,15 +50,14 @@ open class KlipExtension(project: Project) { * processing Setting this property gives you full control over the functions and overrides the * default ones. */ - var scopeFunctions: Collection by - project.propertyDelegate(default = KlipOption.ScopeFunction.default) { it.split(",").toSet() } + abstract val scopeFunctions: SetProperty /** * Register a function for function scopes for compiler klip detection and processing * @param fqName fully qualified function name to register */ fun scopeFunction(fqName: String) { - scopeFunctions += fqName + scopeFunctions.add(fqName) } companion object { @@ -72,17 +66,27 @@ open class KlipExtension(project: Project) { } } +/** Gradle extension to manage klip plugin properties applied to root project */ +abstract class KlipRootExtension : KlipExtension() { + abstract val port: Property +} + /** * Klip plugin extension * @throws IllegalStateException if the plugin did not register an extension yet */ -val Project.klip: KlipExtension - get() = - extensions.findByType(KlipExtension::class.java) - ?: throw IllegalStateException("${KlipExtension.NAME} is not of the correct type") +internal inline val Project.klip: KlipExtension + get() = extensions.getByType(KlipExtension::class.java) + +/** + * Root klip plugin extension + * @throws IllegalStateException if the plugin did not register an extension yet + */ +internal inline val Project.rootKlip: KlipRootExtension + get() = rootProject.extensions.getByType(KlipRootExtension::class.java) /** * Configure klip plugin extension * @throws IllegalStateException if the plugin did not register an extension yet */ -internal fun Project.klip(config: KlipExtension.() -> Unit): KlipExtension = klip.apply(config) +internal inline fun Project.klip(config: KlipExtension.() -> Unit): KlipExtension = klip.apply(config) diff --git a/plugin/klip-gradle-plugin/src/main/kotlin/KlipPlugin.kt b/plugin/klip-gradle-plugin/src/main/kotlin/KlipPlugin.kt index 51fe8ef1..66046850 100644 --- a/plugin/klip-gradle-plugin/src/main/kotlin/KlipPlugin.kt +++ b/plugin/klip-gradle-plugin/src/main/kotlin/KlipPlugin.kt @@ -1,15 +1,15 @@ package dev.petuska.klip.plugin import dev.petuska.klip.plugin.config.GROUP -import dev.petuska.klip.plugin.config.KOTLIN_NATIVE_PLUGIN_ARTEFACT_ID -import dev.petuska.klip.plugin.config.KOTLIN_PLUGIN_ARTEFACT_ID -import dev.petuska.klip.plugin.config.KOTLIN_PLUGIN_ID +import dev.petuska.klip.plugin.config.NAME import dev.petuska.klip.plugin.config.VERSION -import dev.petuska.klip.plugin.task.KlipUpdateTask +import dev.petuska.klip.plugin.server.KlipServerService +import dev.petuska.klip.plugin.task.KlipServerStartTask import dev.petuska.klip.plugin.util.KlipOption +import dev.petuska.klip.plugin.util.sysOrGradleOrEnvConvention import org.gradle.api.Project import org.gradle.api.provider.Provider -import org.gradle.api.tasks.testing.Test +import org.gradle.api.tasks.testing.AbstractTestTask import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation import org.jetbrains.kotlin.gradle.plugin.KotlinCompilerPluginSupportPlugin import org.jetbrains.kotlin.gradle.plugin.SubpluginArtifact @@ -20,60 +20,111 @@ class KlipPlugin : KotlinCompilerPluginSupportPlugin { override fun apply(target: Project) { with(target) { val extension = createExtension() - tasks.register("klipUpdate", KlipUpdateTask::class.java) - tasks.withType(Test::class.java) { - it.inputs.property("klip.enabled", "${extension.enabled}") - it.inputs.property("klip.update", "${extension.update}") - it.environment("KLIP_UPDATE", "${extension.update}") + val server = project.gradle.sharedServices.registerIfAbsent(KlipExtension.NAME, KlipServerService::class.java) { + it.parameters.port.set(rootKlip.port) + it.parameters.rootDir.set(rootProject.layout.projectDirectory) + } + val startServer = rootProject.tasks.maybeCreate("startKlipServer", KlipServerStartTask::class.java).also { + it.usesService(server) + it.service.set(server) + } + tasks.withType(AbstractTestTask::class.java) { + it.dependsOn(startServer) + it.usesService(server) + it.inputs.property("klip.enabled", extension.enabled) + it.inputs.property("klip.update", extension.update) + it.inputs.property("klip.debug", extension.debug) + } + configurations.all { + it.resolutionStrategy.eachDependency { dep -> + if (dep.requested.group == GROUP && dep.requested.name.startsWith(NAME)) { + dep.useVersion(VERSION) + } + } } } } - private fun Project.createExtension() = - extensions.findByType(KlipExtension::class.java) - ?: extensions.create(KlipExtension.NAME, KlipExtension::class.java, this@createExtension) + private fun Project.createExtension(): KlipExtension { + val commonConfig: KlipExtension.() -> Unit = { + klipAnnotations.addAll(KlipOption.KlipAnnotation.default) + scopeAnnotations.addAll(KlipOption.ScopeAnnotation.default) + scopeFunctions.addAll(KlipOption.ScopeFunction.default) + debug.sysOrGradleOrEnvConvention( + project = project, + propName = "klip.debug", + envName = "KLIP_DEBUG", + default = { KlipOption.Debug.default }, + converter = { !"false".equals(it, true) }, + ) + enabled.sysOrGradleOrEnvConvention( + project = project, + propName = "klip.enabled", + envName = "KLIP_ENABLED", + default = { KlipOption.Enabled.default }, + converter = { !"false".equals(it, true) }, + ) + update.sysOrGradleOrEnvConvention( + project = project, + propName = "klip.update", + envName = "KLIP_UPDATE", + default = { KlipOption.Update.default }, + converter = { !"false".equals(it, true) }, + ) + } + rootProject.extensions.findByType(KlipRootExtension::class.java) + ?: rootProject.extensions.create(KlipExtension.NAME, KlipRootExtension::class.java).apply { + port.sysOrGradleOrEnvConvention( + project = project, + propName = "klip.port", + envName = "KLIP_PORT", + default = { 6969 }, + converter = String::toInt, + ) + commonConfig() + } + return extensions.findByType(KlipExtension::class.java) ?: extensions.create( + KlipExtension.NAME, + KlipExtension::class.java + ).apply(commonConfig) + } - override fun isApplicable(kotlinCompilation: KotlinCompilation<*>): Boolean = - kotlinCompilation.target.project.plugins.hasPlugin(KlipPlugin::class.java) + override fun isApplicable(kotlinCompilation: KotlinCompilation<*>): Boolean = true - override fun getCompilerPluginId(): String = KOTLIN_PLUGIN_ID + override fun getCompilerPluginId(): String = "$GROUP.$NAME-kotlin-plugin" - override fun getPluginArtifact(): SubpluginArtifact = - SubpluginArtifact( - groupId = GROUP, - artifactId = KOTLIN_PLUGIN_ARTEFACT_ID, - version = VERSION, - ) + override fun getPluginArtifact(): SubpluginArtifact = SubpluginArtifact( + groupId = GROUP, + artifactId = "$NAME-kotlin-plugin", + version = VERSION, + ) - override fun getPluginArtifactForNative(): SubpluginArtifact = - SubpluginArtifact( - groupId = GROUP, - artifactId = KOTLIN_NATIVE_PLUGIN_ARTEFACT_ID, - version = VERSION, - ) + override fun getPluginArtifactForNative(): SubpluginArtifact = SubpluginArtifact( + groupId = GROUP, + artifactId = "$NAME-kotlin-plugin-native", + version = VERSION, + ) override fun applyToCompilation( - kotlinCompilation: KotlinCompilation<*> + kotlinCompilation: KotlinCompilation<*> ): Provider> { val project = kotlinCompilation.target.project + val rootExtension = project.rootProject.rootKlip val extension = project.klip return project.provider { - listOf( - SubpluginOption( - key = KlipOption.Enabled.name, lazyValue = lazy { extension.enabled.toString() }), - SubpluginOption( - key = KlipOption.Update.name, lazyValue = lazy { extension.update.toString() }), - ) + - extension.klipAnnotations.map { - SubpluginOption(key = KlipOption.KlipAnnotation.name, value = it) - } + - extension.scopeAnnotations.map { - SubpluginOption(key = KlipOption.ScopeAnnotation.name, value = it) - } + - extension.scopeFunctions.map { - SubpluginOption(key = KlipOption.ScopeFunction.name, value = it) - } + val debugFile = if (extension.debug.get()) { + project.buildDir.resolve("klip-${kotlinCompilation.compileKotlinTaskName}.log").absolutePath + } else "" + listOfNotNull( + SubpluginOption(key = KlipOption.Enabled.name, value = extension.enabled.get().toString()), + SubpluginOption(key = KlipOption.Update.name, value = extension.update.get().toString()), + SubpluginOption(key = KlipOption.ServerUrl.name, value = "http://localhost:${rootExtension.port.get()}"), + SubpluginOption(key = KlipOption.Debug.name, value = debugFile), + ) + extension.klipAnnotations.get() + .map { SubpluginOption(key = KlipOption.KlipAnnotation.name, value = it) } + extension.scopeAnnotations.get() + .map { SubpluginOption(key = KlipOption.ScopeAnnotation.name, value = it) } + extension.scopeFunctions.get() + .map { SubpluginOption(key = KlipOption.ScopeFunction.name, value = it) } } } } diff --git a/plugin/klip-gradle-plugin/src/main/kotlin/delegate/ChainedProperty.kt b/plugin/klip-gradle-plugin/src/main/kotlin/delegate/ChainedProperty.kt deleted file mode 100644 index eb1d2593..00000000 --- a/plugin/klip-gradle-plugin/src/main/kotlin/delegate/ChainedProperty.kt +++ /dev/null @@ -1,17 +0,0 @@ -package dev.petuska.klip.plugin.delegate - -import kotlin.properties.ReadWriteProperty -import kotlin.reflect.KProperty - -internal class ChainedProperty( - private var main: ReadWriteProperty, - private val fallback: ReadWriteProperty -) : ReadWriteProperty { - override fun getValue(thisRef: R, property: KProperty<*>): V { - return main.getValue(thisRef, property) ?: fallback.getValue(thisRef, property) - } - - override fun setValue(thisRef: R, property: KProperty<*>, value: V) { - main.setValue(thisRef, property, value) - } -} diff --git a/plugin/klip-gradle-plugin/src/main/kotlin/delegate/FallbackDelegate.kt b/plugin/klip-gradle-plugin/src/main/kotlin/delegate/FallbackDelegate.kt deleted file mode 100644 index 5bb2135a..00000000 --- a/plugin/klip-gradle-plugin/src/main/kotlin/delegate/FallbackDelegate.kt +++ /dev/null @@ -1,25 +0,0 @@ -package dev.petuska.klip.plugin.delegate - -import kotlin.properties.ReadWriteProperty -import kotlin.reflect.KProperty - -internal class FallbackDelegate( - private val fallbackObj: F, - private val projection: F.() -> V -) : ReadWriteProperty { - constructor( - fallbackObj: F, - default: V, - projection: F.() -> V? - ) : this(fallbackObj, { fallbackObj.projection() ?: default }) - - private var value: V? = null - - override fun getValue(thisRef: Any, property: KProperty<*>): V { - return value ?: projection.invoke(fallbackObj) - } - - override fun setValue(thisRef: Any, property: KProperty<*>, value: V) { - this.value = value - } -} diff --git a/plugin/klip-gradle-plugin/src/main/kotlin/delegate/GradleProperty.kt b/plugin/klip-gradle-plugin/src/main/kotlin/delegate/GradleProperty.kt deleted file mode 100644 index ee53f457..00000000 --- a/plugin/klip-gradle-plugin/src/main/kotlin/delegate/GradleProperty.kt +++ /dev/null @@ -1,29 +0,0 @@ -package dev.petuska.klip.plugin.delegate - -import kotlin.properties.ReadWriteProperty -import kotlin.reflect.KClass -import kotlin.reflect.KProperty -import org.gradle.api.Project -import org.gradle.api.provider.Property - -internal sealed class GradleProperty( - private val property: Property, - private val handleNullable: (V?, KProperty<*>) -> V = { v, p -> - v ?: throw IllegalStateException("Null value on property $p") - } -) : ReadWriteProperty { - override fun getValue(thisRef: Any, property: KProperty<*>): V { - return handleNullable(this.property.orNull, property) - } - - override fun setValue(thisRef: Any, property: KProperty<*>, value: V) { - this.property.set(value) - } - - class Nullable(project: Project, type: KClass, default: V? = null) : - GradleProperty( - project.objects.property(type.java).apply { set(default) }, { it, _ -> it }) - - class NotNullable(project: Project, type: KClass, default: V) : - GradleProperty(project.objects.property(type.java).apply { set(default) }) -} diff --git a/plugin/klip-gradle-plugin/src/main/kotlin/delegate/PropertyDelegate.kt b/plugin/klip-gradle-plugin/src/main/kotlin/delegate/PropertyDelegate.kt deleted file mode 100644 index b77d6c78..00000000 --- a/plugin/klip-gradle-plugin/src/main/kotlin/delegate/PropertyDelegate.kt +++ /dev/null @@ -1,48 +0,0 @@ -package dev.petuska.klip.plugin.delegate - -import java.util.Locale -import kotlin.properties.ReadWriteProperty -import kotlin.reflect.KProperty -import org.gradle.api.Project - -internal class PropertyDelegate( - private val project: Project, - private val prefix: String?, - private val converter: (String) -> V?, - private val default: V -) : ReadWriteProperty { - private fun Project.propertyOrNull(name: String): String? = - if (hasProperty(name)) { - property(name)?.toString() - } else null - - private var value: V? = null - - override fun getValue(thisRef: Any, property: KProperty<*>): V { - value = - value - ?: (project.propertyOrNull(property.buildPropertyName()) - ?: System.getenv(property.buildEnvName())) - ?.toString() - ?.let(converter) - return value ?: default - } - - override fun setValue(thisRef: Any, property: KProperty<*>, value: V) { - this.value = value - } - - private fun KProperty<*>.buildPropertyName(): String { - return "$PROP_BASE${ - prefix?.removeSuffix(".")?.removePrefix(".")?.let { ".$it" } ?: "" - }.$name" - } - - private fun KProperty<*>.buildEnvName(): String { - return buildPropertyName().replace("[- .]".toRegex(), "_").uppercase(Locale.getDefault()) - } - - companion object { - private const val PROP_BASE = "klip" - } -} diff --git a/plugin/klip-gradle-plugin/src/main/kotlin/delegate/builders.kt b/plugin/klip-gradle-plugin/src/main/kotlin/delegate/builders.kt deleted file mode 100644 index 01e9cb67..00000000 --- a/plugin/klip-gradle-plugin/src/main/kotlin/delegate/builders.kt +++ /dev/null @@ -1,37 +0,0 @@ -package dev.petuska.klip.plugin.delegate - -import kotlin.properties.ReadWriteProperty -import kotlin.reflect.KProperty1 -import org.gradle.api.Project - -internal infix fun ReadWriteProperty.or(fallback: ReadWriteProperty) = - ChainedProperty(this, fallback) - -internal fun R.fallbackDelegate(prop: KProperty1) = - FallbackDelegate(this) { prop.get(this) } - -internal fun R.fallbackDelegate(prop: KProperty1, transform: P.() -> V) = - FallbackDelegate(this) { prop.get(this).transform() } - -internal fun R.fallbackDelegate(prop: KProperty1, default: V) = - FallbackDelegate(this, default) { prop.get(this) } - -internal fun R.fallbackDelegate(projection: R.() -> V) = FallbackDelegate(this, projection) - -internal fun R.fallbackDelegate(default: V, projection: R.() -> V) = - FallbackDelegate(this, default, projection) - -internal fun Project.propertyDelegate(prefix: String? = null, converter: (String) -> V?) = - propertyDelegate(prefix, null, converter) - -internal fun Project.propertyDelegate( - prefix: String? = null, - default: V, - converter: (String) -> V? -) = PropertyDelegate(project, prefix, converter, default) - -internal inline fun Project.gradleNullableProperty(default: V? = null) = - GradleProperty.Nullable(this, V::class, default) - -internal inline fun Project.gradleProperty(default: V) = - GradleProperty.NotNullable(this, V::class, default) diff --git a/plugin/klip-gradle-plugin/src/main/kotlin/server/KlipServerService.kt b/plugin/klip-gradle-plugin/src/main/kotlin/server/KlipServerService.kt new file mode 100644 index 00000000..1dd83435 --- /dev/null +++ b/plugin/klip-gradle-plugin/src/main/kotlin/server/KlipServerService.kt @@ -0,0 +1,36 @@ +package dev.petuska.klip.plugin.server + +import io.ktor.server.engine.ApplicationEngine +import kotlinx.serialization.json.Json +import org.gradle.api.file.DirectoryProperty +import org.gradle.api.provider.Property +import org.gradle.api.services.BuildService +import org.gradle.api.services.BuildServiceParameters +import org.gradle.tooling.events.FinishEvent +import org.gradle.tooling.events.OperationCompletionListener +import java.io.Closeable + +abstract class KlipServerService : BuildService, OperationCompletionListener, Closeable { + interface Params : BuildServiceParameters { + val port: Property + val rootDir: DirectoryProperty + } + + private val json = Json { + prettyPrint = true + } + + private val engine: ApplicationEngine = klipServer(parameters.port, parameters.rootDir.asFile) + + fun start(wait: Boolean = false) { + engine.start(wait) + } + + override fun onFinish(event: FinishEvent) { + close() + } + + override fun close() { + engine.stop() + } +} diff --git a/plugin/klip-gradle-plugin/src/main/kotlin/server/klipServer.kt b/plugin/klip-gradle-plugin/src/main/kotlin/server/klipServer.kt new file mode 100644 index 00000000..13395daa --- /dev/null +++ b/plugin/klip-gradle-plugin/src/main/kotlin/server/klipServer.kt @@ -0,0 +1,77 @@ +package dev.petuska.klip.plugin.server + +import io.ktor.http.HttpStatusCode +import io.ktor.serialization.kotlinx.json.json +import io.ktor.server.application.call +import io.ktor.server.application.install +import io.ktor.server.cio.CIO +import io.ktor.server.engine.embeddedServer +import io.ktor.server.plugins.BadRequestException +import io.ktor.server.plugins.NotFoundException +import io.ktor.server.plugins.contentnegotiation.ContentNegotiation +import io.ktor.server.plugins.cors.routing.CORS +import io.ktor.server.request.ApplicationRequest +import io.ktor.server.request.receive +import io.ktor.server.response.respond +import io.ktor.server.routing.get +import io.ktor.server.routing.post +import io.ktor.server.routing.routing +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext +import kotlinx.serialization.decodeFromString +import kotlinx.serialization.encodeToString +import kotlinx.serialization.json.Json +import kotlinx.serialization.json.JsonObject +import org.gradle.api.provider.Provider +import java.io.File + +internal fun klipServer(port: Provider, rootDir: Provider) = embeddedServer(CIO, port = port.get()) { + install(ContentNegotiation) { + json() + } + install(CORS) { + anyHost() + } + routing { + get { + val klipPath = call.request.path + val klipKey = call.request.key + val klipFile = File(klipPath) + if (!klipFile.startsWith(rootDir.get())) { + throw BadRequestException("Klip path is not within the project bounds ${rootDir.get().absolutePath}") + } + if (!klipFile.exists()) throw NotFoundException("Klip file does not exist") + val klips: JsonObject = json.decodeFromString(klipFile.readText()) + val klip = klips[klipKey] ?: throw NotFoundException("Klip does not exist") + call.respond(klip) + } + post { + val klipPath = call.request.path + val klipKey = call.request.key + withContext(Dispatchers.IO) { + val klipFile = File(klipPath) + if (!klipFile.startsWith(rootDir.get())) { + throw BadRequestException("Klip path is not within the project bounds ${rootDir.get().absolutePath}") + } + val klip: JsonObject = call.receive() + val klips: JsonObject = if (klipFile.exists()) { + json.decodeFromString(klipFile.readText()) + } else JsonObject(mapOf()) + val newKlips = klips.plus(klipKey to klip) + klipFile.parentFile.mkdirs() + klipFile.writeText(json.encodeToString(JsonObject(newKlips))) + } + call.respond(HttpStatusCode.Accepted) + } + } +} + +private inline val ApplicationRequest.path: String + get() = queryParameters["path"] ?: throw BadRequestException("Missing path parameter") + +private inline val ApplicationRequest.key: String + get() = queryParameters["key"] ?: throw BadRequestException("Missing key parameter") + +private val json = Json { + prettyPrint = true +} diff --git a/plugin/klip-gradle-plugin/src/main/kotlin/task/KlipServerStartTask.kt b/plugin/klip-gradle-plugin/src/main/kotlin/task/KlipServerStartTask.kt new file mode 100644 index 00000000..8fd55fb7 --- /dev/null +++ b/plugin/klip-gradle-plugin/src/main/kotlin/task/KlipServerStartTask.kt @@ -0,0 +1,21 @@ +package dev.petuska.klip.plugin.task + +import dev.petuska.klip.plugin.server.KlipServerService +import org.gradle.api.DefaultTask +import org.gradle.api.provider.Property +import org.gradle.api.tasks.Internal +import org.gradle.api.tasks.TaskAction + +abstract class KlipServerStartTask : DefaultTask() { + @get:Internal + abstract val service: Property + + init { + description = "Starts a server to manage klips state" + } + + @TaskAction + fun start() { + service.get().start() + } +} diff --git a/plugin/klip-gradle-plugin/src/main/kotlin/task/KlipUpdateTask.kt b/plugin/klip-gradle-plugin/src/main/kotlin/task/KlipUpdateTask.kt deleted file mode 100644 index 4a06e073..00000000 --- a/plugin/klip-gradle-plugin/src/main/kotlin/task/KlipUpdateTask.kt +++ /dev/null @@ -1,14 +0,0 @@ -package dev.petuska.klip.plugin.task - -import dev.petuska.klip.plugin.klip -import org.gradle.api.DefaultTask -import org.gradle.api.tasks.testing.Test - -open class KlipUpdateTask : DefaultTask() { - init { - group = "verification" - description = "Updates klip files during test run" - project.klip.update = true - project.tasks.withType(Test::class.java) { dependsOn(it) } - } -} diff --git a/plugin/klip-gradle-plugin/src/main/kotlin/util/KlipOption.kt b/plugin/klip-gradle-plugin/src/main/kotlin/util/KlipOption.kt index ab0961c2..14c27baf 100644 --- a/plugin/klip-gradle-plugin/src/main/kotlin/util/KlipOption.kt +++ b/plugin/klip-gradle-plugin/src/main/kotlin/util/KlipOption.kt @@ -5,65 +5,67 @@ package dev.petuska.klip.plugin.util * kotlin plugin */ sealed class KlipOption( - val name: String, - val default: T, + val name: String, + val default: T, ) { + object ServerUrl : KlipOption( + name = "server-url", + default = Unit, + ) + + object Debug : KlipOption( + name = "debug", + default = false, + ) /** Toggles the compiler processing on/off */ - object Enabled : - KlipOption( - name = "enabled", - default = true, - ) + object Enabled : KlipOption( + name = "enabled", + default = true, + ) /** Value passed to "klippable" functions to indicate that klips should be updated */ - object Update : - KlipOption( - name = "update", - default = false, - ) + object Update : KlipOption( + name = "update", + default = false, + ) /** Registers an annotation to be used to identify "klippable" functions */ - object KlipAnnotation : - KlipOption>( - name = "klipAnnotation", - default = listOf("dev.petuska.klip.core.Klippable"), - ) + object KlipAnnotation : KlipOption>( + name = "klipAnnotation", + default = listOf("dev.petuska.klip.api.Klippable"), + ) /** * Registers an annotation to be used to identify "scope" functions under which "klippable" * annotation detection should happen */ - object ScopeAnnotation : - KlipOption>( - name = "scopeAnnotation", - default = - listOf( - "kotlin.test.Test", - "org.junit.Test", - "org.junit.jupiter.api.Test", - "org.testng.annotations.Test", - "io.kotest.core.spec.style.AnnotationSpec.Test", - ), - ) + object ScopeAnnotation : KlipOption>( + name = "scopeAnnotation", + default = listOf( + "kotlin.test.Test", + "org.junit.Test", + "org.junit.jupiter.api.Test", + "org.testng.annotations.Test", + "io.kotest.core.spec.style.AnnotationSpec.Test", + ), + ) /** * Registers a function to be used to identify "scope" functions under which "klippable" * annotation detection should happen */ - object ScopeFunction : - KlipOption>( - name = "scopeFunction", - default = - listOf( - "io.kotest.core.spec.style.scopes.FunSpecRootScope.test", - "io.kotest.core.spec.style.scopes.DescribeSpecContainerScope.it", - "io.kotest.core.spec.style.scopes.BehaviorSpecWhenContainerScope.Then", - "io.kotest.core.spec.style.scopes.BehaviorSpecWhenContainerScope.then", - "io.kotest.core.spec.style.scopes.WordSpecShouldContainerScope.invoke", - "io.kotest.core.spec.style.scopes.FreeSpecContainerScope.invoke", - "io.kotest.core.spec.style.scopes.FeatureSpecContainerScope.scenario", - "io.kotest.core.spec.style.scopes.ExpectSpecContainerScope.expect", - ), - ) + object ScopeFunction : KlipOption>( + name = "scopeFunction", + default = listOf( + "io.kotest.core.spec.style.scopes.FunSpecRootScope.test", + "io.kotest.core.spec.style.scopes.DescribeSpecContainerScope.it", + "io.kotest.core.spec.style.scopes.BehaviorSpecWhenContainerScope.Then", + "io.kotest.core.spec.style.scopes.BehaviorSpecWhenContainerScope.then", + "io.kotest.core.spec.style.scopes.WordSpecShouldContainerScope.invoke", + "io.kotest.core.spec.style.scopes.FreeSpecContainerScope.invoke", + "io.kotest.core.spec.style.scopes.FeatureSpecContainerScope.scenario", + "io.kotest.core.spec.style.scopes.ExpectSpecContainerScope.expect", + ), + ) } diff --git a/plugin/klip-gradle-plugin/src/main/kotlin/util/lazy.kt b/plugin/klip-gradle-plugin/src/main/kotlin/util/lazy.kt new file mode 100644 index 00000000..22f201a9 --- /dev/null +++ b/plugin/klip-gradle-plugin/src/main/kotlin/util/lazy.kt @@ -0,0 +1,20 @@ +package dev.petuska.klip.plugin.util + +import org.gradle.api.Project +import org.gradle.api.provider.Property + +fun Property.sysOrGradleOrEnvConvention( + project: Project, + propName: String, + envName: String, + default: (() -> T)? = null, + converter: (String) -> T, +) { + val p = project.providers.systemProperty(propName) + .orElse(project.provider { project.extensions.extraProperties.properties[propName]?.toString() }) + .orElse(project.providers.gradleProperty(propName)) + .orElse(project.providers.environmentVariable(envName)) + convention( + p.map(converter).orElse(project.provider { default?.invoke() }) + ) +} diff --git a/plugin/klip-gradle-plugin/src/test/kotlin/klip/KlipPluginTest.kt b/plugin/klip-gradle-plugin/src/test/kotlin/KlipPluginTest.kt similarity index 73% rename from plugin/klip-gradle-plugin/src/test/kotlin/klip/KlipPluginTest.kt rename to plugin/klip-gradle-plugin/src/test/kotlin/KlipPluginTest.kt index 0a86f63e..524077ea 100644 --- a/plugin/klip-gradle-plugin/src/test/kotlin/klip/KlipPluginTest.kt +++ b/plugin/klip-gradle-plugin/src/test/kotlin/KlipPluginTest.kt @@ -1,13 +1,9 @@ -/* - * This Kotlin source file was generated by the Gradle 'init' task. - */ package dev.petuska.klip.plugin +import org.gradle.testfixtures.ProjectBuilder import kotlin.test.Test import kotlin.test.assertNotNull -import org.gradle.testfixtures.ProjectBuilder -/** A simple unit test for the 'klip.greeting' plugin. */ class KlipPluginTest { @Test fun `plugin registers task`() { diff --git a/plugin/klip-kotlin-plugin-native/build.gradle.kts b/plugin/klip-kotlin-plugin-native/build.gradle.kts index 7d32ab5e..1352e49d 100644 --- a/plugin/klip-kotlin-plugin-native/build.gradle.kts +++ b/plugin/klip-kotlin-plugin-native/build.gradle.kts @@ -1,17 +1,13 @@ +import io.gitlab.arturbosch.detekt.Detekt + plugins { - id("plugin.publishing-jvm") - kotlin("kapt") + id("convention.publishing-jvm") } description = "Kotlin compiler plugin to manage KLIP snapshots for native targets" -java { withSourcesJar() } - dependencies { compileOnly(kotlin("compiler")) - compileOnly("com.google.auto.service:auto-service-annotations:_") - kapt("com.google.auto.service:auto-service:_") - testImplementation(kotlin("reflect")) testImplementation(kotlin("test-junit5")) testImplementation(kotlin("compiler-embeddable")) @@ -31,6 +27,7 @@ publishing { tasks { val mainPluginSourceSets = { project(":plugin:klip-kotlin-plugin").sourceSets } fun Sync.registerSources(sourceSet: SourceSet, root: File) { +// dependsOn(sourceSet) destinationDir = root from(sourceSet.allSource) { into("kotlin") @@ -38,7 +35,7 @@ tasks { // Replace shadowed imports from plugin module when (it) { "import org.jetbrains.kotlin.com.intellij.mock.MockProject" -> - "import com.intellij.mock.MockProject" + "import com.intellij.mock.MockProject" else -> it } } @@ -46,11 +43,11 @@ tasks { from(sourceSet.resources) { into("resources") } } - val syncSourceMain by - registering(Sync::class) { - registerSources(mainPluginSourceSets().main.get(), projectDir.resolve("src/main")) - } + val syncSourceMain by registering(Sync::class) { + registerSources(mainPluginSourceSets().main.get(), projectDir.resolve("src/main")) + } named("compileKotlin") { dependsOn(syncSourceMain) } + named("processResources") { dependsOn(syncSourceMain) } named("clean") { doLast { projectDir.resolve("src").delete() } } - withType { enabled = false } + withType { enabled = false } } diff --git a/plugin/klip-kotlin-plugin/build.gradle.kts b/plugin/klip-kotlin-plugin/build.gradle.kts index 5c84cf44..1a8f0229 100644 --- a/plugin/klip-kotlin-plugin/build.gradle.kts +++ b/plugin/klip-kotlin-plugin/build.gradle.kts @@ -1,23 +1,17 @@ plugins { - id("plugin.publishing-jvm") - id("plugin.build-config-jvm") - kotlin("kapt") + id("convention.publishing-jvm") + id("convention.build-konfig") } description = "Kotlin compiler plugin to manage KLIP snapshots for jvm & js" -java { withSourcesJar() } - dependencies { compileOnly(kotlin("compiler-embeddable")) - compileOnly("com.google.auto.service:auto-service-annotations:_") - kapt("com.google.auto.service:auto-service:_") - testImplementation(kotlin("reflect")) testImplementation(kotlin("test-junit5")) testImplementation(kotlin("compiler-embeddable")) testImplementation("com.github.tschuchortdev:kotlin-compile-testing:_") - testImplementation(project(":library:klip-core")) + testImplementation(project(":library:klip-api")) } publishing { diff --git a/plugin/klip-kotlin-plugin/src/main/kotlin/KlipCommandLineProcessor.kt b/plugin/klip-kotlin-plugin/src/main/kotlin/KlipCommandLineProcessor.kt index 737778de..46a752b2 100644 --- a/plugin/klip-kotlin-plugin/src/main/kotlin/KlipCommandLineProcessor.kt +++ b/plugin/klip-kotlin-plugin/src/main/kotlin/KlipCommandLineProcessor.kt @@ -1,7 +1,7 @@ package dev.petuska.klip.plugin -import com.google.auto.service.AutoService -import dev.petuska.klip.plugin.config.KOTLIN_PLUGIN_ID +import dev.petuska.klip.plugin.config.GROUP +import dev.petuska.klip.plugin.config.NAME import dev.petuska.klip.plugin.util.KlipOption import org.jetbrains.kotlin.compiler.plugin.AbstractCliOption import org.jetbrains.kotlin.compiler.plugin.CliOption @@ -12,57 +12,69 @@ import org.jetbrains.kotlin.config.CompilerConfiguration /** * Command line processor responsible for registering and retrieving values passed by gradle plugin */ -@AutoService(CommandLineProcessor::class) class KlipCommandLineProcessor : CommandLineProcessor { - override val pluginId: String = KOTLIN_PLUGIN_ID + override val pluginId: String = "$GROUP.$NAME-kotlin-plugin" - override val pluginOptions: Collection = - setOf( - CliOption( - optionName = KlipOption.Enabled.name, - valueDescription = KlipOption.Enabled.valueDescription, - description = KlipOption.Enabled.description, - required = true), - CliOption( - optionName = KlipOption.Update.name, - valueDescription = KlipOption.Update.valueDescription, - description = KlipOption.Update.description, - required = true), - CliOption( - optionName = KlipOption.KlipAnnotation.name, - valueDescription = KlipOption.KlipAnnotation.valueDescription, - description = KlipOption.KlipAnnotation.description, - allowMultipleOccurrences = true, - required = false, - ), - CliOption( - optionName = KlipOption.ScopeAnnotation.name, - valueDescription = KlipOption.ScopeAnnotation.valueDescription, - description = KlipOption.ScopeAnnotation.description, - allowMultipleOccurrences = true, - required = false, - ), - CliOption( - optionName = KlipOption.ScopeFunction.name, - valueDescription = KlipOption.ScopeFunction.valueDescription, - description = KlipOption.ScopeFunction.description, - allowMultipleOccurrences = true, - required = false, - ), - ) + override val pluginOptions: Collection = setOf( + CliOption( + optionName = KlipOption.Debug.name, + valueDescription = KlipOption.Debug.valueDescription, + description = KlipOption.Debug.description, + required = false + ), + CliOption( + optionName = KlipOption.ServerUrl.name, + valueDescription = KlipOption.ServerUrl.valueDescription, + description = KlipOption.ServerUrl.description, + required = true + ), + CliOption( + optionName = KlipOption.Enabled.name, + valueDescription = KlipOption.Enabled.valueDescription, + description = KlipOption.Enabled.description, + required = true + ), + CliOption( + optionName = KlipOption.Update.name, + valueDescription = KlipOption.Update.valueDescription, + description = KlipOption.Update.description, + required = true + ), + CliOption( + optionName = KlipOption.KlipAnnotation.name, + valueDescription = KlipOption.KlipAnnotation.valueDescription, + description = KlipOption.KlipAnnotation.description, + allowMultipleOccurrences = true, + required = false, + ), + CliOption( + optionName = KlipOption.ScopeAnnotation.name, + valueDescription = KlipOption.ScopeAnnotation.valueDescription, + description = KlipOption.ScopeAnnotation.description, + allowMultipleOccurrences = true, + required = false, + ), + CliOption( + optionName = KlipOption.ScopeFunction.name, + valueDescription = KlipOption.ScopeFunction.valueDescription, + description = KlipOption.ScopeFunction.description, + allowMultipleOccurrences = true, + required = false, + ), + ) override fun processOption( - option: AbstractCliOption, - value: String, - configuration: CompilerConfiguration + option: AbstractCliOption, + value: String, + configuration: CompilerConfiguration ) { when (option.optionName) { + KlipOption.Debug.name -> configuration.putIfNotNull(KlipOption.Debug.key, value.takeIf(String::isNotBlank)) + KlipOption.ServerUrl.name -> configuration.put(KlipOption.ServerUrl.key, value) KlipOption.Enabled.name -> configuration.put(KlipOption.Enabled.key, value.toBoolean()) KlipOption.Update.name -> configuration.put(KlipOption.Update.key, value.toBoolean()) - KlipOption.KlipAnnotation.name -> - configuration.appendList(KlipOption.KlipAnnotation.key, value) - KlipOption.ScopeAnnotation.name -> - configuration.appendList(KlipOption.ScopeAnnotation.key, value) + KlipOption.KlipAnnotation.name -> configuration.appendList(KlipOption.KlipAnnotation.key, value) + KlipOption.ScopeAnnotation.name -> configuration.appendList(KlipOption.ScopeAnnotation.key, value) KlipOption.ScopeFunction.name -> configuration.appendList(KlipOption.ScopeFunction.key, value) else -> throw CliOptionProcessingException("Unknown option: ${option.optionName}") } diff --git a/plugin/klip-kotlin-plugin/src/main/kotlin/KlipComponentRegistrar.kt b/plugin/klip-kotlin-plugin/src/main/kotlin/KlipComponentRegistrar.kt index ce789714..70aa0fbd 100644 --- a/plugin/klip-kotlin-plugin/src/main/kotlin/KlipComponentRegistrar.kt +++ b/plugin/klip-kotlin-plugin/src/main/kotlin/KlipComponentRegistrar.kt @@ -1,13 +1,11 @@ package dev.petuska.klip.plugin -import com.google.auto.service.AutoService +import dev.petuska.klip.plugin.util.KlipLogger import dev.petuska.klip.plugin.util.KlipOption import dev.petuska.klip.plugin.util.KlipSettings -import dev.petuska.klip.plugin.util.debug import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys import org.jetbrains.kotlin.cli.common.messages.MessageCollector -import org.jetbrains.kotlin.cli.common.toLogger import org.jetbrains.kotlin.com.intellij.mock.MockProject import org.jetbrains.kotlin.compiler.plugin.ComponentRegistrar import org.jetbrains.kotlin.config.CompilerConfiguration @@ -17,32 +15,31 @@ import org.jetbrains.kotlin.name.FqName * Component Registrar responsible for validating command line inputs and registering required IR * extensions */ -@AutoService(ComponentRegistrar::class) class KlipComponentRegistrar : ComponentRegistrar { override fun registerProjectComponents( - project: MockProject, - configuration: CompilerConfiguration + project: MockProject, + configuration: CompilerConfiguration ) { - debug { java.io.File("").canonicalPath } - val messageCollector = - configuration.get(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY, MessageCollector.NONE) + val logPath = configuration[KlipOption.Debug.key] + val messageCollector = configuration.get(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY, MessageCollector.NONE) IrGenerationExtension.registerExtension( - project, - KlipIrGenerationExtension( - settings = - KlipSettings( - enabled = configuration[KlipOption.Enabled.key] == true, - update = configuration[KlipOption.Update.key] == true, - klipAnnotations = - configuration[KlipOption.KlipAnnotation.key]?.map { FqName(it) } - ?: listOf(), - scopeAnnotations = - configuration[KlipOption.ScopeAnnotation.key]?.map { FqName(it) } - ?: listOf(), - scopeFunctions = configuration[KlipOption.ScopeFunction.key]?.map { FqName(it) } - ?: listOf(), - ), - logger = messageCollector.toLogger(), - )) + project, + KlipIrGenerationExtension( + settings = KlipSettings( + enabled = configuration[KlipOption.Enabled.key] == true, + update = configuration[KlipOption.Update.key] == true, + serverUrl = configuration[KlipOption.ServerUrl.key]!!, + klipAnnotations = + configuration[KlipOption.KlipAnnotation.key]?.map { FqName(it) } + ?: listOf(), + scopeAnnotations = + configuration[KlipOption.ScopeAnnotation.key]?.map { FqName(it) } + ?: listOf(), + scopeFunctions = configuration[KlipOption.ScopeFunction.key]?.map { FqName(it) } + ?: listOf(), + ), + logger = KlipLogger(messageCollector, logPath), + ) + ) } } diff --git a/plugin/klip-kotlin-plugin/src/main/kotlin/KlipIrGenerationExtension.kt b/plugin/klip-kotlin-plugin/src/main/kotlin/KlipIrGenerationExtension.kt index 8fbc2433..2ef3d420 100644 --- a/plugin/klip-kotlin-plugin/src/main/kotlin/KlipIrGenerationExtension.kt +++ b/plugin/klip-kotlin-plugin/src/main/kotlin/KlipIrGenerationExtension.kt @@ -1,6 +1,7 @@ package dev.petuska.klip.plugin import dev.petuska.klip.plugin.transformer.KlippableFnIrTransformer +import dev.petuska.klip.plugin.util.KlipLogger import dev.petuska.klip.plugin.util.KlipSettings import org.jetbrains.kotlin.backend.common.FileLoweringPass import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension @@ -8,50 +9,53 @@ import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.declarations.IrFile import org.jetbrains.kotlin.ir.declarations.IrModuleFragment +import org.jetbrains.kotlin.ir.declarations.path import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid import org.jetbrains.kotlin.ir.visitors.acceptVoid import org.jetbrains.kotlin.name.FqName -import org.jetbrains.kotlin.util.Logger /** An orchestrator to manage processing flows via transformers. */ class KlipIrGenerationExtension( - private val settings: KlipSettings, - private val logger: Logger, + private val settings: KlipSettings, + private val logger: KlipLogger, ) : IrGenerationExtension { - private val contextFqName = FqName("dev.petuska.klip.core.int.KlipContext") + private val contextFqName = FqName("dev.petuska.klip.api.KlipContext") override fun generate(moduleFragment: IrModuleFragment, pluginContext: IrPluginContext) { + logger { settings.toString() } val klipContextClass = pluginContext.referenceClass(contextFqName) if (settings.enabled && klipContextClass != null) { - - val transformer = - KlippableFnIrTransformer( - context = pluginContext, - logger = logger, - settings = settings, - klipContextClass = klipContextClass, - ) + logger { "KlipContext detected. Running..." } + val transformer = KlippableFnIrTransformer( + context = pluginContext, + logger = logger, + settings = settings, + klipContextClass = klipContextClass, + ) for (file in moduleFragment.files) { transformer.runOnFileInOrder(file) } } else { logger.log( - "Klip plugin disabled [enabled=${settings.enabled}, KlipContextClass=$klipContextClass]") + "Klip plugin disabled [enabled=${settings.enabled}, KlipContextClass=$klipContextClass]" + ) } } private fun FileLoweringPass.runOnFileInOrder(irFile: IrFile) { irFile.acceptVoid( - object : IrElementVisitorVoid { - override fun visitElement(element: IrElement) { - element.acceptChildrenVoid(this) - } + object : IrElementVisitorVoid { + override fun visitElement(element: IrElement) { + element.acceptChildrenVoid(this) + } - override fun visitFile(declaration: IrFile) { - lower(declaration) - super.visitFile(declaration) - } - }) + override fun visitFile(declaration: IrFile) { + logger { "Inspecting ${declaration.path}" } + lower(declaration) + super.visitFile(declaration) + } + } + ) } } diff --git a/plugin/klip-kotlin-plugin/src/main/kotlin/transformer/KlipContextIrTransformer.kt b/plugin/klip-kotlin-plugin/src/main/kotlin/transformer/KlipContextIrTransformer.kt new file mode 100644 index 00000000..2ad9e138 --- /dev/null +++ b/plugin/klip-kotlin-plugin/src/main/kotlin/transformer/KlipContextIrTransformer.kt @@ -0,0 +1,97 @@ +package dev.petuska.klip.plugin.transformer + +import dev.petuska.klip.plugin.util.KlipLogger +import dev.petuska.klip.plugin.util.hasAll +import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext +import org.jetbrains.kotlin.backend.common.lower.DeclarationIrBuilder +import org.jetbrains.kotlin.ir.builders.irCall +import org.jetbrains.kotlin.ir.declarations.IrFunction +import org.jetbrains.kotlin.ir.declarations.IrValueParameter +import org.jetbrains.kotlin.ir.declarations.copyAttributes +import org.jetbrains.kotlin.ir.expressions.* +import org.jetbrains.kotlin.ir.symbols.IrClassSymbol +import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol +import org.jetbrains.kotlin.ir.types.classOrNull +import org.jetbrains.kotlin.ir.util.dump +import org.jetbrains.kotlin.ir.util.isNullConst +import org.jetbrains.kotlin.ir.util.kotlinFqName +import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid + +class KlipContextIrTransformer( + private val context: IrPluginContext, + private val logger: KlipLogger, + private val klipContextClass: IrClassSymbol, + private val klipContextConstructorCall: IrConstructorCall, +) : IrElementTransformerVoid() { + override fun visitCall(expression: IrCall): IrExpression { + val (param, fn) = findTarget(expression) + logger { "pick: $fn" } + + val irBuilder = DeclarationIrBuilder(context, expression.symbol, expression.startOffset, expression.endOffset) + val rewrite = + if (param != null) { + expression.apply { + if (getValueArgument(param.index)?.isNullConst() == true) putArgument(param, klipContextConstructorCall) + } + } else { + irBuilder.irCall(fn).also { + it.copyAttributes(expression) + it.copyTypeArgumentsFrom(expression) + it.dispatchReceiver = expression.dispatchReceiver + it.extensionReceiver = expression.extensionReceiver + it.putValueArgument(0, klipContextConstructorCall) + for (i in 0 until expression.valueArgumentsCount) { + it.putValueArgument(i + 1, expression.getValueArgument(i)) + } + } + } + logger { + """ + |================== ORIGINAL ================== + |${expression.dump()}============================================ + """.trimMargin() + } + logger { + """ + |================== REWRITE ================== + |${rewrite.dump()}============================================= + """.trimMargin() + } + return rewrite + } + + private fun findTarget(expression: IrFunctionAccessExpression): Pair { + val param = expression.symbol.owner.findContextParam() + return if (param != null) { + param to expression.symbol + } else { + val candidates = context.referenceFunctions(expression.symbol.owner.kotlinFqName).mapNotNull { fn -> + fn.owner.findContextParam()?.takeIf { it.index == 0 }?.let { fn } + } + logger { "candidates: ${candidates.size}" } + null to candidates.first { fn -> + val (expect, actual) = fn.owner to expression.symbol.owner + val hasValueParameters = expect.valueParameters.hasAll(actual.valueParameters) + val hasTypeParameters = expect.typeParameters.hasAll(actual.typeParameters) + val sameDispatch = + expect.dispatchReceiverParameter?.type?.classOrNull == actual.dispatchReceiverParameter?.type?.classOrNull + val sameExtension = + expect.extensionReceiverParameter?.type?.classOrNull == actual.extensionReceiverParameter?.type?.classOrNull + logger { + """ + candidate: $fn + hasValueParameters: $hasValueParameters + hasTypeParameters: $hasTypeParameters + sameDispatch: $sameDispatch + sameExtension: $sameExtension + """.trimIndent() + } + hasValueParameters && hasTypeParameters && sameDispatch && sameExtension + } + } + } + + private fun IrFunction.findContextParam() = valueParameters.find { + it.type.classOrNull == klipContextClass + } +} diff --git a/plugin/klip-kotlin-plugin/src/main/kotlin/transformer/KlippableFnIrTransformer.kt b/plugin/klip-kotlin-plugin/src/main/kotlin/transformer/KlippableFnIrTransformer.kt index cd09a6f4..fb2a7f4d 100644 --- a/plugin/klip-kotlin-plugin/src/main/kotlin/transformer/KlippableFnIrTransformer.kt +++ b/plugin/klip-kotlin-plugin/src/main/kotlin/transformer/KlippableFnIrTransformer.kt @@ -1,7 +1,7 @@ package dev.petuska.klip.plugin.transformer +import dev.petuska.klip.plugin.util.KlipLogger import dev.petuska.klip.plugin.util.KlipSettings -import java.io.File import org.jetbrains.kotlin.backend.common.FileLoweringPass import org.jetbrains.kotlin.backend.common.IrElementTransformerVoidWithContext import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext @@ -14,32 +14,29 @@ import org.jetbrains.kotlin.ir.builders.irString import org.jetbrains.kotlin.ir.declarations.IrDeclaration import org.jetbrains.kotlin.ir.declarations.IrFile import org.jetbrains.kotlin.ir.declarations.IrFunction -import org.jetbrains.kotlin.ir.declarations.IrValueParameter import org.jetbrains.kotlin.ir.declarations.path +import org.jetbrains.kotlin.ir.expressions.IrCall import org.jetbrains.kotlin.ir.expressions.IrConst import org.jetbrains.kotlin.ir.expressions.IrExpression import org.jetbrains.kotlin.ir.expressions.IrFunctionAccessExpression -import org.jetbrains.kotlin.ir.expressions.putArgument import org.jetbrains.kotlin.ir.symbols.IrClassSymbol -import org.jetbrains.kotlin.ir.types.classOrNull import org.jetbrains.kotlin.ir.types.isString import org.jetbrains.kotlin.ir.util.constructors import org.jetbrains.kotlin.ir.util.getArgumentsWithIr import org.jetbrains.kotlin.ir.util.hasAnnotation -import org.jetbrains.kotlin.ir.util.isNullConst import org.jetbrains.kotlin.ir.util.kotlinFqName -import org.jetbrains.kotlin.util.Logger import org.jetbrains.kotlin.utils.addToStdlib.cast +import java.io.File /** * The main worker-bee of the plugin, responsible for actually transforming the "klippable" function * calls to pass in required parameters */ class KlippableFnIrTransformer( - private val context: IrPluginContext, - private val logger: Logger, - private val settings: KlipSettings, - private val klipContextClass: IrClassSymbol, + private val context: IrPluginContext, + private val logger: KlipLogger, + private val settings: KlipSettings, + private val klipContextClass: IrClassSymbol, ) : IrElementTransformerVoidWithContext(), FileLoweringPass { private var index: Int = 0 private lateinit var klipPath: String @@ -50,7 +47,7 @@ class KlippableFnIrTransformer( override fun lower(irFile: IrFile) { val filePath = File(irFile.path) - klipPath = filePath.parentFile.resolve("__klips__/${filePath.name}.klip").canonicalPath + klipPath = filePath.parentFile.resolve("__klips__/${filePath.name}.json").canonicalPath index = 0 scope = null scopeName = null @@ -59,13 +56,14 @@ class KlippableFnIrTransformer( irFile.declarations.addAll(newDeclarations.filter { it.parent == irFile }) } - private fun findScopeFunction(declaration: IrFunction): IrFunction? { - if (settings.scopeFunctions.any { + private fun detectScopeFn(declaration: IrFunction): IrFunction? { + val insideScopeFunction = settings.scopeFunctions.any { declaration.kotlinFqName == it || declaration.realOverrideTarget.kotlinFqName == it - } || - settings.scopeAnnotations.any { - declaration.hasAnnotation(it) || declaration.realOverrideTarget.hasAnnotation(it) - }) { + } + val insideScopeAnnotation = settings.scopeAnnotations.any { + declaration.hasAnnotation(it) || declaration.realOverrideTarget.hasAnnotation(it) + } + if (insideScopeFunction || insideScopeAnnotation) { scope = declaration index = 0 } @@ -73,46 +71,51 @@ class KlippableFnIrTransformer( } override fun visitFunctionNew(declaration: IrFunction): IrStatement { - findScopeFunction(declaration) + logger { "Visiting function ${declaration.kotlinFqName}" } + detectScopeFn(declaration) return super.visitFunctionNew(declaration) } - override fun visitFunctionAccess(expression: IrFunctionAccessExpression): IrExpression { - val fn = scope ?: findScopeFunction(expression.symbol.owner) - fn?.let { _ -> - val foundParam = - fn.valueParameters.find { it.name.asString() == "name" && it.type.isString() } - ?: fn.extensionReceiverParameter?.takeIf { it.type.isString() } - val foundArg = - foundParam?.let { nameArg -> - expression.getArgumentsWithIr().find { (arg, _) -> arg == nameArg }?.second - } + override fun visitCall(expression: IrCall): IrExpression { + logger { "Visiting call [scope: ${scope?.kotlinFqName}] ${expression.symbol.owner.kotlinFqName}" } + val scopeFn = scope + val isKlippable = settings.klipAnnotations.any { expression.symbol.owner.hasAnnotation(it) } + logger { "isKlippable: $isKlippable" } + if (scopeFn == null || !isKlippable) return super.visitCall(expression) - foundArg?.takeIf { it is IrConst<*> }?.cast>()?.value?.toString()?.let { - scopeName = it - index = 0 - } - } + logger { "scope: ${scope?.name}" } + detectScopeName(scopeFn, expression) val path = klipPath - - if (fn != null && settings.klipAnnotations.any { expression.symbol.owner.hasAnnotation(it) }) { + val klipContextConstructorCall = run { val tName = scopeName?.let { "($it)" } ?: "" - val klipKey = "${fn.kotlinFqName.asString()}${tName}#${index++}" - val irBuilder = DeclarationIrBuilder(context, expression.symbol) + val klipKey = "${scopeFn.kotlinFqName.asString()}$tName#${index++}" + val irBuilder = DeclarationIrBuilder(context, expression.symbol, expression.startOffset, expression.endOffset) - val param: IrValueParameter? = - expression.symbol.owner.valueParameters.find { it.type.classOrNull == klipContextClass } - if (param != null && - expression.getArgumentsWithIr().none { (p, v) -> p == param && !v.isNullConst() }) { - val klipContextConstructorCall = - irBuilder.irCall(klipContextClass.constructors.first()).apply { - putValueArgument(0, irBuilder.irString(path)) - putValueArgument(1, irBuilder.irString(klipKey)) - putValueArgument(2, irBuilder.irBoolean(settings.update)) - } - expression.putArgument(param, klipContextConstructorCall) + irBuilder.irCall(klipContextClass.constructors.first()).apply { + putValueArgument(0, irBuilder.irString(path)) + putValueArgument(1, irBuilder.irString(klipKey)) + putValueArgument(2, irBuilder.irBoolean(settings.update)) + putValueArgument(3, irBuilder.irString(settings.serverUrl)) } } - return super.visitFunctionAccess(expression) + logger { "fn: ${expression.symbol.owner.name}" } + logger { "fnAnnotations: ${expression.symbol.owner.annotations}" } + return expression.transform( + KlipContextIrTransformer(context, logger, klipContextClass, klipContextConstructorCall), + null + ) + } + + private fun detectScopeName(scopeFn: IrFunction, expression: IrFunctionAccessExpression) { + val foundParam = scopeFn.valueParameters.find { it.name.asString() == "name" && it.type.isString() } + ?: scopeFn.extensionReceiverParameter?.takeIf { it.type.isString() } + val foundArg = foundParam?.let { nameArg -> + expression.getArgumentsWithIr().find { (arg, _) -> arg == nameArg }?.second + } + + foundArg?.takeIf { it is IrConst<*> }?.cast>()?.value?.toString()?.let { + scopeName = it + index = 0 + } } } diff --git a/plugin/klip-kotlin-plugin/src/main/kotlin/util/Debugger.kt b/plugin/klip-kotlin-plugin/src/main/kotlin/util/Debugger.kt deleted file mode 100644 index 751f3f1d..00000000 --- a/plugin/klip-kotlin-plugin/src/main/kotlin/util/Debugger.kt +++ /dev/null @@ -1,23 +0,0 @@ -package dev.petuska.klip.plugin.util - -import java.io.File - -private object Debugger { - private val file by lazy { - File("${System.getProperty("user.home")}/IdeaProjects/klip/sandbox/klip.log").also { - it.writeText("PWD: ${File("").canonicalPath}") - } - } - private val enabled = System.getenv("KLIP_DEBUG")?.let { !it.equals("false", true) } == true - fun log(text: () -> String) { - if (enabled) - text().let { - println("DEBUG: $it") - file.appendText("${it}\n") - } - } -} - -fun debug(text: () -> String) { - Debugger.log(text) -} diff --git a/plugin/klip-kotlin-plugin/src/main/kotlin/util/KlipLogger.kt b/plugin/klip-kotlin-plugin/src/main/kotlin/util/KlipLogger.kt new file mode 100644 index 00000000..1cde8af3 --- /dev/null +++ b/plugin/klip-kotlin-plugin/src/main/kotlin/util/KlipLogger.kt @@ -0,0 +1,41 @@ +package dev.petuska.klip.plugin.util + +import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity +import org.jetbrains.kotlin.cli.common.messages.MessageCollector +import java.io.File +import kotlin.system.exitProcess + +class KlipLogger(private val collector: MessageCollector, filePath: String?) : org.jetbrains.kotlin.util.Logger { + private val file = filePath?.let(::File)?.apply { + writeText("PWD: ${File(".").canonicalPath}\n") + } + + private fun logToFile(text: Any?) { + file?.appendText("${text}\n") + } + + operator fun invoke(message: () -> Any?) { + logToFile(message()) + } + + override fun error(message: String) { + logToFile(message) + collector.report(CompilerMessageSeverity.ERROR, message) + } + + override fun fatal(message: String): Nothing { + logToFile(message) + collector.report(CompilerMessageSeverity.ERROR, message) + exitProcess(1) + } + + override fun warning(message: String) { + logToFile(message) + collector.report(CompilerMessageSeverity.WARNING, message) + } + + override fun log(message: String) { + logToFile(message) + collector.report(CompilerMessageSeverity.LOGGING, message) + } +} diff --git a/plugin/klip-kotlin-plugin/src/main/kotlin/util/KlipOption.kt b/plugin/klip-kotlin-plugin/src/main/kotlin/util/KlipOption.kt index 5d9535ad..36e2eebd 100644 --- a/plugin/klip-kotlin-plugin/src/main/kotlin/util/KlipOption.kt +++ b/plugin/klip-kotlin-plugin/src/main/kotlin/util/KlipOption.kt @@ -7,57 +7,62 @@ import org.jetbrains.kotlin.config.CompilerConfigurationKey * kotlin plugin */ sealed class KlipOption( - val name: String, - val valueDescription: String, - val description: String, + val name: String, + val valueDescription: String, + val description: String, ) { val key: CompilerConfigurationKey = CompilerConfigurationKey(name) + object ServerUrl : KlipOption( + name = "server-url", + valueDescription = "://:", + description = "Klip server url", + ) + + object Debug : KlipOption( + name = "debug", + valueDescription = "", + description = "Debug log file path", + ) + /** Toggles the compiler processing on/off */ - object Enabled : - KlipOption( - name = "enabled", - valueDescription = "", - description = "whether the plugin is enabled", - ) + object Enabled : KlipOption( + name = "enabled", + valueDescription = "", + description = "whether the plugin is enabled", + ) /** Value passed to "klippable" functions to indicate that klips should be updated */ - object Update : - KlipOption( - name = "update", - valueDescription = "", - description = "whether the klips should be updated", - ) + object Update : KlipOption( + name = "update", + valueDescription = "", + description = "whether the klips should be updated", + ) /** Registers an annotation to be used to identify "klippable" functions */ - object KlipAnnotation : - KlipOption>( - name = "klipAnnotation", - valueDescription = "", - description = "annotation to register for compiler processing", - ) + object KlipAnnotation : KlipOption>( + name = "klipAnnotation", + valueDescription = "", + description = "annotation to register for compiler processing", + ) /** * Registers an annotation to be used to identify "scope" functions under which "klippable" * annotation detection should happen */ - object ScopeAnnotation : - KlipOption>( - name = "scopeAnnotation", - valueDescription = "", - description = - "annotation to register function scope for compiler klip detection and processing", - ) + object ScopeAnnotation : KlipOption>( + name = "scopeAnnotation", + valueDescription = "", + description = "annotation to register function scope for compiler klip detection and processing", + ) /** * Registers a function to be used to identify "scope" functions under which "klippable" function * detection should happen */ - object ScopeFunction : - KlipOption>( - name = "scopeFunction", - valueDescription = "", - description = - "function to register function scope for compiler klip detection and processing", - ) + object ScopeFunction : KlipOption>( + name = "scopeFunction", + valueDescription = "", + description = "function to register function scope for compiler klip detection and processing", + ) } diff --git a/plugin/klip-kotlin-plugin/src/main/kotlin/util/KlipSettings.kt b/plugin/klip-kotlin-plugin/src/main/kotlin/util/KlipSettings.kt index 9e7e33d0..74dcd6cb 100644 --- a/plugin/klip-kotlin-plugin/src/main/kotlin/util/KlipSettings.kt +++ b/plugin/klip-kotlin-plugin/src/main/kotlin/util/KlipSettings.kt @@ -4,9 +4,10 @@ import org.jetbrains.kotlin.name.FqName /** Payload class to pass-along command line options */ data class KlipSettings( - val enabled: Boolean, - val update: Boolean, - val klipAnnotations: Collection, - val scopeAnnotations: Collection, - val scopeFunctions: Collection, + val enabled: Boolean, + val update: Boolean, + val serverUrl: String, + val klipAnnotations: Collection, + val scopeAnnotations: Collection, + val scopeFunctions: Collection, ) diff --git a/plugin/klip-kotlin-plugin/src/main/kotlin/util/ir.kt b/plugin/klip-kotlin-plugin/src/main/kotlin/util/ir.kt new file mode 100644 index 00000000..9f3d0fec --- /dev/null +++ b/plugin/klip-kotlin-plugin/src/main/kotlin/util/ir.kt @@ -0,0 +1,24 @@ +package dev.petuska.klip.plugin.util + +import org.jetbrains.kotlin.ir.declarations.IrTypeParameter +import org.jetbrains.kotlin.ir.declarations.IrValueParameter +import org.jetbrains.kotlin.ir.types.classFqName +import org.jetbrains.kotlin.ir.types.defaultType + +@JvmName("hasAllIrValueParameter") +fun Collection.hasAll(actual: Collection): Boolean { + return actual.all { a -> + any { e -> + a.name == e.name && a.type.classFqName == e.type.classFqName + } + } +} + +@JvmName("hasAllIrTypeParameter") +fun Collection.hasAll(actual: Collection): Boolean { + return actual.all { a -> + any { e -> + a.name == e.name && a.defaultType.classFqName == e.defaultType.classFqName + } + } +} diff --git a/plugin/klip-kotlin-plugin/src/main/resources/META-INF/services/org.jetbrains.kotlin.compiler.plugin.CommandLineProcessor b/plugin/klip-kotlin-plugin/src/main/resources/META-INF/services/org.jetbrains.kotlin.compiler.plugin.CommandLineProcessor new file mode 100644 index 00000000..ac38aed2 --- /dev/null +++ b/plugin/klip-kotlin-plugin/src/main/resources/META-INF/services/org.jetbrains.kotlin.compiler.plugin.CommandLineProcessor @@ -0,0 +1 @@ +dev.petuska.klip.plugin.KlipCommandLineProcessor diff --git a/plugin/klip-kotlin-plugin/src/main/resources/META-INF/services/org.jetbrains.kotlin.compiler.plugin.ComponentRegistrar b/plugin/klip-kotlin-plugin/src/main/resources/META-INF/services/org.jetbrains.kotlin.compiler.plugin.ComponentRegistrar new file mode 100644 index 00000000..0a9e943a --- /dev/null +++ b/plugin/klip-kotlin-plugin/src/main/resources/META-INF/services/org.jetbrains.kotlin.compiler.plugin.ComponentRegistrar @@ -0,0 +1 @@ +dev.petuska.klip.plugin.KlipComponentRegistrar diff --git a/plugin/klip-kotlin-plugin/src/test/kotlin/KlipPluginITest.kt b/plugin/klip-kotlin-plugin/src/test/kotlin/KlipPluginITest.kt index d63da039..8a2e0804 100644 --- a/plugin/klip-kotlin-plugin/src/test/kotlin/KlipPluginITest.kt +++ b/plugin/klip-kotlin-plugin/src/test/kotlin/KlipPluginITest.kt @@ -3,20 +3,21 @@ package dev.petuska.klip.plugin import com.tschuchort.compiletesting.KotlinCompilation import com.tschuchort.compiletesting.SourceFile import dev.petuska.klip.plugin.test.Compiler +import org.junit.jupiter.api.Test import java.io.File import kotlin.reflect.full.memberExtensionFunctions import kotlin.reflect.full.memberFunctions +import kotlin.test.Ignore import kotlin.test.assertEquals -import org.junit.jupiter.api.Test class KlipPluginITest { @Test + @Ignore fun works() { - val result = - Compiler.compile( - SourceFile.kotlin( - "main.kt", - """ + val result = Compiler.compile( + SourceFile.kotlin( + "main.kt", + """ import dev.petuska.klip.core.int.KlipContext class Main { @@ -36,7 +37,9 @@ class KlipPluginITest { @${Compiler.scopeAnnotations[1]} fun Any?.testKlip2() = klip2() } - """.trimIndent())) + """.trimIndent() + ) + ) assertEquals(KotlinCompilation.ExitCode.OK, result.exitCode) val kClazz = result.classLoader.loadClass("Main") val instance = kClazz.getConstructor().newInstance() @@ -45,6 +48,7 @@ class KlipPluginITest { val klipPath = File("${Compiler.kotlinRoot}/sources/__klips__/main.kt.klip").canonicalPath assertEquals("Argument, $klipPath, Main.testKlip#0, false", testKlip.call(instance, "Argument")) assertEquals( - "Receiver, $klipPath, Main.testKlip2#0, false", testKlip2.call(instance, "Receiver")) + "Receiver, $klipPath, Main.testKlip2#0, false", testKlip2.call(instance, "Receiver") + ) } } diff --git a/plugin/klip-kotlin-plugin/src/test/kotlin/test/Compiler.kt b/plugin/klip-kotlin-plugin/src/test/kotlin/test/Compiler.kt index cc9dc97e..3f303ed2 100644 --- a/plugin/klip-kotlin-plugin/src/test/kotlin/test/Compiler.kt +++ b/plugin/klip-kotlin-plugin/src/test/kotlin/test/Compiler.kt @@ -5,7 +5,8 @@ import com.tschuchort.compiletesting.PluginOption import com.tschuchort.compiletesting.SourceFile import dev.petuska.klip.plugin.KlipCommandLineProcessor import dev.petuska.klip.plugin.KlipComponentRegistrar -import dev.petuska.klip.plugin.config.KOTLIN_PLUGIN_ID +import dev.petuska.klip.plugin.config.GROUP +import dev.petuska.klip.plugin.config.NAME import dev.petuska.klip.plugin.util.KlipOption import java.io.File @@ -17,39 +18,39 @@ object Compiler { val scopeAnnotations = listOf("test.Test", "test.CustomTest") private val annotationsFile = - SourceFile.kotlin( - "annotations.kt", - """ + SourceFile.kotlin( + "Klippable.kt", + """ package test annotation class Klippable annotation class CustomKlippable annotation class Test annotation class CustomTest - """.trimIndent()) + """.trimIndent() + ) fun compile( - vararg sourceFiles: SourceFile, + vararg sourceFiles: SourceFile, ): KotlinCompilation.Result { + val pluginId = "$GROUP.$NAME-kotlin-plugin" return KotlinCompilation() - .apply { - sources = sourceFiles.toList() + annotationsFile - useIR = true - compilerPlugins = listOf(KlipComponentRegistrar()) - commandLineProcessors = listOf(KlipCommandLineProcessor()) - inheritClassPath = true - workingDir = kotlinRoot - pluginOptions = - listOf( - PluginOption(KOTLIN_PLUGIN_ID, KlipOption.Enabled.name, enabled), - PluginOption(KOTLIN_PLUGIN_ID, KlipOption.Update.name, update), - *klipAnnotations - .map { PluginOption(KOTLIN_PLUGIN_ID, KlipOption.KlipAnnotation.name, it) } - .toTypedArray(), - *scopeAnnotations - .map { PluginOption(KOTLIN_PLUGIN_ID, KlipOption.ScopeAnnotation.name, it) } - .toTypedArray(), - ) - } - .compile() + .apply { + sources = sourceFiles.toList() + annotationsFile + useIR = true + compilerPlugins = listOf(KlipComponentRegistrar()) + commandLineProcessors = listOf(KlipCommandLineProcessor()) + inheritClassPath = true + workingDir = kotlinRoot + pluginOptions = listOf( + PluginOption(pluginId, KlipOption.Enabled.name, enabled), + PluginOption(pluginId, KlipOption.Update.name, update), + *klipAnnotations + .map { PluginOption(pluginId, KlipOption.KlipAnnotation.name, it) } + .toTypedArray(), + *scopeAnnotations + .map { PluginOption(pluginId, KlipOption.ScopeAnnotation.name, it) } + .toTypedArray(), + ) + }.compile() } } diff --git a/sandbox/.editorconfig b/sandbox/.editorconfig deleted file mode 120000 index 38d9a0ce..00000000 --- a/sandbox/.editorconfig +++ /dev/null @@ -1 +0,0 @@ -../.editorconfig \ No newline at end of file diff --git a/sandbox/build.gradle.kts b/sandbox/build.gradle.kts deleted file mode 100644 index 13364c9d..00000000 --- a/sandbox/build.gradle.kts +++ /dev/null @@ -1,134 +0,0 @@ -import org.jetbrains.kotlin.gradle.tasks.AbstractKotlinCompile - -plugins { - id("dev.petuska.klip") - id("io.kotest.multiplatform") version "5.0.0" - kotlin("multiplatform") - id("com.android.library") - idea -} - -gradleEnterprise { - buildScan { - termsOfServiceUrl = "https://gradle.com/terms-of-service" - termsOfServiceAgree = "yes" - } -} - -android { - compileSdkVersion(31) - defaultConfig { - minSdkVersion(1) - targetSdkVersion(31) - } - compileOptions { - sourceCompatibility = JavaVersion.VERSION_11 - targetCompatibility = JavaVersion.VERSION_11 - } -} - -allprojects { - apply(plugin = "idea") - - idea { - module { - isDownloadJavadoc = true - isDownloadSources = true - } - } - - repositories { - mavenCentral() - google() - } - tasks { - afterEvaluate { - withType(AbstractKotlinCompile::class) { - val debug = - (project.findProperty("klip.debug") ?: System.getenv("KLIP_DEBUG"))?.toString()?.let { - !it.equals("false", true) - } == true - if (debug) { - outputs.upToDateWhen { false } - } - } - if (tasks.findByName("compile") == null) { - register("compile") { - dependsOn(withType(AbstractKotlinCompile::class)) - group = "build" - } - } - val testTasks = withType { useJUnitPlatform() } - if (tasks.findByName("allTests") == null) { - register("allTests") { - dependsOn(testTasks) - group = "verification" - } - } - } - } -} - -kotlin { - android() - jvm() - js { - useCommonJs() - nodejs() - } - linuxX64() - macosX64() - macosArm64() - mingwX64() - iosArm32() - iosArm64() - iosX64() - iosSimulatorArm64() - watchosX86() - watchosX64() - watchosArm64() - watchosArm32() - watchosSimulatorArm64() - tvosArm64() - tvosX64() - tvosSimulatorArm64() - - // Fallback Targets - androidNativeArm32() - androidNativeArm64() - mingwX86() - linuxArm32Hfp() - linuxMips32() - linuxMipsel32() - linuxArm64() - - sourceSets { - commonTest { - dependencies { - implementation("dev.petuska:klip") - implementation(kotlin("test-common")) - implementation(kotlin("test-annotations-common")) - } - } - named("androidTest") { - dependencies { - implementation(kotlin("test-junit5")) - implementation("io.kotest:kotest-framework-engine:_") - implementation("io.kotest:kotest-runner-junit5:_") - } - } - named("jvmTest") { - dependencies { - implementation(kotlin("test-junit5")) - implementation("io.kotest:kotest-framework-engine:_") - implementation("io.kotest:kotest-runner-junit5:_") - } - } - named("jsTest") { - dependencies { - implementation("io.kotest:kotest-framework-engine:_") - implementation(kotlin("test-js")) - } - } - } -} diff --git a/sandbox/js/.gitignore b/sandbox/js/.gitignore deleted file mode 100644 index 536af507..00000000 --- a/sandbox/js/.gitignore +++ /dev/null @@ -1 +0,0 @@ -src/*/kotlin \ No newline at end of file diff --git a/sandbox/js/build.gradle.kts b/sandbox/js/build.gradle.kts deleted file mode 100644 index 31803c44..00000000 --- a/sandbox/js/build.gradle.kts +++ /dev/null @@ -1,44 +0,0 @@ -import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension -import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet - -plugins { - kotlin("js") - id("dev.petuska.klip") -} - -kotlin { - js { - useCommonJs() - nodejs() - } - sourceSets { - test { - dependencies { - implementation("dev.petuska:klip-api") - implementation(kotlin("test-js")) - } - } - } -} - -tasks { - val mainPluginSourceSets = { rootProject.extensions.getByType(KotlinMultiplatformExtension::class).sourceSets } - fun Sync.registerSources(sourceSet: KotlinSourceSet, root: File) { - destinationDir = root - from(sourceSet.kotlin.sourceDirectories) { - into("kotlin") - } - from(sourceSet.resources) { - into("resources") - } - } - - val syncSourceMain by registering(Sync::class) { - registerSources(mainPluginSourceSets()["commonMain"], projectDir.resolve("src/main")) - } - named("compileKotlinJs") { dependsOn(syncSourceMain) } - val syncSourceTest by registering(Sync::class) { - registerSources(mainPluginSourceSets()["commonTest"], projectDir.resolve("src/test")) - } - named("compileTestKotlinJs") { dependsOn(syncSourceTest) } -} diff --git a/sandbox/jvm/.gitignore b/sandbox/jvm/.gitignore deleted file mode 100644 index 536af507..00000000 --- a/sandbox/jvm/.gitignore +++ /dev/null @@ -1 +0,0 @@ -src/*/kotlin \ No newline at end of file diff --git a/sandbox/jvm/build.gradle.kts b/sandbox/jvm/build.gradle.kts deleted file mode 100644 index 9d04e315..00000000 --- a/sandbox/jvm/build.gradle.kts +++ /dev/null @@ -1,48 +0,0 @@ -import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension -import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet - -plugins { - id("dev.petuska.klip") - kotlin("jvm") - idea -} - -kotlin { - sourceSets { - test { - dependencies { - implementation("dev.petuska:klip") - implementation(kotlin("test-junit5")) - } - } - } -} - -tasks { - val mainPluginSourceSets = { rootProject.extensions.getByType(KotlinMultiplatformExtension::class).sourceSets } - fun Sync.registerSources(sourceSet: KotlinSourceSet, root: File) { - destinationDir = root - from(sourceSet.kotlin.sourceDirectories) { - into("kotlin") - filter { - // Replace shadowed imports from plugin module - when (it) { - "import org.jetbrains.kotlin.com.intellij.mock.MockProject" -> "import com.intellij.mock.MockProject" - else -> it - } - } - } - from(sourceSet.resources) { - into("resources") - } - } - - val syncSourceMain by registering(Sync::class) { - registerSources(mainPluginSourceSets()["commonMain"], projectDir.resolve("src/main")) - } - named("compileKotlin") { dependsOn(syncSourceMain) } - val syncSourceTest by registering(Sync::class) { - registerSources(mainPluginSourceSets()["commonTest"], projectDir.resolve("src/test")) - } - named("compileTestKotlin") { dependsOn(syncSourceTest) } -} diff --git a/sandbox/settings.gradle.kts b/sandbox/settings.gradle.kts deleted file mode 100644 index 43caed7e..00000000 --- a/sandbox/settings.gradle.kts +++ /dev/null @@ -1,18 +0,0 @@ -pluginManagement { - repositories { - gradlePluginPortal() - mavenCentral() - google() - } -} - -plugins { - id("de.fayard.refreshVersions") version "0.21.0" - id("com.gradle.enterprise") version "3.6.4" -} - -refreshVersions { extraArtifactVersionKeyRules(file("versions.rules")) } - -rootProject.name = "sandbox" -includeBuild("../") -include(":jvm", "js") diff --git a/sandbox/src/androidNativeArm32Test/kotlin/AndroidNativeArm32Test.kt b/sandbox/src/androidNativeArm32Test/kotlin/AndroidNativeArm32Test.kt deleted file mode 100644 index b71d9dbf..00000000 --- a/sandbox/src/androidNativeArm32Test/kotlin/AndroidNativeArm32Test.kt +++ /dev/null @@ -1,18 +0,0 @@ -package sandbox.test - -import dev.petuska.klip.api.assertKlip -import dev.petuska.klip.api.assertMatchesKlip -import kotlin.test.Test - -class AndroidNativeArm32Test { - @Test - fun test() { - assertMatchesKlip("zero") - assertMatchesKlip("one") - } - - @Test - fun test1() { - "2".assertKlip() - } -} diff --git a/sandbox/src/androidNativeArm32Test/kotlin/__klips__/AndroidNativeArm32Test.kt.klip b/sandbox/src/androidNativeArm32Test/kotlin/__klips__/AndroidNativeArm32Test.kt.klip deleted file mode 100644 index d1912203..00000000 --- a/sandbox/src/androidNativeArm32Test/kotlin/__klips__/AndroidNativeArm32Test.kt.klip +++ /dev/null @@ -1,8 +0,0 @@ -:::::>> KLIPS :::::>> -:::::>>type=TEXT:::::>>sandbox.test.AndroidNativeArm32Test.test#0:::::>> -zero -:::::>>type=TEXT:::::>>sandbox.test.AndroidNativeArm32Test.test#1:::::>> -one -:::::>>type=TEXT:::::>>sandbox.test.AndroidNativeArm32Test.test1#0:::::>> -2 -:::::>>:::::>>:::::>> diff --git a/sandbox/src/androidNativeArm64Test/kotlin/AndroidNativeArm64Test.kt b/sandbox/src/androidNativeArm64Test/kotlin/AndroidNativeArm64Test.kt deleted file mode 100644 index ba6b9333..00000000 --- a/sandbox/src/androidNativeArm64Test/kotlin/AndroidNativeArm64Test.kt +++ /dev/null @@ -1,18 +0,0 @@ -package sandbox.test - -import dev.petuska.klip.api.assertKlip -import dev.petuska.klip.api.assertMatchesKlip -import kotlin.test.Test - -class AndroidNativeArm64Test { - @Test - fun test() { - assertMatchesKlip("zero") - assertMatchesKlip("one") - } - - @Test - fun test1() { - "2".assertKlip() - } -} diff --git a/sandbox/src/androidNativeArm64Test/kotlin/__klips__/AndroidNativeArm64Test.kt.klip b/sandbox/src/androidNativeArm64Test/kotlin/__klips__/AndroidNativeArm64Test.kt.klip deleted file mode 100644 index fff001ea..00000000 --- a/sandbox/src/androidNativeArm64Test/kotlin/__klips__/AndroidNativeArm64Test.kt.klip +++ /dev/null @@ -1,8 +0,0 @@ -:::::>> KLIPS :::::>> -:::::>>type=TEXT:::::>>sandbox.test.AndroidNativeArm64Test.test#0:::::>> -zero -:::::>>type=TEXT:::::>>sandbox.test.AndroidNativeArm64Test.test#1:::::>> -one -:::::>>type=TEXT:::::>>sandbox.test.AndroidNativeArm64Test.test1#0:::::>> -2 -:::::>>:::::>>:::::>> diff --git a/sandbox/src/androidTest/kotlin/AndroidTest.kt b/sandbox/src/androidTest/kotlin/AndroidTest.kt deleted file mode 100644 index 979f01cf..00000000 --- a/sandbox/src/androidTest/kotlin/AndroidTest.kt +++ /dev/null @@ -1,18 +0,0 @@ -package sandbox.test - -import dev.petuska.klip.api.assertKlip -import dev.petuska.klip.api.assertMatchesKlip -import kotlin.test.Test - -class AndroidTest { - @Test - fun test() { - assertMatchesKlip("zero") - assertMatchesKlip("one") - } - - @Test - fun test1() { - "2".assertKlip() - } -} diff --git a/sandbox/src/androidTest/kotlin/__klips__/AndroidTest.kt.klip b/sandbox/src/androidTest/kotlin/__klips__/AndroidTest.kt.klip deleted file mode 100644 index 8354aa85..00000000 --- a/sandbox/src/androidTest/kotlin/__klips__/AndroidTest.kt.klip +++ /dev/null @@ -1,8 +0,0 @@ -:::::>> KLIPS :::::>> -:::::>>type=TEXT:::::>>sandbox.test.AndroidTest.test#0:::::>> -zero -:::::>>type=TEXT:::::>>sandbox.test.AndroidTest.test#1:::::>> -one -:::::>>type=TEXT:::::>>sandbox.test.AndroidTest.test1#0:::::>> -2 -:::::>>:::::>>:::::>> diff --git a/sandbox/src/commonTest/kotlin/CommonTest.kt b/sandbox/src/commonTest/kotlin/CommonTest.kt deleted file mode 100644 index 863503a0..00000000 --- a/sandbox/src/commonTest/kotlin/CommonTest.kt +++ /dev/null @@ -1,36 +0,0 @@ -package sandbox.test - -import dev.petuska.klip.api.assertMatchesKlip -import kotlin.test.Test - -class CommonTest { - @Test - fun test() { - assertMatchesKlip("zero") - assertMatchesKlip("one") - } - - @Test - fun test1() { - assertMatchesKlip("2") - } -} - -class AnotherCommonTest { - class Inner { - fun run() { - assertMatchesKlip("2") - } - } - - @Test - fun test() { - assertMatchesKlip("zero") - assertMatchesKlip("one") - } - - @Test - fun test1() { - Inner().run() - } -} diff --git a/sandbox/src/commonTest/kotlin/__klips__/CommonTest.kt.klip b/sandbox/src/commonTest/kotlin/__klips__/CommonTest.kt.klip deleted file mode 100644 index 229bc468..00000000 --- a/sandbox/src/commonTest/kotlin/__klips__/CommonTest.kt.klip +++ /dev/null @@ -1,14 +0,0 @@ -:::::>> KLIPS :::::>> -:::::>>type=TEXT:::::>>sandbox.test.CommonTest.test#0:::::>> -zero -:::::>>type=TEXT:::::>>sandbox.test.CommonTest.test#1:::::>> -one -:::::>>type=TEXT:::::>>sandbox.test.CommonTest.test1#0:::::>> -2 -:::::>>type=TEXT:::::>>sandbox.test.AnotherCommonTest.test#0:::::>> -zero -:::::>>type=TEXT:::::>>sandbox.test.AnotherCommonTest.test#1:::::>> -one -:::::>>type=TEXT:::::>>sandbox.test.CommonTest.test1#1:::::>> -2 -:::::>>:::::>>:::::>> diff --git a/sandbox/src/commonTest/kotlin/subpackage/CommonTest.kt b/sandbox/src/commonTest/kotlin/subpackage/CommonTest.kt deleted file mode 100644 index d543dd19..00000000 --- a/sandbox/src/commonTest/kotlin/subpackage/CommonTest.kt +++ /dev/null @@ -1,18 +0,0 @@ -package sandbox.test.subpackage - -import dev.petuska.klip.api.assertKlip -import dev.petuska.klip.api.assertMatchesKlip -import kotlin.test.Test - -class CommonTest { - @Test - fun test() { - assertMatchesKlip("zero") - assertMatchesKlip("one") - } - - @Test - fun test1() { - "2".assertKlip() - } -} diff --git a/sandbox/src/commonTest/kotlin/subpackage/__klips__/CommonTest.kt.klip b/sandbox/src/commonTest/kotlin/subpackage/__klips__/CommonTest.kt.klip deleted file mode 100644 index f254f15c..00000000 --- a/sandbox/src/commonTest/kotlin/subpackage/__klips__/CommonTest.kt.klip +++ /dev/null @@ -1,8 +0,0 @@ -:::::>> KLIPS :::::>> -:::::>>type=TEXT:::::>>sandbox.test.subpackage.CommonTest.test#0:::::>> -zero -:::::>>type=TEXT:::::>>sandbox.test.subpackage.CommonTest.test#1:::::>> -one -:::::>>type=TEXT:::::>>sandbox.test.subpackage.CommonTest.test1#0:::::>> -2 -:::::>>:::::>>:::::>> diff --git a/sandbox/src/iosArm32Test/kotlin/IosArm32Test.kt b/sandbox/src/iosArm32Test/kotlin/IosArm32Test.kt deleted file mode 100644 index 555101b0..00000000 --- a/sandbox/src/iosArm32Test/kotlin/IosArm32Test.kt +++ /dev/null @@ -1,18 +0,0 @@ -package sandbox.test - -import dev.petuska.klip.api.assertKlip -import dev.petuska.klip.api.assertMatchesKlip -import kotlin.test.Test - -class IosArm32Test { - @Test - fun test() { - assertMatchesKlip("zero") - assertMatchesKlip("one") - } - - @Test - fun test1() { - "2".assertKlip() - } -} diff --git a/sandbox/src/iosArm32Test/kotlin/__klips__/IosArm32Test.kt.klip b/sandbox/src/iosArm32Test/kotlin/__klips__/IosArm32Test.kt.klip deleted file mode 100644 index 1793e8d6..00000000 --- a/sandbox/src/iosArm32Test/kotlin/__klips__/IosArm32Test.kt.klip +++ /dev/null @@ -1,8 +0,0 @@ -:::::>> KLIPS :::::>> -:::::>>type=TEXT:::::>>sandbox.test.IosArm32Test.test#0:::::>> -zero -:::::>>type=TEXT:::::>>sandbox.test.IosArm32Test.test#1:::::>> -one -:::::>>type=TEXT:::::>>sandbox.test.IosArm32Test.test1#0:::::>> -2 -:::::>>:::::>>:::::>> diff --git a/sandbox/src/iosArm64Test/kotlin/IosArm64Test.kt b/sandbox/src/iosArm64Test/kotlin/IosArm64Test.kt deleted file mode 100644 index 94f8cc7b..00000000 --- a/sandbox/src/iosArm64Test/kotlin/IosArm64Test.kt +++ /dev/null @@ -1,18 +0,0 @@ -package sandbox.test - -import dev.petuska.klip.api.assertKlip -import dev.petuska.klip.api.assertMatchesKlip -import kotlin.test.Test - -class IosArm64Test { - @Test - fun test() { - assertMatchesKlip("zero") - assertMatchesKlip("one") - } - - @Test - fun test1() { - "2".assertKlip() - } -} diff --git a/sandbox/src/iosArm64Test/kotlin/__klips__/IosArm64Test.kt.klip b/sandbox/src/iosArm64Test/kotlin/__klips__/IosArm64Test.kt.klip deleted file mode 100644 index 33b84717..00000000 --- a/sandbox/src/iosArm64Test/kotlin/__klips__/IosArm64Test.kt.klip +++ /dev/null @@ -1,8 +0,0 @@ -:::::>> KLIPS :::::>> -:::::>>type=TEXT:::::>>sandbox.test.IosArm64Test.test#0:::::>> -zero -:::::>>type=TEXT:::::>>sandbox.test.IosArm64Test.test#1:::::>> -one -:::::>>type=TEXT:::::>>sandbox.test.IosArm64Test.test1#0:::::>> -2 -:::::>>:::::>>:::::>> diff --git a/sandbox/src/iosSimulatorArm64Test/kotlin/IosSimulatorArm64Test.kt b/sandbox/src/iosSimulatorArm64Test/kotlin/IosSimulatorArm64Test.kt deleted file mode 100644 index 6ba44110..00000000 --- a/sandbox/src/iosSimulatorArm64Test/kotlin/IosSimulatorArm64Test.kt +++ /dev/null @@ -1,18 +0,0 @@ -package sandbox.test - -import dev.petuska.klip.api.assertKlip -import dev.petuska.klip.api.assertMatchesKlip -import kotlin.test.Test - -class IosSimulatorArm64Test { - @Test - fun test() { - assertMatchesKlip("zero") - assertMatchesKlip("one") - } - - @Test - fun test1() { - "2".assertKlip() - } -} diff --git a/sandbox/src/iosSimulatorArm64Test/kotlin/__klips__/IosSimulatorArm64Test.kt.klip b/sandbox/src/iosSimulatorArm64Test/kotlin/__klips__/IosSimulatorArm64Test.kt.klip deleted file mode 100644 index d92c6c9c..00000000 --- a/sandbox/src/iosSimulatorArm64Test/kotlin/__klips__/IosSimulatorArm64Test.kt.klip +++ /dev/null @@ -1,8 +0,0 @@ -:::::>> KLIPS :::::>> -:::::>>type=TEXT:::::>>sandbox.test.IosSimulatorArm64Test.test#0:::::>> -zero -:::::>>type=TEXT:::::>>sandbox.test.IosSimulatorArm64Test.test#1:::::>> -one -:::::>>type=TEXT:::::>>sandbox.test.IosSimulatorArm64Test.test1#0:::::>> -2 -:::::>>:::::>>:::::>> diff --git a/sandbox/src/iosX64Test/kotlin/IosX64Test.kt b/sandbox/src/iosX64Test/kotlin/IosX64Test.kt deleted file mode 100644 index b1781d00..00000000 --- a/sandbox/src/iosX64Test/kotlin/IosX64Test.kt +++ /dev/null @@ -1,18 +0,0 @@ -package sandbox.test - -import dev.petuska.klip.api.assertKlip -import dev.petuska.klip.api.assertMatchesKlip -import kotlin.test.Test - -class IosX64Test { - @Test - fun test() { - assertMatchesKlip("zero") - assertMatchesKlip("one") - } - - @Test - fun test1() { - "2".assertKlip() - } -} diff --git a/sandbox/src/iosX64Test/kotlin/__klips__/IosX64Test.kt.klip b/sandbox/src/iosX64Test/kotlin/__klips__/IosX64Test.kt.klip deleted file mode 100644 index ea63ffef..00000000 --- a/sandbox/src/iosX64Test/kotlin/__klips__/IosX64Test.kt.klip +++ /dev/null @@ -1,8 +0,0 @@ -:::::>> KLIPS :::::>> -:::::>>type=TEXT:::::>>sandbox.test.IosX64Test.test#0:::::>> -zero -:::::>>type=TEXT:::::>>sandbox.test.IosX64Test.test#1:::::>> -one -:::::>>type=TEXT:::::>>sandbox.test.IosX64Test.test1#0:::::>> -2 -:::::>>:::::>>:::::>> diff --git a/sandbox/src/jsTest/kotlin/JsTest.kt b/sandbox/src/jsTest/kotlin/JsTest.kt deleted file mode 100644 index 5ce01198..00000000 --- a/sandbox/src/jsTest/kotlin/JsTest.kt +++ /dev/null @@ -1,18 +0,0 @@ -package sandbox.test - -import dev.petuska.klip.api.assertKlip -import dev.petuska.klip.api.assertMatchesKlip -import kotlin.test.Test - -class JsTest { - @Test - fun test() { - assertMatchesKlip("zero") - assertMatchesKlip("one") - } - - @Test - fun test1() { - "2".assertKlip() - } -} diff --git a/sandbox/src/jsTest/kotlin/__klips__/JsTest.kt.klip b/sandbox/src/jsTest/kotlin/__klips__/JsTest.kt.klip deleted file mode 100644 index 87f2d9dc..00000000 --- a/sandbox/src/jsTest/kotlin/__klips__/JsTest.kt.klip +++ /dev/null @@ -1,8 +0,0 @@ -:::::>> KLIPS :::::>> -:::::>>type=TEXT:::::>>sandbox.test.JsTest.test#0:::::>> -zero -:::::>>type=TEXT:::::>>sandbox.test.JsTest.test#1:::::>> -one -:::::>>type=TEXT:::::>>sandbox.test.JsTest.test1#0:::::>> -2 -:::::>>:::::>>:::::>> diff --git a/sandbox/src/jvmTest/kotlin/JvmTest.kt b/sandbox/src/jvmTest/kotlin/JvmTest.kt deleted file mode 100644 index ce1a467d..00000000 --- a/sandbox/src/jvmTest/kotlin/JvmTest.kt +++ /dev/null @@ -1,18 +0,0 @@ -package sandbox.test - -import dev.petuska.klip.api.assertKlip -import dev.petuska.klip.api.assertMatchesKlip -import kotlin.test.Test - -class JvmTest { - @Test - fun test() { - assertMatchesKlip("zero") - assertMatchesKlip("one") - } - - @Test - fun test1() { - "2".assertKlip() - } -} diff --git a/sandbox/src/jvmTest/kotlin/__klips__/JvmTest.kt.klip b/sandbox/src/jvmTest/kotlin/__klips__/JvmTest.kt.klip deleted file mode 100644 index f4e0adfe..00000000 --- a/sandbox/src/jvmTest/kotlin/__klips__/JvmTest.kt.klip +++ /dev/null @@ -1,8 +0,0 @@ -:::::>> KLIPS :::::>> -:::::>>type=TEXT:::::>>sandbox.test.JvmTest.test#0:::::>> -zero -:::::>>type=TEXT:::::>>sandbox.test.JvmTest.test#1:::::>> -one -:::::>>type=TEXT:::::>>sandbox.test.JvmTest.test1#0:::::>> -2 -:::::>>:::::>>:::::>> diff --git a/sandbox/src/jvmTest/kotlin/kotest/JvmAnnotationSpec.kt b/sandbox/src/jvmTest/kotlin/kotest/JvmAnnotationSpec.kt deleted file mode 100644 index ed7faaee..00000000 --- a/sandbox/src/jvmTest/kotlin/kotest/JvmAnnotationSpec.kt +++ /dev/null @@ -1,18 +0,0 @@ -package sandbox.test.kotest - -import dev.petuska.klip.api.assertKlip -import dev.petuska.klip.api.assertMatchesKlip -import io.kotest.core.spec.style.AnnotationSpec - -class JvmAnnotationSpec : AnnotationSpec() { - @Test - fun testOne() { - assertMatchesKlip("kotest zero") - assertMatchesKlip("kotest one") - } - - @Test - fun testTwo() { - "kotest 2".assertKlip() - } -} diff --git a/sandbox/src/jvmTest/kotlin/kotest/JvmBehaviourSpec.kt b/sandbox/src/jvmTest/kotlin/kotest/JvmBehaviourSpec.kt deleted file mode 100644 index 21acbe2c..00000000 --- a/sandbox/src/jvmTest/kotlin/kotest/JvmBehaviourSpec.kt +++ /dev/null @@ -1,22 +0,0 @@ -package sandbox.test.kotest - -import dev.petuska.klip.api.assertKlip -import dev.petuska.klip.api.assertMatchesKlip -import io.kotest.core.spec.style.BehaviorSpec - -class JvmBehaviourSpec : BehaviorSpec({ - Given("context") { - When("sub") { - Then("test one") { - assertMatchesKlip("kotest zero") - assertMatchesKlip("kotest one") - } - } - - When("sub2") { - Then("test two") { - "kotest 2".assertKlip() - } - } - } -}) diff --git a/sandbox/src/jvmTest/kotlin/kotest/JvmDescribeSpec.kt b/sandbox/src/jvmTest/kotlin/kotest/JvmDescribeSpec.kt deleted file mode 100644 index 0d14185a..00000000 --- a/sandbox/src/jvmTest/kotlin/kotest/JvmDescribeSpec.kt +++ /dev/null @@ -1,18 +0,0 @@ -package sandbox.test.kotest - -import dev.petuska.klip.api.assertKlip -import dev.petuska.klip.api.assertMatchesKlip -import io.kotest.core.spec.style.DescribeSpec - -class JvmDescribeSpec : DescribeSpec({ - describe("context") { - it("test one") { - assertMatchesKlip("kotest zero") - assertMatchesKlip("kotest one") - } - - it("test two") { - "kotest 2".assertKlip() - } - } -}) diff --git a/sandbox/src/jvmTest/kotlin/kotest/JvmExpectSpec.kt b/sandbox/src/jvmTest/kotlin/kotest/JvmExpectSpec.kt deleted file mode 100644 index 2e150bbd..00000000 --- a/sandbox/src/jvmTest/kotlin/kotest/JvmExpectSpec.kt +++ /dev/null @@ -1,17 +0,0 @@ -package sandbox.test.kotest - -import dev.petuska.klip.api.assertKlip -import dev.petuska.klip.api.assertMatchesKlip -import io.kotest.core.spec.style.ExpectSpec - -class JvmExpectSpec : ExpectSpec({ - context("context") { - expect("test one") { - assertMatchesKlip("kotest zero") - assertMatchesKlip("kotest one") - } - expect("test two") { - "kotest 2".assertKlip() - } - } -}) diff --git a/sandbox/src/jvmTest/kotlin/kotest/JvmFeatureSpec.kt b/sandbox/src/jvmTest/kotlin/kotest/JvmFeatureSpec.kt deleted file mode 100644 index 8c7510fd..00000000 --- a/sandbox/src/jvmTest/kotlin/kotest/JvmFeatureSpec.kt +++ /dev/null @@ -1,17 +0,0 @@ -package sandbox.test.kotest - -import dev.petuska.klip.api.assertKlip -import dev.petuska.klip.api.assertMatchesKlip -import io.kotest.core.spec.style.FeatureSpec - -class JvmFeatureSpec : FeatureSpec({ - feature("context") { - scenario("test one") { - assertMatchesKlip("kotest zero") - assertMatchesKlip("kotest one") - } - scenario("test two") { - "kotest 2".assertKlip() - } - } -}) diff --git a/sandbox/src/jvmTest/kotlin/kotest/JvmFreeSpec.kt b/sandbox/src/jvmTest/kotlin/kotest/JvmFreeSpec.kt deleted file mode 100644 index c714c692..00000000 --- a/sandbox/src/jvmTest/kotlin/kotest/JvmFreeSpec.kt +++ /dev/null @@ -1,19 +0,0 @@ -package sandbox.test.kotest - -import dev.petuska.klip.api.assertKlip -import dev.petuska.klip.api.assertMatchesKlip -import io.kotest.core.spec.style.FreeSpec - -class JvmFreeSpec : FreeSpec({ - "Hello" - { - "context" - { - "test one" { - assertMatchesKlip("kotest zero") - assertMatchesKlip("kotest one") - } - "test two" { - "kotest 2".assertKlip() - } - } - } -}) diff --git a/sandbox/src/jvmTest/kotlin/kotest/JvmFunSpec.kt b/sandbox/src/jvmTest/kotlin/kotest/JvmFunSpec.kt deleted file mode 100644 index ff580c2a..00000000 --- a/sandbox/src/jvmTest/kotlin/kotest/JvmFunSpec.kt +++ /dev/null @@ -1,16 +0,0 @@ -package sandbox.test.kotest - -import dev.petuska.klip.api.assertKlip -import dev.petuska.klip.api.assertMatchesKlip -import io.kotest.core.spec.style.FunSpec - -class JvmFunSpec : FunSpec({ - test("test one") { - assertMatchesKlip("kotest zero") - assertMatchesKlip("kotest one") - } - - test("test two") { - "kotest 2".assertKlip() - } -}) diff --git a/sandbox/src/jvmTest/kotlin/kotest/JvmWordSpec.kt b/sandbox/src/jvmTest/kotlin/kotest/JvmWordSpec.kt deleted file mode 100644 index 6751a649..00000000 --- a/sandbox/src/jvmTest/kotlin/kotest/JvmWordSpec.kt +++ /dev/null @@ -1,19 +0,0 @@ -package sandbox.test.kotest - -import dev.petuska.klip.api.assertKlip -import dev.petuska.klip.api.assertMatchesKlip -import io.kotest.core.spec.style.WordSpec - -class JvmWordSpec : WordSpec({ - "Hello" When { - "context" should { - "test one" { - assertMatchesKlip("kotest zero") - assertMatchesKlip("kotest one") - } - "test two" { - "kotest 2".assertKlip() - } - } - } -}) diff --git a/sandbox/src/jvmTest/kotlin/kotest/__klips__/JvmAnnotationSpec.kt.klip b/sandbox/src/jvmTest/kotlin/kotest/__klips__/JvmAnnotationSpec.kt.klip deleted file mode 100644 index 255f6164..00000000 --- a/sandbox/src/jvmTest/kotlin/kotest/__klips__/JvmAnnotationSpec.kt.klip +++ /dev/null @@ -1,8 +0,0 @@ -:::::>> KLIPS :::::>> -:::::>>type=TEXT:::::>>sandbox.test.kotest.JvmAnnotationSpec.testOne#0:::::>> -kotest zero -:::::>>type=TEXT:::::>>sandbox.test.kotest.JvmAnnotationSpec.testOne#1:::::>> -kotest one -:::::>>type=TEXT:::::>>sandbox.test.kotest.JvmAnnotationSpec.testTwo#0:::::>> -kotest 2 -:::::>>:::::>>:::::>> diff --git a/sandbox/src/jvmTest/kotlin/kotest/__klips__/JvmBehaviourSpec.kt.klip b/sandbox/src/jvmTest/kotlin/kotest/__klips__/JvmBehaviourSpec.kt.klip deleted file mode 100644 index ba9b27f4..00000000 --- a/sandbox/src/jvmTest/kotlin/kotest/__klips__/JvmBehaviourSpec.kt.klip +++ /dev/null @@ -1,14 +0,0 @@ -:::::>> KLIPS :::::>> -:::::>>type=TEXT:::::>>io.kotest.core.spec.style.scopes.BehaviorSpecWhenContainerContext.Then(test one)#0:::::>> -kotest zero -:::::>>type=TEXT:::::>>io.kotest.core.spec.style.scopes.BehaviorSpecWhenContainerContext.Then(test one)#1:::::>> -kotest one -:::::>>type=TEXT:::::>>io.kotest.core.spec.style.scopes.BehaviorSpecWhenContainerContext.Then(test two)#0:::::>> -kotest 2 -:::::>>type=TEXT:::::>>io.kotest.core.spec.style.scopes.BehaviorSpecWhenContainerScope.Then(test one)#0:::::>> -kotest zero -:::::>>type=TEXT:::::>>io.kotest.core.spec.style.scopes.BehaviorSpecWhenContainerScope.Then(test one)#1:::::>> -kotest one -:::::>>type=TEXT:::::>>io.kotest.core.spec.style.scopes.BehaviorSpecWhenContainerScope.Then(test two)#0:::::>> -kotest 2 -:::::>>:::::>>:::::>> diff --git a/sandbox/src/jvmTest/kotlin/kotest/__klips__/JvmDescribeSpec.kt.klip b/sandbox/src/jvmTest/kotlin/kotest/__klips__/JvmDescribeSpec.kt.klip deleted file mode 100644 index 195a686b..00000000 --- a/sandbox/src/jvmTest/kotlin/kotest/__klips__/JvmDescribeSpec.kt.klip +++ /dev/null @@ -1,14 +0,0 @@ -:::::>> KLIPS :::::>> -:::::>>type=TEXT:::::>>io.kotest.core.spec.style.scopes.DescribeSpecContainerContext.it(test one)#0:::::>> -kotest zero -:::::>>type=TEXT:::::>>io.kotest.core.spec.style.scopes.DescribeSpecContainerContext.it(test one)#1:::::>> -kotest one -:::::>>type=TEXT:::::>>io.kotest.core.spec.style.scopes.DescribeSpecContainerContext.it(test two)#0:::::>> -kotest 2 -:::::>>type=TEXT:::::>>io.kotest.core.spec.style.scopes.DescribeSpecContainerScope.it(test one)#0:::::>> -kotest zero -:::::>>type=TEXT:::::>>io.kotest.core.spec.style.scopes.DescribeSpecContainerScope.it(test one)#1:::::>> -kotest one -:::::>>type=TEXT:::::>>io.kotest.core.spec.style.scopes.DescribeSpecContainerScope.it(test two)#0:::::>> -kotest 2 -:::::>>:::::>>:::::>> diff --git a/sandbox/src/jvmTest/kotlin/kotest/__klips__/JvmExpectSpec.kt.klip b/sandbox/src/jvmTest/kotlin/kotest/__klips__/JvmExpectSpec.kt.klip deleted file mode 100644 index 50092bdd..00000000 --- a/sandbox/src/jvmTest/kotlin/kotest/__klips__/JvmExpectSpec.kt.klip +++ /dev/null @@ -1,14 +0,0 @@ -:::::>> KLIPS :::::>> -:::::>>type=TEXT:::::>>io.kotest.core.spec.style.scopes.ExpectSpecContainerContext.expect(test one)#0:::::>> -kotest zero -:::::>>type=TEXT:::::>>io.kotest.core.spec.style.scopes.ExpectSpecContainerContext.expect(test one)#1:::::>> -kotest one -:::::>>type=TEXT:::::>>io.kotest.core.spec.style.scopes.ExpectSpecContainerContext.expect(test two)#0:::::>> -kotest 2 -:::::>>type=TEXT:::::>>io.kotest.core.spec.style.scopes.ExpectSpecContainerScope.expect(test one)#0:::::>> -kotest zero -:::::>>type=TEXT:::::>>io.kotest.core.spec.style.scopes.ExpectSpecContainerScope.expect(test one)#1:::::>> -kotest one -:::::>>type=TEXT:::::>>io.kotest.core.spec.style.scopes.ExpectSpecContainerScope.expect(test two)#0:::::>> -kotest 2 -:::::>>:::::>>:::::>> diff --git a/sandbox/src/jvmTest/kotlin/kotest/__klips__/JvmFeatureSpec.kt.klip b/sandbox/src/jvmTest/kotlin/kotest/__klips__/JvmFeatureSpec.kt.klip deleted file mode 100644 index 7bccc0bc..00000000 --- a/sandbox/src/jvmTest/kotlin/kotest/__klips__/JvmFeatureSpec.kt.klip +++ /dev/null @@ -1,14 +0,0 @@ -:::::>> KLIPS :::::>> -:::::>>type=TEXT:::::>>io.kotest.core.spec.style.scopes.FeatureSpecContainerContext.scenario(test one)#0:::::>> -kotest zero -:::::>>type=TEXT:::::>>io.kotest.core.spec.style.scopes.FeatureSpecContainerContext.scenario(test one)#1:::::>> -kotest one -:::::>>type=TEXT:::::>>io.kotest.core.spec.style.scopes.FeatureSpecContainerContext.scenario(test two)#0:::::>> -kotest 2 -:::::>>type=TEXT:::::>>io.kotest.core.spec.style.scopes.FeatureSpecContainerScope.scenario(test one)#0:::::>> -kotest zero -:::::>>type=TEXT:::::>>io.kotest.core.spec.style.scopes.FeatureSpecContainerScope.scenario(test one)#1:::::>> -kotest one -:::::>>type=TEXT:::::>>io.kotest.core.spec.style.scopes.FeatureSpecContainerScope.scenario(test two)#0:::::>> -kotest 2 -:::::>>:::::>>:::::>> diff --git a/sandbox/src/jvmTest/kotlin/kotest/__klips__/JvmFreeSpec.kt.klip b/sandbox/src/jvmTest/kotlin/kotest/__klips__/JvmFreeSpec.kt.klip deleted file mode 100644 index b1db8872..00000000 --- a/sandbox/src/jvmTest/kotlin/kotest/__klips__/JvmFreeSpec.kt.klip +++ /dev/null @@ -1,14 +0,0 @@ -:::::>> KLIPS :::::>> -:::::>>type=TEXT:::::>>io.kotest.core.spec.style.scopes.FreeSpecContainerContext.invoke(test one)#0:::::>> -kotest zero -:::::>>type=TEXT:::::>>io.kotest.core.spec.style.scopes.FreeSpecContainerContext.invoke(test one)#1:::::>> -kotest one -:::::>>type=TEXT:::::>>io.kotest.core.spec.style.scopes.FreeSpecContainerContext.invoke(test two)#0:::::>> -kotest 2 -:::::>>type=TEXT:::::>>io.kotest.core.spec.style.scopes.FreeSpecContainerScope.invoke(test one)#0:::::>> -kotest zero -:::::>>type=TEXT:::::>>io.kotest.core.spec.style.scopes.FreeSpecContainerScope.invoke(test one)#1:::::>> -kotest one -:::::>>type=TEXT:::::>>io.kotest.core.spec.style.scopes.FreeSpecContainerScope.invoke(test two)#0:::::>> -kotest 2 -:::::>>:::::>>:::::>> diff --git a/sandbox/src/jvmTest/kotlin/kotest/__klips__/JvmFunSpec.kt.klip b/sandbox/src/jvmTest/kotlin/kotest/__klips__/JvmFunSpec.kt.klip deleted file mode 100644 index ff16b320..00000000 --- a/sandbox/src/jvmTest/kotlin/kotest/__klips__/JvmFunSpec.kt.klip +++ /dev/null @@ -1,8 +0,0 @@ -:::::>> KLIPS :::::>> -:::::>>type=TEXT:::::>>io.kotest.core.spec.style.FunSpec.test(test one)#0:::::>> -kotest zero -:::::>>type=TEXT:::::>>io.kotest.core.spec.style.FunSpec.test(test one)#1:::::>> -kotest one -:::::>>type=TEXT:::::>>io.kotest.core.spec.style.FunSpec.test(test two)#0:::::>> -kotest 2 -:::::>>:::::>>:::::>> diff --git a/sandbox/src/jvmTest/kotlin/kotest/__klips__/JvmWordSpec.kt.klip b/sandbox/src/jvmTest/kotlin/kotest/__klips__/JvmWordSpec.kt.klip deleted file mode 100644 index 12166752..00000000 --- a/sandbox/src/jvmTest/kotlin/kotest/__klips__/JvmWordSpec.kt.klip +++ /dev/null @@ -1,14 +0,0 @@ -:::::>> KLIPS :::::>> -:::::>>type=TEXT:::::>>io.kotest.core.spec.style.scopes.WordSpecShouldContainerContext.invoke(test one)#0:::::>> -kotest zero -:::::>>type=TEXT:::::>>io.kotest.core.spec.style.scopes.WordSpecShouldContainerContext.invoke(test one)#1:::::>> -kotest one -:::::>>type=TEXT:::::>>io.kotest.core.spec.style.scopes.WordSpecShouldContainerContext.invoke(test two)#0:::::>> -kotest 2 -:::::>>type=TEXT:::::>>io.kotest.core.spec.style.scopes.WordSpecShouldContainerScope.invoke(test one)#0:::::>> -kotest zero -:::::>>type=TEXT:::::>>io.kotest.core.spec.style.scopes.WordSpecShouldContainerScope.invoke(test one)#1:::::>> -kotest one -:::::>>type=TEXT:::::>>io.kotest.core.spec.style.scopes.WordSpecShouldContainerScope.invoke(test two)#0:::::>> -kotest 2 -:::::>>:::::>>:::::>> diff --git a/sandbox/src/linuxArm32HfpTest/kotlin/LinuxArm32HfpTest.kt b/sandbox/src/linuxArm32HfpTest/kotlin/LinuxArm32HfpTest.kt deleted file mode 100644 index 052bf883..00000000 --- a/sandbox/src/linuxArm32HfpTest/kotlin/LinuxArm32HfpTest.kt +++ /dev/null @@ -1,18 +0,0 @@ -package sandbox.test - -import dev.petuska.klip.api.assertKlip -import dev.petuska.klip.api.assertMatchesKlip -import kotlin.test.Test - -class LinuxArm32HfpTest { - @Test - fun test() { - assertMatchesKlip("zero") - assertMatchesKlip("one") - } - - @Test - fun test1() { - "2".assertKlip() - } -} diff --git a/sandbox/src/linuxArm32HfpTest/kotlin/__klips__/LinuxArm32HfpTest.kt.klip b/sandbox/src/linuxArm32HfpTest/kotlin/__klips__/LinuxArm32HfpTest.kt.klip deleted file mode 100644 index a35b7931..00000000 --- a/sandbox/src/linuxArm32HfpTest/kotlin/__klips__/LinuxArm32HfpTest.kt.klip +++ /dev/null @@ -1,8 +0,0 @@ -:::::>> KLIPS :::::>> -:::::>>type=TEXT:::::>>sandbox.test.LinuxArm32HfpTest.test#0:::::>> -zero -:::::>>type=TEXT:::::>>sandbox.test.LinuxArm32HfpTest.test#1:::::>> -one -:::::>>type=TEXT:::::>>sandbox.test.LinuxArm32HfpTest.test1#0:::::>> -2 -:::::>>:::::>>:::::>> diff --git a/sandbox/src/linuxArm64Test/kotlin/LinuxArm64Test.kt b/sandbox/src/linuxArm64Test/kotlin/LinuxArm64Test.kt deleted file mode 100644 index 1f720db8..00000000 --- a/sandbox/src/linuxArm64Test/kotlin/LinuxArm64Test.kt +++ /dev/null @@ -1,18 +0,0 @@ -package sandbox.test - -import dev.petuska.klip.api.assertKlip -import dev.petuska.klip.api.assertMatchesKlip -import kotlin.test.Test - -class LinuxArm64Test { - @Test - fun test() { - assertMatchesKlip("zero") - assertMatchesKlip("one") - } - - @Test - fun test1() { - "2".assertKlip() - } -} diff --git a/sandbox/src/linuxArm64Test/kotlin/__klips__/LinuxArm64Test.kt.klip b/sandbox/src/linuxArm64Test/kotlin/__klips__/LinuxArm64Test.kt.klip deleted file mode 100644 index e2ad3634..00000000 --- a/sandbox/src/linuxArm64Test/kotlin/__klips__/LinuxArm64Test.kt.klip +++ /dev/null @@ -1,8 +0,0 @@ -:::::>> KLIPS :::::>> -:::::>>type=TEXT:::::>>sandbox.test.LinuxArm64Test.test#0:::::>> -zero -:::::>>type=TEXT:::::>>sandbox.test.LinuxArm64Test.test#1:::::>> -one -:::::>>type=TEXT:::::>>sandbox.test.LinuxArm64Test.test1#0:::::>> -2 -:::::>>:::::>>:::::>> diff --git a/sandbox/src/linuxMips32Test/kotlin/LinuxMips32Test.kt b/sandbox/src/linuxMips32Test/kotlin/LinuxMips32Test.kt deleted file mode 100644 index 1df69c16..00000000 --- a/sandbox/src/linuxMips32Test/kotlin/LinuxMips32Test.kt +++ /dev/null @@ -1,18 +0,0 @@ -package sandbox.test - -import dev.petuska.klip.api.assertKlip -import dev.petuska.klip.api.assertMatchesKlip -import kotlin.test.Test - -class LinuxMips32Test { - @Test - fun test() { - assertMatchesKlip("zero") - assertMatchesKlip("one") - } - - @Test - fun test1() { - "2".assertKlip() - } -} diff --git a/sandbox/src/linuxMips32Test/kotlin/__klips__/LinuxMips32Test.kt.klip b/sandbox/src/linuxMips32Test/kotlin/__klips__/LinuxMips32Test.kt.klip deleted file mode 100644 index 7c54fba3..00000000 --- a/sandbox/src/linuxMips32Test/kotlin/__klips__/LinuxMips32Test.kt.klip +++ /dev/null @@ -1,8 +0,0 @@ -:::::>> KLIPS :::::>> -:::::>>type=TEXT:::::>>sandbox.test.LinuxMips32Test.test#0:::::>> -zero -:::::>>type=TEXT:::::>>sandbox.test.LinuxMips32Test.test#1:::::>> -one -:::::>>type=TEXT:::::>>sandbox.test.LinuxMips32Test.test1#0:::::>> -2 -:::::>>:::::>>:::::>> diff --git a/sandbox/src/linuxMipsel32Test/kotlin/LinuxMipsel32Test.kt b/sandbox/src/linuxMipsel32Test/kotlin/LinuxMipsel32Test.kt deleted file mode 100644 index 766b6438..00000000 --- a/sandbox/src/linuxMipsel32Test/kotlin/LinuxMipsel32Test.kt +++ /dev/null @@ -1,18 +0,0 @@ -package sandbox.test - -import dev.petuska.klip.api.assertKlip -import dev.petuska.klip.api.assertMatchesKlip -import kotlin.test.Test - -class LinuxMipsel32Test { - @Test - fun test() { - assertMatchesKlip("zero") - assertMatchesKlip("one") - } - - @Test - fun test1() { - "2".assertKlip() - } -} diff --git a/sandbox/src/linuxMipsel32Test/kotlin/__klips__/LinuxMipsel32Test.kt.klip b/sandbox/src/linuxMipsel32Test/kotlin/__klips__/LinuxMipsel32Test.kt.klip deleted file mode 100644 index e2303d09..00000000 --- a/sandbox/src/linuxMipsel32Test/kotlin/__klips__/LinuxMipsel32Test.kt.klip +++ /dev/null @@ -1,8 +0,0 @@ -:::::>> KLIPS :::::>> -:::::>>type=TEXT:::::>>sandbox.test.LinuxMipsel32Test.test#0:::::>> -zero -:::::>>type=TEXT:::::>>sandbox.test.LinuxMipsel32Test.test#1:::::>> -one -:::::>>type=TEXT:::::>>sandbox.test.LinuxMipsel32Test.test1#0:::::>> -2 -:::::>>:::::>>:::::>> diff --git a/sandbox/src/linuxX64Test/kotlin/LinuxX64Test.kt b/sandbox/src/linuxX64Test/kotlin/LinuxX64Test.kt deleted file mode 100644 index 1e5181fb..00000000 --- a/sandbox/src/linuxX64Test/kotlin/LinuxX64Test.kt +++ /dev/null @@ -1,18 +0,0 @@ -package sandbox.test - -import dev.petuska.klip.api.assertKlip -import dev.petuska.klip.api.assertMatchesKlip -import kotlin.test.Test - -class LinuxX64Test { - @Test - fun test() { - assertMatchesKlip("zero") - assertMatchesKlip("one") - } - - @Test - fun test1() { - "2".assertKlip() - } -} diff --git a/sandbox/src/linuxX64Test/kotlin/__klips__/LinuxX64Test.kt.klip b/sandbox/src/linuxX64Test/kotlin/__klips__/LinuxX64Test.kt.klip deleted file mode 100644 index ca6e648f..00000000 --- a/sandbox/src/linuxX64Test/kotlin/__klips__/LinuxX64Test.kt.klip +++ /dev/null @@ -1,8 +0,0 @@ -:::::>> KLIPS :::::>> -:::::>>type=TEXT:::::>>sandbox.test.LinuxX64Test.test#0:::::>> -zero -:::::>>type=TEXT:::::>>sandbox.test.LinuxX64Test.test#1:::::>> -one -:::::>>type=TEXT:::::>>sandbox.test.LinuxX64Test.test1#0:::::>> -2 -:::::>>:::::>>:::::>> diff --git a/sandbox/src/macosArm64Test/kotlin/MacosArm64Test.kt b/sandbox/src/macosArm64Test/kotlin/MacosArm64Test.kt deleted file mode 100644 index 616d9129..00000000 --- a/sandbox/src/macosArm64Test/kotlin/MacosArm64Test.kt +++ /dev/null @@ -1,18 +0,0 @@ -package sandbox.test - -import dev.petuska.klip.api.assertKlip -import dev.petuska.klip.api.assertMatchesKlip -import kotlin.test.Test - -class MacosArm64Test { - @Test - fun test() { - assertMatchesKlip("zero") - assertMatchesKlip("one") - } - - @Test - fun test1() { - "2".assertKlip() - } -} diff --git a/sandbox/src/macosArm64Test/kotlin/__klips__/MacosArm64Test.kt.klip b/sandbox/src/macosArm64Test/kotlin/__klips__/MacosArm64Test.kt.klip deleted file mode 100644 index caa90522..00000000 --- a/sandbox/src/macosArm64Test/kotlin/__klips__/MacosArm64Test.kt.klip +++ /dev/null @@ -1,8 +0,0 @@ -:::::>> KLIPS :::::>> -:::::>>type=TEXT:::::>>sandbox.test.MacosArm64Test.test#0:::::>> -zero -:::::>>type=TEXT:::::>>sandbox.test.MacosArm64Test.test#1:::::>> -one -:::::>>type=TEXT:::::>>sandbox.test.MacosArm64Test.test1#0:::::>> -2 -:::::>>:::::>>:::::>> diff --git a/sandbox/src/macosX64Test/kotlin/MacosX64Test.kt b/sandbox/src/macosX64Test/kotlin/MacosX64Test.kt deleted file mode 100644 index 052c71e0..00000000 --- a/sandbox/src/macosX64Test/kotlin/MacosX64Test.kt +++ /dev/null @@ -1,18 +0,0 @@ -package sandbox.test - -import dev.petuska.klip.api.assertKlip -import dev.petuska.klip.api.assertMatchesKlip -import kotlin.test.Test - -class MacosX64Test { - @Test - fun test() { - assertMatchesKlip("zero") - assertMatchesKlip("one") - } - - @Test - fun test1() { - "2".assertKlip() - } -} diff --git a/sandbox/src/macosX64Test/kotlin/__klips__/MacosX64Test.kt.klip b/sandbox/src/macosX64Test/kotlin/__klips__/MacosX64Test.kt.klip deleted file mode 100644 index caaa4d1b..00000000 --- a/sandbox/src/macosX64Test/kotlin/__klips__/MacosX64Test.kt.klip +++ /dev/null @@ -1,8 +0,0 @@ -:::::>> KLIPS :::::>> -:::::>>type=TEXT:::::>>sandbox.test.MacosX64Test.test#0:::::>> -zero -:::::>>type=TEXT:::::>>sandbox.test.MacosX64Test.test#1:::::>> -one -:::::>>type=TEXT:::::>>sandbox.test.MacosX64Test.test1#0:::::>> -2 -:::::>>:::::>>:::::>> diff --git a/sandbox/src/mingwX64Test/kotlin/MingwX64Test.kt b/sandbox/src/mingwX64Test/kotlin/MingwX64Test.kt deleted file mode 100644 index 71a26113..00000000 --- a/sandbox/src/mingwX64Test/kotlin/MingwX64Test.kt +++ /dev/null @@ -1,18 +0,0 @@ -package sandbox.test - -import dev.petuska.klip.api.assertKlip -import dev.petuska.klip.api.assertMatchesKlip -import kotlin.test.Test - -class MingwX64Test { - @Test - fun test() { - assertMatchesKlip("zero") - assertMatchesKlip("one") - } - - @Test - fun test1() { - "2".assertKlip() - } -} diff --git a/sandbox/src/mingwX64Test/kotlin/__klips__/MingwX64Test.kt.klip b/sandbox/src/mingwX64Test/kotlin/__klips__/MingwX64Test.kt.klip deleted file mode 100644 index a0324c06..00000000 --- a/sandbox/src/mingwX64Test/kotlin/__klips__/MingwX64Test.kt.klip +++ /dev/null @@ -1,8 +0,0 @@ -:::::>> KLIPS :::::>> -:::::>>type=TEXT:::::>>sandbox.test.MingwX64Test.test#0:::::>> -zero -:::::>>type=TEXT:::::>>sandbox.test.MingwX64Test.test#1:::::>> -one -:::::>>type=TEXT:::::>>sandbox.test.MingwX64Test.test1#0:::::>> -2 -:::::>>:::::>>:::::>> diff --git a/sandbox/src/mingwX86Test/kotlin/MingwX86Test.kt b/sandbox/src/mingwX86Test/kotlin/MingwX86Test.kt deleted file mode 100644 index bba4747b..00000000 --- a/sandbox/src/mingwX86Test/kotlin/MingwX86Test.kt +++ /dev/null @@ -1,18 +0,0 @@ -package sandbox.test - -import dev.petuska.klip.api.assertKlip -import dev.petuska.klip.api.assertMatchesKlip -import kotlin.test.Test - -class MingwX86Test { - @Test - fun test() { - assertMatchesKlip("zero") - assertMatchesKlip("one") - } - - @Test - fun test1() { - "2".assertKlip() - } -} diff --git a/sandbox/src/mingwX86Test/kotlin/__klips__/MingwX86Test.kt.klip b/sandbox/src/mingwX86Test/kotlin/__klips__/MingwX86Test.kt.klip deleted file mode 100644 index acfd1849..00000000 --- a/sandbox/src/mingwX86Test/kotlin/__klips__/MingwX86Test.kt.klip +++ /dev/null @@ -1,8 +0,0 @@ -:::::>> KLIPS :::::>> -:::::>>type=TEXT:::::>>sandbox.test.MingwX86Test.test#0:::::>> -zero -:::::>>type=TEXT:::::>>sandbox.test.MingwX86Test.test#1:::::>> -one -:::::>>type=TEXT:::::>>sandbox.test.MingwX86Test.test1#0:::::>> -2 -:::::>>:::::>>:::::>> diff --git a/sandbox/src/tvosArm64Test/kotlin/TvosArm64Test.kt b/sandbox/src/tvosArm64Test/kotlin/TvosArm64Test.kt deleted file mode 100644 index 4f27a866..00000000 --- a/sandbox/src/tvosArm64Test/kotlin/TvosArm64Test.kt +++ /dev/null @@ -1,18 +0,0 @@ -package sandbox.test - -import dev.petuska.klip.api.assertKlip -import dev.petuska.klip.api.assertMatchesKlip -import kotlin.test.Test - -class TvosArm64Test { - @Test - fun test() { - assertMatchesKlip("zero") - assertMatchesKlip("one") - } - - @Test - fun test1() { - "2".assertKlip() - } -} diff --git a/sandbox/src/tvosArm64Test/kotlin/__klips__/TvosArm64Test.kt.klip b/sandbox/src/tvosArm64Test/kotlin/__klips__/TvosArm64Test.kt.klip deleted file mode 100644 index 13b7600f..00000000 --- a/sandbox/src/tvosArm64Test/kotlin/__klips__/TvosArm64Test.kt.klip +++ /dev/null @@ -1,8 +0,0 @@ -:::::>> KLIPS :::::>> -:::::>>type=TEXT:::::>>sandbox.test.TvosArm64Test.test#0:::::>> -zero -:::::>>type=TEXT:::::>>sandbox.test.TvosArm64Test.test#1:::::>> -one -:::::>>type=TEXT:::::>>sandbox.test.TvosArm64Test.test1#0:::::>> -2 -:::::>>:::::>>:::::>> diff --git a/sandbox/src/tvosSimulatorArm64Test/kotlin/TvosSimulatorArm64Test.kt b/sandbox/src/tvosSimulatorArm64Test/kotlin/TvosSimulatorArm64Test.kt deleted file mode 100644 index 7a7c7381..00000000 --- a/sandbox/src/tvosSimulatorArm64Test/kotlin/TvosSimulatorArm64Test.kt +++ /dev/null @@ -1,18 +0,0 @@ -package sandbox.test - -import dev.petuska.klip.api.assertKlip -import dev.petuska.klip.api.assertMatchesKlip -import kotlin.test.Test - -class TvosSimulatorArm64Test { - @Test - fun test() { - assertMatchesKlip("zero") - assertMatchesKlip("one") - } - - @Test - fun test1() { - "2".assertKlip() - } -} diff --git a/sandbox/src/tvosSimulatorArm64Test/kotlin/__klips__/TvosSimulatorArm64Test.kt.klip b/sandbox/src/tvosSimulatorArm64Test/kotlin/__klips__/TvosSimulatorArm64Test.kt.klip deleted file mode 100644 index a2e03565..00000000 --- a/sandbox/src/tvosSimulatorArm64Test/kotlin/__klips__/TvosSimulatorArm64Test.kt.klip +++ /dev/null @@ -1,8 +0,0 @@ -:::::>> KLIPS :::::>> -:::::>>type=TEXT:::::>>sandbox.test.TvosSimulatorArm64Test.test#0:::::>> -zero -:::::>>type=TEXT:::::>>sandbox.test.TvosSimulatorArm64Test.test#1:::::>> -one -:::::>>type=TEXT:::::>>sandbox.test.TvosSimulatorArm64Test.test1#0:::::>> -2 -:::::>>:::::>>:::::>> diff --git a/sandbox/src/tvosX64Test/kotlin/TvosX64Test.kt b/sandbox/src/tvosX64Test/kotlin/TvosX64Test.kt deleted file mode 100644 index 48af3f7f..00000000 --- a/sandbox/src/tvosX64Test/kotlin/TvosX64Test.kt +++ /dev/null @@ -1,18 +0,0 @@ -package sandbox.test - -import dev.petuska.klip.api.assertKlip -import dev.petuska.klip.api.assertMatchesKlip -import kotlin.test.Test - -class TvosX64Test { - @Test - fun test() { - assertMatchesKlip("zero") - assertMatchesKlip("one") - } - - @Test - fun test1() { - "2".assertKlip() - } -} diff --git a/sandbox/src/tvosX64Test/kotlin/__klips__/TvosX64Test.kt.klip b/sandbox/src/tvosX64Test/kotlin/__klips__/TvosX64Test.kt.klip deleted file mode 100644 index 6790ad50..00000000 --- a/sandbox/src/tvosX64Test/kotlin/__klips__/TvosX64Test.kt.klip +++ /dev/null @@ -1,8 +0,0 @@ -:::::>> KLIPS :::::>> -:::::>>type=TEXT:::::>>sandbox.test.TvosX64Test.test#0:::::>> -zero -:::::>>type=TEXT:::::>>sandbox.test.TvosX64Test.test#1:::::>> -one -:::::>>type=TEXT:::::>>sandbox.test.TvosX64Test.test1#0:::::>> -2 -:::::>>:::::>>:::::>> diff --git a/sandbox/src/watchosArm32Test/kotlin/WatchosArm32Test.kt b/sandbox/src/watchosArm32Test/kotlin/WatchosArm32Test.kt deleted file mode 100644 index f959d677..00000000 --- a/sandbox/src/watchosArm32Test/kotlin/WatchosArm32Test.kt +++ /dev/null @@ -1,18 +0,0 @@ -package sandbox.test - -import dev.petuska.klip.api.assertKlip -import dev.petuska.klip.api.assertMatchesKlip -import kotlin.test.Test - -class WatchosArm32Test { - @Test - fun test() { - assertMatchesKlip("zero") - assertMatchesKlip("one") - } - - @Test - fun test1() { - "2".assertKlip() - } -} diff --git a/sandbox/src/watchosArm32Test/kotlin/__klips__/WatchosArm32Test.kt.klip b/sandbox/src/watchosArm32Test/kotlin/__klips__/WatchosArm32Test.kt.klip deleted file mode 100644 index ecdf294a..00000000 --- a/sandbox/src/watchosArm32Test/kotlin/__klips__/WatchosArm32Test.kt.klip +++ /dev/null @@ -1,8 +0,0 @@ -:::::>> KLIPS :::::>> -:::::>>type=TEXT:::::>>sandbox.test.WatchosArm32Test.test#0:::::>> -zero -:::::>>type=TEXT:::::>>sandbox.test.WatchosArm32Test.test#1:::::>> -one -:::::>>type=TEXT:::::>>sandbox.test.WatchosArm32Test.test1#0:::::>> -2 -:::::>>:::::>>:::::>> diff --git a/sandbox/src/watchosArm64Test/kotlin/WatchosArm64Test.kt b/sandbox/src/watchosArm64Test/kotlin/WatchosArm64Test.kt deleted file mode 100644 index 4d60dce0..00000000 --- a/sandbox/src/watchosArm64Test/kotlin/WatchosArm64Test.kt +++ /dev/null @@ -1,18 +0,0 @@ -package sandbox.test - -import dev.petuska.klip.api.assertKlip -import dev.petuska.klip.api.assertMatchesKlip -import kotlin.test.Test - -class WatchosArm64Test { - @Test - fun test() { - assertMatchesKlip("zero") - assertMatchesKlip("one") - } - - @Test - fun test1() { - "2".assertKlip() - } -} diff --git a/sandbox/src/watchosArm64Test/kotlin/__klips__/WatchosArm64Test.kt.klip b/sandbox/src/watchosArm64Test/kotlin/__klips__/WatchosArm64Test.kt.klip deleted file mode 100644 index 4924ec5b..00000000 --- a/sandbox/src/watchosArm64Test/kotlin/__klips__/WatchosArm64Test.kt.klip +++ /dev/null @@ -1,8 +0,0 @@ -:::::>> KLIPS :::::>> -:::::>>type=TEXT:::::>>sandbox.test.WatchosArm64Test.test#0:::::>> -zero -:::::>>type=TEXT:::::>>sandbox.test.WatchosArm64Test.test#1:::::>> -one -:::::>>type=TEXT:::::>>sandbox.test.WatchosArm64Test.test1#0:::::>> -2 -:::::>>:::::>>:::::>> diff --git a/sandbox/src/watchosSimulatorArm64Test/kotlin/WatchosSimulatorArm64Test.kt b/sandbox/src/watchosSimulatorArm64Test/kotlin/WatchosSimulatorArm64Test.kt deleted file mode 100644 index 12e5e621..00000000 --- a/sandbox/src/watchosSimulatorArm64Test/kotlin/WatchosSimulatorArm64Test.kt +++ /dev/null @@ -1,18 +0,0 @@ -package sandbox.test - -import dev.petuska.klip.api.assertKlip -import dev.petuska.klip.api.assertMatchesKlip -import kotlin.test.Test - -class WatchosSimulatorArm64Test { - @Test - fun test() { - assertMatchesKlip("zero") - assertMatchesKlip("one") - } - - @Test - fun test1() { - "2".assertKlip() - } -} diff --git a/sandbox/src/watchosSimulatorArm64Test/kotlin/__klips__/WatchosSimulatorArm64Test.kt.klip b/sandbox/src/watchosSimulatorArm64Test/kotlin/__klips__/WatchosSimulatorArm64Test.kt.klip deleted file mode 100644 index 6cb0d4ae..00000000 --- a/sandbox/src/watchosSimulatorArm64Test/kotlin/__klips__/WatchosSimulatorArm64Test.kt.klip +++ /dev/null @@ -1,8 +0,0 @@ -:::::>> KLIPS :::::>> -:::::>>type=TEXT:::::>>sandbox.test.WatchosSimulatorArm64Test.test#0:::::>> -zero -:::::>>type=TEXT:::::>>sandbox.test.WatchosSimulatorArm64Test.test#1:::::>> -one -:::::>>type=TEXT:::::>>sandbox.test.WatchosSimulatorArm64Test.test1#0:::::>> -2 -:::::>>:::::>>:::::>> diff --git a/sandbox/src/watchosX64Test/kotlin/WatchosX64Test.kt b/sandbox/src/watchosX64Test/kotlin/WatchosX64Test.kt deleted file mode 100644 index 49284051..00000000 --- a/sandbox/src/watchosX64Test/kotlin/WatchosX64Test.kt +++ /dev/null @@ -1,18 +0,0 @@ -package sandbox.test - -import dev.petuska.klip.api.assertKlip -import dev.petuska.klip.api.assertMatchesKlip -import kotlin.test.Test - -class WatchosX64Test { - @Test - fun test() { - assertMatchesKlip("zero") - assertMatchesKlip("one") - } - - @Test - fun test1() { - "2".assertKlip() - } -} diff --git a/sandbox/src/watchosX64Test/kotlin/__klips__/WatchosX64Test.kt.klip b/sandbox/src/watchosX64Test/kotlin/__klips__/WatchosX64Test.kt.klip deleted file mode 100644 index 49e53bae..00000000 --- a/sandbox/src/watchosX64Test/kotlin/__klips__/WatchosX64Test.kt.klip +++ /dev/null @@ -1,8 +0,0 @@ -:::::>> KLIPS :::::>> -:::::>>type=TEXT:::::>>sandbox.test.WatchosX64Test.test#0:::::>> -zero -:::::>>type=TEXT:::::>>sandbox.test.WatchosX64Test.test#1:::::>> -one -:::::>>type=TEXT:::::>>sandbox.test.WatchosX64Test.test1#0:::::>> -2 -:::::>>:::::>>:::::>> diff --git a/sandbox/src/watchosX86Test/kotlin/WatchosX86Test.kt b/sandbox/src/watchosX86Test/kotlin/WatchosX86Test.kt deleted file mode 100644 index fae8189a..00000000 --- a/sandbox/src/watchosX86Test/kotlin/WatchosX86Test.kt +++ /dev/null @@ -1,18 +0,0 @@ -package sandbox.test - -import dev.petuska.klip.api.assertKlip -import dev.petuska.klip.api.assertMatchesKlip -import kotlin.test.Test - -class WatchosX86Test { - @Test - fun test() { - assertMatchesKlip("zero") - assertMatchesKlip("one") - } - - @Test - fun test1() { - "2".assertKlip() - } -} diff --git a/sandbox/src/watchosX86Test/kotlin/__klips__/WatchosX86Test.kt.klip b/sandbox/src/watchosX86Test/kotlin/__klips__/WatchosX86Test.kt.klip deleted file mode 100644 index c7c6ada6..00000000 --- a/sandbox/src/watchosX86Test/kotlin/__klips__/WatchosX86Test.kt.klip +++ /dev/null @@ -1,8 +0,0 @@ -:::::>> KLIPS :::::>> -:::::>>type=TEXT:::::>>sandbox.test.WatchosX86Test.test#0:::::>> -zero -:::::>>type=TEXT:::::>>sandbox.test.WatchosX86Test.test#1:::::>> -one -:::::>>type=TEXT:::::>>sandbox.test.WatchosX86Test.test1#0:::::>> -2 -:::::>>:::::>>:::::>> diff --git a/sandbox/versions.properties b/sandbox/versions.properties deleted file mode 120000 index fb038ece..00000000 --- a/sandbox/versions.properties +++ /dev/null @@ -1 +0,0 @@ -../versions.properties \ No newline at end of file diff --git a/sandbox/versions.rules b/sandbox/versions.rules deleted file mode 120000 index 8968a088..00000000 --- a/sandbox/versions.rules +++ /dev/null @@ -1 +0,0 @@ -../versions.rules \ No newline at end of file diff --git a/scripts/setupMingw.sh b/scripts/setupMingw.sh index 11d4e37a..00422421 100755 --- a/scripts/setupMingw.sh +++ b/scripts/setupMingw.sh @@ -1,3 +1,4 @@ #!/usr/bin/env bash -echo "Not needed yet!" \ No newline at end of file +#pacman -Sy curl mingw-w64-x86_64-curl +echo "Done" diff --git a/scripts/setupOSX.sh b/scripts/setupOSX.sh index 11d4e37a..89593587 100755 --- a/scripts/setupOSX.sh +++ b/scripts/setupOSX.sh @@ -1,3 +1,3 @@ #!/usr/bin/env bash -echo "Not needed yet!" \ No newline at end of file +echo "Done" diff --git a/scripts/setupUbuntu.sh b/scripts/setupUbuntu.sh index 11d4e37a..14e0b9cd 100755 --- a/scripts/setupUbuntu.sh +++ b/scripts/setupUbuntu.sh @@ -1,3 +1,5 @@ #!/usr/bin/env bash -echo "Not needed yet!" \ No newline at end of file +sudo apt -y update +sudo apt -y install curl libcurl4-openssl-dev +echo "Done" diff --git a/settings.gradle.kts b/settings.gradle.kts index 576ae396..caa1200c 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,23 +1,31 @@ pluginManagement { repositories { gradlePluginPortal() + mavenCentral() google() + maven("https://maven.pkg.jetbrains.space/public/p/compose/dev") } } plugins { - id("de.fayard.refreshVersions") version "0.23.0" - id("com.gradle.enterprise") version "3.7.2" + id("de.fayard.refreshVersions") version "0.40.2" + id("com.gradle.enterprise") version "3.10.2" } -refreshVersions { extraArtifactVersionKeyRules(file("versions.rules")) } +refreshVersions { + versionsPropertiesFile = rootDir.resolve("gradle/versions.properties") + extraArtifactVersionKeyRules(rootDir.resolve("gradle/versions.rules")) +} -rootProject.name = "klip" +includeBuild("build-conventions") +rootProject.name = "klip" include( - ":library:klip-core", - ":library:klip-api", - ":plugin:klip-gradle-plugin", - ":plugin:klip-kotlin-plugin", - ":plugin:klip-kotlin-plugin-native", + ":library:klip-api", + ":library:klip-core", + ":library:klip-runner", + ":library:klip-assertions", + ":plugin:klip-gradle-plugin", + ":plugin:klip-kotlin-plugin", + ":plugin:klip-kotlin-plugin-native", ) diff --git a/src/commonMain/kotlin/_.kt b/src/commonMain/kotlin/_.kt index e69de29b..86eba840 100644 --- a/src/commonMain/kotlin/_.kt +++ b/src/commonMain/kotlin/_.kt @@ -0,0 +1 @@ +@file:Suppress("EmptyKtFile") From 810c4727d68c4ef82c457c535d09d63124451964 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martynas=20Petu=C5=A1ka?= Date: Fri, 17 Jun 2022 19:48:25 +0100 Subject: [PATCH 4/6] INIT --- .github/workflows/release.yml | 3 ++- klip-sandbox/build.gradle.kts | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index fcaaf7b7..d3234af2 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -109,11 +109,12 @@ jobs: - uses: msys2/setup-msys2@v2 if: ${{ matrix.repository.enabled == true && runner.os == 'Windows' }} with: + release: false msystem: MINGW64 update: true path-type: inherit install: >- - mingw-w64-curl + mingw-w64-x86_64-curl curl - name: Restore native cache diff --git a/klip-sandbox/build.gradle.kts b/klip-sandbox/build.gradle.kts index e99d7463..d8162209 100644 --- a/klip-sandbox/build.gradle.kts +++ b/klip-sandbox/build.gradle.kts @@ -2,7 +2,7 @@ import util.withName plugins { id("convention.library-mpp") - id("dev.petuska.klip") version "0.0.4" + id("dev.petuska.klip") version "0.4.0" } gradleEnterprise { From 1ba722213442db4038a3983acf1f25e788ca1fc6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martynas=20Petu=C5=A1ka?= Date: Fri, 17 Jun 2022 21:10:17 +0100 Subject: [PATCH 5/6] INIT --- .github/workflows/release.yml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index d3234af2..c543ff6b 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -153,11 +153,6 @@ jobs: key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} restore-keys: ${{ runner.os }}-gradle- - - uses: actions/download-artifact@v3 - if: ${{ matrix.repository.enabled == true }} - with: - name: publications-${{ runner.os }} - - name: Resolve Version if: ${{ matrix.repository.enabled == true }} run: | From c5f9ec4f094486def6565acf5d3bd6727c512ff0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martynas=20Petu=C5=A1ka?= Date: Sat, 18 Jun 2022 14:10:45 +0100 Subject: [PATCH 6/6] INIT --- .../src/main/kotlin/convention.mpp.gradle.kts | 12 +++--- .../convention.publishing-mpp.gradle.kts | 17 +++----- .../main/kotlin/util/KotlinTargetDetails.kt | 39 +++++-------------- .../src/main/kotlin/util/targetGroup.kt | 25 ++++++------ gradle.properties | 2 +- library/klip-assertions/build.gradle.kts | 8 ++-- library/klip-core/build.gradle.kts | 12 +++--- library/klip-runner/build.gradle.kts | 8 ++-- 8 files changed, 52 insertions(+), 71 deletions(-) diff --git a/build-conventions/src/main/kotlin/convention.mpp.gradle.kts b/build-conventions/src/main/kotlin/convention.mpp.gradle.kts index 641b5d0f..9a0815eb 100644 --- a/build-conventions/src/main/kotlin/convention.mpp.gradle.kts +++ b/build-conventions/src/main/kotlin/convention.mpp.gradle.kts @@ -1,4 +1,4 @@ -import util.sharedTestDependencies +import util.sharedTest import util.targetGroup plugins { @@ -70,10 +70,12 @@ kotlin { implementation(kotlin("test-annotations-common")) } } - sharedTestDependencies { -// implementation("io.kotest:kotest-assertions-core:_") -// implementation("io.kotest:kotest-property:_") - implementation("org.jetbrains.kotlinx:kotlinx-coroutines-test:_") + sharedTest { + dependencies { + implementation("io.kotest:kotest-assertions-core:_") + implementation("io.kotest:kotest-property:_") + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-test:_") + } } named("jsTest") { dependencies { diff --git a/build-conventions/src/main/kotlin/convention.publishing-mpp.gradle.kts b/build-conventions/src/main/kotlin/convention.publishing-mpp.gradle.kts index b5811205..9a51ad66 100644 --- a/build-conventions/src/main/kotlin/convention.publishing-mpp.gradle.kts +++ b/build-conventions/src/main/kotlin/convention.publishing-mpp.gradle.kts @@ -15,12 +15,12 @@ kotlin { publications { matching { it.name in this@onlyPublishIf.names }.all { val targetPublication = this@all - tasks.withType() - .matching { it.publication == targetPublication } - .all { onlyIf(enabled) } - tasks.withType() - .matching { it.publication.orNull == targetPublication } - .all { onlyIf(enabled) } + tasks { + withType() + .all { onlyIf { publication != targetPublication || enabled(this) } } + withType() + .all { onlyIf { publication.orNull != targetPublication || enabled(this) } } + } } } } @@ -32,11 +32,6 @@ kotlin { val osxHostTargets = nativeTargets.matching { it.konanTarget.buildHost == Family.OSX } val mainHostTargets = targets.matching { it !in nativeTargets } val androidTargets = targets.withType() - logger.info("Linux host targets: $linuxHostTargets") - logger.info("OSX host targets: $osxHostTargets") - logger.info("Windows host targets: $windowsHostTargets") - logger.info("Main host targets: $mainHostTargets") - logger.info("Android targets: $androidTargets") val mpp = objects.domainObjectContainer(Named::class.java) mpp.add(Named { "kotlinMultiplatform" }) diff --git a/build-conventions/src/main/kotlin/util/KotlinTargetDetails.kt b/build-conventions/src/main/kotlin/util/KotlinTargetDetails.kt index 3f10a9d3..50febc5e 100644 --- a/build-conventions/src/main/kotlin/util/KotlinTargetDetails.kt +++ b/build-conventions/src/main/kotlin/util/KotlinTargetDetails.kt @@ -4,35 +4,16 @@ import org.jetbrains.kotlin.konan.target.Family import org.jetbrains.kotlin.konan.target.KonanTarget val KonanTarget.buildHost: Family - get() = when (this) { - KonanTarget.WASM32, - KonanTarget.ANDROID_X64, - KonanTarget.ANDROID_X86, - KonanTarget.ANDROID_ARM32, - KonanTarget.ANDROID_ARM64, - KonanTarget.LINUX_ARM64, - KonanTarget.LINUX_ARM32_HFP, - KonanTarget.LINUX_MIPS32, - KonanTarget.LINUX_MIPSEL32, - KonanTarget.LINUX_X64 -> Family.LINUX + get() = when (family) { + Family.OSX, + Family.IOS, + Family.TVOS, + Family.WATCHOS -> Family.OSX - KonanTarget.MINGW_X86, - KonanTarget.MINGW_X64 -> Family.MINGW + Family.ANDROID, + Family.ZEPHYR, + Family.WASM, + Family.LINUX -> Family.LINUX - KonanTarget.IOS_ARM32, - KonanTarget.IOS_ARM64, - KonanTarget.IOS_X64, - KonanTarget.IOS_SIMULATOR_ARM64, - KonanTarget.WATCHOS_ARM32, - KonanTarget.WATCHOS_ARM64, - KonanTarget.WATCHOS_X86, - KonanTarget.WATCHOS_X64, - KonanTarget.WATCHOS_SIMULATOR_ARM64, - KonanTarget.TVOS_ARM64, - KonanTarget.TVOS_X64, - KonanTarget.TVOS_SIMULATOR_ARM64, - KonanTarget.MACOS_X64, - KonanTarget.MACOS_ARM64 -> Family.OSX - - is KonanTarget.ZEPHYR -> throw IllegalStateException("Target $this not supported") + Family.MINGW -> Family.MINGW } diff --git a/build-conventions/src/main/kotlin/util/targetGroup.kt b/build-conventions/src/main/kotlin/util/targetGroup.kt index a23dea6e..a643aa5b 100644 --- a/build-conventions/src/main/kotlin/util/targetGroup.kt +++ b/build-conventions/src/main/kotlin/util/targetGroup.kt @@ -5,7 +5,6 @@ import org.gradle.api.NamedDomainObjectContainer import org.gradle.kotlin.dsl.get import org.gradle.kotlin.dsl.invoke import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension -import org.jetbrains.kotlin.gradle.plugin.KotlinDependencyHandler import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet import org.jetbrains.kotlin.gradle.plugin.KotlinTarget @@ -32,29 +31,27 @@ fun NamedDomainObjectContainer.withName(name: String, action: A matching { it.name == name }.all(action) } -private fun NamedDomainObjectContainer.sharedDependencies( +private fun NamedDomainObjectContainer.sharedSourceSets( sourceSets: List, - action: Action, + action: Action, ) { sourceSets.forEach { - withName(it) { - dependencies { action.execute(this) } - } + withName(it, action) } } -fun NamedDomainObjectContainer.sharedMainDependencies(action: Action) { - sharedDependencies(listOf("sharedMain", "androidMain"), action) +fun NamedDomainObjectContainer.sharedMain(action: Action) { + sharedSourceSets(listOf("sharedMain", "androidMain"), action) } -fun NamedDomainObjectContainer.sharedTestDependencies(action: Action) { - sharedDependencies(listOf("sharedTest", "androidTest"), action) +fun NamedDomainObjectContainer.sharedTest(action: Action) { + sharedSourceSets(listOf("sharedTest", "androidTest"), action) } -fun NamedDomainObjectContainer.blockingMainDependencies(action: Action) { - sharedDependencies(listOf("blockingMain", "androidMain"), action) +fun NamedDomainObjectContainer.blockingMain(action: Action) { + sharedSourceSets(listOf("blockingMain", "androidMain"), action) } -fun NamedDomainObjectContainer.blockingTestDependencies(action: Action) { - sharedDependencies(listOf("blockingTest", "androidTest"), action) +fun NamedDomainObjectContainer.blockingTest(action: Action) { + sharedSourceSets(listOf("blockingTest", "androidTest"), action) } diff --git a/gradle.properties b/gradle.properties index 85065b7e..fd476d44 100644 --- a/gradle.properties +++ b/gradle.properties @@ -22,7 +22,7 @@ gh.owner.email=martynas@petuska.dev #======================================= Project ======================================== group=dev.petuska description=Kotlin Multiplatform test snapshots (klips) manager -version=0.0.0 +version=0.4.0-SNAPSHOT #======================================== Build ========================================= kotlin.js.test.browser=firefox-headless # linux | macos | windows diff --git a/library/klip-assertions/build.gradle.kts b/library/klip-assertions/build.gradle.kts index c1e37987..bf0e9b37 100644 --- a/library/klip-assertions/build.gradle.kts +++ b/library/klip-assertions/build.gradle.kts @@ -1,4 +1,4 @@ -import util.blockingMainDependencies +import util.blockingMain plugins { id("convention.library-mpp") @@ -16,8 +16,10 @@ kotlin { implementation(project(":library:klip-core")) } } - blockingMainDependencies { - implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:_") + blockingMain { + dependencies { + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:_") + } } } } diff --git a/library/klip-core/build.gradle.kts b/library/klip-core/build.gradle.kts index 2681622d..4b2b0616 100644 --- a/library/klip-core/build.gradle.kts +++ b/library/klip-core/build.gradle.kts @@ -1,4 +1,4 @@ -import util.sharedMainDependencies +import util.sharedMain plugins { kotlin("plugin.serialization") @@ -15,10 +15,12 @@ kotlin { api(project(":library:klip-api")) } } - sharedMainDependencies { - implementation("io.ktor:ktor-client-core:_") - implementation("io.ktor:ktor-serialization-kotlinx-json:_") - implementation("io.ktor:ktor-client-content-negotiation:_") + sharedMain { + dependencies { + implementation("io.ktor:ktor-client-core:_") + implementation("io.ktor:ktor-serialization-kotlinx-json:_") + implementation("io.ktor:ktor-client-content-negotiation:_") + } } configureEach { diff --git a/library/klip-runner/build.gradle.kts b/library/klip-runner/build.gradle.kts index 7ad299bf..5b39f94e 100644 --- a/library/klip-runner/build.gradle.kts +++ b/library/klip-runner/build.gradle.kts @@ -1,4 +1,4 @@ -import util.sharedMainDependencies +import util.sharedMain plugins { id("convention.library-mpp") @@ -9,8 +9,10 @@ description = "Kotlin multiplatform snapshot (klip) testing. Common test runner. kotlin { sourceSets { - sharedMainDependencies { - api("org.jetbrains.kotlinx:kotlinx-coroutines-test:_") + sharedMain { + dependencies { + api("org.jetbrains.kotlinx:kotlinx-coroutines-test:_") + } } named("stubMain") { dependencies {