Skip to content

Commit 6d1a555

Browse files
authored
feat(codegen): add user agent for non AWS clients (#2415)
1 parent 644b2dc commit 6d1a555

File tree

3 files changed

+119
-14
lines changed

3 files changed

+119
-14
lines changed

codegen/smithy-aws-typescript-codegen/src/main/java/software/amazon/smithy/aws/typescript/codegen/AddUserAgentDependency.java

+10-14
Original file line numberDiff line numberDiff line change
@@ -36,16 +36,13 @@
3636
/**
3737
* Add client plubins and configs to support injecting user agent.
3838
*/
39-
// TODO: Looks to add this back for non-AWS service clients, by fixing the dependency on ClientSharedValues.serviceId
4039
@SmithyInternalApi
4140
public class AddUserAgentDependency implements TypeScriptIntegration {
4241
@Override
4342
public List<RuntimeClientPlugin> getClientPlugins() {
4443
return ListUtils.of(
4544
RuntimeClientPlugin.builder()
46-
.withConventions(AwsDependency.MIDDLEWARE_USER_AGENT.dependency, "UserAgent")
47-
.servicePredicate((m, s) -> isAwsService(s))
48-
.build());
45+
.withConventions(AwsDependency.MIDDLEWARE_USER_AGENT.dependency, "UserAgent").build());
4946
}
5047

5148
@Override
@@ -55,9 +52,6 @@ public void addConfigInterfaceFields(
5552
SymbolProvider symbolProvider,
5653
TypeScriptWriter writer
5754
) {
58-
if (!isAwsService(settings, model)) {
59-
return;
60-
}
6155
writer.addImport("Provider", "Provider", TypeScriptDependency.AWS_SDK_TYPES.packageName);
6256
writer.addImport("UserAgent", "__UserAgent", TypeScriptDependency.AWS_SDK_TYPES.packageName);
6357
writer.writeDocs("The provider populating default tracking information to be sent with `user-agent`, "
@@ -72,9 +66,6 @@ public Map<String, Consumer<TypeScriptWriter>> getRuntimeConfigWriters(
7266
SymbolProvider symbolProvider,
7367
LanguageTarget target
7468
) {
75-
if (!isAwsService(settings, model)) {
76-
return Collections.emptyMap();
77-
}
7869
switch (target) {
7970
case NODE:
8071
return MapUtils.of(
@@ -83,8 +74,7 @@ public Map<String, Consumer<TypeScriptWriter>> getRuntimeConfigWriters(
8374
writer.addImport("defaultUserAgent", "defaultUserAgent",
8475
AwsDependency.AWS_SDK_UTIL_USER_AGENT_NODE.packageName);
8576
writer.addDefaultImport("packageInfo", "./package.json");
86-
writer.write("defaultUserAgentProvider: defaultUserAgent({serviceId: "
87-
+ "ClientSharedValues.serviceId, clientVersion: packageInfo.version}),");
77+
writeDefaultUserAgentProvider(writer, settings, model);
8878
}
8979
);
9080
case BROWSER:
@@ -94,12 +84,18 @@ public Map<String, Consumer<TypeScriptWriter>> getRuntimeConfigWriters(
9484
writer.addImport("defaultUserAgent", "defaultUserAgent",
9585
AwsDependency.AWS_SDK_UTIL_USER_AGENT_BROWSER.packageName);
9686
writer.addDefaultImport("packageInfo", "./package.json");
97-
writer.write("defaultUserAgentProvider: defaultUserAgent({serviceId: "
98-
+ "ClientSharedValues.serviceId, clientVersion: packageInfo.version}),");
87+
writeDefaultUserAgentProvider(writer, settings, model);
9988
}
10089
);
10190
default:
10291
return Collections.emptyMap();
10392
}
10493
}
94+
95+
private void writeDefaultUserAgentProvider(TypeScriptWriter writer, TypeScriptSettings settings, Model model) {
96+
writer.write("defaultUserAgentProvider: defaultUserAgent({"
97+
// serviceId is optional in defaultUserAgent. serviceId exists only for AWS services
98+
+ (isAwsService(settings, model) ? "serviceId: ClientSharedValues.serviceId, " : "")
99+
+ "clientVersion: packageInfo.version}),");
100+
}
105101
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
package software.amazon.smithy.aws.typescript.codegen;
2+
3+
import static org.hamcrest.MatcherAssert.assertThat;
4+
import static org.hamcrest.Matchers.containsString;
5+
import static org.hamcrest.Matchers.not;
6+
7+
import org.junit.jupiter.api.Test;
8+
import software.amazon.smithy.build.MockManifest;
9+
import software.amazon.smithy.build.PluginContext;
10+
import software.amazon.smithy.model.Model;
11+
import software.amazon.smithy.model.node.Node;
12+
import software.amazon.smithy.typescript.codegen.TypeScriptCodegenPlugin;
13+
14+
public class AddUserAgentDependencyTest {
15+
@Test
16+
public void addsUserAgentForAwsService() {
17+
Model model = Model.assembler()
18+
.addImport(getClass().getResource("NotSame.smithy"))
19+
.discoverModels()
20+
.assemble()
21+
.unwrap();
22+
MockManifest manifest = new MockManifest();
23+
PluginContext context = PluginContext.builder()
24+
.pluginClassLoader(getClass().getClassLoader())
25+
.model(model)
26+
.fileManifest(manifest)
27+
.settings(Node.objectNodeBuilder()
28+
.withMember("service", Node.from("smithy.example#OriginalName"))
29+
.withMember("package", Node.from("example"))
30+
.withMember("packageVersion", Node.from("1.0.0"))
31+
.build())
32+
.build();
33+
new TypeScriptCodegenPlugin().execute(context);
34+
35+
// Check that one of the many dependencies was added.
36+
assertThat(manifest.getFileString("package.json").get(),
37+
containsString(AwsDependency.AWS_SDK_UTIL_USER_AGENT_NODE.packageName));
38+
39+
// Check that both the config files were updated.
40+
assertThat(manifest.getFileString("runtimeConfig.ts").get(), containsString("defaultUserAgent"));
41+
assertThat(manifest.getFileString("runtimeConfig.ts").get(), containsString("packageInfo.version"));
42+
assertThat(manifest.getFileString("runtimeConfig.ts").get(), containsString("ClientSharedValues.serviceId"));
43+
44+
assertThat(manifest.getFileString("runtimeConfig.browser.ts").get(), containsString("defaultUserAgent"));
45+
assertThat(manifest.getFileString("runtimeConfig.browser.ts").get(), containsString("packageInfo.version"));
46+
assertThat(manifest.getFileString("runtimeConfig.browser.ts").get(), containsString("ClientSharedValues.serviceId"));
47+
48+
// Check that the dependency interface was updated.
49+
assertThat(manifest.getFileString("NotSameClient.ts").get(), containsString("defaultUserAgentProvider?"));
50+
}
51+
52+
@Test
53+
public void addsUserAgentForNonAwsService() {
54+
Model model = Model.assembler()
55+
.addImport(getClass().getResource("NonAwsService.smithy"))
56+
.discoverModels()
57+
.assemble()
58+
.unwrap();
59+
MockManifest manifest = new MockManifest();
60+
PluginContext context = PluginContext.builder()
61+
.pluginClassLoader(getClass().getClassLoader())
62+
.model(model)
63+
.fileManifest(manifest)
64+
.settings(Node.objectNodeBuilder()
65+
.withMember("service", Node.from("smithy.example#ExampleService"))
66+
.withMember("package", Node.from("example"))
67+
.withMember("packageVersion", Node.from("1.0.0"))
68+
.build())
69+
.build();
70+
new TypeScriptCodegenPlugin().execute(context);
71+
72+
// Check that one of the many dependencies was added.
73+
assertThat(manifest.getFileString("package.json").get(),
74+
containsString(AwsDependency.AWS_SDK_UTIL_USER_AGENT_NODE.packageName));
75+
76+
// Check that both the config files were updated.
77+
assertThat(manifest.getFileString("runtimeConfig.ts").get(), containsString("defaultUserAgent"));
78+
assertThat(manifest.getFileString("runtimeConfig.ts").get(), containsString("packageInfo.version"));
79+
assertThat(manifest.getFileString("runtimeConfig.ts").get(), not(containsString("ClientSharedValues.serviceId")));
80+
81+
assertThat(manifest.getFileString("runtimeConfig.browser.ts").get(), containsString("defaultUserAgent"));
82+
assertThat(manifest.getFileString("runtimeConfig.browser.ts").get(), containsString("packageInfo.version"));
83+
assertThat(manifest.getFileString("runtimeConfig.browser.ts").get(), not(containsString("ClientSharedValues.serviceId")));
84+
85+
// Check that the dependency interface was updated.
86+
assertThat(manifest.getFileString("ExampleServiceClient.ts").get(), containsString("defaultUserAgentProvider?"));
87+
}
88+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
namespace smithy.example
2+
3+
use aws.protocols#restJson1
4+
5+
@restJson1
6+
service ExampleService {
7+
version: "2019-10-15",
8+
operations: [GetFoo]
9+
}
10+
11+
operation GetFoo {
12+
input: GetFooInput,
13+
output: GetFooOutput,
14+
errors: [GetFooError]
15+
}
16+
17+
structure GetFooInput {}
18+
structure GetFooOutput {}
19+
20+
@error("client")
21+
structure GetFooError {}

0 commit comments

Comments
 (0)