Skip to content

Commit e1cf653

Browse files
authored
change runtime config from constant to provider functions (#381)
* make runtime config functional * assign configs not defined in runtime config
1 parent d06f8b6 commit e1cf653

File tree

10 files changed

+81
-61
lines changed

10 files changed

+81
-61
lines changed

smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/RuntimeConfigGenerator.java

Lines changed: 30 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -46,118 +46,118 @@ final class RuntimeConfigGenerator {
4646
writer.addDependency(TypeScriptDependency.AWS_SDK_NODE_HTTP_HANDLER);
4747
writer.addImport("NodeHttpHandler", "NodeHttpHandler",
4848
TypeScriptDependency.AWS_SDK_NODE_HTTP_HANDLER.packageName);
49-
writer.write("requestHandler: new NodeHttpHandler(),");
49+
writer.write("new NodeHttpHandler()");
5050
},
5151
"sha256", writer -> {
5252
writer.addDependency(TypeScriptDependency.AWS_SDK_HASH_NODE);
5353
writer.addImport("Hash", "Hash",
5454
TypeScriptDependency.AWS_SDK_HASH_NODE.packageName);
55-
writer.write("sha256: Hash.bind(null, \"sha256\"),");
55+
writer.write("Hash.bind(null, \"sha256\")");
5656
},
5757
"bodyLengthChecker", writer -> {
5858
writer.addDependency(TypeScriptDependency.AWS_SDK_UTIL_BODY_LENGTH_NODE);
5959
writer.addImport("calculateBodyLength", "calculateBodyLength",
6060
TypeScriptDependency.AWS_SDK_UTIL_BODY_LENGTH_NODE.packageName);
61-
writer.write("bodyLengthChecker: calculateBodyLength,");
61+
writer.write("calculateBodyLength");
6262
},
6363
"streamCollector", writer -> {
6464
writer.addDependency(TypeScriptDependency.AWS_SDK_NODE_HTTP_HANDLER);
6565
writer.addImport("streamCollector", "streamCollector",
6666
TypeScriptDependency.AWS_SDK_NODE_HTTP_HANDLER.packageName);
67-
writer.write("streamCollector,");
67+
writer.write("streamCollector");
6868
},
6969
"base64Decoder", writer -> {
7070
writer.addDependency(TypeScriptDependency.AWS_SDK_UTIL_BASE64_NODE);
7171
writer.addImport("fromBase64", "fromBase64",
7272
TypeScriptDependency.AWS_SDK_UTIL_BASE64_NODE.packageName);
73-
writer.write("base64Decoder: fromBase64,");
73+
writer.write("fromBase64");
7474
},
7575
"base64Encoder", writer -> {
7676
writer.addDependency(TypeScriptDependency.AWS_SDK_UTIL_BASE64_NODE);
7777
writer.addImport("toBase64", "toBase64",
7878
TypeScriptDependency.AWS_SDK_UTIL_BASE64_NODE.packageName);
79-
writer.write("base64Encoder: toBase64,");
79+
writer.write("toBase64");
8080
},
8181
"utf8Decoder", writer -> {
8282
writer.addDependency(TypeScriptDependency.AWS_SDK_UTIL_UTF8_NODE);
8383
writer.addImport("fromUtf8", "fromUtf8",
8484
TypeScriptDependency.AWS_SDK_UTIL_UTF8_NODE.packageName);
85-
writer.write("utf8Decoder: fromUtf8,");
85+
writer.write("fromUtf8");
8686
},
8787
"utf8Encoder", writer -> {
8888
writer.addDependency(TypeScriptDependency.AWS_SDK_UTIL_UTF8_NODE);
8989
writer.addImport("toUtf8", "toUtf8",
9090
TypeScriptDependency.AWS_SDK_UTIL_UTF8_NODE.packageName);
91-
writer.write("utf8Encoder: toUtf8,");
91+
writer.write("toUtf8");
9292
}
9393
);
9494
private final Map<String, Consumer<TypeScriptWriter>> browserRuntimeConfigDefaults = MapUtils.of(
9595
"requestHandler", writer -> {
9696
writer.addDependency(TypeScriptDependency.AWS_SDK_FETCH_HTTP_HANDLER);
9797
writer.addImport("FetchHttpHandler", "FetchHttpHandler",
9898
TypeScriptDependency.AWS_SDK_FETCH_HTTP_HANDLER.packageName);
99-
writer.write("requestHandler: new FetchHttpHandler(),");
99+
writer.write("new FetchHttpHandler()");
100100
},
101101
"sha256", writer -> {
102102
writer.addDependency(TypeScriptDependency.AWS_CRYPTO_SHA256_BROWSER);
103103
writer.addImport("Sha256", "Sha256",
104104
TypeScriptDependency.AWS_CRYPTO_SHA256_BROWSER.packageName);
105-
writer.write("sha256: Sha256,");
105+
writer.write("Sha256");
106106
},
107107
"bodyLengthChecker", writer -> {
108108
writer.addDependency(TypeScriptDependency.AWS_SDK_UTIL_BODY_LENGTH_BROWSER);
109109
writer.addImport("calculateBodyLength", "calculateBodyLength",
110110
TypeScriptDependency.AWS_SDK_UTIL_BODY_LENGTH_BROWSER.packageName);
111-
writer.write("bodyLengthChecker: calculateBodyLength,");
111+
writer.write("calculateBodyLength");
112112
},
113113
"streamCollector", writer -> {
114114
writer.addDependency(TypeScriptDependency.AWS_SDK_FETCH_HTTP_HANDLER);
115115
writer.addImport("streamCollector", "streamCollector",
116116
TypeScriptDependency.AWS_SDK_FETCH_HTTP_HANDLER.packageName);
117-
writer.write("streamCollector,");
117+
writer.write("streamCollector");
118118
},
119119
"base64Decoder", writer -> {
120120
writer.addDependency(TypeScriptDependency.AWS_SDK_UTIL_BASE64_BROWSER);
121121
writer.addImport("fromBase64", "fromBase64",
122122
TypeScriptDependency.AWS_SDK_UTIL_BASE64_BROWSER.packageName);
123-
writer.write("base64Decoder: fromBase64,");
123+
writer.write("fromBase64");
124124
},
125125
"base64Encoder", writer -> {
126126
writer.addDependency(TypeScriptDependency.AWS_SDK_UTIL_BASE64_BROWSER);
127127
writer.addImport("toBase64", "toBase64",
128128
TypeScriptDependency.AWS_SDK_UTIL_BASE64_BROWSER.packageName);
129-
writer.write("base64Encoder: toBase64,");
129+
writer.write("toBase64");
130130
},
131131
"utf8Decoder", writer -> {
132132
writer.addDependency(TypeScriptDependency.AWS_SDK_UTIL_UTF8_BROWSER);
133133
writer.addImport("fromUtf8", "fromUtf8",
134134
TypeScriptDependency.AWS_SDK_UTIL_UTF8_BROWSER.packageName);
135-
writer.write("utf8Decoder: fromUtf8,");
135+
writer.write("fromUtf8");
136136
},
137137
"utf8Encoder", writer -> {
138138
writer.addDependency(TypeScriptDependency.AWS_SDK_UTIL_UTF8_BROWSER);
139139
writer.addImport("toUtf8", "toUtf8",
140140
TypeScriptDependency.AWS_SDK_UTIL_UTF8_BROWSER.packageName);
141-
writer.write("utf8Encoder: toUtf8,");
141+
writer.write("toUtf8");
142142
}
143143
);
144144
private final Map<String, Consumer<TypeScriptWriter>> reactNativeRuntimeConfigDefaults = MapUtils.of(
145145
"sha256", writer -> {
146146
writer.addDependency(TypeScriptDependency.AWS_CRYPTO_SHA256_JS);
147147
writer.addImport("Sha256", "Sha256",
148148
TypeScriptDependency.AWS_CRYPTO_SHA256_JS.packageName);
149-
writer.write("sha256: Sha256,");
149+
writer.write("Sha256");
150150
}
151151
);
152152
private final Map<String, Consumer<TypeScriptWriter>> sharedRuntimeConfigDefaults = MapUtils.of(
153153
"disableHostPrefix", writer -> {
154-
writer.write("disableHostPrefix: false,");
154+
writer.write("false");
155155
},
156156
"urlParser", writer -> {
157157
writer.addDependency(TypeScriptDependency.AWS_SDK_URL_PARSER);
158158
writer.addImport("parseUrl", "parseUrl",
159159
TypeScriptDependency.AWS_SDK_URL_PARSER.packageName);
160-
writer.write("urlParser: parseUrl,");
160+
writer.write("parseUrl");
161161
}
162162
);
163163

