diff --git a/.changeset/old-moles-grab.md b/.changeset/old-moles-grab.md new file mode 100644 index 00000000000..560b273cc88 --- /dev/null +++ b/.changeset/old-moles-grab.md @@ -0,0 +1,5 @@ +--- +"@smithy/core": patch +--- + +omit undefined values in cbor deserialization diff --git a/packages/core/src/submodules/cbor/CborCodec.spec.ts b/packages/core/src/submodules/cbor/CborCodec.spec.ts index 2fbd138a289..42d52fe9810 100644 --- a/packages/core/src/submodules/cbor/CborCodec.spec.ts +++ b/packages/core/src/submodules/cbor/CborCodec.spec.ts @@ -70,4 +70,23 @@ describe(CborShapeSerializer.name, () => { } }); }); + + describe("deserialization", () => { + it("should not create undefined values", async () => { + const struct = [3, "ns", "Struct", 0, ["sessionId", "tokenId"], [0, 0]] satisfies StaticStructureSchema; + const deserializer = codec.createDeserializer(); + + const data = cbor.serialize({ + sessionId: "abcd", + }); + + const deserialized = deserializer.read(struct, data); + + expect(deserialized).toEqual({ + sessionId: "abcd", + }); + + expect("tokenId" in deserialized).toEqual(false); + }); + }); }); diff --git a/packages/core/src/submodules/cbor/CborCodec.ts b/packages/core/src/submodules/cbor/CborCodec.ts index 5cc7eba389c..154b6168646 100644 --- a/packages/core/src/submodules/cbor/CborCodec.ts +++ b/packages/core/src/submodules/cbor/CborCodec.ts @@ -193,7 +193,10 @@ export class CborShapeDeserializer extends SerdeContext implements ShapeDeserial } } else if (ns.isStructSchema()) { for (const [key, memberSchema] of ns.structIterator()) { - newObject[key] = this.readValue(memberSchema, value[key]); + const v = this.readValue(memberSchema, value[key]); + if (v != null) { + newObject[key] = v; + } } } return newObject;