diff --git a/.github/workflows/preview-build.yml b/.github/workflows/preview-build.yml index e8e47d5..c85e61d 100644 --- a/.github/workflows/preview-build.yml +++ b/.github/workflows/preview-build.yml @@ -1,4 +1,4 @@ -name: Build a preview plugin +name: Build preview shared lib plugins on: [ push, pull_request ] @@ -10,31 +10,49 @@ jobs: - name: Checkout master uses: actions/checkout@v4 + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + + - name: Clone actions/upload-artifact repo + run: git clone https://github.com/actions/upload-artifact.git + - name: Set up JDK 21 uses: actions/setup-java@v4 with: java-version: '21' distribution: 'zulu' - - name: Build with Gradle + - name: Build and upload plugins dynamically run: | chmod +x ./gradlew - ./gradlew :plugin:shadowJar - ./gradlew :plugin:compose-lib:shadowJar - - - name: Rename jar - run: | - mv "plugin/build/libs/plugin-all.jar" "plugin/build/libs/kotlinx-${{ github.sha }}.jar" - mv "plugin/compose-lib/build/libs/compose-lib-all.jar" "plugin/build/libs/kotlinx-compose-${{ github.sha }}.jar" - - - name: Upload artifact - uses: actions/upload-artifact@v4 - with: - name: kotlinx-shared-lib-plugin-${{ github.sha }} - path: plugin/build/libs/kotlinx-${{ github.sha }}.jar - - - name: Upload artifact (Compose) - uses: actions/upload-artifact@v4 - with: - name: kotlinx-compose-shared-lib-plugin-${{ github.sha }} - path: plugin/build/libs/kotlinx-compose-${{ github.sha }}.jar + + mkdir -p plugin/build/libs + for dir in plugin/*/; do + if [ -d "$dir" ]; then + dir_name=$(basename "$dir") + if [ "$dir_name" == "build" ]; then + continue + fi + + echo "Building $dir_name" + ./gradlew :plugin:"$dir_name":shadowJar + + output_dir="plugin/$dir_name/build/libs" + jar_file=$(ls $output_dir/*.jar | grep -E ".*-all\.jar$") + + if [ -z "$jar_file" ]; then + echo "No JAR file found in $output_dir for $dir_name" + exit 1 + fi + + base_name=$(basename "$jar_file" -all.jar) + new_name="plugin/build/libs/kotlinx-${base_name}-${GITHUB_SHA}.jar" + mv "$jar_file" "$new_name" + + echo "Uploading artifact $new_name" + artifact_name="${base_name}-${GITHUB_SHA}" + INPUT_NAME="$artifact_name" INPUT_PATH="$new_name" INPUT_OVERWRITE=false node upload-artifact/dist/upload/index.js + fi + done diff --git a/build.gradle.kts b/build.gradle.kts index 43f93c3..f4b66cf 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -7,12 +7,24 @@ plugins { alias(libs.plugins.gradleup.shadow) apply false } +version = libs.versions.allaymc.kotlinx.get() + subprojects { afterEvaluate { - kotlin.compilerOptions.freeCompilerArgs.addAll( - "-Xcontext-receivers", // https://kotlinlang.org/docs/whatsnew2020.html#phased-replacement-of-context-receivers-with-context-parameters - ) + runCatching { + kotlin { + sourceSets.all { // all is jvm :P + dependencies { + @Suppress("VulnerableLibrariesLocal", "RedundantSuppression") + compileOnly(libs.allaymc.api) + } + } + compilerOptions.freeCompilerArgs.addAll( + "-Xcontext-receivers", // https://kotlinlang.org/docs/whatsnew2020.html#phased-replacement-of-context-receivers-with-context-parameters + ) + } + } if (projectDir.resolve("src/main/resources/plugin.json").exists()) { val version = rootProject.libs.versions.allaymc.kotlinx.get() diff --git a/core/build.gradle.kts b/core/build.gradle.kts index d237be5..010aecd 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -1,7 +1,3 @@ plugins { alias(libs.plugins.kotlin.jvm) } - -dependencies { - compileOnly(libs.allaymc.api) -} diff --git a/example/build.gradle.kts b/example/build.gradle.kts index f336148..941c3cf 100644 --- a/example/build.gradle.kts +++ b/example/build.gradle.kts @@ -6,9 +6,8 @@ plugins { } dependencies { - @Suppress("VulnerableLibrariesLocal", "RedundantSuppression") - compileOnly(libs.allaymc.api) - compileOnly(projects.plugin.composeLib) + compileOnly(projects.plugin.core) + compileOnly(projects.plugin.compose) } kotlin { diff --git a/plugin/build.gradle.kts b/plugin/build.gradle.kts index e718bd7..92ef69c 100644 --- a/plugin/build.gradle.kts +++ b/plugin/build.gradle.kts @@ -1,21 +1,59 @@ plugins { alias(libs.plugins.kotlin.jvm) - alias(libs.plugins.gradleup.shadow) } -dependencies { - @Suppress("VulnerableLibrariesLocal", "RedundantSuppression") - compileOnly(libs.allaymc.api) - api(projects.core) - - api(kotlin("stdlib")) - api(kotlin("stdlib-jdk7")) - api(kotlin("stdlib-jdk8")) - api(kotlin("reflect")) - api(libs.kotlinx.coroutines.core) - api(libs.kotlinx.coroutines.swing) +class Names(val words: Array) { + constructor(name: String) : this(name.split('-').toTypedArray()) + val lodash get() = words.joinToString("_") + val kebab get() = words.joinToString("-") + val upperCamel get() = words.joinToString("") { word -> word.replaceFirstChar { it.uppercase() } } } -kotlin { - jvmToolchain(21) +fun basePluginClassPackage(names: Names) = "vip.cdms.allaymc.kotlinx.shared.${names.lodash}" +fun basePluginClassName(names: Names) = "Kotlinx${names.upperCamel}SharedLib" +fun basePluginClass(names: Names) = """ + |package ${basePluginClassPackage(names)} + | + |import org.allaymc.api.plugin.Plugin + | + |/** Automatically generated. Do NOT edit this file directly! */ + |class ${basePluginClassName(names)} : Plugin() + | +""".trimMargin() + +fun basePluginDescriptor(names: Names) = """ + { + "entrance": "${basePluginClassPackage(names)}.${basePluginClassName(names)}", + "name": "kotlinx-${names.kebab}-lib", + "description": "${ + if (names.lodash == "core") "Kotlin-style Extension Library and Shared Standard Library for Allay Server" + else "Kotlinx Shared Library for Allay Server -- ${names.upperCamel}" + }", + "authors": [ + "MineBuilder" + ], + "version": "${'$'}{version}", + "dependencies": [], + "website": "https://github.com/MineBuilders/allaymc-kotlinx" + } +""".trimIndent() + +subprojects { + val names = Names(name) + if (names.lodash == "build" || names.words.getOrNull(1) == "generated") return@subprojects + + val generatePath = arrayOf("build", "plugin-generated-$name") + val generateDir = File(projectDir, "../" + generatePath.joinToString("/")).apply { mkdirs() } + val sourceDir = File(generateDir, "src/main/kotlin/" + basePluginClassPackage(names).split('.').joinToString("/")) + val resourcesDir = File(generateDir, "src/main/resources") + File(sourceDir.apply { mkdirs() }, basePluginClassName(names) + ".kt").writeText(basePluginClass(names)) + File(resourcesDir.apply { mkdirs() }, "plugin.json").writeText(basePluginDescriptor(names)) + + plugins.apply(rootProject.libs.plugins.kotlin.jvm.get().pluginId) + plugins.apply(rootProject.libs.plugins.gradleup.shadow.get().pluginId) + version = rootProject.rootProject.version + afterEvaluate { + dependencies { implementation(project(":plugin:" + generatePath.joinToString(":"))) } + kotlin { jvmToolchain(21) } + } } diff --git a/plugin/compose-lib/build.gradle.kts b/plugin/compose/build.gradle.kts similarity index 86% rename from plugin/compose-lib/build.gradle.kts rename to plugin/compose/build.gradle.kts index f8c8d0f..85c8fa6 100644 --- a/plugin/compose-lib/build.gradle.kts +++ b/plugin/compose/build.gradle.kts @@ -1,16 +1,12 @@ import org.jetbrains.compose.ExperimentalComposeLibrary plugins { - alias(libs.plugins.kotlin.jvm) alias(libs.plugins.compose.multiplatform) alias(libs.plugins.compose.compiler) - alias(libs.plugins.gradleup.shadow) } @OptIn(ExperimentalComposeLibrary::class) dependencies { - api(projects.plugin) - api(compose.runtime) api(compose.ui) api(compose.foundation) @@ -30,7 +26,3 @@ dependencies { api(compose.desktop.components.splitPane) api(compose.desktop.components.animatedImage) } - -kotlin { - jvmToolchain(21) -} diff --git a/plugin/core/build.gradle.kts b/plugin/core/build.gradle.kts new file mode 100644 index 0000000..0c47859 --- /dev/null +++ b/plugin/core/build.gradle.kts @@ -0,0 +1,10 @@ +dependencies { + api(projects.core) + + api(kotlin("stdlib")) + api(kotlin("stdlib-jdk7")) + api(kotlin("stdlib-jdk8")) + api(kotlin("reflect")) + api(libs.kotlinx.coroutines.core) + api(libs.kotlinx.coroutines.swing) +} diff --git a/plugin/src/main/kotlin/vip/cdms/allaymc/kotlinx/KotlinxPlugin.kt b/plugin/src/main/kotlin/vip/cdms/allaymc/kotlinx/KotlinxPlugin.kt deleted file mode 100644 index dc3b498..0000000 --- a/plugin/src/main/kotlin/vip/cdms/allaymc/kotlinx/KotlinxPlugin.kt +++ /dev/null @@ -1,6 +0,0 @@ -package vip.cdms.allaymc.kotlinx - -import org.allaymc.api.plugin.Plugin - -@Suppress("unused") -class KotlinxPlugin : Plugin() diff --git a/plugin/src/main/resources/plugin.json b/plugin/src/main/resources/plugin.json deleted file mode 100644 index d2ed8ae..0000000 --- a/plugin/src/main/resources/plugin.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "entrance": "vip.cdms.allaymc.kotlinx.KotlinxPlugin", - "name": "kotlinx-lib", - "description": "Kotlin-style Extension Library and Shared Standard Library for Allay Server", - "authors": [ - "MineBuilder" - ], - "version": "${version}", - "dependencies": [], - "website": "https://github.com/MineBuilders/allaymc-kotlinx" -} \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index 33c469f..ba5b658 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -35,6 +35,15 @@ dependencyResolutionManagement { } } +val sharedDeps = arrayOf("core", "compose") include(":core") -include(":plugin", ":plugin:compose-lib") +include(":plugin") include(":example") + +sharedDeps.forEach { + val generated = arrayOf("plugin", "build", "plugin-generated-$it") + File(File(rootProject.projectDir, generated.joinToString("/")) + .apply { mkdirs() }, "build.gradle.kts") + .writeText("plugins { alias(libs.plugins.kotlin.jvm) }") + include(":plugin:$it", ":" + generated.joinToString(":")) +}