import org.gradle.api.Plugin import org.gradle.api.Project import org.gradle.api.tasks.Copy import org.gradle.api.tasks.Exec import org.gradle.api.tasks.Sync import org.gradle.api.tasks.bundling.Jar import org.gradle.kotlin.dsl.* import java.io.File import java.util.concurrent.Callable class TypeScriptPlugin : Plugin { open class TypeScriptConfig(rootDir: File) { val root: File = File(rootDir, "src/main/ts") fun getOutDir(): File { return File(root, "build/ts") } fun getDeclarationDir(): File { return File(root, "build/dts") } fun getDependenciesDir(): File { return File(root, "build/dependencies") } } override fun apply(project: Project): Unit = project.run { val extension = project.extensions.create("typescript", projectDir) configurations { create("typescript") { isTransitive = false } } tasks.register("extractTypescriptDependencies") { group = "typescript" dependsOn(configurations["typescript"]) from(Callable { configurations["typescript"].map { zipTree(it).matching { exclude("META-INF", "META-INF/**") } } }) into(extension.getDependenciesDir()) } tasks.register("npmInstall") { group = "typescript" inputs.file(File(extension.root, "package.json")) outputs.dir(File(extension.root, "node_modules")) workingDir(extension.root) executable("npm") args("install") doFirst { project.delete { delete(File(extension.root, "node_modules")) } } dependsOn(tasks["extractTypescriptDependencies"]) } tasks.register("typescript") { group = "typescript" inputs.dir(extension.root) outputs.dirs(extension.getOutDir()) workingDir(extension.root) executable("npm") args("run", "build") doFirst { project.delete { delete(extension.getOutDir()) } } dependsOn(tasks["npmInstall"]) } tasks.register("apiJar") { group = "typescript" into("/types") { from(File(extension.root, "types")) } into("/src") { from(extension.getDeclarationDir()) } archiveClassifier.set("api") dependsOn(tasks["typescript"]) } artifacts { add("archives", tasks["apiJar"]) } tasks.named("processResources") { dependsOn(tasks["typescript"]) from(extension.getOutDir()) { into("scriptcraft") } } } }