122 lines
3.0 KiB
Kotlin
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")
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|