Skip to content

Commit 90f3f8b

Browse files
authored
fix: use prototypeless objects for field-to-type mappings (#212)
Fixes: #211
1 parent f4c7aab commit 90f3f8b

File tree

3 files changed

+15
-11
lines changed

3 files changed

+15
-11
lines changed

src/schema-analyzer.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11

22
import Reservoir from 'reservoir';
3-
import type {
3+
import {
44
Document,
55
ObjectId,
66
MinKey,
@@ -310,7 +310,7 @@ function simplifiedSchema(fields: SchemaAnalysisFieldsMap): SimplifiedSchema {
310310
}
311311

312312
function finalizeDocumentFieldSchema(fieldMap: SchemaAnalysisFieldsMap): SimplifiedSchema {
313-
const fieldSchema: SimplifiedSchema = {};
313+
const fieldSchema: SimplifiedSchema = Object.create(null);
314314
Object.values(fieldMap).forEach((field: SchemaAnalysisField) => {
315315
const fieldTypes = finalizeSchemaFieldTypes(field.types);
316316

@@ -437,7 +437,7 @@ export class SchemaAnalyzer {
437437
options: SchemaParseOptions;
438438
documentsAnalyzed = 0;
439439
schemaAnalysisRoot: SchemaAnalysisRoot = {
440-
fields: {},
440+
fields: Object.create(null),
441441
count: 0
442442
};
443443

@@ -464,7 +464,7 @@ export class SchemaAnalyzer {
464464
this.semanticTypes = {
465465
...Object.entries(this.semanticTypes)
466466
.filter(([k]) => enabledTypes.includes(k.toLowerCase()))
467-
.reduce((p, [k, v]) => ({ ...p, [k]: v }), {})
467+
.reduce((p, [k, v]) => ({ ...p, [k]: v }), Object.create(null))
468468
};
469469

470470
Object.entries(this.options.semanticTypes)
@@ -512,13 +512,13 @@ export class SchemaAnalyzer {
512512

513513
if (isArrayType(type)) {
514514
// Recurse into arrays by calling `addToType` for each element.
515-
type.types = type.types ?? {};
515+
type.types = type.types ?? Object.create(null);
516516
type.lengths = type.lengths ?? [];
517517
type.lengths.push((value as BSONValue[]).length);
518518
(value as BSONValue[]).forEach((v: BSONValue) => addToType(path, v, type.types));
519519
} else if (isDocumentType(type)) {
520520
// Recurse into nested documents by calling `addToField` for all sub-fields.
521-
type.fields = type.fields ?? {};
521+
type.fields = type.fields ?? Object.create(null);
522522
Object.entries(value as Document).forEach(
523523
([fieldName, v]) => addToField(fieldName, [...path, fieldName], v, type.fields)
524524
);
@@ -545,7 +545,7 @@ export class SchemaAnalyzer {
545545
name: fieldName,
546546
path: path,
547547
count: 0,
548-
types: {}
548+
types: Object.create(null)
549549
};
550550
}
551551
const field = schema[fieldName];

test/basic.test.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@ describe('using only basic fields', function() {
1919
last_address_longitude: null,
2020
created_at: new Date(),
2121
length: 29,
22-
'name[]': 'Annabeth Frankie'
22+
'name[]': 'Annabeth Frankie',
23+
toString: 42
2324
}
2425
];
2526

@@ -38,7 +39,8 @@ describe('using only basic fields', function() {
3839
'name',
3940
'stats_friends',
4041
'twitter_username',
41-
'name[]'
42+
'name[]',
43+
'toString'
4244
];
4345
assert.deepEqual(users.fields.map(v => v.name).sort(), fieldNames.sort());
4446
});
@@ -59,5 +61,6 @@ describe('using only basic fields', function() {
5961
assert.equal(users.fields.find(v => v.name === 'name')?.type, 'String');
6062
assert.equal(users.fields.find(v => v.name === 'stats_friends')?.type, 'Number');
6163
assert.equal(users.fields.find(v => v.name === 'twitter_username')?.type, 'String');
64+
assert.equal(users.fields.find(v => v.name === 'toString')?.type, 'Number');
6265
});
6366
});

test/mixed-type-nested.test.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,11 @@ describe('mixed types nested', function() {
3030
{
3131
_id: 5,
3232
address: {
33-
valid: true
33+
valid: true,
34+
toString: { value: false }
3435
}
3536
}
36-
];
37+
] as const;
3738

3839
let schema: Schema;
3940
let valid: SchemaField | undefined;

0 commit comments

Comments
 (0)