@deepkit/bson
Version:
Deepkit BSON parser
136 lines • 5.08 kB
JavaScript
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
var __param = (this && this.__param) || function (paramIndex, decorator) {
return function (target, key) { decorator(target, key, paramIndex); }
};
import { expect, test } from '@jest/globals';
import 'reflect-metadata';
import bson from 'bson';
import { parseObject, ParserV2 } from '../src/bson-parser';
import { getClassSchema, t } from '@deepkit/type';
import { getBSONDecoder } from '../src/bson-jit-parser';
import { getBSONSerializer } from '../src/bson-serialize';
import { findValueInObject } from '../src/continuation';
const { deserialize, serialize } = bson;
test('basic', () => {
const obj = {
id: 123,
name: 'Peter 1',
tags: ['a', 'b', 'c'],
priority: 0
};
const bson = serialize(obj);
const items = parseObject(new ParserV2(bson));
expect(items).toEqual(obj);
expect(findValueInObject(new ParserV2(bson), (elementType, name) => {
return name === 'id';
})).toBe(123);
expect(findValueInObject(new ParserV2(bson), (elementType, name) => {
return elementType === 16 /* INT */;
})).toBe(123);
expect(findValueInObject(new ParserV2(bson), (elementType, name) => {
return elementType === 2 /* STRING */;
})).toBe('Peter 1');
expect(findValueInObject(new ParserV2(bson), (elementType, name) => {
return elementType === 2 /* STRING */;
})).toBe('Peter 1');
});
test('createBSONParser', () => {
const obj = {
number: 13,
cursor: {
firstBatch: [{ name: 'Peter' }, { name: 'Marc' }, { name: 'Bar' }],
test: ['a', 'b', 'c']
},
ok: 1,
};
const schema = t.schema({
number: t.number,
cursor: t.type({
firstBatch: t.array({
name: t.string
}),
test: t.array(t.string),
}),
ok: t.number,
});
const bson = serialize(obj);
const parsed = getBSONDecoder(schema)(bson);
expect(parsed).toEqual(obj);
});
test('invalidation', () => {
const schema = t.schema({
username: t.string
});
{
expect(getBSONDecoder(schema)(serialize({ username: 'Peter', foo: 'bar' }))).toEqual({ username: 'Peter' });
}
{
schema.addProperty('foo', t.string);
const obj = { username: 'Peter', foo: 'bar' };
expect(getBSONDecoder(schema)(serialize(obj))).toEqual(obj);
}
});
test('undefined array', () => {
const schema = t.schema({
username: t.string,
organisations: t.array(t.string)
});
{
const bson = serialize({ username: 'Peter' });
//organisations stays undefined
expect(getBSONDecoder(schema)(bson)).toEqual({ username: 'Peter' });
}
{
const bson = serialize({ username: 'Peter', organisations: [] });
//organisations stays undefined
expect(getBSONDecoder(schema)(bson)).toEqual({ username: 'Peter', organisations: [] });
}
});
test('constructor vars', () => {
let UserBase = class UserBase {
constructor(name) {
this.name = name;
this.id = 'abc';
this.version = 1;
}
};
__decorate([
t,
__metadata("design:type", String)
], UserBase.prototype, "id", void 0);
__decorate([
t,
__metadata("design:type", Number)
], UserBase.prototype, "version", void 0);
UserBase = __decorate([
__param(0, t),
__metadata("design:paramtypes", [String])
], UserBase);
class User extends UserBase {
constructor() {
super(...arguments);
this.connections = 10;
}
}
__decorate([
t,
__metadata("design:type", Number)
], User.prototype, "connections", void 0);
expect(getClassSchema(UserBase).getProperty('name').methodName).toBe('constructor');
expect(getClassSchema(User).getProperty('name').methodName).toBe('constructor');
expect(getClassSchema(User).getMethodProperties('constructor').includes(getClassSchema(User).getProperty('name'))).toBe(true);
const bson = getBSONSerializer(User)(new User('peter'));
const json = deserialize(Buffer.from(bson));
expect(json.name).toBe('peter');
const back = getBSONDecoder(User)(bson);
expect(back.name).toBe('peter');
});
//# sourceMappingURL=bson-parser.spec.js.map