diff --git a/buildSrc/src/main/kotlin/dev/adamko/factoriowebmap/archetype/kotlin-js.gradle.kts b/buildSrc/src/main/kotlin/dev/adamko/factoriowebmap/archetype/kotlin-js.gradle.kts index 6f3e148..49c8445 100644 --- a/buildSrc/src/main/kotlin/dev/adamko/factoriowebmap/archetype/kotlin-js.gradle.kts +++ b/buildSrc/src/main/kotlin/dev/adamko/factoriowebmap/archetype/kotlin-js.gradle.kts @@ -16,8 +16,6 @@ plugins { id("dev.adamko.factoriowebmap.archetype.node") } - - kotlin { js(IR) { binaries.executable() diff --git a/buildSrc/src/main/kotlin/dev/adamko/gradle/pbandg/pattern/KotlinMultiplatformProjectConfiguration.kt b/buildSrc/src/main/kotlin/dev/adamko/gradle/pbandg/pattern/KotlinMultiplatformProjectConfiguration.kt index 79845f4..3ec370f 100644 --- a/buildSrc/src/main/kotlin/dev/adamko/gradle/pbandg/pattern/KotlinMultiplatformProjectConfiguration.kt +++ b/buildSrc/src/main/kotlin/dev/adamko/gradle/pbandg/pattern/KotlinMultiplatformProjectConfiguration.kt @@ -22,21 +22,23 @@ class KotlinMultiplatformProjectConfiguration : Plugin { this.name } // -// val protoJvm = this.sourceSets.maybeCreate("protoJvm").apply { -// kotlin.srcDir(project.layout.buildDirectory.dir("pbAndG/generated-sources/java")) -// kotlin.srcDir(project.layout.buildDirectory.dir("pbAndG/generated-sources/kotlin")) -// } -// -// val protoTypescript = this.sourceSets.maybeCreate("protoJvm").apply { -// kotlin.srcDir(project.layout.buildDirectory.dir("pbAndG/generated-sources/typescript")) -// } + val protoJvm = this.sourceSets.maybeCreate("protoJvm").apply { + kotlin.srcDir(project.layout.buildDirectory.dir("pbAndG/generated-sources/java")) + kotlin.srcDir(project.layout.buildDirectory.dir("pbAndG/generated-sources/kotlin")) + } - this.sourceSets.named("jvmMain").configure { + val protoTypescript = this.sourceSets.maybeCreate("protoJvm").apply { + kotlin.srcDir(project.layout.buildDirectory.dir("pbAndG/generated-sources/typescript")) + } + + this.sourceSets.findByName("jvmMain")?.apply { +// protoJvm.dependsOn(this) // dependsOn(protoJvm) kotlin.srcDir(project.layout.buildDirectory.dir("pbAndG/generated-sources/java")) kotlin.srcDir(project.layout.buildDirectory.dir("pbAndG/generated-sources/kotlin")) } - this.sourceSets.named("jsMain").configure { + this.sourceSets.findByName("jsMain")?.apply { +// protoTypescript.dependsOn(this) // dependsOn(protoTypescript) kotlin.srcDir(project.layout.buildDirectory.dir("pbAndG/generated-sources/typescript")) } diff --git a/buildSrc/src/main/kotlin/dev/adamko/gradle/pbandg/pb-and-g.gradle.kts b/buildSrc/src/main/kotlin/dev/adamko/gradle/pbandg/pb-and-g.gradle.kts index 232bbea..22dadf2 100644 --- a/buildSrc/src/main/kotlin/dev/adamko/gradle/pbandg/pb-and-g.gradle.kts +++ b/buildSrc/src/main/kotlin/dev/adamko/gradle/pbandg/pb-and-g.gradle.kts @@ -16,7 +16,6 @@ plugins { base } - // TODO investigate builtBy and sourceDirectorySet? // project.objects.fileCollection().builtBy() // val pbSrcSet = project.objects.sourceDirectorySet("protobuf", "protobuf") @@ -77,19 +76,19 @@ val protobufPrepareLibrariesTask = //// implementation("com.google.protobuf:protobuf-kotlin-lite:3.19.1") //} - -/** Convert `.proto` files to Kotlin */ -val pbCompileTask = project.tasks.register(Constants.PBG_TASK_COMPILE) { +project.tasks.withType { dependsOn(protocDep, protobufPrepareLibrariesTask) - protobufLibraryDirectories.add(protobufPrepareLibrariesTask.flatMap { it.librariesDirectory }) - protocOutputs += KotlinOutput() - protocOutputs += JavaOutput() - val exe = protocDep.singleFile logger.lifecycle("protoc.exe: $exe") protocExecutable.set(exe) } +/** Convert `.proto` files to Kotlin */ +val pbCompileTask = project.tasks.register(Constants.PBG_TASK_COMPILE) { + protocOutputs += KotlinOutput() + protocOutputs += JavaOutput() +} + project.tasks.assemble { dependsOn(pbCompileTask) } \ No newline at end of file diff --git a/buildSrc/src/main/kotlin/dev/adamko/gradle/pbandg/task/ProtobufCompileTask.kt b/buildSrc/src/main/kotlin/dev/adamko/gradle/pbandg/task/ProtobufCompileTask.kt index 5ff5ef4..de18e18 100644 --- a/buildSrc/src/main/kotlin/dev/adamko/gradle/pbandg/task/ProtobufCompileTask.kt +++ b/buildSrc/src/main/kotlin/dev/adamko/gradle/pbandg/task/ProtobufCompileTask.kt @@ -33,6 +33,9 @@ abstract class ProtobufCompileTask : DefaultTask() { abstract val protocOutputs: DomainObjectSet // = project.objects.domainObjectSet(ProtocOutput::class.java) + @get:Input + abstract val cliArgs: ListProperty + @get:InputFile abstract val protoFile: RegularFileProperty @@ -48,7 +51,7 @@ abstract class ProtobufCompileTask : DefaultTask() { fun compile() { val workDir = temporaryDir - project.delete(workDir) +// project.delete(workDir) project.exec { executable(protocExecutable.asFile.get()) @@ -65,9 +68,11 @@ abstract class ProtobufCompileTask : DefaultTask() { // set args mapOutputsToOutputDir .map { (opt, dir) -> - "${opt.cliParam}=${opt.protocOptions}:${dir}" + val optionsSuffix = if (opt.protocOptions.isBlank()) "" else ":" + "${opt.cliParam}=${opt.protocOptions}$optionsSuffix$dir" } .also { args(it) } + args(cliArgs.get()) val protoPath = cliParamProtoPath.get() val libArgs = protobufLibraryDirectories.get().map { "$protoPath${it.asFile}" } diff --git a/modules/factorio-events-data-model/build.gradle.kts b/modules/factorio-events-data-model/build.gradle.kts index fac3999..1c1372b 100644 --- a/modules/factorio-events-data-model/build.gradle.kts +++ b/modules/factorio-events-data-model/build.gradle.kts @@ -1,3 +1,7 @@ +import dev.adamko.gradle.pbandg.task.ProtobufCompileTask +import org.jetbrains.kotlin.gradle.targets.js.npm.NpmProject +import org.jetbrains.kotlin.gradle.targets.js.npm.tasks.RootPackageJsonTask + plugins { id("dev.adamko.factoriowebmap.archetype.base") kotlin("multiplatform") @@ -17,10 +21,6 @@ dependencies { // api("com.google.protobuf:protobuf-kotlin-lite:3.19.1") } -tasks.protobufCompile { - protoFile.set(layout.projectDirectory.file("src/proto/FactorioServerLogRecord.proto")) -} - idea { workspace { @@ -36,6 +36,7 @@ kotlin { optIn("kotlin.ExperimentalStdlibApi") optIn("kotlin.time.ExperimentalTime") optIn("kotlinx.coroutines.ExperimentalCoroutinesApi") + optIn("kotlin.js.ExperimentalJsExport") // progressiveMode = true // false by default } } @@ -137,3 +138,62 @@ kotlin { // } + +//rootProject.tasks.withType().configureEach { +//} + +val rootPackageJson by rootProject.tasks.getting(RootPackageJsonTask::class) +val nodePath: Directory by extra { + val file = rootPackageJson.rootPackageJson.parentFile.normalize() + logger.lifecycle("Kotlin/JS NODE_PATH: $file") + project.layout.dir(provider { file }).get() +} + +val nodeModulesDir: Directory by extra { + val file = nodePath.dir(NpmProject.NODE_MODULES) + logger.lifecycle("Kotlin/JS NODE_MODULES: $file") + file +} + +// build/js/node_modules/ts-proto/node_modules/.bin + +tasks.protobufCompile { + description = "proto2java" + protoFile.set(layout.projectDirectory.file("src/proto/FactorioServerLogRecord.proto")) +} + + +tasks.create("protobufTypescript") { + description = "proto2typescript" + +// data class PluginTs( +// override val cliParam: String = "--plugin", +// override val protocOptions: String = "", +// override val outputDirectoryName: String = +// "${project.buildDir}/js/packages/factorio-web-map-factorio-events-data-model/node_modules/.bin/protoc-gen-ts_proto.cmd", +// ) : ProtocOutput +// +// +// data class OutputTs( +// override val cliParam: String = "--ts_proto_out", +// override val protocOptions: String = "", +// override val outputDirectoryName: String = "${project.buildDir}/pbAndG/generated-sources/typescript", +// ) : ProtocOutput +// +// protocOutputs.add(PluginTs()) +// protocOutputs.add(OutputTs()) + + +// cliArgs.add("--plugin=${rootProject.buildDir}/js/packages/factorio-web-map-factorio-events-data-model/node_modules/.bin/protoc-gen-ts_proto.cmd") + + cliArgs.add("--plugin=protoc-gen-ts_proto=${rootProject.buildDir}/js/packages/factorio-web-map-factorio-events-data-model/node_modules/.bin/protoc-gen-ts_proto.cmd") + + val outdir = temporaryDir.resolve("typescript") + val f: File = project.mkdir(outdir) + + cliArgs.add("--ts_proto_out=${outdir.canonicalPath}") + cliArgs.add("--ts_proto_opt=useOptionals=true") +// cliArgs.add("--proto_path=${rootProject.rootDir}") + + protoFile.set(layout.projectDirectory.file("src/proto/FactorioServerLogRecord.proto")) +} diff --git a/settings.gradle.kts b/settings.gradle.kts index 30886cb..b1206d7 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -6,7 +6,7 @@ rootProject.name = "factorio-web-map" include( ":modules:mod", // ":modules:mod2", - ":modules:server", +// ":modules:server", ":modules:kt-rcon", ":modules:factorio-events-data-model", // ":modules:factorio-events-data-model2",