Skip to content

Commit 481c371

Browse files
committed
Add ordering to customizations; runtimeConfig needs writing a whole line
1 parent 0dd64aa commit 481c371

File tree

4 files changed

+79
-42
lines changed

4 files changed

+79
-42
lines changed

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

Lines changed: 30 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -46,160 +46,163 @@ 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("new NodeHttpHandler()");
49+
writer.write("requestHandler: 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("Hash.bind(null, \"sha256\")");
55+
writer.write("sha256: Hash.bind(null, \"sha256\"),");
5656
},
5757
"urlParser", writer -> {
5858
writer.addDependency(TypeScriptDependency.AWS_SDK_URL_PARSER_NODE);
5959
writer.addImport("parseUrl", "parseUrl",
6060
TypeScriptDependency.AWS_SDK_URL_PARSER_NODE.packageName);
61-
writer.write("parseUrl");
61+
writer.write("urlParser: parseUrl,");
6262
},
6363
"bodyLengthChecker", writer -> {
6464
writer.addDependency(TypeScriptDependency.AWS_SDK_UTIL_BODY_LENGTH_NODE);
6565
writer.addImport("calculateBodyLength", "calculateBodyLength",
6666
TypeScriptDependency.AWS_SDK_UTIL_BODY_LENGTH_NODE.packageName);
67-
writer.write("calculateBodyLength");
67+
writer.write("bodyLengthChecker: calculateBodyLength,");
6868
},
6969
"streamCollector", writer -> {
7070
writer.addDependency(TypeScriptDependency.AWS_SDK_STREAM_COLLECTOR_NODE);
7171
writer.addImport("streamCollector", "streamCollector",
7272
TypeScriptDependency.AWS_SDK_STREAM_COLLECTOR_NODE.packageName);
73+
writer.write("streamCollector,");
7374
},
7475
"base64Decoder", writer -> {
7576
writer.addDependency(TypeScriptDependency.AWS_SDK_UTIL_BASE64_NODE);
7677
writer.addImport("fromBase64", "fromBase64",
7778
TypeScriptDependency.AWS_SDK_UTIL_BASE64_NODE.packageName);
78-
writer.write("fromBase64");
79+
writer.write("base64Decoder: fromBase64,");
7980
},
8081
"base64Encoder", writer -> {
8182
writer.addDependency(TypeScriptDependency.AWS_SDK_UTIL_BASE64_NODE);
8283
writer.addImport("toBase64", "toBase64",
8384
TypeScriptDependency.AWS_SDK_UTIL_BASE64_NODE.packageName);
84-
writer.write("toBase64");
85+
writer.write("base64Encoder: toBase64,");
8586
},
8687
"utf8Decoder", writer -> {
8788
writer.addDependency(TypeScriptDependency.AWS_SDK_UTIL_UTF8_NODE);
8889
writer.addImport("fromUtf8", "fromUtf8",
8990
TypeScriptDependency.AWS_SDK_UTIL_UTF8_NODE.packageName);
90-
writer.write("fromUtf8");
91+
writer.write("utf8Decoder: fromUtf8,");
9192
},
9293
"utf8Encoder", writer -> {
9394
writer.addDependency(TypeScriptDependency.AWS_SDK_UTIL_UTF8_NODE);
9495
writer.addImport("toUtf8", "toUtf8",
9596
TypeScriptDependency.AWS_SDK_UTIL_UTF8_NODE.packageName);
96-
writer.write("toUtf8");
97+
writer.write("utf8Encoder: toUtf8,");
9798
},
9899
"defaultUserAgent", writer -> {
99100
writer.addDependency(TypeScriptDependency.AWS_SDK_UTIL_USER_AGENT_NODE);
100101
writer.addImport("defaultUserAgent", "defaultUserAgent",
101102
TypeScriptDependency.AWS_SDK_UTIL_USER_AGENT_NODE.packageName);
102103
writer.addImport("name", "name", "./package.json");
103104
writer.addImport("version", "version", "./package.json");
104-
writer.write("defaultUserAgent(name, version)");
105+
writer.write("defaultUserAgent: defaultUserAgent(name, version),");
105106
}
106107
);
107108
private final Map<String, Consumer<TypeScriptWriter>> browserRuntimeConfigDefaults = MapUtils.of(
108109
"requestHandler", writer -> {
109110
writer.addDependency(TypeScriptDependency.AWS_SDK_FETCH_HTTP_HANDLER);
110111
writer.addImport("FetchHttpHandler", "FetchHttpHandler",
111112
TypeScriptDependency.AWS_SDK_FETCH_HTTP_HANDLER.packageName);
112-
writer.write("new FetchHttpHandler()");
113+
writer.write("requestHandler: new FetchHttpHandler(),");
113114
},
114115
"sha256", writer -> {
115116
writer.addDependency(TypeScriptDependency.AWS_CRYPTO_SHA256_BROWSER);
116117
writer.addImport("Sha256", "Sha256",
117118
TypeScriptDependency.AWS_CRYPTO_SHA256_BROWSER.packageName);
118-
writer.write("Sha256");
119+
writer.write("sha256: Sha256,");
119120
},
120121
"urlParser", writer -> {
121122
writer.addDependency(TypeScriptDependency.AWS_SDK_URL_PARSER_BROWSER);
122123
writer.addImport("parseUrl", "parseUrl",
123124
TypeScriptDependency.AWS_SDK_URL_PARSER_BROWSER.packageName);
124-
writer.write("parseUrl");
125+
writer.write("urlParser: parseUrl,");
125126
},
126127
"bodyLengthChecker", writer -> {
127128
writer.addDependency(TypeScriptDependency.AWS_SDK_UTIL_BODY_LENGTH_BROWSER);
128129
writer.addImport("calculateBodyLength", "calculateBodyLength",
129130
TypeScriptDependency.AWS_SDK_UTIL_BODY_LENGTH_BROWSER.packageName);
130-
writer.write("calculateBodyLength");
131+
writer.write("bodyLengthChecker: calculateBodyLength,");
131132
},
132133
"streamCollector", writer -> {
133134
writer.addDependency(TypeScriptDependency.AWS_SDK_STREAM_COLLECTOR_BROWSER);
134135
writer.addImport("streamCollector", "streamCollector",
135136
TypeScriptDependency.AWS_SDK_STREAM_COLLECTOR_BROWSER.packageName);
137+
writer.write("streamCollector,");
136138
},
137139
"base64Decoder", writer -> {
138140
writer.addDependency(TypeScriptDependency.AWS_SDK_UTIL_BASE64_BROWSER);
139141
writer.addImport("fromBase64", "fromBase64",
140142
TypeScriptDependency.AWS_SDK_UTIL_BASE64_BROWSER.packageName);
141-
writer.write("fromBase64");
143+
writer.write("base64Decoder: fromBase64,");
142144
},
143145
"base64Encoder", writer -> {
144146
writer.addDependency(TypeScriptDependency.AWS_SDK_UTIL_BASE64_BROWSER);
145147
writer.addImport("toBase64", "toBase64",
146148
TypeScriptDependency.AWS_SDK_UTIL_BASE64_BROWSER.packageName);
147-
writer.write("toBase64");
149+
writer.write("base64Encoder: toBase64,");
148150
},
149151
"utf8Decoder", writer -> {
150152
writer.addDependency(TypeScriptDependency.AWS_SDK_UTIL_UTF8_BROWSER);
151153
writer.addImport("fromUtf8", "fromUtf8",
152154
TypeScriptDependency.AWS_SDK_UTIL_UTF8_BROWSER.packageName);
153-
writer.write("fromUtf8");
155+
writer.write("utf8Decoder: fromUtf8,");
154156
},
155157
"utf8Encoder", writer -> {
156158
writer.addDependency(TypeScriptDependency.AWS_SDK_UTIL_UTF8_BROWSER);
157159
writer.addImport("toUtf8", "toUtf8",
158160
TypeScriptDependency.AWS_SDK_UTIL_UTF8_BROWSER.packageName);
159-
writer.write("toUtf8");
161+
writer.write("utf8Encoder: toUtf8,");
160162
},
161163
"defaultUserAgent", writer -> {
162164
writer.addDependency(TypeScriptDependency.AWS_SDK_UTIL_USER_AGENT_BROWSER);
163165
writer.addImport("defaultUserAgent", "defaultUserAgent",
164166
TypeScriptDependency.AWS_SDK_UTIL_USER_AGENT_BROWSER.packageName);
165167
writer.addImport("name", "name", "./package.json");
166168
writer.addImport("version", "version", "./package.json");
167-
writer.write("defaultUserAgent(name, version)");
169+
writer.write("defaultUserAgent: defaultUserAgent(name, version),");
168170
}
169171
);
170172
private final Map<String, Consumer<TypeScriptWriter>> reactNativeRuntimeConfigDefaults = MapUtils.of(
171173
"requestHandler", writer -> {
172174
writer.addDependency(TypeScriptDependency.AWS_SDK_FETCH_HTTP_HANDLER);
173175
writer.addImport("FetchHttpHandler", "FetchHttpHandler",
174176
TypeScriptDependency.AWS_SDK_FETCH_HTTP_HANDLER.packageName);
175-
writer.write("new FetchHttpHandler({ bufferBody: true })");
177+
writer.write("requestHandler: new FetchHttpHandler({ bufferBody: true }),");
176178
},
177179
"sha256", writer -> {
178180
writer.addDependency(TypeScriptDependency.AWS_CRYPTO_SHA256_JS);
179181
writer.addImport("Sha256", "Sha256",
180182
TypeScriptDependency.AWS_CRYPTO_SHA256_JS.packageName);
181-
writer.write("Sha256");
183+
writer.write("sha256: Sha256,");
182184
},
183185
"urlParser", writer -> {
184186
writer.addDependency(TypeScriptDependency.AWS_SDK_URL_PARSER_BROWSER);
185187
writer.addImport("parseUrl", "parseUrl",
186188
TypeScriptDependency.AWS_SDK_URL_PARSER_BROWSER.packageName);
187-
writer.write("parseUrl");
189+
writer.write("urlParser: parseUrl,");
188190
},
189191
"streamCollector", writer -> {
190192
writer.addDependency(TypeScriptDependency.AWS_SDK_STREAM_COLLECTOR_RN);
191193
writer.addImport("streamCollector", "streamCollector",
192194
TypeScriptDependency.AWS_SDK_STREAM_COLLECTOR_RN.packageName);
195+
writer.write("streamCollector,");
193196
},
194197
"defaultUserAgent", writer -> {
195198
writer.addImport("name", "name", "./package.json");
196199
writer.addImport("version", "version", "./package.json");
197-
writer.write("`aws-sdk-js-v3-react-native-$${name}/$${version}`");
200+
writer.write("defaultUserAgent: `aws-sdk-js-v3-react-native-$${name}/$${version}`,");
198201
}
199202
);
200203
private final Map<String, Consumer<TypeScriptWriter>> sharedRuntimeConfigDefaults = MapUtils.of(
201204
"disableHostPrefix", writer -> {
202-
writer.write("false");
205+
writer.write("disableHostPrefix: false,");
203206
}
204207
);
205208