@@ -180,24 +180,31 @@ void generate(LanguageTarget target) {
180180
String template = TypeScriptUtils.loadResourceAsString(target.getTemplateFileName());
181181
String contents = template
182182
.replace("${clientModuleName}", symbolProvider.toSymbol(service).getNamespace())
183+
.replace("${clientConfigName}", symbolProvider.toSymbol(service).getName() + "Config")
183184
.replace("${apiVersion}", service.getVersion())
184185
.replace("$", "$$") // sanitize template place holders.
185186
.replace("$${customizations}", "${L@customizations}");
186187

187188
delegator.useFileWriter(target.getTargetFilename(), writer -> {
188189
// Inject customizations into the ~template.
189-
writer.onSection("customizations", original -> {
190-
writer.indent();
190+
writer.indent().onSection("customizations", original -> {
191191
// Start with defaults, use a TreeMap for keeping entries sorted.
192192
Map<String, Consumer<TypeScriptWriter>> configs =
193193
new TreeMap<>(getDefaultRuntimeConfigs(target));
194194
// Add any integration supplied runtime config writers.
195195
for (TypeScriptIntegration integration : integrations) {
196196
configs.putAll(integration.getRuntimeConfigWriters(settings, model, symbolProvider, target));
197197
}
198-
configs.values().forEach(value -> value.accept(writer));
199-
writer.dedent();
198+
int indentation = target.equals(LanguageTarget.SHARED) ? 1 : 2;
199+
configs.forEach((key, value) -> {
200+
writer.indent(indentation).disableNewlines().openBlock("$1L: config.$1L ?? ", ",\n", key,
201+
() -> {
202+
value.accept(writer);
203+
});
204+
writer.dedent(indentation);
205+
});
200206
});
207+
writer.dedent();
201208
writer.write(contents, "");
202209
});
203210
}

smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/ServiceGenerator.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ static String getResolvedConfigTypeName(Symbol symbol) {
9292
@Override
9393
public void run() {
9494
writer.addImport("Client", "__Client", "@aws-sdk/smithy-client");
95-
writer.addImport("ClientDefaultValues", "__ClientDefaultValues", "./runtimeConfig");
95+
writer.addImport("getRuntimeConfig", "__getRuntimeConfig", "./runtimeConfig");
9696

9797
// Normalize the input and output types of the command to account for
9898
// things like an operation adding input where there once wasn't any
@@ -302,10 +302,8 @@ private void generateConstructor() {
302302
writer.pushState(CLIENT_CONSTRUCTOR_SECTION);
303303

304304
int configVariable = 0;
305-
writer.write("let $L = {\n"
306-
+ " ...__ClientDefaultValues,\n"
307-
+ " ...configuration\n"
308-
+ "};", generateConfigVariable(configVariable));
305+
writer.write("let $L = __getRuntimeConfig(configuration);",
306+
generateConfigVariable(configVariable));
309307

310308
// Add runtime plugin "resolve" method calls. These are invoked one
311309
// after the other until all of the runtime plugins have been called.

smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/integration/AddChecksumRequiredDependency.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -86,26 +86,26 @@ public Map<String, Consumer<TypeScriptWriter>> getRuntimeConfigWriters(
8686
writer.addDependency(TypeScriptDependency.STREAM_HASHER_NODE);
8787
writer.addImport("fileStreamHasher", "streamHasher",
8888
TypeScriptDependency.STREAM_HASHER_NODE.packageName);
89-
writer.write("streamHasher,");
89+
writer.write("streamHasher");
9090
},
9191
"md5", writer -> {
9292
writer.addDependency(TypeScriptDependency.AWS_SDK_TYPES);
9393
writer.addImport("HashConstructor", "__HashConstructor",
9494
TypeScriptDependency.AWS_SDK_TYPES.packageName);
95-
writer.write("md5: Hash.bind(null, \"md5\"),");
95+
writer.write("Hash.bind(null, \"md5\")");
9696
});
9797
case BROWSER:
9898
return MapUtils.of(
9999
"streamHasher", writer -> {
100100
writer.addDependency(TypeScriptDependency.STREAM_HASHER_BROWSER);
101101
writer.addImport("blobHasher", "streamHasher",
102102
TypeScriptDependency.STREAM_HASHER_BROWSER.packageName);
103-
writer.write("streamHasher,");
103+
writer.write("streamHasher");
104104
},
105105
"md5", writer -> {
106106
writer.addDependency(TypeScriptDependency.MD5_BROWSER);
107107
writer.addImport("Md5", "Md5", TypeScriptDependency.MD5_BROWSER.packageName);
108-
writer.write("md5: Md5,");
108+
writer.write("Md5");
109109
});
110110
default:
111111
return Collections.emptyMap();

smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/integration/AddEventStreamDependency.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,14 +85,14 @@ public Map<String, Consumer<TypeScriptWriter>> getRuntimeConfigWriters(
8585
writer.addDependency(TypeScriptDependency.AWS_SDK_EVENTSTREAM_SERDE_NODE);
8686
writer.addImport("eventStreamSerdeProvider", "eventStreamSerdeProvider",
8787
TypeScriptDependency.AWS_SDK_EVENTSTREAM_SERDE_NODE.packageName);
88-
writer.write("eventStreamSerdeProvider,");
88+
writer.write("eventStreamSerdeProvider");
8989
});
9090
case BROWSER:
9191
return MapUtils.of("eventStreamSerdeProvider", writer -> {
9292
writer.addDependency(TypeScriptDependency.AWS_SDK_EVENTSTREAM_SERDE_BROWSER);
9393
writer.addImport("eventStreamSerdeProvider", "eventStreamSerdeProvider",
9494
TypeScriptDependency.AWS_SDK_EVENTSTREAM_SERDE_BROWSER.packageName);
95-
writer.write("eventStreamSerdeProvider,");
95+
writer.write("eventStreamSerdeProvider");
9696
});
9797
default:
9898
return Collections.emptyMap();

smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/integration/TypeScriptIntegration.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -297,18 +297,18 @@ default void addConfigInterfaceFields(
297297
* // runtimeConfig file.
298298
* Map<String, Consumer<TypeScriptWriter>> config = new HashMap<>();
299299
* config.put("foo", writer -> {
300-
* writer.write("foo: some static value,"); // Note the trailing comma!
300+
* writer.write("some static value");
301301
* });
302302
*
303303
* switch (target) {
304304
* case NODE:
305305
* config.put("bar", writer -> {
306-
* writer.write("bar: someNodeValue,");
306+
* writer.write("(() => someNodeValue)"); // Note the parenthesis surrounding arrow functions
307307
* });
308308
* break;
309309
* case BROWSER:
310310
* config.put("bar", writer -> {
311-
* writer.write("bar: someBrowserValue,");
311+
* writer.write("someBrowserValue");
312312
* });
313313
* break;
314314
* case SHARED:
@@ -342,7 +342,7 @@ default void addConfigInterfaceFields(
342342
* String someTraitValue = settings.getModel(model).getTrait(SomeTrait.class)
343343
* .map(SomeTrait::getValue)
344344
* .orElse("");
345-
* writer.write("someTraitValue: $S,", someTraitValue);
345+
* writer.write(someTraitValue);
346346
* });
347347
* }
348348
* }
@@ -361,6 +361,6 @@ default Map<String, Consumer<TypeScriptWriter>> getRuntimeConfigWriters(
361361
SymbolProvider symbolProvider,
362362
LanguageTarget target
363363
) {
364-
return Collections.emptyMap();
364+
return Collections.emptyMap();
365365
}
366366
}
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
1-
import { ClientDefaults } from "${clientModuleName}";
2-
import { ClientSharedValues } from "./runtimeConfig.shared";
1+
import { ${clientConfigName} } from "${clientModuleName}";
2+
import { getRuntimeConfig as getSharedRuntimeConfig } from "./runtimeConfig.shared";
33

44
/**
55
* @internal
66
*/
7-
export const ClientDefaultValues: Required<ClientDefaults> = {
8-
...ClientSharedValues,
9-
runtime: "browser",
7+
export const getRuntimeConfig = (config: ${clientConfigName}) => {
8+
const clientSharedValues = getSharedRuntimeConfig(config);
9+
return {
10+
...clientSharedValues,
11+
...config,
12+
runtime: "browser",
1013
${customizations}
14+
};
1115
};
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
1-
import { ClientDefaults } from "${clientModuleName}";
2-
import { ClientDefaultValues as BrowserDefaults } from "./runtimeConfig.browser";
1+
import { ${clientConfigName} } from "${clientModuleName}";
2+
import { getRuntimeConfig as getBrowserRuntimeConfig } from "./runtimeConfig.browser";
33

44
/**
55
* @internal
66
*/
7-
export const ClientDefaultValues: Required<ClientDefaults> = {
8-
...BrowserDefaults,
9-
runtime: "react-native",
7+
export const getRuntimeConfig = (config: ${clientConfigName}) => {
8+
const browserDefaults = getBrowserRuntimeConfig(config);
9+
return {
10+
...browserDefaults,
11+
...config,
12+
runtime: "react-native",
1013
${customizations}
11-
};
14+
};
15+
};
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
1+
import { ${clientConfigName} } from "${clientModuleName}";
2+
13
/**
24
* @internal
35
*/
4-
export const ClientSharedValues = {
6+
export const getRuntimeConfig = (config: ${clientConfigName}) => ({
57
apiVersion: "${apiVersion}",
68
${customizations}
7-
};
9+
});
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
1-
import { ClientDefaults } from "${clientModuleName}";
2-
import { ClientSharedValues } from "./runtimeConfig.shared";
1+
import { ${clientConfigName} } from "${clientModuleName}";
2+
import { getRuntimeConfig as getSharedRuntimeConfig } from "./runtimeConfig.shared";
33

44
/**
55
* @internal
66
*/
7-
export const ClientDefaultValues: Required<ClientDefaults> = {
8-
...ClientSharedValues,
9-
runtime: "node",
7+
export const getRuntimeConfig = (config: ${clientConfigName}) => {
8+
const clientSharedValues = getSharedRuntimeConfig(config);
9+
return {
10+
...clientSharedValues,
11+
...config,
12+
runtime: "node",
1013
${customizations}
14+
};
1115
};

smithy-typescript-codegen/src/test/java/software/amazon/smithy/typescript/codegen/RuntimeConfigGeneratorTest.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -93,23 +93,24 @@ public Map<String, Consumer<TypeScriptWriter>> getRuntimeConfigWriters(
9393
// Does the runtimeConfig.ts file expand the template properties properly?
9494
String runtimeConfigContents = manifest.getFileString("runtimeConfig.ts").get();
9595
assertThat(runtimeConfigContents,
96-
containsString("import { ClientDefaults } from \"./ExampleClient\";"));
96+
containsString("import { ExampleClientConfig } from \"./ExampleClient\";"));
9797
assertThat(runtimeConfigContents, containsString("syn: 'ack2',"));
9898
assertThat(runtimeConfigSharedContents, containsString("foo: 'bar',"));
9999

100100
// Does the runtimeConfig.browser.ts file expand the template properties properly?
101101
String runtimeConfigBrowserContents = manifest.getFileString("runtimeConfig.browser.ts").get();
102102
assertThat(runtimeConfigBrowserContents,
103-
containsString("import { ClientDefaults } from \"./ExampleClient\";"));
103+
containsString("import { ExampleClientConfig } from \"./ExampleClient\";"));
104104
assertThat(runtimeConfigContents, containsString("syn: 'ack2',"));
105105
assertThat(runtimeConfigSharedContents, containsString("foo: 'bar',"));
106106

107107
// Does the runtimeConfig.native.ts file expand the browser template properties properly?
108108
String runtimeConfigNativeContents = manifest.getFileString("runtimeConfig.native.ts").get();
109109
assertThat(runtimeConfigNativeContents,
110-
containsString("import { ClientDefaults } from \"./ExampleClient\";"));
110+
containsString("import { ExampleClientConfig } from \"./ExampleClient\";"));
111111
assertThat(runtimeConfigNativeContents,
112-
containsString("import { ClientDefaultValues as BrowserDefaults } from \"./runtimeConfig.browser\";"));
112+
containsString(
113+
"import { getRuntimeConfig as getBrowserRuntimeConfig } from \"./runtimeConfig.browser\";"));
113114
assertThat(runtimeConfigContents, containsString("syn: 'ack2',"));
114115
assertThat(runtimeConfigSharedContents, containsString("foo: 'bar',"));
115116
}

0 commit comments

Comments
 (0)