15
15
16
16
package software .amazon .smithy .typescript .codegen ;
17
17
18
+ import java .util .Comparator ;
19
+ import java .util .HashMap ;
18
20
import java .util .List ;
21
+ import java .util .Map ;
22
+ import java .util .function .Consumer ;
23
+
24
+ import software .amazon .smithy .build .SmithyBuildException ;
19
25
import software .amazon .smithy .codegen .core .SymbolProvider ;
20
26
import software .amazon .smithy .model .Model ;
21
27
import software .amazon .smithy .model .shapes .ServiceShape ;
22
28
import software .amazon .smithy .typescript .codegen .integration .TypeScriptIntegration ;
29
+ import software .amazon .smithy .utils .MapUtils ;
23
30
24
31
/**
25
32
* Generates runtime configuration files, files that are used to
@@ -34,6 +41,167 @@ final class RuntimeConfigGenerator {
34
41
private final SymbolProvider symbolProvider ;
35
42
private final TypeScriptDelegator delegator ;
36
43
private final List <TypeScriptIntegration > integrations ;
44
+ private final Map <String , Consumer <TypeScriptWriter >> nodeRuntimeConfigDefaults = MapUtils .of (
45
+ "requestHandler" , writer -> {
46
+ writer .addDependency (TypeScriptDependency .AWS_SDK_NODE_HTTP_HANDLER );
47
+ writer .addImport ("NodeHttpHandler" , "NodeHttpHandler" ,
48
+ TypeScriptDependency .AWS_SDK_NODE_HTTP_HANDLER .packageName );
49
+ writer .write ("new NodeHttpHandler()" );
50
+ },
51
+ "sha256" , writer -> {
52
+ writer .addDependency (TypeScriptDependency .AWS_SDK_HASH_NODE );
53
+ writer .addImport ("Hash" , "Hash" ,
54
+ TypeScriptDependency .AWS_SDK_HASH_NODE .packageName );
55
+ writer .write ("Hash.bind(null, \" sha256\" )" );
56
+ },
57
+ "urlParser" , writer -> {
58
+ writer .addDependency (TypeScriptDependency .AWS_SDK_URL_PARSER_NODE );
59
+ writer .addImport ("parseUrl" , "parseUrl" ,
60
+ TypeScriptDependency .AWS_SDK_URL_PARSER_NODE .packageName );
61
+ writer .write ("parseUrl" );
62
+ },
63
+ "bodyLengthChecker" , writer -> {
64
+ writer .addDependency (TypeScriptDependency .AWS_SDK_UTIL_BODY_LENGTH_NODE );
65
+ writer .addImport ("calculateBodyLength" , "calculateBodyLength" ,
66
+ TypeScriptDependency .AWS_SDK_UTIL_BODY_LENGTH_NODE .packageName );
67
+ writer .write ("calculateBodyLength" );
68
+ },
69
+ "streamCollector" , writer -> {
70
+ writer .addDependency (TypeScriptDependency .AWS_SDK_STREAM_COLLECTOR_NODE );
71
+ writer .addImport ("streamCollector" , "streamCollector" ,
72
+ TypeScriptDependency .AWS_SDK_STREAM_COLLECTOR_NODE .packageName );
73
+ },
74
+ "base64Decoder" , writer -> {
75
+ writer .addDependency (TypeScriptDependency .AWS_SDK_UTIL_BASE64_NODE );
76
+ writer .addImport ("fromBase64" , "fromBase64" ,
77
+ TypeScriptDependency .AWS_SDK_UTIL_BASE64_NODE .packageName );
78
+ writer .write ("fromBase64" );
79
+ },
80
+ "base64Encoder" , writer -> {
81
+ writer .addDependency (TypeScriptDependency .AWS_SDK_UTIL_BASE64_NODE );
82
+ writer .addImport ("toBase64" , "toBase64" ,
83
+ TypeScriptDependency .AWS_SDK_UTIL_BASE64_NODE .packageName );
84
+ writer .write ("toBase64" );
85
+ },
86
+ "utf8Decoder" , writer -> {
87
+ writer .addDependency (TypeScriptDependency .AWS_SDK_UTIL_UTF8_NODE );
88
+ writer .addImport ("fromUtf8" , "fromUtf8" ,
89
+ TypeScriptDependency .AWS_SDK_UTIL_UTF8_NODE .packageName );
90
+ writer .write ("fromUtf8" );
91
+ },
92
+ "utf8Encoder" , writer -> {
93
+ writer .addDependency (TypeScriptDependency .AWS_SDK_UTIL_UTF8_NODE );
94
+ writer .addImport ("toUtf8" , "toUtf8" ,
95
+ TypeScriptDependency .AWS_SDK_UTIL_UTF8_NODE .packageName );
96
+ writer .write ("toUtf8" );
97
+ },
98
+ "defaultUserAgent" , writer -> {
99
+ writer .addDependency (TypeScriptDependency .AWS_SDK_UTIL_USER_AGENT_NODE );
100
+ writer .addImport ("defaultUserAgent" , "defaultUserAgent" ,
101
+ TypeScriptDependency .AWS_SDK_UTIL_USER_AGENT_NODE .packageName );
102
+ writer .addImport ("name" , "name" , "./package.json" );
103
+ writer .addImport ("version" , "version" , "./package.json" );
104
+ writer .write ("defaultUserAgent(name, version)" );
105
+ }
106
+ );
107
+ private final Map <String , Consumer <TypeScriptWriter >> browserRuntimeConfigDefaults = MapUtils .of (
108
+ "requestHandler" , writer -> {
109
+ writer .addDependency (TypeScriptDependency .AWS_SDK_FETCH_HTTP_HANDLER );
110
+ writer .addImport ("FetchHttpHandler" , "FetchHttpHandler" ,
111
+ TypeScriptDependency .AWS_SDK_FETCH_HTTP_HANDLER .packageName );
112
+ writer .write ("new FetchHttpHandler()" );
113
+ },
114
+ "sha256" , writer -> {
115
+ writer .addDependency (TypeScriptDependency .AWS_CRYPTO_SHA256_BROWSER );
116
+ writer .addImport ("Sha256" , "Sha256" ,
117
+ TypeScriptDependency .AWS_CRYPTO_SHA256_BROWSER .packageName );
118
+ writer .write ("Sha256" );
119
+ },
120
+ "urlParser" , writer -> {
121
+ writer .addDependency (TypeScriptDependency .AWS_SDK_URL_PARSER_BROWSER );
122
+ writer .addImport ("parseUrl" , "parseUrl" ,
123
+ TypeScriptDependency .AWS_SDK_URL_PARSER_BROWSER .packageName );
124
+ writer .write ("parseUrl" );
125
+ },
126
+ "bodyLengthChecker" , writer -> {
127
+ writer .addDependency (TypeScriptDependency .AWS_SDK_UTIL_BODY_LENGTH_BROWSER );
128
+ writer .addImport ("calculateBodyLength" , "calculateBodyLength" ,
129
+ TypeScriptDependency .AWS_SDK_UTIL_BODY_LENGTH_BROWSER .packageName );
130
+ writer .write ("calculateBodyLength" );
131
+ },
132
+ "streamCollector" , writer -> {
133
+ writer .addDependency (TypeScriptDependency .AWS_SDK_STREAM_COLLECTOR_BROWSER );
134
+ writer .addImport ("streamCollector" , "streamCollector" ,
135
+ TypeScriptDependency .AWS_SDK_STREAM_COLLECTOR_BROWSER .packageName );
136
+ },
137
+ "base64Decoder" , writer -> {
138
+ writer .addDependency (TypeScriptDependency .AWS_SDK_UTIL_BASE64_BROWSER );
139
+ writer .addImport ("fromBase64" , "fromBase64" ,
140
+ TypeScriptDependency .AWS_SDK_UTIL_BASE64_BROWSER .packageName );
141
+ writer .write ("fromBase64" );
142
+ },
143
+ "base64Encoder" , writer -> {
144
+ writer .addDependency (TypeScriptDependency .AWS_SDK_UTIL_BASE64_BROWSER );
145
+ writer .addImport ("toBase64" , "toBase64" ,
146
+ TypeScriptDependency .AWS_SDK_UTIL_BASE64_BROWSER .packageName );
147
+ writer .write ("toBase64" );
148
+ },
149
+ "utf8Decoder" , writer -> {
150
+ writer .addDependency (TypeScriptDependency .AWS_SDK_UTIL_UTF8_BROWSER );
151
+ writer .addImport ("fromUtf8" , "fromUtf8" ,
152
+ TypeScriptDependency .AWS_SDK_UTIL_UTF8_BROWSER .packageName );
153
+ writer .write ("fromUtf8" );
154
+ },
155
+ "utf8Encoder" , writer -> {
156
+ writer .addDependency (TypeScriptDependency .AWS_SDK_UTIL_UTF8_BROWSER );
157
+ writer .addImport ("toUtf8" , "toUtf8" ,
158
+ TypeScriptDependency .AWS_SDK_UTIL_UTF8_BROWSER .packageName );
159
+ writer .write ("toUtf8" );
160
+ },
161
+ "defaultUserAgent" , writer -> {
162
+ writer .addDependency (TypeScriptDependency .AWS_SDK_UTIL_USER_AGENT_BROWSER );
163
+ writer .addImport ("defaultUserAgent" , "defaultUserAgent" ,
164
+ TypeScriptDependency .AWS_SDK_UTIL_USER_AGENT_BROWSER .packageName );
165
+ writer .addImport ("name" , "name" , "./package.json" );
166
+ writer .addImport ("version" , "version" , "./package.json" );
167
+ writer .write ("defaultUserAgent(name, version)" );
168
+ }
169
+ );
170
+ private final Map <String , Consumer <TypeScriptWriter >> reactNativeRuntimeConfigDefaults = MapUtils .of (
171
+ "requestHandler" , writer -> {
172
+ writer .addDependency (TypeScriptDependency .AWS_SDK_FETCH_HTTP_HANDLER );
173
+ writer .addImport ("FetchHttpHandler" , "FetchHttpHandler" ,
174
+ TypeScriptDependency .AWS_SDK_FETCH_HTTP_HANDLER .packageName );
175
+ writer .write ("new FetchHttpHandler({ bufferBody: true })" );
176
+ },
177
+ "sha256" , writer -> {
178
+ writer .addDependency (TypeScriptDependency .AWS_CRYPTO_SHA256_JS );
179
+ writer .addImport ("Sha256" , "Sha256" ,
180
+ TypeScriptDependency .AWS_CRYPTO_SHA256_JS .packageName );
181
+ writer .write ("Sha256" );
182
+ },
183
+ "urlParser" , writer -> {
184
+ writer .addDependency (TypeScriptDependency .AWS_SDK_URL_PARSER_BROWSER );
185
+ writer .addImport ("parseUrl" , "parseUrl" ,
186
+ TypeScriptDependency .AWS_SDK_URL_PARSER_BROWSER .packageName );
187
+ writer .write ("parseUrl" );
188
+ },
189
+ "streamCollector" , writer -> {
190
+ writer .addDependency (TypeScriptDependency .AWS_SDK_STREAM_COLLECTOR_RN );
191
+ writer .addImport ("streamCollector" , "streamCollector" ,
192
+ TypeScriptDependency .AWS_SDK_STREAM_COLLECTOR_RN .packageName );
193
+ },
194
+ "defaultUserAgent" , writer -> {
195
+ writer .addImport ("name" , "name" , "./package.json" );
196
+ writer .addImport ("version" , "version" , "./package.json" );
197
+ writer .write ("`aws-sdk-js-v3-react-native-$${name}/$${version}`" );
198
+ }
199
+ );
200
+ private final Map <String , Consumer <TypeScriptWriter >> sharedRuntimeConfigDefaults = MapUtils .of (
201
+ "disableHostPrefix" , writer -> {
202
+ writer .write ("false" );
203
+ }
204
+ );
37
205
38
206
RuntimeConfigGenerator (
39
207
TypeScriptSettings settings ,
@@ -62,12 +230,41 @@ void generate(LanguageTarget target) {
62
230
// Inject customizations into the ~template.
63
231
writer .onSection ("customizations" , original -> {
64
232
writer .indent ();
65
- for (TypeScriptIntegration integration : integrations ) {
66
- integration .addRuntimeConfigValues (settings , model , symbolProvider , writer , target );
67
- }
233
+ Map <String , Consumer <TypeScriptWriter >> defaultConfigs =
234
+ new HashMap (getDefaultRuntimeConfigs (target ));
235
+ //TODO: ensure integrations order is always desired.
236
+ Map <String , Consumer <TypeScriptWriter >> aggregatedConfigs = integrations .stream ()
237
+ .map (integration -> integration .addRuntimeConfigValues (settings , model , symbolProvider , target ))
238
+ .reduce (defaultConfigs , (aggregated , configMap ) -> {
239
+ aggregated .putAll (configMap );
240
+ return aggregated ;
241
+ });
242
+ aggregatedConfigs .entrySet ().stream ()
243
+ .sorted (Comparator .comparing (Map .Entry ::getKey ))
244
+ .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
+ });
68
250
writer .dedent ();
69
251
});
70
252
writer .write (contents , "" );
71
253
});
72
254
}
255
+
256
+ private Map <String , Consumer <TypeScriptWriter >> getDefaultRuntimeConfigs (LanguageTarget target ) {
257
+ switch (target ) {
258
+ case NODE :
259
+ return nodeRuntimeConfigDefaults ;
260
+ case BROWSER :
261
+ return browserRuntimeConfigDefaults ;
262
+ case REACT_NATIVE :
263
+ return reactNativeRuntimeConfigDefaults ;
264
+ case SHARED :
265
+ return sharedRuntimeConfigDefaults ;
266
+ default :
267
+ throw new SmithyBuildException ("Unknown target: " + target );
268
+ }
269
+ }
73
270
}
0 commit comments