@@ -232,20 +235,18 @@ void generate(LanguageTarget target) {
232235
writer.indent();
233236
Map<String, Consumer<TypeScriptWriter>> defaultConfigs =
234237
new HashMap(getDefaultRuntimeConfigs(target));
235-
//TODO: ensure integrations order is always desired.
236238
Map<String, Consumer<TypeScriptWriter>> aggregatedConfigs = integrations.stream()
237-
.map(integration -> integration.addRuntimeConfigValues(settings, model, symbolProvider, target))
239+
.sorted(Comparator.comparingInt(TypeScriptIntegration::getOrder))
240+
.map(integration -> integration.getRuntimeConfigWriters(
241+
settings, model, symbolProvider, target))
238242
.reduce(defaultConfigs, (aggregated, configMap) -> {
239243
aggregated.putAll(configMap);
240244
return aggregated;
241245
});
242246
aggregatedConfigs.entrySet().stream()
243247
.sorted(Comparator.comparing(Map.Entry::getKey))
244248
.forEach(entry -> {
245-
writer.onSection(entry.getKey(), text -> {
246-
entry.getValue().accept(writer);
247-
});
248-
writer.write(String.format("%s: ${L@%s},", entry.getKey(), entry.getKey()), "");
249+
entry.getValue().accept(writer);
249250
});
250251
writer.dedent();
251252
});

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ public void addConfigInterfaceFields(
6969
}
7070

