29
29
import software .amazon .smithy .model .traits .ErrorTrait ;
30
30
import software .amazon .smithy .typescript .codegen .TypeScriptSettings .RequiredMemberMode ;
31
31
import software .amazon .smithy .typescript .codegen .integration .HttpProtocolGeneratorUtils ;
32
+ import software .amazon .smithy .typescript .codegen .validation .SensitiveDataFinder ;
32
33
import software .amazon .smithy .utils .SmithyInternalApi ;
33
34
34
35
/**
35
36
* Generates normal structures and error structures.
36
37
*
37
38
* Renders structures as interfaces.
38
39
*
39
- * <p>A namespace is created with the same name as the structure to
40
+ * <p>
41
+ * A namespace is created with the same name as the structure to
40
42
* provide helper functionality for checking if a given value is
41
43
* known to be of the same type as the structure. This will be
42
44
* even more useful if/when inheritance is added to Smithy.
43
45
*
44
- * <p>Note that the {@code required} trait on structures is used to
46
+ * <p>
47
+ * Note that the {@code required} trait on structures is used to
45
48
* determine whether or not a generated TypeScript interface uses
46
49
* required members. This is typically not recommended in other languages
47
50
* since it's documented as backward-compatible for a model to migrate a
55
58
* deserializers will need to set previously required properties to
56
59
* undefined too.
57
60
*
58
- * <p>The generator will explicitly state that a required property can
61
+ * <p>
62
+ * The generator will explicitly state that a required property can
59
63
* be set to {@code undefined}. This makes it clear that undefined checks
60
64
* need to be made when using {@code --strictNullChecks}, but has no
61
65
* effect otherwise.
@@ -69,28 +73,30 @@ final class StructureGenerator implements Runnable {
69
73
private final StructureShape shape ;
70
74
private final boolean includeValidation ;
71
75
private final RequiredMemberMode requiredMemberMode ;
76
+ private final SensitiveDataFinder sensitiveDataFinder ;
72
77
73
78
/**
74
79
* sets 'includeValidation' to 'false' and requiredMemberMode
75
80
* to {@link RequiredMemberMode#NULLABLE}.
76
81
*/
77
82
StructureGenerator (Model model , SymbolProvider symbolProvider , TypeScriptWriter writer , StructureShape shape ) {
78
83
this (model , symbolProvider , writer , shape , false ,
79
- RequiredMemberMode .NULLABLE );
84
+ RequiredMemberMode .NULLABLE );
80
85
}
81
86
82
87
StructureGenerator (Model model ,
83
- SymbolProvider symbolProvider ,
84
- TypeScriptWriter writer ,
85
- StructureShape shape ,
86
- boolean includeValidation ,
87
- RequiredMemberMode requiredMemberMode ) {
88
+ SymbolProvider symbolProvider ,
89
+ TypeScriptWriter writer ,
90
+ StructureShape shape ,
91
+ boolean includeValidation ,
92
+ RequiredMemberMode requiredMemberMode ) {
88
93
this .model = model ;
89
94
this .symbolProvider = symbolProvider ;
90
95
this .writer = writer ;
91
96
this .shape = shape ;
92
97
this .includeValidation = includeValidation ;
93
98
this .requiredMemberMode = requiredMemberMode ;
99
+ sensitiveDataFinder = new SensitiveDataFinder (model );
94
100
}
95
101
96
102
@ Override
@@ -105,20 +111,24 @@ public void run() {
105
111
/**
106
112
* Renders a normal, non-error structure.
107
113
*
108
- * <p>For example, given the following Smithy model:
114
+ * <p>
115
+ * For example, given the following Smithy model:
109
116
*
110
- * <pre>{@code
117
+ * <pre>
118
+ * {@code
111
119
* namespace smithy.example
112
120
*
113
121
* structure Person {
114
- * @ required
122
+ * @ required
115
123
* name: String,
116
- * @ range(min: 1)
124
+ * @ range(min: 1)
117
125
* age: Integer,
118
126
* }
119
- * }</pre>
127
+ * }
128
+ * </pre>
120
129
*
121
- * <p>The following TypeScript is rendered:
130
+ * <p>
131
+ * The following TypeScript is rendered:
122
132
*
123
133
* <pre>{@code
124
134
* export interface Person {
@@ -129,7 +139,8 @@ public void run() {
129
139
* export const PersonFilterSensitiveLog = (obj: Person): any => ({...obj});
130
140
* }</pre>
131
141
*
132
- * <p>If validation is enabled, it generates the following:
142
+ * <p>
143
+ * If validation is enabled, it generates the following:
133
144
*
134
145
* <pre>{@code
135
146
* export interface Person {
@@ -164,7 +175,11 @@ private void renderNonErrorStructure() {
164
175
}
165
176
166
177
StructuredMemberWriter config = new StructuredMemberWriter (
167
- model , symbolProvider , shape .getAllMembers ().values (), this .requiredMemberMode );
178
+ model ,
179
+ symbolProvider ,
180
+ shape .getAllMembers ().values (),
181
+ this .requiredMemberMode ,
182
+ sensitiveDataFinder );
168
183
config .writeMembers (writer , shape );
169
184
writer .closeBlock ("}" );
170
185
writer .write ("" );
@@ -174,15 +189,17 @@ private void renderNonErrorStructure() {
174
189
private void renderStructureNamespace (StructuredMemberWriter structuredMemberWriter , boolean includeValidation ) {
175
190
Symbol symbol = symbolProvider .toSymbol (shape );
176
191
String objectParam = "obj" ;
177
- writer .writeDocs ("@internal" );
178
- writer .openBlock ("export const $LFilterSensitiveLog = ($L: $L): any => ({" , "})" ,
179
- symbol .getName (),
180
- objectParam ,
181
- symbol .getName (),
182
- () -> {
183
- structuredMemberWriter .writeFilterSensitiveLog (writer , objectParam );
184
- }
185
- );
192
+
193
+ if (sensitiveDataFinder .findsSensitiveDataIn (shape )) {
194
+ writer .writeDocs ("@internal" );
195
+ writer .openBlock ("export const $LFilterSensitiveLog = ($L: $L): any => ({" , "})" ,
196
+ symbol .getName (),
197
+ objectParam ,
198
+ symbol .getName (),
199
+ () -> {
200
+ structuredMemberWriter .writeFilterSensitiveLog (writer , objectParam );
201
+ });
202
+ }
186
203
187
204
if (!includeValidation ) {
188
205
return ;
@@ -212,19 +229,23 @@ private void renderStructureNamespace(StructuredMemberWriter structuredMemberWri
212
229
* (ServiceException in case of server SDK), and add the appropriate fault
213
230
* property.
214
231
*
215
- * <p>Given the following Smithy structure:
232
+ * <p>
233
+ * Given the following Smithy structure:
216
234
*
217
- * <pre>{@code
235
+ * <pre>
236
+ * {@code
218
237
* namespace smithy.example
219
238
*
220
- * @ error("client")
239
+ * @ error("client")
221
240
* structure NoSuchResource {
222
- * @ required
241
+ * @ required
223
242
* resourceType: String
224
243
* }
225
- * }</pre>
244
+ * }
245
+ * </pre>
226
246
*
227
- * <p>The following TypeScript is generated:
247
+ * <p>
248
+ * The following TypeScript is generated:
228
249
*
229
250
* <pre>{@code
230
251
* import { ExceptionOptionType as __ExceptionOptionType } from "@aws-sdk/smithy-client";
@@ -261,8 +282,9 @@ private void renderErrorStructure() {
261
282
HttpProtocolGeneratorUtils .writeRetryableTrait (writer , shape , ";" );
262
283
}
263
284
StructuredMemberWriter structuredMemberWriter = new StructuredMemberWriter (model , symbolProvider ,
264
- shape .getAllMembers ().values (), this .requiredMemberMode );
265
- // since any error interface must extend from JavaScript Error interface, message member is already
285
+ shape .getAllMembers ().values (), this .requiredMemberMode , sensitiveDataFinder );
286
+ // since any error interface must extend from JavaScript Error interface,
287
+ // message member is already
266
288
// required in the JavaScript Error interface
267
289
structuredMemberWriter .skipMembers .add ("message" );
268
290
structuredMemberWriter .writeMembers (writer , shape );
0 commit comments