Skip to content
Merged
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
Original file line number Diff line number Diff line change
Expand Up @@ -36,16 +36,13 @@
/**
* Add client plubins and configs to support injecting user agent.
*/
// TODO: Looks to add this back for non-AWS service clients, by fixing the dependency on ClientSharedValues.serviceId
@SmithyInternalApi
public class AddUserAgentDependency implements TypeScriptIntegration {
@Override
public List<RuntimeClientPlugin> getClientPlugins() {
return ListUtils.of(
RuntimeClientPlugin.builder()
.withConventions(AwsDependency.MIDDLEWARE_USER_AGENT.dependency, "UserAgent")
.servicePredicate((m, s) -> isAwsService(s))
.build());
.withConventions(AwsDependency.MIDDLEWARE_USER_AGENT.dependency, "UserAgent").build());
}

@Override
Expand All @@ -55,9 +52,6 @@ public void addConfigInterfaceFields(
SymbolProvider symbolProvider,
TypeScriptWriter writer
) {
if (!isAwsService(settings, model)) {
return;
}
writer.addImport("Provider", "Provider", TypeScriptDependency.AWS_SDK_TYPES.packageName);
writer.addImport("UserAgent", "__UserAgent", TypeScriptDependency.AWS_SDK_TYPES.packageName);
writer.writeDocs("The provider populating default tracking information to be sent with `user-agent`, "
Expand All @@ -72,9 +66,6 @@ public Map<String, Consumer<TypeScriptWriter>> getRuntimeConfigWriters(
SymbolProvider symbolProvider,
LanguageTarget target
) {
if (!isAwsService(settings, model)) {
return Collections.emptyMap();
}
switch (target) {
case NODE:
return MapUtils.of(
Expand All @@ -83,8 +74,7 @@ public Map<String, Consumer<TypeScriptWriter>> getRuntimeConfigWriters(
writer.addImport("defaultUserAgent", "defaultUserAgent",
AwsDependency.AWS_SDK_UTIL_USER_AGENT_NODE.packageName);
writer.addDefaultImport("packageInfo", "./package.json");
writer.write("defaultUserAgentProvider: defaultUserAgent({serviceId: "
+ "ClientSharedValues.serviceId, clientVersion: packageInfo.version}),");
writeDefaultUserAgentProvider(writer, settings, model);
}
);
case BROWSER:
Expand All @@ -94,12 +84,18 @@ public Map<String, Consumer<TypeScriptWriter>> getRuntimeConfigWriters(
writer.addImport("defaultUserAgent", "defaultUserAgent",
AwsDependency.AWS_SDK_UTIL_USER_AGENT_BROWSER.packageName);
writer.addDefaultImport("packageInfo", "./package.json");
writer.write("defaultUserAgentProvider: defaultUserAgent({serviceId: "
+ "ClientSharedValues.serviceId, clientVersion: packageInfo.version}),");
writeDefaultUserAgentProvider(writer, settings, model);
}
);
default:
return Collections.emptyMap();
}
}

private void writeDefaultUserAgentProvider(TypeScriptWriter writer, TypeScriptSettings settings, Model model) {
writer.write("defaultUserAgentProvider: defaultUserAgent({"
// serviceId is optional in defaultUserAgent. serviceId exists only for AWS services
+ (isAwsService(settings, model) ? "serviceId: ClientSharedValues.serviceId, " : "")
+ "clientVersion: packageInfo.version}),");
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
package software.amazon.smithy.aws.typescript.codegen;

import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.not;

import org.junit.jupiter.api.Test;
import software.amazon.smithy.build.MockManifest;
import software.amazon.smithy.build.PluginContext;
import software.amazon.smithy.model.Model;
import software.amazon.smithy.model.node.Node;
import software.amazon.smithy.typescript.codegen.TypeScriptCodegenPlugin;

public class AddUserAgentDependencyTest {
@Test
public void addsUserAgentForAwsService() {
Model model = Model.assembler()
.addImport(getClass().getResource("NotSame.smithy"))
.discoverModels()
.assemble()
.unwrap();
MockManifest manifest = new MockManifest();
PluginContext context = PluginContext.builder()
.pluginClassLoader(getClass().getClassLoader())
.model(model)
.fileManifest(manifest)
.settings(Node.objectNodeBuilder()
.withMember("service", Node.from("smithy.example#OriginalName"))
.withMember("package", Node.from("example"))
.withMember("packageVersion", Node.from("1.0.0"))
.build())
.build();
new TypeScriptCodegenPlugin().execute(context);

// Check that one of the many dependencies was added.
assertThat(manifest.getFileString("package.json").get(),
containsString(AwsDependency.AWS_SDK_UTIL_USER_AGENT_NODE.packageName));

// Check that both the config files were updated.
assertThat(manifest.getFileString("runtimeConfig.ts").get(), containsString("defaultUserAgent"));
assertThat(manifest.getFileString("runtimeConfig.ts").get(), containsString("packageInfo.version"));
assertThat(manifest.getFileString("runtimeConfig.ts").get(), containsString("ClientSharedValues.serviceId"));

assertThat(manifest.getFileString("runtimeConfig.browser.ts").get(), containsString("defaultUserAgent"));
assertThat(manifest.getFileString("runtimeConfig.browser.ts").get(), containsString("packageInfo.version"));
assertThat(manifest.getFileString("runtimeConfig.browser.ts").get(), containsString("ClientSharedValues.serviceId"));

// Check that the dependency interface was updated.
assertThat(manifest.getFileString("NotSameClient.ts").get(), containsString("defaultUserAgentProvider?"));
}

@Test
public void addsUserAgentForNonAwsService() {
Model model = Model.assembler()
.addImport(getClass().getResource("NonAwsService.smithy"))
.discoverModels()
.assemble()
.unwrap();
MockManifest manifest = new MockManifest();
PluginContext context = PluginContext.builder()
.pluginClassLoader(getClass().getClassLoader())
.model(model)
.fileManifest(manifest)
.settings(Node.objectNodeBuilder()
.withMember("service", Node.from("smithy.example#ExampleService"))
.withMember("package", Node.from("example"))
.withMember("packageVersion", Node.from("1.0.0"))
.build())
.build();
new TypeScriptCodegenPlugin().execute(context);

// Check that one of the many dependencies was added.
assertThat(manifest.getFileString("package.json").get(),
containsString(AwsDependency.AWS_SDK_UTIL_USER_AGENT_NODE.packageName));

// Check that both the config files were updated.
assertThat(manifest.getFileString("runtimeConfig.ts").get(), containsString("defaultUserAgent"));
assertThat(manifest.getFileString("runtimeConfig.ts").get(), containsString("packageInfo.version"));
assertThat(manifest.getFileString("runtimeConfig.ts").get(), not(containsString("ClientSharedValues.serviceId")));

assertThat(manifest.getFileString("runtimeConfig.browser.ts").get(), containsString("defaultUserAgent"));
assertThat(manifest.getFileString("runtimeConfig.browser.ts").get(), containsString("packageInfo.version"));
assertThat(manifest.getFileString("runtimeConfig.browser.ts").get(), not(containsString("ClientSharedValues.serviceId")));

// Check that the dependency interface was updated.
assertThat(manifest.getFileString("ExampleServiceClient.ts").get(), containsString("defaultUserAgentProvider?"));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
namespace smithy.example

use aws.protocols#restJson1

@restJson1
service ExampleService {
version: "2019-10-15",
operations: [GetFoo]
}

operation GetFoo {
input: GetFooInput,
output: GetFooOutput,
errors: [GetFooError]
}

structure GetFooInput {}
structure GetFooOutput {}

@error("client")
structure GetFooError {}