@@ -21,6 +21,12 @@ import software.amazon.smithy.gradle.tasks.SmithyBuildTask
2121import software.amazon.smithy.aws.traits.ServiceTrait
2222import java.util.stream.Stream
2323import kotlin.streams.toList
24+ import org.gradle.api.DefaultTask
25+ import org.gradle.api.file.DirectoryProperty
26+ import org.gradle.api.file.RegularFileProperty
27+ import org.gradle.api.provider.Property
28+ import org.gradle.api.tasks.*
29+ import java.io.File
2430
2531val smithyVersion: String by project
2632
@@ -59,7 +65,7 @@ tasks["jar"].enabled = false
5965tasks[" smithyBuild" ].enabled = false
6066
6167val buildSdk = tasks.register<SmithyBuildTask >(" buildSdk" ) {
62- val clientNameProp: String? by project
68+ val clientNameProp: String? = project.findProperty( " clientName " ) as String?
6369 if (! (clientNameProp?.isEmpty() ? : true )) {
6470 smithyBuildConfigs.set(files(" smithy-build-" + clientNameProp + " .json" ))
6571 outputDir.set(file(" build-single/" + clientNameProp))
@@ -71,15 +77,32 @@ val buildSdk = tasks.register<SmithyBuildTask>("buildSdk") {
7177// Generates a smithy-build.json file by creating a new projection for every
7278// JSON file found in aws-models/. The generated smithy-build.json file is
7379// not committed to git since it's rebuilt each time codegen is performed.
74- val generateSmithyBuild = tasks.register(" generate-smithy-build" ) {
75- val clientNameProp: String? by project
76- val modelsDirProp: String by project
77- val models = project.file(modelsDirProp);
78-
79- doLast {
80+ abstract class GenerateSmithyBuildTask : DefaultTask () {
81+ @get:Input
82+ @get:Optional
83+ abstract val clientName: Property <String >
84+
85+ @get:Input
86+ abstract val modelsDir: Property <String >
87+
88+ @get:InputDirectory
89+ abstract val modelsDirPath: DirectoryProperty
90+
91+ @get:InputFile
92+ abstract val templateFile: RegularFileProperty
93+
94+ @get:OutputFile
95+ abstract val buildFile: RegularFileProperty
96+
97+ @TaskAction
98+ fun generate () {
8099 val projectionsBuilder = Node .objectNodeBuilder()
100+ val templatePath = templateFile.asFile.get().absolutePath
101+ val modelsDirFile = modelsDirPath.asFile.get()
102+
103+ modelsDirFile.listFiles()?.filter { it.isFile }?.forEach eachFile@{ file ->
104+
81105
82- fileTree(models).filter { it.isFile }.files.forEach eachFile@{ file ->
83106 val model = Model .assembler()
84107 .addImport(file.absolutePath)
85108 .assemble().result.get();
@@ -104,8 +127,7 @@ val generateSmithyBuild = tasks.register("generate-smithy-build") {
104127 .map { it.replaceFirstChar { it.uppercase() } }
105128 .joinToString(separator = " " )
106129 var manifestOverwrites = Node .parse(
107- File (" smithy-aws-typescript-codegen/src/main/resources/software/amazon/smithy/aws/typescript/codegen/package.json.template" )
108- .readText()
130+ File (templatePath).readText()
109131 ).expectObjectNode()
110132 val useLegacyAuthServices = setOf<String >(
111133 // e.g. "S3" - use this as exclusion list if needed.
@@ -114,7 +136,7 @@ val generateSmithyBuild = tasks.register("generate-smithy-build") {
114136 // "S3"
115137 )
116138 val projectionContents = Node .objectNodeBuilder()
117- .withMember(" imports" , Node .fromStrings(" ${models.getAbsolutePath() }${File .separator}${file.name} " ))
139+ .withMember(" imports" , Node .fromStrings(" ${modelsDirFile.absolutePath }${File .separator}${file.name} " ))
118140 .withMember(" plugins" , Node .objectNode()
119141 .withMember(" typescript-codegen" , Node .objectNodeBuilder()
120142 .withMember(" package" , " @aws-sdk/client-" + sdkId.lowercase())
@@ -132,17 +154,29 @@ val generateSmithyBuild = tasks.register("generate-smithy-build") {
132154 projectionsBuilder.withMember(sdkId + " ." + version.lowercase(), projectionContents)
133155 }
134156
135- val buildFile = if (! (clientNameProp?.isEmpty() ? : true ))
136- " smithy-build-" + clientNameProp + " .json"
137- else " smithy-build.json"
138-
139- file(buildFile).writeText(Node .prettyPrintJson(Node .objectNodeBuilder()
157+ buildFile.asFile.get().writeText(Node .prettyPrintJson(Node .objectNodeBuilder()
140158 .withMember(" version" , " 1.0" )
141159 .withMember(" projections" , projectionsBuilder.build())
142160 .build()))
143161 }
144162}
145163
164+ val generateSmithyBuild = tasks.register<GenerateSmithyBuildTask >(" generate-smithy-build" ) {
165+ val clientNameProp = providers.gradleProperty(" clientName" )
166+ val modelsDirProp = providers.gradleProperty(" modelsDir" ).orElse(" aws-models" )
167+
168+ clientName.set(clientNameProp)
169+ modelsDir.set(modelsDirProp)
170+ modelsDirPath.set(layout.projectDirectory.dir(modelsDirProp))
171+ templateFile.set(layout.projectDirectory.file(" ../smithy-aws-typescript-codegen/src/main/resources/software/amazon/smithy/aws/typescript/codegen/package.json.template" ))
172+
173+ val buildFileName = clientNameProp.map { name ->
174+ if (! name.isNullOrEmpty()) " smithy-build-$name .json" else " smithy-build.json"
175+ }.orElse(" smithy-build.json" )
176+
177+ buildFile.set(layout.projectDirectory.file(buildFileName))
178+ }
179+
146180tasks.register(" generate-default-configs-provider" , JavaExec ::class ) {
147181 classpath = sourceSets[" main" ].runtimeClasspath
148182 mainClass.set(" software.amazon.smithy.aws.typescript.codegen.DefaultsModeConfigGenerator" )
0 commit comments