Skip to content

Commit e2325f6

Browse files
authored
Skip code generation of data filter functions for shapes that do not contain sensitive fields (recursive) (#722)
* check for sensitive data before generating a filter function * use forward recursive selector * include streaming in traits for which to generate filter * fix indentation * sensitive data check for unions * remove tests for non-generated unions * skip filters for insensitive properties in structures * pass dependency * formatting * move model to initialization in SensitiveDataFinder
1 parent c662462 commit e2325f6

File tree

7 files changed

+945
-656
lines changed

7 files changed

+945
-656
lines changed

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

+159-164
Large diffs are not rendered by default.

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

+56-34
Original file line numberDiff line numberDiff line change
@@ -29,19 +29,22 @@
2929
import software.amazon.smithy.model.traits.ErrorTrait;
3030
import software.amazon.smithy.typescript.codegen.TypeScriptSettings.RequiredMemberMode;
3131
import software.amazon.smithy.typescript.codegen.integration.HttpProtocolGeneratorUtils;
32+
import software.amazon.smithy.typescript.codegen.validation.SensitiveDataFinder;
3233
import software.amazon.smithy.utils.SmithyInternalApi;
3334

3435
/**
3536
* Generates normal structures and error structures.
3637
*
3738
* Renders structures as interfaces.
3839
*
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
4042
* provide helper functionality for checking if a given value is
4143
* known to be of the same type as the structure. This will be
4244
* even more useful if/when inheritance is added to Smithy.
4345
*
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
4548
* determine whether or not a generated TypeScript interface uses
4649
* required members. This is typically not recommended in other languages
4750
* since it's documented as backward-compatible for a model to migrate a
@@ -55,7 +58,8 @@
5558
* deserializers will need to set previously required properties to
5659
* undefined too.
5760
*
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
5963
* be set to {@code undefined}. This makes it clear that undefined checks
6064
* need to be made when using {@code --strictNullChecks}, but has no
6165
* effect otherwise.
@@ -69,28 +73,30 @@ final class StructureGenerator implements Runnable {
6973
private final StructureShape shape;
7074
private final boolean includeValidation;
7175
private final RequiredMemberMode requiredMemberMode;
76+
private final SensitiveDataFinder sensitiveDataFinder;
7277

7378
/**
7479
* sets 'includeValidation' to 'false' and requiredMemberMode
7580
* to {@link RequiredMemberMode#NULLABLE}.
7681
*/
7782
StructureGenerator(Model model, SymbolProvider symbolProvider, TypeScriptWriter writer, StructureShape shape) {
7883
this(model, symbolProvider, writer, shape, false,
79-
RequiredMemberMode.NULLABLE);
84+
RequiredMemberMode.NULLABLE);
8085
}
8186

8287
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) {
8893
this.model = model;
8994
this.symbolProvider = symbolProvider;
9095
this.writer = writer;
9196
this.shape = shape;
9297
this.includeValidation = includeValidation;
9398
this.requiredMemberMode = requiredMemberMode;
99+
sensitiveDataFinder = new SensitiveDataFinder(model);
94100
}
95101

96102
@Override
@@ -105,20 +111,24 @@ public void run() {
105111
/**
106112
* Renders a normal, non-error structure.
107113
*
108-
* <p>For example, given the following Smithy model:
114+
* <p>
115+
* For example, given the following Smithy model:
109116
*
110-
* <pre>{@code
117+
* <pre>
118+
* {@code
111119
* namespace smithy.example
112120
*
113121
* structure Person {
114-
* @required
122+
* &#64;required
115123
* name: String,
116-
* @range(min: 1)
124+
* &#64;range(min: 1)
117125
* age: Integer,
118126
* }
119-
* }</pre>
127+
* }
128+
* </pre>
120129
*
121-
* <p>The following TypeScript is rendered:
130+
* <p>
131+
* The following TypeScript is rendered:
122132
*
123133
* <pre>{@code
124134
* export interface Person {
@@ -129,7 +139,8 @@ public void run() {
129139
* export const PersonFilterSensitiveLog = (obj: Person): any => ({...obj});
130140
* }</pre>
131141
*
132-
* <p>If validation is enabled, it generates the following:
142+
* <p>
143+
* If validation is enabled, it generates the following:
133144
*
134145
* <pre>{@code
135146
* export interface Person {
@@ -164,7 +175,11 @@ private void renderNonErrorStructure() {
164175
}
165176

166177
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);
168183
config.writeMembers(writer, shape);
169184
writer.closeBlock("}");
170185
writer.write("");
@@ -174,15 +189,17 @@ private void renderNonErrorStructure() {
174189
private void renderStructureNamespace(StructuredMemberWriter structuredMemberWriter, boolean includeValidation) {
175190
Symbol symbol = symbolProvider.toSymbol(shape);
176191
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+
}
186203

187204
if (!includeValidation) {
188205
return;
@@ -212,19 +229,23 @@ private void renderStructureNamespace(StructuredMemberWriter structuredMemberWri
212229
* (ServiceException in case of server SDK), and add the appropriate fault
213230
* property.
214231
*
215-
* <p>Given the following Smithy structure:
232+
* <p>
233+
* Given the following Smithy structure:
216234
*
217-
* <pre>{@code
235+
* <pre>
236+
* {@code
218237
* namespace smithy.example
219238
*
220-
* @error("client")
239+
* &#64;error("client")
221240
* structure NoSuchResource {
222-
* @required
241+
* &#64;required
223242
* resourceType: String
224243
* }
225-
* }</pre>
244+
* }
245+
* </pre>
226246
*
227-
* <p>The following TypeScript is generated:
247+
* <p>
248+
* The following TypeScript is generated:
228249
*
229250
* <pre>{@code
230251
* import { ExceptionOptionType as __ExceptionOptionType } from "@aws-sdk/smithy-client";
@@ -261,8 +282,9 @@ private void renderErrorStructure() {
261282
HttpProtocolGeneratorUtils.writeRetryableTrait(writer, shape, ";");
262283
}
263284
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
266288
// required in the JavaScript Error interface
267289
structuredMemberWriter.skipMembers.add("message");
268290
structuredMemberWriter.writeMembers(writer, shape);

0 commit comments

Comments
 (0)