Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion codegen/gradle.properties
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
smithyVersion=1.62.0
smithyGradleVersion=1.3.0
org.gradle.jvmargs=-Xmx4096M
org.gradle.jvmargs=-Xmx4096M
org.gradle.configuration-cache=true
68 changes: 52 additions & 16 deletions codegen/sdk-codegen/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -59,7 +65,7 @@ tasks["jar"].enabled = false
tasks["smithyBuild"].enabled = false

val buildSdk = tasks.register<SmithyBuildTask>("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))
Expand All @@ -71,15 +77,32 @@ val buildSdk = tasks.register<SmithyBuildTask>("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<String>

@get:Input
abstract val modelsDir: Property<String>

@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();
Expand All @@ -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<String>(
// e.g. "S3" - use this as exclusion list if needed.
Expand All @@ -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())
Expand All @@ -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<GenerateSmithyBuildTask>("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")
Expand Down
62 changes: 40 additions & 22 deletions codegen/smithy-aws-typescript-codegen/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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<SetAwsSdkVersionsTask>("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>("processResources") {
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
}
Loading