-
Notifications
You must be signed in to change notification settings - Fork 566
/
build.gradle.kts
149 lines (129 loc) · 6.29 KB
/
build.gradle.kts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
/*
* Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License").
* You may not use this file except in compliance with the License.
* A copy of the License is located at
*
* http://aws.amazon.com/apache2.0
*
* or in the "license" file accompanying this file. This file is distributed
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied. See the License for the specific language governing
* permissions and limitations under the License.
*/
import software.amazon.smithy.model.Model
import software.amazon.smithy.model.shapes.ServiceShape
import software.amazon.smithy.model.shapes.ShapeId
import software.amazon.smithy.model.node.Node
import software.amazon.smithy.gradle.tasks.SmithyBuild
import software.amazon.smithy.aws.traits.ServiceTrait
import java.util.stream.Stream
import kotlin.streams.toList
val smithyVersion: String by project
buildscript {
val smithyVersion: String by project
repositories {
mavenLocal()
mavenCentral()
}
dependencies {
"classpath"("software.amazon.smithy:smithy-cli:$smithyVersion")
"classpath"("software.amazon.smithy:smithy-aws-traits:$smithyVersion")
}
}
plugins {
val smithyGradleVersion: String by project
id("software.amazon.smithy").version(smithyGradleVersion)
}
dependencies {
val smithyVersion: String by project
implementation(project(":smithy-aws-typescript-codegen"))
implementation("software.amazon.smithy:smithy-smoke-test-traits:$smithyVersion")
implementation("software.amazon.smithy:smithy-aws-smoke-test-model:$smithyVersion")
}
// This project doesn't produce a JAR.
tasks["jar"].enabled = false
// Run the SmithyBuild task manually since this project needs the built JAR
// from smithy-aws-typescript-codegen.
tasks["smithyBuildJar"].enabled = false
tasks.create<SmithyBuild>("buildSdk") {
addRuntimeClasspath = true
}
configure<software.amazon.smithy.gradle.SmithyExtension> {
val clientNameProp: String? by project
if (!(clientNameProp?.isEmpty() ?: true)) {
smithyBuildConfigs = files("smithy-build-" + clientNameProp + ".json")
outputDirectory = file("build-single/" + clientNameProp)
}
}
// 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.
tasks.register("generate-smithy-build") {
doLast {
val projectionsBuilder = Node.objectNodeBuilder()
val modelsDirProp: String by project
val clientNameProp: String? by project
val models = project.file(modelsDirProp);
fileTree(models).filter { it.isFile }.files.forEach eachFile@{ file ->
val model = Model.assembler()
.addImport(file.absolutePath)
.assemble().result.get();
val servicesStream: Stream<ServiceShape> = model.shapes(ServiceShape::class.javaObjectType)
val servicesStreamSorted: Stream<ServiceShape> = servicesStream.sorted()
val services: List<ServiceShape> = servicesStreamSorted.toList()
if (services.size != 1) {
throw Exception("There must be exactly one service in each aws model file, but found " +
"${services.size} in ${file.name}: ${services.map { it.id }}");
}
val service = services[0]
val serviceTrait = service.getTrait(ServiceTrait::class.javaObjectType).get();
val sdkId = serviceTrait.sdkId
.replace(" ", "-")
.toLowerCase();
val version = service.version.toLowerCase();
val clientName = sdkId.split("-").toTypedArray()
.map { it.capitalize() }
.joinToString(separator = " ")
var manifestOverwrites = Node.parse(
File("smithy-aws-typescript-codegen/src/main/resources/software/amazon/smithy/aws/typescript/codegen/package.json.template")
.readText()
).expectObjectNode()
val useLegacyAuthServices = setOf<String>(
// e.g. "S3" - use this as exclusion list if needed.
)
val projectionContents = Node.objectNodeBuilder()
.withMember("imports", Node.fromStrings("${models.getAbsolutePath()}${File.separator}${file.name}"))
.withMember("plugins", Node.objectNode()
.withMember("typescript-codegen", Node.objectNodeBuilder()
.withMember("package", "@aws-sdk/client-" + sdkId.toLowerCase())
// Note that this version is replaced by Lerna when publishing.
.withMember("packageVersion", "3.0.0")
.withMember("packageJson", manifestOverwrites)
.withMember("packageDescription", "AWS SDK for JavaScript "
+ clientName + " Client for Node.js, Browser and React Native")
.withMember("useLegacyAuth",
useLegacyAuthServices.contains(serviceTrait.sdkId))
.build()))
.build()
projectionsBuilder.withMember(sdkId + "." + version.toLowerCase(), projectionContents)
}
val buildFile = if (!(clientNameProp?.isEmpty() ?: true))
"smithy-build-" + clientNameProp + ".json"
else "smithy-build.json"
file(buildFile).writeText(Node.prettyPrintJson(Node.objectNodeBuilder()
.withMember("version", "1.0")
.withMember("projections", projectionsBuilder.build())
.build()))
}
}
tasks.register("generate-default-configs-provider", JavaExec::class) {
classpath = sourceSets["main"].runtimeClasspath
mainClass.set("software.amazon.smithy.aws.typescript.codegen.DefaultsModeConfigGenerator")
args(listOf(project.properties["defaultsModeConfigOutput"]))
}
// Run the `buildSdk` automatically.
tasks["build"]
.dependsOn(tasks["generate-smithy-build"])
.finalizedBy(tasks["buildSdk"])