7171
@Override
72-
public Map<String, Consumer<TypeScriptWriter>> addRuntimeConfigValues(
72+
public Map<String, Consumer<TypeScriptWriter>> getRuntimeConfigWriters(
7373
TypeScriptSettings settings,
7474
Model model,
7575
SymbolProvider symbolProvider,
@@ -84,22 +84,22 @@ public Map<String, Consumer<TypeScriptWriter>> addRuntimeConfigValues(
8484
writer.addDependency(TypeScriptDependency.AWS_SDK_EVENTSTREAM_SERDE_NODE);
8585
writer.addImport("eventStreamSerdeProvider", "eventStreamSerdeProvider",
8686
TypeScriptDependency.AWS_SDK_EVENTSTREAM_SERDE_NODE.packageName);
87-
writer.write("eventStreamSerdeProvider");
87+
writer.write("eventStreamSerdeProvider,");
8888
});
8989
case BROWSER:
9090
return MapUtils.of("eventStreamSerdeProvider", writer -> {
9191
writer.addDependency(TypeScriptDependency.AWS_SDK_EVENTSTREAM_SERDE_BROWSER);
9292
writer.addImport("eventStreamSerdeProvider", "eventStreamSerdeProvider",
9393
TypeScriptDependency.AWS_SDK_EVENTSTREAM_SERDE_BROWSER.packageName);
94-
writer.write("eventStreamSerdeProvider");
94+
writer.write("eventStreamSerdeProvider,");
9595
});
9696
case REACT_NATIVE:
9797
// TODO: add ReactNative eventstream support
9898
return MapUtils.of("eventStreamSerdeProvider", writer -> {
9999
writer.addDependency(TypeScriptDependency.INVALID_DEPENDENCY);
100100
writer.addImport("invalidFunction", "invalidFunction",
101101
TypeScriptDependency.INVALID_DEPENDENCY.packageName);
102-
writer.openBlock("eventStreamSerdeProvider: () => ({", "})", () -> {
102+
writer.openBlock("eventStreamSerdeProvider: () => ({", "}),", () -> {
103103
writer.write("serialize: invalidFunction(\"event stream is not supported in ReactNative.\"),");
104104
writer.write("deserialize: invalidFunction(\"event stream is not supported in ReactNative.\")");
105105
});

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

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,22 @@
3737
* adding custom code, etc.
3838
*/
3939
public interface TypeScriptIntegration {
40+
/**
41+
* Gets the sort order of the customization from -128 to 127.
42+
*
43+
* <p>Customizations are applied according to this sort order. Lower values
44+
* are executed before higher values (for example, -128 comes before 0,
45+
* comes before 127). Customizations default to 0, which is the middle point
46+
* between the minimum and maximum order values. The customization
47+
* applied later can override the runtime configurations that provided
48+
* by customizations applied earlier.
49+
*
50+
* @return Returns the sort order, defaulting to 0.
51+
*/
52+
default byte getOrder() {
53+
return 0;
54+
}
55+
4056
/**
4157
* Preprocess the model before code generation.
4258
*
@@ -235,7 +251,7 @@ default void addConfigInterfaceFields(
235251
*
236252
* private static final Logger LOGGER = Logger.getLogger(CodegenVisitor.class.getName());
237253
*
238-
* public Map<String, Consumer<TypeScriptWriter>> addRuntimeConfigValues(
254+
* public Map<String, Consumer<TypeScriptWriter>> getRuntimeConfigWriters(
239255
* TypeScriptSettings settings,
240256
* Model model,
241257
* SymbolProvider symbolProvider,
@@ -279,7 +295,7 @@ default void addConfigInterfaceFields(
279295
* <pre>
280296
* {@code
281297
* public final class MyIntegration2 implements TypeScriptIntegration {
282-
* public Map<String, Consumer<TypeScriptWriter>> addRuntimeConfigValues(
298+
* public Map<String, Consumer<TypeScriptWriter>> getRuntimeConfigWriters(
283299
* TypeScriptSettings settings,
284300
* Model model,
285301
* SymbolProvider symbolProvider,
@@ -303,7 +319,7 @@ default void addConfigInterfaceFields(
303319
* @param target The TypeScript language target.
304320
* @return Returns a map of config property name and a consumer function with TypeScriptWriter parameter.
305321
*/
306-
default Map<String, Consumer<TypeScriptWriter>> addRuntimeConfigValues(
322+
default Map<String, Consumer<TypeScriptWriter>> getRuntimeConfigWriters(
307323
TypeScriptSettings settings,
308324
Model model,
309325
SymbolProvider symbolProvider,

0 commit comments

Comments
 (0)