hadron-type-checker 7.4.27 → 7.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -1,3 +1,2 @@
1
- export { default } from './type-checker';
2
- export type { TypeCastMap, TypeCastTypes } from './type-checker';
1
+ export { default, UUID_REGEX, uuidHexToString, reverseJavaUUIDBytes, reverseCSharpUUIDBytes, convertBinaryUUID, type BSONTypeTag, getBsonType, type TypeCastMap, type TypeCastTypes, } from './type-checker';
3
2
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,EACP,UAAU,EACV,eAAe,EACf,oBAAoB,EACpB,sBAAsB,EACtB,iBAAiB,EACjB,KAAK,WAAW,EAChB,WAAW,EACX,KAAK,WAAW,EAChB,KAAK,aAAa,GACnB,MAAM,gBAAgB,CAAC"}
package/dist/index.js CHANGED
@@ -3,7 +3,13 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.default = void 0;
6
+ exports.getBsonType = exports.convertBinaryUUID = exports.reverseCSharpUUIDBytes = exports.reverseJavaUUIDBytes = exports.uuidHexToString = exports.UUID_REGEX = exports.default = void 0;
7
7
  var type_checker_1 = require("./type-checker");
8
8
  Object.defineProperty(exports, "default", { enumerable: true, get: function () { return __importDefault(type_checker_1).default; } });
