16
16
package software .amazon .smithy .typescript .codegen ;
17
17
18
18
import java .util .List ;
19
+ import java .util .Map ;
20
+ import java .util .TreeMap ;
21
+ import java .util .function .Consumer ;
22
+
23
+ import software .amazon .smithy .build .SmithyBuildException ;
19
24
import software .amazon .smithy .codegen .core .SymbolProvider ;
20
25
import software .amazon .smithy .model .Model ;
21
26
import software .amazon .smithy .model .shapes .ServiceShape ;
22
27
import software .amazon .smithy .typescript .codegen .integration .TypeScriptIntegration ;
28
+ import software .amazon .smithy .utils .MapUtils ;
23
29
24
30
/**
25
31
* Generates runtime configuration files, files that are used to
@@ -34,6 +40,170 @@ final class RuntimeConfigGenerator {
34
40
private final SymbolProvider symbolProvider ;
35
41
private final TypeScriptDelegator delegator ;
36
42
private final List <TypeScriptIntegration > integrations ;
43
+ private final Map <String , Consumer <TypeScriptWriter >> nodeRuntimeConfigDefaults = MapUtils .of (
44
+ "requestHandler" , writer -> {
45
+ writer .addDependency (TypeScriptDependency .AWS_SDK_NODE_HTTP_HANDLER );
46
+ writer .addImport ("NodeHttpHandler" , "NodeHttpHandler" ,
47
+ TypeScriptDependency .AWS_SDK_NODE_HTTP_HANDLER .packageName );
48
+ writer .write ("requestHandler: new NodeHttpHandler()," );
49
+ },
50
+ "sha256" , writer -> {
51
+ writer .addDependency (TypeScriptDependency .AWS_SDK_HASH_NODE );
52
+ writer .addImport ("Hash" , "Hash" ,
53
+ TypeScriptDependency .AWS_SDK_HASH_NODE .packageName );
54
+ writer .write ("sha256: Hash.bind(null, \" sha256\" )," );
55
+ },
56
+ "urlParser" , writer -> {
57
+ writer .addDependency (TypeScriptDependency .AWS_SDK_URL_PARSER_NODE );
58
+ writer .addImport ("parseUrl" , "parseUrl" ,
59
+ TypeScriptDependency .AWS_SDK_URL_PARSER_NODE .packageName );
60
+ writer .write ("urlParser: parseUrl," );
61
+ },
62
+ "bodyLengthChecker" , writer -> {
63
+ writer .addDependency (TypeScriptDependency .AWS_SDK_UTIL_BODY_LENGTH_NODE );
64
+ writer .addImport ("calculateBodyLength" , "calculateBodyLength" ,
65
+ TypeScriptDependency .AWS_SDK_UTIL_BODY_LENGTH_NODE .packageName );
66
+ writer .write ("bodyLengthChecker: calculateBodyLength," );
67
+ },
68
+ "streamCollector" , writer -> {
69
+ writer .addDependency (TypeScriptDependency .AWS_SDK_STREAM_COLLECTOR_NODE );
70
+ writer .addImport ("streamCollector" , "streamCollector" ,
71
+ TypeScriptDependency .AWS_SDK_STREAM_COLLECTOR_NODE .packageName );
72
+ writer .write ("streamCollector," );
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 ("base64Decoder: 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 ("base64Encoder: 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 ("utf8Decoder: 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 ("utf8Encoder: 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: 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 ("requestHandler: 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: 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 ("urlParser: 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 ("bodyLengthChecker: 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
+ writer .write ("streamCollector," );
137
+ },
138
+ "base64Decoder" , writer -> {
139
+ writer .addDependency (TypeScriptDependency .AWS_SDK_UTIL_BASE64_BROWSER );
140
+ writer .addImport ("fromBase64" , "fromBase64" ,
141
+ TypeScriptDependency .AWS_SDK_UTIL_BASE64_BROWSER .packageName );
142
+ writer .write ("base64Decoder: fromBase64," );
143
+ },
144
+ "base64Encoder" , writer -> {
145
+ writer .addDependency (TypeScriptDependency .AWS_SDK_UTIL_BASE64_BROWSER );
146
+ writer .addImport ("toBase64" , "toBase64" ,
147
+ TypeScriptDependency .AWS_SDK_UTIL_BASE64_BROWSER .packageName );
148
+ writer .write ("base64Encoder: toBase64," );
149
+ },
150
+ "utf8Decoder" , writer -> {
151
+ writer .addDependency (TypeScriptDependency .AWS_SDK_UTIL_UTF8_BROWSER );
152
+ writer .addImport ("fromUtf8" , "fromUtf8" ,
153
+ TypeScriptDependency .AWS_SDK_UTIL_UTF8_BROWSER .packageName );
154
+ writer .write ("utf8Decoder: fromUtf8," );
155
+ },
156
+ "utf8Encoder" , writer -> {
157
+ writer .addDependency (TypeScriptDependency .AWS_SDK_UTIL_UTF8_BROWSER );
158
+ writer .addImport ("toUtf8" , "toUtf8" ,
159
+ TypeScriptDependency .AWS_SDK_UTIL_UTF8_BROWSER .packageName );
160
+ writer .write ("utf8Encoder: toUtf8," );
161
+ },
162
+ "defaultUserAgent" , writer -> {
163
+ writer .addDependency (TypeScriptDependency .AWS_SDK_UTIL_USER_AGENT_BROWSER );
164
+ writer .addImport ("defaultUserAgent" , "defaultUserAgent" ,
165
+ TypeScriptDependency .AWS_SDK_UTIL_USER_AGENT_BROWSER .packageName );
166
+ writer .addImport ("name" , "name" , "./package.json" );
167
+ writer .addImport ("version" , "version" , "./package.json" );
168
+ writer .write ("defaultUserAgent: defaultUserAgent(name, version)," );
169
+ }
170
+ );
171
+ private final Map <String , Consumer <TypeScriptWriter >> reactNativeRuntimeConfigDefaults = MapUtils .of (
172
+ "requestHandler" , writer -> {
173
+ writer .addDependency (TypeScriptDependency .AWS_SDK_FETCH_HTTP_HANDLER );
174
+ writer .addImport ("FetchHttpHandler" , "FetchHttpHandler" ,
175
+ TypeScriptDependency .AWS_SDK_FETCH_HTTP_HANDLER .packageName );
176
+ writer .write ("requestHandler: new FetchHttpHandler({ bufferBody: true })," );
177
+ },
178
+ "sha256" , writer -> {
179
+ writer .addDependency (TypeScriptDependency .AWS_CRYPTO_SHA256_JS );
180
+ writer .addImport ("Sha256" , "Sha256" ,
181
+ TypeScriptDependency .AWS_CRYPTO_SHA256_JS .packageName );
182
+ writer .write ("sha256: Sha256," );
183
+ },
184
+ "urlParser" , writer -> {
185
+ writer .addDependency (TypeScriptDependency .AWS_SDK_URL_PARSER_BROWSER );
186
+ writer .addImport ("parseUrl" , "parseUrl" ,
187
+ TypeScriptDependency .AWS_SDK_URL_PARSER_BROWSER .packageName );
188
+ writer .write ("urlParser: parseUrl," );
189
+ },
190
+ "streamCollector" , writer -> {
191
+ writer .addDependency (TypeScriptDependency .AWS_SDK_STREAM_COLLECTOR_RN );
192
+ writer .addImport ("streamCollector" , "streamCollector" ,
193
+ TypeScriptDependency .AWS_SDK_STREAM_COLLECTOR_RN .packageName );
194
+ writer .write ("streamCollector," );
195
+ },
196
+ "defaultUserAgent" , writer -> {
197
+ writer .addImport ("name" , "name" , "./package.json" );
198
+ writer .addImport ("version" , "version" , "./package.json" );
199
+ writer .write ("defaultUserAgent: `aws-sdk-js-v3-react-native-$${name}/$${version}`," );
200
+ }
201
+ );
202
+ private final Map <String , Consumer <TypeScriptWriter >> sharedRuntimeConfigDefaults = MapUtils .of (
203
+ "disableHostPrefix" , writer -> {
204
+ writer .write ("disableHostPrefix: false," );
205
+ }
206
+ );
37
207
38
208
RuntimeConfigGenerator (
39
209
TypeScriptSettings settings ,
@@ -62,12 +232,32 @@ void generate(LanguageTarget target) {
62
232
// Inject customizations into the ~template.
63
233
writer .onSection ("customizations" , original -> {
64
234
writer .indent ();
235
+ // Start with defaults, use a TreeMap for keeping entries sorted.
236
+ Map <String , Consumer <TypeScriptWriter >> configs =
237
+ new TreeMap <>(getDefaultRuntimeConfigs (target ));
238
+ // Add any integration supplied runtime config writers.
65
239
for (TypeScriptIntegration integration : integrations ) {
66
- integration .addRuntimeConfigValues (settings , model , symbolProvider , writer , target );
240
+ configs . putAll ( integration .getRuntimeConfigWriters (settings , model , symbolProvider , target ) );
67
241
}
242
+ configs .values ().forEach (value -> value .accept (writer ));
68
243
writer .dedent ();
69
244
});
70
245
writer .write (contents , "" );
71
246
});
72
247
}
248
+
249
+ private Map <String , Consumer <TypeScriptWriter >> getDefaultRuntimeConfigs (LanguageTarget target ) {
250
+ switch (target ) {
251
+ case NODE :
252
+ return nodeRuntimeConfigDefaults ;
253
+ case BROWSER :
254
+ return browserRuntimeConfigDefaults ;
255
+ case REACT_NATIVE :
256
+ return reactNativeRuntimeConfigDefaults ;
257
+ case SHARED :
258
+ return sharedRuntimeConfigDefaults ;
259
+ default :
260
+ throw new SmithyBuildException ("Unknown target: " + target );
261
+ }
262
+ }
73
263
}
0 commit comments