This repository has been archived on 2023-11-26. You can view files and clone it, but cannot push or open issues or pull requests.
ScriptCraft/buildSrc/src/main/kotlin/TypeScriptPlugin.kt

122 lines
3.0 KiB
Kotlin

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<Project> {
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<TypeScriptConfig>("typescript", projectDir)
configurations {
create("typescript") {
isTransitive = false
}
}
tasks.register<Sync>("extractTypescriptDependencies") {
group = "typescript"
dependsOn(configurations["typescript"])
from(Callable {
configurations["typescript"].map {
zipTree(it).matching {
exclude("META-INF", "META-INF/**")
}
}
})
into(extension.getDependenciesDir())
}
tasks.register<Exec>("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<Exec>("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<Jar>("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<Copy>("processResources") {
dependsOn(tasks["typescript"])
from(extension.getOutDir()) {
into("scriptcraft")
}
}
}
}