Skip to content

Commit 4c4cbfc

Browse files
committed
Skip integrations that are not relevant for non-AWS services
This is an initial version to get a working version of generated code that compiles without manual edits in smithy-typescript-ssdk-demo. I expect to make updates to this logic.
1 parent b4263ea commit 4c4cbfc

File tree

7 files changed

+105
-52
lines changed

7 files changed

+105
-52
lines changed

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

+11-4
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@
4444
/**
4545
* Configure clients with AWS auth configurations and plugin.
4646
*/
47+
// TODO: Should this check for the presence of SigV4 trait instead of assuming the AWS service supports it?
48+
// TODO: Think about AWS Auth supported for only some operations and not all, when not AWS service
4749
public final class AddAwsAuthPlugin implements TypeScriptIntegration {
4850

4951
@Override
@@ -54,7 +56,7 @@ public void addConfigInterfaceFields(
5456
TypeScriptWriter writer
5557
) {
5658
ServiceShape service = settings.getService(model);
57-
if (!areAllOptionalAuthOperations(model, service)) {
59+
if (isAwsService(service) && !areAllOptionalAuthOperations(model, service)) {
5860
writer.addImport("Credentials", "__Credentials", TypeScriptDependency.AWS_SDK_TYPES.packageName);
5961
writer.writeDocs("Default credentials provider; Not available in browser runtime.")
6062
.write("credentialDefaultProvider?: (input: any) => __Provider<__Credentials>;\n");
@@ -66,16 +68,17 @@ public List<RuntimeClientPlugin> getClientPlugins() {
6668
return ListUtils.of(
6769
RuntimeClientPlugin.builder()
6870
.withConventions(AwsDependency.MIDDLEWARE_SIGNING.dependency, "AwsAuth", HAS_CONFIG)
69-
.servicePredicate((m, s) -> !areAllOptionalAuthOperations(m, s))
71+
.servicePredicate((m, s) -> isAwsService(s) && !areAllOptionalAuthOperations(m, s))
7072
.build(),
7173
RuntimeClientPlugin.builder()
7274
.withConventions(AwsDependency.MIDDLEWARE_SIGNING.dependency, "AwsAuth", HAS_MIDDLEWARE)
7375
// See operationUsesAwsAuth() below for AwsAuth Middleware customizations.
7476
.servicePredicate(
75-
(m, s) -> !testServiceId(s, "STS") && !hasOptionalAuthOperation(m, s)
77+
(m, s) -> isAwsService(s) && !testServiceId(s, "STS") && !hasOptionalAuthOperation(m, s)
7678
).build(),
7779
RuntimeClientPlugin.builder()
7880
.withConventions(AwsDependency.MIDDLEWARE_SIGNING.dependency, "AwsAuth", HAS_MIDDLEWARE)
81+
// TODO: Does isAwsService need to be checked here again?
7982
.operationPredicate(AddAwsAuthPlugin::operationUsesAwsAuth)
8083
.build()
8184
);
@@ -89,7 +92,7 @@ public Map<String, Consumer<TypeScriptWriter>> getRuntimeConfigWriters(
8992
LanguageTarget target
9093
) {
9194
ServiceShape service = settings.getService(model);
92-
if (areAllOptionalAuthOperations(model, service)) {
95+
if (!isAwsService(service) || areAllOptionalAuthOperations(model, service)) {
9396
return Collections.emptyMap();
9497
}
9598
switch (target) {
@@ -119,6 +122,10 @@ private static boolean testServiceId(Shape serviceShape, String expectedId) {
119122
return serviceShape.getTrait(ServiceTrait.class).map(ServiceTrait::getSdkId).orElse("").equals(expectedId);
120123
}
121124

125+
private static boolean isAwsService(Shape serviceShape) {
126+
return serviceShape.getTrait(ServiceTrait.class).isPresent();
127+
}
128+
122129
private static boolean operationUsesAwsAuth(Model model, ServiceShape service, OperationShape operation) {
123130
// STS doesn't need auth for AssumeRoleWithWebIdentity, AssumeRoleWithSAML.
124131
// Remove when optionalAuth model update is published in 0533102932.

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

+50-38
Original file line numberDiff line numberDiff line change
@@ -82,10 +82,12 @@ public void addConfigInterfaceFields(
8282
writer.addImport("Provider", "__Provider", TypeScriptDependency.AWS_SDK_TYPES.packageName);
8383
writer.addImport("Logger", "__Logger", TypeScriptDependency.AWS_SDK_TYPES.packageName);
8484

85-
writer.writeDocs("Unique service identifier.\n@internal")
86-
.write("serviceId?: string;\n");
87-
writer.writeDocs("The AWS region to which this client will send requests")
88-
.write("region?: string | __Provider<string>;\n");
85+
if (isAwsService(settings, model)) {
86+
writer.writeDocs("Unique service identifier.\n@internal")
87+
.write("serviceId?: string;\n");
88+
writer.writeDocs("The AWS region to which this client will send requests")
89+
.write("region?: string | __Provider<string>;\n");
90+
}
8991
writer.writeDocs("Value for how many times a request will be made at most in case of retry.")
9092
.write("maxAttempts?: number | __Provider<number>;\n");
9193
writer.writeDocs("Optional logger for logging debug/info/warn/error.")
@@ -114,11 +116,12 @@ public Map<String, Consumer<TypeScriptWriter>> getRuntimeConfigWriters(
114116
+ "trait was found on " + service.getId());
115117
}
116118
}
117-
runtimeConfigs.putAll(getDefaultConfig(target));
119+
runtimeConfigs.putAll(getDefaultConfig(target, isAwsService(settings, model)));
118120
return runtimeConfigs;
119121
}
120122

121-
private Map<String, Consumer<TypeScriptWriter>> getDefaultConfig(LanguageTarget target) {
123+
private Map<String, Consumer<TypeScriptWriter>> getDefaultConfig(LanguageTarget target, boolean isAwsService) {
124+
Map<String, Consumer<TypeScriptWriter>> defaultConfigs = new HashMap();
122125
switch (target) {
123126
case SHARED:
124127
return MapUtils.of(
@@ -128,42 +131,51 @@ private Map<String, Consumer<TypeScriptWriter>> getDefaultConfig(LanguageTarget
128131
}
129132
);
130133
case BROWSER:
131-
return MapUtils.of(
132-
"region", writer -> {
133-
writer.addDependency(TypeScriptDependency.INVALID_DEPENDENCY);
134-
writer.addImport("invalidProvider", "invalidProvider",
135-
TypeScriptDependency.INVALID_DEPENDENCY.packageName);
136-
writer.write("region: invalidProvider(\"Region is missing\"),");
137-
},
138-
"maxAttempts", writer -> {
139-
writer.addDependency(TypeScriptDependency.MIDDLEWARE_RETRY);
140-
writer.addImport("DEFAULT_MAX_ATTEMPTS", "DEFAULT_MAX_ATTEMPTS",
141-
TypeScriptDependency.MIDDLEWARE_RETRY.packageName);
142-
writer.write("maxAttempts: DEFAULT_MAX_ATTEMPTS,");
143-
}
144-
);
134+
if (isAwsService) {
135+
defaultConfigs.put("region", writer -> {
136+
writer.addDependency(TypeScriptDependency.INVALID_DEPENDENCY);
137+
writer.addImport("invalidProvider", "invalidProvider",
138+
TypeScriptDependency.INVALID_DEPENDENCY.packageName);
139+
writer.write("region: invalidProvider(\"Region is missing\"),");
140+
});
141+
}
142+
defaultConfigs.put("maxAttempts", writer -> {
143+
writer.addDependency(TypeScriptDependency.MIDDLEWARE_RETRY);
144+
writer.addImport("DEFAULT_MAX_ATTEMPTS", "DEFAULT_MAX_ATTEMPTS",
145+
TypeScriptDependency.MIDDLEWARE_RETRY.packageName);
146+
writer.write("maxAttempts: DEFAULT_MAX_ATTEMPTS,");
147+
});
148+
return defaultConfigs;
145149
case NODE:
146-
return MapUtils.of(
147-
"region", writer -> {
148-
writer.addDependency(AwsDependency.NODE_CONFIG_PROVIDER);
149-
writer.addImport("loadConfig", "loadNodeConfig",
150-
AwsDependency.NODE_CONFIG_PROVIDER.packageName);
151-
writer.addDependency(TypeScriptDependency.CONFIG_RESOLVER);
152-
writer.addImport("NODE_REGION_CONFIG_OPTIONS", "NODE_REGION_CONFIG_OPTIONS",
153-
TypeScriptDependency.CONFIG_RESOLVER.packageName);
154-
writer.addImport("NODE_REGION_CONFIG_FILE_OPTIONS", "NODE_REGION_CONFIG_FILE_OPTIONS",
155-
TypeScriptDependency.CONFIG_RESOLVER.packageName);
156-
writer.write(
150+
if (isAwsService) {
151+
defaultConfigs.put("region", writer -> {
152+
writer.addDependency(AwsDependency.NODE_CONFIG_PROVIDER);
153+
writer.addImport("loadConfig", "loadNodeConfig",
154+
AwsDependency.NODE_CONFIG_PROVIDER.packageName);
155+
writer.addDependency(TypeScriptDependency.CONFIG_RESOLVER);
156+
writer.addImport("NODE_REGION_CONFIG_OPTIONS", "NODE_REGION_CONFIG_OPTIONS",
157+
TypeScriptDependency.CONFIG_RESOLVER.packageName);
158+
writer.addImport("NODE_REGION_CONFIG_FILE_OPTIONS", "NODE_REGION_CONFIG_FILE_OPTIONS",
159+
TypeScriptDependency.CONFIG_RESOLVER.packageName);
160+
writer.write(
157161
"region: loadNodeConfig(NODE_REGION_CONFIG_OPTIONS, NODE_REGION_CONFIG_FILE_OPTIONS),");
158-
},
159-
"maxAttempts", writer -> {
160-
writer.addImport("NODE_MAX_ATTEMPT_CONFIG_OPTIONS", "NODE_MAX_ATTEMPT_CONFIG_OPTIONS",
161-
TypeScriptDependency.MIDDLEWARE_RETRY.packageName);
162-
writer.write("maxAttempts: loadNodeConfig(NODE_MAX_ATTEMPT_CONFIG_OPTIONS),");
163-
}
164-
);
162+
});
163+
}
164+
defaultConfigs.put("maxAttempts", writer -> {
165+
writer.addDependency(AwsDependency.NODE_CONFIG_PROVIDER);
166+
writer.addImport("loadConfig", "loadNodeConfig",
167+
AwsDependency.NODE_CONFIG_PROVIDER.packageName);
168+
writer.addImport("NODE_MAX_ATTEMPT_CONFIG_OPTIONS", "NODE_MAX_ATTEMPT_CONFIG_OPTIONS",
169+
TypeScriptDependency.MIDDLEWARE_RETRY.packageName);
170+
writer.write("maxAttempts: loadNodeConfig(NODE_MAX_ATTEMPT_CONFIG_OPTIONS),");
171+
});
172+
return defaultConfigs;
165173
default:
166174
return Collections.emptyMap();
167175
}
168176
}
177+
178+
private static boolean isAwsService(TypeScriptSettings settings, Model model) {
179+
return settings.getService(model).getTrait(ServiceTrait.class).isPresent();
180+
}
169181
}

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

+5
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ public List<RuntimeClientPlugin> getClientPlugins() {
4444
return ListUtils.of(
4545
RuntimeClientPlugin.builder()
4646
.withConventions(TypeScriptDependency.CONFIG_RESOLVER.dependency, "Region", HAS_CONFIG)
47+
.servicePredicate((m, s) -> testAwsService(s))
4748
.build(),
4849
RuntimeClientPlugin.builder()
4950
.withConventions(TypeScriptDependency.CONFIG_RESOLVER.dependency, "Endpoints", HAS_CONFIG)
@@ -130,4 +131,8 @@ private static boolean testInputContainsMember(
130131
private static boolean testServiceId(Shape serviceShape, String expectedId) {
131132
return serviceShape.getTrait(ServiceTrait.class).map(ServiceTrait::getSdkId).orElse("").equals(expectedId);
132133
}
134+
135+
private static boolean testAwsService(Shape serviceShape) {
136+
return serviceShape.getTrait(ServiceTrait.class).isPresent();
137+
}
133138
}

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

+24-6
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,10 @@
1919
import java.util.List;
2020
import java.util.Map;
2121
import java.util.function.Consumer;
22+
import software.amazon.smithy.aws.traits.ServiceTrait;
2223
import software.amazon.smithy.codegen.core.SymbolProvider;
2324
import software.amazon.smithy.model.Model;
25+
import software.amazon.smithy.model.shapes.ServiceShape;
2426
import software.amazon.smithy.typescript.codegen.LanguageTarget;
2527
import software.amazon.smithy.typescript.codegen.TypeScriptDependency;
2628
import software.amazon.smithy.typescript.codegen.TypeScriptSettings;
@@ -33,12 +35,15 @@
3335
/**
3436
* Add client plubins and configs to support injecting user agent.
3537
*/
38+
// TODO: Looks to add this back for non-AWS service clients, by fixing the dependency on ClientSharedValues.serviceId
3639
public class AddUserAgentDependency implements TypeScriptIntegration {
3740
@Override
3841
public List<RuntimeClientPlugin> getClientPlugins() {
3942
return ListUtils.of(
4043
RuntimeClientPlugin.builder()
41-
.withConventions(AwsDependency.MIDDLEWARE_USER_AGENT.dependency, "UserAgent").build());
44+
.withConventions(AwsDependency.MIDDLEWARE_USER_AGENT.dependency, "UserAgent")
45+
.servicePredicate((m, s) -> isAwsService(s))
46+
.build());
4247
}
4348

4449
@Override
@@ -48,11 +53,13 @@ public void addConfigInterfaceFields(
4853
SymbolProvider symbolProvider,
4954
TypeScriptWriter writer
5055
) {
51-
writer.addImport("Provider", "Provider", TypeScriptDependency.AWS_SDK_TYPES.packageName);
52-
writer.addImport("UserAgent", "__UserAgent", TypeScriptDependency.AWS_SDK_TYPES.packageName);
53-
writer.writeDocs("The provider populating default tracking information to be sent with `user-agent`, "
54-
+ "`x-amz-user-agent` header\n@internal");
55-
writer.write("defaultUserAgentProvider?: Provider<__UserAgent>;\n");
56+
if (isAwsService(settings, model)) {
57+
writer.addImport("Provider", "Provider", TypeScriptDependency.AWS_SDK_TYPES.packageName);
58+
writer.addImport("UserAgent", "__UserAgent", TypeScriptDependency.AWS_SDK_TYPES.packageName);
59+
writer.writeDocs("The provider populating default tracking information to be sent with `user-agent`, "
60+
+ "`x-amz-user-agent` header\n@internal");
61+
writer.write("defaultUserAgentProvider?: Provider<__UserAgent>;\n");
62+
}
5663
}
5764

5865
@Override
@@ -62,6 +69,9 @@ public Map<String, Consumer<TypeScriptWriter>> getRuntimeConfigWriters(
6269
SymbolProvider symbolProvider,
6370
LanguageTarget target
6471
) {
72+
if (!isAwsService(settings, model)) {
73+
return Collections.emptyMap();
74+
}
6575
switch (target) {
6676
case NODE:
6777
return MapUtils.of(
@@ -89,4 +99,12 @@ public Map<String, Consumer<TypeScriptWriter>> getRuntimeConfigWriters(
8999
return Collections.emptyMap();
90100
}
91101
}
102+
103+
private static boolean isAwsService(TypeScriptSettings settings, Model model) {
104+
return isAwsService(settings.getService(model));
105+
}
106+
107+
private static boolean isAwsService(ServiceShape serviceShape) {
108+
return serviceShape.getTrait(ServiceTrait.class).isPresent();
109+
}
92110
}

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

+8-3
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import java.util.Map;
2020
import java.util.function.BiConsumer;
2121
import java.util.function.Consumer;
22+
import software.amazon.smithy.aws.traits.ServiceTrait;
2223
import software.amazon.smithy.codegen.core.SymbolProvider;
2324
import software.amazon.smithy.model.Model;
2425
import software.amazon.smithy.typescript.codegen.LanguageTarget;
@@ -39,7 +40,7 @@ public void writeAdditionalFiles(
3940
SymbolProvider symbolProvider,
4041
BiConsumer<String, Consumer<TypeScriptWriter>> writerFactory
4142
) {
42-
if (!settings.generateClient()) {
43+
if (!settings.generateClient() || !isAwsService(settings, model)) {
4344
return;
4445
}
4546

@@ -55,7 +56,7 @@ public void addConfigInterfaceFields(
5556
SymbolProvider symbolProvider,
5657
TypeScriptWriter writer
5758
) {
58-
if (!settings.generateClient()) {
59+
if (!settings.generateClient() || !isAwsService(settings, model)) {
5960
return;
6061
}
6162

@@ -71,7 +72,7 @@ public Map<String, Consumer<TypeScriptWriter>> getRuntimeConfigWriters(
7172
SymbolProvider symbolProvider,
7273
LanguageTarget target
7374
) {
74-
if (!settings.generateClient()) {
75+
if (!settings.generateClient() || !isAwsService(settings, model)) {
7576
return Collections.emptyMap();
7677
}
7778

@@ -85,4 +86,8 @@ public Map<String, Consumer<TypeScriptWriter>> getRuntimeConfigWriters(
8586
return Collections.emptyMap();
8687
}
8788
}
89+
90+
private static boolean isAwsService(TypeScriptSettings settings, Model model) {
91+
return settings.getService(model).getTrait(ServiceTrait.class).isPresent();
92+
}
8893
}

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

+6-1
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,8 @@ public void writeAdditionalFiles(
5656
writer.write(resource);
5757
});
5858

59-
if (!settings.generateClient()) {
59+
// TODO: May need to generate a different/modified README.md for these cases
60+
if (!settings.generateClient() || !isAwsService(settings, model)) {
6061
return;
6162
}
6263

@@ -89,4 +90,8 @@ public void writeAdditionalFiles(
8990
writer.write(resource);
9091
});
9192
}
93+
94+
private static boolean isAwsService(TypeScriptSettings settings, Model model) {
95+
return settings.getService(model).getTrait(ServiceTrait.class).isPresent();
96+
}
9297
}

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

+1
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ public SymbolProvider decorateSymbolProvider(
4444
return symbol;
4545
}
4646

47+
// TODO: Should this WARNING be avoided somehow if client is not for an AWS service?
4748
// If the SDK service ID trait is present, use that, otherwise fall back to
4849
// the default naming strategy for the service.
4950
return shape.getTrait(ServiceTrait.class)

0 commit comments

Comments
 (0)