diff --git a/smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/StructuredMemberWriter.java b/smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/StructuredMemberWriter.java index 01148f750fc..7773101749a 100644 --- a/smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/StructuredMemberWriter.java +++ b/smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/StructuredMemberWriter.java @@ -25,9 +25,11 @@ import software.amazon.smithy.model.shapes.MapShape; import software.amazon.smithy.model.shapes.MemberShape; import software.amazon.smithy.model.shapes.Shape; +import software.amazon.smithy.model.shapes.SimpleShape; import software.amazon.smithy.model.shapes.StructureShape; import software.amazon.smithy.model.traits.IdempotencyTokenTrait; import software.amazon.smithy.model.traits.SensitiveTrait; +import software.amazon.smithy.model.traits.StreamingTrait; /** * Generates objects, interfaces, enums, etc. @@ -74,27 +76,37 @@ void writeFilterSensitiveLog(TypeScriptWriter writer, String objectParam) { writer.write("...$L,", objectParam); for (MemberShape member : members) { if (isMemberOverwriteRequired(member, new HashSet())) { - Shape memberTarget = model.expectShape(member.getTarget()); String memberName = getSanitizedMemberName(member); - String memberParam = String.format("%s.%s", objectParam, memberName); writer.openBlock("...($1L.$2L && { $2L: ", "}),", objectParam, memberName, () -> { - if (member.getMemberTrait(model, SensitiveTrait.class).isPresent()) { - // member is Sensitive, hide the value. - writer.write("SENSITIVE_STRING"); - } else if (memberTarget instanceof StructureShape) { - writeStructureFilterSensitiveLog(writer, memberTarget, memberParam); - } else if (memberTarget instanceof CollectionShape) { - MemberShape collectionMember = ((CollectionShape) memberTarget).getMember(); - writeCollectionFilterSensitiveLog(writer, collectionMember, memberParam); - } else if (memberTarget instanceof MapShape) { - MemberShape mapMember = ((MapShape) memberTarget).getValue(); - writeMapFilterSensitiveLog(writer, mapMember, memberParam); - } + String memberParam = String.format("%s.%s", objectParam, memberName); + writeMemberFilterSensitiveLog(writer, member, memberParam); }); } } } + void writeMemberFilterSensitiveLog(TypeScriptWriter writer, MemberShape member, String memberParam) { + Shape memberTarget = model.expectShape(member.getTarget()); + if (member.getMemberTrait(model, SensitiveTrait.class).isPresent()) { + // member is Sensitive, hide the value. + writer.write("SENSITIVE_STRING"); + } else if (memberTarget instanceof SimpleShape) { + writer.write(memberParam); + } else if (memberTarget.isStructureShape() || memberTarget.isUnionShape()) { + writeStructureFilterSensitiveLog(writer, memberTarget, memberParam); + } else if (memberTarget instanceof CollectionShape) { + MemberShape collectionMember = ((CollectionShape) memberTarget).getMember(); + writeCollectionFilterSensitiveLog(writer, collectionMember, memberParam); + } else if (memberTarget instanceof MapShape) { + MemberShape mapMember = ((MapShape) memberTarget).getValue(); + writeMapFilterSensitiveLog(writer, mapMember, memberParam); + } else { + throw new CodegenException(String.format( + "MemberFilterSensitiveLog attempted for %s", memberTarget.getType() + )); + } + } + /** * Recursively writes filterSensitiveLog for StructureShape. */ @@ -106,10 +118,13 @@ private void writeStructureFilterSensitiveLog( if (structureTarget.hasTrait(SensitiveTrait.class)) { // member is Sensitive, hide the value. writer.write("SENSITIVE_STRING"); - return; + } else if (structureTarget.hasTrait(StreamingTrait.class) && structureTarget.isUnionShape()) { + // disable logging for StreamingTrait + writer.write("'STREAMING_CONTENT'"); + } else { + // Call filterSensitiveLog on Structure. + writer.write("$T.filterSensitiveLog($L)", symbolProvider.toSymbol(structureTarget), structureParam); } - // Call filterSensitiveLog on Structure. - writer.write("$T.filterSensitiveLog($L)", symbolProvider.toSymbol(structureTarget), structureParam); } /** @@ -123,32 +138,15 @@ private void writeCollectionFilterSensitiveLog( if (collectionMember.getMemberTrait(model, SensitiveTrait.class).isPresent()) { // member is Sensitive, hide the value. writer.write("SENSITIVE_STRING"); - return; + } else if (model.expectShape(collectionMember.getTarget()) instanceof SimpleShape) { + writer.write(collectionParam); + } else { + writer.openBlock("$L.map(", ")", collectionParam, () -> { + String itemParam = "item"; + writer.write("$L => ", itemParam); + writeMemberFilterSensitiveLog(writer, collectionMember, itemParam); + }); } - - writer.openBlock("$L.map(", ")", collectionParam, () -> { - String itemParam = "item"; - Shape collectionMemberTarget = model.expectShape(collectionMember.getTarget()); - writer.write("$L => ", itemParam); - if (collectionMemberTarget instanceof StructureShape) { - writeStructureFilterSensitiveLog(writer, collectionMemberTarget, itemParam); - } else if (collectionMemberTarget instanceof CollectionShape) { - MemberShape nestedCollectionMember = ((CollectionShape) collectionMemberTarget).getMember(); - writeCollectionFilterSensitiveLog(writer, nestedCollectionMember, itemParam); - } else if (collectionMemberTarget instanceof MapShape) { - MemberShape mapMember = ((MapShape) collectionMemberTarget).getValue(); - writeMapFilterSensitiveLog(writer, mapMember, itemParam); - } else { - // This path should not reach because of recursive isMemberOverwriteRequired. - throw new CodegenException(String.format( - "CollectionFilterSensitiveLog attempted for %s while it was not required", - collectionMemberTarget.getType() - )); - // For quick-fix in case of high severity issue: - // comment out the exception above and uncomment the line below. - // writer.write("$1L => $1L", itemParam); - } - }); } /** @@ -158,41 +156,23 @@ private void writeMapFilterSensitiveLog(TypeScriptWriter writer, MemberShape map if (mapMember.getMemberTrait(model, SensitiveTrait.class).isPresent()) { // member is Sensitive, hide the value. writer.write("SENSITIVE_STRING"); - return; + } else if (model.expectShape(mapMember.getTarget()) instanceof SimpleShape) { + writer.write(mapParam); + } else { + String accParam = "acc"; // accumulator for the reducer + String keyParam = "key"; // key of the Object.entries() key-value pair + String valueParam = "value"; // value of the Object.entries() key-value pair + + // Reducer is common to all shapes. + writer.openBlock("Object.entries($L).reduce(($L: any, [$L, $L]: [string, $T]) => ({", "}), {})", + mapParam, accParam, keyParam, valueParam, symbolProvider.toSymbol(mapMember), () -> { + writer.write("...$L,", accParam); + writer.openBlock("[$L]: ", ",", keyParam, () -> { + writeMemberFilterSensitiveLog(writer, mapMember, valueParam); + }); + } + ); } - - String accParam = "acc"; // accumulator for the reducer - String keyParam = "key"; // key of the Object.entries() key-value pair - String valueParam = "value"; // value of the Object.entries() key-value pair - - // Reducer is common to all shapes. - writer.openBlock("Object.entries($L).reduce(($L: any, [$L, $L]: [string, $T]) => ({", "}), {})", - mapParam, accParam, keyParam, valueParam, symbolProvider.toSymbol(mapMember), () -> { - writer.write("...$L,", accParam); - Shape mapMemberTarget = model.expectShape(mapMember.getTarget()); - writer.openBlock("[$L]: ", ",", keyParam, () -> { - if (mapMemberTarget instanceof StructureShape) { - writeStructureFilterSensitiveLog(writer, mapMemberTarget, valueParam); - } else if (mapMemberTarget instanceof CollectionShape) { - MemberShape collectionMember = ((CollectionShape) mapMemberTarget).getMember(); - writeCollectionFilterSensitiveLog(writer, collectionMember, valueParam); - } else if (mapMemberTarget instanceof MapShape) { - MemberShape nestedMapMember = ((MapShape) mapMemberTarget).getValue(); - writeMapFilterSensitiveLog(writer, nestedMapMember, valueParam); - } else { - // This path should not reach because of recursive isMemberOverwriteRequired. - throw new CodegenException(String.format( - "MapFilterSensitiveLog attempted for %s while it was not required", - mapMemberTarget.getType() - )); - // For quick-fix in case of high severity issue: - // comment out the exception above and uncomment the line below. - // writer.write("$L", valueParam); - } - - }); - } - ); } /** @@ -209,7 +189,10 @@ private boolean isMemberOverwriteRequired(MemberShape member, Set parent Shape memberTarget = model.expectShape(member.getTarget()); parents.add(symbolProvider.toMemberName(member)); - if (memberTarget instanceof StructureShape) { + if (memberTarget.isUnionShape()) { + // always call filterSensitiveLog for UnionShape + return true; + } else if (memberTarget.isStructureShape()) { Collection structureMemberList = ((StructureShape) memberTarget).getAllMembers().values(); for (MemberShape structureMember: structureMemberList) { if (!parents.contains(symbolProvider.toMemberName(structureMember)) diff --git a/smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/UnionGenerator.java b/smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/UnionGenerator.java index 63f9f4ef068..20dc87de295 100644 --- a/smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/UnionGenerator.java +++ b/smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/UnionGenerator.java @@ -101,6 +101,16 @@ * if (value.bear !== undefined) return visitor.bear(value.bear); * return visitor._(value.$unknown[0], value.$unknown[1]); * } + * export const filterSensitiveLog = (obj: Attacker) => { + * if (obj.lion !== undefined) + * return { lion: Lion.filterSensitiveLog(obj.lion) }; + * if (obj.tiger !== undefined) + * return { tiger: Tiger.filterSensitiveLog(obj.tiger) }; + * if (obj.bear !== undefined) + * return { bear: Bear.filterSensitiveLog(obj.bear) }; + * if (obj.$unknown !== undefined) + * return { [obj.$unknown[0]]: 'UNKNOWN' }; + * } * } * } * @@ -148,6 +158,7 @@ public void run() { writeUnionMemberInterfaces(); writeVisitorType(); writeVisitorFunction(); + writeFilterSensitiveLog(); }); } @@ -155,6 +166,7 @@ private void writeUnionMemberInterfaces() { writer.openBlock("interface $$Base {", "}", () -> { writer.write("__type?: $S;", shape.getId().getName()); }); + writer.write(""); for (MemberShape member : shape.getAllMembers().values()) { String name = variantMap.get(member.getMemberName()); @@ -170,6 +182,7 @@ private void writeUnionMemberInterfaces() { } writer.write("$$unknown?: never;"); }); + writer.write(""); } // Write out the unknown variant. @@ -179,6 +192,7 @@ private void writeUnionMemberInterfaces() { } writer.write("$$unknown: [string, any];"); }); + writer.write(""); } private void writeVisitorType() { @@ -189,6 +203,7 @@ private void writeVisitorType() { } writer.write("_: (name: string, value: any) => T;"); }); + writer.write(""); } private void writeVisitorFunction() { @@ -203,5 +218,28 @@ private void writeVisitorFunction() { } writer.write("return visitor._(value.$$unknown[0], value.$$unknown[1]);"); writer.dedent().write("}"); + writer.write(""); + } + + private void writeFilterSensitiveLog() { + String objectParam = "obj"; + writer.openBlock("export const filterSensitiveLog = ($L: $L): any => {", "}", + objectParam, symbol.getName(), + () -> { + for (MemberShape member : shape.getAllMembers().values()) { + String memberName = symbolProvider.toMemberName(member); + StructuredMemberWriter structuredMemberWriter = new StructuredMemberWriter( + model, symbolProvider, shape.getAllMembers().values()); + writer.openBlock("if (${1L}.${2L} !== undefined) return {${2L}: ", "};", + objectParam, memberName, () -> { + String memberParam = String.format("%s.%s", objectParam, memberName); + structuredMemberWriter.writeMemberFilterSensitiveLog(writer, member, memberParam); + } + ); + } + writer.write("if (${1L}.$$unknown !== undefined) return {[${1L}.$$unknown[0]]: 'UNKNOWN'};", + objectParam); + } + ); } } diff --git a/smithy-typescript-codegen/src/test/java/software/amazon/smithy/typescript/codegen/StructureGeneratorTest.java b/smithy-typescript-codegen/src/test/java/software/amazon/smithy/typescript/codegen/StructureGeneratorTest.java index f63263239dc..b4fc3ed7e3c 100644 --- a/smithy-typescript-codegen/src/test/java/software/amazon/smithy/typescript/codegen/StructureGeneratorTest.java +++ b/smithy-typescript-codegen/src/test/java/software/amazon/smithy/typescript/codegen/StructureGeneratorTest.java @@ -119,8 +119,8 @@ public void filtersSensitiveStructure() { } @Test - public void skipsFilterForInsensitiveStructure() { - testStructureCodegen("test-insensitive-structure.smithy", + public void skipsFilterForStructureWithoutSensitiveData() { + testStructureCodegen("test-structure-without-sensitive-data.smithy", " export const filterSensitiveLog = (obj: GetFooInput): any => ({\n" + " ...obj,\n" + " })\n"); @@ -138,8 +138,124 @@ public void filtersSensitiveMemberPointingToStructure() { } @Test - public void callsFilterForListWithSensitiveData() { - testStructureCodegen("test-list-with-sensitive-data.smithy", + public void callsFilterForUnionWithSensitiveData() { + testStructureCodegen("test-union-with-sensitive-data.smithy", + " export const filterSensitiveLog = (obj: GetFooInput): any => ({\n" + + " ...obj,\n" + + " ...(obj.foo && { foo:\n" + + " TestUnion.filterSensitiveLog(obj.foo)\n" + + " }),\n" + + " })\n"); + } + + @Test + public void callsFilterInUnionWithSensitiveData() { + testStructureCodegen("test-union-with-sensitive-data.smithy", + " export const filterSensitiveLog = (obj: TestUnion): any => {\n" + + " if (obj.bar !== undefined) return {bar:\n" + + " obj.bar\n" + + " };\n" + + " if (obj.sensitiveBar !== undefined) return {sensitiveBar:\n" + + " SENSITIVE_STRING\n" + + " };\n" + + " if (obj.$unknown !== undefined) return {[obj.$unknown[0]]: 'UNKNOWN'};\n" + + " }\n"); + } + + @Test + public void callsFilterForUnionWithoutSensitiveData() { + testStructureCodegen("test-union-without-sensitive-data.smithy", + " export const filterSensitiveLog = (obj: GetFooInput): any => ({\n" + + " ...obj,\n" + + " ...(obj.foo && { foo:\n" + + " TestUnion.filterSensitiveLog(obj.foo)\n" + + " }),\n" + + " })\n"); + } + + @Test + public void callsFilterInUnionWithoutSensitiveData() { + testStructureCodegen("test-union-without-sensitive-data.smithy", + " export const filterSensitiveLog = (obj: TestUnion): any => {\n" + + " if (obj.fooString !== undefined) return {fooString:\n" + + " obj.fooString\n" + + " };\n" + + " if (obj.barString !== undefined) return {barString:\n" + + " obj.barString\n" + + " };\n" + + " if (obj.$unknown !== undefined) return {[obj.$unknown[0]]: 'UNKNOWN'};\n" + + " }\n"); + } + + @Test + public void callsFilterInUnionWithStructure() { + testStructureCodegen("test-union-with-structure.smithy", + " export const filterSensitiveLog = (obj: TestUnion): any => {\n" + + " if (obj.fooUser !== undefined) return {fooUser:\n" + + " User.filterSensitiveLog(obj.fooUser)\n" + + " };\n" + + " if (obj.$unknown !== undefined) return {[obj.$unknown[0]]: 'UNKNOWN'};\n" + + " }\n"); + } + + @Test + public void callsFilterInUnionWithList() { + testStructureCodegen("test-union-with-list.smithy", + " export const filterSensitiveLog = (obj: TestUnion): any => {\n" + + " if (obj.list !== undefined) return {list:\n" + + " obj.list\n" + + " };\n" + + " if (obj.$unknown !== undefined) return {[obj.$unknown[0]]: 'UNKNOWN'};\n" + + " }\n"); + } + + @Test + public void callsFilterInUnionWithMap() { + testStructureCodegen("test-union-with-map.smithy", + " export const filterSensitiveLog = (obj: TestUnion): any => {\n" + + " if (obj.map !== undefined) return {map:\n" + + " obj.map\n" + + " };\n" + + " if (obj.$unknown !== undefined) return {[obj.$unknown[0]]: 'UNKNOWN'};\n" + + " }\n"); + } + + @Test + public void filtersStreamingUnion() { + testStructureCodegen("test-streaming-union.smithy", + " export const filterSensitiveLog = (obj: GetFooInput): any => ({\n" + + " ...obj,\n" + + " ...(obj.foo && { foo:\n" + + " 'STREAMING_CONTENT'\n" + + " }),\n" + + " })\n"); + } + + @Test + public void filtersSensitiveUnion() { + testStructureCodegen("test-sensitive-union.smithy", + " export const filterSensitiveLog = (obj: GetFooInput): any => ({\n" + + " ...obj,\n" + + " ...(obj.foo && { foo:\n" + + " SENSITIVE_STRING\n" + + " }),\n" + + " })\n"); + } + + @Test + public void filtersSensitiveMemberPointingToUnion() { + testStructureCodegen("test-sensitive-member-pointing-to-union.smithy", + " export const filterSensitiveLog = (obj: GetFooInput): any => ({\n" + + " ...obj,\n" + + " ...(obj.sensitiveFoo && { sensitiveFoo:\n" + + " SENSITIVE_STRING\n" + + " }),\n" + + " })\n"); + } + + @Test + public void callsFilterForListWithStructureWithSensitiveData() { + testStructureCodegen("test-list-with-structure-with-sensitive-data.smithy", " export const filterSensitiveLog = (obj: GetFooInput): any => ({\n" + " ...obj,\n" + " ...(obj.foo && { foo:\n" @@ -152,8 +268,8 @@ public void callsFilterForListWithSensitiveData() { } @Test - public void callsFilterInListWithSensitiveData() { - testStructureCodegen("test-list-with-sensitive-data.smithy", + public void callsFilterInListWithStructureWithSensitiveData() { + testStructureCodegen("test-list-with-structure-with-sensitive-data.smithy", " export const filterSensitiveLog = (obj: User): any => ({\n" + " ...obj,\n" + " ...(obj.password && { password:\n" @@ -162,6 +278,34 @@ public void callsFilterInListWithSensitiveData() { + " })\n"); } + @Test + public void callsFilterForListWithUnionWithSensitiveData() { + testStructureCodegen("test-list-with-union-with-sensitive-data.smithy", + " export const filterSensitiveLog = (obj: GetFooInput): any => ({\n" + + " ...obj,\n" + + " ...(obj.foo && { foo:\n" + + " obj.foo.map(\n" + + " item =>\n" + + " TestUnion.filterSensitiveLog(item)\n" + + " )\n" + + " }),\n" + + " })\n"); + } + + @Test + public void callsFilterInListWithUnionWithSensitiveData() { + testStructureCodegen("test-list-with-union-with-sensitive-data.smithy", + " export const filterSensitiveLog = (obj: TestUnion): any => {\n" + + " if (obj.bar !== undefined) return {bar:\n" + + " obj.bar\n" + + " };\n" + + " if (obj.sensitiveBar !== undefined) return {sensitiveBar:\n" + + " SENSITIVE_STRING\n" + + " };\n" + + " if (obj.$unknown !== undefined) return {[obj.$unknown[0]]: 'UNKNOWN'};\n" + + " }\n"); + } + @Test public void callsFilterForListWithSensitiveMember() { testStructureCodegen("test-list-with-sensitive-member.smithy", @@ -204,19 +348,8 @@ public void filtersSensitiveMemberPointingToList() { } @Test - public void callsFilterForMapWithSensitiveData() { - testStructureCodegen("test-map-with-sensitive-data.smithy", - " export const filterSensitiveLog = (obj: User): any => ({\n" - + " ...obj,\n" - + " ...(obj.password && { password:\n" - + " SENSITIVE_STRING\n" - + " }),\n" - + " })\n"); - } - - @Test - public void callsFilterInMapWithSensitiveData() { - testStructureCodegen("test-map-with-sensitive-data.smithy", + public void callsFilterForMapWithStructureWithSensitiveData() { + testStructureCodegen("test-map-with-structure-with-sensitive-data.smithy", " export const filterSensitiveLog = (obj: GetFooInput): any => ({\n" + " ...obj,\n" + " ...(obj.foo && { foo:\n" @@ -230,6 +363,48 @@ public void callsFilterInMapWithSensitiveData() { + " })\n"); } + @Test + public void callsFilterInMapWithStructureWithSensitiveData() { + testStructureCodegen("test-map-with-structure-with-sensitive-data.smithy", + " export const filterSensitiveLog = (obj: User): any => ({\n" + + " ...obj,\n" + + " ...(obj.password && { password:\n" + + " SENSITIVE_STRING\n" + + " }),\n" + + " })\n"); + } + + @Test + public void callsFilterForMapWithUnionWithSensitiveData() { + testStructureCodegen("test-map-with-union-with-sensitive-data.smithy", + " export const filterSensitiveLog = (obj: GetFooInput): any => ({\n" + + " ...obj,\n" + + " ...(obj.foo && { foo:\n" + + " Object.entries(obj.foo).reduce((acc: any, [key, value]: [string, TestUnion]) => ({\n" + + " ...acc,\n" + + " [key]:\n" + + " TestUnion.filterSensitiveLog(value)\n" + + " ,\n" + + " }), {})\n" + + " }),\n" + + " })\n"); + } + + @Test + public void callsFilterInMapWithUnionWithSensitiveData() { + testStructureCodegen("test-map-with-union-with-sensitive-data.smithy", + " export const filterSensitiveLog = (obj: TestUnion): any => {\n" + + " if (obj.bar !== undefined) return {bar:\n" + + " obj.bar\n" + + " };\n" + + " if (obj.sensitiveBar !== undefined) return {sensitiveBar:\n" + + " SENSITIVE_STRING\n" + + " };\n" + + " if (obj.$unknown !== undefined) return {[obj.$unknown[0]]: 'UNKNOWN'};\n" + + " }\n"); + } + + @Test public void callsFilterForMapWithSensitiveMember() { testStructureCodegen("test-map-with-sensitive-member.smithy", diff --git a/smithy-typescript-codegen/src/test/resources/software/amazon/smithy/typescript/codegen/test-list-with-sensitive-data.smithy b/smithy-typescript-codegen/src/test/resources/software/amazon/smithy/typescript/codegen/test-list-with-structure-with-sensitive-data.smithy similarity index 100% rename from smithy-typescript-codegen/src/test/resources/software/amazon/smithy/typescript/codegen/test-list-with-sensitive-data.smithy rename to smithy-typescript-codegen/src/test/resources/software/amazon/smithy/typescript/codegen/test-list-with-structure-with-sensitive-data.smithy diff --git a/smithy-typescript-codegen/src/test/resources/software/amazon/smithy/typescript/codegen/test-list-with-union-with-sensitive-data.smithy b/smithy-typescript-codegen/src/test/resources/software/amazon/smithy/typescript/codegen/test-list-with-union-with-sensitive-data.smithy new file mode 100644 index 00000000000..e443e035d65 --- /dev/null +++ b/smithy-typescript-codegen/src/test/resources/software/amazon/smithy/typescript/codegen/test-list-with-union-with-sensitive-data.smithy @@ -0,0 +1,25 @@ +namespace smithy.example + +service Example { + version: "1.0.0", + operations: [GetFoo] +} + +operation GetFoo { + input: GetFooInput +} + +structure GetFooInput { + foo: UserList +} + +list UserList { + member: TestUnion +} + +union TestUnion { + bar: String, + + @sensitive + sensitiveBar: String +} diff --git a/smithy-typescript-codegen/src/test/resources/software/amazon/smithy/typescript/codegen/test-map-with-sensitive-data.smithy b/smithy-typescript-codegen/src/test/resources/software/amazon/smithy/typescript/codegen/test-map-with-structure-with-sensitive-data.smithy similarity index 100% rename from smithy-typescript-codegen/src/test/resources/software/amazon/smithy/typescript/codegen/test-map-with-sensitive-data.smithy rename to smithy-typescript-codegen/src/test/resources/software/amazon/smithy/typescript/codegen/test-map-with-structure-with-sensitive-data.smithy diff --git a/smithy-typescript-codegen/src/test/resources/software/amazon/smithy/typescript/codegen/test-map-with-union-with-sensitive-data.smithy b/smithy-typescript-codegen/src/test/resources/software/amazon/smithy/typescript/codegen/test-map-with-union-with-sensitive-data.smithy new file mode 100644 index 00000000000..e37d151aa1d --- /dev/null +++ b/smithy-typescript-codegen/src/test/resources/software/amazon/smithy/typescript/codegen/test-map-with-union-with-sensitive-data.smithy @@ -0,0 +1,26 @@ +namespace smithy.example + +service Example { + version: "1.0.0", + operations: [GetFoo] +} + +operation GetFoo { + input: GetFooInput +} + +structure GetFooInput { + foo: UserMap +} + +map UserMap { + key: String, + value: TestUnion +} + +union TestUnion { + bar: String, + + @sensitive + sensitiveBar: String +} diff --git a/smithy-typescript-codegen/src/test/resources/software/amazon/smithy/typescript/codegen/test-sensitive-member-pointing-to-union.smithy b/smithy-typescript-codegen/src/test/resources/software/amazon/smithy/typescript/codegen/test-sensitive-member-pointing-to-union.smithy new file mode 100644 index 00000000000..ff9e45bf7a6 --- /dev/null +++ b/smithy-typescript-codegen/src/test/resources/software/amazon/smithy/typescript/codegen/test-sensitive-member-pointing-to-union.smithy @@ -0,0 +1,20 @@ +namespace smithy.example + +service Example { + version: "1.0.0", + operations: [GetFoo] +} + +operation GetFoo { + input: GetFooInput +} + +structure GetFooInput { + @sensitive + sensitiveFoo: TestUnion +} + +union TestUnion { + fooString: String, + barString: String +} diff --git a/smithy-typescript-codegen/src/test/resources/software/amazon/smithy/typescript/codegen/test-sensitive-union.smithy b/smithy-typescript-codegen/src/test/resources/software/amazon/smithy/typescript/codegen/test-sensitive-union.smithy new file mode 100644 index 00000000000..0a09a4bce80 --- /dev/null +++ b/smithy-typescript-codegen/src/test/resources/software/amazon/smithy/typescript/codegen/test-sensitive-union.smithy @@ -0,0 +1,20 @@ +namespace smithy.example + +service Example { + version: "1.0.0", + operations: [GetFoo] +} + +operation GetFoo { + input: GetFooInput +} + +structure GetFooInput { + foo: SecretUnion +} + +@sensitive +union SecretUnion { + fooString: String, + barString: String +} diff --git a/smithy-typescript-codegen/src/test/resources/software/amazon/smithy/typescript/codegen/test-streaming-union.smithy b/smithy-typescript-codegen/src/test/resources/software/amazon/smithy/typescript/codegen/test-streaming-union.smithy new file mode 100644 index 00000000000..5aad7557a82 --- /dev/null +++ b/smithy-typescript-codegen/src/test/resources/software/amazon/smithy/typescript/codegen/test-streaming-union.smithy @@ -0,0 +1,23 @@ +namespace smithy.example + +service Example { + version: "1.0.0", + operations: [GetFoo] +} + +operation GetFoo { + input: GetFooInput +} + +structure GetFooInput { + foo: StreamingUnion +} + +@streaming +union StreamingUnion { + message: Message +} + +structure Message { + message: String +} diff --git a/smithy-typescript-codegen/src/test/resources/software/amazon/smithy/typescript/codegen/test-insensitive-structure.smithy b/smithy-typescript-codegen/src/test/resources/software/amazon/smithy/typescript/codegen/test-structure-without-sensitive-data.smithy similarity index 100% rename from smithy-typescript-codegen/src/test/resources/software/amazon/smithy/typescript/codegen/test-insensitive-structure.smithy rename to smithy-typescript-codegen/src/test/resources/software/amazon/smithy/typescript/codegen/test-structure-without-sensitive-data.smithy diff --git a/smithy-typescript-codegen/src/test/resources/software/amazon/smithy/typescript/codegen/test-union-with-list.smithy b/smithy-typescript-codegen/src/test/resources/software/amazon/smithy/typescript/codegen/test-union-with-list.smithy new file mode 100644 index 00000000000..84d3e643ebb --- /dev/null +++ b/smithy-typescript-codegen/src/test/resources/software/amazon/smithy/typescript/codegen/test-union-with-list.smithy @@ -0,0 +1,22 @@ +namespace smithy.example + +service Example { + version: "1.0.0", + operations: [GetFoo] +} + +operation GetFoo { + input: GetFooInput +} + +structure GetFooInput { + foo: TestUnion +} + +union TestUnion { + list: NamesList +} + +list NamesList { + member: String +} diff --git a/smithy-typescript-codegen/src/test/resources/software/amazon/smithy/typescript/codegen/test-union-with-map.smithy b/smithy-typescript-codegen/src/test/resources/software/amazon/smithy/typescript/codegen/test-union-with-map.smithy new file mode 100644 index 00000000000..e7cc9ffccb8 --- /dev/null +++ b/smithy-typescript-codegen/src/test/resources/software/amazon/smithy/typescript/codegen/test-union-with-map.smithy @@ -0,0 +1,23 @@ +namespace smithy.example + +service Example { + version: "1.0.0", + operations: [GetFoo] +} + +operation GetFoo { + input: GetFooInput +} + +structure GetFooInput { + foo: TestUnion +} + +union TestUnion { + map: NamesMap +} + +map NamesMap { + key: String, + value: String +} \ No newline at end of file diff --git a/smithy-typescript-codegen/src/test/resources/software/amazon/smithy/typescript/codegen/test-union-with-sensitive-data.smithy b/smithy-typescript-codegen/src/test/resources/software/amazon/smithy/typescript/codegen/test-union-with-sensitive-data.smithy new file mode 100644 index 00000000000..85b85701611 --- /dev/null +++ b/smithy-typescript-codegen/src/test/resources/software/amazon/smithy/typescript/codegen/test-union-with-sensitive-data.smithy @@ -0,0 +1,21 @@ +namespace smithy.example + +service Example { + version: "1.0.0", + operations: [GetFoo] +} + +operation GetFoo { + input: GetFooInput +} + +structure GetFooInput { + foo: TestUnion +} + +union TestUnion { + bar: String, + + @sensitive + sensitiveBar: String +} diff --git a/smithy-typescript-codegen/src/test/resources/software/amazon/smithy/typescript/codegen/test-union-with-structure.smithy b/smithy-typescript-codegen/src/test/resources/software/amazon/smithy/typescript/codegen/test-union-with-structure.smithy new file mode 100644 index 00000000000..54187f6eaa6 --- /dev/null +++ b/smithy-typescript-codegen/src/test/resources/software/amazon/smithy/typescript/codegen/test-union-with-structure.smithy @@ -0,0 +1,23 @@ +namespace smithy.example + +service Example { + version: "1.0.0", + operations: [GetFoo] +} + +operation GetFoo { + input: GetFooInput +} + +structure GetFooInput { + foo: TestUnion +} + +union TestUnion { + fooUser: User +} + +structure User { + firstname: String, + lastname: String +} diff --git a/smithy-typescript-codegen/src/test/resources/software/amazon/smithy/typescript/codegen/test-union-without-sensitive-data.smithy b/smithy-typescript-codegen/src/test/resources/software/amazon/smithy/typescript/codegen/test-union-without-sensitive-data.smithy new file mode 100644 index 00000000000..73ba43a5c63 --- /dev/null +++ b/smithy-typescript-codegen/src/test/resources/software/amazon/smithy/typescript/codegen/test-union-without-sensitive-data.smithy @@ -0,0 +1,19 @@ +namespace smithy.example + +service Example { + version: "1.0.0", + operations: [GetFoo] +} + +operation GetFoo { + input: GetFooInput +} + +structure GetFooInput { + foo: TestUnion +} + +union TestUnion { + fooString: String, + barString: String +}