diff --git a/src/parser/serializer.ts b/src/parser/serializer.ts index e76402aa..f20ddc36 100644 --- a/src/parser/serializer.ts +++ b/src/parser/serializer.ts @@ -837,6 +837,8 @@ export function serializeInto( ); } else if (value['_bsontype'] === 'Binary') { index = serializeBinary(buffer, key, value, index, true); + } else if (value['_bsontype'] === 'UUID') { + index = serializeBinary(buffer, key, value.toBinary(), index); } else if (value['_bsontype'] === 'Symbol') { index = serializeSymbol(buffer, key, value, index, true); } else if (value['_bsontype'] === 'DBRef') { @@ -938,6 +940,8 @@ export function serializeInto( index = serializeFunction(buffer, key, value, index, checkKeys, depth, serializeFunctions); } else if (value['_bsontype'] === 'Binary') { index = serializeBinary(buffer, key, value, index); + } else if (value['_bsontype'] === 'UUID') { + index = serializeBinary(buffer, key, value.toBinary(), index); } else if (value['_bsontype'] === 'Symbol') { index = serializeSymbol(buffer, key, value, index); } else if (value['_bsontype'] === 'DBRef') { @@ -1043,6 +1047,8 @@ export function serializeInto( index = serializeFunction(buffer, key, value, index, checkKeys, depth, serializeFunctions); } else if (value['_bsontype'] === 'Binary') { index = serializeBinary(buffer, key, value, index); + } else if (value['_bsontype'] === 'UUID') { + index = serializeBinary(buffer, key, value.toBinary(), index); } else if (value['_bsontype'] === 'Symbol') { index = serializeSymbol(buffer, key, value, index); } else if (value['_bsontype'] === 'DBRef') { diff --git a/test/node/uuid_tests.js b/test/node/uuid_tests.js index 0ff69b17..f48360d8 100644 --- a/test/node/uuid_tests.js +++ b/test/node/uuid_tests.js @@ -6,6 +6,8 @@ const { inspect } = require('util'); const { validate: uuidStringValidate, version: uuidStringVersion } = require('uuid'); const BSON = require('../register-bson'); const BSONTypeError = BSON.BSONTypeError; +const BSON_DATA_BINARY = BSON.BSON_DATA_BINARY; +const BSON_BINARY_SUBTYPE_UUID_NEW = BSON.BSON_BINARY_SUBTYPE_UUID_NEW; // Test values const UPPERCASE_DASH_SEPARATED_UUID_STRING = 'AAAAAAAA-AAAA-4AAA-AAAA-AAAAAAAAAAAA'; @@ -162,4 +164,31 @@ describe('UUID', () => { const uuid = new UUID(UPPERCASE_DASH_SEPARATED_UUID_STRING); expect(inspect(uuid)).to.equal(`new UUID("${LOWERCASE_DASH_SEPARATED_UUID_STRING}")`); }); + + describe('serialize', () => { + it('should have a valid UUID _bsontype with Object input without error', () => { + const output = BSON.serialize({ uuid: new BSON.UUID() }); + expect(output[4]).to.equal(BSON_DATA_BINARY); + expect(output[14]).to.equal(BSON_BINARY_SUBTYPE_UUID_NEW); + }); + + it('should have a valid UUID _bsontype with Map input without error', () => { + const output = BSON.serialize(new Map([['uuid', new BSON.UUID()]])); + expect(output[4]).to.equal(BSON_DATA_BINARY); + expect(output[14]).to.equal(BSON_BINARY_SUBTYPE_UUID_NEW); + }); + + it('should have as a valid UUID _bsontype with Array input without error', () => { + const output = BSON.serialize({ a: [new BSON.UUID()] }); + expect(output[11]).to.equal(BSON_DATA_BINARY); + expect(output[18]).to.equal(BSON_BINARY_SUBTYPE_UUID_NEW); + }); + + it('should serialize BSON.UUID() input the same as BSON.UUID().toBinary()', () => { + const exampleUUID = new BSON.UUID(); + const toBinarySerialization = BSON.serialize({ uuid: exampleUUID.toBinary() }); + const plainUUIDSerialization = BSON.serialize({ uuid: exampleUUID }); + expect(plainUUIDSerialization).to.deep.equal(toBinarySerialization); + }); + }); });