From 59b3fb32758ca60d54a7bb2dd809dd3d5622de19 Mon Sep 17 00:00:00 2001 From: Aaron Breuer Date: Thu, 21 Dec 2023 09:31:46 -0500 Subject: [PATCH] fix: model bucketing edge case with resource shape --- .../typescript/codegen/SymbolVisitor.java | 6 ++--- .../codegen/SymbolProviderTest.java | 27 +++++++++++++++++++ 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/SymbolVisitor.java b/smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/SymbolVisitor.java index eee19d3a8d7..4e0aef6c0b2 100644 --- a/smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/SymbolVisitor.java +++ b/smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/SymbolVisitor.java @@ -463,9 +463,9 @@ public String formatModuleName(Shape shape, String name) { } // Add models into buckets no bigger than chunk size. String path; - if (shape.getId().equals(UnitTypeTrait.UNIT)) { - // Unit should only be put in the zero bucket, since it does not - // generate anything. It also does not contribute to bucket size. + if (shape.getId().equals(UnitTypeTrait.UNIT) || shape.isResourceShape()) { + // Unit or Resource shapes should only be put in the zero bucket, since they do not + // generate anything. They also do not contribute to bucket size. path = String.join("/", ".", SHAPE_NAMESPACE_PREFIX, "models_0"); } else { path = String.join("/", ".", SHAPE_NAMESPACE_PREFIX, "models_" + bucketCount); diff --git a/smithy-typescript-codegen/src/test/java/software/amazon/smithy/typescript/codegen/SymbolProviderTest.java b/smithy-typescript-codegen/src/test/java/software/amazon/smithy/typescript/codegen/SymbolProviderTest.java index e3b0ef404ed..65b659c047e 100644 --- a/smithy-typescript-codegen/src/test/java/software/amazon/smithy/typescript/codegen/SymbolProviderTest.java +++ b/smithy-typescript-codegen/src/test/java/software/amazon/smithy/typescript/codegen/SymbolProviderTest.java @@ -14,6 +14,7 @@ import software.amazon.smithy.model.shapes.IntEnumShape; import software.amazon.smithy.model.shapes.ListShape; import software.amazon.smithy.model.shapes.MemberShape; +import software.amazon.smithy.model.shapes.ResourceShape; import software.amazon.smithy.model.shapes.Shape; import software.amazon.smithy.model.shapes.ShapeId; import software.amazon.smithy.model.shapes.StringShape; @@ -249,4 +250,30 @@ public void omitsUnknownNumberIntEnumVariant() { assertThat(memberSymbol.getName(), equalTo("Foo")); } + @Test + public void placesResourceShapeIntoInitialBucket() { + Shape shape1 = StructureShape.builder().id("com.foo#Hello").build(); + Shape shape2 = ResourceShape.builder().id("com.foo.baz#Hello").build(); + Model model = Model.assembler() + .addImport(getClass().getResource("simple-service.smithy")) + .addShapes(shape1, shape2) + .assemble() + .unwrap(); + TypeScriptSettings settings = TypeScriptSettings.from(model, Node.objectNodeBuilder() + .withMember("package", Node.from("example")) + .withMember("packageVersion", Node.from("1.0.0")) + .build()); + SymbolProvider provider = new SymbolVisitor(model, settings, 1); + Symbol symbol1 = provider.toSymbol(shape1); + Symbol symbol2 = provider.toSymbol(shape2); + MockManifest manifest = new MockManifest(); + SymbolVisitor.writeModelIndex(Arrays.asList(shape1, shape2), provider, manifest); + + assertThat(symbol1.getNamespace(), equalTo("./" + CodegenUtils.SOURCE_FOLDER + "/models/models_0")); + assertThat(symbol1.getDefinitionFile(), equalTo("./" + CodegenUtils.SOURCE_FOLDER + "/models/models_0.ts")); + assertThat(symbol2.getNamespace(), equalTo("./" + CodegenUtils.SOURCE_FOLDER + "/models/models_0")); + assertThat(symbol2.getDefinitionFile(), equalTo("./" + CodegenUtils.SOURCE_FOLDER + "/models/models_0.ts")); + assertThat(manifest.getFileString(CodegenUtils.SOURCE_FOLDER + "/models/index.ts").get(), + containsString("export * from \"./models_0\";")); + } }