9
+ Object.defineProperty(exports, "UUID_REGEX", { enumerable: true, get: function () { return type_checker_1.UUID_REGEX; } });
10
+ Object.defineProperty(exports, "uuidHexToString", { enumerable: true, get: function () { return type_checker_1.uuidHexToString; } });
11
+ Object.defineProperty(exports, "reverseJavaUUIDBytes", { enumerable: true, get: function () { return type_checker_1.reverseJavaUUIDBytes; } });
12
+ Object.defineProperty(exports, "reverseCSharpUUIDBytes", { enumerable: true, get: function () { return type_checker_1.reverseCSharpUUIDBytes; } });
13
+ Object.defineProperty(exports, "convertBinaryUUID", { enumerable: true, get: function () { return type_checker_1.convertBinaryUUID; } });
14
+ Object.defineProperty(exports, "getBsonType", { enumerable: true, get: function () { return type_checker_1.getBsonType; } });
9
15
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;AAAA,+CAAyC;AAAhC,wHAAA,OAAO,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;AAAA,+CAWwB;AAVtB,wHAAA,OAAO,OAAA;AACP,0GAAA,UAAU,OAAA;AACV,+GAAA,eAAe,OAAA;AACf,oHAAA,oBAAoB,OAAA;AACpB,sHAAA,sBAAsB,OAAA;AACtB,iHAAA,iBAAiB,OAAA;AAEjB,2GAAA,WAAW,OAAA"}
@@ -1,4 +1,6 @@
1
- import { ObjectId, MinKey, MaxKey, Long, Double, Int32, Decimal128, Binary, BSONRegExp, Code, BSONSymbol, Timestamp } from 'bson';
1
+ import { ObjectId, MinKey, MaxKey, Long, Double, Int32, Decimal128, Binary, BSONRegExp, Code, BSONSymbol, Timestamp, bsonType, type BSONTypeTag } from 'bson';
2
+ export { bsonType, type BSONTypeTag };
3
+ export declare function getBsonType(value: any): BSONTypeTag | undefined;
2
4
  export type TypeCastMap = {
3
5
  Array: unknown[];
4
6
  Binary: Binary;
@@ -19,8 +21,50 @@ export type TypeCastMap = {
19
21
  BSONSymbol: BSONSymbol;
20
22
  Timestamp: Timestamp;
21
23
  Undefined: undefined;
24
+ UUID: Binary;
25
+ LegacyJavaUUID: Binary;
26
+ LegacyCSharpUUID: Binary;
27
+ LegacyPythonUUID: Binary;
22
28
  };
23
29
  export type TypeCastTypes = keyof TypeCastMap;
30
+ /**
31
+ * UUID regex pattern for validation (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx).
32
+ */
33
+ export declare const UUID_REGEX: RegExp;
34
+ /**
35
+ * Converts a hex string (without hyphens) to UUID format with hyphens.
36
+ */
37
+ export declare const uuidHexToString: (hex: string) => string;
38
+ /**
39
+ * Reverses byte order for Java legacy UUID format (both MSB and LSB).
40
+ * Takes a 32-char hex string and returns a 32-char hex string with reversed byte order.
41
+ *
42
+ * This function is an involution (self-inverse), meaning applying it twice returns
43
+ * the original value. It can be used both to:
44
+ * - Convert from Java legacy binary format to standard UUID hex (for display)
45
+ * - Convert from standard UUID hex to Java legacy binary format (for storage)
46
+ */
47
+ export declare const reverseJavaUUIDBytes: (hex: string) => string;
48
+ /**
49
+ * Reverses byte order for C# legacy UUID format (first 3 groups only).
50
+ * Takes a 32-char hex string and returns a 32-char hex string with reversed byte order.
51
+ *
52
+ * This function is an involution (self-inverse), meaning applying it twice returns
53
+ * the original value. It can be used both to:
54
+ * - Convert from C# legacy binary format to standard UUID hex (for display)
55
+ * - Convert from standard UUID hex to C# legacy binary format (for storage)
56
+ */
57
+ export declare const reverseCSharpUUIDBytes: (hex: string) => string;
58
+ /**
59
+ * Converts a Binary UUID from one encoding to another.
60
+ * This is used when changing between UUID types in the document editor.
61
+ *
62
+ * @param binary - The source Binary UUID
63
+ * @param sourceType - The source UUID type (e.g., 'LegacyCSharpUUID')
64
+ * @param targetType - The target UUID type (e.g., 'LegacyJavaUUID')
65
+ * @returns A new Binary with the same UUID value but different encoding
66
+ */
67
+ export declare const convertBinaryUUID: (binary: Binary, sourceType: string, targetType: string) => Binary;
24
68
  /**
25
69
  * Checks the types of objects and returns them as readable strings.
26
70
  */
@@ -31,8 +75,11 @@ declare class TypeChecker {
31
75
  cast<O = unknown, T extends string = string>(object: O, type: T): T extends TypeCastTypes ? TypeCastMap[T] : O;
32
76
  /**
33
77
  * Get the type for the object.
78
+ * @param legacyUUIDEncoding - Optional encoding for legacy UUID (subtype 3).
79
+ * If provided and the object is a Binary with subtype 3, returns the specific legacy UUID type.
80
+ * Valid values: 'LegacyJavaUUID', 'LegacyCSharpUUID', 'LegacyPythonUUID'
34
81
  */
35
- type(object: unknown): TypeCastTypes;
82
+ type(object: unknown, legacyUUIDEncoding?: 'LegacyJavaUUID' | 'LegacyCSharpUUID' | 'LegacyPythonUUID'): TypeCastTypes;
36
83
  /**
37
84
  * Get a list of types the object can be cast to.
38
85
  */
@@ -1 +1 @@
1
- {"version":3,"file":"type-checker.d.ts","sourceRoot":"","sources":["../src/type-checker.ts"],"names":[],"mappings":"AAYA,OAAO,EACL,QAAQ,EACR,MAAM,EACN,MAAM,EACN,IAAI,EACJ,MAAM,EACN,KAAK,EACL,UAAU,EACV,MAAM,EACN,UAAU,EACV,IAAI,EACJ,UAAU,EACV,SAAS,EACV,MAAM,MAAM,CAAC;AAEd,MAAM,MAAM,WAAW,GAAG;IACxB,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,IAAI,CAAC;IACX,IAAI,EAAE,IAAI,CAAC;IACX,UAAU,EAAE,UAAU,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,KAAK,CAAC;IACb,KAAK,EAAE,IAAI,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,IAAI,CAAC;IACX,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,QAAQ,EAAE,QAAQ,CAAC;IACnB,UAAU,EAAE,UAAU,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,UAAU,CAAC;IACvB,SAAS,EAAE,SAAS,CAAC;IACrB,SAAS,EAAE,SAAS,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG,MAAM,WAAW,CAAC;AAyS9C;;GAEG;AACH,cAAM,WAAW;IACf;;OAEG;IACH,IAAI,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,SAAS,MAAM,GAAG,MAAM,EACzC,MAAM,EAAE,CAAC,EACT,IAAI,EAAE,CAAC,GACN,CAAC,SAAS,aAAa,GAAG,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC;IAW/C;;OAEG;IACH,IAAI,CAAC,MAAM,EAAE,OAAO,GAAG,aAAa;IA4BpC;;OAEG;IACH,aAAa,CAAC,oBAAoB,UAAQ,GAAG,aAAa,EAAE;CAM7D;;AAED,wBAAiC"}
1
+ {"version":3,"file":"type-checker.d.ts","sourceRoot":"","sources":["../src/type-checker.ts"],"names":[],"mappings":"AAWA,OAAO,EACL,QAAQ,EACR,MAAM,EACN,MAAM,EACN,IAAI,EACJ,MAAM,EACN,KAAK,EACL,UAAU,EACV,MAAM,EACN,UAAU,EACV,IAAI,EACJ,UAAU,EACV,SAAS,EAET,QAAQ,EACR,KAAK,WAAW,EACjB,MAAM,MAAM,CAAC;AAEd,OAAO,EAAE,QAAQ,EAAE,KAAK,WAAW,EAAE,CAAC;AACtC,wBAAgB,WAAW,CAAC,KAAK,EAAE,GAAG,GAAG,WAAW,GAAG,SAAS,CAE/D;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,IAAI,CAAC;IACX,IAAI,EAAE,IAAI,CAAC;IACX,UAAU,EAAE,UAAU,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,KAAK,CAAC;IACb,KAAK,EAAE,IAAI,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,IAAI,CAAC;IACX,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,QAAQ,EAAE,QAAQ,CAAC;IACnB,UAAU,EAAE,UAAU,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,UAAU,CAAC;IACvB,SAAS,EAAE,SAAS,CAAC;IACrB,SAAS,EAAE,SAAS,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG,MAAM,WAAW,CAAC;AAsM9C;;GAEG;AACH,eAAO,MAAM,UAAU,QAC4C,CAAC;AAoBpE;;GAEG;AACH,eAAO,MAAM,eAAe,GAAI,KAAK,MAAM,KAAG,MAY7C,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,oBAAoB,GAAI,KAAK,MAAM,KAAG,MAsBlD,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,sBAAsB,GAAI,KAAK,MAAM,KAAG,MAUpD,CAAC;AA0EF;;;;;;;;GAQG;AACH,eAAO,MAAM,iBAAiB,GAC5B,QAAQ,MAAM,EACd,YAAY,MAAM,EAClB,YAAY,MAAM,KACjB,MA4BF,CAAC;AAoKF;;GAEG;AACH,cAAM,WAAW;IACf;;OAEG;IACH,IAAI,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,SAAS,MAAM,GAAG,MAAM,EACzC,MAAM,EAAE,CAAC,EACT,IAAI,EAAE,CAAC,GACN,CAAC,SAAS,aAAa,GAAG,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC;IAW/C;;;;;OAKG;IACH,IAAI,CACF,MAAM,EAAE,OAAO,EACf,kBAAkB,CAAC,EACf,gBAAgB,GAChB,kBAAkB,GAClB,kBAAkB,GACrB,aAAa;IAoChB;;OAEG;IACH,aAAa,CAAC,oBAAoB,UAAQ,GAAG,aAAa,EAAE;CAM7D;;AAED,wBAAiC"}
@@ -1,7 +1,13 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.convertBinaryUUID = exports.reverseCSharpUUIDBytes = exports.reverseJavaUUIDBytes = exports.uuidHexToString = exports.UUID_REGEX = exports.bsonType = void 0;
4
+ exports.getBsonType = getBsonType;
3
5
  const lodash_1 = require("lodash");
4
6
  const bson_1 = require("bson");
7
+ Object.defineProperty(exports, "bsonType", { enumerable: true, get: function () { return bson_1.bsonType; } });
8
+ function getBsonType(value) {
9
+ return value?.[bson_1.bsonType];
10
+ }
5
11
  /**
6
12
  * The object string.
7
13
  */
@@ -28,12 +34,6 @@ const DOUBLE = 'Double';
28
34
  const DECIMAL_128 = 'Decimal128';
29
35
  const OBJECT_TYPE = '[object Object]';
30
36
  const EMPTY = '';
31
- const OBJECT_ID = 'ObjectID';
32
- const SYMBOL = 'Symbol';
33
- /**
34
- * The bson type field.
35
- */
36
- const BSON_TYPE = '_bsontype';
37
37
  /**
38
38
  * The match regex.
39
39
  */
@@ -148,11 +148,10 @@ const toDecimal128 = (object) => {
148
148
  /*
149
149
  If converting a BSON Object, extract the value before converting to a string.
150
150
  */
151
- if ((0, lodash_1.hasIn)(object, BSON_TYPE) &&
152
- NUMBER_TYPES.includes(object._bsontype)) {
151
+ if (NUMBER_TYPES.includes(getBsonType(object))) {
153
152
  const bsonObj = object;
154
153
  object =
155
- bsonObj._bsontype === LONG ? bsonObj.toString() : bsonObj.valueOf();
154
+ getBsonType(object) === LONG ? bsonObj.toString() : bsonObj.valueOf();
156
155
  }
157
156
  return bson_1.Decimal128.fromString((0, lodash_1.toString)(object));
158
157
  };
@@ -168,6 +167,244 @@ const toBinary = (object) => {
168
167
  : Buffer.from((0, lodash_1.toString)(object), 'utf8');
169
168
  return new bson_1.Binary(buffer, bson_1.Binary.SUBTYPE_DEFAULT);
170
169
  };
170
+ /**
171
+ * UUID regex pattern for validation (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx).
172
+ */
173
+ exports.UUID_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
174
+ /**
175
+ * Validates a UUID string format.
176
+ */
177
+ const validateUUIDString = (uuidString) => {
178
+ if (!exports.UUID_REGEX.test(uuidString)) {
179
+ throw new Error(`'${uuidString}' is not a valid UUID string (expected format: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)`);
180
+ }
181
+ };
182
+ /**
183
+ * Converts a UUID string (with hyphens) to a hex string (without hyphens).
184
+ */
185
+ const uuidStringToHex = (uuidString) => {
186
+ return uuidString.replace(/-/g, '');
187
+ };
188
+ /**
189
+ * Converts a hex string (without hyphens) to UUID format with hyphens.
190
+ */
191
+ const uuidHexToString = (hex) => {
192
+ return (hex.substring(0, 8) +
193
+ '-' +
194
+ hex.substring(8, 12) +
195
+ '-' +
196
+ hex.substring(12, 16) +
197
+ '-' +
198
+ hex.substring(16, 20) +
199
+ '-' +
200
+ hex.substring(20, 32));
201
+ };
202
+ exports.uuidHexToString = uuidHexToString;
203
+ /**
204
+ * Reverses byte order for Java legacy UUID format (both MSB and LSB).
205
+ * Takes a 32-char hex string and returns a 32-char hex string with reversed byte order.
206
+ *
207
+ * This function is an involution (self-inverse), meaning applying it twice returns
208
+ * the original value. It can be used both to:
209
+ * - Convert from Java legacy binary format to standard UUID hex (for display)
210
+ * - Convert from standard UUID hex to Java legacy binary format (for storage)
211
+ */
212
+ const reverseJavaUUIDBytes = (hex) => {
213
+ let msb = hex.substring(0, 16);
214
+ let lsb = hex.substring(16, 32);
215
+ msb =
216
+ msb.substring(14, 16) +
217
+ msb.substring(12, 14) +
218
+ msb.substring(10, 12) +
219
+ msb.substring(8, 10) +
220
+ msb.substring(6, 8) +
221
+ msb.substring(4, 6) +
222
+ msb.substring(2, 4) +
223
+ msb.substring(0, 2);
224
+ lsb =
225
+ lsb.substring(14, 16) +
226
+ lsb.substring(12, 14) +
227
+ lsb.substring(10, 12) +
228
+ lsb.substring(8, 10) +
229
+ lsb.substring(6, 8) +
230
+ lsb.substring(4, 6) +
231
+ lsb.substring(2, 4) +
232
+ lsb.substring(0, 2);
233
+ return msb + lsb;
234
+ };
235
+ exports.reverseJavaUUIDBytes = reverseJavaUUIDBytes;
236
+ /**
237
+ * Reverses byte order for C# legacy UUID format (first 3 groups only).
238
+ * Takes a 32-char hex string and returns a 32-char hex string with reversed byte order.
239
+ *
240
+ * This function is an involution (self-inverse), meaning applying it twice returns
241
+ * the original value. It can be used both to:
242
+ * - Convert from C# legacy binary format to standard UUID hex (for display)
243
+ * - Convert from standard UUID hex to C# legacy binary format (for storage)
244
+ */
245
+ const reverseCSharpUUIDBytes = (hex) => {
246
+ const a = hex.substring(6, 8) +
247
+ hex.substring(4, 6) +
248
+ hex.substring(2, 4) +
249
+ hex.substring(0, 2);
250
+ const b = hex.substring(10, 12) + hex.substring(8, 10);
251
+ const c = hex.substring(14, 16) + hex.substring(12, 14);
252
+ const d = hex.substring(16, 32);
253
+ return a + b + c + d;
254
+ };
255
+ exports.reverseCSharpUUIDBytes = reverseCSharpUUIDBytes;
256
+ /**
257
+ * Generates a random UUID string in the format xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.
258
+ */
259
+ const generateRandomUUID = () => {
260
+ return new bson_1.UUID().toString();
261
+ };
262
+ /**
263
+ * Converts a Binary UUID to a standard UUID string, accounting for its encoding.
264
+ * For subtype 4 (standard UUID), returns the hex directly as UUID format.
265
+ * For subtype 3 (legacy UUID), we need to know the original encoding to reverse the bytes.
266
+ * If sourceEncoding is not provided, assumes Python encoding (no reversal).
267
+ */
268
+ const binaryToUUIDStringWithEncoding = (binary, sourceEncoding) => {
269
+ const hex = binary.toString('hex');
270
+ // For standard UUID (subtype 4), no byte reversal needed
271
+ if (binary.sub_type === bson_1.Binary.SUBTYPE_UUID) {
272
+ return (0, exports.uuidHexToString)(hex);
273
+ }
274
+ // For legacy UUID (subtype 3), reverse bytes based on source encoding
275
+ switch (sourceEncoding) {
276
+ case 'Java':
277
+ // Reverse Java encoding to get standard UUID
278
+ return (0, exports.uuidHexToString)((0, exports.reverseJavaUUIDBytes)(hex));
279
+ case 'CSharp':
280
+ // Reverse C# encoding to get standard UUID
281
+ return (0, exports.uuidHexToString)((0, exports.reverseCSharpUUIDBytes)(hex));
282
+ case 'Python':
283
+ default:
284
+ // Python uses standard byte order, no reversal needed
285
+ return (0, exports.uuidHexToString)(hex);
286
+ }
287
+ };
288
+ /**
289
+ * Gets the UUID string from an object, handling Binary inputs specially.
290
+ * For Binary inputs, extracts and converts to UUID string format.
291
+ * For string inputs, returns as-is after trimming.
292
+ */
293
+ const getUUIDStringFromObject = (object, sourceEncoding) => {
294
+ if (object instanceof bson_1.Binary) {
295
+ if (object.sub_type === bson_1.Binary.SUBTYPE_UUID ||
296
+ object.sub_type === bson_1.Binary.SUBTYPE_UUID_OLD) {
297
+ return binaryToUUIDStringWithEncoding(object, sourceEncoding);
298
+ }
299
+ }
300
+ return (0, lodash_1.toString)(object).trim();
301
+ };
302
+ /**
303
+ * Mapping from UUID type names to encoding names.
304
+ */
305
+ const UUID_TYPE_TO_ENCODING = Object.assign(Object.create(null), {
306
+ UUID: undefined,
307
+ LegacyJavaUUID: 'Java',
308
+ LegacyCSharpUUID: 'CSharp',
309
+ LegacyPythonUUID: 'Python',
310
+ });
311
+ /**
312
+ * Converts a Binary UUID from one encoding to another.
313
+ * This is used when changing between UUID types in the document editor.
314
+ *
315
+ * @param binary - The source Binary UUID
316
+ * @param sourceType - The source UUID type (e.g., 'LegacyCSharpUUID')
317
+ * @param targetType - The target UUID type (e.g., 'LegacyJavaUUID')
318
+ * @returns A new Binary with the same UUID value but different encoding
319
+ */
320
+ const convertBinaryUUID = (binary, sourceType, targetType) => {
321
+ // Get the source encoding to decode the binary
322
+ const sourceEncoding = UUID_TYPE_TO_ENCODING[sourceType];
323
+ // Convert binary to standard UUID string using source encoding
324
+ const uuidString = binaryToUUIDStringWithEncoding(binary, sourceEncoding);
325
+ // Convert UUID string to binary using target encoding
326
+ const hex = uuidStringToHex(uuidString);
327
+ switch (targetType) {
328
+ case 'UUID':
329
+ return bson_1.Binary.createFromHexString(hex, bson_1.Binary.SUBTYPE_UUID);
330
+ case 'LegacyJavaUUID':
331
+ return bson_1.Binary.createFromHexString((0, exports.reverseJavaUUIDBytes)(hex), bson_1.Binary.SUBTYPE_UUID_OLD);
332
+ case 'LegacyCSharpUUID':
333
+ return bson_1.Binary.createFromHexString((0, exports.reverseCSharpUUIDBytes)(hex), bson_1.Binary.SUBTYPE_UUID_OLD);
334
+ case 'LegacyPythonUUID':
335
+ return bson_1.Binary.createFromHexString(hex, bson_1.Binary.SUBTYPE_UUID_OLD);
336
+ default:
337
+ throw new Error(`Unknown UUID type: ${targetType}`);
338
+ }
339
+ };
340
+ exports.convertBinaryUUID = convertBinaryUUID;
341
+ /**
342
+ * Converts to UUID (Binary subtype 4).
343
+ * If the input is empty, generates a random UUID.
344
+ * If the input is a Binary, extracts the UUID from it.
345
+ */
346
+ const toUUID = (object) => {
347
+ const uuidString = getUUIDStringFromObject(object);
348
+ if (!uuidString) {
349
+ return new bson_1.UUID().toBinary();
350
+ }
351
+ validateUUIDString(uuidString);
352
+ const hex = uuidStringToHex(uuidString);
353
+ return bson_1.Binary.createFromHexString(hex, bson_1.Binary.SUBTYPE_UUID);
354
+ };
355
+ /**
356
+ * Converts to Legacy Java UUID (Binary subtype 3).
357
+ * Java legacy format reverses byte order for both MSB and LSB.
358
+ * If the input is empty, generates a random UUID.
359
+ * If the input is a Binary, extracts the UUID from it.
360
+ */
361
+ const toLegacyJavaUUID = (object) => {
362
+ let uuidString = getUUIDStringFromObject(object, 'Java');
363
+ if (!uuidString) {
364
+ uuidString = generateRandomUUID();
365
+ }
366
+ else {
367
+ validateUUIDString(uuidString);
368
+ }
369
+ const hex = uuidStringToHex(uuidString);
370
+ const reversedHex = (0, exports.reverseJavaUUIDBytes)(hex);
371
+ return bson_1.Binary.createFromHexString(reversedHex, bson_1.Binary.SUBTYPE_UUID_OLD);
372
+ };
373
+ /**
374
+ * Converts to Legacy C# UUID (Binary subtype 3).
375
+ * C# legacy format reverses byte order for first 3 groups only.
376
+ * If the input is empty, generates a random UUID.
377
+ * If the input is a Binary, extracts the UUID from it.
378
+ */
379
+ const toLegacyCSharpUUID = (object) => {
380
+ let uuidString = getUUIDStringFromObject(object, 'CSharp');
381
+ if (!uuidString) {
382
+ uuidString = generateRandomUUID();
383
+ }
384
+ else {
385
+ validateUUIDString(uuidString);
386
+ }
387
+ const hex = uuidStringToHex(uuidString);
388
+ const reversedHex = (0, exports.reverseCSharpUUIDBytes)(hex);
389
+ return bson_1.Binary.createFromHexString(reversedHex, bson_1.Binary.SUBTYPE_UUID_OLD);
390
+ };
391
+ /**
392
+ * Converts to Legacy Python UUID (Binary subtype 3).
393
+ * Python legacy format uses direct byte order (no reversal).
394
+ * If the input is empty, generates a random UUID.
395
+ * If the input is a Binary, extracts the UUID from it.
396
+ */
397
+ const toLegacyPythonUUID = (object) => {
398
+ let uuidString = getUUIDStringFromObject(object, 'Python');
399
+ if (!uuidString) {
400
+ uuidString = generateRandomUUID();
401
+ }
402
+ else {
403
+ validateUUIDString(uuidString);
404
+ }
405
+ const hex = uuidStringToHex(uuidString);
406
+ return bson_1.Binary.createFromHexString(hex, bson_1.Binary.SUBTYPE_UUID_OLD);
407
+ };
171
408
  const toRegex = (object) => {
172
409
  return new bson_1.BSONRegExp((0, lodash_1.toString)(object));
173
410
  };
@@ -204,6 +441,10 @@ const CASTERS = {
204
441
  BSONSymbol: toSymbol,
205
442
  Timestamp: toTimestamp,
206
443
  Undefined: toUndefined,
444
+ UUID: toUUID,
445
+ LegacyJavaUUID: toLegacyJavaUUID,
446
+ LegacyCSharpUUID: toLegacyCSharpUUID,
447
+ LegacyPythonUUID: toLegacyPythonUUID,
207
448
  };
208
449
  /**
209
450
  * An array of all bson types.
@@ -264,20 +505,29 @@ class TypeChecker {
264
505
  }
265
506
  /**
266
507
  * Get the type for the object.
508
+ * @param legacyUUIDEncoding - Optional encoding for legacy UUID (subtype 3).
509
+ * If provided and the object is a Binary with subtype 3, returns the specific legacy UUID type.
510
+ * Valid values: 'LegacyJavaUUID', 'LegacyCSharpUUID', 'LegacyPythonUUID'
267
511
  */
268
- type(object) {
269
- if ((0, lodash_1.hasIn)(object, BSON_TYPE)) {
270
- const bsonObj = object;
271
- if (bsonObj._bsontype === LONG) {
512
+ type(object, legacyUUIDEncoding) {
513
+ const bsonType = getBsonType(object);
514
+ if (bsonType) {
515
+ if (bsonType === LONG) {
272
516
  return INT_64;
273
517
  }
274
- if (bsonObj._bsontype === OBJECT_ID) {
275
- return 'ObjectId';
276
- }
277
- if (bsonObj._bsontype === SYMBOL) {
278
- return 'BSONSymbol';
518
+ // Handle Binary UUID subtypes
519
+ if (bsonType === 'Binary') {
520
+ const binary = object;
521
+ if (binary.sub_type === bson_1.Binary.SUBTYPE_UUID) {
522
+ return 'UUID';
523
+ }
524
+ if (binary.sub_type === bson_1.Binary.SUBTYPE_UUID_OLD &&
525
+ binary.buffer.length === 16 &&
526
+ legacyUUIDEncoding) {
527
+ return legacyUUIDEncoding;
528
+ }
279
529
  }
280
- return bsonObj._bsontype;
530
+ return bsonType;
281
531
  }
282
532
  if ((0, lodash_1.isNumber)(object)) {
283
533
  return numberToBsonType(object);
@@ -1 +1 @@
1
- {"version":3,"file":"type-checker.js","sourceRoot":"","sources":["../src/type-checker.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"type-checker.js","sourceRoot":"","sources":["../src/type-checker.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -10,7 +10,7 @@
10
10
  "email": "compass@mongodb.com"
11
11
  },
12
12
  "homepage": "https://github.com/mongodb-js/compass",
13
- "version": "7.4.27",
13
+ "version": "7.5.0",
14
14
  "repository": {
15
15
  "type": "git",
16
16
  "url": "https://github.com/mongodb-js/compass.git"
@@ -46,14 +46,14 @@
46
46
  "reformat": "npm run eslint . -- --fix && npm run prettier -- --write ."
47
47
  },
48
48
  "dependencies": {
49
- "bson": "^6.10.4",
49
+ "bson": "^7.2.0",
50
50
  "lodash": "^4.17.21"
51
51
  },
52
52
  "devDependencies": {
53
- "@mongodb-js/eslint-config-compass": "^1.4.16",
53
+ "@mongodb-js/eslint-config-compass": "^1.4.17",
54
54
  "@mongodb-js/mocha-config-compass": "^1.7.5",
55
55
  "@mongodb-js/prettier-config-compass": "^1.2.9",
56
- "@mongodb-js/tsconfig-compass": "^1.2.13",
56
+ "@mongodb-js/tsconfig-compass": "^1.2.14",
57
57
  "@types/chai": "^4.2.21",
58
58
  "@types/mocha": "^9.0.0",
59
59
  "chai": "^4.2.0",
@@ -62,5 +62,5 @@
62
62
  "nyc": "^15.1.0",
63
63
  "typescript": "^5.9.3"
64
64
  },
65
- "gitHead": "2211ea4f5fa2c86601f60070e41f8705ee24ae54"
65
+ "gitHead": "3473b2aeed26412f25423caf7f1f7ca848665e34"
66
66
  }
package/src/index.ts CHANGED
@@ -1,2 +1,12 @@
1
- export { default } from './type-checker';
2
- export type { TypeCastMap, TypeCastTypes } from './type-checker';
1
+ export {
2
+ default,
3
+ UUID_REGEX,
4
+ uuidHexToString,
5
+ reverseJavaUUIDBytes,
6
+ reverseCSharpUUIDBytes,
7
+ convertBinaryUUID,
8
+ type BSONTypeTag,
9
+ getBsonType,
10
+ type TypeCastMap,
11
+ type TypeCastTypes,
12
+ } from './type-checker';
@@ -3,7 +3,6 @@ import {
3
3
  isArray,
4
4
  isString,
5
5
  isNumber,
6
- hasIn,
7
6
  keys,
8
7
  without,
9
8
  toNumber,
@@ -23,8 +22,16 @@ import {
23
22
  Code,
24
23
  BSONSymbol,
25
24
  Timestamp,
25
+ UUID,
26
+ bsonType,
27
+ type BSONTypeTag,
26
28
  } from 'bson';
27
29
 
30
+ export { bsonType, type BSONTypeTag };
31
+ export function getBsonType(value: any): BSONTypeTag | undefined {
32
+ return value?.[bsonType];
33
+ }
34
+
28
35
  export type TypeCastMap = {
29
36
  Array: unknown[];
30
37
  Binary: Binary;
@@ -45,6 +52,10 @@ export type TypeCastMap = {
45
52
  BSONSymbol: BSONSymbol;
46
53
  Timestamp: Timestamp;
47
54
  Undefined: undefined;
55
+ UUID: Binary;
56
+ LegacyJavaUUID: Binary;
57
+ LegacyCSharpUUID: Binary;
58
+ LegacyPythonUUID: Binary;
48
59
  };
49
60
 
50
61
  export type TypeCastTypes = keyof TypeCastMap;
@@ -79,13 +90,6 @@ const DOUBLE = 'Double';
79
90
  const DECIMAL_128 = 'Decimal128';
80
91
  const OBJECT_TYPE = '[object Object]';
81
92
  const EMPTY = '';
82
- const OBJECT_ID = 'ObjectID';
83
- const SYMBOL = 'Symbol';
84
-
85
- /**
86
- * The bson type field.
87
- */
88
- const BSON_TYPE = '_bsontype';
89
93
 
90
94
  /**
91
95
  * The match regex.
@@ -218,7 +222,6 @@ const toDouble = (object: unknown): Double => {
218
222
  };
219
223
 
220
224
  type BSONObject = {
221
- _bsontype: string;
222
225
  toString(): string;
223
226
  valueOf(): number | string;
224
227
  };
@@ -228,14 +231,13 @@ const toDecimal128 = (object: unknown): Decimal128 => {
228
231
  If converting a BSON Object, extract the value before converting to a string.
229
232
  */
230
233
  if (
231
- hasIn(object, BSON_TYPE) &&
232
- NUMBER_TYPES.includes(
233
- (object as BSONObject)._bsontype as (typeof NUMBER_TYPES)[number]
234
+ (NUMBER_TYPES as readonly (BSONTypeTag | undefined)[]).includes(
235
+ getBsonType(object)
234
236
  )
235
237
  ) {
236
238
  const bsonObj = object as BSONObject;
237
239
  object =
238
- bsonObj._bsontype === LONG ? bsonObj.toString() : bsonObj.valueOf();
240
+ getBsonType(object) === LONG ? bsonObj.toString() : bsonObj.valueOf();
239
241
  }
240
242
  return Decimal128.fromString(toString(object));
241
243
  };
@@ -254,6 +256,284 @@ const toBinary = (object: unknown): Binary => {
254
256
  return new Binary(buffer, Binary.SUBTYPE_DEFAULT);
255
257
  };
256
258
 
259
+ /**
260
+ * UUID regex pattern for validation (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx).
261
+ */
262
+ export const UUID_REGEX =
263
+ /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
264
+
265
+ /**
266
+ * Validates a UUID string format.
267
+ */
268
+ const validateUUIDString = (uuidString: string): void => {
269
+ if (!UUID_REGEX.test(uuidString)) {
270
+ throw new Error(
271
+ `'${uuidString}' is not a valid UUID string (expected format: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)`
272
+ );
273
+ }
274
+ };
275
+
276
+ /**
277
+ * Converts a UUID string (with hyphens) to a hex string (without hyphens).
278
+ */
279
+ const uuidStringToHex = (uuidString: string): string => {
280
+ return uuidString.replace(/-/g, '');
281
+ };
282
+
283
+ /**
284
+ * Converts a hex string (without hyphens) to UUID format with hyphens.
285
+ */
286
+ export const uuidHexToString = (hex: string): string => {
287
+ return (
288
+ hex.substring(0, 8) +
289
+ '-' +
290
+ hex.substring(8, 12) +
291
+ '-' +
292
+ hex.substring(12, 16) +
293
+ '-' +
294
+ hex.substring(16, 20) +
295
+ '-' +
296
+ hex.substring(20, 32)
297
+ );
298
+ };
299
+
300
+ /**
301
+ * Reverses byte order for Java legacy UUID format (both MSB and LSB).
302
+ * Takes a 32-char hex string and returns a 32-char hex string with reversed byte order.
303
+ *
304
+ * This function is an involution (self-inverse), meaning applying it twice returns
305
+ * the original value. It can be used both to:
306
+ * - Convert from Java legacy binary format to standard UUID hex (for display)
307
+ * - Convert from standard UUID hex to Java legacy binary format (for storage)
308
+ */
309
+ export const reverseJavaUUIDBytes = (hex: string): string => {
310
+ let msb = hex.substring(0, 16);
311
+ let lsb = hex.substring(16, 32);
312
+ msb =
313
+ msb.substring(14, 16) +
314
+ msb.substring(12, 14) +
315
+ msb.substring(10, 12) +
316
+ msb.substring(8, 10) +
317
+ msb.substring(6, 8) +
318
+ msb.substring(4, 6) +
319
+ msb.substring(2, 4) +
320
+ msb.substring(0, 2);
321
+ lsb =
322
+ lsb.substring(14, 16) +
323
+ lsb.substring(12, 14) +
324
+ lsb.substring(10, 12) +
325
+ lsb.substring(8, 10) +
326
+ lsb.substring(6, 8) +
327
+ lsb.substring(4, 6) +
328
+ lsb.substring(2, 4) +
329
+ lsb.substring(0, 2);
330
+ return msb + lsb;
331
+ };
332
+
333
+ /**
334
+ * Reverses byte order for C# legacy UUID format (first 3 groups only).
335
+ * Takes a 32-char hex string and returns a 32-char hex string with reversed byte order.
336
+ *
337
+ * This function is an involution (self-inverse), meaning applying it twice returns
338
+ * the original value. It can be used both to:
339
+ * - Convert from C# legacy binary format to standard UUID hex (for display)
340
+ * - Convert from standard UUID hex to C# legacy binary format (for storage)
341
+ */
342
+ export const reverseCSharpUUIDBytes = (hex: string): string => {
343
+ const a =
344
+ hex.substring(6, 8) +
345
+ hex.substring(4, 6) +
346
+ hex.substring(2, 4) +
347
+ hex.substring(0, 2);
348
+ const b = hex.substring(10, 12) + hex.substring(8, 10);
349
+ const c = hex.substring(14, 16) + hex.substring(12, 14);
350
+ const d = hex.substring(16, 32);
351
+ return a + b + c + d;
352
+ };
353
+
354
+ /**
355
+ * Generates a random UUID string in the format xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.
356
+ */
357
+ const generateRandomUUID = (): string => {
358
+ return new UUID().toString();
359
+ };
360
+
361
+ /**
362
+ * Converts a Binary UUID to a standard UUID string, accounting for its encoding.
363
+ * For subtype 4 (standard UUID), returns the hex directly as UUID format.
364
+ * For subtype 3 (legacy UUID), we need to know the original encoding to reverse the bytes.
365
+ * If sourceEncoding is not provided, assumes Python encoding (no reversal).
366
+ */
367
+ const binaryToUUIDStringWithEncoding = (
368
+ binary: Binary,
369
+ sourceEncoding?: 'Java' | 'CSharp' | 'Python'
370
+ ): string => {
371
+ const hex = binary.toString('hex');
372
+
373
+ // For standard UUID (subtype 4), no byte reversal needed
374
+ if (binary.sub_type === Binary.SUBTYPE_UUID) {
375
+ return uuidHexToString(hex);
376
+ }
377
+
378
+ // For legacy UUID (subtype 3), reverse bytes based on source encoding
379
+ switch (sourceEncoding) {
380
+ case 'Java':
381
+ // Reverse Java encoding to get standard UUID
382
+ return uuidHexToString(reverseJavaUUIDBytes(hex));
383
+ case 'CSharp':
384
+ // Reverse C# encoding to get standard UUID
385
+ return uuidHexToString(reverseCSharpUUIDBytes(hex));
386
+ case 'Python':
387
+ default:
388
+ // Python uses standard byte order, no reversal needed
389
+ return uuidHexToString(hex);
390
+ }
391
+ };
392
+
393
+ /**
394
+ * Gets the UUID string from an object, handling Binary inputs specially.
395
+ * For Binary inputs, extracts and converts to UUID string format.
396
+ * For string inputs, returns as-is after trimming.
397
+ */
398
+ const getUUIDStringFromObject = (
399
+ object: unknown,
400
+ sourceEncoding?: 'Java' | 'CSharp' | 'Python'
401
+ ): string => {
402
+ if (object instanceof Binary) {
403
+ if (
404
+ object.sub_type === Binary.SUBTYPE_UUID ||
405
+ object.sub_type === Binary.SUBTYPE_UUID_OLD
406
+ ) {
407
+ return binaryToUUIDStringWithEncoding(object, sourceEncoding);
408
+ }
409
+ }
410
+ return toString(object).trim();
411
+ };
412
+
413
+ /**
414
+ * Mapping from UUID type names to encoding names.
415
+ */
416
+ const UUID_TYPE_TO_ENCODING: Record<
417
+ string,
418
+ 'Java' | 'CSharp' | 'Python' | undefined
419
+ > = Object.assign(Object.create(null), {
420
+ UUID: undefined,
421
+ LegacyJavaUUID: 'Java',
422
+ LegacyCSharpUUID: 'CSharp',
423
+ LegacyPythonUUID: 'Python',
424
+ });
425
+
426
+ /**
427
+ * Converts a Binary UUID from one encoding to another.
428
+ * This is used when changing between UUID types in the document editor.
429
+ *
430
+ * @param binary - The source Binary UUID
431
+ * @param sourceType - The source UUID type (e.g., 'LegacyCSharpUUID')
432
+ * @param targetType - The target UUID type (e.g., 'LegacyJavaUUID')
433
+ * @returns A new Binary with the same UUID value but different encoding
434
+ */
435
+ export const convertBinaryUUID = (
436
+ binary: Binary,
437
+ sourceType: string,
438
+ targetType: string
439
+ ): Binary => {
440
+ // Get the source encoding to decode the binary
441
+ const sourceEncoding = UUID_TYPE_TO_ENCODING[sourceType];
442
+
443
+ // Convert binary to standard UUID string using source encoding
444
+ const uuidString = binaryToUUIDStringWithEncoding(binary, sourceEncoding);
445
+
446
+ // Convert UUID string to binary using target encoding
447
+ const hex = uuidStringToHex(uuidString);
448
+
449
+ switch (targetType) {
450
+ case 'UUID':
451
+ return Binary.createFromHexString(hex, Binary.SUBTYPE_UUID);
452
+ case 'LegacyJavaUUID':
453
+ return Binary.createFromHexString(
454
+ reverseJavaUUIDBytes(hex),
455
+ Binary.SUBTYPE_UUID_OLD
456
+ );
457
+ case 'LegacyCSharpUUID':
458
+ return Binary.createFromHexString(
459
+ reverseCSharpUUIDBytes(hex),
460
+ Binary.SUBTYPE_UUID_OLD
461
+ );
462
+ case 'LegacyPythonUUID':
463
+ return Binary.createFromHexString(hex, Binary.SUBTYPE_UUID_OLD);
464
+ default:
465
+ throw new Error(`Unknown UUID type: ${targetType}`);
466
+ }
467
+ };
468
+
469
+ /**
470
+ * Converts to UUID (Binary subtype 4).
471
+ * If the input is empty, generates a random UUID.
472
+ * If the input is a Binary, extracts the UUID from it.
473
+ */
474
+ const toUUID = (object: unknown): Binary => {
475
+ const uuidString = getUUIDStringFromObject(object);
476
+ if (!uuidString) {
477
+ return new UUID().toBinary();
478
+ }
479
+ validateUUIDString(uuidString);
480
+ const hex = uuidStringToHex(uuidString);
481
+ return Binary.createFromHexString(hex, Binary.SUBTYPE_UUID);
482
+ };
483
+
484
+ /**
485
+ * Converts to Legacy Java UUID (Binary subtype 3).
486
+ * Java legacy format reverses byte order for both MSB and LSB.
487
+ * If the input is empty, generates a random UUID.
488
+ * If the input is a Binary, extracts the UUID from it.
489
+ */
490
+ const toLegacyJavaUUID = (object: unknown): Binary => {
491
+ let uuidString = getUUIDStringFromObject(object, 'Java');
492
+ if (!uuidString) {
493
+ uuidString = generateRandomUUID();
494
+ } else {
495
+ validateUUIDString(uuidString);
496
+ }
497
+ const hex = uuidStringToHex(uuidString);
498
+ const reversedHex = reverseJavaUUIDBytes(hex);
499
+ return Binary.createFromHexString(reversedHex, Binary.SUBTYPE_UUID_OLD);
500
+ };
501
+
502
+ /**
503
+ * Converts to Legacy C# UUID (Binary subtype 3).
504
+ * C# legacy format reverses byte order for first 3 groups only.
505
+ * If the input is empty, generates a random UUID.
506
+ * If the input is a Binary, extracts the UUID from it.
507
+ */
508
+ const toLegacyCSharpUUID = (object: unknown): Binary => {
509
+ let uuidString = getUUIDStringFromObject(object, 'CSharp');
510
+ if (!uuidString) {
511
+ uuidString = generateRandomUUID();
512
+ } else {
513
+ validateUUIDString(uuidString);
514
+ }
515
+ const hex = uuidStringToHex(uuidString);
516
+ const reversedHex = reverseCSharpUUIDBytes(hex);
517
+ return Binary.createFromHexString(reversedHex, Binary.SUBTYPE_UUID_OLD);
518
+ };
519
+
520
+ /**
521
+ * Converts to Legacy Python UUID (Binary subtype 3).
522
+ * Python legacy format uses direct byte order (no reversal).
523
+ * If the input is empty, generates a random UUID.
524
+ * If the input is a Binary, extracts the UUID from it.
525
+ */
526
+ const toLegacyPythonUUID = (object: unknown): Binary => {
527
+ let uuidString = getUUIDStringFromObject(object, 'Python');
528
+ if (!uuidString) {
529
+ uuidString = generateRandomUUID();
530
+ } else {
531
+ validateUUIDString(uuidString);
532
+ }
533
+ const hex = uuidStringToHex(uuidString);
534
+ return Binary.createFromHexString(hex, Binary.SUBTYPE_UUID_OLD);
535
+ };
536
+
257
537
  const toRegex = (object: unknown): BSONRegExp => {
258
538
  return new BSONRegExp(toString(object));
259
539
  };
@@ -296,6 +576,10 @@ const CASTERS: {
296
576
  BSONSymbol: toSymbol,
297
577
  Timestamp: toTimestamp,
298
578
  Undefined: toUndefined,
579
+ UUID: toUUID,
580
+ LegacyJavaUUID: toLegacyJavaUUID,
581
+ LegacyCSharpUUID: toLegacyCSharpUUID,
582
+ LegacyPythonUUID: toLegacyPythonUUID,
299
583
  };
300
584
 
301
585
  /**
@@ -367,20 +651,37 @@ class TypeChecker {
367
651
 
368
652
  /**
369
653
  * Get the type for the object.
654
+ * @param legacyUUIDEncoding - Optional encoding for legacy UUID (subtype 3).
655
+ * If provided and the object is a Binary with subtype 3, returns the specific legacy UUID type.
656
+ * Valid values: 'LegacyJavaUUID', 'LegacyCSharpUUID', 'LegacyPythonUUID'
370
657
  */
371
- type(object: unknown): TypeCastTypes {
372
- if (hasIn(object, BSON_TYPE)) {
373
- const bsonObj = object as { _bsontype: string };
374
- if (bsonObj._bsontype === LONG) {
658
+ type(
659
+ object: unknown,
660
+ legacyUUIDEncoding?:
661
+ | 'LegacyJavaUUID'
662
+ | 'LegacyCSharpUUID'
663
+ | 'LegacyPythonUUID'
664
+ ): TypeCastTypes {
665
+ const bsonType = getBsonType(object);
666
+ if (bsonType) {
667
+ if (bsonType === LONG) {
375
668
  return INT_64;
376
669
  }
377
- if (bsonObj._bsontype === OBJECT_ID) {
378
- return 'ObjectId';
379
- }
380
- if (bsonObj._bsontype === SYMBOL) {
381
- return 'BSONSymbol';
670
+ // Handle Binary UUID subtypes
671
+ if (bsonType === 'Binary') {
672
+ const binary = object as Binary;
673
+ if (binary.sub_type === Binary.SUBTYPE_UUID) {
674
+ return 'UUID';
675
+ }
676
+ if (
677
+ binary.sub_type === Binary.SUBTYPE_UUID_OLD &&
678
+ binary.buffer.length === 16 &&
679
+ legacyUUIDEncoding
680
+ ) {
681
+ return legacyUUIDEncoding;
682
+ }
382
683
  }
383
- return bsonObj._bsontype as TypeCastTypes;
684
+ return bsonType as TypeCastTypes;
384
685
  }
385
686
  if (isNumber(object)) {
386
687
  return numberToBsonType(object);