From d8b0a1ddbe579a5ac8271a1f3f947c49330bb27b Mon Sep 17 00:00:00 2001 From: TheBrokenRail Date: Fri, 29 May 2020 17:19:14 -0400 Subject: [PATCH] Allow Specifying Custom TypeScript Root --- build.gradle.kts | 32 +--- buildSrc/src/main/kotlin/TypeScriptPlugin.kt | 166 ++++++++++++------- examples/typescript/README.md | 6 +- 3 files changed, 113 insertions(+), 91 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 5387fa3..3efd771 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -28,39 +28,17 @@ jni { addPlatform("windows-x86", ".dll") } -tasks.register("eslint") { +tasks.register("eslint") { group = "verification" - workingDir(typescript.root) - - executable("npm") - - args("run", "eslint") - - dependsOn(tasks["npmInstall"]) + taskName = "eslint" } -tasks.register("typedoc") { +tasks.register("typedoc") { group = "documentation" - val typedocOut = File(typescript.root, "build/typedoc") - - inputs.dir(typescript.root) - outputs.dir(typedocOut) - - workingDir(typescript.root) - - executable("npm") - - args("run", "typedoc") - - doFirst { - project.delete { - delete(typedocOut) - } - } - - dependsOn(tasks["npmInstall"]) + taskName = "typedoc" + outputDir = "build/typedoc" } tasks.named("processResources") { diff --git a/buildSrc/src/main/kotlin/TypeScriptPlugin.kt b/buildSrc/src/main/kotlin/TypeScriptPlugin.kt index ae71a3b..ab804b5 100644 --- a/buildSrc/src/main/kotlin/TypeScriptPlugin.kt +++ b/buildSrc/src/main/kotlin/TypeScriptPlugin.kt @@ -1,8 +1,7 @@ +import org.gradle.api.DefaultTask 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.* import org.gradle.api.tasks.bundling.Jar import org.gradle.kotlin.dsl.* import java.io.File @@ -10,113 +9,158 @@ import java.util.concurrent.Callable class TypeScriptPlugin : Plugin { open class TypeScriptConfig(rootDir: File) { - val root: File = File(rootDir, "src/main/ts") + var root: File = File(rootDir, "src/main/ts") + } - fun getOutDir(): File { - return File(root, "build/ts") + open class NPMTask : DefaultTask() { + @get:Input + lateinit var taskName: String + @get:Input + lateinit var outputDir: String + + @TaskAction + fun exec() { + project.delete { + delete(getOutput()) + } + project.exec { + workingDir(getInput()) + + executable("npm") + + args("run", taskName) + } } - fun getDeclarationDir(): File { - return File(root, "build/dts") + @InputDirectory + fun getInput(): Callable { + return Callable { + project.the().root + } } - fun getDependenciesDir(): File { - return File(root, "build/dependencies") + @OutputDirectory + fun getOutput(): Callable? { + return if (this::outputDir.isInitialized) { + Callable { + if (File(outputDir).isAbsolute) { + File(outputDir) + } else { + File(project.the().root, outputDir) + } + } + } else { + null + } + } + } + + open class NPMInstallTask : DefaultTask() { + @TaskAction + fun exec() { + project.delete { + delete(getOutput()) + } + project.exec { + workingDir(Callable { + project.the().root + }) + + executable("npm") + + args("install") + } + } + + @InputFile + fun getInput(): Callable { + return Callable { + File(project.the().root, "package.json") + } + } + + @OutputDirectory + fun getOutput(): Callable { + return Callable { + File(project.the().root, "node_modules") + } } } override fun apply(project: Project): Unit = project.run { val extension = project.extensions.create("typescript", projectDir) - configurations { - create("typescript") { - isTransitive = false - } + val typescript = configurations.create("typescript") { + isTransitive = false } - tasks.register("extractTypescriptDependencies") { + val npmInstallTask = tasks.register("npmInstall") { + group = "typescript" + } + + val extractTypescriptDependenciesTask = tasks.register("extractTypescriptDependencies") { group = "typescript" - dependsOn(configurations["typescript"]) + dependsOn(typescript) from(Callable { - configurations["typescript"].map { + typescript.map { zipTree(it).matching { exclude("META-INF", "META-INF/**") } } }) - into(extension.getDependenciesDir()) + into(File(extension.root, "build/dependencies/api")) } - 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")) + project.afterEvaluate { + tasks.forEach { + if (it is NPMTask) { + it.dependsOn(npmInstallTask) + it.dependsOn(extractTypescriptDependenciesTask) } } - - dependsOn(tasks["extractTypescriptDependencies"]) } - tasks.register("typescript") { + val typescriptTask = 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"]) + taskName = "build" + outputDir = "build/ts" } - tasks.register("apiJar") { + val apiJarTask = tasks.register("apiJar") { group = "typescript" into("/types") { - from(File(extension.root, "types")) + from(Callable { + File(extension.root, "types") + }) } into("/src") { - from(extension.getDeclarationDir()) + from(Callable { + File(extension.root, "build/dts") + }) } archiveClassifier.set("api") - dependsOn(tasks["typescript"]) + dependsOn(typescriptTask) } artifacts { - add("archives", tasks["apiJar"]) + add("archives", apiJarTask) } tasks.named("processResources") { - dependsOn(tasks["typescript"]) + dependsOn(typescriptTask) - from(extension.getOutDir()) { - into("scriptcraft") - } + from(Callable { + File(extension.root, "build/ts") + }) + + into("scriptcraft") } } } \ No newline at end of file diff --git a/examples/typescript/README.md b/examples/typescript/README.md index 503d1d7..e23dba7 100644 --- a/examples/typescript/README.md +++ b/examples/typescript/README.md @@ -10,12 +10,12 @@ This is an example of a Minecraft mod made in TypeScript using ScriptCraft. - NPM dependencies are not bundled - API JARs are not bundled -## ```typescript``` Gradle Configuration -The ```typescript``` gradle configuration will extract the specified API JAR into ```src/main/ts/build/dependencies```. - ## API JARs An API JAR can be built with ```./gradlew apiJar```. +### ```typescript``` Gradle Configuration +The ```typescript``` gradle configuration will extract the specified API JAR into ```src/main/ts/build/dependencies```. It will not be bundled with the mod. + ### File Structure ``` - API JAR Root