diff --git a/codegen/gradle.properties b/codegen/gradle.properties index 583a9ead150a..09a52b07b0a3 100644 --- a/codegen/gradle.properties +++ b/codegen/gradle.properties @@ -1,3 +1,4 @@ smithyVersion=1.62.0 smithyGradleVersion=1.3.0 -org.gradle.jvmargs=-Xmx4096M \ No newline at end of file +org.gradle.jvmargs=-Xmx4096M +org.gradle.configuration-cache=true \ No newline at end of file diff --git a/codegen/sdk-codegen/build.gradle.kts b/codegen/sdk-codegen/build.gradle.kts index e58f49c4f940..2e615c4a54cf 100644 --- a/codegen/sdk-codegen/build.gradle.kts +++ b/codegen/sdk-codegen/build.gradle.kts @@ -21,6 +21,12 @@ import software.amazon.smithy.gradle.tasks.SmithyBuildTask import software.amazon.smithy.aws.traits.ServiceTrait import java.util.stream.Stream import kotlin.streams.toList +import org.gradle.api.DefaultTask +import org.gradle.api.file.DirectoryProperty +import org.gradle.api.file.RegularFileProperty +import org.gradle.api.provider.Property +import org.gradle.api.tasks.* +import java.io.File val smithyVersion: String by project @@ -59,7 +65,7 @@ tasks["jar"].enabled = false tasks["smithyBuild"].enabled = false val buildSdk = tasks.register("buildSdk") { - val clientNameProp: String? by project + val clientNameProp: String? = project.findProperty("clientNameProp")?.toString() if (!(clientNameProp?.isEmpty() ?: true)) { smithyBuildConfigs.set(files("smithy-build-" + clientNameProp + ".json")) outputDir.set(file("build-single/" + clientNameProp)) @@ -71,15 +77,32 @@ val buildSdk = tasks.register("buildSdk") { // Generates a smithy-build.json file by creating a new projection for every // JSON file found in aws-models/. The generated smithy-build.json file is // not committed to git since it's rebuilt each time codegen is performed. -val generateSmithyBuild = tasks.register("generate-smithy-build") { - val clientNameProp: String? by project - val modelsDirProp: String by project - val models = project.file(modelsDirProp); - - doLast { +abstract class GenerateSmithyBuildTask : DefaultTask() { + @get:Input + @get:Optional + abstract val clientName: Property + + @get:Input + abstract val modelsDir: Property + + @get:InputDirectory + abstract val modelsDirPath: DirectoryProperty + + @get:InputFile + abstract val templateFile: RegularFileProperty + + @get:OutputFile + abstract val buildFile: RegularFileProperty + + @TaskAction + fun generate() { val projectionsBuilder = Node.objectNodeBuilder() + val templatePath = templateFile.asFile.get().absolutePath + val modelsDirFile = modelsDirPath.asFile.get() + + modelsDirFile.listFiles()?.filter { it.isFile }?.forEach eachFile@{ file -> + - fileTree(models).filter { it.isFile }.files.forEach eachFile@{ file -> val model = Model.assembler() .addImport(file.absolutePath) .assemble().result.get(); @@ -104,8 +127,7 @@ val generateSmithyBuild = tasks.register("generate-smithy-build") { .map { it.replaceFirstChar { it.uppercase() } } .joinToString(separator = " ") var manifestOverwrites = Node.parse( - File("smithy-aws-typescript-codegen/src/main/resources/software/amazon/smithy/aws/typescript/codegen/package.json.template") - .readText() + File(templatePath).readText() ).expectObjectNode() val useLegacyAuthServices = setOf( // e.g. "S3" - use this as exclusion list if needed. @@ -114,7 +136,7 @@ val generateSmithyBuild = tasks.register("generate-smithy-build") { // "S3" ) val projectionContents = Node.objectNodeBuilder() - .withMember("imports", Node.fromStrings("${models.getAbsolutePath()}${File.separator}${file.name}")) + .withMember("imports", Node.fromStrings("${modelsDirFile.absolutePath}${File.separator}${file.name}")) .withMember("plugins", Node.objectNode() .withMember("typescript-codegen", Node.objectNodeBuilder() .withMember("package", "@aws-sdk/client-" + sdkId.lowercase()) @@ -132,17 +154,31 @@ val generateSmithyBuild = tasks.register("generate-smithy-build") { projectionsBuilder.withMember(sdkId + "." + version.lowercase(), projectionContents) } - val buildFile = if (!(clientNameProp?.isEmpty() ?: true)) - "smithy-build-" + clientNameProp + ".json" - else "smithy-build.json" - - file(buildFile).writeText(Node.prettyPrintJson(Node.objectNodeBuilder() + buildFile.asFile.get().writeText(Node.prettyPrintJson(Node.objectNodeBuilder() .withMember("version", "1.0") .withMember("projections", projectionsBuilder.build()) .build())) } } +val generateSmithyBuild = tasks.register("generate-smithy-build") { + val clientNameProp = providers.gradleProperty("clientNameProp") + val modelsDirProp = providers.gradleProperty("modelsDirProp").orElse("aws-models") + + clientName.set(clientNameProp) + modelsDir.set(modelsDirProp) + modelsDirPath.set(layout.projectDirectory.dir(modelsDirProp)) + templateFile.set(layout.projectDirectory.file("../smithy-aws-typescript-codegen/src/main/resources/software/amazon/smithy/aws/typescript/codegen/package.json.template")) + + val buildFileName = if (clientNameProp.isPresent && clientNameProp.get().isNotEmpty()) { + "smithy-build-${clientNameProp.get()}.json" + } else { + "smithy-build.json" + } + + buildFile.set(layout.projectDirectory.file(buildFileName)) +} + tasks.register("generate-default-configs-provider", JavaExec::class) { classpath = sourceSets["main"].runtimeClasspath mainClass.set("software.amazon.smithy.aws.typescript.codegen.DefaultsModeConfigGenerator") diff --git a/codegen/smithy-aws-typescript-codegen/build.gradle.kts b/codegen/smithy-aws-typescript-codegen/build.gradle.kts index 53f8b5bf86b9..119b44f04026 100644 --- a/codegen/smithy-aws-typescript-codegen/build.gradle.kts +++ b/codegen/smithy-aws-typescript-codegen/build.gradle.kts @@ -14,6 +14,13 @@ */ import software.amazon.smithy.model.node.Node +import org.gradle.api.DefaultTask +import org.gradle.api.file.DirectoryProperty +import org.gradle.api.file.RegularFileProperty +import org.gradle.api.tasks.* +import org.gradle.language.jvm.tasks.ProcessResources +import org.gradle.api.file.DuplicatesStrategy +import java.io.File description = "Generates TypeScript code for AWS protocols from Smithy models" @@ -51,43 +58,54 @@ dependencies { api("software.amazon.smithy:smithy-aws-traits:$smithyVersion") } -tasks.register("set-aws-sdk-versions") { - val packagesDir = project.file("../../packages") - val clientsDir = project.file("../../clients") +abstract class SetAwsSdkVersionsTask : DefaultTask() { + @get:InputDirectory + abstract val packagesDir: DirectoryProperty + + @get:InputDirectory + abstract val clientsDir: DirectoryProperty + + @get:OutputFile + abstract val versionsFile: RegularFileProperty + + @TaskAction + fun setVersions() { + val outputFile = versionsFile.asFile.get() + outputFile.parentFile.mkdirs() + outputFile.printWriter().close() - doLast { - mkdir(layout.buildDirectory.dir("generated/resources/software/amazon/smithy/aws/typescript/codegen").get().asFile) - var versionsFile = layout.buildDirectory - .file("generated/resources/software/amazon/smithy/aws/typescript/codegen/sdkVersions.properties") - .get() - .asFile - versionsFile.printWriter().close() - - var roots = packagesDir.listFiles().toMutableList() + clientsDir.listFiles().toList() + val roots = packagesDir.asFile.get().listFiles().orEmpty().toMutableList() + clientsDir.asFile.get().listFiles().orEmpty().toList() roots.forEach { packageDir -> - var packageJsonFile = File(packageDir, "package.json") + val packageJsonFile = File(packageDir, "package.json") if (packageJsonFile.isFile()) { - var packageJson = Node.parse(packageJsonFile.readText()).expectObjectNode() - var packageName = packageJson.expectStringMember("name").getValue() - var packageVersion = packageJson.expectStringMember("version").getValue() - var isPrivate = packageJson.getBooleanMemberOrDefault("private", false) + val packageJson = Node.parse(packageJsonFile.readText()).expectObjectNode() + val packageName = packageJson.expectStringMember("name").getValue() + val packageVersion = packageJson.expectStringMember("version").getValue() + val isPrivate = packageJson.getBooleanMemberOrDefault("private", false) if (!isPrivate) { - versionsFile.appendText("$packageName=$packageVersion\n") + outputFile.appendText("$packageName=$packageVersion\n") } } } } } +tasks.register("set-aws-sdk-versions") { + packagesDir.set(layout.projectDirectory.dir("../../packages")) + clientsDir.set(layout.projectDirectory.dir("../../clients")) + versionsFile.set(layout.buildDirectory.file("generated/resources/software/amazon/smithy/aws/typescript/codegen/sdkVersions.properties")) +} + sourceSets { main { resources { - setSrcDirs(listOf( - "src/main/resources", - layout.buildDirectory.dir("generated/resources").get().asFile - )) + srcDir("src/main/resources") + srcDir(layout.buildDirectory.dir("generated/resources")) } } } tasks["processResources"].dependsOn(tasks["set-aws-sdk-versions"]) +tasks.named("processResources") { + duplicatesStrategy = DuplicatesStrategy.EXCLUDE +}